diff --git a/content/docs/v2024.12.18/CHANGELOG-0.1.md b/content/docs/v2024.12.18/CHANGELOG-0.1.md new file mode 100644 index 0000000000..d7b1b45cb2 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-0.1.md @@ -0,0 +1,172 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-0.1 + name: Changelog-0.1 + parent: welcome + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-0.1/ +aliases: +- /docs/v2024.12.18/CHANGELOG-0.1/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Change Log + +## [0.1.0](https://github.com/appscode/stash/tree/0.1.0) (2017-06-27) +**Implemented enhancements:** + +- Allow modifying the cron expression [\#21](https://github.com/appscode/stash/issues/21) +- Use RBAC objects for operator. [\#64](https://github.com/appscode/stash/issues/64) +- Support Azure as backup destination [\#35](https://github.com/appscode/stash/issues/35) +- Support GCS as backup destination [\#34](https://github.com/appscode/stash/issues/34) +- Change Destination definition to point to S3 [\#33](https://github.com/appscode/stash/issues/33) +- TODOs [\#22](https://github.com/appscode/stash/issues/22) +- Send performance stats to Prometheus [\#9](https://github.com/appscode/stash/issues/9) + +**Fixed bugs:** + +- Bubble up errors to the caller. [\#24](https://github.com/appscode/stash/issues/24) +- Fix registration of wrong group [\#39](https://github.com/appscode/stash/pull/39) ([sadlil](https://github.com/sadlil)) + +**Closed issues:** + +- Add /snapshots endpoint in operator [\#81](https://github.com/appscode/stash/issues/81) +- CLI: restic-ctl [\#8](https://github.com/appscode/stash/issues/8) +- Sanitize metric labels [\#68](https://github.com/appscode/stash/issues/68) +- Mount an empty directory to write local files. [\#61](https://github.com/appscode/stash/issues/61) +- Support BackBlaze as backup destination [\#60](https://github.com/appscode/stash/issues/60) +- Support Swift as backup destination [\#59](https://github.com/appscode/stash/issues/59) +- Add e2e tests using Ginkgo [\#57](https://github.com/appscode/stash/issues/57) +- Review analytics [\#55](https://github.com/appscode/stash/issues/55) +- Support updated Kube object versions [\#42](https://github.com/appscode/stash/issues/42) +- Update restic to 0.6.x [\#32](https://github.com/appscode/stash/issues/32) +- Add analytics [\#31](https://github.com/appscode/stash/issues/31) +- HTTP api to exposing restic repository data [\#7](https://github.com/appscode/stash/issues/7) +- Provision new restic repositories [\#6](https://github.com/appscode/stash/issues/6) +- Proposal: Imeplement Restic TPR Resource for Kubernetes [\#1](https://github.com/appscode/stash/issues/1) + +**Merged pull requests:** + +- Add e2e tests for major cloud providers [\#84](https://github.com/appscode/stash/pull/84) ([tamalsaha](https://github.com/tamalsaha)) +- Add /snapshots endpoint in operator [\#82](https://github.com/appscode/stash/pull/82) ([tamalsaha](https://github.com/tamalsaha)) +- Handle update conflicts [\#78](https://github.com/appscode/stash/pull/78) ([tamalsaha](https://github.com/tamalsaha)) +- Test e2e tests [\#76](https://github.com/appscode/stash/pull/76) ([tamalsaha](https://github.com/tamalsaha)) +- Delete old testify tests [\#75](https://github.com/appscode/stash/pull/75) ([tamalsaha](https://github.com/tamalsaha)) +- Create a cli wrapper for restic [\#74](https://github.com/appscode/stash/pull/74) ([tamalsaha](https://github.com/tamalsaha)) +- Revise EnsureXXXSidecar methods [\#73](https://github.com/appscode/stash/pull/73) ([tamalsaha](https://github.com/tamalsaha)) +- Add ginkgo based e2e tests [\#70](https://github.com/appscode/stash/pull/70) ([tamalsaha](https://github.com/tamalsaha)) +- Push metrics to Prometheus push gateway [\#67](https://github.com/appscode/stash/pull/67) ([tamalsaha](https://github.com/tamalsaha)) +- Use go-sh to execute restic commands [\#63](https://github.com/appscode/stash/pull/63) ([tamalsaha](https://github.com/tamalsaha)) +- Add scratchDir & prefixHostname flags [\#62](https://github.com/appscode/stash/pull/62) ([tamalsaha](https://github.com/tamalsaha)) +- Support remote backends [\#58](https://github.com/appscode/stash/pull/58) ([tamalsaha](https://github.com/tamalsaha)) +- Organize backup code. [\#54](https://github.com/appscode/stash/pull/54) ([tamalsaha](https://github.com/tamalsaha)) +- Synchronize scheduler reconfiguration [\#53](https://github.com/appscode/stash/pull/53) ([tamalsaha](https://github.com/tamalsaha)) +- Fix unit tests [\#51](https://github.com/appscode/stash/pull/51) ([tamalsaha](https://github.com/tamalsaha)) +- Check docker image tag before starting operator [\#45](https://github.com/appscode/stash/pull/45) ([tamalsaha](https://github.com/tamalsaha)) +- Expose metrics from operator [\#44](https://github.com/appscode/stash/pull/44) ([tamalsaha](https://github.com/tamalsaha)) +- Add analytics [\#41](https://github.com/appscode/stash/pull/41) ([aerokite](https://github.com/aerokite)) +- Use V1alpha1SchemeGroupVersion for Restik [\#40](https://github.com/appscode/stash/pull/40) ([aerokite](https://github.com/aerokite)) +- Fix status update [\#38](https://github.com/appscode/stash/pull/38) ([saumanbiswas](https://github.com/saumanbiswas)) +- Upgrade restic version to 0.6.1 [\#37](https://github.com/appscode/stash/pull/37) ([tamalsaha](https://github.com/tamalsaha)) +- Change api version to v1alpha1 [\#30](https://github.com/appscode/stash/pull/30) ([tamalsaha](https://github.com/tamalsaha)) +- Rename function and structure [\#29](https://github.com/appscode/stash/pull/29) ([saumanbiswas](https://github.com/saumanbiswas)) +- Rename Backup into Restik [\#28](https://github.com/appscode/stash/pull/28) ([saumanbiswas](https://github.com/saumanbiswas)) +- Move api from k8s-addons [\#27](https://github.com/appscode/stash/pull/27) ([saumanbiswas](https://github.com/saumanbiswas)) +- Bubble up errors to caller [\#26](https://github.com/appscode/stash/pull/26) ([saumanbiswas](https://github.com/saumanbiswas)) +- Allow modifying the cron expression [\#25](https://github.com/appscode/stash/pull/25) ([saumanbiswas](https://github.com/saumanbiswas)) +- Use unversioned time [\#23](https://github.com/appscode/stash/pull/23) ([tamalsaha](https://github.com/tamalsaha)) +- Restik chart [\#20](https://github.com/appscode/stash/pull/20) ([saumanbiswas](https://github.com/saumanbiswas)) +- example added [\#19](https://github.com/appscode/stash/pull/19) ([saumanbiswas](https://github.com/saumanbiswas)) +- Move restik api and client to k8s-addons [\#18](https://github.com/appscode/stash/pull/18) ([saumanbiswas](https://github.com/saumanbiswas)) +- Error print fix [\#17](https://github.com/appscode/stash/pull/17) ([saumanbiswas](https://github.com/saumanbiswas)) +- Check group registration [\#16](https://github.com/appscode/stash/pull/16) ([saumanbiswas](https://github.com/saumanbiswas)) +- Restik docs [\#15](https://github.com/appscode/stash/pull/15) ([saumanbiswas](https://github.com/saumanbiswas)) +- Restik unit test, e2e test [\#14](https://github.com/appscode/stash/pull/14) ([saumanbiswas](https://github.com/saumanbiswas)) +- Restik create delete initial implementation [\#12](https://github.com/appscode/stash/pull/12) ([saumanbiswas](https://github.com/saumanbiswas)) +- Build docker image [\#11](https://github.com/appscode/stash/pull/11) ([tamalsaha](https://github.com/tamalsaha)) +- Clone skeleton from appscode/k3pc [\#10](https://github.com/appscode/stash/pull/10) ([tamalsaha](https://github.com/tamalsaha)) +- Fix e2e tests [\#83](https://github.com/appscode/stash/pull/83) ([tamalsaha](https://github.com/tamalsaha)) +- Mount scratchDir with operator [\#80](https://github.com/appscode/stash/pull/80) ([tamalsaha](https://github.com/tamalsaha)) +- Fix scheduler [\#79](https://github.com/appscode/stash/pull/79) ([tamalsaha](https://github.com/tamalsaha)) +- Create RBAC objects for operator [\#69](https://github.com/appscode/stash/pull/69) ([tamalsaha](https://github.com/tamalsaha)) +- Mount labels using Downward api [\#66](https://github.com/appscode/stash/pull/66) ([tamalsaha](https://github.com/tamalsaha)) +- Vendor go-sh dependency [\#65](https://github.com/appscode/stash/pull/65) ([tamalsaha](https://github.com/tamalsaha)) +- Update e2e tests [\#52](https://github.com/appscode/stash/pull/52) ([tamalsaha](https://github.com/tamalsaha)) +- Run watchers for preferred api group version kind [\#50](https://github.com/appscode/stash/pull/50) ([tamalsaha](https://github.com/tamalsaha)) +- Build restic from source by default [\#49](https://github.com/appscode/stash/pull/49) ([tamalsaha](https://github.com/tamalsaha)) +- Watch individual object types. [\#48](https://github.com/appscode/stash/pull/48) ([tamalsaha](https://github.com/tamalsaha)) +- Various code cleanup [\#47](https://github.com/appscode/stash/pull/47) ([tamalsaha](https://github.com/tamalsaha)) +- Reorganize cron controller [\#46](https://github.com/appscode/stash/pull/46) ([tamalsaha](https://github.com/tamalsaha)) +- Run push gateway as a side-car for restik operator. [\#43](https://github.com/appscode/stash/pull/43) ([tamalsaha](https://github.com/tamalsaha)) +- Use client-go [\#36](https://github.com/appscode/stash/pull/36) ([tamalsaha](https://github.com/tamalsaha)) diff --git a/content/docs/v2024.12.18/CHANGELOG-0.2.md b/content/docs/v2024.12.18/CHANGELOG-0.2.md new file mode 100644 index 0000000000..3361f96d02 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-0.2.md @@ -0,0 +1,129 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-0.2 + name: Changelog-0.2 + parent: welcome + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-0.2/ +aliases: +- /docs/v2024.12.18/CHANGELOG-0.2/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Change Log + +## [0.2.0](https://github.com/appscode/stash/tree/0.2.0) (2017-06-30) +[Full Changelog](https://github.com/appscode/stash/compare/0.1.0...0.2.0) + +**Implemented enhancements:** + +- Don't run forget if missing retention policy [\#100](https://github.com/appscode/stash/issues/100) +- Move prefix-hostname to Restic tpr [\#96](https://github.com/appscode/stash/issues/96) + +**Fixed bugs:** + +- Mount source volume [\#112](https://github.com/appscode/stash/issues/112) +- Test restic URL is generated correctly when optional parts are missing [\#98](https://github.com/appscode/stash/issues/98) +- Handle updated restic selectors [\#95](https://github.com/appscode/stash/issues/95) + +**Closed issues:** + +- Link to sidecar flags. [\#109](https://github.com/appscode/stash/issues/109) +- Link back to tutorial from docs pages. [\#107](https://github.com/appscode/stash/issues/107) +- Document various implications of Restic update [\#103](https://github.com/appscode/stash/issues/103) +- Add retention policy options [\#101](https://github.com/appscode/stash/issues/101) +- Handle updating local backend. [\#105](https://github.com/appscode/stash/issues/105) +- Set Temp dir ENV var [\#102](https://github.com/appscode/stash/issues/102) +- Cleanup documentation [\#86](https://github.com/appscode/stash/issues/86) +- Updating Local backend does not update pods. [\#71](https://github.com/appscode/stash/issues/71) + +**Merged pull requests:** + +- Part 6 - Update docs [\#121](https://github.com/appscode/stash/pull/121) ([tamalsaha](https://github.com/tamalsaha)) +- Update docs [\#120](https://github.com/appscode/stash/pull/120) ([tamalsaha](https://github.com/tamalsaha)) +- Various bug fixes [\#118](https://github.com/appscode/stash/pull/118) ([tamalsaha](https://github.com/tamalsaha)) +- Update pitch [\#117](https://github.com/appscode/stash/pull/117) ([tamalsaha](https://github.com/tamalsaha)) +- Part 5 - User Guide [\#114](https://github.com/appscode/stash/pull/114) ([tamalsaha](https://github.com/tamalsaha)) +- Part 4- User Guide [\#113](https://github.com/appscode/stash/pull/113) ([tamalsaha](https://github.com/tamalsaha)) +- Part 3 - User Guide [\#110](https://github.com/appscode/stash/pull/110) ([tamalsaha](https://github.com/tamalsaha)) +- Update user guide [\#94](https://github.com/appscode/stash/pull/94) ([tamalsaha](https://github.com/tamalsaha)) +- Create separate restic for each type of backend. [\#92](https://github.com/appscode/stash/pull/92) ([tamalsaha](https://github.com/tamalsaha)) +- Remove selectors so that `template.metadata.labels` are used [\#91](https://github.com/appscode/stash/pull/91) ([tamalsaha](https://github.com/tamalsaha)) +- Update Stash chart [\#89](https://github.com/appscode/stash/pull/89) ([tamalsaha](https://github.com/tamalsaha)) +- Various changes to RetentionPolicy [\#116](https://github.com/appscode/stash/pull/116) ([tamalsaha](https://github.com/tamalsaha)) +- Set TMPDIR env var for restic [\#115](https://github.com/appscode/stash/pull/115) ([tamalsaha](https://github.com/tamalsaha)) +- Part - 2 of User guide [\#99](https://github.com/appscode/stash/pull/99) ([tamalsaha](https://github.com/tamalsaha)) +- Update Prometheus job name to use restic ns & name [\#93](https://github.com/appscode/stash/pull/93) ([tamalsaha](https://github.com/tamalsaha)) +- Add docs for commands [\#90](https://github.com/appscode/stash/pull/90) ([tamalsaha](https://github.com/tamalsaha)) +- Fix dev guide [\#88](https://github.com/appscode/stash/pull/88) ([tamalsaha](https://github.com/tamalsaha)) diff --git a/content/docs/v2024.12.18/CHANGELOG-0.3.md b/content/docs/v2024.12.18/CHANGELOG-0.3.md new file mode 100644 index 0000000000..9cc0868d13 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-0.3.md @@ -0,0 +1,111 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-0.3 + name: Changelog-0.3 + parent: welcome + weight: 30 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-0.3/ +aliases: +- /docs/v2024.12.18/CHANGELOG-0.3/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Change Log + +## [0.3.1](https://github.com/appscode/stash/tree/0.3.1) (2017-07-04) +[Full Changelog](https://github.com/appscode/stash/compare/0.3.0...0.3.1) + +**Merged pull requests:** + +- Add tests for swift [\#130](https://github.com/appscode/stash/pull/130) ([tamalsaha](https://github.com/tamalsaha)) + +## [0.3.0](https://github.com/appscode/stash/tree/0.3.0) (2017-07-04) +[Full Changelog](https://github.com/appscode/stash/compare/0.2.0...0.3.0) + +**Fixed bugs:** + +- Fix GCS [\#122](https://github.com/appscode/stash/issues/122) + +**Closed issues:** + +- Support resource [\#128](https://github.com/appscode/stash/issues/128) +- Document FindRestic will match first one [\#119](https://github.com/appscode/stash/issues/119) +- Document e2e test setup process. [\#108](https://github.com/appscode/stash/issues/108) +- Fix charts [\#87](https://github.com/appscode/stash/issues/87) + +**Merged pull requests:** + +- Support setting compute resources for sidecar [\#129](https://github.com/appscode/stash/pull/129) ([tamalsaha](https://github.com/tamalsaha)) +- Fix RBAC docs [\#127](https://github.com/appscode/stash/pull/127) ([tamalsaha](https://github.com/tamalsaha)) +- Document swift [\#124](https://github.com/appscode/stash/pull/124) ([tamalsaha](https://github.com/tamalsaha)) diff --git a/content/docs/v2024.12.18/CHANGELOG-0.4.md b/content/docs/v2024.12.18/CHANGELOG-0.4.md new file mode 100644 index 0000000000..d42795055f --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-0.4.md @@ -0,0 +1,118 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-0.4 + name: Changelog-0.4 + parent: welcome + weight: 40 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-0.4/ +aliases: +- /docs/v2024.12.18/CHANGELOG-0.4/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Change Log + +## [0.4.2](https://github.com/appscode/stash/tree/0.4.2) (2017-11-03) +[Full Changelog](https://github.com/appscode/stash/compare/0.5.1...0.4.2) + +**Merged pull requests:** + +- Upgrade restic binary to 0.7.3 [\#209](https://github.com/appscode/stash/pull/209) ([tamalsaha](https://github.com/tamalsaha)) +- Fix RBAC permission for release 0.4 [\#208](https://github.com/appscode/stash/pull/208) ([tamalsaha](https://github.com/tamalsaha)) +- Change `k8s.io/api/core/v1` pkg alias to core [\#204](https://github.com/appscode/stash/pull/204) ([tamalsaha](https://github.com/tamalsaha)) +- Use client-go 5.0 [\#203](https://github.com/appscode/stash/pull/203) ([tamalsaha](https://github.com/tamalsaha)) +- Add recovery CRD [\#201](https://github.com/appscode/stash/pull/201) ([diptadas](https://github.com/diptadas)) + + +## [0.4.1](https://github.com/appscode/stash/tree/0.4.1) (2017-07-19) +[Full Changelog](https://github.com/appscode/stash/compare/0.4.0...0.4.1) + +**Fixed bugs:** + +- Fix Fake restic resource Url [\#137](https://github.com/appscode/stash/pull/137) ([sadlil](https://github.com/sadlil)) + +## [0.4.0](https://github.com/appscode/stash/tree/0.4.0) (2017-07-07) +[Full Changelog](https://github.com/appscode/stash/compare/0.3.1...0.4.0) + +**Closed issues:** + +- Use osm as the bucket manipulator [\#3](https://github.com/appscode/stash/issues/3) +- Update restic [\#133](https://github.com/appscode/stash/issues/133) +- Document required RBAC permissions [\#123](https://github.com/appscode/stash/issues/123) + +**Merged pull requests:** + +- Rename RepositorySecretName to StorageSecretName [\#135](https://github.com/appscode/stash/pull/135) ([tamalsaha](https://github.com/tamalsaha)) +- Rename Volume to VolumeSource [\#134](https://github.com/appscode/stash/pull/134) ([tamalsaha](https://github.com/tamalsaha)) +- Use VolumeSource instead of Volume for Local backend. [\#132](https://github.com/appscode/stash/pull/132) ([tamalsaha](https://github.com/tamalsaha)) diff --git a/content/docs/v2024.12.18/CHANGELOG-0.5.md b/content/docs/v2024.12.18/CHANGELOG-0.5.md new file mode 100644 index 0000000000..90c9b10824 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-0.5.md @@ -0,0 +1,204 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-0.5 + name: Changelog-0.5 + parent: welcome + weight: 50 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-0.5/ +aliases: +- /docs/v2024.12.18/CHANGELOG-0.5/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Change Log + +## [0.5.1](https://github.com/appscode/stash/tree/0.5.1) (2017-10-10) +[Full Changelog](https://github.com/appscode/stash/compare/0.5.0...0.5.1) + +**Fixed bugs:** + +- invalid header field value for key Authorization - DO s3 bucket [\#189](https://github.com/appscode/stash/issues/189) +- Kops + AWS: cannot unmarshal array into Go value of type types.ContainerJSON [\#147](https://github.com/appscode/stash/issues/147) + +**Closed issues:** + +- Cut a new release with restic 0.7.1 [\#145](https://github.com/appscode/stash/issues/145) +- Use fixed Hostname for ReplicaSet etc [\#165](https://github.com/appscode/stash/issues/165) +- Update docs for restic tags [\#143](https://github.com/appscode/stash/issues/143) +- Document how to use with kubectl [\#142](https://github.com/appscode/stash/issues/142) + +**Merged pull requests:** + +- Correctly detect "default" service account [\#200](https://github.com/appscode/stash/pull/200) ([tamalsaha](https://github.com/tamalsaha)) +- Clarify that --tag foo,tag bar style tags are not supported. [\#199](https://github.com/appscode/stash/pull/199) ([tamalsaha](https://github.com/tamalsaha)) +- Set hostname based on resource type [\#198](https://github.com/appscode/stash/pull/198) ([tamalsaha](https://github.com/tamalsaha)) +- Document how to detect operator version [\#196](https://github.com/appscode/stash/pull/196) ([tamalsaha](https://github.com/tamalsaha)) +- Manage RoleBinding for rbac enabled cluster [\#197](https://github.com/appscode/stash/pull/197) ([tamalsaha](https://github.com/tamalsaha)) + +## [0.5.0](https://github.com/appscode/stash/tree/0.5.0) (2017-10-10) +[Full Changelog](https://github.com/appscode/stash/compare/0.5.0-beta.3...0.5.0) + +**Closed issues:** + +- Apply restic.appscode.com/config annotations on Pod templates [\#141](https://github.com/appscode/stash/issues/141) + +**Merged pull requests:** + +- Revendor forked robfig/cron [\#139](https://github.com/appscode/stash/pull/139) ([tamalsaha](https://github.com/tamalsaha)) + +## [0.5.0-beta.3](https://github.com/appscode/stash/tree/0.5.0-beta.3) (2017-10-10) +[Full Changelog](https://github.com/appscode/stash/compare/0.5.0-beta.2...0.5.0-beta.3) + +**Merged pull requests:** + +- Use workqueue for scheduler [\#194](https://github.com/appscode/stash/pull/194) ([tamalsaha](https://github.com/tamalsaha)) + +## [0.5.0-beta.2](https://github.com/appscode/stash/tree/0.5.0-beta.2) (2017-10-09) +[Full Changelog](https://github.com/appscode/stash/compare/0.5.0-beta.1...0.5.0-beta.2) + +**Merged pull requests:** + +- Add tests for DO [\#193](https://github.com/appscode/stash/pull/193) ([tamalsaha](https://github.com/tamalsaha)) +- Update tutorial [\#186](https://github.com/appscode/stash/pull/186) ([diptadas](https://github.com/diptadas)) + +## [0.5.0-beta.1](https://github.com/appscode/stash/tree/0.5.0-beta.1) (2017-10-09) +[Full Changelog](https://github.com/appscode/stash/compare/0.5.0-beta.0...0.5.0-beta.1) + +**Fixed bugs:** + +- \[Bug\] Success/Fail prometheus metrics inverted condition [\#175](https://github.com/appscode/stash/issues/175) + +**Closed issues:** + +- `should backup new DaemonSet` failed [\#155](https://github.com/appscode/stash/issues/155) +- Use DaemonSet update \(1.6\) [\#154](https://github.com/appscode/stash/issues/154) + +**Merged pull requests:** + +- Fix prometheus metrics collection [\#192](https://github.com/appscode/stash/pull/192) ([tamalsaha](https://github.com/tamalsaha)) +- Fix StatefulSet tests [\#190](https://github.com/appscode/stash/pull/190) ([tamalsaha](https://github.com/tamalsaha)) +- Replace reflect.Equal with github.com/google/go-cmp [\#188](https://github.com/appscode/stash/pull/188) ([tamalsaha](https://github.com/tamalsaha)) +- Skip ReplicaSet owned by Deployments [\#187](https://github.com/appscode/stash/pull/187) ([tamalsaha](https://github.com/tamalsaha)) + +## [0.5.0-beta.0](https://github.com/appscode/stash/tree/0.5.0-beta.0) (2017-10-09) +[Full Changelog](https://github.com/appscode/stash/compare/0.4.1...0.5.0-beta.0) + +**Implemented enhancements:** + +- Migrate TPR to CRD [\#160](https://github.com/appscode/stash/pull/160) ([sadlil](https://github.com/sadlil)) + +**Fixed bugs:** + +- Error in request: v1.ListOptions is not suitable for converting to "v1" [\#153](https://github.com/appscode/stash/issues/153) +- Fix client-go updates [\#159](https://github.com/appscode/stash/pull/159) ([sadlil](https://github.com/sadlil)) + +**Closed issues:** + +- Switch to CustomResourceDefinitions [\#97](https://github.com/appscode/stash/issues/97) +- Use client-go 4.0.0 [\#56](https://github.com/appscode/stash/issues/56) + +**Merged pull requests:** + +- Prepare docs for 5.0.0-beta.0 [\#185](https://github.com/appscode/stash/pull/185) ([tamalsaha](https://github.com/tamalsaha)) +- Set namespaceIndex as indexer [\#184](https://github.com/appscode/stash/pull/184) ([tamalsaha](https://github.com/tamalsaha)) +- Fix e2e tests [\#183](https://github.com/appscode/stash/pull/183) ([tamalsaha](https://github.com/tamalsaha)) +- Use workqueue [\#182](https://github.com/appscode/stash/pull/182) ([tamalsaha](https://github.com/tamalsaha)) +- Use Deployment from apps/v1beta1 [\#181](https://github.com/appscode/stash/pull/181) ([tamalsaha](https://github.com/tamalsaha)) +- Delete \*.generated.go files for ugorji [\#180](https://github.com/appscode/stash/pull/180) ([tamalsaha](https://github.com/tamalsaha)) +- Use WaitForCRDReady from kutil [\#179](https://github.com/appscode/stash/pull/179) ([tamalsaha](https://github.com/tamalsaha)) +- Only watch apps/v1beta1 Deployment [\#178](https://github.com/appscode/stash/pull/178) ([tamalsaha](https://github.com/tamalsaha)) +- Move kutil to client package [\#177](https://github.com/appscode/stash/pull/177) ([tamalsaha](https://github.com/tamalsaha)) +- Generate ugorji stuff [\#176](https://github.com/appscode/stash/pull/176) ([tamalsaha](https://github.com/tamalsaha)) +- Prepare docs for 0.5.0 [\#174](https://github.com/appscode/stash/pull/174) ([tamalsaha](https://github.com/tamalsaha)) +- Install stash as a critical addon [\#173](https://github.com/appscode/stash/pull/173) ([tamalsaha](https://github.com/tamalsaha)) +- Set RESTIC\_VER to 0.7.3 [\#172](https://github.com/appscode/stash/pull/172) ([tamalsaha](https://github.com/tamalsaha)) +- Refresh charts to match recent convention [\#171](https://github.com/appscode/stash/pull/171) ([tamalsaha](https://github.com/tamalsaha)) +- Update kutil [\#170](https://github.com/appscode/stash/pull/170) ([tamalsaha](https://github.com/tamalsaha)) +- Fix deployment name in tutorial [\#169](https://github.com/appscode/stash/pull/169) ([the-redback](https://github.com/the-redback)) +- Fix command in Developer-guide [\#168](https://github.com/appscode/stash/pull/168) ([the-redback](https://github.com/the-redback)) +- Use apis/v1alpha1 instead of internal version [\#167](https://github.com/appscode/stash/pull/167) ([tamalsaha](https://github.com/tamalsaha)) +- Remove resource:path [\#166](https://github.com/appscode/stash/pull/166) ([tamalsaha](https://github.com/tamalsaha)) +- Move analytics collector to root command [\#164](https://github.com/appscode/stash/pull/164) ([tamalsaha](https://github.com/tamalsaha)) +- Use kubernetes/code-generator [\#163](https://github.com/appscode/stash/pull/163) ([tamalsaha](https://github.com/tamalsaha)) +- Revendor k8s.io/apiextensions-apiserver [\#162](https://github.com/appscode/stash/pull/162) ([tamalsaha](https://github.com/tamalsaha)) +- Update kutil dependency [\#158](https://github.com/appscode/stash/pull/158) ([tamalsaha](https://github.com/tamalsaha)) +- Use CheckAPIVersion\(\) [\#157](https://github.com/appscode/stash/pull/157) ([tamalsaha](https://github.com/tamalsaha)) +- Use PATCH api instead of UPDATE [\#156](https://github.com/appscode/stash/pull/156) ([tamalsaha](https://github.com/tamalsaha)) +- Check version using semver library [\#152](https://github.com/appscode/stash/pull/152) ([tamalsaha](https://github.com/tamalsaha)) +- Support adding Sidecar containers for StatefulSet. [\#151](https://github.com/appscode/stash/pull/151) ([tamalsaha](https://github.com/tamalsaha)) +- Update client-go to 4.0.0 [\#150](https://github.com/appscode/stash/pull/150) ([tamalsaha](https://github.com/tamalsaha)) +- Update build commands for restic. [\#149](https://github.com/appscode/stash/pull/149) ([tamalsaha](https://github.com/tamalsaha)) +- Update client-go to 3.0.0 from 3.0.0-beta [\#148](https://github.com/appscode/stash/pull/148) ([tamalsaha](https://github.com/tamalsaha)) +- Add uninstall.sh script [\#144](https://github.com/appscode/stash/pull/144) ([tamalsaha](https://github.com/tamalsaha)) +- Fix typos of tutorial.md file [\#138](https://github.com/appscode/stash/pull/138) ([sajibcse68](https://github.com/sajibcse68)) diff --git a/content/docs/v2024.12.18/CHANGELOG-0.6.md b/content/docs/v2024.12.18/CHANGELOG-0.6.md new file mode 100644 index 0000000000..8a1e994c3b --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-0.6.md @@ -0,0 +1,278 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-0.6 + name: Changelog-0.6 + parent: welcome + weight: 60 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-0.6/ +aliases: +- /docs/v2024.12.18/CHANGELOG-0.6/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Change Log + +## [0.6.4](https://github.com/appscode/stash/tree/0.6.4) (2018-02-20) +[Full Changelog](https://github.com/appscode/stash/compare/0.6.3...0.6.4) + +**Fixed bugs:** + +- Backup count rises even when backup/init fails [\#293](https://github.com/appscode/stash/issues/293) + +**Closed issues:** + +- Document HTTP endpoints [\#111](https://github.com/appscode/stash/issues/111) +- Support updating version of resitc side-car [\#72](https://github.com/appscode/stash/issues/72) + +**Merged pull requests:** + +- Update docs for 0.6.4 [\#344](https://github.com/appscode/stash/pull/344) ([tamalsaha](https://github.com/tamalsaha)) +- Don't block deletion of owner by default [\#343](https://github.com/appscode/stash/pull/343) ([tamalsaha](https://github.com/tamalsaha)) +- Don't block deletion of owner by default [\#342](https://github.com/appscode/stash/pull/342) ([tamalsaha](https://github.com/tamalsaha)) +- Skip generating UpdateStatus method [\#341](https://github.com/appscode/stash/pull/341) ([tamalsaha](https://github.com/tamalsaha)) +- Remove internal types [\#340](https://github.com/appscode/stash/pull/340) ([tamalsaha](https://github.com/tamalsaha)) +- Use rbac/v1 apis [\#339](https://github.com/appscode/stash/pull/339) ([tamalsaha](https://github.com/tamalsaha)) +- Add user roles [\#338](https://github.com/appscode/stash/pull/338) ([tamalsaha](https://github.com/tamalsaha)) +- Use restic 0.8.2 [\#337](https://github.com/appscode/stash/pull/337) ([tamalsaha](https://github.com/tamalsaha)) +- Use official code generator scripts [\#336](https://github.com/appscode/stash/pull/336) ([tamalsaha](https://github.com/tamalsaha)) +- Update charts to support api registration [\#334](https://github.com/appscode/stash/pull/334) ([tamalsaha](https://github.com/tamalsaha)) +- Fix e2e tests after webhook merger [\#333](https://github.com/appscode/stash/pull/333) ([tamalsaha](https://github.com/tamalsaha)) +- Ensure stash can be run locally [\#332](https://github.com/appscode/stash/pull/332) ([tamalsaha](https://github.com/tamalsaha)) +- Vendor client-go auth pkg [\#331](https://github.com/appscode/stash/pull/331) ([tamalsaha](https://github.com/tamalsaha)) +- Update Grafana dashboard [\#330](https://github.com/appscode/stash/pull/330) ([galexrt](https://github.com/galexrt)) +- Merge admission webhook and operator into one binary [\#329](https://github.com/appscode/stash/pull/329) ([tamalsaha](https://github.com/tamalsaha)) +- Merge uninstall script into the stash.sh script [\#328](https://github.com/appscode/stash/pull/328) ([tamalsaha](https://github.com/tamalsaha)) +- Implement informer factory for backup scheduler [\#325](https://github.com/appscode/stash/pull/325) ([hossainemruz](https://github.com/hossainemruz)) +- Fixed abnormal pod recreation when Restic is deleted [\#322](https://github.com/appscode/stash/pull/322) ([hossainemruz](https://github.com/hossainemruz)) +- Copy generic-admission-server into pkg [\#318](https://github.com/appscode/stash/pull/318) ([tamalsaha](https://github.com/tamalsaha)) +- Use shared infromer factory [\#317](https://github.com/appscode/stash/pull/317) ([tamalsaha](https://github.com/tamalsaha)) +- Use GetBaseVersion method from kutil [\#316](https://github.com/appscode/stash/pull/316) ([tamalsaha](https://github.com/tamalsaha)) +- Implement Pause Restic [\#315](https://github.com/appscode/stash/pull/315) ([hossainemruz](https://github.com/hossainemruz)) +- Fix webhook command description [\#314](https://github.com/appscode/stash/pull/314) ([tamalsaha](https://github.com/tamalsaha)) +- Use rbac/v1beta1 api. [\#313](https://github.com/appscode/stash/pull/313) ([tamalsaha](https://github.com/tamalsaha)) +- Support Create & Update operations in admission webhook [\#312](https://github.com/appscode/stash/pull/312) ([tamalsaha](https://github.com/tamalsaha)) +- Merge webhook plugins into one. [\#311](https://github.com/appscode/stash/pull/311) ([tamalsaha](https://github.com/tamalsaha)) +- Support private docker registry in installer [\#310](https://github.com/appscode/stash/pull/310) ([tamalsaha](https://github.com/tamalsaha)) +- Compress go binaries [\#309](https://github.com/appscode/stash/pull/309) ([tamalsaha](https://github.com/tamalsaha)) +- Rename --initializer flag to --enable-initializer [\#308](https://github.com/appscode/stash/pull/308) ([tamalsaha](https://github.com/tamalsaha)) +- Remove STASH\_ROLE\_TYPE from installer scripts [\#307](https://github.com/appscode/stash/pull/307) ([tamalsaha](https://github.com/tamalsaha)) +- Use rbac/v1 api [\#306](https://github.com/appscode/stash/pull/306) ([tamalsaha](https://github.com/tamalsaha)) +- Use kubectl auth reconcile [\#305](https://github.com/appscode/stash/pull/305) ([tamalsaha](https://github.com/tamalsaha)) +- Add --initializer flag to installer [\#304](https://github.com/appscode/stash/pull/304) ([tamalsaha](https://github.com/tamalsaha)) +- Prepare docs for 0.7.0-alpha.0 [\#302](https://github.com/appscode/stash/pull/302) ([tamalsaha](https://github.com/tamalsaha)) +- Change installer script [\#301](https://github.com/appscode/stash/pull/301) ([tamalsaha](https://github.com/tamalsaha)) +- Added support for private docker registry [\#300](https://github.com/appscode/stash/pull/300) ([diptadas](https://github.com/diptadas)) +- Add ValidatingAdmissionWebhook for Stash CRDs [\#299](https://github.com/appscode/stash/pull/299) ([tamalsaha](https://github.com/tamalsaha)) +- Remove TPR to CRD migrator [\#298](https://github.com/appscode/stash/pull/298) ([tamalsaha](https://github.com/tamalsaha)) +- Update dependencies to Kubernetes 1.9 [\#297](https://github.com/appscode/stash/pull/297) ([tamalsaha](https://github.com/tamalsaha)) +- Write restic stderror in error events [\#296](https://github.com/appscode/stash/pull/296) ([diptadas](https://github.com/diptadas)) +- Fixed backup count [\#295](https://github.com/appscode/stash/pull/295) ([diptadas](https://github.com/diptadas)) +- Support self-signed ca cert for backends [\#294](https://github.com/appscode/stash/pull/294) ([hossainemruz](https://github.com/hossainemruz)) + +## [0.6.3](https://github.com/appscode/stash/tree/0.6.3) (2018-01-18) +[Full Changelog](https://github.com/appscode/stash/compare/0.6.2...0.6.3) + +**Implemented enhancements:** + +- Add Stash Backup Grafana dashboard to monitoring docs [\#285](https://github.com/appscode/stash/issues/285) +- Added Grafana Stash overview dashboard [\#286](https://github.com/appscode/stash/pull/286) ([galexrt](https://github.com/galexrt)) + +**Fixed bugs:** + +- PushGateURL not given to sidecar container [\#283](https://github.com/appscode/stash/issues/283) +- Fix inline volumeSource marshalling for LocalSpec [\#289](https://github.com/appscode/stash/pull/289) ([tamalsaha](https://github.com/tamalsaha)) + +**Closed issues:** + +- Test Failed: Invalid argument error in sidecar container [\#290](https://github.com/appscode/stash/issues/290) + +**Merged pull requests:** + +- Cleanup headless service [\#292](https://github.com/appscode/stash/pull/292) ([diptadas](https://github.com/diptadas)) +- Fixed parsing argument error [\#291](https://github.com/appscode/stash/pull/291) ([diptadas](https://github.com/diptadas)) +- Pass through logger flags [\#287](https://github.com/appscode/stash/pull/287) ([tamalsaha](https://github.com/tamalsaha)) +- Pass --pushgateway-url for injected containers. [\#284](https://github.com/appscode/stash/pull/284) ([tamalsaha](https://github.com/tamalsaha)) + +## [0.6.2](https://github.com/appscode/stash/tree/0.6.2) (2018-01-05) +[Full Changelog](https://github.com/appscode/stash/compare/0.6.1...0.6.2) + +**Fixed bugs:** + +- Created stash-sidecar clusterrole is missing statefulsets permission [\#272](https://github.com/appscode/stash/issues/272) +- Garbage collect s/a and rolebindings for \*Jobs [\#271](https://github.com/appscode/stash/issues/271) +- Fix RBAC roles in chart [\#276](https://github.com/appscode/stash/pull/276) ([tamalsaha](https://github.com/tamalsaha)) +- Garbage collect service-accounts and role-bindings for jobs [\#275](https://github.com/appscode/stash/pull/275) ([diptadas](https://github.com/diptadas)) +- Fix new restic format in upgrade docs [\#274](https://github.com/appscode/stash/pull/274) ([tamalsaha](https://github.com/tamalsaha)) +- Add statefulsets to stash-sidecar ClusterRole creation [\#273](https://github.com/appscode/stash/pull/273) ([galexrt](https://github.com/galexrt)) + +**Closed issues:** + +- Image kubectl not found because of Kubernetes version [\#266](https://github.com/appscode/stash/issues/266) + +**Merged pull requests:** + +- Prepare docs for 0.6.2 release [\#278](https://github.com/appscode/stash/pull/278) ([tamalsaha](https://github.com/tamalsaha)) +- Update Helm chart to use newer 'fullname' template that avoids duplicate \(e.g. 'stash-stash-...'\) resource names [\#277](https://github.com/appscode/stash/pull/277) ([whereisaaron](https://github.com/whereisaaron)) +- Reduce operator permissions for service accounts [\#270](https://github.com/appscode/stash/pull/270) ([tamalsaha](https://github.com/tamalsaha)) +- Fix formatting of uninstall.md [\#269](https://github.com/appscode/stash/pull/269) ([tamalsaha](https://github.com/tamalsaha)) + +## [0.6.1](https://github.com/appscode/stash/tree/0.6.1) (2018-01-03) +[Full Changelog](https://github.com/appscode/stash/compare/0.6.0...0.6.1) + +**Fixed bugs:** + +- Error while running restic [\#256](https://github.com/appscode/stash/issues/256) + +**Closed issues:** + +- Unable to use non-aws S3 backend [\#226](https://github.com/appscode/stash/issues/226) + +**Merged pull requests:** + +- Prepare docs for 0.6.1 [\#268](https://github.com/appscode/stash/pull/268) ([tamalsaha](https://github.com/tamalsaha)) + +## [0.6.0](https://github.com/appscode/stash/tree/0.6.0) (2018-01-03) +[Full Changelog](https://github.com/appscode/stash/compare/0.4.2...0.6.0) + +**Implemented enhancements:** + +- Feature: Support offline consistent backups [\#225](https://github.com/appscode/stash/issues/225) +- Collect ideas on how to improve recovery process [\#131](https://github.com/appscode/stash/issues/131) +- Use log.LEVEL\(\) instead of fmt.Printf\(\) [\#252](https://github.com/appscode/stash/pull/252) ([galexrt](https://github.com/galexrt)) + +**Fixed bugs:** + +- Fix ConfigMap Name in Leader Election [\#227](https://github.com/appscode/stash/issues/227) +- StatefulSet: Forbidden: pod updates may not add or remove containers [\#191](https://github.com/appscode/stash/issues/191) +- Events are not recording for Recovery [\#219](https://github.com/appscode/stash/issues/219) +- \[0.5.0\] Record backup event on kubernetes failure [\#212](https://github.com/appscode/stash/issues/212) +- Fix kubectl version parsing generation in GKE [\#267](https://github.com/appscode/stash/pull/267) ([tamalsaha](https://github.com/tamalsaha)) + +**Closed issues:** + +- Replace fmt.Print\* with log statements [\#248](https://github.com/appscode/stash/issues/248) +- Dynamically create stash-sidecar ClusterRole in operator [\#220](https://github.com/appscode/stash/issues/220) +- LeaderElection part -2 [\#218](https://github.com/appscode/stash/issues/218) +- Reimplement CheckRecoveryJob using Job watcher [\#216](https://github.com/appscode/stash/issues/216) +- Enable --cache-dir [\#238](https://github.com/appscode/stash/issues/238) +- Upgrade procedure for 0.5.1 -\> 0.6.0 [\#237](https://github.com/appscode/stash/issues/237) +- Test RBAC setup [\#224](https://github.com/appscode/stash/issues/224) +- Record recovery status for individual FileGroup [\#213](https://github.com/appscode/stash/issues/213) +- Periodically run restic check [\#195](https://github.com/appscode/stash/issues/195) +- Handle Deployment etc with replicas \> 1 [\#140](https://github.com/appscode/stash/issues/140) +- Support Backblaze B2 as backend [\#125](https://github.com/appscode/stash/issues/125) +- Turn Stash operator into an Initializer [\#5](https://github.com/appscode/stash/issues/5) + +**Merged pull requests:** + +- Detect analytics client id using env vars [\#265](https://github.com/appscode/stash/pull/265) ([tamalsaha](https://github.com/tamalsaha)) +- Repare docs for 0.6.0 release [\#264](https://github.com/appscode/stash/pull/264) ([tamalsaha](https://github.com/tamalsaha)) +- Reorganize docs [\#263](https://github.com/appscode/stash/pull/263) ([tamalsaha](https://github.com/tamalsaha)) +- Add support for B2 [\#262](https://github.com/appscode/stash/pull/262) ([tamalsaha](https://github.com/tamalsaha)) +- Update restic website link [\#261](https://github.com/appscode/stash/pull/261) ([tamalsaha](https://github.com/tamalsaha)) +- Update docs for unified LocalSpec [\#260](https://github.com/appscode/stash/pull/260) ([diptadas](https://github.com/diptadas)) +- Unify LocalSpec and RecoveredVolume [\#259](https://github.com/appscode/stash/pull/259) ([diptadas](https://github.com/diptadas)) +- Remove restic-dependency from recovery [\#258](https://github.com/appscode/stash/pull/258) ([diptadas](https://github.com/diptadas)) +- Update restic version to 0.8.1 [\#257](https://github.com/appscode/stash/pull/257) ([tamalsaha](https://github.com/tamalsaha)) +- Use cmp methods from kutil [\#255](https://github.com/appscode/stash/pull/255) ([tamalsaha](https://github.com/tamalsaha)) +- Remove TryPatch methods [\#254](https://github.com/appscode/stash/pull/254) ([tamalsaha](https://github.com/tamalsaha)) +- Log operator version on start [\#253](https://github.com/appscode/stash/pull/253) ([galexrt](https://github.com/galexrt)) +- Use verb type for mutation [\#251](https://github.com/appscode/stash/pull/251) ([tamalsaha](https://github.com/tamalsaha)) +- Use CreateOrPatchCronJob from kutil [\#250](https://github.com/appscode/stash/pull/250) ([tamalsaha](https://github.com/tamalsaha)) +- Indicate mutation in PATCH helper method return [\#249](https://github.com/appscode/stash/pull/249) ([tamalsaha](https://github.com/tamalsaha)) +- Simplify clientID generation for analytics [\#247](https://github.com/appscode/stash/pull/247) ([tamalsaha](https://github.com/tamalsaha)) +- Set analytics clientID [\#246](https://github.com/appscode/stash/pull/246) ([tamalsaha](https://github.com/tamalsaha)) +- Reorganize docs [\#245](https://github.com/appscode/stash/pull/245) ([tamalsaha](https://github.com/tamalsaha)) +- Upgrade procedure for 0.5.1 to 0.6.0 [\#243](https://github.com/appscode/stash/pull/243) ([diptadas](https://github.com/diptadas)) +- Fix retentionPolicyName not found error [\#242](https://github.com/appscode/stash/pull/242) ([diptadas](https://github.com/diptadas)) +- Enable Restic cahce-dir flag [\#241](https://github.com/appscode/stash/pull/241) ([diptadas](https://github.com/diptadas)) +- Use lower case workload.kind in prefix [\#240](https://github.com/appscode/stash/pull/240) ([diptadas](https://github.com/diptadas)) +- Use RegisterCRDs helper [\#239](https://github.com/appscode/stash/pull/239) ([tamalsaha](https://github.com/tamalsaha)) +- Update docs [\#236](https://github.com/appscode/stash/pull/236) ([diptadas](https://github.com/diptadas)) +- Change left\_menu -\> menu\_name [\#235](https://github.com/appscode/stash/pull/235) ([sajibcse68](https://github.com/sajibcse68)) +- Revendor dependencies [\#234](https://github.com/appscode/stash/pull/234) ([tamalsaha](https://github.com/tamalsaha)) +- Add aliases for README file in front matter [\#233](https://github.com/appscode/stash/pull/233) ([sajibcse68](https://github.com/sajibcse68)) +- Update bundles restic to 0.8.0 [\#232](https://github.com/appscode/stash/pull/232) ([tamalsaha](https://github.com/tamalsaha)) +- Add Docs Front Matter for 0.5.1 [\#231](https://github.com/appscode/stash/pull/231) ([sajibcse68](https://github.com/sajibcse68)) +- Revendor kutil [\#230](https://github.com/appscode/stash/pull/230) ([tamalsaha](https://github.com/tamalsaha)) +- Implement offline backup [\#229](https://github.com/appscode/stash/pull/229) ([diptadas](https://github.com/diptadas)) +- Fix Configmap Name in Leader Election [\#228](https://github.com/appscode/stash/pull/228) ([diptadas](https://github.com/diptadas)) +- Run `restic check` once every 3 days [\#223](https://github.com/appscode/stash/pull/223) ([tamalsaha](https://github.com/tamalsaha)) +- Record recovery status for individual FileGroup [\#222](https://github.com/appscode/stash/pull/222) ([tamalsaha](https://github.com/tamalsaha)) +- Dynamically create stash-sidecar ClusterRole in operator [\#221](https://github.com/appscode/stash/pull/221) ([tamalsaha](https://github.com/tamalsaha)) +- Make stash chart namespaced [\#210](https://github.com/appscode/stash/pull/210) ([tamalsaha](https://github.com/tamalsaha)) +- Implement workload initializer in stash operator [\#207](https://github.com/appscode/stash/pull/207) ([diptadas](https://github.com/diptadas)) +- Leader election for deployment, replica set and rc [\#206](https://github.com/appscode/stash/pull/206) ([diptadas](https://github.com/diptadas)) +- Revise RetentionPolicy in Restic Api [\#205](https://github.com/appscode/stash/pull/205) ([diptadas](https://github.com/diptadas)) +- Implement Recovery for Restic Backup [\#202](https://github.com/appscode/stash/pull/202) ([diptadas](https://github.com/diptadas)) diff --git a/content/docs/v2024.12.18/CHANGELOG-0.7.md b/content/docs/v2024.12.18/CHANGELOG-0.7.md new file mode 100644 index 0000000000..e215746b2a --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-0.7.md @@ -0,0 +1,304 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-0.7 + name: Changelog-0.7 + parent: welcome + weight: 70 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-0.7/ +aliases: +- /docs/v2024.12.18/CHANGELOG-0.7/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Change Log + +## [0.7.0](https://github.com/appscode/stash/tree/0.7.0) (2018-05-29) +[Full Changelog](https://github.com/appscode/stash/compare/0.7.0-rc.5...0.7.0) + +**Implemented enhancements:** + +- Support custom CA cert with backend [\#288](https://github.com/appscode/stash/issues/288) + +**Fixed bugs:** + +- Pod restart after each backup when Mutating Webhook enabled [\#396](https://github.com/appscode/stash/issues/396) +- Sidecar RoleBinding is not being created when Mutating Webhook is enabled [\#395](https://github.com/appscode/stash/issues/395) +- Recovery to PVC restores data in subdirectory instead of root directory [\#392](https://github.com/appscode/stash/issues/392) +- Forget panics in 0.7.0-rc.0 [\#373](https://github.com/appscode/stash/issues/373) + +**Closed issues:** + +- Resource type "snapshot" not registered [\#499](https://github.com/appscode/stash/issues/499) +- Support Repository deletion [\#416](https://github.com/appscode/stash/issues/416) +- Docs TODO [\#414](https://github.com/appscode/stash/issues/414) +- Convert Initializer to MutationWebhook [\#326](https://github.com/appscode/stash/issues/326) +- Use informer factory for backup scheduler [\#321](https://github.com/appscode/stash/issues/321) +- Show repository snapshot list [\#319](https://github.com/appscode/stash/issues/319) +- Verbosity \(--v\) flag not inherited to backup sidecars [\#282](https://github.com/appscode/stash/issues/282) +- Double Deployment patch when deleting a Restic CRD? [\#281](https://github.com/appscode/stash/issues/281) +- Consider a simple 'enabled' switch for Restic CRD [\#279](https://github.com/appscode/stash/issues/279) +- offline backup is not supported for workload kind `Deployment`, `Replicaset` and `ReplicationController` with `replicas \> 1` [\#244](https://github.com/appscode/stash/issues/244) +- Recover specific snapshot ID [\#215](https://github.com/appscode/stash/issues/215) + +**Merged pull requests:** + +- Prepare docs for 0.7.0 release. [\#502](https://github.com/appscode/stash/pull/502) ([tamalsaha](https://github.com/tamalsaha)) +- Set RollingUpdate for DaemonSet [\#349](https://github.com/appscode/stash/pull/349) ([tamalsaha](https://github.com/tamalsaha)) + +## [0.7.0-rc.5](https://github.com/appscode/stash/tree/0.7.0-rc.5) (2018-05-23) +[Full Changelog](https://github.com/appscode/stash/compare/0.7.0-rc.4...0.7.0-rc.5) + +**Fixed bugs:** + +- Fix storage implementation for snapshots [\#497](https://github.com/appscode/stash/pull/497) ([tamalsaha](https://github.com/tamalsaha)) + +**Merged pull requests:** + +- Prepare docs for 0.7.0-rc.5 [\#498](https://github.com/appscode/stash/pull/498) ([tamalsaha](https://github.com/tamalsaha)) +- Update changelog [\#495](https://github.com/appscode/stash/pull/495) ([tamalsaha](https://github.com/tamalsaha)) + +## [0.7.0-rc.4](https://github.com/appscode/stash/tree/0.7.0-rc.4) (2018-05-22) +[Full Changelog](https://github.com/appscode/stash/compare/0.7.0-rc.3...0.7.0-rc.4) + +**Fixed bugs:** + +- Restic sidecar not properly working because of image tag error [\#443](https://github.com/appscode/stash/issues/443) +- Removed owner reference from repo-reader role-binding [\#484](https://github.com/appscode/stash/pull/484) ([hossainemruz](https://github.com/hossainemruz)) +- Permit stash operator to perform pods/exec [\#433](https://github.com/appscode/stash/pull/433) ([tamalsaha](https://github.com/tamalsaha)) +- Add missing batch jobs get RBAC permission [\#419](https://github.com/appscode/stash/pull/419) ([galexrt](https://github.com/galexrt)) + +**Closed issues:** + +- Stash restore pod fails with istio sidecar [\#475](https://github.com/appscode/stash/issues/475) +- Stash stores GCS credentials in /tmp with 644 permissions [\#470](https://github.com/appscode/stash/issues/470) +- Update minio doc for 1.10? [\#467](https://github.com/appscode/stash/issues/467) +- Fix docs for StatefulSet [\#444](https://github.com/appscode/stash/issues/444) + +**Merged pull requests:** + +- Delete user roles on purge. [\#494](https://github.com/appscode/stash/pull/494) ([tamalsaha](https://github.com/tamalsaha)) +- Add app: stash label to user roles. [\#493](https://github.com/appscode/stash/pull/493) ([tamalsaha](https://github.com/tamalsaha)) +- Use post-install hooks to install admission controller in chart [\#492](https://github.com/appscode/stash/pull/492) ([tamalsaha](https://github.com/tamalsaha)) +- Update changelog [\#491](https://github.com/appscode/stash/pull/491) ([tamalsaha](https://github.com/tamalsaha)) +- Avoid creating apiservice when webhooks are not used. [\#490](https://github.com/appscode/stash/pull/490) ([tamalsaha](https://github.com/tamalsaha)) +- Install correct version of stash chart [\#489](https://github.com/appscode/stash/pull/489) ([tamalsaha](https://github.com/tamalsaha)) +- Use wait-until instead of fixed delay [\#488](https://github.com/appscode/stash/pull/488) ([hossainemruz](https://github.com/hossainemruz)) +- Concourse [\#486](https://github.com/appscode/stash/pull/486) ([tahsinrahman](https://github.com/tahsinrahman)) +- Prepare docs for 0.7.0-rc.4 [\#483](https://github.com/appscode/stash/pull/483) ([tamalsaha](https://github.com/tamalsaha)) +- Revendor [\#481](https://github.com/appscode/stash/pull/481) ([tamalsaha](https://github.com/tamalsaha)) +- Fix enableRBAC flag for sidecar [\#480](https://github.com/appscode/stash/pull/480) ([hossainemruz](https://github.com/hossainemruz)) +- Typo \(`Weclome` → `Welcome`\) in page title [\#479](https://github.com/appscode/stash/pull/479) ([eliasp](https://github.com/eliasp)) +- Add support for initial backoff to the apiserver call on recover [\#476](https://github.com/appscode/stash/pull/476) ([farcaller](https://github.com/farcaller)) +- Support recovering from repository in different namespace [\#474](https://github.com/appscode/stash/pull/474) ([tamalsaha](https://github.com/tamalsaha)) +- Update docs \(run minio in v1.9.4+ cluster and add example yaml files in respective backends\) [\#473](https://github.com/appscode/stash/pull/473) ([hossainemruz](https://github.com/hossainemruz)) +- Limit the GCS file permissions to owner only [\#472](https://github.com/appscode/stash/pull/472) ([farcaller](https://github.com/farcaller)) +- Fix a typo [\#471](https://github.com/appscode/stash/pull/471) ([farcaller](https://github.com/farcaller)) +- Don't panic if admission options is nil [\#469](https://github.com/appscode/stash/pull/469) ([tamalsaha](https://github.com/tamalsaha)) +- Disable admission controllers for webhook server [\#468](https://github.com/appscode/stash/pull/468) ([tamalsaha](https://github.com/tamalsaha)) +- Use new UpdateRecoveryStatus method [\#466](https://github.com/appscode/stash/pull/466) ([tamalsaha](https://github.com/tamalsaha)) +- Add Update\*\*\*Status helpers [\#465](https://github.com/appscode/stash/pull/465) ([tamalsaha](https://github.com/tamalsaha)) +- Added SSL support for deleting restic repository from Minio backend [\#464](https://github.com/appscode/stash/pull/464) ([hossainemruz](https://github.com/hossainemruz)) +- Update client-go to 7.0.0 [\#463](https://github.com/appscode/stash/pull/463) ([tamalsaha](https://github.com/tamalsaha)) +- Rename webhook files in chart [\#460](https://github.com/appscode/stash/pull/460) ([tamalsaha](https://github.com/tamalsaha)) +- Update workload api [\#459](https://github.com/appscode/stash/pull/459) ([tamalsaha](https://github.com/tamalsaha)) +- Remove stash crds before uninstalling operator [\#458](https://github.com/appscode/stash/pull/458) ([tamalsaha](https://github.com/tamalsaha)) +- Export kube-ca only if required [\#457](https://github.com/appscode/stash/pull/457) ([tamalsaha](https://github.com/tamalsaha)) +- Improve installer [\#456](https://github.com/appscode/stash/pull/456) ([tamalsaha](https://github.com/tamalsaha)) +- Update changelog [\#455](https://github.com/appscode/stash/pull/455) ([tamalsaha](https://github.com/tamalsaha)) +- Various installer fixes [\#454](https://github.com/appscode/stash/pull/454) ([tamalsaha](https://github.com/tamalsaha)) +- Update workload client [\#453](https://github.com/appscode/stash/pull/453) ([tamalsaha](https://github.com/tamalsaha)) +- Update workload client [\#452](https://github.com/appscode/stash/pull/452) ([tamalsaha](https://github.com/tamalsaha)) +- Revendor workload client [\#451](https://github.com/appscode/stash/pull/451) ([tamalsaha](https://github.com/tamalsaha)) +- Update workload api [\#450](https://github.com/appscode/stash/pull/450) ([tamalsaha](https://github.com/tamalsaha)) +- Fixes RBAC permission for scaledownCronJob [\#449](https://github.com/appscode/stash/pull/449) ([hossainemruz](https://github.com/hossainemruz)) +- Used Snapshot to verify successful backup [\#447](https://github.com/appscode/stash/pull/447) ([hossainemruz](https://github.com/hossainemruz)) +- Some cleanup [\#446](https://github.com/appscode/stash/pull/446) ([tamalsaha](https://github.com/tamalsaha)) +- Update StatefulSet doc [\#445](https://github.com/appscode/stash/pull/445) ([hossainemruz](https://github.com/hossainemruz)) +- pkg/util: fix error found by vet [\#442](https://github.com/appscode/stash/pull/442) ([functionary](https://github.com/functionary)) +- Move Stash swagger.json to top level folder [\#441](https://github.com/appscode/stash/pull/441) ([tamalsaha](https://github.com/tamalsaha)) +- Fix go\_vet error [\#440](https://github.com/appscode/stash/pull/440) ([hossainemruz](https://github.com/hossainemruz)) +- Delete restic repository from backend if Repository CRD is deleted [\#438](https://github.com/appscode/stash/pull/438) ([hossainemruz](https://github.com/hossainemruz)) +- Recover specific snapshot [\#437](https://github.com/appscode/stash/pull/437) ([hossainemruz](https://github.com/hossainemruz)) +- Use Repository data in Recovery CRD [\#436](https://github.com/appscode/stash/pull/436) ([hossainemruz](https://github.com/hossainemruz)) +- Increase qps and burst limits [\#435](https://github.com/appscode/stash/pull/435) ([tamalsaha](https://github.com/tamalsaha)) +- Add RBAC instructions for GKE cluster [\#432](https://github.com/appscode/stash/pull/432) ([tamalsaha](https://github.com/tamalsaha)) +- Update charts location [\#431](https://github.com/appscode/stash/pull/431) ([tamalsaha](https://github.com/tamalsaha)) +- Add docs for GKE and Rook [\#430](https://github.com/appscode/stash/pull/430) ([hossainemruz](https://github.com/hossainemruz)) +- concourse configs [\#429](https://github.com/appscode/stash/pull/429) ([tahsinrahman](https://github.com/tahsinrahman)) +- Skip lock while listing snapshots [\#428](https://github.com/appscode/stash/pull/428) ([hossainemruz](https://github.com/hossainemruz)) +- Purge repository objects in installer [\#427](https://github.com/appscode/stash/pull/427) ([tamalsaha](https://github.com/tamalsaha)) +- Support installing from local installer scripts [\#426](https://github.com/appscode/stash/pull/426) ([tamalsaha](https://github.com/tamalsaha)) +- Fixed Repository yaml in doc [\#425](https://github.com/appscode/stash/pull/425) ([hossainemruz](https://github.com/hossainemruz)) +- Add delete method for snapshots to swagger.json [\#424](https://github.com/appscode/stash/pull/424) ([tamalsaha](https://github.com/tamalsaha)) +- Generate swagger.json [\#423](https://github.com/appscode/stash/pull/423) ([tamalsaha](https://github.com/tamalsaha)) +- Add install pkg for stash crds [\#422](https://github.com/appscode/stash/pull/422) ([tamalsaha](https://github.com/tamalsaha)) +- Fix openapi spec for stash crds [\#421](https://github.com/appscode/stash/pull/421) ([tamalsaha](https://github.com/tamalsaha)) +- Expose swagger.json [\#420](https://github.com/appscode/stash/pull/420) ([tamalsaha](https://github.com/tamalsaha)) +- Show repository snapshot list [\#417](https://github.com/appscode/stash/pull/417) ([hossainemruz](https://github.com/hossainemruz)) +- Add registry skeleton for snapshots [\#415](https://github.com/appscode/stash/pull/415) ([tamalsaha](https://github.com/tamalsaha)) +- Update chart readme [\#413](https://github.com/appscode/stash/pull/413) ([tamalsaha](https://github.com/tamalsaha)) + +## [0.7.0-rc.3](https://github.com/appscode/stash/tree/0.7.0-rc.3) (2018-04-03) +[Full Changelog](https://github.com/appscode/stash/compare/0.7.0-rc.2...0.7.0-rc.3) + +**Fixed bugs:** + +- Use separate registry key for docker images [\#410](https://github.com/appscode/stash/pull/410) ([tamalsaha](https://github.com/tamalsaha)) +- Revendor webhook util and jsonpatch fixes [\#400](https://github.com/appscode/stash/pull/400) ([tamalsaha](https://github.com/tamalsaha)) + +**Closed issues:** + +- hack/deploy/stash.sh: $? check does not work with set -e [\#403](https://github.com/appscode/stash/issues/403) + +**Merged pull requests:** + +- Add frontmatter for repository crd [\#412](https://github.com/appscode/stash/pull/412) ([tamalsaha](https://github.com/tamalsaha)) +- Prepare docs for 0.7.0-rc.3 [\#411](https://github.com/appscode/stash/pull/411) ([tamalsaha](https://github.com/tamalsaha)) +- Add test for recovery [\#409](https://github.com/appscode/stash/pull/409) ([hossainemruz](https://github.com/hossainemruz)) +- Skip setting ListKind [\#407](https://github.com/appscode/stash/pull/407) ([tamalsaha](https://github.com/tamalsaha)) +- Add CRD Validation [\#406](https://github.com/appscode/stash/pull/406) ([tamalsaha](https://github.com/tamalsaha)) +- Generate openapi spec for stash api [\#405](https://github.com/appscode/stash/pull/405) ([tamalsaha](https://github.com/tamalsaha)) +- Fix install script for minikube 0.24.x \(Kube 1.8.0\) [\#404](https://github.com/appscode/stash/pull/404) ([tamalsaha](https://github.com/tamalsaha)) +- Skip downloading onessl if already installed [\#401](https://github.com/appscode/stash/pull/401) ([tamalsaha](https://github.com/tamalsaha)) +- Use Restic spec hash instead of resource version to restart pods [\#399](https://github.com/appscode/stash/pull/399) ([tamalsaha](https://github.com/tamalsaha)) +- Check for valid owner object [\#397](https://github.com/appscode/stash/pull/397) ([tamalsaha](https://github.com/tamalsaha)) +- Create repository crd for each Restic repository [\#394](https://github.com/appscode/stash/pull/394) ([hossainemruz](https://github.com/hossainemruz)) +- Revendor webhook library [\#393](https://github.com/appscode/stash/pull/393) ([tamalsaha](https://github.com/tamalsaha)) + +## [0.7.0-rc.2](https://github.com/appscode/stash/tree/0.7.0-rc.2) (2018-03-24) +[Full Changelog](https://github.com/appscode/stash/compare/0.7.0-rc.1...0.7.0-rc.2) + +**Fixed bugs:** + +- Fix --enable-analytics flag [\#387](https://github.com/appscode/stash/pull/387) ([tamalsaha](https://github.com/tamalsaha)) +- Fix flag parsing in tests [\#386](https://github.com/appscode/stash/pull/386) ([tamalsaha](https://github.com/tamalsaha)) + +**Merged pull requests:** + +- Prepare docs for 0.7.0-rc.2 [\#391](https://github.com/appscode/stash/pull/391) ([tamalsaha](https://github.com/tamalsaha)) +- Add variable for dockerRegistry [\#390](https://github.com/appscode/stash/pull/390) ([tamalsaha](https://github.com/tamalsaha)) +- Reorg objects deleted in uninstall command [\#389](https://github.com/appscode/stash/pull/389) ([tamalsaha](https://github.com/tamalsaha)) +- Fix Statefulset Example [\#385](https://github.com/appscode/stash/pull/385) ([rzcastilho](https://github.com/rzcastilho)) +- Rename --analytics to --enable-analytics [\#384](https://github.com/appscode/stash/pull/384) ([tamalsaha](https://github.com/tamalsaha)) +- Use separated appscode/kubernetes-webhook-util package [\#383](https://github.com/appscode/stash/pull/383) ([tamalsaha](https://github.com/tamalsaha)) + +## [0.7.0-rc.1](https://github.com/appscode/stash/tree/0.7.0-rc.1) (2018-03-21) +[Full Changelog](https://github.com/appscode/stash/compare/0.7.0-rc.0...0.7.0-rc.1) + +**Fixed bugs:** + +- Don't enable mutator for StatefulSet updates [\#381](https://github.com/appscode/stash/pull/381) ([tamalsaha](https://github.com/tamalsaha)) +- Stop using field selectors for CRDs [\#379](https://github.com/appscode/stash/pull/379) ([tamalsaha](https://github.com/tamalsaha)) + +**Closed issues:** + +- "DeprecatedServiceAccount not present in src" while converting unversioned StatefulSet to v1beta1.StatefulSet [\#371](https://github.com/appscode/stash/issues/371) +- \[0.6.x\] Helm chart broken due to undocumented '--docker-registry' and other arguments [\#354](https://github.com/appscode/stash/issues/354) +- \[0.7.0-rc.0\] Fails on start-up with 'cluster doesn't provide requestheader-client-ca-file' [\#353](https://github.com/appscode/stash/issues/353) +- Ability to backup volumes with ReadWriteOnce access mode [\#350](https://github.com/appscode/stash/issues/350) +- Recovery not working! [\#303](https://github.com/appscode/stash/issues/303) + +**Merged pull requests:** + +- Update the image tag in operator.yaml [\#382](https://github.com/appscode/stash/pull/382) ([tamalsaha](https://github.com/tamalsaha)) +- Update docs to 0.7.0-rc.1 [\#380](https://github.com/appscode/stash/pull/380) ([tamalsaha](https://github.com/tamalsaha)) +- Add types for Repository apigroup [\#377](https://github.com/appscode/stash/pull/377) ([tamalsaha](https://github.com/tamalsaha)) +- Add missing front matter [\#376](https://github.com/appscode/stash/pull/376) ([tamalsaha](https://github.com/tamalsaha)) +- Check for check job before creating it [\#375](https://github.com/appscode/stash/pull/375) ([galexrt](https://github.com/galexrt)) +- Add travis.yaml [\#370](https://github.com/appscode/stash/pull/370) ([tamalsaha](https://github.com/tamalsaha)) +- Add --purge flag [\#369](https://github.com/appscode/stash/pull/369) ([tamalsaha](https://github.com/tamalsaha)) +- Make it clear that installer is a single command [\#365](https://github.com/appscode/stash/pull/365) ([tamalsaha](https://github.com/tamalsaha)) +- Update installer [\#364](https://github.com/appscode/stash/pull/364) ([tamalsaha](https://github.com/tamalsaha)) +- Replace initializers with mutation webhook for workloads [\#363](https://github.com/appscode/stash/pull/363) ([hossainemruz](https://github.com/hossainemruz)) +- Update chart to match RBAC best practices for charts [\#362](https://github.com/appscode/stash/pull/362) ([tamalsaha](https://github.com/tamalsaha)) +- Add checks to installer script [\#361](https://github.com/appscode/stash/pull/361) ([tamalsaha](https://github.com/tamalsaha)) +- Use admission hook helpers from kutil [\#360](https://github.com/appscode/stash/pull/360) ([tamalsaha](https://github.com/tamalsaha)) +- Fix admission webhook flag [\#359](https://github.com/appscode/stash/pull/359) ([tamalsaha](https://github.com/tamalsaha)) +- Support --enable-admission-webhook=false [\#358](https://github.com/appscode/stash/pull/358) ([tamalsaha](https://github.com/tamalsaha)) +- Support multiple webhooks of same apiversion [\#357](https://github.com/appscode/stash/pull/357) ([tamalsaha](https://github.com/tamalsaha)) +- Sync chart to stable charts repo [\#356](https://github.com/appscode/stash/pull/356) ([tamalsaha](https://github.com/tamalsaha)) +- Use restic 0.8.3 [\#355](https://github.com/appscode/stash/pull/355) ([tamalsaha](https://github.com/tamalsaha)) +- Update README.md [\#352](https://github.com/appscode/stash/pull/352) ([tamalsaha](https://github.com/tamalsaha)) + +## [0.7.0-rc.0](https://github.com/appscode/stash/tree/0.7.0-rc.0) (2018-02-20) +[Full Changelog](https://github.com/appscode/stash/compare/0.6.4...0.7.0-rc.0) + +**Merged pull requests:** + +- Document user roles [\#348](https://github.com/appscode/stash/pull/348) ([tamalsaha](https://github.com/tamalsaha)) +- Add changelog for 0.7.0-rc.0 [\#347](https://github.com/appscode/stash/pull/347) ([tamalsaha](https://github.com/tamalsaha)) +- Add a parameter to allow disabling initializers [\#346](https://github.com/appscode/stash/pull/346) ([mcanevet](https://github.com/mcanevet)) +- Update readme to point to 0.6.4 [\#345](https://github.com/appscode/stash/pull/345) ([tamalsaha](https://github.com/tamalsaha)) +- Implement offline backup for multiple replica [\#335](https://github.com/appscode/stash/pull/335) ([hossainemruz](https://github.com/hossainemruz)) + diff --git a/content/docs/v2024.12.18/CHANGELOG-0.8.md b/content/docs/v2024.12.18/CHANGELOG-0.8.md new file mode 100644 index 0000000000..d69563d531 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-0.8.md @@ -0,0 +1,251 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-0.8 + name: Changelog-0.8 + parent: welcome + weight: 80 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-0.8/ +aliases: +- /docs/v2024.12.18/CHANGELOG-0.8/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Change Log + +## [0.8.3](https://github.com/appscode/stash/tree/0.8.3) (2019-02-19) +[Full Changelog](https://github.com/appscode/stash/compare/0.8.2...0.8.3) + +**Closed issues:** + +- Instance label in pushgateway is deprecated - Not use HostnameGroupingKey\(\) [\#670](https://github.com/appscode/stash/issues/670) +- Design review [\#616](https://github.com/appscode/stash/issues/616) +- Rename Restic to Backup [\#320](https://github.com/appscode/stash/issues/320) + +**Merged pull requests:** + +- Update dependencies [\#681](https://github.com/appscode/stash/pull/681) ([tamalsaha](https://github.com/tamalsaha)) +- Don't add hostname label to Prometheus metrics. [\#680](https://github.com/appscode/stash/pull/680) ([tamalsaha](https://github.com/tamalsaha)) +- Pass pod annotation to deployment [\#679](https://github.com/appscode/stash/pull/679) ([tamalsaha](https://github.com/tamalsaha)) +- Fix the case for deploying using MINGW64 for windows [\#678](https://github.com/appscode/stash/pull/678) ([tamalsaha](https://github.com/tamalsaha)) +- Use onessl 0.10.0 [\#677](https://github.com/appscode/stash/pull/677) ([tamalsaha](https://github.com/tamalsaha)) +- s/rook/azure/ in possible copy/paste error. [\#669](https://github.com/appscode/stash/pull/669) ([lastcoolnameleft](https://github.com/lastcoolnameleft)) +- Fix builtin monitoring doc [\#668](https://github.com/appscode/stash/pull/668) ([hossainemruz](https://github.com/hossainemruz)) +- Don't use priority class when operator namespace is not kube-system [\#666](https://github.com/appscode/stash/pull/666) ([hossainemruz](https://github.com/hossainemruz)) +- Separate type definitions into individual files [\#646](https://github.com/appscode/stash/pull/646) ([hossainemruz](https://github.com/hossainemruz)) + +## [0.8.2](https://github.com/appscode/stash/tree/0.8.2) (2019-01-02) +[Full Changelog](https://github.com/appscode/stash/compare/0.8.1...0.8.2) + +**Fixed bugs:** + +- Fix typo in installer [\#638](https://github.com/appscode/stash/pull/638) ([tamalsaha](https://github.com/tamalsaha)) + +**Closed issues:** + +- Backend configuration doc link broken [\#640](https://github.com/appscode/stash/issues/640) +- Architecture questions [\#635](https://github.com/appscode/stash/issues/635) +- Restart operator pod on update [\#611](https://github.com/appscode/stash/issues/611) + +**Merged pull requests:** + +- Prepare docs for 0.8.2 release [\#644](https://github.com/appscode/stash/pull/644) ([tamalsaha](https://github.com/tamalsaha)) +- Update copyright notice for 2019 [\#643](https://github.com/appscode/stash/pull/643) ([tamalsaha](https://github.com/tamalsaha)) +- Use stash.labels template in chart [\#642](https://github.com/appscode/stash/pull/642) ([tamalsaha](https://github.com/tamalsaha)) +- Fixed broken link for bakend [\#641](https://github.com/appscode/stash/pull/641) ([hossainemruz](https://github.com/hossainemruz)) +- Only mount stash apiserver `tls.crt` into Prometheus [\#639](https://github.com/appscode/stash/pull/639) ([hossainemruz](https://github.com/hossainemruz)) +- Fix monitoring in helm + update doc to match with third-party-tools tutorial [\#637](https://github.com/appscode/stash/pull/637) ([hossainemruz](https://github.com/hossainemruz)) +- Add certificate health checker [\#636](https://github.com/appscode/stash/pull/636) ([tamalsaha](https://github.com/tamalsaha)) +- Update chart readme [\#632](https://github.com/appscode/stash/pull/632) ([tamalsaha](https://github.com/tamalsaha)) +- Update webhook error message format for Kubernetes 1.13+ [\#631](https://github.com/appscode/stash/pull/631) ([tamalsaha](https://github.com/tamalsaha)) +- Fix typos [\#630](https://github.com/appscode/stash/pull/630) ([tamalsaha](https://github.com/tamalsaha)) + +## [0.8.1](https://github.com/appscode/stash/tree/0.8.1) (2018-12-09) +[Full Changelog](https://github.com/appscode/stash/compare/0.8.0...0.8.1) + +**Fixed bugs:** + +- Stash chart is throwing error [\#627](https://github.com/appscode/stash/issues/627) + +**Merged pull requests:** + +- Prepare docs for 0.8.1 release [\#629](https://github.com/appscode/stash/pull/629) ([tamalsaha](https://github.com/tamalsaha)) +- Add missing validator for repository resource in chart [\#628](https://github.com/appscode/stash/pull/628) ([tamalsaha](https://github.com/tamalsaha)) + +## [0.8.0](https://github.com/appscode/stash/tree/0.8.0) (2018-12-08) +[Full Changelog](https://github.com/appscode/stash/compare/0.7.0...0.8.0) + +**Fixed bugs:** + +- Delete snapshot command does not check for snapshot's existence [\#549](https://github.com/appscode/stash/issues/549) +- Backup not triggered [\#461](https://github.com/appscode/stash/issues/461) +- Service name hardcoded in func PushgatewayURL, no metrics available [\#596](https://github.com/appscode/stash/issues/596) +- Fix extended apiserver issues with Kubernetes 1.11 [\#536](https://github.com/appscode/stash/pull/536) ([tamalsaha](https://github.com/tamalsaha)) +- Correctly handle ignored openapi prefixes [\#533](https://github.com/appscode/stash/pull/533) ([tamalsaha](https://github.com/tamalsaha)) +- Add rbac permissions for snapshots [\#531](https://github.com/appscode/stash/pull/531) ([tamalsaha](https://github.com/tamalsaha)) + +**Closed issues:** + +- Problem creating backups [\#588](https://github.com/appscode/stash/issues/588) +- Issue while installing stash kubernetes 1.11.2 [\#587](https://github.com/appscode/stash/issues/587) +- Hardcoded cleaner kubectl image in Helm chart [\#583](https://github.com/appscode/stash/issues/583) +- Deployed latest helm chart and getting error during sidecar creation [\#556](https://github.com/appscode/stash/issues/556) +- Minio backup fails: 'net/http: invalid header field value "..." for key Authorization' [\#547](https://github.com/appscode/stash/issues/547) +- Repository overwrite for different workload with same name in different namespace [\#539](https://github.com/appscode/stash/issues/539) +- Unexpected behavior in offline backup [\#535](https://github.com/appscode/stash/issues/535) +- Offline backup not working \(permissions\) [\#534](https://github.com/appscode/stash/issues/534) +- Support node selector for recovery job [\#515](https://github.com/appscode/stash/issues/515) +- Clarify that hostpaths are just example [\#514](https://github.com/appscode/stash/issues/514) +- Internal error occurred: failed calling admission webhook "deployment.admission.stash.appscode.com": the server could not find the requested resource [\#510](https://github.com/appscode/stash/issues/510) +- GKE page missing front matter [\#505](https://github.com/appscode/stash/issues/505) +- Could not list snapshots on kubernetes 1.8.4 [\#503](https://github.com/appscode/stash/issues/503) +- Admission webhook denied rquest: Rolebindings not found [\#501](https://github.com/appscode/stash/issues/501) +- Incorrect image name for sidecar container [\#485](https://github.com/appscode/stash/issues/485) +- Using Stash with TLS secured Minio Server Can't succeed [\#478](https://github.com/appscode/stash/issues/478) +- Add cluster name in repo path [\#374](https://github.com/appscode/stash/issues/374) +- Stash don't pass `nodeSelector` from Recovery crd to recovery Job. [\#617](https://github.com/appscode/stash/issues/617) +- Recovery task is not working [\#613](https://github.com/appscode/stash/issues/613) +- Permissions problem with the Helm chart in master branch [\#592](https://github.com/appscode/stash/issues/592) +- Add Prometheus config sample for pushgateway [\#582](https://github.com/appscode/stash/issues/582) +- Handle security context [\#566](https://github.com/appscode/stash/issues/566) +- \[Request\] Add backup details to "kubectl get" for stash objects on K8s 1.11 [\#525](https://github.com/appscode/stash/issues/525) +- matchLabels on Restic CRD not working when using hyphens in keys [\#521](https://github.com/appscode/stash/issues/521) + +**Merged pull requests:** + +- Prepare docs for 0.8.0 release [\#626](https://github.com/appscode/stash/pull/626) ([tamalsaha](https://github.com/tamalsaha)) +- Update docs \(Minio, Rook, NFS\) [\#625](https://github.com/appscode/stash/pull/625) ([hossainemruz](https://github.com/hossainemruz)) +- Use flags.DumpAll to dump flags [\#624](https://github.com/appscode/stash/pull/624) ([tamalsaha](https://github.com/tamalsaha)) +- Set periodic analytics [\#623](https://github.com/appscode/stash/pull/623) ([tamalsaha](https://github.com/tamalsaha)) +- Fix e2e test [\#622](https://github.com/appscode/stash/pull/622) ([hossainemruz](https://github.com/hossainemruz)) +- Recovery Job: Use nodeName for DaemonSet and nodeSelector for other workloads [\#620](https://github.com/appscode/stash/pull/620) ([hossainemruz](https://github.com/hossainemruz)) +- Pass --enable-\*\*\*-webhook flags to operator [\#619](https://github.com/appscode/stash/pull/619) ([tamalsaha](https://github.com/tamalsaha)) +- Add validation webhook xray [\#618](https://github.com/appscode/stash/pull/618) ([tamalsaha](https://github.com/tamalsaha)) +- Use dynamic pushgateway url [\#614](https://github.com/appscode/stash/pull/614) ([hossainemruz](https://github.com/hossainemruz)) +- Add docs for AKS and EKS [\#609](https://github.com/appscode/stash/pull/609) ([hossainemruz](https://github.com/hossainemruz)) +- Improve monitoring facility [\#606](https://github.com/appscode/stash/pull/606) ([hossainemruz](https://github.com/hossainemruz)) +- Pass image pull secrets for cleaner job in chart [\#598](https://github.com/appscode/stash/pull/598) ([tamalsaha](https://github.com/tamalsaha)) +- Update kubernetes client libraries to 1.12.0 [\#597](https://github.com/appscode/stash/pull/597) ([tamalsaha](https://github.com/tamalsaha)) +- Support LogLevel in chart [\#594](https://github.com/appscode/stash/pull/594) ([tamalsaha](https://github.com/tamalsaha)) +- Check if Kubernetes version is supported before running operator [\#593](https://github.com/appscode/stash/pull/593) ([tamalsaha](https://github.com/tamalsaha)) +- Enable webhooks by default in chart [\#591](https://github.com/appscode/stash/pull/591) ([tamalsaha](https://github.com/tamalsaha)) +- Update chart readme for cleaner values [\#590](https://github.com/appscode/stash/pull/590) ([tamalsaha](https://github.com/tamalsaha)) +- Fix \#583 and pushgateway version [\#584](https://github.com/appscode/stash/pull/584) ([sebastien-prudhomme](https://github.com/sebastien-prudhomme)) +- Use --pull flag with docker build [\#581](https://github.com/appscode/stash/pull/581) ([tamalsaha](https://github.com/tamalsaha)) +- Use kubernetes-1.11.3 [\#578](https://github.com/appscode/stash/pull/578) ([tamalsaha](https://github.com/tamalsaha)) +- Update CertStore [\#576](https://github.com/appscode/stash/pull/576) ([tamalsaha](https://github.com/tamalsaha)) +- Use apps/v1 apigroup in installer scripts [\#574](https://github.com/appscode/stash/pull/574) ([tamalsaha](https://github.com/tamalsaha)) +- Support pod annotations in chart [\#573](https://github.com/appscode/stash/pull/573) ([tamalsaha](https://github.com/tamalsaha)) +- Set serviceAccount for clearner job [\#572](https://github.com/appscode/stash/pull/572) ([tamalsaha](https://github.com/tamalsaha)) +- Set SecurityContext for stash sidecar [\#570](https://github.com/appscode/stash/pull/570) ([tamalsaha](https://github.com/tamalsaha)) +- Cleanup webhooks when chart is deleted [\#569](https://github.com/appscode/stash/pull/569) ([tamalsaha](https://github.com/tamalsaha)) +- Use IntHash as status.observedGeneration [\#568](https://github.com/appscode/stash/pull/568) ([tamalsaha](https://github.com/tamalsaha)) +- fix success list in grafana dashboard [\#567](https://github.com/appscode/stash/pull/567) ([unteem](https://github.com/unteem)) +- Update pipeline [\#565](https://github.com/appscode/stash/pull/565) ([tahsinrahman](https://github.com/tahsinrahman)) +- Add observedGenerationHash field [\#564](https://github.com/appscode/stash/pull/564) ([tamalsaha](https://github.com/tamalsaha)) +- fix uninstall for concourse [\#563](https://github.com/appscode/stash/pull/563) ([tahsinrahman](https://github.com/tahsinrahman)) +- Fix chart values file [\#562](https://github.com/appscode/stash/pull/562) ([tamalsaha](https://github.com/tamalsaha)) +- Improve Helm chart options [\#561](https://github.com/appscode/stash/pull/561) ([tamalsaha](https://github.com/tamalsaha)) +- Refactor concourse scripts [\#554](https://github.com/appscode/stash/pull/554) ([tahsinrahman](https://github.com/tahsinrahman)) +- Add AlreadyObserved methods [\#553](https://github.com/appscode/stash/pull/553) ([tamalsaha](https://github.com/tamalsaha)) +- Add categories support to crds [\#552](https://github.com/appscode/stash/pull/552) ([tamalsaha](https://github.com/tamalsaha)) +- Improve logging [\#551](https://github.com/appscode/stash/pull/551) ([hossainemruz](https://github.com/hossainemruz)) +- Improve doc [\#550](https://github.com/appscode/stash/pull/550) ([hossainemruz](https://github.com/hossainemruz)) +- Check for snapshot existence before delete [\#548](https://github.com/appscode/stash/pull/548) ([hossainemruz](https://github.com/hossainemruz)) +- Enable status sub resource for crd yamls [\#546](https://github.com/appscode/stash/pull/546) ([tamalsaha](https://github.com/tamalsaha)) +- Retry UpdateStatus calls [\#544](https://github.com/appscode/stash/pull/544) ([tamalsaha](https://github.com/tamalsaha)) +- Move crds to api folder [\#543](https://github.com/appscode/stash/pull/543) ([tamalsaha](https://github.com/tamalsaha)) +- Revendor objectstore api [\#542](https://github.com/appscode/stash/pull/542) ([tamalsaha](https://github.com/tamalsaha)) +- Use kmodules.xyz/objectstore-api [\#541](https://github.com/appscode/stash/pull/541) ([tamalsaha](https://github.com/tamalsaha)) +- Fix offline backup [\#537](https://github.com/appscode/stash/pull/537) ([hossainemruz](https://github.com/hossainemruz)) +- Rename dev script [\#532](https://github.com/appscode/stash/pull/532) ([tamalsaha](https://github.com/tamalsaha)) +- Use version and additional columns for crds [\#530](https://github.com/appscode/stash/pull/530) ([tamalsaha](https://github.com/tamalsaha)) +- Don't add admission/v1beta1 group as a prioritized version [\#529](https://github.com/appscode/stash/pull/529) ([tamalsaha](https://github.com/tamalsaha)) +- Update client-go to v8.0.0 [\#528](https://github.com/appscode/stash/pull/528) ([tamalsaha](https://github.com/tamalsaha)) +- Format shell scripts [\#526](https://github.com/appscode/stash/pull/526) ([tamalsaha](https://github.com/tamalsaha)) +- Enable status subresource for crds [\#524](https://github.com/appscode/stash/pull/524) ([tamalsaha](https://github.com/tamalsaha)) +- Upgrade to restic 0.9.1 [\#522](https://github.com/appscode/stash/pull/522) ([tamalsaha](https://github.com/tamalsaha)) +- Move openapi-spec to api folder [\#513](https://github.com/appscode/stash/pull/513) ([tamalsaha](https://github.com/tamalsaha)) +- Deploy operator in kube-system namespace via Helm [\#511](https://github.com/appscode/stash/pull/511) ([tamalsaha](https://github.com/tamalsaha)) +- Add togglable tabs for Installation: Script & Helm [\#509](https://github.com/appscode/stash/pull/509) ([sajibcse68](https://github.com/sajibcse68)) +- Revendor dependencies [\#508](https://github.com/appscode/stash/pull/508) ([tamalsaha](https://github.com/tamalsaha)) +- Added front matter [\#507](https://github.com/appscode/stash/pull/507) ([hossainemruz](https://github.com/hossainemruz)) +- Improve installer [\#504](https://github.com/appscode/stash/pull/504) ([tamalsaha](https://github.com/tamalsaha)) +- Use apps/v1 apigroup [\#555](https://github.com/appscode/stash/pull/555) ([tamalsaha](https://github.com/tamalsaha)) +- Update chart installation instruction for Kubernetes 1.11 [\#527](https://github.com/appscode/stash/pull/527) ([tamalsaha](https://github.com/tamalsaha)) +- Remove status from crd.yaml [\#523](https://github.com/appscode/stash/pull/523) ([tamalsaha](https://github.com/tamalsaha)) +- Upgrade to prom/pushgateway:v0.5.2 [\#519](https://github.com/appscode/stash/pull/519) ([tamalsaha](https://github.com/tamalsaha)) +- Remove ops-address port [\#518](https://github.com/appscode/stash/pull/518) ([tamalsaha](https://github.com/tamalsaha)) +- Set cpu limits to 100m [\#517](https://github.com/appscode/stash/pull/517) ([tamalsaha](https://github.com/tamalsaha)) +- Support node selector for recovery job [\#516](https://github.com/appscode/stash/pull/516) ([tamalsaha](https://github.com/tamalsaha)) +- Fix concourse test [\#496](https://github.com/appscode/stash/pull/496) ([hossainemruz](https://github.com/hossainemruz)) diff --git a/content/docs/v2024.12.18/CHANGELOG-0.9.md b/content/docs/v2024.12.18/CHANGELOG-0.9.md new file mode 100644 index 0000000000..a960e45076 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-0.9.md @@ -0,0 +1,446 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-0.9 + name: Changelog-0.9 + parent: welcome + weight: 90 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-0.9/ +aliases: +- /docs/v2024.12.18/CHANGELOG-0.9/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Change Log + +## [v0.9.0-rc.2](https://github.com/stashed/stash/tree/v0.9.0-rc.2) + +[Full Changelog](https://github.com/stashed/stash/compare/v0.9.0-rc.1...v0.9.0-rc.2) + +Stash `v0.9.0-rc.2` comes with some bug fixes and improvements since `v0.9.0-rc.1` release. Please, try it and give us your valuable feedback. To install, please follow the guide [here](https://stash.run/docs/v0.9.0-rc.2/setup/install/). + +## Significant Changes + +- **Retention Policy for VolumeSnapshot:** We have implemented retention policy for VolumeSnapshot. Now, your old VolumeSnapshots will be automatically garbage collected according to retention policy. Ref: [stashed/stash#926](https://github.com/stashed/stash/pull/926). + +- **Fix Argument Passing:** We have fixed argument passing to database backup/restore commands. Ref: [stashed/mongodb#5](https://github.com/stashed/mongodb/pull/5), [stashed/postgres#17](https://github.com/stashed/postgres/pull/17), [stashed/elasticsearch#8](https://github.com/stashed/elasticsearch/pull/8), [stashed/mysql#9](https://github.com/stashed/mysql/pull/9). + +- **BackupSession API Revision:** Now a `BackupSession` can be triggered via `spec.invoker` instead of `spec.backupConfiguration` field. This breaking api change is done in preparation for upcoming `BackupBatch` crd support. Ref: [stashed/stash#890](https://github.com/stashed/stash/pull/890), [stashed/stash#931](https://github.com/stashed/stash/pull/931), [stashed/docs#44](https://github.com/stashed/docs/pull/44). + +## Issue Fixed + +- Implement retention policy for VolumeSnapshot [#808](https://github.com/stashed/stash/issues/808) +- Support elasticsearch backups [#894](https://github.com/stashed/stash/issues/) +- Chart "stash-postgres" not found in appscode index [#898](https://github.com/stashed/stash/issues/894) +- Support mysql backups [#892](https://github.com/stashed/stash/issues/892) +- Support mongodb backups [#893](https://github.com/stashed/stash/issues/893) +- RestoreSession stuck running [#895](https://github.com/stashed/stash/issues/895) +- Stash restore job fails [#914](https://github.com/stashed/stash/issues/914) + +## Pull Request Merged + +**[stashed/stash](https://github.com/stashed/stash):** + +- Add release checklist issue template [#934](https://github.com/stashed/stash/pull/934) +- Volume e2e test github action [#933](https://github.com/stashed/stash/pull/933) +- Fix BackupSession additional print column [#932](https://github.com/stashed/stash/pull/932) +- Remove spec.backupConfiguration from BackupSession [#931](https://github.com/stashed/stash/pull/931) +- Update e2e tests to run on GitHub actions [#917](https://github.com/stashed/stash/pull/917) +- Enable make ci [#928](https://github.com/stashed/stash/pull/928) +- Don't restart workload on backup pause+Use ImagePullPolicy: "Always" for Function-Task model [#929](https://github.com/stashed/stash/pull/929) +- Add status.observedGeneration [#927](https://github.com/stashed/stash/pull/927) +- Implement RetentionPolicy for VolumeSnapshot [#926](https://github.com/stashed/stash/pull/926) +- Verify generated files are up to date [#925](https://github.com/stashed/stash/pull/925) +- Update and rename go.yml to ci.yml [#922](https://github.com/stashed/stash/pull/922) +- Add probe and BackupBatch api [#890](https://github.com/stashed/stash/pull/890) +- Use core package from k8s.io/api repo [#921](https://github.com/stashed/stash/pull/921) + +**[stashed/docs](https://github.com/stashed/docs):** + +- Use `spec.invoker` instead of `spec.backupConfiguration` in BackupSession [stashed/docs#44](https://github.com/stashed/docs/pull/44) + +**[stashed/installer](https://github.com/stashed/installer):** + +- Prepare for release v0.9.0-rc.2 [stashed/installer#16](https://github.com/stashed/installer/pull/16) +- Remove --enable-status-subresource flag [stashed/installer#15](https://github.com/stashed/installer/pull/15) +- Add delete permission to VS ClusterRole [stashed/installer#13](https://github.com/stashed/installer/pull/13) +- Ignore error while delete resources from uninstaller script [stashed/installer#14](https://github.com/stashed/installer/pull/14) + +**[stashed/catalog](https://github.com/stashed/catalog):** + +- Fix catalog installer (when helm is not installed) [stashed/catalog#10](https://github.com/stashed/catalog/pull/10) + +**[stashed/postgres](https://github.com/stashed/postgres):** + +- Fix BackupSession's Print Columns [stashed/postgres#20](https://github.com/stashed/postgres/pull/20) +- Enable make ci [stashed/postgres#19](https://github.com/stashed/postgres/pull/19) +- Remove `--enable-status-subresource` flag [stashed/postgres#18](https://github.com/stashed/postgres/pull/18) +- Fix arguments passing [stashed/postgres#17](https://github.com/stashed/postgres/pull/17) + +**[stashed/mongodb](https://github.com/stashed/mongodb):** + +- Fix BackupSession's Print Columns [stashed/mongodb#9](https://github.com/stashed/mongodb/pull/9) +- Enable make ci [stashed/mongodb#8](https://github.com/stashed/mongodb/pull/8) +- Remove `--enable-status-subresource` flag [stashed/mongodb#7](https://github.com/stashed/mongodb/pull/7) +- Update totalHosts from backup/restore process [stashed/mongodb#6](https://github.com/stashed/mongodb/pull/6) +- Fix argument passing [stashed/mongodb#5](https://github.com/stashed/mongodb/pull/5) + +**[stashed/mysql](https://github.com/stashed/mysql):** + +- Fix BackupSession's Print Columns [stashed/mysql#12](https://github.com/stashed/mysql/pull/12) +- Enable make ci [stashed/mysql#11](https://github.com/stashed/mysql/pull/11) +- Remove `--enable-status-subresource` flag [stashed/mysql#10](https://github.com/stashed/mysql/pull/10) +- Fix argument passing [stashed/mysql#9](https://github.com/stashed/mysql/pull/9) + +**[stashed/elasticsearch](https://github.com/stashed/elasticsearch):** + +- Fix BackupSession's Print Columns [stashed/elasticsearch#11](https://github.com/stashed/elasticsearch/pull/11) +- Enable make ci [stashed/elasticsearch#10](https://github.com/stashed/elasticsearch/pull/10) +- Remove --enable-status-subresource flag [stashed/elasticsearch#9](https://github.com/stashed/elasticsearch/pull/9) +- Fix argument passing [stashed/elasticsearch#8](https://github.com/stashed/elasticsearch/pull/8) + +## [v0.9.0-rc.1](https://github.com/stashed/stash/tree/v0.9.0-rc.1) + +[Full Changelog](https://github.com/stashed/stash/compare/v0.9.0-rc.0...v0.9.0-rc.1) + +Stash `v0.9.0-rc.1` comes with documentation and respective charts for addons to backup databases. It also comes with some bug fixes since `v0.9.0-rc.0` release. We have also introduced a `kubectl` plugin for Stash in this release. Please, try it and give us your valuable feedback. To install, please follow the guide [here](https://stash.run/docs/v0.9.0-rc.1/setup/install/). + +## Significant Changes + +- **Addon Support:** Stash addons enable users to extend it's functionality to backup/restore any type of custom workloads. This release includes respective documentations and charts for `PostgreSQL`, `MySQL`, `MongoDB`, and `Elasticsearch` databases. This enables Stash to backup various [KubeDB](https://kubedb.com/) supported databases. You can also write your own addon to backup your custom target. We will include a guide on how to build addon for Stash in a future release. + +- **Stash `kubectl` Plugin (Alpha):** We have introduced an experimental Stash `kubectl` plugin. This will help you to unlock repository, trigger instant backup and copy various Stash resources between namespace and more. + +- **Introduce BackupHistoryLimit:** Now, you can configure how many `BackupSession` and associate resources (Job, PVC etc) to keep for each backup target. By default, Stash will keep only the history of last backup for debugging purpose. You can configure it using `spec.backupHistoryLimit` field of `BackupConfiguration`. + +- **Introduce InterimVolumeTemplate:** We have introduced a new field called `InterimVolumeTemplate` that can be used to pass a PVC template for storing temporary backup/restore data before uploading to backup or injecting into target. For more details, please visit [here](https://stash.run/docs/v0.9.0-rc.1/concepts/crds/backupconfiguration/). + +- **Allow `subPath` in Auto-Backup Annotation:** Now, you can provide `subPath` in auto-backup annotation. For more details, please check [here](https://stash.run/docs/v0.9.0-rc.1/guides/latest/auto-backup/workload/). + +- **Use Kubebuilder to Generate CRDs:** We have moved to [kubernetes-sigs/kubebuilder](https://github.com/kubernetes-sigs/kubebuilder) for generating CRDs for Stash. + +## Issues Fixed + +- subPath stash autobackup annotation [#868](https://github.com/stashed/stash/issues/868) +- GKE Alpha cluster need to run as "fsGroup: 65535" [#873](https://github.com/stashed/stash/issues/873) +- Can't evaluate field version in AppBinding [#876](https://github.com/stashed/stash/issues/876) +- Neither --kubeconfig nor --master was specified [#878](https://github.com/stashed/stash/issues/878) +- Prometheus metrics missing source of the backup [#869](https://github.com/stashed/stash/issues/869) +- Waiting until stash apiservice is available on GKE with private nodes [#875](https://github.com/stashed/stash/issues/875) +- nice` and `ionice` is missing in distroless image [#882](https://github.com/stashed/stash/issues/882) +- BackupBlueprint not creating Repository or BackupConfiguration [#877](https://github.com/stashed/stash/issues/877) +- mysql stash backup error: unexpected end of JSON input [#880](https://github.com/stashed/stash/issues/880) +- How do I override the folder name stash recovers from [#861](https://github.com/stashed/stash/issues/861) +- Cannot pull image stashed/stash-mysql:8.0.14 [#879](https://github.com/stashed/stash/issues/879) +- Nil pointer check is missing in metric handling [#881](https://github.com/stashed/stash/issues/881) +- [0.9.0-rc.0] Cannot list snapshots [#901](https://github.com/stashed/stash/issues/901) +- Support interim data volume in BackupConfiguration [#906](https://github.com/stashed/stash/issues/906) +- Stash not backing up all files [#899](https://github.com/stashed/stash/issues/899) +- [feature] clean up objects [#867](https://github.com/stashed/stash/issues/867) +- Stash addon doc organization [#856](https://github.com/stashed/stash/issues/856) +- Generate swagger.json for v1beta1 [#896](https://github.com/stashed/stash/issues/896) +- Stash restore job fails [#914](https://github.com/stashed/stash/issues/914) +- RestoreSession stuck running [#895](https://github.com/stashed/stash/issues/895) +- Support mongodb backups [#893](https://github.com/stashed/stash/issues/893) +- Support mysql backups [#892](https://github.com/stashed/stash/issues/892) + +## Pull Request Merged + +- Bring back dependency to github.com/golang/protobuf@v1.2.0 [#918](https://github.com/stashed/stash/pull/918) +- Run e2e tests using GitHub actions [#909](https://github.com/stashed/stash/pull/909) +- Generate swagger.json for v1beta1 [#916](https://github.com/stashed/stash/pull/916) +- Add release pipeline [#915](https://github.com/stashed/stash/pull/915) +- Fix Restore PVC using Task Function method [#897](https://github.com/stashed/stash/pull/897) +- Fix VolumeSnapshot Issues [#912](https://github.com/stashed/stash/pull/912) +- Add Kubebuilder annotations [#911](https://github.com/stashed/stash/pull/911) +- Use kubebuilder to generate crd yamls [#843](https://github.com/stashed/stash/pull/843) +- Introduce InterimVolumeTemplate and BackupHistoryLimit field. [#907](https://github.com/stashed/stash/pull/907) +- Make RetentionPolicy required in v1beta1 api [#905](https://github.com/stashed/stash/pull/905) +- Enable GitHub actions [#903](https://github.com/stashed/stash/pull/903) +- Fix snapshot listing for local backend [#902](https://github.com/stashed/stash/pull/902) +- Improve Error Handling + Code refactor [#891](https://github.com/stashed/stash/pull/891) +- Add `NICE` and `IONICE` into distroless image [#883](https://github.com/stashed/stash/pull/883) +- Improve metrics handling + make update status uniform [#872](https://github.com/stashed/stash/pull/872) +- Use default fsGroup: 65535 [#874](https://github.com/stashed/stash/pull/874) +- Add DumpEnv func to Restic Config file [#870](https://github.com/stashed/stash/pull/870) +- Allow to specify subPath in auto-backup annotation + use default mounts and target paths for PVC [#871](https://github.com/stashed/stash/pull/871) + +## [v0.9.0-rc.0](https://github.com/stashed/stash/tree/v0.9.0-rc.0) + +[Full Changelog](https://github.com/stashed/stash/compare/0.8.3...v0.9.0-rc.0) + +We are very excited to announce Stash `v0.9.0-rc.0`. This release introduces `v1beta1` API and a design overhaul. The new API and design enable Stash to support the use cases that were not possible before. This makes Stash more powerful, transparent, extensible and customizable. We are expecting that this new API will graduate to GA after some maturity. Check out the new architecture from [here](https://github.com/stashed/docs/blob/v0.9.0-rc.0/docs/concepts/what-is-stash/architecture.md). + +### What's New + +This release introduces lots of new features and changes. A summary of these new features is given below: + +#### New Custom Resources + +The following custom resources have been introduced in this release: + +- [BackupConfiguration](https://github.com/stashed/docs/blob/v0.9.0-rc.0/docs/concepts/crds/backupconfiguration.md). +- [BackupSession](https://github.com/stashed/docs/blob/v0.9.0-rc.0/docs/concepts/crds/backupsession.md). +- [RestoreSession](https://github.com/stashed/docs/blob/v0.9.0-rc.0/docs/concepts/crds/restoresession.md). +- [Function](https://github.com/stashed/docs/blob/v0.9.0-rc.0/docs/concepts/crds/function.md). +- [Task](https://github.com/stashed/docs/blob/v0.9.0-rc.0/docs/concepts/crds/task.md). +- [BackupBlueprint](https://github.com/stashed/docs/blob/v0.9.0-rc.0/docs/concepts/crds/backupblueprint.md). +- [AppBinding](https://github.com/stashed/docs/blob/v0.9.0-rc.0/docs/concepts/crds/appbinding.md). + +#### New Features + +In addition to improving existing features, this release introduces the following new features: + +- **Backup & Restore Stand-alone PVC :** + Stash now supports taking backup of a stand-alone PVC. To learn more about how Stash takes backup of a stand-alone PVC, please visit [here](https://github.com/stashed/docs/blob/v0.9.0-rc.0/docs/guides/latest/volumes/overview.md). + +- **Backup & Restore Databases :** + Stash now can backup PostgreSQL, MongoDB, Elasticsearch and MySQL databases in both stand-alone and clustered mode. To learn more about how Stash takes backup of a database, please visit [here](https://github.com/stashed/docs/blob/v0.9.0-rc.0/docs/guides/latest/databases/overview.md). + +- **VolumeSnapshot :** + Now, you can take a scheduled snapshot of the volumes of a workload using Kubernetes [VolumeSnapshot](https://kubernetes.io/docs/concepts/storage/volume-snapshots/) API. Check out how volume snapshotting works in Stash from [here](https://github.com/stashed/docs/blob/v0.9.0-rc.0/docs/guides/latest/volumesnapshot/overview.md). + +- **Instant Backup :** + You can now trigger a backup instantly. To learn how, please visit [here](https://github.com/stashed/docs/blob/v0.9.0-rc.0/docs/guides/latest/volumesnapshot/overview.md). + +- **Auto Backup :** + Now, Stash will let you configure a common template to backup similar types of target. You will require to add just a few annotations to the targeted workload to enable backup for it. Want to know how? Please visit [here](https://github.com/stashed/docs/blob/v0.9.0-rc.0/docs/guides/latest/auto-backup/overview.md). + +- **Support PSP Enabled Cluster :** + Stash now supports PSP enabled cluster. + +- **Improved Prometheus Metrics :** + We have improved Prometheus metrics in this release. Check out the new metrics from [here](https://github.com/stashed/docs/blob/v0.9.0-rc.0/docs/guides/latest/monitoring/overview.md). + +- **Support REST Server as Backend :** + Stash now supports REST server as backend. To learn how to configure REST backend, please visit [here](https://github.com/stashed/docs/blob/v0.9.0-rc.0/docs/guides/latest/backends/rest.md). + +- **KubeDB Integration :** + Stash now seemingly integrates with [KubeDB](https://kubedb.com/). It is now recommended tool to backup & restore KubeDB supported databases. + +For a complete feature list of this release, please visit [here](https://github.com/stashed/docs/blob/v0.9.0-rc.0/docs/concepts/what-is-stash/overview.md). + +### Significant Changes + +- Stash now has been moved from [appscode](https://github.com/appscode) Github organization to its own organization. New home for Stash is [stashed](https://github.com/stashed) organization. +- We have split the original `appscode/stash` repository into multiple repositories ([stashed/stash](https://github.com/stashed/stash), [stashed/installer](https://github.com/stashed/installer), [stashed/docs](https://github.com/stashed/docs)). This enables us to push emergency fixes to installer and docs without requiring to cut a new release. +- Now Stash uses a more industry-standard `Makefile` based build process. This makes building Stash from source code simple and easy ([\#800](https://github.com/stashed/stash/pull/800)). +- We have added ARM architecture support in this release. Thanks to @carlosedp ([\#802](https://github.com/stashed/stash/pull/802)). +- We now use [Docker manifest](https://docs.docker.com/engine/reference/commandline/manifest/) to build Stash docker images. Hence, Stash docker images are now platform aware. You don't have to worry about your platform architecture. Docker will take care of it ([\#802](https://github.com/stashed/stash/pull/802)). +- We have updated [restic](https://restic.net/) version from `0.8.3` to `0.9.5` ([\#789](https://github.com/stashed/stash/pull/789)). +- We have upgraded Kubernetes client to `v1.14.0` ([\#775](https://github.com/stashed/stash/pull/775)). +- Now Stash uses `failurePolicy: Ignore` in webhooks for Kubernetes official resources. So, Stash will no longer cause any problem for creating new Kubernetes resources when it is not ready ([\#726](https://github.com/stashed/stash/pull/726)). +- As RBAC is now default in most of the Kubenetes cluster and creating RBAC resources in an RBAC disabled cluster does not cause any problem, we have removed `--rbac` flag. Now, Stash will always start in RBAC enabled mode ([\#761](https://github.com/stashed/stash/pull/761)). +- We have moved to [go mod](https://github.com/golang/go/wiki/Modules) from [glide](https://github.com/Masterminds/glide) for dependency management ([\#775](https://github.com/stashed/stash/pull/775)). +- We have changed Stash package path to `stash.appscode.dev/stash` ([\#776](https://github.com/stashed/stash/pull/776)). + +### Upgrading from 0.8.3 + +If you are upgrading Stash from `0.8.3` to this version, pay attention to the following things: + +**What will work:** +- Exiting scheduled backup will continue to work. +- Scheduling new backup using Restic crd will work. +- Restoring the already backed up data using Recovery crd will work. + +**What will not work:** +- Restoring the data that was backed up using old API (`Restic`) with the new API (`RestoreSession`) will not work. +- Restoring the data that was backed up using new API (`BackupConfiguration`) with the old API (`Recovery`) will not work. +- Using new API (`BackupConfiguration` ) to backup into already existing Repository will not work. Stash will upload all targeted data again into the backend. Old snapshots will not be usable any more. +- Old Grafana dashboard will not work with new metrics. + +### Issues Fixed + +- Sidecar RoleBinding is not being created when Mutating Webhook is enabled [\#395](https://github.com/stashed/stash/issues/395) +- Cannot deploy stash with helm@3 [\#822](https://github.com/stashed/stash/issues/822) +- Restore PVCs from templates using Restic [\#784](https://github.com/stashed/stash/issues/784) +- Handle restored files permission properly [\#733](https://github.com/stashed/stash/issues/733) +- Use restic 0.9.5 [\#781](https://github.com/stashed/stash/issues/781) +- Support PSP or SCC (openshift) enabled clusters [\#462](https://github.com/stashed/stash/issues/462) +- Configure environment variables (or proxy settings) on restic and recovery CRDs [#621](https://github.com/stashed/stash/issues/621) +- Proposal: Move cluster backup part from Kubed to Stash [\#601](https://github.com/stashed/stash/issues/601) +- error: unable to retrieve the complete list of server APIs: admission.stash.appscode.com/v1alpha1: the server is currently unable to handle the request, repositories.stash.appscode.com/v1alpha1: the server is currently unable to handle the request [\#785](https://github.com/stashed/stash/issues/785) +- Internal error occurred: failed calling webhook "deployment.admission.stash.appscode.com": the server is currently unable to handle the request [\#692](https://github.com/stashed/stash/issues/692) +- MutatingWebhooks must be without side-effect [\#758](https://github.com/stashed/stash/issues/758) +- Targeted Workload stuck in terminating state after deleted a Restic CRD [\#672](https://github.com/stashed/stash/issues/672) +- OSM config and file permission issue [\#766](https://github.com/stashed/stash/issues/766) +- Remove `--rbac` flag [\#705](https://github.com/stashed/stash/issues/705) +- Use FailurePolicy ignore for K8s resource webhooks? [\#709](https://github.com/stashed/stash/issues/709) +- FR: Add possibility to change settings of Restic [\#545](https://github.com/stashed/stash/issues/545) +- Allow setting `nice` and `ionice` for backup command [\#366](https://github.com/stashed/stash/issues/366) +- Cleanup old cache after backup [\#703](https://github.com/stashed/stash/issues/703) +- Support Restic Rest server as backend. [\#126](https://github.com/stashed/stash/issues/126) + +### Pull Request Summary + +- Remove the `bs` short name for BackupSession [\#859](https://github.com/stashed/stash/pull/859) ([tamalsaha](https://github.com/tamalsaha)) +- Use github.com/golang/protobuf@v1.2.0 [\#855](https://github.com/stashed/stash/pull/855) ([tamalsaha](https://github.com/tamalsaha)) +- Fix resolving Task when volumeClaimTemplate is specified in RestoreSession [\#852](https://github.com/stashed/stash/pull/852) ([hossainemruz](https://github.com/hossainemruz)) +- Use POD_ORDINAL env var to restore using PVC template [\#849](https://github.com/stashed/stash/pull/849) ([suaas21](https://github.com/suaas21)) +- Pass replicas from RestoreSession to Function [\#848](https://github.com/stashed/stash/pull/848) ([hossainemruz](https://github.com/hossainemruz)) +- Rename BackupConfigurationTemplate to BackupBlueprint [\#847](https://github.com/stashed/stash/pull/847) ([hossainemruz](https://github.com/hossainemruz)) +- Use variable for version in BackupConfigurationTemplate name [\#846](https://github.com/stashed/stash/pull/846) ([hossainemruz](https://github.com/hossainemruz)) +- New variable from type field of AppBinding + Fix RoleBinding name conflict with KubeDB [\#845](https://github.com/stashed/stash/pull/845) ([hossainemruz](https://github.com/hossainemruz)) +- Fix Platforms Issue [\#844](https://github.com/stashed/stash/pull/844) ([suaas21](https://github.com/suaas21)) +- Add support to restore using volumeClaimTemplate in Function-Task model [\#841](https://github.com/stashed/stash/pull/841) ([hossainemruz](https://github.com/hossainemruz)) +- Add GetSnapshotSize() function [\#839](https://github.com/stashed/stash/pull/839) ([hossainemruz](https://github.com/hossainemruz)) +- Fix travis build [\#837](https://github.com/stashed/stash/pull/837) ([tamalsaha](https://github.com/tamalsaha)) +- Update azure-sdk-for-go dependencies [\#836](https://github.com/stashed/stash/pull/836) ([tamalsaha](https://github.com/tamalsaha)) +- Fix RestoreSession replicas logic [\#835](https://github.com/stashed/stash/pull/835) ([suaas21](https://github.com/suaas21)) +- Use robfig/cron@v3 [\#834](https://github.com/stashed/stash/pull/834) ([tamalsaha](https://github.com/tamalsaha)) +- Add support for parallel backup & restore [\#833](https://github.com/stashed/stash/pull/833) ([hossainemruz](https://github.com/hossainemruz)) +- Fix restore Job parallel execution [\#832](https://github.com/stashed/stash/pull/832) ([suaas21](https://github.com/suaas21)) +- Remove unused code [\#829](https://github.com/stashed/stash/pull/829) ([tamalsaha](https://github.com/tamalsaha)) +- Generate docs files inside docs repo [\#828](https://github.com/stashed/stash/pull/828) ([tamalsaha](https://github.com/tamalsaha)) +- Add License notice to makefile [\#825](https://github.com/stashed/stash/pull/825) ([tamalsaha]https://github.com/tamalsaha()) +- Create default Functions and Tasks from operator [\#824](https://github.com/stashed/stash/pull/824) ([hossainemruz](https://github.com/hossainemruz)) +- Fix default securityContext passing to restore init-container/job [\#823](https://github.com/stashed/stash/pull/823) ([hossainemruz](https://github.com/hossainemruz)) +- Fix restore job RBAC [\#821](https://github.com/stashed/stash/pull/821) ([hossainemruz](https://github.com/hossainemruz)) +- Fixed volumeSnapshot Error Issue [\#819](https://github.com/stashed/stash/pull/819) ([suaas21](https://github.com/suaas21)) +- Always attempt to pull a newer image for `make container` [\#818](https://github.com/stashed/stash/pull/818) ([tamalsaha](https://github.com/tamalsaha)) +- Make --image-tag a required flag. [\#817](https://github.com/stashed/stash/pull/817 ) ([tamalsaha](https://github.com/tamalsaha)) +- Add PusgatewayURL input for Functions [\#816](https://github.com/stashed/stash/pull/816) ([hossainemruz](https://github.com/hossainemruz)) +- Add TARGET_RESOURCE variable for BackupConfigurationTemplate [\#814](https://github.com/stashed/stash/pull/814) ([hossainemruz](https://github.com/hossainemruz)) +- Add make install, uninstall, purge commands [\#813](https://github.com/stashed/stash/pull/813) ([tamalsaha](https://github.com/tamalsaha)) +- Move chart & deploy scripts to github.com/stashed/installer [\#811](https://github.com/stashed/stash/pull/811) ([tamalsaha](https://github.com/tamalsaha)) +- Move docs to github.com/stashed/docs repo [\#810](https://github.com/stashed/stash/pull/810) ([tamalsaha](https://github.com/tamalsaha)) +- Restore PVCs from templates using Restic [\#809](https://github.com/stashed/stash/pull/809) ([hossainemruz](https://github.com/hossainemruz)) +- Move HandleResticError to util package [\#806](https://github.com/stashed/stash/pull/806) ([tamalsaha](https://github.com/tamalsaha)) +- Remove canary support [\#805](https://github.com/stashed/stash/pull/805) ([tamalsaha]https://github.com/tamalsaha()) +- Fix travis build [\#804](https://github.com/stashed/stash/pull/804) ([tamalsaha](https://github.com/tamalsaha)) +- Update Version.go [\#803](https://github.com/stashed/stash/pull/803) ([tamalsaha](https://github.com/tamalsaha)) +- Added ARM64 support to the install script and manifest [\#802](https://github.com/stashed/stash/pull/802) ([tamalsaha](https://github.com/tamalsaha)) +- Pass labels to offshoot + add generic offshoot labels [\#801](https://github.com/stashed/stash/pull/801) ([hossainemruz](https://github.com/hossainemruz)) +- Add Makefile [\#800](https://github.com/stashed/stash/pull/800) ([tamalsaha](https://github.com/tamalsaha)) +- Skip BackupSession creation if target does not exist + use timestamp … [\#797](https://github.com/stashed/stash/pull/797) ([hossainemruz](https://github.com/hossainemruz)) +- Use absolute path as aliases for reference docs. [\#796](https://github.com/stashed/stash/pull/796) ([tamalsaha](https://github.com/tamalsaha)) +- Remove importance of order of rule in RestoreSession [\#795](https://github.com/stashed/stash/pull/795) ([hossainemruz](https://github.com/hossainemruz)) +- Use restic 0.9.5 [\#789](https://github.com/stashed/stash/pull/789) ([hossainemruz](https://github.com/hossainemruz)) +- VolumeSnapshot [\#787](https://github.com/stashed/stash/pull/787) ([suaas21](https://github.com/suaas21)) +- Fix: User and group creation of stash for mongodb and mysql [\#786](https://github.com/stashed/stash/pull/786) ([the-redback](https://github.com/the-redback)) +- Update backup manager [\#782](https://github.com/stashed/stash/pull/782) ([tamalsaha]https://github.com/tamalsaha()) +- Configure Env variables for Functions [\#780](https://github.com/stashed/stash/pull/780) ([tamalsaha](https://github.com/tamalsaha)) +- Fix rest backend for workloads + add more authentication method for swift backend [\#778](https://github.com/stashed/stash/pull/778) ([hossainemruz](https://github.com/hossainemruz)) +- Update package path to stash.appscode.dev/stash [\#776](https://github.com/stashed/stash/pull/776) ([tamalsaha](https://github.com/tamalsaha)) +- Update to k8s 1.14.0 client libraries using go.mod [\#775](https://github.com/stashed/stash/pull/775) ([tamalsaha](https://github.com/tamalsaha)) +- MutatingWebhooks must be without side-effect [\#773](https://github.com/stashed/stash/pull/773) ([suaas21](https://github.com/suaas21)) +- Introduce VolumeSnapshot APIs [\#772](https://github.com/stashed/stash/pull/772) ([hossainemruz](https://github.com/hossainemruz)) +- Use osm pkg from kmodules/objectstore-api [\#770](https://github.com/stashed/stash/pull/770) ([tamalsaha](https://github.com/tamalsaha)) +- Remove --rbac flag [\#761](https://github.com/stashed/stash/pull/761) ([suaas21](https://github.com/suaas21)) +Skip creating/processing backup-session when backup-config is paused [\#759](https://github.com/stashed/stash/pull/759) ([diptadas](https://github.com/diptadas)) +- Add "Supported Backends" doc to new guides [\#756](https://github.com/stashed/stash/pull/756) ([hossainemruz](https://github.com/hossainemruz)) +- Add guides template for new design [\#755](https://github.com/stashed/stash/pull/755) ([hossainemruz](https://github.com/hossainemruz)) +- Run restic commands using docker [\#754](https://github.com/stashed/stash/pull/754) ([diptadas](https://github.com/diptadas)) +- Stash v1beta1 E2E test for PVC [\#753](https://github.com/stashed/stash/pull/753) ([suaas21](https://github.com/suaas21)) +- Update Kubernetes client libraries to 1.13.5 [\#752](https://github.com/stashed/stash/pull/752) [https://github.com/stashed/stash/pull/752] ([tamalsaha](https://github.com/tamalsaha)) +- Enable pipefail and update restore yamls [\#750](https://github.com/stashed/stash/pull/750) ([diptadas](https://github.com/diptadas)) +- Implement snapshots for v1beta1 api [\#749](https://github.com/stashed/stash/pull/749) ([diptadas](https://github.com/diptadas)) +- Stash v1beta1 E2E test for ReplicaSet [\#747](https://github.com/stashed/stash/pull/747) ([suaas21](https://github.com/suaas21)) +- Apply nice/ionice settings from env [\#746](https://github.com/stashed/stash/pull/746) ([diptadas](https://github.com/diptadas)) +- Fixed scratch-dir, output-dir and hostname in functions/tasks yamls [\#744](https://github.com/stashed/stash/pull/744) ([diptadas](https://github.com/diptadas)) +- Stash v1beta1 E2E test for ReplicationController [#742](https://github.com/stashed/stash/pull/742) ([suaas21](https://github.com/suaas21)) +- Stash v1beta1 E2E test for DaemonSet [\#741](https://github.com/stashed/stash/pull/741) ([suaas21](https://github.com/suaas21)) +- Update concept doc [\#739](https://github.com/stashed/stash/pull/739) ([hossainemruz](https://github.com/hossainemruz)) +- Stash V1beta1 E2E test for StatefulSet [\#737](https://github.com/stashed/stash/pull/737) ([suaas21](https://github.com/suaas21)) +- Attach volume for local backend [\#736](https://github.com/stashed/stash/pull/736) ([diptadas](https://github.com/diptadas)) +- Add Stash CLI [\#734](https://github.com/stashed/stash/pull/734) ([diptadas](https://github.com/diptadas)) +- Fix openapi path prefixes for validators and mutators [\#732](https://github.com/stashed/stash/pull/732) ([tamalsaha](https://github.com/tamalsaha)) +- Add max-connections for GCS, Azure, B2 backend [\#730](https://github.com/stashed/stash/pull/730) ([diptadas](https://github.com/diptadas)) +- Support PSP enabled cluster [\#729](https://github.com/stashed/stash/pull/729) ([hossainemruz](https://github.com/hossainemruz)) +- Use FailurePolicy ignore for K8s resource webhooks [\#726](https://github.com/stashed/stash/pull/726) ([diptadas](https://github.com/diptadas)) +- Rename admission webhooks to avoid name collision [\#725](https://github.com/stashed/stash/pull/725) ([diptadas](https://github.com/diptadas)) +- Don't write secret data inside temp dir [\#724](https://github.com/stashed/stash/pull/724) ([diptadas](https://github.com/diptadas)) +- Add support for backup cluster resources YAML [\#721](https://github.com/stashed/stash/pull/721) ([hossainemruz](https://github.com/hossainemruz)) +- Add TempDir and PSP settings for Function [\#720](https://github.com/stashed/stash/pull/720) ([tamalsaha](https://github.com/tamalsaha)) +- Apply EmptyDir settings to TmpDir [\#719](https://github.com/stashed/stash/pull/719) ([diptadas](https://github.com/diptadas)) +- Use cleanup-cache flag [\#717](https://github.com/stashed/stash/pull/717) ([diptadas](https://github.com/diptadas)) +- Use ionice and nice with Restic CMD [\#716](https://github.com/stashed/stash/pull/716) ([diptadas](https://github.com/diptadas)) +- Add support for OpenShift DeploymentConfig [\#714](https://github.com/stashed/stash/pull/714) ([hossainemruz](https://github.com/hossainemruz)) +- Add support for rest backend [\#713](https://github.com/stashed/stash/pull/713) ([diptadas](https://github.com/diptadas)) +- Stash V1beta1 E2E test for Deployment [\#710](https://github.com/stashed/stash/pull/710) ([suaas21](https://github.com/suaas21)) +- Backup and restore Elasticsearch [\#702](https://github.com/stashed/stash/pull/702) ([diptadas](https://github.com/diptadas)) +- Add BackupSession Controller for Sidecar [\#701](https://github.com/stashed/stash/pull/701) ([suaas21](https://github.com/suaas21)) +- Backup and restore Mongo DB [\#699](https://github.com/stashed/stash/pull/699) ([diptadas](https://github.com/diptadas)) +- Backup and restore MySQL DB [\#696](https://github.com/stashed/stash/pull/696) ([diptadas](https://github.com/diptadas)) +- Backup and restore Postgres DB [\#695](https://github.com/stashed/stash/pull/695) ([diptadas](https://github.com/diptadas)) +- Backup from stdin and dump to stdout [\#694](https://github.com/stashed/stash/pull/694) ([diptadas](https://github.com/diptadas)) +- Post backup/restore status update [\#691](https://github.com/stashed/stash/pull/691) ([diptadas](https://github.com/diptadas)) +- Use ContainerRuntimeSettings in Function spec [\#689](https://github.com/stashed/stash/pull/689) ([diptadas](https://github.com/diptadas)) +- Fix v1beta1 api for BackupConfigurationTemplate [\#688](https://github.com/stashed/stash/pull/688) ([hossainemruz](https://github.com/hossainemruz)) +- Update Kubernetes client libraries to 1.13.0 [\#687](https://github.com/stashed/stash/pull/687) ([tamalsaha](https://github.com/tamalsaha)) +- Backup and restore PVC [\#676](https://github.com/stashed/stash/pull/676) ([diptadas](https://github.com/diptadas)) +- Update workload controller for new design [\#675](https://github.com/stashed/stash/pull/675) ([hossainemruz](https://github.com/hossainemruz)) +- Resolve tasks for backup/restore sessions [\#674](https://github.com/stashed/stash/pull/674) ([diptadas](https://github.com/diptadas)) +- Add restic wrapper library [\#673](https://github.com/stashed/stash/pull/673) ([hossainemruz](https://github.com/hossainemruz)) +- Add BackupConfiguration Controller [\#671](https://github.com/stashed/stash/pull/671) ([suaas21](https://github.com/suaas21)) +- Introduce v1beta1 api [\#647](https://github.com/stashed/stash/pull/647) ([hossainemruz](https://github.com/hossainemruz)) diff --git a/content/docs/v2024.12.18/CHANGELOG-v2020.07.08-beta.0.md b/content/docs/v2024.12.18/CHANGELOG-v2020.07.08-beta.0.md new file mode 100644 index 0000000000..0192476c28 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2020.07.08-beta.0.md @@ -0,0 +1,1206 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2020.07.08-beta.0 + name: Changelog-v2020.07.08-beta.0 + parent: welcome + weight: 20200708 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2020.07.08-beta.0/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2020.07.08-beta.0/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2020.07.08-beta.0 (2020-07-08) + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.10.0-beta.0](https://github.com/stashed/apimachinery/releases/tag/v0.10.0-beta.0) + +- [843421e4](https://github.com/stashed/apimachinery/commit/843421e4) Show AppsCode in copyright file header (#26) +- [ad462cc4](https://github.com/stashed/apimachinery/commit/ad462cc4) Update to Kubernetes v1.18.3 (#25) +- [28d53699](https://github.com/stashed/apimachinery/commit/28d53699) Update update-release-tracker.sh +- [34624044](https://github.com/stashed/apimachinery/commit/34624044) Update update-release-tracker.sh +- [5f5de63c](https://github.com/stashed/apimachinery/commit/5f5de63c) Fix openapi path (#24) +- [6e0ad5f8](https://github.com/stashed/apimachinery/commit/6e0ad5f8) Add script to update release tracker on pr merge (#23) +- [cbf9b376](https://github.com/stashed/apimachinery/commit/cbf9b376) Update .kodiak.toml +- [d12b3d4b](https://github.com/stashed/apimachinery/commit/d12b3d4b) Update to Kubernetes v1.18.3 (#21) +- [1956a312](https://github.com/stashed/apimachinery/commit/1956a312) Update to Kubernetes v1.18.3 +- [c3966002](https://github.com/stashed/apimachinery/commit/c3966002) Unwrap top level api folder (#20) +- [5ba03fb5](https://github.com/stashed/apimachinery/commit/5ba03fb5) Update to Kubernetes v1.18.3 (#19) +- [abeb620e](https://github.com/stashed/apimachinery/commit/abeb620e) Update to Kubernetes v1.18.3 +- [6fdf8a60](https://github.com/stashed/apimachinery/commit/6fdf8a60) Enable https://kodiakhq.com (#13) +- [479258ed](https://github.com/stashed/apimachinery/commit/479258ed) Update dev scripts (#12) +- [a85ced99](https://github.com/stashed/apimachinery/commit/a85ced99) Merge pull request #11 from stashed/k8s-gomod-refresher-1591208266 +- [82df6f26](https://github.com/stashed/apimachinery/commit/82df6f26) Update to Kubernetes v1.18.3 +- [788f6921](https://github.com/stashed/apimachinery/commit/788f6921) Add default annotation for Snapshotter (#9) +- [d2f3f5d4](https://github.com/stashed/apimachinery/commit/d2f3f5d4) Remove defaults from crd v1beta1 YAML (#8) +- [1a09ffde](https://github.com/stashed/apimachinery/commit/1a09ffde) Update dependencies +- [58525b4b](https://github.com/stashed/apimachinery/commit/58525b4b) Update dependencies +- [c34c2ec1](https://github.com/stashed/apimachinery/commit/c34c2ec1) Generate both v1beta1 and v1 CRD YAML (#7) +- [e81205a3](https://github.com/stashed/apimachinery/commit/e81205a3) Bring back mistakenly removed SetRecoveryStats +- [5f8cf3a6](https://github.com/stashed/apimachinery/commit/5f8cf3a6) Merge pull request #6 from stashed/k-1.18.3 +- [723f4de9](https://github.com/stashed/apimachinery/commit/723f4de9) Add context to crd utils +- [59478af4](https://github.com/stashed/apimachinery/commit/59478af4) Update to Kubernetes 1.18.3 +- [e83b90a7](https://github.com/stashed/apimachinery/commit/e83b90a7) Merge pull request #3 from stashed/wait-for-target +- [a5b9a011](https://github.com/stashed/apimachinery/commit/a5b9a011) Simplify targetMatched() function +- [58948bd9](https://github.com/stashed/apimachinery/commit/58948bd9) Refactor +- [5568cb90](https://github.com/stashed/apimachinery/commit/5568cb90) Add RestoreSession conditions +- [906c5910](https://github.com/stashed/apimachinery/commit/906c5910) Add TypeMeta to invoker +- [22843fdb](https://github.com/stashed/apimachinery/commit/22843fdb) Use Go 1.14.3 +- [238d1bd0](https://github.com/stashed/apimachinery/commit/238d1bd0) Add backup invoker condition transion reasons +- [275965f9](https://github.com/stashed/apimachinery/commit/275965f9) Introduce conditions for BackupConfiguration and BackupBatch +- [35159c81](https://github.com/stashed/apimachinery/commit/35159c81) Merge pull request #5 from stashed/fix-updatestatus +- [f1d78326](https://github.com/stashed/apimachinery/commit/f1d78326) Fix helper methods +- [dbb02873](https://github.com/stashed/apimachinery/commit/dbb02873) Fix UpdateStatus() function +- [a7bd75ad](https://github.com/stashed/apimachinery/commit/a7bd75ad) Update crazy-max/ghaction-docker-buildx flag +- [1d65a7d4](https://github.com/stashed/apimachinery/commit/1d65a7d4) Use recommended kubernetes app labels (#4) +- [5b322e9f](https://github.com/stashed/apimachinery/commit/5b322e9f) Add Enum markers to api types +- [e6017151](https://github.com/stashed/apimachinery/commit/e6017151) Trigger the workflow on push or pull request +- [54097441](https://github.com/stashed/apimachinery/commit/54097441) Use kubectl v1.17 (#1) + + + +## [stashed/catalog](https://github.com/stashed/catalog) + +### [v2020.07.08-beta.0](https://github.com/stashed/catalog/releases/tag/v2020.07.08-beta.0) + + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.10.0-beta.0](https://github.com/stashed/cli/releases/tag/v0.10.0-beta.0) + +- [3728110](https://github.com/stashed/cli/commit/3728110) Prepare for release v0.10.0-beta.0 (#26) +- [e7111a5](https://github.com/stashed/cli/commit/e7111a5) Update License +- [7fe1e07](https://github.com/stashed/cli/commit/7fe1e07) Update to Kubernetes v1.18.3 (#25) +- [66b3b46](https://github.com/stashed/cli/commit/66b3b46) Shorten command name for cli (#24) +- [b913cfc](https://github.com/stashed/cli/commit/b913cfc) Add workflow to update docs (#23) +- [1881c64](https://github.com/stashed/cli/commit/1881c64) Update update-release-tracker.sh +- [0548bdc](https://github.com/stashed/cli/commit/0548bdc) Update update-release-tracker.sh +- [b1b28ff](https://github.com/stashed/cli/commit/b1b28ff) Use GITHUB_BASE_REF to detect target branch +- [1e16b99](https://github.com/stashed/cli/commit/1e16b99) Add script to update release tracker on pr merge (#21) +- [f91bf33](https://github.com/stashed/cli/commit/f91bf33) Make release non-draft +- [d29bdb6](https://github.com/stashed/cli/commit/d29bdb6) Update .kodiak.toml +- [b727108](https://github.com/stashed/cli/commit/b727108) Update to Kubernetes v1.18.3 (#20) +- [f3f03aa](https://github.com/stashed/cli/commit/f3f03aa) Update to Kubernetes v1.18.3 +- [bcd7c5e](https://github.com/stashed/cli/commit/bcd7c5e) Create .kodiak.toml +- [9882aa2](https://github.com/stashed/cli/commit/9882aa2) Add blank line after license header (#19) +- [7774218](https://github.com/stashed/cli/commit/7774218) Update dev scripts (#18) +- [38eb35c](https://github.com/stashed/cli/commit/38eb35c) Run unit tests against SRC_PKGS +- [526949c](https://github.com/stashed/cli/commit/526949c) Update to Kubernetes v1.18.3 (#17) +- [fc3e6c5](https://github.com/stashed/cli/commit/fc3e6c5) Update crazy-max/ghaction-docker-buildx flag +- [3943575](https://github.com/stashed/cli/commit/3943575) Trigger the workflow on push or pull request + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-beta.20200708](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-beta.20200708) + +- [7115da1](https://github.com/stashed/elasticsearch/commit/7115da1) Prepare for release 5.6.4-beta.20200708 (#87) +- [f5ab33d](https://github.com/stashed/elasticsearch/commit/f5ab33d) [cherry-pick] Publish to testing dir for alpha/beta releases (#78) (#79) +- [7d73d30](https://github.com/stashed/elasticsearch/commit/7d73d30) [cherry-pick] Update License (#69) (#70) +- [04e8a63](https://github.com/stashed/elasticsearch/commit/04e8a63) Add commands to update chart version (#68) +- [3a5cd78](https://github.com/stashed/elasticsearch/commit/3a5cd78) [cherry-pick] Update update-release-tracker.sh (#60) +- [77bb76e](https://github.com/stashed/elasticsearch/commit/77bb76e) [cherry-pick] Update update-release-tracker.sh (#52) +- [3b47ba6](https://github.com/stashed/elasticsearch/commit/3b47ba6) [cherry-pick] Update release.yml (#43) (#44) +- [444cb3b](https://github.com/stashed/elasticsearch/commit/444cb3b) [cherry-pick] Add script to update release tracker on pr merge (#34) (#35) +- [d349617](https://github.com/stashed/elasticsearch/commit/d349617) [cherry-pick] Add workflow to cherry pick commits to master (#25) (#26) +- [4038abd](https://github.com/stashed/elasticsearch/commit/4038abd) Fix chart release process (#24) +- [895a73f](https://github.com/stashed/elasticsearch/commit/895a73f) Update .kodiak.toml +- [6b9451c](https://github.com/stashed/elasticsearch/commit/6b9451c) Allow overwriting secret key via SecretTransformation (#23) +- [0fcb64e](https://github.com/stashed/elasticsearch/commit/0fcb64e) Make waitTimeout Configurable through flag (#22) +- [b3859b9](https://github.com/stashed/elasticsearch/commit/b3859b9) Create .kodiak.toml +- [c0f3b97](https://github.com/stashed/elasticsearch/commit/c0f3b97) Update to Kubernetes v1.18.3 (#21) +- [210dd08](https://github.com/stashed/elasticsearch/commit/210dd08) Update crazy-max/ghaction-docker-buildx flag +- [5c74a42](https://github.com/stashed/elasticsearch/commit/5c74a42) Trigger the workflow on push or pull request +- [76424d0](https://github.com/stashed/elasticsearch/commit/76424d0) Auto generate chart readme file +- [fc144c2](https://github.com/stashed/elasticsearch/commit/fc144c2) Correctly mark optional fields +- [3559c2c](https://github.com/stashed/elasticsearch/commit/3559c2c) Add openapi v3 schema for values file (#18) +- [46b8654](https://github.com/stashed/elasticsearch/commit/46b8654) Update CI configuration +- [5c15319](https://github.com/stashed/elasticsearch/commit/5c15319) Add support for providing s3 region (#17) +- [c1b75a9](https://github.com/stashed/elasticsearch/commit/c1b75a9) Make output.json file writable to all users + Fix Flag types (#16) +- [f6d9709](https://github.com/stashed/elasticsearch/commit/f6d9709) Update hugo frontmatter for stash website +- [5ef236a](https://github.com/stashed/elasticsearch/commit/5ef236a) Enable race detector in e2e tests +- [1980a77](https://github.com/stashed/elasticsearch/commit/1980a77) Test installers (#14) +- [63a8396](https://github.com/stashed/elasticsearch/commit/63a8396) Fix broken link and add AppBinding scheme field (#15) +- [82d3e7c](https://github.com/stashed/elasticsearch/commit/82d3e7c) Add license header to files (#13) +- [c0241d4](https://github.com/stashed/elasticsearch/commit/c0241d4) Enable make ci (#12) +- [52f71de](https://github.com/stashed/elasticsearch/commit/52f71de) Fix BackupSession's Print Columns (#11) +- [91964a5](https://github.com/stashed/elasticsearch/commit/91964a5) Enable make ci (#10) +- [a804cb0](https://github.com/stashed/elasticsearch/commit/a804cb0) Remove --enable-status-subresource flag (#9) +- [57c4898](https://github.com/stashed/elasticsearch/commit/57c4898) Fix argument passing (#8) +- [15b1b3c](https://github.com/stashed/elasticsearch/commit/15b1b3c) Add release pipeline (#7) +- [b02e1ad](https://github.com/stashed/elasticsearch/commit/b02e1ad) Prepare for 5.6.4 release +- [7161616](https://github.com/stashed/elasticsearch/commit/7161616) Prepare for 5.6 release +- [7baf065](https://github.com/stashed/elasticsearch/commit/7baf065) Update go.yml +- [c8b18b0](https://github.com/stashed/elasticsearch/commit/c8b18b0) Fix typo (#6) +- [32445a6](https://github.com/stashed/elasticsearch/commit/32445a6) Use InterimVolumeTemplate + Finalize doc template (#5) +- [16d35ec](https://github.com/stashed/elasticsearch/commit/16d35ec) Enable GitHub actions +- [acfb971](https://github.com/stashed/elasticsearch/commit/acfb971) Improve error handling + remove metrics handling part (#4) +- [7e94690](https://github.com/stashed/elasticsearch/commit/7e94690) Use docker buildx to build docker image +- [6e388ff](https://github.com/stashed/elasticsearch/commit/6e388ff) Use github.com/Azure/go-autorest/autorest@v0.7.0 +- [6a82a60](https://github.com/stashed/elasticsearch/commit/6a82a60) Fix version suffix (#3) +- [2136ee6](https://github.com/stashed/elasticsearch/commit/2136ee6) Various fixes (#2) +- [d98b25a](https://github.com/stashed/elasticsearch/commit/d98b25a) Update Chart.yaml +- [806bf8c](https://github.com/stashed/elasticsearch/commit/806bf8c) Fixed elasticdump & added docs (#1) +- [3c99f3c](https://github.com/stashed/elasticsearch/commit/3c99f3c) Reorganize repo +- [1972a9a](https://github.com/stashed/elasticsearch/commit/1972a9a) VolumeSnapshot (#787) +- [3f1f4cf](https://github.com/stashed/elasticsearch/commit/3f1f4cf) Remove importance of order of rule in RestoreSession (#795) +- [86a4af0](https://github.com/stashed/elasticsearch/commit/86a4af0) Skip BackupSession creation if target does not exist + use timestamp … (#797) +- [3abe6f6](https://github.com/stashed/elasticsearch/commit/3abe6f6) Use restic 0.9.5 (#789) +- [85b21bf](https://github.com/stashed/elasticsearch/commit/85b21bf) Update concept doc (#739) +- [ad5c8f2](https://github.com/stashed/elasticsearch/commit/ad5c8f2) Add support for backup cluster resources YAML (#721) +- [2bb8ec3](https://github.com/stashed/elasticsearch/commit/2bb8ec3) Backup and restore Elasticsearch (#702) +- [1f21268](https://github.com/stashed/elasticsearch/commit/1f21268) Update package path to stash.appscode.dev/stash (#776) +- [e8fb571](https://github.com/stashed/elasticsearch/commit/e8fb571) Update to k8s 1.14.0 client libraries using go.mod (#775) +- [eab0f8e](https://github.com/stashed/elasticsearch/commit/eab0f8e) Remove --rbac flag (#761) +- [4c3e7ea](https://github.com/stashed/elasticsearch/commit/4c3e7ea) Skip creating/processing backup-session when backup-config is paused (#759) +- [7905eff](https://github.com/stashed/elasticsearch/commit/7905eff) Stash v1beta1 E2E test for PVC (#753) +- [2c44ee8](https://github.com/stashed/elasticsearch/commit/2c44ee8) Implement snapshots for v1beta1 api (#749) +- [c88df7a](https://github.com/stashed/elasticsearch/commit/c88df7a) Run restic commands using docker (#754) +- [8e24d32](https://github.com/stashed/elasticsearch/commit/8e24d32) Fixed scratch-dir, output-dir and hostname in functions/tasks yamls (#744) +- [8d5944d](https://github.com/stashed/elasticsearch/commit/8d5944d) Add Stash CLI (#734) +- [550ab37](https://github.com/stashed/elasticsearch/commit/550ab37) Apply nice/ionice settings from env (#746) +- [42ed76b](https://github.com/stashed/elasticsearch/commit/42ed76b) Stash V1beta1 E2E test for Deployment (#710) +- [d63f9e9](https://github.com/stashed/elasticsearch/commit/d63f9e9) Fix openapi path prefixes for validators and mutators (#732) +- [c1347ed](https://github.com/stashed/elasticsearch/commit/c1347ed) Add max-connections for GCS, Azure, B2 backend (#730) +- [859c4ee](https://github.com/stashed/elasticsearch/commit/859c4ee) Rename admission webhooks to avoid name collision (#725) +- [d631bb9](https://github.com/stashed/elasticsearch/commit/d631bb9) Apply EmptyDir settings to TmpDir (#719) +- [cc70068](https://github.com/stashed/elasticsearch/commit/cc70068) Add support for rest backend (#713) +- [e4db000](https://github.com/stashed/elasticsearch/commit/e4db000) Add support for OpenShift DeploymentConfig (#714) +- [3fa7bdb](https://github.com/stashed/elasticsearch/commit/3fa7bdb) Backup and restore Mongo DB (#699) +- [4c39235](https://github.com/stashed/elasticsearch/commit/4c39235) Backup and restore MySQL DB (#696) +- [3e89d32](https://github.com/stashed/elasticsearch/commit/3e89d32) Backup and restore Postgres DB (#695) +- [03b95f3](https://github.com/stashed/elasticsearch/commit/03b95f3) Add BackupSession Controller for Sidecar (#701) +- [cacbc7d](https://github.com/stashed/elasticsearch/commit/cacbc7d) Update workload controller for new design (#675) +- [5c173e5](https://github.com/stashed/elasticsearch/commit/5c173e5) Post backup/restore status update (#691) +- [50bbb0a](https://github.com/stashed/elasticsearch/commit/50bbb0a) Backup and restore PVC (#676) +- [d4a53e2](https://github.com/stashed/elasticsearch/commit/d4a53e2) Add BackupConfiguration Controller (#671) +- [ef9a4ae](https://github.com/stashed/elasticsearch/commit/ef9a4ae) Update Kubernetes client libraries to 1.13.0 (#687) +- [c48dbfc](https://github.com/stashed/elasticsearch/commit/c48dbfc) Separate type definitions into individual files (#646) +- [77f2113](https://github.com/stashed/elasticsearch/commit/77f2113) Use flags.DumpAll to dump flags (#624) +- [cb54d8c](https://github.com/stashed/elasticsearch/commit/cb54d8c) Set periodic analytics (#623) +- [248a53a](https://github.com/stashed/elasticsearch/commit/248a53a) Add validation webhook xray (#618) +- [2029bf4](https://github.com/stashed/elasticsearch/commit/2029bf4) Use dynamic pushgateway url (#614) +- [bcf5926](https://github.com/stashed/elasticsearch/commit/bcf5926) Fix offline backup (#537) +- [5049a63](https://github.com/stashed/elasticsearch/commit/5049a63) Fix extended apiserver issues with Kubernetes 1.11 (#536) +- [9d31255](https://github.com/stashed/elasticsearch/commit/9d31255) Update client-go to v8.0.0 (#528) +- [d872b4c](https://github.com/stashed/elasticsearch/commit/d872b4c) Enable status subresource for crds (#524) +- [4795dba](https://github.com/stashed/elasticsearch/commit/4795dba) Remove ops-address port (#518) +- [e95b151](https://github.com/stashed/elasticsearch/commit/e95b151) Add support for initial backoff to the apiserver call on recover (#476) +- [120e5de](https://github.com/stashed/elasticsearch/commit/120e5de) Disable admission controllers for webhook server (#468) +- [2f19545](https://github.com/stashed/elasticsearch/commit/2f19545) Update client-go to 7.0.0 (#463) +- [e613ff5](https://github.com/stashed/elasticsearch/commit/e613ff5) Fixes RBAC issue in test (#449) +- [56a3a74](https://github.com/stashed/elasticsearch/commit/56a3a74) Some cleanup (#446) +- [02565bb](https://github.com/stashed/elasticsearch/commit/02565bb) Delete restic repository from backend if Repository CRD is deleted (#438) +- [ea98067](https://github.com/stashed/elasticsearch/commit/ea98067) Fix go_vet error (#440) +- [9d626eb](https://github.com/stashed/elasticsearch/commit/9d626eb) Increase qps and burst limits (#435) +- [5c6713f](https://github.com/stashed/elasticsearch/commit/5c6713f) Show repository snapshot list (#417) +- [6d8ef78](https://github.com/stashed/elasticsearch/commit/6d8ef78) Expose swagger.json (#420) +- [8e04ca0](https://github.com/stashed/elasticsearch/commit/8e04ca0) Create repository crd for each Restic repository (#394) +- [4c9a478](https://github.com/stashed/elasticsearch/commit/4c9a478) Rename --analytics to --enable-analytics (#384) +- [7ea2220](https://github.com/stashed/elasticsearch/commit/7ea2220) Replace initializers with mutation webhook for workloads (#363) +- [2770e6b](https://github.com/stashed/elasticsearch/commit/2770e6b) Use admission hook helpers from kutil (#360) +- [d3754d7](https://github.com/stashed/elasticsearch/commit/d3754d7) Implement offline backup for multiple replica (#335) +- [13a2d14](https://github.com/stashed/elasticsearch/commit/13a2d14) Use official code generator scripts (#336) +- [90642ce](https://github.com/stashed/elasticsearch/commit/90642ce) Fix e2e tests after webhook merger (#333) +- [2fc3239](https://github.com/stashed/elasticsearch/commit/2fc3239) Leave secure port unset +- [7cb52b2](https://github.com/stashed/elasticsearch/commit/7cb52b2) Merge admission webhook and operator into one binary (#329) +- [3306427](https://github.com/stashed/elasticsearch/commit/3306427) Implement informer factory for backup scheduler (#325) +- [7bb027b](https://github.com/stashed/elasticsearch/commit/7bb027b) Cleanup apiserver +- [fb8c1e4](https://github.com/stashed/elasticsearch/commit/fb8c1e4) Copy generic-admission-server into pkg (#318) +- [5a5093f](https://github.com/stashed/elasticsearch/commit/5a5093f) Use shared infromer factory (#317) +- [0ccb948](https://github.com/stashed/elasticsearch/commit/0ccb948) Use GetBaseVersion method from kutil (#316) +- [8c5e6ff](https://github.com/stashed/elasticsearch/commit/8c5e6ff) Fix webhook command description (#314) +- [775a2b6](https://github.com/stashed/elasticsearch/commit/775a2b6) Merge webhook plugins into one. (#311) +- [a8659fe](https://github.com/stashed/elasticsearch/commit/a8659fe) Add ValidatingAdmissionWebhook for Stash CRDs (#299) +- [c3e177c](https://github.com/stashed/elasticsearch/commit/c3e177c) Added support for private docker registry (#300) +- [62ec42e](https://github.com/stashed/elasticsearch/commit/62ec42e) Update dependencies to Kubernetes 1.9 (#297) +- [cf3ea7c](https://github.com/stashed/elasticsearch/commit/cf3ea7c) Update appscode/go log wrapper (#287) +- [470cc31](https://github.com/stashed/elasticsearch/commit/470cc31) Pass --pushgateway-url for injected containers. (#284) +- [e2e79c6](https://github.com/stashed/elasticsearch/commit/e2e79c6) Fix kubectl version parsing generation in GKE (#267) +- [326aea4](https://github.com/stashed/elasticsearch/commit/326aea4) Detect analytics client id using env vars (#265) +- [4a5912c](https://github.com/stashed/elasticsearch/commit/4a5912c) Prepare docs for 0.6.0 release (#264) +- [f75d5df](https://github.com/stashed/elasticsearch/commit/f75d5df) Remove restic-dependency from recovery (#258) +- [86f01f3](https://github.com/stashed/elasticsearch/commit/86f01f3) Log operator version on start (#253) +- [4e29b70](https://github.com/stashed/elasticsearch/commit/4e29b70) Simplify clientID generation for analytics (#247) +- [a45937f](https://github.com/stashed/elasticsearch/commit/a45937f) Set analytics clientID (#246) +- [ea53cea](https://github.com/stashed/elasticsearch/commit/ea53cea) Enable Restic cahce-dir flag (#241) +- [dc0030d](https://github.com/stashed/elasticsearch/commit/dc0030d) Implement offline backup (#229) +- [ae40f35](https://github.com/stashed/elasticsearch/commit/ae40f35) Revendor kutil (#230) +- [d68a34d](https://github.com/stashed/elasticsearch/commit/d68a34d) Record recovery status for individual FileGroup (#222) +- [15a24b7](https://github.com/stashed/elasticsearch/commit/15a24b7) Leader election for deployment, replica set and rc (#206) +- [4a75689](https://github.com/stashed/elasticsearch/commit/4a75689) Implement Recovery for Restic Backup (#202) +- [78b3942](https://github.com/stashed/elasticsearch/commit/78b3942) Use typed versioned client for CRD +- [b857b05](https://github.com/stashed/elasticsearch/commit/b857b05) Change `k8s.io/api/core/v1` pkg alias to core (#204) +- [e52f848](https://github.com/stashed/elasticsearch/commit/e52f848) Use client-go 5.x +- [4f376ad](https://github.com/stashed/elasticsearch/commit/4f376ad) Set hostname based on resource type (#198) +- [e530116](https://github.com/stashed/elasticsearch/commit/e530116) Manage RoleBinding for rbac enabled cluster (#197) +- [e28c13f](https://github.com/stashed/elasticsearch/commit/e28c13f) Use workqueue for scheduler (#194) +- [2719cbd](https://github.com/stashed/elasticsearch/commit/2719cbd) Fix e2e tests (#183) +- [9c1cc43](https://github.com/stashed/elasticsearch/commit/9c1cc43) Use workqueue (#182) +- [b3ee076](https://github.com/stashed/elasticsearch/commit/b3ee076) Only watch apps/v1beta1 Deployment (#178) +- [4f92ca6](https://github.com/stashed/elasticsearch/commit/4f92ca6) Use Namespace() method from kutil. +- [78f1e7f](https://github.com/stashed/elasticsearch/commit/78f1e7f) Update kutil (#170) +- [29a8a1f](https://github.com/stashed/elasticsearch/commit/29a8a1f) Use apis/v1alpha1 instead of internal version (#167) +- [da3eb2e](https://github.com/stashed/elasticsearch/commit/da3eb2e) Use kubernetes/code-generator (#163) +- [3b1d6bf](https://github.com/stashed/elasticsearch/commit/3b1d6bf) Expose resync-period as flag +- [35d8dc6](https://github.com/stashed/elasticsearch/commit/35d8dc6) Move analytics collector to root command (#164) +- [6a55694](https://github.com/stashed/elasticsearch/commit/6a55694) Migrate TPR to CRD (#160) +- [91f678f](https://github.com/stashed/elasticsearch/commit/91f678f) Rename RepositorySecretName to StorageSecretName (#135) +- [d666c81](https://github.com/stashed/elasticsearch/commit/d666c81) Change mount path for labels to /etc/stash +- [1177d60](https://github.com/stashed/elasticsearch/commit/1177d60) Part 6 - Update docs (#121) +- [a15689d](https://github.com/stashed/elasticsearch/commit/a15689d) Various bug fixes (#118) +- [d8a5771](https://github.com/stashed/elasticsearch/commit/d8a5771) Set TMPDIR env var for restic (#115) +- [60ed8f7](https://github.com/stashed/elasticsearch/commit/60ed8f7) Update user guide (#94) + + +### [6.2.4-beta.20200708](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-beta.20200708) + + + +### [6.3.0-beta.20200708](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-beta.20200708) + + + +### [6.4.0-beta.20200708](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-beta.20200708) + + + +### [6.5.3-beta.20200708](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-beta.20200708) + + + +### [6.8.0-beta.20200708](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-beta.20200708) + + + +### [7.2.0-beta.20200708](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-beta.20200708) + + + +### [7.3.2-beta.20200708](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-beta.20200708) + + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v0.10.0-beta.0](https://github.com/stashed/installer/releases/tag/v0.10.0-beta.0) + +- [cd44ba9](https://github.com/stashed/installer/commit/cd44ba9) Prepare for release v0.10.0-beta.0 (#75) +- [a04e173](https://github.com/stashed/installer/commit/a04e173) Publish to testing dir for alpha/beta releases +- [4b23e1c](https://github.com/stashed/installer/commit/4b23e1c) Update License (#74) +- [9b7a4e0](https://github.com/stashed/installer/commit/9b7a4e0) Update to Kubernetes v1.18.3 (#72) +- [4318306](https://github.com/stashed/installer/commit/4318306) Update ci.yml +- [15d1594](https://github.com/stashed/installer/commit/15d1594) Fix Stash Enterprise installer (#70) +- [31c9dcc](https://github.com/stashed/installer/commit/31c9dcc) Tag chart and app version as string for yq (#69) +- [1782049](https://github.com/stashed/installer/commit/1782049) Update links (#68) +- [634da4d](https://github.com/stashed/installer/commit/634da4d) Update update-release-tracker.sh +- [1155610](https://github.com/stashed/installer/commit/1155610) Update update-release-tracker.sh +- [1b10b5e](https://github.com/stashed/installer/commit/1b10b5e) Add script to update release tracker on pr merge (#67) +- [ce0b28e](https://github.com/stashed/installer/commit/ce0b28e) Update release workflow +- [c3ac668](https://github.com/stashed/installer/commit/c3ac668) Update ci.yml +- [98bad7e](https://github.com/stashed/installer/commit/98bad7e) Add Stash Enterprise chart (#63) +- [73f52a6](https://github.com/stashed/installer/commit/73f52a6) Add commands to update chart (#65) +- [0dc7f91](https://github.com/stashed/installer/commit/0dc7f91) Fix chart release process (#64) +- [0d5c4e1](https://github.com/stashed/installer/commit/0d5c4e1) Update .kodiak.toml +- [3b53e64](https://github.com/stashed/installer/commit/3b53e64) Update to Kubernetes v1.18.3 (#58) +- [43c5dbe](https://github.com/stashed/installer/commit/43c5dbe) Update to Kubernetes v1.18.3 +- [b9e784c](https://github.com/stashed/installer/commit/b9e784c) Create .kodiak.toml +- [b30b3b0](https://github.com/stashed/installer/commit/b30b3b0) Merge pull request #57 from stashed/psp +- [1b89401](https://github.com/stashed/installer/commit/1b89401) Disable apparmor and seccomp by default +- [6bed1aa](https://github.com/stashed/installer/commit/6bed1aa) Pass psp names for the jobs through flag +- [bd35d81](https://github.com/stashed/installer/commit/bd35d81) Always use baseline psp for stash +- [4e3474a](https://github.com/stashed/installer/commit/4e3474a) Add RBAC permission for generic-garbage-collector (#56) +- [be006f6](https://github.com/stashed/installer/commit/be006f6) Permit configmap list/watch -ing for delegated authentication checking (#55) +- [5685c15](https://github.com/stashed/installer/commit/5685c15) Update dependencies +- [8b7b805](https://github.com/stashed/installer/commit/8b7b805) Update dependencies +- [d2b2b09](https://github.com/stashed/installer/commit/d2b2b09) Generate both v1beta1 and v1 CRD YAML (#54) +- [7fbcb29](https://github.com/stashed/installer/commit/7fbcb29) Update to Kubernetes v1.18.3 (#53) +- [88e5e8c](https://github.com/stashed/installer/commit/88e5e8c) Use Go 1.14.3 +- [8e56cb1](https://github.com/stashed/installer/commit/8e56cb1) Trigger build on push to only master branch +- [562caf8](https://github.com/stashed/installer/commit/562caf8) Use recommended kubernetes app labels (#52) +- [cc55e5a](https://github.com/stashed/installer/commit/cc55e5a) Trigger the workflow on push or pull request +- [fd8acf5](https://github.com/stashed/installer/commit/fd8acf5) Update chart readme +- [672f37e](https://github.com/stashed/installer/commit/672f37e) Show examples in chart readme +- [39f4ca1](https://github.com/stashed/installer/commit/39f4ca1) Auto generate chart readme file (#50) +- [47f4250](https://github.com/stashed/installer/commit/47f4250) Update release.yml +- [b68d9cb](https://github.com/stashed/installer/commit/b68d9cb) Cleanup newlines +- [20d51b0](https://github.com/stashed/installer/commit/20d51b0) Reformat stash chart template (#49) +- [65f8bee](https://github.com/stashed/installer/commit/65f8bee) Use kubectl v1.16 as cleaner (#48) +- [85a7cfd](https://github.com/stashed/installer/commit/85a7cfd) Rename prometheus.io/coreos-operator to prometheus.io/operator (#47) +- [b042def](https://github.com/stashed/installer/commit/b042def) Move apireg annotation to operator pod (#46) +- [a543953](https://github.com/stashed/installer/commit/a543953) Various cleanup (#44) +- [b6e2bec](https://github.com/stashed/installer/commit/b6e2bec) Fix helm install --wait flag (#42) +- [806aada](https://github.com/stashed/installer/commit/806aada) Do not harcode namespace (#40) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.1-beta.20200708](https://github.com/stashed/mongodb/releases/tag/3.4.1-beta.20200708) + +- [47b1d72](https://github.com/stashed/mongodb/commit/47b1d72) Prepare for release 3.4.1-beta.20200708 (#90) +- [67b293a](https://github.com/stashed/mongodb/commit/67b293a) [cherry-pick] Publish to testing dir for alpha/beta releases (#78) (#79) +- [d8c9489](https://github.com/stashed/mongodb/commit/d8c9489) [cherry-pick] Update License (#66) (#67) +- [13f91cd](https://github.com/stashed/mongodb/commit/13f91cd) Add commands to update chart version (#65) +- [5ec5c3c](https://github.com/stashed/mongodb/commit/5ec5c3c) [cherry-pick] Update update-release-tracker.sh (#54) +- [409301c](https://github.com/stashed/mongodb/commit/409301c) Add script to update release tracker on pr merge (#41) +- [deed415](https://github.com/stashed/mongodb/commit/deed415) [cherry-pick] Update release.yml (#42) (#43) +- [7efcffb](https://github.com/stashed/mongodb/commit/7efcffb) [cherry-pick] Add workflow to cherry pick commits to master (#29) (#30) +- [2ed8277](https://github.com/stashed/mongodb/commit/2ed8277) Fix chart release process (#28) +- [b7b3bc6](https://github.com/stashed/mongodb/commit/b7b3bc6) Update .kodiak.toml +- [33abf73](https://github.com/stashed/mongodb/commit/33abf73) Allow overwriting secret key via SecretTransformation (#27) +- [ad30b7d](https://github.com/stashed/mongodb/commit/ad30b7d) Make waitTimeout configurable through flag (#26) +- [80f62d1](https://github.com/stashed/mongodb/commit/80f62d1) Create .kodiak.toml +- [d8e7b86](https://github.com/stashed/mongodb/commit/d8e7b86) Fix typos +- [f5dfaea](https://github.com/stashed/mongodb/commit/f5dfaea) Update to Kubernetes v1.18.3 (#25) +- [4a462cb](https://github.com/stashed/mongodb/commit/4a462cb) Update crazy-max/ghaction-docker-buildx flag +- [961fad3](https://github.com/stashed/mongodb/commit/961fad3) Fix typos +- [14024ab](https://github.com/stashed/mongodb/commit/14024ab) Trigger the workflow on push or pull request +- [c80a723](https://github.com/stashed/mongodb/commit/c80a723) Auto generate chart readme file +- [223dbfd](https://github.com/stashed/mongodb/commit/223dbfd) Correctly mark optional fields +- [8b3b75d](https://github.com/stashed/mongodb/commit/8b3b75d) Add openapi v3 schema for values file (#21) +- [6229815](https://github.com/stashed/mongodb/commit/6229815) Update CI configuration +- [3f2f090](https://github.com/stashed/mongodb/commit/3f2f090) Add support for specifying S3 region (#20) +- [55f007d](https://github.com/stashed/mongodb/commit/55f007d) Make output.json file writable to all users + Fix Flag types (#19) +- [93643f3](https://github.com/stashed/mongodb/commit/93643f3) Fix with arguments to mongorestore (#14) +- [0d9595c](https://github.com/stashed/mongodb/commit/0d9595c) Update hugo frontmatter for stash website +- [cb27f47](https://github.com/stashed/mongodb/commit/cb27f47) Added --nsExclude=config.changelog to standalone +- [a941eb0](https://github.com/stashed/mongodb/commit/a941eb0) Enable race detector in e2e tests +- [2ed387f](https://github.com/stashed/mongodb/commit/2ed387f) Fix broken link and add AppBinding scheme field (#13) +- [8dd0ea1](https://github.com/stashed/mongodb/commit/8dd0ea1) Test installers (#12) +- [5199d20](https://github.com/stashed/mongodb/commit/5199d20) Add license header to files (#11) +- [f89adec](https://github.com/stashed/mongodb/commit/f89adec) Split imports into 3 parts (#10) +- [1c447f4](https://github.com/stashed/mongodb/commit/1c447f4) Fix BackupSession's Print Columns (#9) +- [201a06e](https://github.com/stashed/mongodb/commit/201a06e) Enable make ci (#8) +- [613feea](https://github.com/stashed/mongodb/commit/613feea) Remove --enable-status-subresource flag (#7) +- [95c3974](https://github.com/stashed/mongodb/commit/95c3974) Update totalHosts from backup/restore process (#6) +- [3097a67](https://github.com/stashed/mongodb/commit/3097a67) Fix argument passing (#5) +- [ccdf81f](https://github.com/stashed/mongodb/commit/ccdf81f) Remove support for arm and arm64 architecture +- [f0b8e87](https://github.com/stashed/mongodb/commit/f0b8e87) Prepare for 3.4.17 release +- [16ad538](https://github.com/stashed/mongodb/commit/16ad538) Prepare for 3.4 release +- [c4eb920](https://github.com/stashed/mongodb/commit/c4eb920) Add release pipeline (#4) +- [02b9a9f](https://github.com/stashed/mongodb/commit/02b9a9f) Update go.yml +- [7ede5fd](https://github.com/stashed/mongodb/commit/7ede5fd) Finalize doc template (#3) +- [bb3b7fd](https://github.com/stashed/mongodb/commit/bb3b7fd) Enable GitHub actions +- [6874298](https://github.com/stashed/mongodb/commit/6874298) Improve error handling + remove metrics handling part (#2) +- [000f2c6](https://github.com/stashed/mongodb/commit/000f2c6) Use docker buildx to build docker image +- [867a620](https://github.com/stashed/mongodb/commit/867a620) Use github.com/Azure/go-autorest/autorest@v0.7.0 +- [ecb6143](https://github.com/stashed/mongodb/commit/ecb6143) run `go fmt` +- [618886d](https://github.com/stashed/mongodb/commit/618886d) Improve Mongodump for sharded and replicaset cluster && Chart and documentation (#1) +- [4a7d5c8](https://github.com/stashed/mongodb/commit/4a7d5c8) Reorganize repo +- [1972a9a](https://github.com/stashed/mongodb/commit/1972a9a) VolumeSnapshot (#787) +- [3f1f4cf](https://github.com/stashed/mongodb/commit/3f1f4cf) Remove importance of order of rule in RestoreSession (#795) +- [86a4af0](https://github.com/stashed/mongodb/commit/86a4af0) Skip BackupSession creation if target does not exist + use timestamp … (#797) +- [3abe6f6](https://github.com/stashed/mongodb/commit/3abe6f6) Use restic 0.9.5 (#789) +- [85b21bf](https://github.com/stashed/mongodb/commit/85b21bf) Update concept doc (#739) +- [ad5c8f2](https://github.com/stashed/mongodb/commit/ad5c8f2) Add support for backup cluster resources YAML (#721) +- [2bb8ec3](https://github.com/stashed/mongodb/commit/2bb8ec3) Backup and restore Elasticsearch (#702) +- [1f21268](https://github.com/stashed/mongodb/commit/1f21268) Update package path to stash.appscode.dev/stash (#776) +- [e8fb571](https://github.com/stashed/mongodb/commit/e8fb571) Update to k8s 1.14.0 client libraries using go.mod (#775) +- [eab0f8e](https://github.com/stashed/mongodb/commit/eab0f8e) Remove --rbac flag (#761) +- [4c3e7ea](https://github.com/stashed/mongodb/commit/4c3e7ea) Skip creating/processing backup-session when backup-config is paused (#759) +- [7905eff](https://github.com/stashed/mongodb/commit/7905eff) Stash v1beta1 E2E test for PVC (#753) +- [2c44ee8](https://github.com/stashed/mongodb/commit/2c44ee8) Implement snapshots for v1beta1 api (#749) +- [c88df7a](https://github.com/stashed/mongodb/commit/c88df7a) Run restic commands using docker (#754) +- [8e24d32](https://github.com/stashed/mongodb/commit/8e24d32) Fixed scratch-dir, output-dir and hostname in functions/tasks yamls (#744) +- [8d5944d](https://github.com/stashed/mongodb/commit/8d5944d) Add Stash CLI (#734) +- [550ab37](https://github.com/stashed/mongodb/commit/550ab37) Apply nice/ionice settings from env (#746) +- [42ed76b](https://github.com/stashed/mongodb/commit/42ed76b) Stash V1beta1 E2E test for Deployment (#710) +- [d63f9e9](https://github.com/stashed/mongodb/commit/d63f9e9) Fix openapi path prefixes for validators and mutators (#732) +- [c1347ed](https://github.com/stashed/mongodb/commit/c1347ed) Add max-connections for GCS, Azure, B2 backend (#730) +- [859c4ee](https://github.com/stashed/mongodb/commit/859c4ee) Rename admission webhooks to avoid name collision (#725) +- [d631bb9](https://github.com/stashed/mongodb/commit/d631bb9) Apply EmptyDir settings to TmpDir (#719) +- [cc70068](https://github.com/stashed/mongodb/commit/cc70068) Add support for rest backend (#713) +- [e4db000](https://github.com/stashed/mongodb/commit/e4db000) Add support for OpenShift DeploymentConfig (#714) +- [3fa7bdb](https://github.com/stashed/mongodb/commit/3fa7bdb) Backup and restore Mongo DB (#699) +- [4c39235](https://github.com/stashed/mongodb/commit/4c39235) Backup and restore MySQL DB (#696) +- [3e89d32](https://github.com/stashed/mongodb/commit/3e89d32) Backup and restore Postgres DB (#695) +- [03b95f3](https://github.com/stashed/mongodb/commit/03b95f3) Add BackupSession Controller for Sidecar (#701) +- [cacbc7d](https://github.com/stashed/mongodb/commit/cacbc7d) Update workload controller for new design (#675) +- [5c173e5](https://github.com/stashed/mongodb/commit/5c173e5) Post backup/restore status update (#691) +- [50bbb0a](https://github.com/stashed/mongodb/commit/50bbb0a) Backup and restore PVC (#676) +- [d4a53e2](https://github.com/stashed/mongodb/commit/d4a53e2) Add BackupConfiguration Controller (#671) +- [ef9a4ae](https://github.com/stashed/mongodb/commit/ef9a4ae) Update Kubernetes client libraries to 1.13.0 (#687) +- [c48dbfc](https://github.com/stashed/mongodb/commit/c48dbfc) Separate type definitions into individual files (#646) +- [77f2113](https://github.com/stashed/mongodb/commit/77f2113) Use flags.DumpAll to dump flags (#624) +- [cb54d8c](https://github.com/stashed/mongodb/commit/cb54d8c) Set periodic analytics (#623) +- [248a53a](https://github.com/stashed/mongodb/commit/248a53a) Add validation webhook xray (#618) +- [2029bf4](https://github.com/stashed/mongodb/commit/2029bf4) Use dynamic pushgateway url (#614) +- [bcf5926](https://github.com/stashed/mongodb/commit/bcf5926) Fix offline backup (#537) +- [5049a63](https://github.com/stashed/mongodb/commit/5049a63) Fix extended apiserver issues with Kubernetes 1.11 (#536) +- [9d31255](https://github.com/stashed/mongodb/commit/9d31255) Update client-go to v8.0.0 (#528) +- [d872b4c](https://github.com/stashed/mongodb/commit/d872b4c) Enable status subresource for crds (#524) +- [4795dba](https://github.com/stashed/mongodb/commit/4795dba) Remove ops-address port (#518) +- [e95b151](https://github.com/stashed/mongodb/commit/e95b151) Add support for initial backoff to the apiserver call on recover (#476) +- [120e5de](https://github.com/stashed/mongodb/commit/120e5de) Disable admission controllers for webhook server (#468) +- [2f19545](https://github.com/stashed/mongodb/commit/2f19545) Update client-go to 7.0.0 (#463) +- [e613ff5](https://github.com/stashed/mongodb/commit/e613ff5) Fixes RBAC issue in test (#449) +- [56a3a74](https://github.com/stashed/mongodb/commit/56a3a74) Some cleanup (#446) +- [02565bb](https://github.com/stashed/mongodb/commit/02565bb) Delete restic repository from backend if Repository CRD is deleted (#438) +- [ea98067](https://github.com/stashed/mongodb/commit/ea98067) Fix go_vet error (#440) +- [9d626eb](https://github.com/stashed/mongodb/commit/9d626eb) Increase qps and burst limits (#435) +- [5c6713f](https://github.com/stashed/mongodb/commit/5c6713f) Show repository snapshot list (#417) +- [6d8ef78](https://github.com/stashed/mongodb/commit/6d8ef78) Expose swagger.json (#420) +- [8e04ca0](https://github.com/stashed/mongodb/commit/8e04ca0) Create repository crd for each Restic repository (#394) +- [4c9a478](https://github.com/stashed/mongodb/commit/4c9a478) Rename --analytics to --enable-analytics (#384) +- [7ea2220](https://github.com/stashed/mongodb/commit/7ea2220) Replace initializers with mutation webhook for workloads (#363) +- [2770e6b](https://github.com/stashed/mongodb/commit/2770e6b) Use admission hook helpers from kutil (#360) +- [d3754d7](https://github.com/stashed/mongodb/commit/d3754d7) Implement offline backup for multiple replica (#335) +- [13a2d14](https://github.com/stashed/mongodb/commit/13a2d14) Use official code generator scripts (#336) +- [90642ce](https://github.com/stashed/mongodb/commit/90642ce) Fix e2e tests after webhook merger (#333) +- [2fc3239](https://github.com/stashed/mongodb/commit/2fc3239) Leave secure port unset +- [7cb52b2](https://github.com/stashed/mongodb/commit/7cb52b2) Merge admission webhook and operator into one binary (#329) +- [3306427](https://github.com/stashed/mongodb/commit/3306427) Implement informer factory for backup scheduler (#325) +- [7bb027b](https://github.com/stashed/mongodb/commit/7bb027b) Cleanup apiserver +- [fb8c1e4](https://github.com/stashed/mongodb/commit/fb8c1e4) Copy generic-admission-server into pkg (#318) +- [5a5093f](https://github.com/stashed/mongodb/commit/5a5093f) Use shared infromer factory (#317) +- [0ccb948](https://github.com/stashed/mongodb/commit/0ccb948) Use GetBaseVersion method from kutil (#316) +- [8c5e6ff](https://github.com/stashed/mongodb/commit/8c5e6ff) Fix webhook command description (#314) +- [775a2b6](https://github.com/stashed/mongodb/commit/775a2b6) Merge webhook plugins into one. (#311) +- [a8659fe](https://github.com/stashed/mongodb/commit/a8659fe) Add ValidatingAdmissionWebhook for Stash CRDs (#299) +- [c3e177c](https://github.com/stashed/mongodb/commit/c3e177c) Added support for private docker registry (#300) +- [62ec42e](https://github.com/stashed/mongodb/commit/62ec42e) Update dependencies to Kubernetes 1.9 (#297) +- [cf3ea7c](https://github.com/stashed/mongodb/commit/cf3ea7c) Update appscode/go log wrapper (#287) +- [470cc31](https://github.com/stashed/mongodb/commit/470cc31) Pass --pushgateway-url for injected containers. (#284) +- [e2e79c6](https://github.com/stashed/mongodb/commit/e2e79c6) Fix kubectl version parsing generation in GKE (#267) +- [326aea4](https://github.com/stashed/mongodb/commit/326aea4) Detect analytics client id using env vars (#265) +- [4a5912c](https://github.com/stashed/mongodb/commit/4a5912c) Prepare docs for 0.6.0 release (#264) +- [f75d5df](https://github.com/stashed/mongodb/commit/f75d5df) Remove restic-dependency from recovery (#258) +- [86f01f3](https://github.com/stashed/mongodb/commit/86f01f3) Log operator version on start (#253) +- [4e29b70](https://github.com/stashed/mongodb/commit/4e29b70) Simplify clientID generation for analytics (#247) +- [a45937f](https://github.com/stashed/mongodb/commit/a45937f) Set analytics clientID (#246) +- [ea53cea](https://github.com/stashed/mongodb/commit/ea53cea) Enable Restic cahce-dir flag (#241) +- [dc0030d](https://github.com/stashed/mongodb/commit/dc0030d) Implement offline backup (#229) +- [ae40f35](https://github.com/stashed/mongodb/commit/ae40f35) Revendor kutil (#230) +- [d68a34d](https://github.com/stashed/mongodb/commit/d68a34d) Record recovery status for individual FileGroup (#222) +- [15a24b7](https://github.com/stashed/mongodb/commit/15a24b7) Leader election for deployment, replica set and rc (#206) +- [4a75689](https://github.com/stashed/mongodb/commit/4a75689) Implement Recovery for Restic Backup (#202) +- [78b3942](https://github.com/stashed/mongodb/commit/78b3942) Use typed versioned client for CRD +- [b857b05](https://github.com/stashed/mongodb/commit/b857b05) Change `k8s.io/api/core/v1` pkg alias to core (#204) +- [e52f848](https://github.com/stashed/mongodb/commit/e52f848) Use client-go 5.x +- [4f376ad](https://github.com/stashed/mongodb/commit/4f376ad) Set hostname based on resource type (#198) +- [e530116](https://github.com/stashed/mongodb/commit/e530116) Manage RoleBinding for rbac enabled cluster (#197) +- [e28c13f](https://github.com/stashed/mongodb/commit/e28c13f) Use workqueue for scheduler (#194) +- [2719cbd](https://github.com/stashed/mongodb/commit/2719cbd) Fix e2e tests (#183) +- [9c1cc43](https://github.com/stashed/mongodb/commit/9c1cc43) Use workqueue (#182) +- [b3ee076](https://github.com/stashed/mongodb/commit/b3ee076) Only watch apps/v1beta1 Deployment (#178) +- [4f92ca6](https://github.com/stashed/mongodb/commit/4f92ca6) Use Namespace() method from kutil. +- [78f1e7f](https://github.com/stashed/mongodb/commit/78f1e7f) Update kutil (#170) +- [29a8a1f](https://github.com/stashed/mongodb/commit/29a8a1f) Use apis/v1alpha1 instead of internal version (#167) +- [da3eb2e](https://github.com/stashed/mongodb/commit/da3eb2e) Use kubernetes/code-generator (#163) +- [3b1d6bf](https://github.com/stashed/mongodb/commit/3b1d6bf) Expose resync-period as flag +- [35d8dc6](https://github.com/stashed/mongodb/commit/35d8dc6) Move analytics collector to root command (#164) +- [6a55694](https://github.com/stashed/mongodb/commit/6a55694) Migrate TPR to CRD (#160) +- [91f678f](https://github.com/stashed/mongodb/commit/91f678f) Rename RepositorySecretName to StorageSecretName (#135) +- [d666c81](https://github.com/stashed/mongodb/commit/d666c81) Change mount path for labels to /etc/stash +- [1177d60](https://github.com/stashed/mongodb/commit/1177d60) Part 6 - Update docs (#121) +- [a15689d](https://github.com/stashed/mongodb/commit/a15689d) Various bug fixes (#118) +- [d8a5771](https://github.com/stashed/mongodb/commit/d8a5771) Set TMPDIR env var for restic (#115) +- [60ed8f7](https://github.com/stashed/mongodb/commit/60ed8f7) Update user guide (#94) + + +### [3.4.2-beta.20200708](https://github.com/stashed/mongodb/releases/tag/3.4.2-beta.20200708) + + + +### [3.6.1-beta.20200708](https://github.com/stashed/mongodb/releases/tag/3.6.1-beta.20200708) + + + +### [3.6.8-beta.20200708](https://github.com/stashed/mongodb/releases/tag/3.6.8-beta.20200708) + + + +### [4.0.1-beta.20200708](https://github.com/stashed/mongodb/releases/tag/4.0.1-beta.20200708) + + + +### [4.0.3-beta.20200708](https://github.com/stashed/mongodb/releases/tag/4.0.3-beta.20200708) + + + +### [4.0.5-beta.20200708](https://github.com/stashed/mongodb/releases/tag/4.0.5-beta.20200708) + + + +### [4.1.1-beta.20200708](https://github.com/stashed/mongodb/releases/tag/4.1.1-beta.20200708) + + + +### [4.1.4-beta.20200708](https://github.com/stashed/mongodb/releases/tag/4.1.4-beta.20200708) + + + +### [4.1.7-beta.20200708](https://github.com/stashed/mongodb/releases/tag/4.1.7-beta.20200708) + + + +### [4.2.3-beta.20200708](https://github.com/stashed/mongodb/releases/tag/4.2.3-beta.20200708) + + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-beta.20200708](https://github.com/stashed/mysql/releases/tag/5.7.25-beta.20200708) + +- [3a44b41](https://github.com/stashed/mysql/commit/3a44b41) Prepare for release 5.7.25-beta.20200708 (#55) +- [7e2984b](https://github.com/stashed/mysql/commit/7e2984b) [cherry-pick] Publish to testing dir for alpha/beta releases (#51) (#52) +- [aa1eac2](https://github.com/stashed/mysql/commit/aa1eac2) [cherry-pick] Update License (#47) (#48) +- [d4370c9](https://github.com/stashed/mysql/commit/d4370c9) Add commands to update chart version (#45) +- [38fb308](https://github.com/stashed/mysql/commit/38fb308) [cherry-pick] Update update-release-tracker.sh (#42) +- [f3bfd48](https://github.com/stashed/mysql/commit/f3bfd48) [cherry-pick] Update update-release-tracker.sh (#39) +- [56e92c4](https://github.com/stashed/mysql/commit/56e92c4) [cherry-pick] Update release.yml (#36) +- [be341e7](https://github.com/stashed/mysql/commit/be341e7) [cherry-pick] Add script to update release tracker on pr merge (#32) (#33) +- [96504a7](https://github.com/stashed/mysql/commit/96504a7) [cherry-pick] Add workflow to cherry pick commits to master (#28) (#29) +- [fcbe891](https://github.com/stashed/mysql/commit/fcbe891) Fix chart release process (#27) +- [c012edf](https://github.com/stashed/mysql/commit/c012edf) Update .kodiak.toml +- [0d22657](https://github.com/stashed/mysql/commit/0d22657) Allow overwriting secret key via SecretTransformation (#26) +- [f717a19](https://github.com/stashed/mysql/commit/f717a19) Fix unit tests (#25) +- [d4f5c4c](https://github.com/stashed/mysql/commit/d4f5c4c) Create .kodiak.toml +- [2bfa098](https://github.com/stashed/mysql/commit/2bfa098) Fix typos +- [5c1a53d](https://github.com/stashed/mysql/commit/5c1a53d) mend +- [9eb402f](https://github.com/stashed/mysql/commit/9eb402f) Update to Kubernetes v1.18.3 (#24) +- [4d4afa2](https://github.com/stashed/mysql/commit/4d4afa2) Fix waitForDBReady() logic + Make timeout configurable (#23) +- [4548802](https://github.com/stashed/mysql/commit/4548802) Update crazy-max/ghaction-docker-buildx flag +- [ce1fa72](https://github.com/stashed/mysql/commit/ce1fa72) Trigger the workflow on push or pull request +- [dad10df](https://github.com/stashed/mysql/commit/dad10df) Auto generate chart readme file +- [462eecf](https://github.com/stashed/mysql/commit/462eecf) Correctly mark optional fields +- [424ec5a](https://github.com/stashed/mysql/commit/424ec5a) Add openapi v3 schema for values file (#20) +- [4755987](https://github.com/stashed/mysql/commit/4755987) Update CI configuration +- [22e8141](https://github.com/stashed/mysql/commit/22e8141) Add support for providing s3 region (#18) +- [793e5e4](https://github.com/stashed/mysql/commit/793e5e4) Make output.json file writable to all users + Fix Flag types (#17) +- [7d65a07](https://github.com/stashed/mysql/commit/7d65a07) Update hugo frontmatter for stash website +- [9392ce0](https://github.com/stashed/mysql/commit/9392ce0) Enable race detector in e2e tests +- [111bbfe](https://github.com/stashed/mysql/commit/111bbfe) Test installers (#15) +- [6eb327f](https://github.com/stashed/mysql/commit/6eb327f) Fix broken link and add AppBinding scheme field (#16) +- [292afdc](https://github.com/stashed/mysql/commit/292afdc) Add license header to files (#14) +- [35bd620](https://github.com/stashed/mysql/commit/35bd620) Split imports into 3 parts (#13) +- [799ee9b](https://github.com/stashed/mysql/commit/799ee9b) Fix BackupSession's Print Columns (#12) +- [6d62faa](https://github.com/stashed/mysql/commit/6d62faa) Enable make ci (#11) +- [9f5d50e](https://github.com/stashed/mysql/commit/9f5d50e) Remove --enable-status-subresource flag (#10) +- [fb1cedd](https://github.com/stashed/mysql/commit/fb1cedd) Fix argument passing (#9) +- [56f9fdb](https://github.com/stashed/mysql/commit/56f9fdb) Only build x86-64 images +- [a2bcae7](https://github.com/stashed/mysql/commit/a2bcae7) Add release pipeline (#8) +- [36eb1be](https://github.com/stashed/mysql/commit/36eb1be) Prepare 5.7.25 release +- [09896d9](https://github.com/stashed/mysql/commit/09896d9) Update go.yml +- [eed5d07](https://github.com/stashed/mysql/commit/eed5d07) Fix link (#7) +- [8278413](https://github.com/stashed/mysql/commit/8278413) Finalize doc template (#6) +- [4ef23ee](https://github.com/stashed/mysql/commit/4ef23ee) Enable GitHub actions +- [5454aac](https://github.com/stashed/mysql/commit/5454aac) Improve error handling + remove metrics handling part (#5) +- [be8e2b6](https://github.com/stashed/mysql/commit/be8e2b6) Use docker buildx to build docker image +- [3d169a2](https://github.com/stashed/mysql/commit/3d169a2) Use github.com/Azure/go-autorest/autorest@v0.7.0 +- [bd920eb](https://github.com/stashed/mysql/commit/bd920eb) Backup and Restore for MySQL-8.0.14 (#3) +- [de01833](https://github.com/stashed/mysql/commit/de01833) Add License headers to make files (#2) +- [cc3ee32](https://github.com/stashed/mysql/commit/cc3ee32) Reorganize repo (#1) +- [1972a9a](https://github.com/stashed/mysql/commit/1972a9a) VolumeSnapshot (#787) +- [3f1f4cf](https://github.com/stashed/mysql/commit/3f1f4cf) Remove importance of order of rule in RestoreSession (#795) +- [86a4af0](https://github.com/stashed/mysql/commit/86a4af0) Skip BackupSession creation if target does not exist + use timestamp … (#797) +- [3abe6f6](https://github.com/stashed/mysql/commit/3abe6f6) Use restic 0.9.5 (#789) +- [85b21bf](https://github.com/stashed/mysql/commit/85b21bf) Update concept doc (#739) +- [ad5c8f2](https://github.com/stashed/mysql/commit/ad5c8f2) Add support for backup cluster resources YAML (#721) +- [2bb8ec3](https://github.com/stashed/mysql/commit/2bb8ec3) Backup and restore Elasticsearch (#702) +- [1f21268](https://github.com/stashed/mysql/commit/1f21268) Update package path to stash.appscode.dev/stash (#776) +- [e8fb571](https://github.com/stashed/mysql/commit/e8fb571) Update to k8s 1.14.0 client libraries using go.mod (#775) +- [eab0f8e](https://github.com/stashed/mysql/commit/eab0f8e) Remove --rbac flag (#761) +- [4c3e7ea](https://github.com/stashed/mysql/commit/4c3e7ea) Skip creating/processing backup-session when backup-config is paused (#759) +- [7905eff](https://github.com/stashed/mysql/commit/7905eff) Stash v1beta1 E2E test for PVC (#753) +- [2c44ee8](https://github.com/stashed/mysql/commit/2c44ee8) Implement snapshots for v1beta1 api (#749) +- [c88df7a](https://github.com/stashed/mysql/commit/c88df7a) Run restic commands using docker (#754) +- [8e24d32](https://github.com/stashed/mysql/commit/8e24d32) Fixed scratch-dir, output-dir and hostname in functions/tasks yamls (#744) +- [8d5944d](https://github.com/stashed/mysql/commit/8d5944d) Add Stash CLI (#734) +- [550ab37](https://github.com/stashed/mysql/commit/550ab37) Apply nice/ionice settings from env (#746) +- [42ed76b](https://github.com/stashed/mysql/commit/42ed76b) Stash V1beta1 E2E test for Deployment (#710) +- [d63f9e9](https://github.com/stashed/mysql/commit/d63f9e9) Fix openapi path prefixes for validators and mutators (#732) +- [c1347ed](https://github.com/stashed/mysql/commit/c1347ed) Add max-connections for GCS, Azure, B2 backend (#730) +- [859c4ee](https://github.com/stashed/mysql/commit/859c4ee) Rename admission webhooks to avoid name collision (#725) +- [d631bb9](https://github.com/stashed/mysql/commit/d631bb9) Apply EmptyDir settings to TmpDir (#719) +- [cc70068](https://github.com/stashed/mysql/commit/cc70068) Add support for rest backend (#713) +- [e4db000](https://github.com/stashed/mysql/commit/e4db000) Add support for OpenShift DeploymentConfig (#714) +- [3fa7bdb](https://github.com/stashed/mysql/commit/3fa7bdb) Backup and restore Mongo DB (#699) +- [4c39235](https://github.com/stashed/mysql/commit/4c39235) Backup and restore MySQL DB (#696) +- [3e89d32](https://github.com/stashed/mysql/commit/3e89d32) Backup and restore Postgres DB (#695) +- [03b95f3](https://github.com/stashed/mysql/commit/03b95f3) Add BackupSession Controller for Sidecar (#701) +- [cacbc7d](https://github.com/stashed/mysql/commit/cacbc7d) Update workload controller for new design (#675) +- [5c173e5](https://github.com/stashed/mysql/commit/5c173e5) Post backup/restore status update (#691) +- [50bbb0a](https://github.com/stashed/mysql/commit/50bbb0a) Backup and restore PVC (#676) +- [d4a53e2](https://github.com/stashed/mysql/commit/d4a53e2) Add BackupConfiguration Controller (#671) +- [ef9a4ae](https://github.com/stashed/mysql/commit/ef9a4ae) Update Kubernetes client libraries to 1.13.0 (#687) +- [c48dbfc](https://github.com/stashed/mysql/commit/c48dbfc) Separate type definitions into individual files (#646) +- [77f2113](https://github.com/stashed/mysql/commit/77f2113) Use flags.DumpAll to dump flags (#624) +- [cb54d8c](https://github.com/stashed/mysql/commit/cb54d8c) Set periodic analytics (#623) +- [248a53a](https://github.com/stashed/mysql/commit/248a53a) Add validation webhook xray (#618) +- [2029bf4](https://github.com/stashed/mysql/commit/2029bf4) Use dynamic pushgateway url (#614) +- [bcf5926](https://github.com/stashed/mysql/commit/bcf5926) Fix offline backup (#537) +- [5049a63](https://github.com/stashed/mysql/commit/5049a63) Fix extended apiserver issues with Kubernetes 1.11 (#536) +- [9d31255](https://github.com/stashed/mysql/commit/9d31255) Update client-go to v8.0.0 (#528) +- [d872b4c](https://github.com/stashed/mysql/commit/d872b4c) Enable status subresource for crds (#524) +- [4795dba](https://github.com/stashed/mysql/commit/4795dba) Remove ops-address port (#518) +- [e95b151](https://github.com/stashed/mysql/commit/e95b151) Add support for initial backoff to the apiserver call on recover (#476) +- [120e5de](https://github.com/stashed/mysql/commit/120e5de) Disable admission controllers for webhook server (#468) +- [2f19545](https://github.com/stashed/mysql/commit/2f19545) Update client-go to 7.0.0 (#463) +- [e613ff5](https://github.com/stashed/mysql/commit/e613ff5) Fixes RBAC issue in test (#449) +- [56a3a74](https://github.com/stashed/mysql/commit/56a3a74) Some cleanup (#446) +- [02565bb](https://github.com/stashed/mysql/commit/02565bb) Delete restic repository from backend if Repository CRD is deleted (#438) +- [ea98067](https://github.com/stashed/mysql/commit/ea98067) Fix go_vet error (#440) +- [9d626eb](https://github.com/stashed/mysql/commit/9d626eb) Increase qps and burst limits (#435) +- [5c6713f](https://github.com/stashed/mysql/commit/5c6713f) Show repository snapshot list (#417) +- [6d8ef78](https://github.com/stashed/mysql/commit/6d8ef78) Expose swagger.json (#420) +- [8e04ca0](https://github.com/stashed/mysql/commit/8e04ca0) Create repository crd for each Restic repository (#394) +- [4c9a478](https://github.com/stashed/mysql/commit/4c9a478) Rename --analytics to --enable-analytics (#384) +- [7ea2220](https://github.com/stashed/mysql/commit/7ea2220) Replace initializers with mutation webhook for workloads (#363) +- [2770e6b](https://github.com/stashed/mysql/commit/2770e6b) Use admission hook helpers from kutil (#360) +- [d3754d7](https://github.com/stashed/mysql/commit/d3754d7) Implement offline backup for multiple replica (#335) +- [13a2d14](https://github.com/stashed/mysql/commit/13a2d14) Use official code generator scripts (#336) +- [90642ce](https://github.com/stashed/mysql/commit/90642ce) Fix e2e tests after webhook merger (#333) +- [2fc3239](https://github.com/stashed/mysql/commit/2fc3239) Leave secure port unset +- [7cb52b2](https://github.com/stashed/mysql/commit/7cb52b2) Merge admission webhook and operator into one binary (#329) +- [3306427](https://github.com/stashed/mysql/commit/3306427) Implement informer factory for backup scheduler (#325) +- [7bb027b](https://github.com/stashed/mysql/commit/7bb027b) Cleanup apiserver +- [fb8c1e4](https://github.com/stashed/mysql/commit/fb8c1e4) Copy generic-admission-server into pkg (#318) +- [5a5093f](https://github.com/stashed/mysql/commit/5a5093f) Use shared infromer factory (#317) +- [0ccb948](https://github.com/stashed/mysql/commit/0ccb948) Use GetBaseVersion method from kutil (#316) +- [8c5e6ff](https://github.com/stashed/mysql/commit/8c5e6ff) Fix webhook command description (#314) +- [775a2b6](https://github.com/stashed/mysql/commit/775a2b6) Merge webhook plugins into one. (#311) +- [a8659fe](https://github.com/stashed/mysql/commit/a8659fe) Add ValidatingAdmissionWebhook for Stash CRDs (#299) +- [c3e177c](https://github.com/stashed/mysql/commit/c3e177c) Added support for private docker registry (#300) +- [62ec42e](https://github.com/stashed/mysql/commit/62ec42e) Update dependencies to Kubernetes 1.9 (#297) +- [cf3ea7c](https://github.com/stashed/mysql/commit/cf3ea7c) Update appscode/go log wrapper (#287) +- [470cc31](https://github.com/stashed/mysql/commit/470cc31) Pass --pushgateway-url for injected containers. (#284) +- [e2e79c6](https://github.com/stashed/mysql/commit/e2e79c6) Fix kubectl version parsing generation in GKE (#267) +- [326aea4](https://github.com/stashed/mysql/commit/326aea4) Detect analytics client id using env vars (#265) +- [4a5912c](https://github.com/stashed/mysql/commit/4a5912c) Prepare docs for 0.6.0 release (#264) +- [f75d5df](https://github.com/stashed/mysql/commit/f75d5df) Remove restic-dependency from recovery (#258) +- [86f01f3](https://github.com/stashed/mysql/commit/86f01f3) Log operator version on start (#253) +- [4e29b70](https://github.com/stashed/mysql/commit/4e29b70) Simplify clientID generation for analytics (#247) +- [a45937f](https://github.com/stashed/mysql/commit/a45937f) Set analytics clientID (#246) +- [ea53cea](https://github.com/stashed/mysql/commit/ea53cea) Enable Restic cahce-dir flag (#241) +- [dc0030d](https://github.com/stashed/mysql/commit/dc0030d) Implement offline backup (#229) +- [ae40f35](https://github.com/stashed/mysql/commit/ae40f35) Revendor kutil (#230) +- [d68a34d](https://github.com/stashed/mysql/commit/d68a34d) Record recovery status for individual FileGroup (#222) +- [15a24b7](https://github.com/stashed/mysql/commit/15a24b7) Leader election for deployment, replica set and rc (#206) +- [4a75689](https://github.com/stashed/mysql/commit/4a75689) Implement Recovery for Restic Backup (#202) +- [78b3942](https://github.com/stashed/mysql/commit/78b3942) Use typed versioned client for CRD +- [b857b05](https://github.com/stashed/mysql/commit/b857b05) Change `k8s.io/api/core/v1` pkg alias to core (#204) +- [e52f848](https://github.com/stashed/mysql/commit/e52f848) Use client-go 5.x +- [4f376ad](https://github.com/stashed/mysql/commit/4f376ad) Set hostname based on resource type (#198) +- [e530116](https://github.com/stashed/mysql/commit/e530116) Manage RoleBinding for rbac enabled cluster (#197) +- [e28c13f](https://github.com/stashed/mysql/commit/e28c13f) Use workqueue for scheduler (#194) +- [2719cbd](https://github.com/stashed/mysql/commit/2719cbd) Fix e2e tests (#183) +- [9c1cc43](https://github.com/stashed/mysql/commit/9c1cc43) Use workqueue (#182) +- [b3ee076](https://github.com/stashed/mysql/commit/b3ee076) Only watch apps/v1beta1 Deployment (#178) +- [4f92ca6](https://github.com/stashed/mysql/commit/4f92ca6) Use Namespace() method from kutil. +- [78f1e7f](https://github.com/stashed/mysql/commit/78f1e7f) Update kutil (#170) +- [29a8a1f](https://github.com/stashed/mysql/commit/29a8a1f) Use apis/v1alpha1 instead of internal version (#167) +- [da3eb2e](https://github.com/stashed/mysql/commit/da3eb2e) Use kubernetes/code-generator (#163) +- [3b1d6bf](https://github.com/stashed/mysql/commit/3b1d6bf) Expose resync-period as flag +- [35d8dc6](https://github.com/stashed/mysql/commit/35d8dc6) Move analytics collector to root command (#164) +- [6a55694](https://github.com/stashed/mysql/commit/6a55694) Migrate TPR to CRD (#160) +- [91f678f](https://github.com/stashed/mysql/commit/91f678f) Rename RepositorySecretName to StorageSecretName (#135) +- [d666c81](https://github.com/stashed/mysql/commit/d666c81) Change mount path for labels to /etc/stash +- [1177d60](https://github.com/stashed/mysql/commit/1177d60) Part 6 - Update docs (#121) +- [a15689d](https://github.com/stashed/mysql/commit/a15689d) Various bug fixes (#118) +- [d8a5771](https://github.com/stashed/mysql/commit/d8a5771) Set TMPDIR env var for restic (#115) +- [60ed8f7](https://github.com/stashed/mysql/commit/60ed8f7) Update user guide (#94) + + +### [8.0.3-beta.20200708](https://github.com/stashed/mysql/releases/tag/8.0.3-beta.20200708) + + + +### [8.0.14-beta.20200708](https://github.com/stashed/mysql/releases/tag/8.0.14-beta.20200708) + + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-beta.20200708](https://github.com/stashed/percona-xtradb/releases/tag/5.7-beta.20200708) + +- [0535469](https://github.com/stashed/percona-xtradb/commit/0535469) Prepare for release 5.7-beta.20200708 (#33) +- [6aac98e](https://github.com/stashed/percona-xtradb/commit/6aac98e) Add commands to update chart version (#30) +- [24431c1](https://github.com/stashed/percona-xtradb/commit/24431c1) [cherry-pick] Update update-release-tracker.sh (#29) +- [89c2a37](https://github.com/stashed/percona-xtradb/commit/89c2a37) [cherry-pick] Update update-release-tracker.sh (#28) +- [4163a9c](https://github.com/stashed/percona-xtradb/commit/4163a9c) [cherry-pick] Update release.yml (#27) +- [66d54d2](https://github.com/stashed/percona-xtradb/commit/66d54d2) [cherry-pick] Add script to update release tracker on pr merge (#25) (#26) +- [f280602](https://github.com/stashed/percona-xtradb/commit/f280602) [cherry-pick] Add workflow to cherry pick commits to master (#23) (#24) +- [7ca441c](https://github.com/stashed/percona-xtradb/commit/7ca441c) Fix chart release process (#21) +- [76fca67](https://github.com/stashed/percona-xtradb/commit/76fca67) Update .kodiak.toml +- [ecbd60c](https://github.com/stashed/percona-xtradb/commit/ecbd60c) Allow overwriting secret key via SecretTransformation (#20) +- [8404948](https://github.com/stashed/percona-xtradb/commit/8404948) Make waitTimeout configurable through flag (#19) +- [110985a](https://github.com/stashed/percona-xtradb/commit/110985a) Create .kodiak.toml +- [70ed4b2](https://github.com/stashed/percona-xtradb/commit/70ed4b2) Update to Kubernetes v1.18.3 (#18) +- [75efdb9](https://github.com/stashed/percona-xtradb/commit/75efdb9) Update crazy-max/ghaction-docker-buildx flag +- [56b5472](https://github.com/stashed/percona-xtradb/commit/56b5472) Trigger the workflow on push or pull request +- [14e9f5a](https://github.com/stashed/percona-xtradb/commit/14e9f5a) Auto generate chart readme file +- [31ff6c4](https://github.com/stashed/percona-xtradb/commit/31ff6c4) Correctly mark optional fields +- [3676857](https://github.com/stashed/percona-xtradb/commit/3676857) Add openapi v3 schema for values file (#15) +- [9b32ca9](https://github.com/stashed/percona-xtradb/commit/9b32ca9) Update CI configuration +- [9ba20af](https://github.com/stashed/percona-xtradb/commit/9ba20af) Add support for providing s3 region (#14) +- [2ee6c3b](https://github.com/stashed/percona-xtradb/commit/2ee6c3b) Update percona standalone backup-restore (#13) +- [af1a30b](https://github.com/stashed/percona-xtradb/commit/af1a30b) Update PerconaXtraDB version for percona xtradb cluster (#12) +- [7ddb43a](https://github.com/stashed/percona-xtradb/commit/7ddb43a) Make output.json file writable to all users + Fix Flag types (#11) +- [06aa5c3](https://github.com/stashed/percona-xtradb/commit/06aa5c3) Update hugo frontmatter for stash website +- [4171676](https://github.com/stashed/percona-xtradb/commit/4171676) Enable race detector in e2e tests +- [9ab6f35](https://github.com/stashed/percona-xtradb/commit/9ab6f35) Added scheme field in AppBinding (#10) +- [a4262ea](https://github.com/stashed/percona-xtradb/commit/a4262ea) Test installers (#9) +- [72be668](https://github.com/stashed/percona-xtradb/commit/72be668) Don't build docker image for arm64 +- [2974e8b](https://github.com/stashed/percona-xtradb/commit/2974e8b) Update license file templates +- [dd96199](https://github.com/stashed/percona-xtradb/commit/dd96199) Add license header to files (#8) +- [93e37a6](https://github.com/stashed/percona-xtradb/commit/93e37a6) Backup and restore doc for Percona XtraDB 5.7 (#7) +- [aafee30](https://github.com/stashed/percona-xtradb/commit/aafee30) Fix percona-xtradb backup & restore (#6) +- [06cbe89](https://github.com/stashed/percona-xtradb/commit/06cbe89) Fix Docker image badge (#5) +- [2e6c4c6](https://github.com/stashed/percona-xtradb/commit/2e6c4c6) Update Makefile (#4) +- [11da7a1](https://github.com/stashed/percona-xtradb/commit/11da7a1) Add release pipeline (#3) +- [75ca782](https://github.com/stashed/percona-xtradb/commit/75ca782) Update go.yml +- [998acad](https://github.com/stashed/percona-xtradb/commit/998acad) Enable GitHub actions +- [a32083a](https://github.com/stashed/percona-xtradb/commit/a32083a) Improve error handling + remove metrics handling part (#2) +- [87b38a5](https://github.com/stashed/percona-xtradb/commit/87b38a5) Backup & Restore PerconaXtraDB using Stash (#1) +- [a4485ab](https://github.com/stashed/percona-xtradb/commit/a4485ab) Reorganize repo +- [1972a9a](https://github.com/stashed/percona-xtradb/commit/1972a9a) VolumeSnapshot (#787) +- [3f1f4cf](https://github.com/stashed/percona-xtradb/commit/3f1f4cf) Remove importance of order of rule in RestoreSession (#795) +- [86a4af0](https://github.com/stashed/percona-xtradb/commit/86a4af0) Skip BackupSession creation if target does not exist + use timestamp … (#797) +- [3abe6f6](https://github.com/stashed/percona-xtradb/commit/3abe6f6) Use restic 0.9.5 (#789) +- [85b21bf](https://github.com/stashed/percona-xtradb/commit/85b21bf) Update concept doc (#739) +- [ad5c8f2](https://github.com/stashed/percona-xtradb/commit/ad5c8f2) Add support for backup cluster resources YAML (#721) +- [2bb8ec3](https://github.com/stashed/percona-xtradb/commit/2bb8ec3) Backup and restore Elasticsearch (#702) +- [1f21268](https://github.com/stashed/percona-xtradb/commit/1f21268) Update package path to stash.appscode.dev/stash (#776) +- [e8fb571](https://github.com/stashed/percona-xtradb/commit/e8fb571) Update to k8s 1.14.0 client libraries using go.mod (#775) +- [eab0f8e](https://github.com/stashed/percona-xtradb/commit/eab0f8e) Remove --rbac flag (#761) +- [4c3e7ea](https://github.com/stashed/percona-xtradb/commit/4c3e7ea) Skip creating/processing backup-session when backup-config is paused (#759) +- [7905eff](https://github.com/stashed/percona-xtradb/commit/7905eff) Stash v1beta1 E2E test for PVC (#753) +- [2c44ee8](https://github.com/stashed/percona-xtradb/commit/2c44ee8) Implement snapshots for v1beta1 api (#749) +- [c88df7a](https://github.com/stashed/percona-xtradb/commit/c88df7a) Run restic commands using docker (#754) +- [8e24d32](https://github.com/stashed/percona-xtradb/commit/8e24d32) Fixed scratch-dir, output-dir and hostname in functions/tasks yamls (#744) +- [8d5944d](https://github.com/stashed/percona-xtradb/commit/8d5944d) Add Stash CLI (#734) +- [550ab37](https://github.com/stashed/percona-xtradb/commit/550ab37) Apply nice/ionice settings from env (#746) +- [42ed76b](https://github.com/stashed/percona-xtradb/commit/42ed76b) Stash V1beta1 E2E test for Deployment (#710) +- [d63f9e9](https://github.com/stashed/percona-xtradb/commit/d63f9e9) Fix openapi path prefixes for validators and mutators (#732) +- [c1347ed](https://github.com/stashed/percona-xtradb/commit/c1347ed) Add max-connections for GCS, Azure, B2 backend (#730) +- [859c4ee](https://github.com/stashed/percona-xtradb/commit/859c4ee) Rename admission webhooks to avoid name collision (#725) +- [d631bb9](https://github.com/stashed/percona-xtradb/commit/d631bb9) Apply EmptyDir settings to TmpDir (#719) +- [cc70068](https://github.com/stashed/percona-xtradb/commit/cc70068) Add support for rest backend (#713) +- [e4db000](https://github.com/stashed/percona-xtradb/commit/e4db000) Add support for OpenShift DeploymentConfig (#714) +- [3fa7bdb](https://github.com/stashed/percona-xtradb/commit/3fa7bdb) Backup and restore Mongo DB (#699) +- [4c39235](https://github.com/stashed/percona-xtradb/commit/4c39235) Backup and restore MySQL DB (#696) +- [3e89d32](https://github.com/stashed/percona-xtradb/commit/3e89d32) Backup and restore Postgres DB (#695) +- [03b95f3](https://github.com/stashed/percona-xtradb/commit/03b95f3) Add BackupSession Controller for Sidecar (#701) +- [cacbc7d](https://github.com/stashed/percona-xtradb/commit/cacbc7d) Update workload controller for new design (#675) +- [5c173e5](https://github.com/stashed/percona-xtradb/commit/5c173e5) Post backup/restore status update (#691) +- [50bbb0a](https://github.com/stashed/percona-xtradb/commit/50bbb0a) Backup and restore PVC (#676) +- [d4a53e2](https://github.com/stashed/percona-xtradb/commit/d4a53e2) Add BackupConfiguration Controller (#671) +- [ef9a4ae](https://github.com/stashed/percona-xtradb/commit/ef9a4ae) Update Kubernetes client libraries to 1.13.0 (#687) +- [c48dbfc](https://github.com/stashed/percona-xtradb/commit/c48dbfc) Separate type definitions into individual files (#646) +- [77f2113](https://github.com/stashed/percona-xtradb/commit/77f2113) Use flags.DumpAll to dump flags (#624) +- [cb54d8c](https://github.com/stashed/percona-xtradb/commit/cb54d8c) Set periodic analytics (#623) +- [248a53a](https://github.com/stashed/percona-xtradb/commit/248a53a) Add validation webhook xray (#618) +- [2029bf4](https://github.com/stashed/percona-xtradb/commit/2029bf4) Use dynamic pushgateway url (#614) +- [bcf5926](https://github.com/stashed/percona-xtradb/commit/bcf5926) Fix offline backup (#537) +- [5049a63](https://github.com/stashed/percona-xtradb/commit/5049a63) Fix extended apiserver issues with Kubernetes 1.11 (#536) +- [9d31255](https://github.com/stashed/percona-xtradb/commit/9d31255) Update client-go to v8.0.0 (#528) +- [d872b4c](https://github.com/stashed/percona-xtradb/commit/d872b4c) Enable status subresource for crds (#524) +- [4795dba](https://github.com/stashed/percona-xtradb/commit/4795dba) Remove ops-address port (#518) +- [e95b151](https://github.com/stashed/percona-xtradb/commit/e95b151) Add support for initial backoff to the apiserver call on recover (#476) +- [120e5de](https://github.com/stashed/percona-xtradb/commit/120e5de) Disable admission controllers for webhook server (#468) +- [2f19545](https://github.com/stashed/percona-xtradb/commit/2f19545) Update client-go to 7.0.0 (#463) +- [e613ff5](https://github.com/stashed/percona-xtradb/commit/e613ff5) Fixes RBAC issue in test (#449) +- [56a3a74](https://github.com/stashed/percona-xtradb/commit/56a3a74) Some cleanup (#446) +- [02565bb](https://github.com/stashed/percona-xtradb/commit/02565bb) Delete restic repository from backend if Repository CRD is deleted (#438) +- [ea98067](https://github.com/stashed/percona-xtradb/commit/ea98067) Fix go_vet error (#440) +- [9d626eb](https://github.com/stashed/percona-xtradb/commit/9d626eb) Increase qps and burst limits (#435) +- [5c6713f](https://github.com/stashed/percona-xtradb/commit/5c6713f) Show repository snapshot list (#417) +- [6d8ef78](https://github.com/stashed/percona-xtradb/commit/6d8ef78) Expose swagger.json (#420) +- [8e04ca0](https://github.com/stashed/percona-xtradb/commit/8e04ca0) Create repository crd for each Restic repository (#394) +- [4c9a478](https://github.com/stashed/percona-xtradb/commit/4c9a478) Rename --analytics to --enable-analytics (#384) +- [7ea2220](https://github.com/stashed/percona-xtradb/commit/7ea2220) Replace initializers with mutation webhook for workloads (#363) +- [2770e6b](https://github.com/stashed/percona-xtradb/commit/2770e6b) Use admission hook helpers from kutil (#360) +- [d3754d7](https://github.com/stashed/percona-xtradb/commit/d3754d7) Implement offline backup for multiple replica (#335) +- [13a2d14](https://github.com/stashed/percona-xtradb/commit/13a2d14) Use official code generator scripts (#336) +- [90642ce](https://github.com/stashed/percona-xtradb/commit/90642ce) Fix e2e tests after webhook merger (#333) +- [2fc3239](https://github.com/stashed/percona-xtradb/commit/2fc3239) Leave secure port unset +- [7cb52b2](https://github.com/stashed/percona-xtradb/commit/7cb52b2) Merge admission webhook and operator into one binary (#329) +- [3306427](https://github.com/stashed/percona-xtradb/commit/3306427) Implement informer factory for backup scheduler (#325) +- [7bb027b](https://github.com/stashed/percona-xtradb/commit/7bb027b) Cleanup apiserver +- [fb8c1e4](https://github.com/stashed/percona-xtradb/commit/fb8c1e4) Copy generic-admission-server into pkg (#318) +- [5a5093f](https://github.com/stashed/percona-xtradb/commit/5a5093f) Use shared infromer factory (#317) +- [0ccb948](https://github.com/stashed/percona-xtradb/commit/0ccb948) Use GetBaseVersion method from kutil (#316) +- [8c5e6ff](https://github.com/stashed/percona-xtradb/commit/8c5e6ff) Fix webhook command description (#314) +- [775a2b6](https://github.com/stashed/percona-xtradb/commit/775a2b6) Merge webhook plugins into one. (#311) +- [a8659fe](https://github.com/stashed/percona-xtradb/commit/a8659fe) Add ValidatingAdmissionWebhook for Stash CRDs (#299) +- [c3e177c](https://github.com/stashed/percona-xtradb/commit/c3e177c) Added support for private docker registry (#300) +- [62ec42e](https://github.com/stashed/percona-xtradb/commit/62ec42e) Update dependencies to Kubernetes 1.9 (#297) +- [cf3ea7c](https://github.com/stashed/percona-xtradb/commit/cf3ea7c) Update appscode/go log wrapper (#287) +- [470cc31](https://github.com/stashed/percona-xtradb/commit/470cc31) Pass --pushgateway-url for injected containers. (#284) +- [e2e79c6](https://github.com/stashed/percona-xtradb/commit/e2e79c6) Fix kubectl version parsing generation in GKE (#267) +- [326aea4](https://github.com/stashed/percona-xtradb/commit/326aea4) Detect analytics client id using env vars (#265) +- [4a5912c](https://github.com/stashed/percona-xtradb/commit/4a5912c) Prepare docs for 0.6.0 release (#264) +- [f75d5df](https://github.com/stashed/percona-xtradb/commit/f75d5df) Remove restic-dependency from recovery (#258) +- [86f01f3](https://github.com/stashed/percona-xtradb/commit/86f01f3) Log operator version on start (#253) +- [4e29b70](https://github.com/stashed/percona-xtradb/commit/4e29b70) Simplify clientID generation for analytics (#247) +- [a45937f](https://github.com/stashed/percona-xtradb/commit/a45937f) Set analytics clientID (#246) +- [ea53cea](https://github.com/stashed/percona-xtradb/commit/ea53cea) Enable Restic cahce-dir flag (#241) +- [dc0030d](https://github.com/stashed/percona-xtradb/commit/dc0030d) Implement offline backup (#229) +- [ae40f35](https://github.com/stashed/percona-xtradb/commit/ae40f35) Revendor kutil (#230) +- [d68a34d](https://github.com/stashed/percona-xtradb/commit/d68a34d) Record recovery status for individual FileGroup (#222) +- [15a24b7](https://github.com/stashed/percona-xtradb/commit/15a24b7) Leader election for deployment, replica set and rc (#206) +- [4a75689](https://github.com/stashed/percona-xtradb/commit/4a75689) Implement Recovery for Restic Backup (#202) +- [78b3942](https://github.com/stashed/percona-xtradb/commit/78b3942) Use typed versioned client for CRD +- [b857b05](https://github.com/stashed/percona-xtradb/commit/b857b05) Change `k8s.io/api/core/v1` pkg alias to core (#204) +- [e52f848](https://github.com/stashed/percona-xtradb/commit/e52f848) Use client-go 5.x +- [4f376ad](https://github.com/stashed/percona-xtradb/commit/4f376ad) Set hostname based on resource type (#198) +- [e530116](https://github.com/stashed/percona-xtradb/commit/e530116) Manage RoleBinding for rbac enabled cluster (#197) +- [e28c13f](https://github.com/stashed/percona-xtradb/commit/e28c13f) Use workqueue for scheduler (#194) +- [2719cbd](https://github.com/stashed/percona-xtradb/commit/2719cbd) Fix e2e tests (#183) +- [9c1cc43](https://github.com/stashed/percona-xtradb/commit/9c1cc43) Use workqueue (#182) +- [b3ee076](https://github.com/stashed/percona-xtradb/commit/b3ee076) Only watch apps/v1beta1 Deployment (#178) +- [4f92ca6](https://github.com/stashed/percona-xtradb/commit/4f92ca6) Use Namespace() method from kutil. +- [78f1e7f](https://github.com/stashed/percona-xtradb/commit/78f1e7f) Update kutil (#170) +- [29a8a1f](https://github.com/stashed/percona-xtradb/commit/29a8a1f) Use apis/v1alpha1 instead of internal version (#167) +- [da3eb2e](https://github.com/stashed/percona-xtradb/commit/da3eb2e) Use kubernetes/code-generator (#163) +- [3b1d6bf](https://github.com/stashed/percona-xtradb/commit/3b1d6bf) Expose resync-period as flag +- [35d8dc6](https://github.com/stashed/percona-xtradb/commit/35d8dc6) Move analytics collector to root command (#164) +- [6a55694](https://github.com/stashed/percona-xtradb/commit/6a55694) Migrate TPR to CRD (#160) +- [91f678f](https://github.com/stashed/percona-xtradb/commit/91f678f) Rename RepositorySecretName to StorageSecretName (#135) +- [d666c81](https://github.com/stashed/percona-xtradb/commit/d666c81) Change mount path for labels to /etc/stash +- [1177d60](https://github.com/stashed/percona-xtradb/commit/1177d60) Part 6 - Update docs (#121) +- [a15689d](https://github.com/stashed/percona-xtradb/commit/a15689d) Various bug fixes (#118) +- [d8a5771](https://github.com/stashed/percona-xtradb/commit/d8a5771) Set TMPDIR env var for restic (#115) +- [60ed8f7](https://github.com/stashed/percona-xtradb/commit/60ed8f7) Update user guide (#94) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6-beta.20200708](https://github.com/stashed/postgres/releases/tag/9.6-beta.20200708) + +- [d85fc80](https://github.com/stashed/postgres/commit/d85fc80) Prepare for release 9.6-beta.20200708 (#88) +- [fbd6766](https://github.com/stashed/postgres/commit/fbd6766) [cherry-pick] Publish to testing dir for alpha/beta releases (#78) (#83) +- [1b32879](https://github.com/stashed/postgres/commit/1b32879) [cherry-pick] Update License (#72) (#77) +- [388ddee](https://github.com/stashed/postgres/commit/388ddee) Add commands to update chart version (#71) +- [875c1f0](https://github.com/stashed/postgres/commit/875c1f0) [cherry-pick] Update update-release-tracker.sh (#70) +- [0e71e2d](https://github.com/stashed/postgres/commit/0e71e2d) [cherry-pick] Update update-release-tracker.sh (#65) +- [bbfac61](https://github.com/stashed/postgres/commit/bbfac61) [cherry-pick] Update release.yml (#55) (#60) +- [986d0a7](https://github.com/stashed/postgres/commit/986d0a7) [cherry-pick] Add script to update release tracker on pr merge (#49) (#54) +- [6edaf36](https://github.com/stashed/postgres/commit/6edaf36) [cherry-pick] Remove /cherry-pick from cherry picked prs (#43) (#48) +- [6743dbe](https://github.com/stashed/postgres/commit/6743dbe) [cherry-pick] Add workflow to cherry pick commits to master (#37) (#42) +- [fb4f222](https://github.com/stashed/postgres/commit/fb4f222) Fix chart release process (#36) +- [b5ddf5f](https://github.com/stashed/postgres/commit/b5ddf5f) Update .kodiak.toml +- [7951787](https://github.com/stashed/postgres/commit/7951787) Fix waitForDBReady() logic + Make timeout configurable (#35) +- [e7bb18f](https://github.com/stashed/postgres/commit/e7bb18f) Create .kodiak.toml +- [60acc09](https://github.com/stashed/postgres/commit/60acc09) Merge pull request Allow overriding secret keys from AppBinding #33 +- [aaff7fb](https://github.com/stashed/postgres/commit/aaff7fb) Fix typos (#32) +- [568f584](https://github.com/stashed/postgres/commit/568f584) Update to Kubernetes v1.18.3 (#34) +- [098bb78](https://github.com/stashed/postgres/commit/098bb78) Update crazy-max/ghaction-docker-buildx flag +- [4385362](https://github.com/stashed/postgres/commit/4385362) function-args: add pg-back-cmd option +- [7cd065c](https://github.com/stashed/postgres/commit/7cd065c) Trigger the workflow on push or pull request +- [b63e3e5](https://github.com/stashed/postgres/commit/b63e3e5) Auto generate chart readme file +- [dea1a41](https://github.com/stashed/postgres/commit/dea1a41) Correctly mark optional fields +- [efc4283](https://github.com/stashed/postgres/commit/efc4283) Add openapi v3 schema for values file (#27) +- [99a417e](https://github.com/stashed/postgres/commit/99a417e) Update CI configuration +- [712aabb](https://github.com/stashed/postgres/commit/712aabb) Add support for providing s3 region (#26) +- [111a3fe](https://github.com/stashed/postgres/commit/111a3fe) Make output.json file writable to all users + Fix Flag types (#25) +- [1694bb7](https://github.com/stashed/postgres/commit/1694bb7) Update hugo frontmatter for stash website +- [ab592bd](https://github.com/stashed/postgres/commit/ab592bd) Enable race detector in e2e tests +- [6df8761](https://github.com/stashed/postgres/commit/6df8761) Fixed broken link, Added AppBinding scheme field (#24) +- [e3f4905](https://github.com/stashed/postgres/commit/e3f4905) Test installers (#23) +- [a3c2d0f](https://github.com/stashed/postgres/commit/a3c2d0f) Add license header to files (#22) +- [320def8](https://github.com/stashed/postgres/commit/320def8) Enable make ci (#21) +- [9a7b843](https://github.com/stashed/postgres/commit/9a7b843) Fix BackupSession's Print Columns (#20) +- [73d7b1c](https://github.com/stashed/postgres/commit/73d7b1c) Enable make ci (#19) +- [46d5ae8](https://github.com/stashed/postgres/commit/46d5ae8) Remove --enable-status-subresource flag (#18) +- [08067ca](https://github.com/stashed/postgres/commit/08067ca) Fix arguments passing (#17) +- [0c1db21](https://github.com/stashed/postgres/commit/0c1db21) Add release pipeline (#16) +- [3d33fd4](https://github.com/stashed/postgres/commit/3d33fd4) adjust frontmatter weight +- [41e3555](https://github.com/stashed/postgres/commit/41e3555) Update resources for 9.6 +- [775ffab](https://github.com/stashed/postgres/commit/775ffab) Update go.yml +- [67cb695](https://github.com/stashed/postgres/commit/67cb695) Fix BackupConfiguration retention policy (#11) +- [9228437](https://github.com/stashed/postgres/commit/9228437) Fix link + grammar (#10) +- [bddb9cd](https://github.com/stashed/postgres/commit/bddb9cd) Enable GitHub actions +- [f42ada5](https://github.com/stashed/postgres/commit/f42ada5) Fix menu id in frontmatter +- [a59bed1](https://github.com/stashed/postgres/commit/a59bed1) Finalize doc template (#9) +- [08274c9](https://github.com/stashed/postgres/commit/08274c9) Fix typo (#8) +- [afad5db](https://github.com/stashed/postgres/commit/afad5db) Refactor error + metric handling (#7) +- [248d0ea](https://github.com/stashed/postgres/commit/248d0ea) Use Endpoint for REST server URL (remove --rest-server-url flag) (#6) +- [41d2a53](https://github.com/stashed/postgres/commit/41d2a53) Remove metrics options from function (#5) +- [d276da0](https://github.com/stashed/postgres/commit/d276da0) Use docker buildx to build docker image +- [3c0e71d](https://github.com/stashed/postgres/commit/3c0e71d) Use github.com/Azure/go-autorest/autorest@v0.7.0 +- [5eab8f5](https://github.com/stashed/postgres/commit/5eab8f5) Update postgres.md +- [0f37446](https://github.com/stashed/postgres/commit/0f37446) Rename Functions and Tasks (#4) +- [b1b3e80](https://github.com/stashed/postgres/commit/b1b3e80) Update Chart.yaml +- [a1bee9b](https://github.com/stashed/postgres/commit/a1bee9b) Update README.md +- [904549a](https://github.com/stashed/postgres/commit/904549a) Update postgres.md +- [1c99280](https://github.com/stashed/postgres/commit/1c99280) Add Chart and documentation (#2) +- [0238497](https://github.com/stashed/postgres/commit/0238497) Add ca-certificates package in Docker image (#3) +- [b0e6b2b](https://github.com/stashed/postgres/commit/b0e6b2b) Reorganize repo (#1) +- [1972a9a](https://github.com/stashed/postgres/commit/1972a9a) VolumeSnapshot (#787) +- [3f1f4cf](https://github.com/stashed/postgres/commit/3f1f4cf) Remove importance of order of rule in RestoreSession (#795) +- [86a4af0](https://github.com/stashed/postgres/commit/86a4af0) Skip BackupSession creation if target does not exist + use timestamp … (#797) +- [3abe6f6](https://github.com/stashed/postgres/commit/3abe6f6) Use restic 0.9.5 (#789) +- [85b21bf](https://github.com/stashed/postgres/commit/85b21bf) Update concept doc (#739) +- [ad5c8f2](https://github.com/stashed/postgres/commit/ad5c8f2) Add support for backup cluster resources YAML (#721) +- [2bb8ec3](https://github.com/stashed/postgres/commit/2bb8ec3) Backup and restore Elasticsearch (#702) +- [1f21268](https://github.com/stashed/postgres/commit/1f21268) Update package path to stash.appscode.dev/stash (#776) +- [e8fb571](https://github.com/stashed/postgres/commit/e8fb571) Update to k8s 1.14.0 client libraries using go.mod (#775) +- [eab0f8e](https://github.com/stashed/postgres/commit/eab0f8e) Remove --rbac flag (#761) +- [4c3e7ea](https://github.com/stashed/postgres/commit/4c3e7ea) Skip creating/processing backup-session when backup-config is paused (#759) +- [7905eff](https://github.com/stashed/postgres/commit/7905eff) Stash v1beta1 E2E test for PVC (#753) +- [2c44ee8](https://github.com/stashed/postgres/commit/2c44ee8) Implement snapshots for v1beta1 api (#749) +- [c88df7a](https://github.com/stashed/postgres/commit/c88df7a) Run restic commands using docker (#754) +- [8e24d32](https://github.com/stashed/postgres/commit/8e24d32) Fixed scratch-dir, output-dir and hostname in functions/tasks yamls (#744) +- [8d5944d](https://github.com/stashed/postgres/commit/8d5944d) Add Stash CLI (#734) +- [550ab37](https://github.com/stashed/postgres/commit/550ab37) Apply nice/ionice settings from env (#746) +- [42ed76b](https://github.com/stashed/postgres/commit/42ed76b) Stash V1beta1 E2E test for Deployment (#710) +- [d63f9e9](https://github.com/stashed/postgres/commit/d63f9e9) Fix openapi path prefixes for validators and mutators (#732) +- [c1347ed](https://github.com/stashed/postgres/commit/c1347ed) Add max-connections for GCS, Azure, B2 backend (#730) +- [859c4ee](https://github.com/stashed/postgres/commit/859c4ee) Rename admission webhooks to avoid name collision (#725) +- [d631bb9](https://github.com/stashed/postgres/commit/d631bb9) Apply EmptyDir settings to TmpDir (#719) +- [cc70068](https://github.com/stashed/postgres/commit/cc70068) Add support for rest backend (#713) +- [e4db000](https://github.com/stashed/postgres/commit/e4db000) Add support for OpenShift DeploymentConfig (#714) +- [3fa7bdb](https://github.com/stashed/postgres/commit/3fa7bdb) Backup and restore Mongo DB (#699) +- [4c39235](https://github.com/stashed/postgres/commit/4c39235) Backup and restore MySQL DB (#696) +- [3e89d32](https://github.com/stashed/postgres/commit/3e89d32) Backup and restore Postgres DB (#695) +- [03b95f3](https://github.com/stashed/postgres/commit/03b95f3) Add BackupSession Controller for Sidecar (#701) +- [cacbc7d](https://github.com/stashed/postgres/commit/cacbc7d) Update workload controller for new design (#675) +- [5c173e5](https://github.com/stashed/postgres/commit/5c173e5) Post backup/restore status update (#691) +- [50bbb0a](https://github.com/stashed/postgres/commit/50bbb0a) Backup and restore PVC (#676) +- [d4a53e2](https://github.com/stashed/postgres/commit/d4a53e2) Add BackupConfiguration Controller (#671) +- [ef9a4ae](https://github.com/stashed/postgres/commit/ef9a4ae) Update Kubernetes client libraries to 1.13.0 (#687) +- [c48dbfc](https://github.com/stashed/postgres/commit/c48dbfc) Separate type definitions into individual files (#646) +- [77f2113](https://github.com/stashed/postgres/commit/77f2113) Use flags.DumpAll to dump flags (#624) +- [cb54d8c](https://github.com/stashed/postgres/commit/cb54d8c) Set periodic analytics (#623) +- [248a53a](https://github.com/stashed/postgres/commit/248a53a) Add validation webhook xray (#618) +- [2029bf4](https://github.com/stashed/postgres/commit/2029bf4) Use dynamic pushgateway url (#614) +- [bcf5926](https://github.com/stashed/postgres/commit/bcf5926) Fix offline backup (#537) +- [5049a63](https://github.com/stashed/postgres/commit/5049a63) Fix extended apiserver issues with Kubernetes 1.11 (#536) +- [9d31255](https://github.com/stashed/postgres/commit/9d31255) Update client-go to v8.0.0 (#528) +- [d872b4c](https://github.com/stashed/postgres/commit/d872b4c) Enable status subresource for crds (#524) +- [4795dba](https://github.com/stashed/postgres/commit/4795dba) Remove ops-address port (#518) +- [e95b151](https://github.com/stashed/postgres/commit/e95b151) Add support for initial backoff to the apiserver call on recover (#476) +- [120e5de](https://github.com/stashed/postgres/commit/120e5de) Disable admission controllers for webhook server (#468) +- [2f19545](https://github.com/stashed/postgres/commit/2f19545) Update client-go to 7.0.0 (#463) +- [e613ff5](https://github.com/stashed/postgres/commit/e613ff5) Fixes RBAC issue in test (#449) +- [56a3a74](https://github.com/stashed/postgres/commit/56a3a74) Some cleanup (#446) +- [02565bb](https://github.com/stashed/postgres/commit/02565bb) Delete restic repository from backend if Repository CRD is deleted (#438) +- [ea98067](https://github.com/stashed/postgres/commit/ea98067) Fix go_vet error (#440) +- [9d626eb](https://github.com/stashed/postgres/commit/9d626eb) Increase qps and burst limits (#435) +- [5c6713f](https://github.com/stashed/postgres/commit/5c6713f) Show repository snapshot list (#417) +- [6d8ef78](https://github.com/stashed/postgres/commit/6d8ef78) Expose swagger.json (#420) +- [8e04ca0](https://github.com/stashed/postgres/commit/8e04ca0) Create repository crd for each Restic repository (#394) +- [4c9a478](https://github.com/stashed/postgres/commit/4c9a478) Rename --analytics to --enable-analytics (#384) +- [7ea2220](https://github.com/stashed/postgres/commit/7ea2220) Replace initializers with mutation webhook for workloads (#363) +- [2770e6b](https://github.com/stashed/postgres/commit/2770e6b) Use admission hook helpers from kutil (#360) +- [d3754d7](https://github.com/stashed/postgres/commit/d3754d7) Implement offline backup for multiple replica (#335) +- [13a2d14](https://github.com/stashed/postgres/commit/13a2d14) Use official code generator scripts (#336) +- [90642ce](https://github.com/stashed/postgres/commit/90642ce) Fix e2e tests after webhook merger (#333) +- [2fc3239](https://github.com/stashed/postgres/commit/2fc3239) Leave secure port unset +- [7cb52b2](https://github.com/stashed/postgres/commit/7cb52b2) Merge admission webhook and operator into one binary (#329) +- [3306427](https://github.com/stashed/postgres/commit/3306427) Implement informer factory for backup scheduler (#325) +- [7bb027b](https://github.com/stashed/postgres/commit/7bb027b) Cleanup apiserver +- [fb8c1e4](https://github.com/stashed/postgres/commit/fb8c1e4) Copy generic-admission-server into pkg (#318) +- [5a5093f](https://github.com/stashed/postgres/commit/5a5093f) Use shared infromer factory (#317) +- [0ccb948](https://github.com/stashed/postgres/commit/0ccb948) Use GetBaseVersion method from kutil (#316) +- [8c5e6ff](https://github.com/stashed/postgres/commit/8c5e6ff) Fix webhook command description (#314) +- [775a2b6](https://github.com/stashed/postgres/commit/775a2b6) Merge webhook plugins into one. (#311) +- [a8659fe](https://github.com/stashed/postgres/commit/a8659fe) Add ValidatingAdmissionWebhook for Stash CRDs (#299) +- [c3e177c](https://github.com/stashed/postgres/commit/c3e177c) Added support for private docker registry (#300) +- [62ec42e](https://github.com/stashed/postgres/commit/62ec42e) Update dependencies to Kubernetes 1.9 (#297) +- [cf3ea7c](https://github.com/stashed/postgres/commit/cf3ea7c) Update appscode/go log wrapper (#287) +- [470cc31](https://github.com/stashed/postgres/commit/470cc31) Pass --pushgateway-url for injected containers. (#284) +- [e2e79c6](https://github.com/stashed/postgres/commit/e2e79c6) Fix kubectl version parsing generation in GKE (#267) +- [326aea4](https://github.com/stashed/postgres/commit/326aea4) Detect analytics client id using env vars (#265) +- [4a5912c](https://github.com/stashed/postgres/commit/4a5912c) Prepare docs for 0.6.0 release (#264) +- [f75d5df](https://github.com/stashed/postgres/commit/f75d5df) Remove restic-dependency from recovery (#258) +- [86f01f3](https://github.com/stashed/postgres/commit/86f01f3) Log operator version on start (#253) +- [4e29b70](https://github.com/stashed/postgres/commit/4e29b70) Simplify clientID generation for analytics (#247) +- [a45937f](https://github.com/stashed/postgres/commit/a45937f) Set analytics clientID (#246) +- [ea53cea](https://github.com/stashed/postgres/commit/ea53cea) Enable Restic cahce-dir flag (#241) +- [dc0030d](https://github.com/stashed/postgres/commit/dc0030d) Implement offline backup (#229) +- [ae40f35](https://github.com/stashed/postgres/commit/ae40f35) Revendor kutil (#230) +- [d68a34d](https://github.com/stashed/postgres/commit/d68a34d) Record recovery status for individual FileGroup (#222) +- [15a24b7](https://github.com/stashed/postgres/commit/15a24b7) Leader election for deployment, replica set and rc (#206) +- [4a75689](https://github.com/stashed/postgres/commit/4a75689) Implement Recovery for Restic Backup (#202) +- [78b3942](https://github.com/stashed/postgres/commit/78b3942) Use typed versioned client for CRD +- [b857b05](https://github.com/stashed/postgres/commit/b857b05) Change `k8s.io/api/core/v1` pkg alias to core (#204) +- [e52f848](https://github.com/stashed/postgres/commit/e52f848) Use client-go 5.x +- [4f376ad](https://github.com/stashed/postgres/commit/4f376ad) Set hostname based on resource type (#198) +- [e530116](https://github.com/stashed/postgres/commit/e530116) Manage RoleBinding for rbac enabled cluster (#197) +- [e28c13f](https://github.com/stashed/postgres/commit/e28c13f) Use workqueue for scheduler (#194) +- [2719cbd](https://github.com/stashed/postgres/commit/2719cbd) Fix e2e tests (#183) +- [9c1cc43](https://github.com/stashed/postgres/commit/9c1cc43) Use workqueue (#182) +- [b3ee076](https://github.com/stashed/postgres/commit/b3ee076) Only watch apps/v1beta1 Deployment (#178) +- [4f92ca6](https://github.com/stashed/postgres/commit/4f92ca6) Use Namespace() method from kutil. +- [78f1e7f](https://github.com/stashed/postgres/commit/78f1e7f) Update kutil (#170) +- [29a8a1f](https://github.com/stashed/postgres/commit/29a8a1f) Use apis/v1alpha1 instead of internal version (#167) +- [da3eb2e](https://github.com/stashed/postgres/commit/da3eb2e) Use kubernetes/code-generator (#163) +- [3b1d6bf](https://github.com/stashed/postgres/commit/3b1d6bf) Expose resync-period as flag +- [35d8dc6](https://github.com/stashed/postgres/commit/35d8dc6) Move analytics collector to root command (#164) +- [6a55694](https://github.com/stashed/postgres/commit/6a55694) Migrate TPR to CRD (#160) +- [91f678f](https://github.com/stashed/postgres/commit/91f678f) Rename RepositorySecretName to StorageSecretName (#135) +- [d666c81](https://github.com/stashed/postgres/commit/d666c81) Change mount path for labels to /etc/stash +- [1177d60](https://github.com/stashed/postgres/commit/1177d60) Part 6 - Update docs (#121) +- [a15689d](https://github.com/stashed/postgres/commit/a15689d) Various bug fixes (#118) +- [d8a5771](https://github.com/stashed/postgres/commit/d8a5771) Set TMPDIR env var for restic (#115) +- [60ed8f7](https://github.com/stashed/postgres/commit/60ed8f7) Update user guide (#94) + + +### [10.2-beta.20200708](https://github.com/stashed/postgres/releases/tag/10.2-beta.20200708) + + + +### [10.6-beta.20200708](https://github.com/stashed/postgres/releases/tag/10.6-beta.20200708) + + + +### [11.1-beta.20200708](https://github.com/stashed/postgres/releases/tag/11.1-beta.20200708) + + + +### [11.2-beta.20200708](https://github.com/stashed/postgres/releases/tag/11.2-beta.20200708) + + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.10.0-beta.0](https://github.com/stashed/stash/releases/tag/v0.10.0-beta.0) + +- [c8b81cf7](https://github.com/stashed/stash/commit/c8b81cf7) Prepare for release v0.10.0-beta.0 (#1145) +- [2d145f47](https://github.com/stashed/stash/commit/2d145f47) Clarify Docker images are dually licensed +- [693ab7df](https://github.com/stashed/stash/commit/693ab7df) Update License (#1144) +- [e13d67eb](https://github.com/stashed/stash/commit/e13d67eb) Update to Kubernetes v1.18.3 (#1142) +- [26ee605a](https://github.com/stashed/stash/commit/26ee605a) Update ci.yml +- [9fa95666](https://github.com/stashed/stash/commit/9fa95666) Add workflow to update docs (#1136) +- [95a62a95](https://github.com/stashed/stash/commit/95a62a95) Update update-release-tracker.sh +- [379c90d5](https://github.com/stashed/stash/commit/379c90d5) Update update-release-tracker.sh +- [cd0a70ee](https://github.com/stashed/stash/commit/cd0a70ee) Use GITHUB_BASE_REF to detect target branch +- [e27c5f66](https://github.com/stashed/stash/commit/e27c5f66) Add script to update release tracker on pr merge (#1132) +- [b0dd5051](https://github.com/stashed/stash/commit/b0dd5051) Update .kodiak.toml +- [e87bad80](https://github.com/stashed/stash/commit/e87bad80) Parameterize installer namespace +- [da8d8956](https://github.com/stashed/stash/commit/da8d8956) Format CI workflows +- [bbde40a3](https://github.com/stashed/stash/commit/bbde40a3) Update to Kubernetes v1.18.3 (#1129) +- [38eb3781](https://github.com/stashed/stash/commit/38eb3781) Update to Kubernetes v1.18.3 +- [197aa7bd](https://github.com/stashed/stash/commit/197aa7bd) Create .kodiak.toml +- [181ca49e](https://github.com/stashed/stash/commit/181ca49e) Update coverage script +- [26602c96](https://github.com/stashed/stash/commit/26602c96) Merge pull request #1125 from stashed/fix-ci-tests +- [54f87b78](https://github.com/stashed/stash/commit/54f87b78) Increase wait timeout +- [43428085](https://github.com/stashed/stash/commit/43428085) Remove unnecessary test codes + run test in parallel +- [8a780e0c](https://github.com/stashed/stash/commit/8a780e0c) Fix clone-pvc tests +- [7027c0f6](https://github.com/stashed/stash/commit/7027c0f6) Fix E2E test +- [31de588a](https://github.com/stashed/stash/commit/31de588a) Change GCS test bucket name to stash-ci (#1122) +- [30a490a6](https://github.com/stashed/stash/commit/30a490a6) Merge pull request #1121 from stashed/baseline-psp +- [419a18e3](https://github.com/stashed/stash/commit/419a18e3) Use StringSlice type flag +- [9dd3804d](https://github.com/stashed/stash/commit/9dd3804d) Make PSP names configurable through flag +- [e4edef44](https://github.com/stashed/stash/commit/e4edef44) Always use baseline PSP +- [cf1538a0](https://github.com/stashed/stash/commit/cf1538a0) Use filepath.Join to generate Repository prefix for BackupBatch (#1120) +- [be189169](https://github.com/stashed/stash/commit/be189169) Go back to using engineerd/setup-kind +- [ae2d74fa](https://github.com/stashed/stash/commit/ae2d74fa) Update dependencies (#1117) +- [a93a5b4c](https://github.com/stashed/stash/commit/a93a5b4c) Remove defaults from CRD v1beta1 (#1116) +- [40e65761](https://github.com/stashed/stash/commit/40e65761) Use CRD v1 for Kubernetes >= 1.16 (#1115) +- [7d851e53](https://github.com/stashed/stash/commit/7d851e53) Merge pull request #1114 from stashed/x7 +- [352ddeed](https://github.com/stashed/stash/commit/352ddeed) Use preinstalled kind +- [11c9e422](https://github.com/stashed/stash/commit/11c9e422) Pass context +- [21053603](https://github.com/stashed/stash/commit/21053603) Update to Kubernetes 1.18.3 +- [f450e9cc](https://github.com/stashed/stash/commit/f450e9cc) Add wait for target logic + add conditions for BackupConfiguration + BackupBatch + RestoreSession (#1108) +- [8f8ff87e](https://github.com/stashed/stash/commit/8f8ff87e) Fix volume snapshot job cleanup (#1090) +- [a4a868b5](https://github.com/stashed/stash/commit/a4a868b5) Merge pull request #1111 from stashed/fix-interimVolume +- [108d0252](https://github.com/stashed/stash/commit/108d0252) Set BackupSession as owner of the pvc created from interimVolumeTemplate +- [fd136c53](https://github.com/stashed/stash/commit/fd136c53) Use Go 1.14.3 +- [74c71d22](https://github.com/stashed/stash/commit/74c71d22) Update crazy-max/ghaction-docker-buildx flag +- [f783899b](https://github.com/stashed/stash/commit/f783899b) Trigger the workflow on push to master +- [e7eceb30](https://github.com/stashed/stash/commit/e7eceb30) Trigger the workflow on push or pull request +- [fe479e8c](https://github.com/stashed/stash/commit/fe479e8c) Use kind v0.8.0 +- [9fc4665a](https://github.com/stashed/stash/commit/9fc4665a) Merge pull request #1093 from robotinfra/master +- [ef2d57e3](https://github.com/stashed/stash/commit/ef2d57e3) fix typo succesSfully +- [d8d35c49](https://github.com/stashed/stash/commit/d8d35c49) fix event types mismatch +- [53dfe8b0](https://github.com/stashed/stash/commit/53dfe8b0) Update stash labels in Makefile +- [c8081c1d](https://github.com/stashed/stash/commit/c8081c1d) Pass image pull secrets to helm chart +- [37b9b312](https://github.com/stashed/stash/commit/37b9b312) Use Go 1.14.2 (#1074) +- [09621974](https://github.com/stashed/stash/commit/09621974) Update K8s version 1.14.6 to 1.14.10 (#1084) +- [8a1ab32c](https://github.com/stashed/stash/commit/8a1ab32c) Give backup triggering CronJob all permissions for Stash crds (#1083) +- [53b932b1](https://github.com/stashed/stash/commit/53b932b1) Use kubectl 1.17 (#1082) +- [5cdeebee](https://github.com/stashed/stash/commit/5cdeebee) Fix nil pointer exception during VolumeSnapshot (#1073) +- [30630d60](https://github.com/stashed/stash/commit/30630d60) Assign returned error properly crateRestoreSessoin() (#1069) +- [3fcbe1b7](https://github.com/stashed/stash/commit/3fcbe1b7) Update README.md to reflect Stash's capability properly (#1060) +- [53513cfe](https://github.com/stashed/stash/commit/53513cfe) Update README.md +- [d615e2c0](https://github.com/stashed/stash/commit/d615e2c0) Add license scan report and status (#1031) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2020.07.09-beta.0.md b/content/docs/v2024.12.18/CHANGELOG-v2020.07.09-beta.0.md new file mode 100644 index 0000000000..fca9a40621 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2020.07.09-beta.0.md @@ -0,0 +1,309 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2020.07.09-beta.0 + name: Changelog-v2020.07.09-beta.0 + parent: welcome + weight: 20200709 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2020.07.09-beta.0/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2020.07.09-beta.0/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2020.07.09-beta.0 (2020-07-09) + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.10.0-beta.1](https://github.com/stashed/apimachinery/releases/tag/v0.10.0-beta.1) + + + + +## [stashed/catalog](https://github.com/stashed/catalog) + +### [v2020.07.09-beta.0](https://github.com/stashed/catalog/releases/tag/v2020.07.09-beta.0) + +- [e822d2a](https://github.com/stashed/catalog/commit/e822d2a) Prepare for release v2020.07.09-beta.0 (#32) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.10.0-beta.1](https://github.com/stashed/cli/releases/tag/v0.10.0-beta.1) + +- [250372c](https://github.com/stashed/cli/commit/250372c) Prepare for release v0.10.0-beta.1 (#27) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-beta.20200709](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-beta.20200709) + +- [4f6f04d](https://github.com/stashed/elasticsearch/commit/4f6f04d) Prepare for release 5.6.4-beta.20200709 (#105) +- [c0b63a8](https://github.com/stashed/elasticsearch/commit/c0b63a8) [cherry-pick] Build docker image in release workflow (#96) (#97) + + +### [6.2.4-beta.20200709](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-beta.20200709) + +- [eb90a4d](https://github.com/stashed/elasticsearch/commit/eb90a4d) Prepare for release 6.2.4-beta.20200709 (#106) +- [341d4ad](https://github.com/stashed/elasticsearch/commit/341d4ad) [cherry-pick] Build docker image in release workflow (#96) (#98) + + +### [6.3.0-beta.20200709](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-beta.20200709) + +- [ba97538](https://github.com/stashed/elasticsearch/commit/ba97538) Prepare for release 6.3.0-beta.20200709 (#107) +- [fe8fad4](https://github.com/stashed/elasticsearch/commit/fe8fad4) [cherry-pick] Build docker image in release workflow (#96) (#99) + + +### [6.4.0-beta.20200709](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-beta.20200709) + +- [223de60](https://github.com/stashed/elasticsearch/commit/223de60) Prepare for release 6.4.0-beta.20200709 (#108) +- [3eb01b0](https://github.com/stashed/elasticsearch/commit/3eb01b0) [cherry-pick] Build docker image in release workflow (#96) (#100) + + +### [6.5.3-beta.20200709](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-beta.20200709) + +- [27ca5d7](https://github.com/stashed/elasticsearch/commit/27ca5d7) Prepare for release 6.5.3-beta.20200709 (#109) +- [cfc95c6](https://github.com/stashed/elasticsearch/commit/cfc95c6) [cherry-pick] Build docker image in release workflow (#96) (#101) + + +### [6.8.0-beta.20200709](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-beta.20200709) + +- [ebff50b](https://github.com/stashed/elasticsearch/commit/ebff50b) Prepare for release 6.8.0-beta.20200709 (#110) +- [c4322e7](https://github.com/stashed/elasticsearch/commit/c4322e7) [cherry-pick] Build docker image in release workflow (#96) (#102) + + +### [7.2.0-beta.20200709](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-beta.20200709) + +- [bf94d4d](https://github.com/stashed/elasticsearch/commit/bf94d4d) Prepare for release 7.2.0-beta.20200709 (#111) +- [d1cdabd](https://github.com/stashed/elasticsearch/commit/d1cdabd) [cherry-pick] Build docker image in release workflow (#96) (#103) + + +### [7.3.2-beta.20200709](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-beta.20200709) + +- [d0e8ff7](https://github.com/stashed/elasticsearch/commit/d0e8ff7) Prepare for release 7.3.2-beta.20200709 (#112) +- [0b0df2e](https://github.com/stashed/elasticsearch/commit/0b0df2e) [cherry-pick] Build docker image in release workflow (#96) (#104) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v0.10.0-beta.1](https://github.com/stashed/installer/releases/tag/v0.10.0-beta.1) + +- [bed8319](https://github.com/stashed/installer/commit/bed8319) Prepare for release v0.10.0-beta.1 (#76) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.1-beta.20200709](https://github.com/stashed/mongodb/releases/tag/3.4.1-beta.20200709) + +- [a354b6c](https://github.com/stashed/mongodb/commit/a354b6c) Prepare for release 3.4.1-beta.20200709 (#114) +- [2269fa6](https://github.com/stashed/mongodb/commit/2269fa6) [cherry-pick] Build docker image in release workflow (#102) (#103) + + +### [3.4.2-beta.20200709](https://github.com/stashed/mongodb/releases/tag/3.4.2-beta.20200709) + +- [735aea9](https://github.com/stashed/mongodb/commit/735aea9) Prepare for release 3.4.2-beta.20200709 (#115) +- [b871884](https://github.com/stashed/mongodb/commit/b871884) [cherry-pick] Build docker image in release workflow (#102) (#104) + + +### [3.6.1-beta.20200709](https://github.com/stashed/mongodb/releases/tag/3.6.1-beta.20200709) + +- [38ec877](https://github.com/stashed/mongodb/commit/38ec877) Prepare for release 3.6.1-beta.20200709 (#116) +- [6fd28b2](https://github.com/stashed/mongodb/commit/6fd28b2) [cherry-pick] Build docker image in release workflow (#102) (#105) + + +### [3.6.8-beta.20200709](https://github.com/stashed/mongodb/releases/tag/3.6.8-beta.20200709) + +- [a95f051](https://github.com/stashed/mongodb/commit/a95f051) Prepare for release 3.6.8-beta.20200709 (#117) +- [8f74e62](https://github.com/stashed/mongodb/commit/8f74e62) [cherry-pick] Build docker image in release workflow (#102) (#106) + + +### [4.0.1-beta.20200709](https://github.com/stashed/mongodb/releases/tag/4.0.1-beta.20200709) + +- [4168a4b](https://github.com/stashed/mongodb/commit/4168a4b) Prepare for release 4.0.1-beta.20200709 (#118) +- [90723f4](https://github.com/stashed/mongodb/commit/90723f4) [cherry-pick] Build docker image in release workflow (#102) (#107) + + +### [4.0.3-beta.20200709](https://github.com/stashed/mongodb/releases/tag/4.0.3-beta.20200709) + +- [b7719bd](https://github.com/stashed/mongodb/commit/b7719bd) Prepare for release 4.0.3-beta.20200709 (#119) +- [7c9074d](https://github.com/stashed/mongodb/commit/7c9074d) [cherry-pick] Build docker image in release workflow (#102) (#108) + + +### [4.0.5-beta.20200709](https://github.com/stashed/mongodb/releases/tag/4.0.5-beta.20200709) + +- [78ab8d2](https://github.com/stashed/mongodb/commit/78ab8d2) Prepare for release 4.0.5-beta.20200709 (#120) +- [12af669](https://github.com/stashed/mongodb/commit/12af669) [cherry-pick] Build docker image in release workflow (#102) (#109) + + +### [4.1.1-beta.20200709](https://github.com/stashed/mongodb/releases/tag/4.1.1-beta.20200709) + +- [923bd88](https://github.com/stashed/mongodb/commit/923bd88) Prepare for release 4.1.1-beta.20200709 (#121) +- [2bae7f7](https://github.com/stashed/mongodb/commit/2bae7f7) [cherry-pick] Build docker image in release workflow (#102) (#110) + + +### [4.1.4-beta.20200709](https://github.com/stashed/mongodb/releases/tag/4.1.4-beta.20200709) + +- [e3cd383](https://github.com/stashed/mongodb/commit/e3cd383) Prepare for release 4.1.4-beta.20200709 (#122) +- [a310c43](https://github.com/stashed/mongodb/commit/a310c43) [cherry-pick] Build docker image in release workflow (#102) (#111) + + +### [4.1.7-beta.20200709](https://github.com/stashed/mongodb/releases/tag/4.1.7-beta.20200709) + +- [3eccd08](https://github.com/stashed/mongodb/commit/3eccd08) Prepare for release 4.1.7-beta.20200709 (#123) +- [6377c55](https://github.com/stashed/mongodb/commit/6377c55) [cherry-pick] Build docker image in release workflow (#102) (#112) + + +### [4.2.3-beta.20200709](https://github.com/stashed/mongodb/releases/tag/4.2.3-beta.20200709) + +- [149e6ba](https://github.com/stashed/mongodb/commit/149e6ba) Prepare for release 4.2.3-beta.20200709 (#124) +- [47879da](https://github.com/stashed/mongodb/commit/47879da) [cherry-pick] Build docker image in release workflow (#102) (#113) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-beta.20200709](https://github.com/stashed/mysql/releases/tag/5.7.25-beta.20200709) + +- [422a411](https://github.com/stashed/mysql/commit/422a411) Prepare for release 5.7.25-beta.20200709 (#63) +- [e345110](https://github.com/stashed/mysql/commit/e345110) [cherry-pick] Build docker image in release workflow (#59) (#60) + + +### [8.0.3-beta.20200709](https://github.com/stashed/mysql/releases/tag/8.0.3-beta.20200709) + +- [ced3feb](https://github.com/stashed/mysql/commit/ced3feb) Prepare for release 8.0.3-beta.20200709 (#65) +- [8299693](https://github.com/stashed/mysql/commit/8299693) [cherry-pick] Build docker image in release workflow (#59) (#62) + + +### [8.0.14-beta.20200709](https://github.com/stashed/mysql/releases/tag/8.0.14-beta.20200709) + +- [bf2dd2d](https://github.com/stashed/mysql/commit/bf2dd2d) Prepare for release 8.0.14-beta.20200709 (#64) +- [226b3a9](https://github.com/stashed/mysql/commit/226b3a9) [cherry-pick] Build docker image in release workflow (#59) (#61) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-beta.20200709](https://github.com/stashed/percona-xtradb/releases/tag/5.7-beta.20200709) + +- [7fc07cc](https://github.com/stashed/percona-xtradb/commit/7fc07cc) Prepare for release 5.7-beta.20200709 (#38) +- [ca32b31](https://github.com/stashed/percona-xtradb/commit/ca32b31) [cherry-pick] Build docker image in release workflow (#36) (#37) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6-beta.20200709](https://github.com/stashed/postgres/releases/tag/9.6-beta.20200709) + +- [5befa82](https://github.com/stashed/postgres/commit/5befa82) Prepare for release 9.6-beta.20200709 (#100) +- [52fab57](https://github.com/stashed/postgres/commit/52fab57) [cherry-pick] Build docker images in release workflow (#90) (#95) + + +### [10.2-beta.20200709](https://github.com/stashed/postgres/releases/tag/10.2-beta.20200709) + +- [d8a2be0](https://github.com/stashed/postgres/commit/d8a2be0) Prepare for release 10.2-beta.20200709 (#96) +- [0bba297](https://github.com/stashed/postgres/commit/0bba297) [cherry-pick] Build docker images in release workflow (#90) (#91) + + +### [10.6-beta.20200709](https://github.com/stashed/postgres/releases/tag/10.6-beta.20200709) + +- [78fdd94](https://github.com/stashed/postgres/commit/78fdd94) Prepare for release 10.6-beta.20200709 (#97) +- [c70d2d9](https://github.com/stashed/postgres/commit/c70d2d9) [cherry-pick] Build docker images in release workflow (#90) (#92) + + +### [11.1-beta.20200709](https://github.com/stashed/postgres/releases/tag/11.1-beta.20200709) + +- [81b21f0](https://github.com/stashed/postgres/commit/81b21f0) Prepare for release 11.1-beta.20200709 (#98) +- [4fc87ef](https://github.com/stashed/postgres/commit/4fc87ef) [cherry-pick] Build docker images in release workflow (#90) (#93) + + +### [11.2-beta.20200709](https://github.com/stashed/postgres/releases/tag/11.2-beta.20200709) + +- [a3efd1a](https://github.com/stashed/postgres/commit/a3efd1a) Prepare for release 11.2-beta.20200709 (#99) +- [c0a32e5](https://github.com/stashed/postgres/commit/c0a32e5) [cherry-pick] Build docker images in release workflow (#90) (#94) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.10.0-beta.1](https://github.com/stashed/stash/releases/tag/v0.10.0-beta.1) + +- [3b717aac](https://github.com/stashed/stash/commit/3b717aac) Prepare for release v0.10.0-beta.1 (#1146) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2020.08.26-rc.0.md b/content/docs/v2024.12.18/CHANGELOG-v2020.08.26-rc.0.md new file mode 100644 index 0000000000..35add1b025 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2020.08.26-rc.0.md @@ -0,0 +1,644 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2020.08.26-rc.0 + name: Changelog-v2020.08.26-rc.0 + parent: welcome + weight: 20200826 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2020.08.26-rc.0/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2020.08.26-rc.0/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2020.08.26-rc.0 (2020-08-26) + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.10.0-rc.0](https://github.com/stashed/apimachinery/releases/tag/v0.10.0-rc.0) + +- [254ee64e](https://github.com/stashed/apimachinery/commit/254ee64e) Rename param annotation (#42) +- [2210ed42](https://github.com/stashed/apimachinery/commit/2210ed42) Update Kubernetes v1.18.3 dependencies (#41) +- [835c0358](https://github.com/stashed/apimachinery/commit/835c0358) Update Kubernetes v1.18.3 dependencies (#40) +- [692909fe](https://github.com/stashed/apimachinery/commit/692909fe) Add params and schedule annotation (#38) +- [b9ff4f14](https://github.com/stashed/apimachinery/commit/b9ff4f14) Update Kubernetes v1.18.3 dependencies (#37) +- [c44c52c8](https://github.com/stashed/apimachinery/commit/c44c52c8) Update Kubernetes v1.18.3 dependencies (#36) +- [073a93c8](https://github.com/stashed/apimachinery/commit/073a93c8) Rename StashLocalBackendAccessor to StashNetVolAccessor (#35) +- [e29c2724](https://github.com/stashed/apimachinery/commit/e29c2724) Update Kubernetes v1.18.3 dependencies (#34) +- [a4807149](https://github.com/stashed/apimachinery/commit/a4807149) Update Kubernetes v1.18.3 dependencies (#33) +- [d6fcb2c6](https://github.com/stashed/apimachinery/commit/d6fcb2c6) Fix protobuf tags (#32) +- [d255d800](https://github.com/stashed/apimachinery/commit/d255d800) Pass target reference for restore job condition (#31) +- [a3ce1cee](https://github.com/stashed/apimachinery/commit/a3ce1cee) Add helper method for NFS backend (#30) +- [a4be15a1](https://github.com/stashed/apimachinery/commit/a4be15a1) Introduce RestoreBatch CRD + Additional Improvements (#22) +- [710228f4](https://github.com/stashed/apimachinery/commit/710228f4) Update to Kubernetes v1.18.3 (#29) +- [0f69a3ab](https://github.com/stashed/apimachinery/commit/0f69a3ab) Update to Kubernetes v1.18.3 (#28) +- [504a57e7](https://github.com/stashed/apimachinery/commit/504a57e7) Update to Kubernetes v1.18.3 (#27) +- [843421e4](https://github.com/stashed/apimachinery/commit/843421e4) Show AppsCode in copyright file header (#26) +- [ad462cc4](https://github.com/stashed/apimachinery/commit/ad462cc4) Update to Kubernetes v1.18.3 (#25) +- [28d53699](https://github.com/stashed/apimachinery/commit/28d53699) Update update-release-tracker.sh +- [34624044](https://github.com/stashed/apimachinery/commit/34624044) Update update-release-tracker.sh +- [5f5de63c](https://github.com/stashed/apimachinery/commit/5f5de63c) Fix openapi path (#24) +- [6e0ad5f8](https://github.com/stashed/apimachinery/commit/6e0ad5f8) Add script to update release tracker on pr merge (#23) +- [cbf9b376](https://github.com/stashed/apimachinery/commit/cbf9b376) Update .kodiak.toml +- [d12b3d4b](https://github.com/stashed/apimachinery/commit/d12b3d4b) Update to Kubernetes v1.18.3 (#21) +- [1956a312](https://github.com/stashed/apimachinery/commit/1956a312) Update to Kubernetes v1.18.3 +- [c3966002](https://github.com/stashed/apimachinery/commit/c3966002) Unwrap top level api folder (#20) +- [5ba03fb5](https://github.com/stashed/apimachinery/commit/5ba03fb5) Update to Kubernetes v1.18.3 (#19) +- [abeb620e](https://github.com/stashed/apimachinery/commit/abeb620e) Update to Kubernetes v1.18.3 +- [6fdf8a60](https://github.com/stashed/apimachinery/commit/6fdf8a60) Enable https://kodiakhq.com (#13) +- [479258ed](https://github.com/stashed/apimachinery/commit/479258ed) Update dev scripts (#12) +- [a85ced99](https://github.com/stashed/apimachinery/commit/a85ced99) Merge pull request #11 from stashed/k8s-gomod-refresher-1591208266 +- [82df6f26](https://github.com/stashed/apimachinery/commit/82df6f26) Update to Kubernetes v1.18.3 +- [788f6921](https://github.com/stashed/apimachinery/commit/788f6921) Add default annotation for Snapshotter (#9) +- [d2f3f5d4](https://github.com/stashed/apimachinery/commit/d2f3f5d4) Remove defaults from crd v1beta1 YAML (#8) +- [1a09ffde](https://github.com/stashed/apimachinery/commit/1a09ffde) Update dependencies +- [58525b4b](https://github.com/stashed/apimachinery/commit/58525b4b) Update dependencies +- [c34c2ec1](https://github.com/stashed/apimachinery/commit/c34c2ec1) Generate both v1beta1 and v1 CRD YAML (#7) +- [e81205a3](https://github.com/stashed/apimachinery/commit/e81205a3) Bring back mistakenly removed SetRecoveryStats +- [5f8cf3a6](https://github.com/stashed/apimachinery/commit/5f8cf3a6) Merge pull request #6 from stashed/k-1.18.3 +- [723f4de9](https://github.com/stashed/apimachinery/commit/723f4de9) Add context to crd utils +- [59478af4](https://github.com/stashed/apimachinery/commit/59478af4) Update to Kubernetes 1.18.3 +- [e83b90a7](https://github.com/stashed/apimachinery/commit/e83b90a7) Merge pull request #3 from stashed/wait-for-target +- [a5b9a011](https://github.com/stashed/apimachinery/commit/a5b9a011) Simplify targetMatched() function +- [58948bd9](https://github.com/stashed/apimachinery/commit/58948bd9) Refactor +- [5568cb90](https://github.com/stashed/apimachinery/commit/5568cb90) Add RestoreSession conditions +- [906c5910](https://github.com/stashed/apimachinery/commit/906c5910) Add TypeMeta to invoker +- [22843fdb](https://github.com/stashed/apimachinery/commit/22843fdb) Use Go 1.14.3 +- [238d1bd0](https://github.com/stashed/apimachinery/commit/238d1bd0) Add backup invoker condition transion reasons +- [275965f9](https://github.com/stashed/apimachinery/commit/275965f9) Introduce conditions for BackupConfiguration and BackupBatch +- [35159c81](https://github.com/stashed/apimachinery/commit/35159c81) Merge pull request #5 from stashed/fix-updatestatus +- [f1d78326](https://github.com/stashed/apimachinery/commit/f1d78326) Fix helper methods +- [dbb02873](https://github.com/stashed/apimachinery/commit/dbb02873) Fix UpdateStatus() function +- [a7bd75ad](https://github.com/stashed/apimachinery/commit/a7bd75ad) Update crazy-max/ghaction-docker-buildx flag +- [1d65a7d4](https://github.com/stashed/apimachinery/commit/1d65a7d4) Use recommended kubernetes app labels (#4) +- [5b322e9f](https://github.com/stashed/apimachinery/commit/5b322e9f) Add Enum markers to api types +- [e6017151](https://github.com/stashed/apimachinery/commit/e6017151) Trigger the workflow on push or pull request +- [54097441](https://github.com/stashed/apimachinery/commit/54097441) Use kubectl v1.17 (#1) + + + +## [stashed/catalog](https://github.com/stashed/catalog) + +### [v2020.08.26-rc.0](https://github.com/stashed/catalog/releases/tag/v2020.08.26-rc.0) + + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.10.0-rc.0](https://github.com/stashed/cli/releases/tag/v0.10.0-rc.0) + +- [fdfe6b8](https://github.com/stashed/cli/commit/fdfe6b8) Prepare for release v0.10.0-rc.0 (#38) +- [132ae15](https://github.com/stashed/cli/commit/132ae15) Fix build (#37) +- [77a76a7](https://github.com/stashed/cli/commit/77a76a7) Update Kubernetes v1.18.3 dependencies (#36) +- [efe0fc5](https://github.com/stashed/cli/commit/efe0fc5) Update Kubernetes v1.18.3 dependencies (#35) +- [d39bd97](https://github.com/stashed/cli/commit/d39bd97) Update Kubernetes v1.18.3 dependencies (#34) +- [3e074e7](https://github.com/stashed/cli/commit/3e074e7) Update Kubernetes v1.18.3 dependencies (#33) +- [f020137](https://github.com/stashed/cli/commit/f020137) Update Kubernetes v1.18.3 dependencies (#32) +- [99d27f0](https://github.com/stashed/cli/commit/99d27f0) Update Kubernetes v1.18.3 dependencies (#31) +- [3c78ec5](https://github.com/stashed/cli/commit/3c78ec5) Use actions/upload-artifact@v2 +- [e416569](https://github.com/stashed/cli/commit/e416569) Update to Kubernetes v1.18.3 (#30) +- [2baaae1](https://github.com/stashed/cli/commit/2baaae1) Update to Kubernetes v1.18.3 (#29) +- [44a1514](https://github.com/stashed/cli/commit/44a1514) Update to Kubernetes v1.18.3 (#28) +- [250372c](https://github.com/stashed/cli/commit/250372c) Prepare for release v0.10.0-beta.1 (#27) +- [3728110](https://github.com/stashed/cli/commit/3728110) Prepare for release v0.10.0-beta.0 (#26) +- [e7111a5](https://github.com/stashed/cli/commit/e7111a5) Update License +- [7fe1e07](https://github.com/stashed/cli/commit/7fe1e07) Update to Kubernetes v1.18.3 (#25) +- [66b3b46](https://github.com/stashed/cli/commit/66b3b46) Shorten command name for cli (#24) +- [b913cfc](https://github.com/stashed/cli/commit/b913cfc) Add workflow to update docs (#23) +- [1881c64](https://github.com/stashed/cli/commit/1881c64) Update update-release-tracker.sh +- [0548bdc](https://github.com/stashed/cli/commit/0548bdc) Update update-release-tracker.sh +- [b1b28ff](https://github.com/stashed/cli/commit/b1b28ff) Use GITHUB_BASE_REF to detect target branch +- [1e16b99](https://github.com/stashed/cli/commit/1e16b99) Add script to update release tracker on pr merge (#21) +- [f91bf33](https://github.com/stashed/cli/commit/f91bf33) Make release non-draft +- [d29bdb6](https://github.com/stashed/cli/commit/d29bdb6) Update .kodiak.toml +- [b727108](https://github.com/stashed/cli/commit/b727108) Update to Kubernetes v1.18.3 (#20) +- [f3f03aa](https://github.com/stashed/cli/commit/f3f03aa) Update to Kubernetes v1.18.3 +- [bcd7c5e](https://github.com/stashed/cli/commit/bcd7c5e) Create .kodiak.toml +- [9882aa2](https://github.com/stashed/cli/commit/9882aa2) Add blank line after license header (#19) +- [7774218](https://github.com/stashed/cli/commit/7774218) Update dev scripts (#18) +- [38eb35c](https://github.com/stashed/cli/commit/38eb35c) Run unit tests against SRC_PKGS +- [526949c](https://github.com/stashed/cli/commit/526949c) Update to Kubernetes v1.18.3 (#17) +- [fc3e6c5](https://github.com/stashed/cli/commit/fc3e6c5) Update crazy-max/ghaction-docker-buildx flag +- [3943575](https://github.com/stashed/cli/commit/3943575) Trigger the workflow on push or pull request + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-beta.20200826](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-beta.20200826) + +- [df82b88](https://github.com/stashed/elasticsearch/commit/df82b88) Prepare for release 5.6.4-beta.20200826 (#158) +- [465a9f0](https://github.com/stashed/elasticsearch/commit/465a9f0) [cherry-pick] Update Stash installation link (#149) (#150) +- [4fd2af7](https://github.com/stashed/elasticsearch/commit/4fd2af7) [cherry-pick] Make image.tag in values.yaml file same as the $APP_VERSION (#132) (#141) +- [f9f6ab1](https://github.com/stashed/elasticsearch/commit/f9f6ab1) [cherry-pick] Fix output format + Add PreBackupActions logic (#131) (#133) +- [cf70698](https://github.com/stashed/elasticsearch/commit/cf70698) [cherry-pick] Update chart icon (#123) +- [f1c9257](https://github.com/stashed/elasticsearch/commit/f1c9257) [cherry-pick] Make chart registry configurable (#114) (#115) + + +### [6.2.4-beta.20200826](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-beta.20200826) + +- [6c3dfa5](https://github.com/stashed/elasticsearch/commit/6c3dfa5) Prepare for release 6.2.4-beta.20200826 (#159) +- [4aa0746](https://github.com/stashed/elasticsearch/commit/4aa0746) [cherry-pick] Update Stash installation link (#149) (#151) +- [9847b08](https://github.com/stashed/elasticsearch/commit/9847b08) [cherry-pick] Make image.tag in values.yaml file same as the $APP_VERSION (#132) (#142) +- [e13632d](https://github.com/stashed/elasticsearch/commit/e13632d) [cherry-pick] Fix output format + Add PreBackupActions logic (#131) (#134) +- [94dc85b](https://github.com/stashed/elasticsearch/commit/94dc85b) [cherry-pick] Update chart icon (#124) +- [efc6ad0](https://github.com/stashed/elasticsearch/commit/efc6ad0) [cherry-pick] Make chart registry configurable (#114) (#116) + + +### [6.3.0-beta.20200826](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-beta.20200826) + +- [4a32c49](https://github.com/stashed/elasticsearch/commit/4a32c49) Prepare for release 6.3.0-beta.20200826 (#160) +- [4bc4449](https://github.com/stashed/elasticsearch/commit/4bc4449) [cherry-pick] Update Stash installation link (#149) (#152) +- [31d3860](https://github.com/stashed/elasticsearch/commit/31d3860) [cherry-pick] Make image.tag in values.yaml file same as the $APP_VERSION (#132) (#143) +- [c19466a](https://github.com/stashed/elasticsearch/commit/c19466a) [cherry-pick] Fix output format + Add PreBackupActions logic (#131) (#135) +- [1aaa172](https://github.com/stashed/elasticsearch/commit/1aaa172) [cherry-pick] Update chart icon (#125) +- [30412a8](https://github.com/stashed/elasticsearch/commit/30412a8) [cherry-pick] Make chart registry configurable (#114) (#117) + + +### [6.4.0-beta.20200826](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-beta.20200826) + +- [0770775](https://github.com/stashed/elasticsearch/commit/0770775) Prepare for release 6.4.0-beta.20200826 (#161) +- [38be1db](https://github.com/stashed/elasticsearch/commit/38be1db) [cherry-pick] Update Stash installation link (#149) (#153) +- [87ca905](https://github.com/stashed/elasticsearch/commit/87ca905) [cherry-pick] Make image.tag in values.yaml file same as the $APP_VERSION (#132) (#144) +- [75dd0a5](https://github.com/stashed/elasticsearch/commit/75dd0a5) [cherry-pick] Fix output format + Add PreBackupActions logic (#131) (#136) +- [ad75b67](https://github.com/stashed/elasticsearch/commit/ad75b67) [cherry-pick] Update chart icon (#126) +- [e5e9c7b](https://github.com/stashed/elasticsearch/commit/e5e9c7b) [cherry-pick] Make chart registry configurable (#114) (#118) + + +### [6.5.3-beta.20200826](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-beta.20200826) + +- [58af00f](https://github.com/stashed/elasticsearch/commit/58af00f) Prepare for release 6.5.3-beta.20200826 (#162) +- [1365067](https://github.com/stashed/elasticsearch/commit/1365067) [cherry-pick] Update Stash installation link (#149) (#154) +- [16f9593](https://github.com/stashed/elasticsearch/commit/16f9593) [cherry-pick] Make image.tag in values.yaml file same as the $APP_VERSION (#132) (#145) +- [8413eba](https://github.com/stashed/elasticsearch/commit/8413eba) [cherry-pick] Fix output format + Add PreBackupActions logic (#131) (#137) +- [b0237a3](https://github.com/stashed/elasticsearch/commit/b0237a3) [cherry-pick] Update chart icon (#127) +- [daec12d](https://github.com/stashed/elasticsearch/commit/daec12d) [cherry-pick] Make chart registry configurable (#114) (#119) + + +### [6.8.0-beta.20200826](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-beta.20200826) + +- [8811915](https://github.com/stashed/elasticsearch/commit/8811915) Prepare for release 6.8.0-beta.20200826 (#163) +- [46e0b2a](https://github.com/stashed/elasticsearch/commit/46e0b2a) [cherry-pick] Update Stash installation link (#149) (#155) +- [9a00bba](https://github.com/stashed/elasticsearch/commit/9a00bba) [cherry-pick] Make image.tag in values.yaml file same as the $APP_VERSION (#132) (#146) +- [f0ae71f](https://github.com/stashed/elasticsearch/commit/f0ae71f) [cherry-pick] Fix output format + Add PreBackupActions logic (#131) (#138) +- [9561dd8](https://github.com/stashed/elasticsearch/commit/9561dd8) [cherry-pick] Update chart icon (#128) +- [bc40c89](https://github.com/stashed/elasticsearch/commit/bc40c89) [cherry-pick] Make chart registry configurable (#114) (#120) + + +### [7.2.0-beta.20200826](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-beta.20200826) + +- [bd2c6bc](https://github.com/stashed/elasticsearch/commit/bd2c6bc) Prepare for release 7.2.0-beta.20200826 (#164) +- [2c3a9e1](https://github.com/stashed/elasticsearch/commit/2c3a9e1) [cherry-pick] Update Stash installation link (#149) (#156) +- [c862e31](https://github.com/stashed/elasticsearch/commit/c862e31) [cherry-pick] Make image.tag in values.yaml file same as the $APP_VERSION (#132) (#147) +- [1010749](https://github.com/stashed/elasticsearch/commit/1010749) [cherry-pick] Fix output format + Add PreBackupActions logic (#131) (#139) +- [b0cac90](https://github.com/stashed/elasticsearch/commit/b0cac90) [cherry-pick] Update chart icon (#129) +- [abd52d3](https://github.com/stashed/elasticsearch/commit/abd52d3) [cherry-pick] Make chart registry configurable (#114) (#121) + + +### [7.3.2-beta.20200826](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-beta.20200826) + +- [a163678](https://github.com/stashed/elasticsearch/commit/a163678) Prepare for release 7.3.2-beta.20200826 (#165) +- [152792e](https://github.com/stashed/elasticsearch/commit/152792e) [cherry-pick] Update Stash installation link (#149) (#157) +- [2d0f427](https://github.com/stashed/elasticsearch/commit/2d0f427) [cherry-pick] Make image.tag in values.yaml file same as the $APP_VERSION (#132) (#148) +- [281a0ce](https://github.com/stashed/elasticsearch/commit/281a0ce) [cherry-pick] Fix output format + Add PreBackupActions logic (#131) (#140) +- [e89cbde](https://github.com/stashed/elasticsearch/commit/e89cbde) [cherry-pick] Update chart icon (#130) +- [a4c3327](https://github.com/stashed/elasticsearch/commit/a4c3327) [cherry-pick] Make chart registry configurable (#114) (#122) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v0.10.0-rc.0](https://github.com/stashed/installer/releases/tag/v0.10.0-rc.0) + +- [6018270](https://github.com/stashed/installer/commit/6018270) Prepare for release v0.10.0-rc.0 (#87) +- [9da1502](https://github.com/stashed/installer/commit/9da1502) Port changes from enterprise version (#85) +- [0838112](https://github.com/stashed/installer/commit/0838112) Add offline license verification (#84) +- [d869f33](https://github.com/stashed/installer/commit/d869f33) Always give use permission for baseline psp to operator (#83) +- [d1e0142](https://github.com/stashed/installer/commit/d1e0142) Support Snapshot listing for NFS backend without workload running (#80) +- [53bab27](https://github.com/stashed/installer/commit/53bab27) Pass imagePullSecrets as operator flag (#71) +- [4e3a984](https://github.com/stashed/installer/commit/4e3a984) Update to Kubernetes v1.18.3 (#79) +- [6e57dd4](https://github.com/stashed/installer/commit/6e57dd4) Update to Kubernetes v1.18.3 (#78) +- [5c681fe](https://github.com/stashed/installer/commit/5c681fe) Update to Kubernetes v1.18.3 (#77) +- [c268a57](https://github.com/stashed/installer/commit/c268a57) Make chart registry configurable +- [bed8319](https://github.com/stashed/installer/commit/bed8319) Prepare for release v0.10.0-beta.1 (#76) +- [cd44ba9](https://github.com/stashed/installer/commit/cd44ba9) Prepare for release v0.10.0-beta.0 (#75) +- [a04e173](https://github.com/stashed/installer/commit/a04e173) Publish to testing dir for alpha/beta releases +- [4b23e1c](https://github.com/stashed/installer/commit/4b23e1c) Update License (#74) +- [9b7a4e0](https://github.com/stashed/installer/commit/9b7a4e0) Update to Kubernetes v1.18.3 (#72) +- [4318306](https://github.com/stashed/installer/commit/4318306) Update ci.yml +- [15d1594](https://github.com/stashed/installer/commit/15d1594) Fix Stash Enterprise installer (#70) +- [31c9dcc](https://github.com/stashed/installer/commit/31c9dcc) Tag chart and app version as string for yq (#69) +- [1782049](https://github.com/stashed/installer/commit/1782049) Update links (#68) +- [634da4d](https://github.com/stashed/installer/commit/634da4d) Update update-release-tracker.sh +- [1155610](https://github.com/stashed/installer/commit/1155610) Update update-release-tracker.sh +- [1b10b5e](https://github.com/stashed/installer/commit/1b10b5e) Add script to update release tracker on pr merge (#67) +- [ce0b28e](https://github.com/stashed/installer/commit/ce0b28e) Update release workflow +- [c3ac668](https://github.com/stashed/installer/commit/c3ac668) Update ci.yml +- [98bad7e](https://github.com/stashed/installer/commit/98bad7e) Add Stash Enterprise chart (#63) +- [73f52a6](https://github.com/stashed/installer/commit/73f52a6) Add commands to update chart (#65) +- [0dc7f91](https://github.com/stashed/installer/commit/0dc7f91) Fix chart release process (#64) +- [0d5c4e1](https://github.com/stashed/installer/commit/0d5c4e1) Update .kodiak.toml +- [3b53e64](https://github.com/stashed/installer/commit/3b53e64) Update to Kubernetes v1.18.3 (#58) +- [43c5dbe](https://github.com/stashed/installer/commit/43c5dbe) Update to Kubernetes v1.18.3 +- [b9e784c](https://github.com/stashed/installer/commit/b9e784c) Create .kodiak.toml +- [b30b3b0](https://github.com/stashed/installer/commit/b30b3b0) Merge pull request #57 from stashed/psp +- [1b89401](https://github.com/stashed/installer/commit/1b89401) Disable apparmor and seccomp by default +- [6bed1aa](https://github.com/stashed/installer/commit/6bed1aa) Pass psp names for the jobs through flag +- [bd35d81](https://github.com/stashed/installer/commit/bd35d81) Always use baseline psp for stash +- [4e3474a](https://github.com/stashed/installer/commit/4e3474a) Add RBAC permission for generic-garbage-collector (#56) +- [be006f6](https://github.com/stashed/installer/commit/be006f6) Permit configmap list/watch -ing for delegated authentication checking (#55) +- [5685c15](https://github.com/stashed/installer/commit/5685c15) Update dependencies +- [8b7b805](https://github.com/stashed/installer/commit/8b7b805) Update dependencies +- [d2b2b09](https://github.com/stashed/installer/commit/d2b2b09) Generate both v1beta1 and v1 CRD YAML (#54) +- [7fbcb29](https://github.com/stashed/installer/commit/7fbcb29) Update to Kubernetes v1.18.3 (#53) +- [88e5e8c](https://github.com/stashed/installer/commit/88e5e8c) Use Go 1.14.3 +- [8e56cb1](https://github.com/stashed/installer/commit/8e56cb1) Trigger build on push to only master branch +- [562caf8](https://github.com/stashed/installer/commit/562caf8) Use recommended kubernetes app labels (#52) +- [cc55e5a](https://github.com/stashed/installer/commit/cc55e5a) Trigger the workflow on push or pull request +- [fd8acf5](https://github.com/stashed/installer/commit/fd8acf5) Update chart readme +- [672f37e](https://github.com/stashed/installer/commit/672f37e) Show examples in chart readme +- [39f4ca1](https://github.com/stashed/installer/commit/39f4ca1) Auto generate chart readme file (#50) +- [47f4250](https://github.com/stashed/installer/commit/47f4250) Update release.yml +- [b68d9cb](https://github.com/stashed/installer/commit/b68d9cb) Cleanup newlines +- [20d51b0](https://github.com/stashed/installer/commit/20d51b0) Reformat stash chart template (#49) +- [65f8bee](https://github.com/stashed/installer/commit/65f8bee) Use kubectl v1.16 as cleaner (#48) +- [85a7cfd](https://github.com/stashed/installer/commit/85a7cfd) Rename prometheus.io/coreos-operator to prometheus.io/operator (#47) +- [b042def](https://github.com/stashed/installer/commit/b042def) Move apireg annotation to operator pod (#46) +- [a543953](https://github.com/stashed/installer/commit/a543953) Various cleanup (#44) +- [b6e2bec](https://github.com/stashed/installer/commit/b6e2bec) Fix helm install --wait flag (#42) +- [806aada](https://github.com/stashed/installer/commit/806aada) Do not harcode namespace (#40) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.1-beta.20200826](https://github.com/stashed/mongodb/releases/tag/3.4.1-beta.20200826) + +- [1c08dfd](https://github.com/stashed/mongodb/commit/1c08dfd) Prepare for release 3.4.1-beta.20200826 (#185) +- [a4d2b49](https://github.com/stashed/mongodb/commit/a4d2b49) [cherry-pick] Update Stash installation link (#173) (#174) +- [3ae949e](https://github.com/stashed/mongodb/commit/3ae949e) [cherry-pick] Fix output format + Add PreBackupActions logic (#149) (#162) +- [75ebc36](https://github.com/stashed/mongodb/commit/75ebc36) [cherry-pick] Make image.tag in values.yaml same as $APP_VERSION (#150) (#151) +- [c261899](https://github.com/stashed/mongodb/commit/c261899) [cherry-pick] Update chart icon (#138) +- [465f36c](https://github.com/stashed/mongodb/commit/465f36c) [cherry-pick] Make chart registry configurable (#126) (#127) + + +### [3.4.2-beta.20200826](https://github.com/stashed/mongodb/releases/tag/3.4.2-beta.20200826) + +- [b9d6d4d](https://github.com/stashed/mongodb/commit/b9d6d4d) Prepare for release 3.4.2-beta.20200826 (#186) +- [adf04e8](https://github.com/stashed/mongodb/commit/adf04e8) [cherry-pick] Update Stash installation link (#173) (#175) +- [bdd4240](https://github.com/stashed/mongodb/commit/bdd4240) [cherry-pick] Fix output format + Add PreBackupActions logic (#149) (#163) +- [2078ffb](https://github.com/stashed/mongodb/commit/2078ffb) [cherry-pick] Make image.tag in values.yaml same as $APP_VERSION (#150) (#152) +- [848c360](https://github.com/stashed/mongodb/commit/848c360) [cherry-pick] Update chart icon (#139) +- [20e0d4f](https://github.com/stashed/mongodb/commit/20e0d4f) [cherry-pick] Make chart registry configurable (#126) (#128) + + +### [3.6.1-beta.20200826](https://github.com/stashed/mongodb/releases/tag/3.6.1-beta.20200826) + +- [fbf6dfb](https://github.com/stashed/mongodb/commit/fbf6dfb) Prepare for release 3.6.1-beta.20200826 (#187) +- [50d9b51](https://github.com/stashed/mongodb/commit/50d9b51) [cherry-pick] Update Stash installation link (#173) (#176) +- [138c910](https://github.com/stashed/mongodb/commit/138c910) [cherry-pick] Fix output format + Add PreBackupActions logic (#149) (#164) +- [95d8800](https://github.com/stashed/mongodb/commit/95d8800) [cherry-pick] Make image.tag in values.yaml same as $APP_VERSION (#150) (#153) +- [f6dcc94](https://github.com/stashed/mongodb/commit/f6dcc94) [cherry-pick] Update chart icon (#140) +- [0449fbf](https://github.com/stashed/mongodb/commit/0449fbf) [cherry-pick] Make chart registry configurable (#126) (#129) + + +### [3.6.8-beta.20200826](https://github.com/stashed/mongodb/releases/tag/3.6.8-beta.20200826) + +- [a2098a8](https://github.com/stashed/mongodb/commit/a2098a8) Prepare for release 3.6.8-beta.20200826 (#188) +- [81cad93](https://github.com/stashed/mongodb/commit/81cad93) [cherry-pick] Update Stash installation link (#173) (#177) +- [0711cec](https://github.com/stashed/mongodb/commit/0711cec) [cherry-pick] Fix output format + Add PreBackupActions logic (#149) (#165) +- [cd921b7](https://github.com/stashed/mongodb/commit/cd921b7) [cherry-pick] Make image.tag in values.yaml same as $APP_VERSION (#150) (#154) +- [5d29173](https://github.com/stashed/mongodb/commit/5d29173) [cherry-pick] Update chart icon (#141) +- [a8265a7](https://github.com/stashed/mongodb/commit/a8265a7) [cherry-pick] Make chart registry configurable (#126) (#130) + + +### [4.0.1-beta.20200826](https://github.com/stashed/mongodb/releases/tag/4.0.1-beta.20200826) + +- [b794eee](https://github.com/stashed/mongodb/commit/b794eee) Prepare for release 4.0.1-beta.20200826 (#189) +- [8e835ce](https://github.com/stashed/mongodb/commit/8e835ce) [cherry-pick] Update Stash installation link (#173) (#178) +- [0025cc4](https://github.com/stashed/mongodb/commit/0025cc4) [cherry-pick] Fix output format + Add PreBackupActions logic (#149) (#166) +- [bc8f7a5](https://github.com/stashed/mongodb/commit/bc8f7a5) [cherry-pick] Make image.tag in values.yaml same as $APP_VERSION (#150) (#155) +- [7b0bb50](https://github.com/stashed/mongodb/commit/7b0bb50) [cherry-pick] Update chart icon (#142) +- [a9621b6](https://github.com/stashed/mongodb/commit/a9621b6) [cherry-pick] Make chart registry configurable (#126) (#131) + + +### [4.0.3-beta.20200826](https://github.com/stashed/mongodb/releases/tag/4.0.3-beta.20200826) + +- [fd4d40e](https://github.com/stashed/mongodb/commit/fd4d40e) Prepare for release 4.0.3-beta.20200826 (#190) +- [3b2f40b](https://github.com/stashed/mongodb/commit/3b2f40b) [cherry-pick] Update Stash installation link (#173) (#179) +- [5ba31a4](https://github.com/stashed/mongodb/commit/5ba31a4) [cherry-pick] Fix output format + Add PreBackupActions logic (#149) (#167) +- [349f6c0](https://github.com/stashed/mongodb/commit/349f6c0) [cherry-pick] Make image.tag in values.yaml same as $APP_VERSION (#150) (#156) +- [eb32485](https://github.com/stashed/mongodb/commit/eb32485) [cherry-pick] Update chart icon (#143) +- [e2b05d8](https://github.com/stashed/mongodb/commit/e2b05d8) [cherry-pick] Make chart registry configurable (#126) (#132) + + +### [4.0.5-beta.20200826](https://github.com/stashed/mongodb/releases/tag/4.0.5-beta.20200826) + +- [1bbff77](https://github.com/stashed/mongodb/commit/1bbff77) Prepare for release 4.0.5-beta.20200826 (#191) +- [51d0388](https://github.com/stashed/mongodb/commit/51d0388) [cherry-pick] Update Stash installation link (#173) (#180) +- [444ed15](https://github.com/stashed/mongodb/commit/444ed15) [cherry-pick] Fix output format + Add PreBackupActions logic (#149) (#168) +- [00cfb11](https://github.com/stashed/mongodb/commit/00cfb11) [cherry-pick] Make image.tag in values.yaml same as $APP_VERSION (#150) (#157) +- [8a0c6ce](https://github.com/stashed/mongodb/commit/8a0c6ce) [cherry-pick] Update chart icon (#144) +- [e514864](https://github.com/stashed/mongodb/commit/e514864) [cherry-pick] Make chart registry configurable (#126) (#133) + + +### [4.1.1-beta.20200826](https://github.com/stashed/mongodb/releases/tag/4.1.1-beta.20200826) + +- [ad80c46](https://github.com/stashed/mongodb/commit/ad80c46) Prepare for release 4.1.1-beta.20200826 (#192) +- [a6017d0](https://github.com/stashed/mongodb/commit/a6017d0) [cherry-pick] Update Stash installation link (#173) (#181) +- [bbb9a42](https://github.com/stashed/mongodb/commit/bbb9a42) [cherry-pick] Fix output format + Add PreBackupActions logic (#149) (#169) +- [a207fd0](https://github.com/stashed/mongodb/commit/a207fd0) [cherry-pick] Make image.tag in values.yaml same as $APP_VERSION (#150) (#158) +- [f877621](https://github.com/stashed/mongodb/commit/f877621) [cherry-pick] Update chart icon (#145) +- [628df7e](https://github.com/stashed/mongodb/commit/628df7e) [cherry-pick] Make chart registry configurable (#126) (#134) + + +### [4.1.4-beta.20200826](https://github.com/stashed/mongodb/releases/tag/4.1.4-beta.20200826) + +- [c092f8a](https://github.com/stashed/mongodb/commit/c092f8a) Prepare for release 4.1.4-beta.20200826 (#193) +- [cbb683a](https://github.com/stashed/mongodb/commit/cbb683a) [cherry-pick] Update Stash installation link (#173) (#182) +- [f8b1f2c](https://github.com/stashed/mongodb/commit/f8b1f2c) [cherry-pick] Fix output format + Add PreBackupActions logic (#149) (#170) +- [b99744e](https://github.com/stashed/mongodb/commit/b99744e) [cherry-pick] Make image.tag in values.yaml same as $APP_VERSION (#150) (#159) +- [9ee1654](https://github.com/stashed/mongodb/commit/9ee1654) [cherry-pick] Update chart icon (#146) +- [8604d7b](https://github.com/stashed/mongodb/commit/8604d7b) [cherry-pick] Make chart registry configurable (#126) (#135) + + +### [4.1.7-beta.20200826](https://github.com/stashed/mongodb/releases/tag/4.1.7-beta.20200826) + +- [8334c89](https://github.com/stashed/mongodb/commit/8334c89) Prepare for release 4.1.7-beta.20200826 (#194) +- [905bdde](https://github.com/stashed/mongodb/commit/905bdde) [cherry-pick] Update Stash installation link (#173) (#183) +- [1eea836](https://github.com/stashed/mongodb/commit/1eea836) [cherry-pick] Fix output format + Add PreBackupActions logic (#149) (#171) +- [52c06d6](https://github.com/stashed/mongodb/commit/52c06d6) [cherry-pick] Make image.tag in values.yaml same as $APP_VERSION (#150) (#160) +- [7765f65](https://github.com/stashed/mongodb/commit/7765f65) [cherry-pick] Update chart icon (#147) +- [7426cba](https://github.com/stashed/mongodb/commit/7426cba) [cherry-pick] Make chart registry configurable (#126) (#136) + + +### [4.2.3-beta.20200826](https://github.com/stashed/mongodb/releases/tag/4.2.3-beta.20200826) + +- [244da2c](https://github.com/stashed/mongodb/commit/244da2c) Prepare for release 4.2.3-beta.20200826 (#195) +- [953e51f](https://github.com/stashed/mongodb/commit/953e51f) Update Stash installation link (#173) (#184) +- [d9c6d0b](https://github.com/stashed/mongodb/commit/d9c6d0b) [cherry-pick] Fix output format + Add PreBackupActions logic (#149) (#172) +- [0ef5cc0](https://github.com/stashed/mongodb/commit/0ef5cc0) [cherry-pick] Make image.tag in values.yaml same as $APP_VERSION (#150) (#161) +- [a51bdac](https://github.com/stashed/mongodb/commit/a51bdac) [cherry-pick] Update chart icon (#148) +- [2ad3b80](https://github.com/stashed/mongodb/commit/2ad3b80) [cherry-pick] Make chart registry configurable (#126) (#137) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-beta.20200826](https://github.com/stashed/mysql/releases/tag/5.7.25-beta.20200826) + +- [813ee01](https://github.com/stashed/mysql/commit/813ee01) Prepare for release 5.7.25-beta.20200826 (#85) +- [e646be7](https://github.com/stashed/mysql/commit/e646be7) [cherry-pick] Update Stash installation link (#81) (#82) +- [ecc7d0c](https://github.com/stashed/mysql/commit/ecc7d0c) [cherry-pick] Fix output format (#46) (#78) +- [7fcbd24](https://github.com/stashed/mysql/commit/7fcbd24) [cherry-pick] Pass image tag in values.yaml file (#74) (#75) +- [3188584](https://github.com/stashed/mysql/commit/3188584) [cherry-pick] Update chart icon (#71) +- [9060c7a](https://github.com/stashed/mysql/commit/9060c7a) [cherry-pick] Make chart registry configurable (#67) (#68) + + +### [8.0.3-beta.20200826](https://github.com/stashed/mysql/releases/tag/8.0.3-beta.20200826) + +- [7326b37](https://github.com/stashed/mysql/commit/7326b37) Prepare for release 8.0.3-beta.20200826 (#87) +- [72ba0ee](https://github.com/stashed/mysql/commit/72ba0ee) [cherry-pick] Update Stash installation link (#81) (#84) +- [3e856a9](https://github.com/stashed/mysql/commit/3e856a9) [cherry-pick] Fix output format (#46) (#80) +- [8621d51](https://github.com/stashed/mysql/commit/8621d51) [cherry-pick] Pass image tag in values.yaml file (#74) (#77) +- [41702eb](https://github.com/stashed/mysql/commit/41702eb) [cherry-pick] Update chart icon (#73) +- [31740f9](https://github.com/stashed/mysql/commit/31740f9) [cherry-pick] Make chart registry configurable (#67) (#70) + + +### [8.0.14-beta.20200826](https://github.com/stashed/mysql/releases/tag/8.0.14-beta.20200826) + +- [5816915](https://github.com/stashed/mysql/commit/5816915) Prepare for release 8.0.14-beta.20200826 (#86) +- [96b78ca](https://github.com/stashed/mysql/commit/96b78ca) [cherry-pick] Update Stash installation link (#81) (#83) +- [4f6c15b](https://github.com/stashed/mysql/commit/4f6c15b) [cherry-pick] Fix output format (#46) (#79) +- [9da1616](https://github.com/stashed/mysql/commit/9da1616) [cherry-pick] Pass image tag in values.yaml file (#74) (#76) +- [72edf00](https://github.com/stashed/mysql/commit/72edf00) [cherry-pick] Update chart icon (#72) +- [9f253db](https://github.com/stashed/mysql/commit/9f253db) [cherry-pick] Make chart registry configurable (#67) (#69) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-beta.20200826](https://github.com/stashed/percona-xtradb/releases/tag/5.7-beta.20200826) + +- [10b9a66](https://github.com/stashed/percona-xtradb/commit/10b9a66) Prepare for release 5.7-beta.20200826 (#49) +- [53f26da](https://github.com/stashed/percona-xtradb/commit/53f26da) [cherry-pick] Update Stash installation link (#47) (#48) +- [3eae3d3](https://github.com/stashed/percona-xtradb/commit/3eae3d3) [cherry-pick] Fix output format + Add PreBackupActions logic (#43) (#46) +- [0fa2765](https://github.com/stashed/percona-xtradb/commit/0fa2765) [cherry-pick] Make image.tag in values.yaml file as same as $APP_VERSION (#44) (#45) +- [7ad46c0](https://github.com/stashed/percona-xtradb/commit/7ad46c0) [cherry-pick] Update chart icon (#42) +- [97f7e6d](https://github.com/stashed/percona-xtradb/commit/97f7e6d) [cherry-pick] Make chart registry configurable (#40) (#41) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6-beta.20200826](https://github.com/stashed/postgres/releases/tag/9.6-beta.20200826) + +- [61c4425](https://github.com/stashed/postgres/commit/61c4425) Prepare for release 9.6-beta.20200826 (#141) +- [b313c2c](https://github.com/stashed/postgres/commit/b313c2c) Update Stash installation link (#131) (#136) +- [d73595e](https://github.com/stashed/postgres/commit/d73595e) [cherry-pick] Update twitter handle (#125) (#130) +- [875edd5](https://github.com/stashed/postgres/commit/875edd5) [cherry-pick] Use image tag same as the $APP_VERSION (#114) (#124) +- [5a9a784](https://github.com/stashed/postgres/commit/5a9a784) [cherry-pick] Fix output format + Add PreBackupActions logic (#113) (#119) +- [ce47f3a](https://github.com/stashed/postgres/commit/ce47f3a) [cherry-pick] Update chart icon (#112) +- [decfbb0](https://github.com/stashed/postgres/commit/decfbb0) [cherry-pick] Make chart registry configurable (#102) (#107) + + +### [10.2-beta.20200826](https://github.com/stashed/postgres/releases/tag/10.2-beta.20200826) + +- [ac65186](https://github.com/stashed/postgres/commit/ac65186) Prepare for release 10.2-beta.20200826 (#137) +- [1757b5f](https://github.com/stashed/postgres/commit/1757b5f) [cherry-pick] Update Stash installation link (#131) (#132) +- [56f90c7](https://github.com/stashed/postgres/commit/56f90c7) [cherry-pick] Update twitter handle (#125) (#126) +- [9734711](https://github.com/stashed/postgres/commit/9734711) [cherry-pick] Use image tag same as the $APP_VERSION (#114) (#120) +- [9556ade](https://github.com/stashed/postgres/commit/9556ade) [cherry-pick] Fix output format + Add PreBackupActions logic (#113) (#115) +- [ce7257e](https://github.com/stashed/postgres/commit/ce7257e) [cherry-pick] Update chart icon (#108) +- [754640f](https://github.com/stashed/postgres/commit/754640f) [cherry-pick] Make chart registry configurable (#102) (#103) + + +### [10.6-beta.20200826](https://github.com/stashed/postgres/releases/tag/10.6-beta.20200826) + +- [1446996](https://github.com/stashed/postgres/commit/1446996) Prepare for release 10.6-beta.20200826 (#138) +- [720cc7b](https://github.com/stashed/postgres/commit/720cc7b) [cherry-pick] Update Stash installation link (#131) (#133) +- [6b17dea](https://github.com/stashed/postgres/commit/6b17dea) [cherry-pick] Update twitter handle (#125) (#127) +- [d1af1c6](https://github.com/stashed/postgres/commit/d1af1c6) [cherry-pick] Use image tag same as the $APP_VERSION (#114) (#121) +- [cd2f8ec](https://github.com/stashed/postgres/commit/cd2f8ec) [cherry-pick] Fix output format + Add PreBackupActions logic (#113) (#116) +- [d89559c](https://github.com/stashed/postgres/commit/d89559c) [cherry-pick] Update chart icon (#109) +- [192c564](https://github.com/stashed/postgres/commit/192c564) [cherry-pick] Make chart registry configurable (#102) (#104) + + +### [11.1-beta.20200826](https://github.com/stashed/postgres/releases/tag/11.1-beta.20200826) + +- [0cc9647](https://github.com/stashed/postgres/commit/0cc9647) Prepare for release 11.1-beta.20200826 (#139) +- [dff51be](https://github.com/stashed/postgres/commit/dff51be) [cherry-pick] Update Stash installation link (#131) (#134) +- [b8480c8](https://github.com/stashed/postgres/commit/b8480c8) [cherry-pick] Update twitter handle (#125) (#128) +- [33fe94b](https://github.com/stashed/postgres/commit/33fe94b) [cherry-pick] Use image tag same as the $APP_VERSION (#114) (#122) +- [6a631b0](https://github.com/stashed/postgres/commit/6a631b0) [cherry-pick] Fix output format + Add PreBackupActions logic (#113) (#117) +- [8bccb9c](https://github.com/stashed/postgres/commit/8bccb9c) [cherry-pick] Update chart icon (#110) +- [aca1577](https://github.com/stashed/postgres/commit/aca1577) [cherry-pick] Make chart registry configurable (#102) (#105) + + +### [11.2-beta.20200826](https://github.com/stashed/postgres/releases/tag/11.2-beta.20200826) + +- [cf876d3](https://github.com/stashed/postgres/commit/cf876d3) Prepare for release 11.2-beta.20200826 (#140) +- [22d4f2c](https://github.com/stashed/postgres/commit/22d4f2c) [cherry-pick] Update Stash installation link (#131) (#135) +- [462bf9f](https://github.com/stashed/postgres/commit/462bf9f) [cherry-pick] Update twitter handle (#125) (#129) +- [baa8b56](https://github.com/stashed/postgres/commit/baa8b56) [cherry-pick] Use image tag same as the $APP_VERSION (#114) (#123) +- [b09b460](https://github.com/stashed/postgres/commit/b09b460) [cherry-pick] Fix output format + Add PreBackupActions logic (#113) (#118) +- [08ea901](https://github.com/stashed/postgres/commit/08ea901) [cherry-pick] Update chart icon (#111) +- [a6b8c9e](https://github.com/stashed/postgres/commit/a6b8c9e) [cherry-pick] Make chart registry configurable (#102) (#106) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.10.0-rc.0](https://github.com/stashed/stash/releases/tag/v0.10.0-rc.0) + +- [3ebb7788](https://github.com/stashed/stash/commit/3ebb7788) Prepare for release v0.10.0-rc.0 (#1179) +- [48e5c87e](https://github.com/stashed/stash/commit/48e5c87e) Update Kubernetes v1.18.3 dependencies (#1178) +- [c269c8ed](https://github.com/stashed/stash/commit/c269c8ed) Port changes from enterprise version (#1176) +- [0fea720b](https://github.com/stashed/stash/commit/0fea720b) Update Kubernetes v1.18.3 dependencies (#1174) +- [c4b6013f](https://github.com/stashed/stash/commit/c4b6013f) Update Kubernetes v1.18.3 dependencies (#1173) +- [77b3eab8](https://github.com/stashed/stash/commit/77b3eab8) Update Kubernetes v1.18.3 dependencies (#1169) +- [64f7c292](https://github.com/stashed/stash/commit/64f7c292) Update Kubernetes v1.18.3 dependencies (#1168) +- [2d6fd7da](https://github.com/stashed/stash/commit/2d6fd7da) Update Kubernetes v1.18.3 dependencies (#1167) +- [378de04d](https://github.com/stashed/stash/commit/378de04d) Update Kubernetes v1.18.3 dependencies (#1159) +- [20decffa](https://github.com/stashed/stash/commit/20decffa) Build images in e2e workflow +- [4919cb03](https://github.com/stashed/stash/commit/4919cb03) Allow configuring k8s in e2e tests (#1155) +- [6e71662a](https://github.com/stashed/stash/commit/6e71662a) Update to Kubernetes v1.18.3 (#1154) +- [a83021fd](https://github.com/stashed/stash/commit/a83021fd) Trigger e2e tests on /ok-to-test command (#1150) +- [6bf44ceb](https://github.com/stashed/stash/commit/6bf44ceb) Update to Kubernetes v1.18.3 (#1149) +- [bcbb3a98](https://github.com/stashed/stash/commit/bcbb3a98) Update to Kubernetes v1.18.3 (#1148) +- [3b717aac](https://github.com/stashed/stash/commit/3b717aac) Prepare for release v0.10.0-beta.1 (#1146) +- [c8b81cf7](https://github.com/stashed/stash/commit/c8b81cf7) Prepare for release v0.10.0-beta.0 (#1145) +- [2d145f47](https://github.com/stashed/stash/commit/2d145f47) Clarify Docker images are dually licensed +- [693ab7df](https://github.com/stashed/stash/commit/693ab7df) Update License (#1144) +- [e13d67eb](https://github.com/stashed/stash/commit/e13d67eb) Update to Kubernetes v1.18.3 (#1142) +- [26ee605a](https://github.com/stashed/stash/commit/26ee605a) Update ci.yml +- [9fa95666](https://github.com/stashed/stash/commit/9fa95666) Add workflow to update docs (#1136) +- [95a62a95](https://github.com/stashed/stash/commit/95a62a95) Update update-release-tracker.sh +- [379c90d5](https://github.com/stashed/stash/commit/379c90d5) Update update-release-tracker.sh +- [cd0a70ee](https://github.com/stashed/stash/commit/cd0a70ee) Use GITHUB_BASE_REF to detect target branch +- [e27c5f66](https://github.com/stashed/stash/commit/e27c5f66) Add script to update release tracker on pr merge (#1132) +- [b0dd5051](https://github.com/stashed/stash/commit/b0dd5051) Update .kodiak.toml +- [e87bad80](https://github.com/stashed/stash/commit/e87bad80) Parameterize installer namespace +- [da8d8956](https://github.com/stashed/stash/commit/da8d8956) Format CI workflows +- [bbde40a3](https://github.com/stashed/stash/commit/bbde40a3) Update to Kubernetes v1.18.3 (#1129) +- [38eb3781](https://github.com/stashed/stash/commit/38eb3781) Update to Kubernetes v1.18.3 +- [197aa7bd](https://github.com/stashed/stash/commit/197aa7bd) Create .kodiak.toml +- [181ca49e](https://github.com/stashed/stash/commit/181ca49e) Update coverage script +- [26602c96](https://github.com/stashed/stash/commit/26602c96) Merge pull request #1125 from stashed/fix-ci-tests +- [54f87b78](https://github.com/stashed/stash/commit/54f87b78) Increase wait timeout +- [43428085](https://github.com/stashed/stash/commit/43428085) Remove unnecessary test codes + run test in parallel +- [8a780e0c](https://github.com/stashed/stash/commit/8a780e0c) Fix clone-pvc tests +- [7027c0f6](https://github.com/stashed/stash/commit/7027c0f6) Fix E2E test +- [31de588a](https://github.com/stashed/stash/commit/31de588a) Change GCS test bucket name to stash-ci (#1122) +- [30a490a6](https://github.com/stashed/stash/commit/30a490a6) Merge pull request #1121 from stashed/baseline-psp +- [419a18e3](https://github.com/stashed/stash/commit/419a18e3) Use StringSlice type flag +- [9dd3804d](https://github.com/stashed/stash/commit/9dd3804d) Make PSP names configurable through flag +- [e4edef44](https://github.com/stashed/stash/commit/e4edef44) Always use baseline PSP +- [cf1538a0](https://github.com/stashed/stash/commit/cf1538a0) Use filepath.Join to generate Repository prefix for BackupBatch (#1120) +- [be189169](https://github.com/stashed/stash/commit/be189169) Go back to using engineerd/setup-kind +- [ae2d74fa](https://github.com/stashed/stash/commit/ae2d74fa) Update dependencies (#1117) +- [a93a5b4c](https://github.com/stashed/stash/commit/a93a5b4c) Remove defaults from CRD v1beta1 (#1116) +- [40e65761](https://github.com/stashed/stash/commit/40e65761) Use CRD v1 for Kubernetes >= 1.16 (#1115) +- [7d851e53](https://github.com/stashed/stash/commit/7d851e53) Merge pull request #1114 from stashed/x7 +- [352ddeed](https://github.com/stashed/stash/commit/352ddeed) Use preinstalled kind +- [11c9e422](https://github.com/stashed/stash/commit/11c9e422) Pass context +- [21053603](https://github.com/stashed/stash/commit/21053603) Update to Kubernetes 1.18.3 +- [f450e9cc](https://github.com/stashed/stash/commit/f450e9cc) Add wait for target logic + add conditions for BackupConfiguration + BackupBatch + RestoreSession (#1108) +- [8f8ff87e](https://github.com/stashed/stash/commit/8f8ff87e) Fix volume snapshot job cleanup (#1090) +- [a4a868b5](https://github.com/stashed/stash/commit/a4a868b5) Merge pull request #1111 from stashed/fix-interimVolume +- [108d0252](https://github.com/stashed/stash/commit/108d0252) Set BackupSession as owner of the pvc created from interimVolumeTemplate +- [fd136c53](https://github.com/stashed/stash/commit/fd136c53) Use Go 1.14.3 +- [74c71d22](https://github.com/stashed/stash/commit/74c71d22) Update crazy-max/ghaction-docker-buildx flag +- [f783899b](https://github.com/stashed/stash/commit/f783899b) Trigger the workflow on push to master +- [e7eceb30](https://github.com/stashed/stash/commit/e7eceb30) Trigger the workflow on push or pull request +- [fe479e8c](https://github.com/stashed/stash/commit/fe479e8c) Use kind v0.8.0 +- [9fc4665a](https://github.com/stashed/stash/commit/9fc4665a) Merge pull request #1093 from robotinfra/master +- [ef2d57e3](https://github.com/stashed/stash/commit/ef2d57e3) fix typo succesSfully +- [d8d35c49](https://github.com/stashed/stash/commit/d8d35c49) fix event types mismatch +- [53dfe8b0](https://github.com/stashed/stash/commit/53dfe8b0) Update stash labels in Makefile +- [c8081c1d](https://github.com/stashed/stash/commit/c8081c1d) Pass image pull secrets to helm chart +- [37b9b312](https://github.com/stashed/stash/commit/37b9b312) Use Go 1.14.2 (#1074) +- [09621974](https://github.com/stashed/stash/commit/09621974) Update K8s version 1.14.6 to 1.14.10 (#1084) +- [8a1ab32c](https://github.com/stashed/stash/commit/8a1ab32c) Give backup triggering CronJob all permissions for Stash crds (#1083) +- [53b932b1](https://github.com/stashed/stash/commit/53b932b1) Use kubectl 1.17 (#1082) +- [5cdeebee](https://github.com/stashed/stash/commit/5cdeebee) Fix nil pointer exception during VolumeSnapshot (#1073) +- [30630d60](https://github.com/stashed/stash/commit/30630d60) Assign returned error properly crateRestoreSessoin() (#1069) +- [3fcbe1b7](https://github.com/stashed/stash/commit/3fcbe1b7) Update README.md to reflect Stash's capability properly (#1060) +- [53513cfe](https://github.com/stashed/stash/commit/53513cfe) Update README.md +- [d615e2c0](https://github.com/stashed/stash/commit/d615e2c0) Add license scan report and status (#1031) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2020.08.26-rc.1.md b/content/docs/v2024.12.18/CHANGELOG-v2020.08.26-rc.1.md new file mode 100644 index 0000000000..c46b20c184 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2020.08.26-rc.1.md @@ -0,0 +1,1115 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2020.08.26-rc.1 + name: Changelog-v2020.08.26-rc.1 + parent: welcome + weight: 20200826 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2020.08.26-rc.1/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2020.08.26-rc.1/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2020.08.26-rc.1 (2020-08-27) + + +## [appscode/stash-enterprise](https://github.com/appscode/stash-enterprise) + +### [v0.10.0-rc.1](https://github.com/appscode/stash-enterprise/releases/tag/v0.10.0-rc.1) + +- [dc0c6cf5](https://github.com/appscode/stash-enterprise/commit/dc0c6cf5) Prepare for release v0.10.0-rc.1 (#19) +- [4836ebc0](https://github.com/appscode/stash-enterprise/commit/4836ebc0) Create GitHub release from release workflow + + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.10.0-rc.1](https://github.com/stashed/apimachinery/releases/tag/v0.10.0-rc.1) + +- [7dbdff5f](https://github.com/stashed/apimachinery/commit/7dbdff5f) Update README.md + + + +## [stashed/catalog](https://github.com/stashed/catalog) + +### [v2020.08.26-rc.1](https://github.com/stashed/catalog/releases/tag/v2020.08.26-rc.1) + +- [fe86886](https://github.com/stashed/catalog/commit/fe86886) Prepare for release v2020.08.26-rc.1 (#34) +- [e7eb2e3](https://github.com/stashed/catalog/commit/e7eb2e3) Update issues link + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.10.0-rc.1](https://github.com/stashed/cli/releases/tag/v0.10.0-rc.1) + +- [43e0370](https://github.com/stashed/cli/commit/43e0370) Prepare for release v0.10.0-rc.1 (#39) +- [2c90092](https://github.com/stashed/cli/commit/2c90092) Update README.md + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-rc.20200826](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-rc.20200826) + +- [48d00db](https://github.com/stashed/elasticsearch/commit/48d00db) Prepare for release 5.6.4-rc.20200826 (#175) +- [46c78a6](https://github.com/stashed/elasticsearch/commit/46c78a6) [cherry-pick] Update README.md (#167) +- [df82b88](https://github.com/stashed/elasticsearch/commit/df82b88) Prepare for release 5.6.4-beta.20200826 (#158) +- [465a9f0](https://github.com/stashed/elasticsearch/commit/465a9f0) [cherry-pick] Update Stash installation link (#149) (#150) +- [4fd2af7](https://github.com/stashed/elasticsearch/commit/4fd2af7) [cherry-pick] Make image.tag in values.yaml file same as the $APP_VERSION (#132) (#141) +- [f9f6ab1](https://github.com/stashed/elasticsearch/commit/f9f6ab1) [cherry-pick] Fix output format + Add PreBackupActions logic (#131) (#133) +- [cf70698](https://github.com/stashed/elasticsearch/commit/cf70698) [cherry-pick] Update chart icon (#123) +- [f1c9257](https://github.com/stashed/elasticsearch/commit/f1c9257) [cherry-pick] Make chart registry configurable (#114) (#115) +- [4f6f04d](https://github.com/stashed/elasticsearch/commit/4f6f04d) Prepare for release 5.6.4-beta.20200709 (#105) +- [c0b63a8](https://github.com/stashed/elasticsearch/commit/c0b63a8) [cherry-pick] Build docker image in release workflow (#96) (#97) +- [7115da1](https://github.com/stashed/elasticsearch/commit/7115da1) Prepare for release 5.6.4-beta.20200708 (#87) +- [f5ab33d](https://github.com/stashed/elasticsearch/commit/f5ab33d) [cherry-pick] Publish to testing dir for alpha/beta releases (#78) (#79) +- [7d73d30](https://github.com/stashed/elasticsearch/commit/7d73d30) [cherry-pick] Update License (#69) (#70) +- [04e8a63](https://github.com/stashed/elasticsearch/commit/04e8a63) Add commands to update chart version (#68) +- [3a5cd78](https://github.com/stashed/elasticsearch/commit/3a5cd78) [cherry-pick] Update update-release-tracker.sh (#60) +- [77bb76e](https://github.com/stashed/elasticsearch/commit/77bb76e) [cherry-pick] Update update-release-tracker.sh (#52) +- [3b47ba6](https://github.com/stashed/elasticsearch/commit/3b47ba6) [cherry-pick] Update release.yml (#43) (#44) +- [444cb3b](https://github.com/stashed/elasticsearch/commit/444cb3b) [cherry-pick] Add script to update release tracker on pr merge (#34) (#35) +- [d349617](https://github.com/stashed/elasticsearch/commit/d349617) [cherry-pick] Add workflow to cherry pick commits to master (#25) (#26) +- [4038abd](https://github.com/stashed/elasticsearch/commit/4038abd) Fix chart release process (#24) +- [895a73f](https://github.com/stashed/elasticsearch/commit/895a73f) Update .kodiak.toml +- [6b9451c](https://github.com/stashed/elasticsearch/commit/6b9451c) Allow overwriting secret key via SecretTransformation (#23) +- [0fcb64e](https://github.com/stashed/elasticsearch/commit/0fcb64e) Make waitTimeout Configurable through flag (#22) +- [b3859b9](https://github.com/stashed/elasticsearch/commit/b3859b9) Create .kodiak.toml +- [c0f3b97](https://github.com/stashed/elasticsearch/commit/c0f3b97) Update to Kubernetes v1.18.3 (#21) +- [210dd08](https://github.com/stashed/elasticsearch/commit/210dd08) Update crazy-max/ghaction-docker-buildx flag +- [5c74a42](https://github.com/stashed/elasticsearch/commit/5c74a42) Trigger the workflow on push or pull request +- [76424d0](https://github.com/stashed/elasticsearch/commit/76424d0) Auto generate chart readme file +- [fc144c2](https://github.com/stashed/elasticsearch/commit/fc144c2) Correctly mark optional fields +- [3559c2c](https://github.com/stashed/elasticsearch/commit/3559c2c) Add openapi v3 schema for values file (#18) +- [46b8654](https://github.com/stashed/elasticsearch/commit/46b8654) Update CI configuration +- [5c15319](https://github.com/stashed/elasticsearch/commit/5c15319) Add support for providing s3 region (#17) +- [c1b75a9](https://github.com/stashed/elasticsearch/commit/c1b75a9) Make output.json file writable to all users + Fix Flag types (#16) +- [f6d9709](https://github.com/stashed/elasticsearch/commit/f6d9709) Update hugo frontmatter for stash website +- [5ef236a](https://github.com/stashed/elasticsearch/commit/5ef236a) Enable race detector in e2e tests +- [1980a77](https://github.com/stashed/elasticsearch/commit/1980a77) Test installers (#14) +- [63a8396](https://github.com/stashed/elasticsearch/commit/63a8396) Fix broken link and add AppBinding scheme field (#15) +- [82d3e7c](https://github.com/stashed/elasticsearch/commit/82d3e7c) Add license header to files (#13) +- [c0241d4](https://github.com/stashed/elasticsearch/commit/c0241d4) Enable make ci (#12) +- [52f71de](https://github.com/stashed/elasticsearch/commit/52f71de) Fix BackupSession's Print Columns (#11) +- [91964a5](https://github.com/stashed/elasticsearch/commit/91964a5) Enable make ci (#10) +- [a804cb0](https://github.com/stashed/elasticsearch/commit/a804cb0) Remove --enable-status-subresource flag (#9) +- [57c4898](https://github.com/stashed/elasticsearch/commit/57c4898) Fix argument passing (#8) +- [15b1b3c](https://github.com/stashed/elasticsearch/commit/15b1b3c) Add release pipeline (#7) +- [b02e1ad](https://github.com/stashed/elasticsearch/commit/b02e1ad) Prepare for 5.6.4 release +- [7161616](https://github.com/stashed/elasticsearch/commit/7161616) Prepare for 5.6 release +- [7baf065](https://github.com/stashed/elasticsearch/commit/7baf065) Update go.yml +- [c8b18b0](https://github.com/stashed/elasticsearch/commit/c8b18b0) Fix typo (#6) +- [32445a6](https://github.com/stashed/elasticsearch/commit/32445a6) Use InterimVolumeTemplate + Finalize doc template (#5) +- [16d35ec](https://github.com/stashed/elasticsearch/commit/16d35ec) Enable GitHub actions +- [acfb971](https://github.com/stashed/elasticsearch/commit/acfb971) Improve error handling + remove metrics handling part (#4) +- [7e94690](https://github.com/stashed/elasticsearch/commit/7e94690) Use docker buildx to build docker image +- [6e388ff](https://github.com/stashed/elasticsearch/commit/6e388ff) Use github.com/Azure/go-autorest/autorest@v0.7.0 +- [6a82a60](https://github.com/stashed/elasticsearch/commit/6a82a60) Fix version suffix (#3) +- [2136ee6](https://github.com/stashed/elasticsearch/commit/2136ee6) Various fixes (#2) +- [d98b25a](https://github.com/stashed/elasticsearch/commit/d98b25a) Update Chart.yaml +- [806bf8c](https://github.com/stashed/elasticsearch/commit/806bf8c) Fixed elasticdump & added docs (#1) +- [3c99f3c](https://github.com/stashed/elasticsearch/commit/3c99f3c) Reorganize repo +- [1972a9a](https://github.com/stashed/elasticsearch/commit/1972a9a) VolumeSnapshot (#787) +- [3f1f4cf](https://github.com/stashed/elasticsearch/commit/3f1f4cf) Remove importance of order of rule in RestoreSession (#795) +- [86a4af0](https://github.com/stashed/elasticsearch/commit/86a4af0) Skip BackupSession creation if target does not exist + use timestamp … (#797) +- [3abe6f6](https://github.com/stashed/elasticsearch/commit/3abe6f6) Use restic 0.9.5 (#789) +- [85b21bf](https://github.com/stashed/elasticsearch/commit/85b21bf) Update concept doc (#739) +- [ad5c8f2](https://github.com/stashed/elasticsearch/commit/ad5c8f2) Add support for backup cluster resources YAML (#721) +- [2bb8ec3](https://github.com/stashed/elasticsearch/commit/2bb8ec3) Backup and restore Elasticsearch (#702) +- [1f21268](https://github.com/stashed/elasticsearch/commit/1f21268) Update package path to stash.appscode.dev/stash (#776) +- [e8fb571](https://github.com/stashed/elasticsearch/commit/e8fb571) Update to k8s 1.14.0 client libraries using go.mod (#775) +- [eab0f8e](https://github.com/stashed/elasticsearch/commit/eab0f8e) Remove --rbac flag (#761) +- [4c3e7ea](https://github.com/stashed/elasticsearch/commit/4c3e7ea) Skip creating/processing backup-session when backup-config is paused (#759) +- [7905eff](https://github.com/stashed/elasticsearch/commit/7905eff) Stash v1beta1 E2E test for PVC (#753) +- [2c44ee8](https://github.com/stashed/elasticsearch/commit/2c44ee8) Implement snapshots for v1beta1 api (#749) +- [c88df7a](https://github.com/stashed/elasticsearch/commit/c88df7a) Run restic commands using docker (#754) +- [8e24d32](https://github.com/stashed/elasticsearch/commit/8e24d32) Fixed scratch-dir, output-dir and hostname in functions/tasks yamls (#744) +- [8d5944d](https://github.com/stashed/elasticsearch/commit/8d5944d) Add Stash CLI (#734) +- [550ab37](https://github.com/stashed/elasticsearch/commit/550ab37) Apply nice/ionice settings from env (#746) +- [42ed76b](https://github.com/stashed/elasticsearch/commit/42ed76b) Stash V1beta1 E2E test for Deployment (#710) +- [d63f9e9](https://github.com/stashed/elasticsearch/commit/d63f9e9) Fix openapi path prefixes for validators and mutators (#732) +- [c1347ed](https://github.com/stashed/elasticsearch/commit/c1347ed) Add max-connections for GCS, Azure, B2 backend (#730) +- [859c4ee](https://github.com/stashed/elasticsearch/commit/859c4ee) Rename admission webhooks to avoid name collision (#725) +- [d631bb9](https://github.com/stashed/elasticsearch/commit/d631bb9) Apply EmptyDir settings to TmpDir (#719) +- [cc70068](https://github.com/stashed/elasticsearch/commit/cc70068) Add support for rest backend (#713) +- [e4db000](https://github.com/stashed/elasticsearch/commit/e4db000) Add support for OpenShift DeploymentConfig (#714) +- [3fa7bdb](https://github.com/stashed/elasticsearch/commit/3fa7bdb) Backup and restore Mongo DB (#699) +- [4c39235](https://github.com/stashed/elasticsearch/commit/4c39235) Backup and restore MySQL DB (#696) +- [3e89d32](https://github.com/stashed/elasticsearch/commit/3e89d32) Backup and restore Postgres DB (#695) +- [03b95f3](https://github.com/stashed/elasticsearch/commit/03b95f3) Add BackupSession Controller for Sidecar (#701) +- [cacbc7d](https://github.com/stashed/elasticsearch/commit/cacbc7d) Update workload controller for new design (#675) +- [5c173e5](https://github.com/stashed/elasticsearch/commit/5c173e5) Post backup/restore status update (#691) +- [50bbb0a](https://github.com/stashed/elasticsearch/commit/50bbb0a) Backup and restore PVC (#676) +- [d4a53e2](https://github.com/stashed/elasticsearch/commit/d4a53e2) Add BackupConfiguration Controller (#671) +- [ef9a4ae](https://github.com/stashed/elasticsearch/commit/ef9a4ae) Update Kubernetes client libraries to 1.13.0 (#687) +- [c48dbfc](https://github.com/stashed/elasticsearch/commit/c48dbfc) Separate type definitions into individual files (#646) +- [77f2113](https://github.com/stashed/elasticsearch/commit/77f2113) Use flags.DumpAll to dump flags (#624) +- [cb54d8c](https://github.com/stashed/elasticsearch/commit/cb54d8c) Set periodic analytics (#623) +- [248a53a](https://github.com/stashed/elasticsearch/commit/248a53a) Add validation webhook xray (#618) +- [2029bf4](https://github.com/stashed/elasticsearch/commit/2029bf4) Use dynamic pushgateway url (#614) +- [bcf5926](https://github.com/stashed/elasticsearch/commit/bcf5926) Fix offline backup (#537) +- [5049a63](https://github.com/stashed/elasticsearch/commit/5049a63) Fix extended apiserver issues with Kubernetes 1.11 (#536) +- [9d31255](https://github.com/stashed/elasticsearch/commit/9d31255) Update client-go to v8.0.0 (#528) +- [d872b4c](https://github.com/stashed/elasticsearch/commit/d872b4c) Enable status subresource for crds (#524) +- [4795dba](https://github.com/stashed/elasticsearch/commit/4795dba) Remove ops-address port (#518) +- [e95b151](https://github.com/stashed/elasticsearch/commit/e95b151) Add support for initial backoff to the apiserver call on recover (#476) +- [120e5de](https://github.com/stashed/elasticsearch/commit/120e5de) Disable admission controllers for webhook server (#468) +- [2f19545](https://github.com/stashed/elasticsearch/commit/2f19545) Update client-go to 7.0.0 (#463) +- [e613ff5](https://github.com/stashed/elasticsearch/commit/e613ff5) Fixes RBAC issue in test (#449) +- [56a3a74](https://github.com/stashed/elasticsearch/commit/56a3a74) Some cleanup (#446) +- [02565bb](https://github.com/stashed/elasticsearch/commit/02565bb) Delete restic repository from backend if Repository CRD is deleted (#438) +- [ea98067](https://github.com/stashed/elasticsearch/commit/ea98067) Fix go_vet error (#440) +- [9d626eb](https://github.com/stashed/elasticsearch/commit/9d626eb) Increase qps and burst limits (#435) +- [5c6713f](https://github.com/stashed/elasticsearch/commit/5c6713f) Show repository snapshot list (#417) +- [6d8ef78](https://github.com/stashed/elasticsearch/commit/6d8ef78) Expose swagger.json (#420) +- [8e04ca0](https://github.com/stashed/elasticsearch/commit/8e04ca0) Create repository crd for each Restic repository (#394) +- [4c9a478](https://github.com/stashed/elasticsearch/commit/4c9a478) Rename --analytics to --enable-analytics (#384) +- [7ea2220](https://github.com/stashed/elasticsearch/commit/7ea2220) Replace initializers with mutation webhook for workloads (#363) +- [2770e6b](https://github.com/stashed/elasticsearch/commit/2770e6b) Use admission hook helpers from kutil (#360) +- [d3754d7](https://github.com/stashed/elasticsearch/commit/d3754d7) Implement offline backup for multiple replica (#335) +- [13a2d14](https://github.com/stashed/elasticsearch/commit/13a2d14) Use official code generator scripts (#336) +- [90642ce](https://github.com/stashed/elasticsearch/commit/90642ce) Fix e2e tests after webhook merger (#333) +- [2fc3239](https://github.com/stashed/elasticsearch/commit/2fc3239) Leave secure port unset +- [7cb52b2](https://github.com/stashed/elasticsearch/commit/7cb52b2) Merge admission webhook and operator into one binary (#329) +- [3306427](https://github.com/stashed/elasticsearch/commit/3306427) Implement informer factory for backup scheduler (#325) +- [7bb027b](https://github.com/stashed/elasticsearch/commit/7bb027b) Cleanup apiserver +- [fb8c1e4](https://github.com/stashed/elasticsearch/commit/fb8c1e4) Copy generic-admission-server into pkg (#318) +- [5a5093f](https://github.com/stashed/elasticsearch/commit/5a5093f) Use shared infromer factory (#317) +- [0ccb948](https://github.com/stashed/elasticsearch/commit/0ccb948) Use GetBaseVersion method from kutil (#316) +- [8c5e6ff](https://github.com/stashed/elasticsearch/commit/8c5e6ff) Fix webhook command description (#314) +- [775a2b6](https://github.com/stashed/elasticsearch/commit/775a2b6) Merge webhook plugins into one. (#311) +- [a8659fe](https://github.com/stashed/elasticsearch/commit/a8659fe) Add ValidatingAdmissionWebhook for Stash CRDs (#299) +- [c3e177c](https://github.com/stashed/elasticsearch/commit/c3e177c) Added support for private docker registry (#300) +- [62ec42e](https://github.com/stashed/elasticsearch/commit/62ec42e) Update dependencies to Kubernetes 1.9 (#297) +- [cf3ea7c](https://github.com/stashed/elasticsearch/commit/cf3ea7c) Update appscode/go log wrapper (#287) +- [470cc31](https://github.com/stashed/elasticsearch/commit/470cc31) Pass --pushgateway-url for injected containers. (#284) +- [e2e79c6](https://github.com/stashed/elasticsearch/commit/e2e79c6) Fix kubectl version parsing generation in GKE (#267) +- [326aea4](https://github.com/stashed/elasticsearch/commit/326aea4) Detect analytics client id using env vars (#265) +- [4a5912c](https://github.com/stashed/elasticsearch/commit/4a5912c) Prepare docs for 0.6.0 release (#264) +- [f75d5df](https://github.com/stashed/elasticsearch/commit/f75d5df) Remove restic-dependency from recovery (#258) +- [86f01f3](https://github.com/stashed/elasticsearch/commit/86f01f3) Log operator version on start (#253) +- [4e29b70](https://github.com/stashed/elasticsearch/commit/4e29b70) Simplify clientID generation for analytics (#247) +- [a45937f](https://github.com/stashed/elasticsearch/commit/a45937f) Set analytics clientID (#246) +- [ea53cea](https://github.com/stashed/elasticsearch/commit/ea53cea) Enable Restic cahce-dir flag (#241) +- [dc0030d](https://github.com/stashed/elasticsearch/commit/dc0030d) Implement offline backup (#229) +- [ae40f35](https://github.com/stashed/elasticsearch/commit/ae40f35) Revendor kutil (#230) +- [d68a34d](https://github.com/stashed/elasticsearch/commit/d68a34d) Record recovery status for individual FileGroup (#222) +- [15a24b7](https://github.com/stashed/elasticsearch/commit/15a24b7) Leader election for deployment, replica set and rc (#206) +- [4a75689](https://github.com/stashed/elasticsearch/commit/4a75689) Implement Recovery for Restic Backup (#202) +- [78b3942](https://github.com/stashed/elasticsearch/commit/78b3942) Use typed versioned client for CRD +- [b857b05](https://github.com/stashed/elasticsearch/commit/b857b05) Change `k8s.io/api/core/v1` pkg alias to core (#204) +- [e52f848](https://github.com/stashed/elasticsearch/commit/e52f848) Use client-go 5.x +- [4f376ad](https://github.com/stashed/elasticsearch/commit/4f376ad) Set hostname based on resource type (#198) +- [e530116](https://github.com/stashed/elasticsearch/commit/e530116) Manage RoleBinding for rbac enabled cluster (#197) +- [e28c13f](https://github.com/stashed/elasticsearch/commit/e28c13f) Use workqueue for scheduler (#194) +- [2719cbd](https://github.com/stashed/elasticsearch/commit/2719cbd) Fix e2e tests (#183) +- [9c1cc43](https://github.com/stashed/elasticsearch/commit/9c1cc43) Use workqueue (#182) +- [b3ee076](https://github.com/stashed/elasticsearch/commit/b3ee076) Only watch apps/v1beta1 Deployment (#178) +- [4f92ca6](https://github.com/stashed/elasticsearch/commit/4f92ca6) Use Namespace() method from kutil. +- [78f1e7f](https://github.com/stashed/elasticsearch/commit/78f1e7f) Update kutil (#170) +- [29a8a1f](https://github.com/stashed/elasticsearch/commit/29a8a1f) Use apis/v1alpha1 instead of internal version (#167) +- [da3eb2e](https://github.com/stashed/elasticsearch/commit/da3eb2e) Use kubernetes/code-generator (#163) +- [3b1d6bf](https://github.com/stashed/elasticsearch/commit/3b1d6bf) Expose resync-period as flag +- [35d8dc6](https://github.com/stashed/elasticsearch/commit/35d8dc6) Move analytics collector to root command (#164) +- [6a55694](https://github.com/stashed/elasticsearch/commit/6a55694) Migrate TPR to CRD (#160) +- [91f678f](https://github.com/stashed/elasticsearch/commit/91f678f) Rename RepositorySecretName to StorageSecretName (#135) +- [d666c81](https://github.com/stashed/elasticsearch/commit/d666c81) Change mount path for labels to /etc/stash +- [1177d60](https://github.com/stashed/elasticsearch/commit/1177d60) Part 6 - Update docs (#121) +- [a15689d](https://github.com/stashed/elasticsearch/commit/a15689d) Various bug fixes (#118) +- [d8a5771](https://github.com/stashed/elasticsearch/commit/d8a5771) Set TMPDIR env var for restic (#115) +- [60ed8f7](https://github.com/stashed/elasticsearch/commit/60ed8f7) Update user guide (#94) + + +### [6.2.4-rc.20200826](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-rc.20200826) + + + +### [6.3.0-rc.20200826](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-rc.20200826) + + + +### [6.4.0-rc.20200826](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-rc.20200826) + + + +### [6.5.3-rc.20200826](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-rc.20200826) + + + +### [6.8.0-rc.20200826](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-rc.20200826) + + + +### [7.2.0-rc.20200826](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-rc.20200826) + + + +### [7.3.2-rc.20200826](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-rc.20200826) + + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v0.10.0-rc.1](https://github.com/stashed/installer/releases/tag/v0.10.0-rc.1) + +- [037a349](https://github.com/stashed/installer/commit/037a349) Prepare for release v0.10.0-rc.1 (#90) +- [f94e175](https://github.com/stashed/installer/commit/f94e175) Correctly pass license to CI workflow +- [9f6539d](https://github.com/stashed/installer/commit/9f6539d) Update stash-enterprise chart version +- [5904e2c](https://github.com/stashed/installer/commit/5904e2c) Update README.md +- [d3d30cc](https://github.com/stashed/installer/commit/d3d30cc) Add link to the steps to get a license (#89) +- [1fb05d9](https://github.com/stashed/installer/commit/1fb05d9) Issue license for testing enterprise charts (#88) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.1-rc.20200826](https://github.com/stashed/mongodb/releases/tag/3.4.1-rc.20200826) + +- [1d2811c](https://github.com/stashed/mongodb/commit/1d2811c) Prepare for release 3.4.1-rc.20200826 (#208) +- [b3501fb](https://github.com/stashed/mongodb/commit/b3501fb) [cherry-pick] Update README.md (#197) +- [1c08dfd](https://github.com/stashed/mongodb/commit/1c08dfd) Prepare for release 3.4.1-beta.20200826 (#185) +- [a4d2b49](https://github.com/stashed/mongodb/commit/a4d2b49) [cherry-pick] Update Stash installation link (#173) (#174) +- [3ae949e](https://github.com/stashed/mongodb/commit/3ae949e) [cherry-pick] Fix output format + Add PreBackupActions logic (#149) (#162) +- [75ebc36](https://github.com/stashed/mongodb/commit/75ebc36) [cherry-pick] Make image.tag in values.yaml same as $APP_VERSION (#150) (#151) +- [c261899](https://github.com/stashed/mongodb/commit/c261899) [cherry-pick] Update chart icon (#138) +- [465f36c](https://github.com/stashed/mongodb/commit/465f36c) [cherry-pick] Make chart registry configurable (#126) (#127) +- [a354b6c](https://github.com/stashed/mongodb/commit/a354b6c) Prepare for release 3.4.1-beta.20200709 (#114) +- [2269fa6](https://github.com/stashed/mongodb/commit/2269fa6) [cherry-pick] Build docker image in release workflow (#102) (#103) +- [47b1d72](https://github.com/stashed/mongodb/commit/47b1d72) Prepare for release 3.4.1-beta.20200708 (#90) +- [67b293a](https://github.com/stashed/mongodb/commit/67b293a) [cherry-pick] Publish to testing dir for alpha/beta releases (#78) (#79) +- [d8c9489](https://github.com/stashed/mongodb/commit/d8c9489) [cherry-pick] Update License (#66) (#67) +- [13f91cd](https://github.com/stashed/mongodb/commit/13f91cd) Add commands to update chart version (#65) +- [5ec5c3c](https://github.com/stashed/mongodb/commit/5ec5c3c) [cherry-pick] Update update-release-tracker.sh (#54) +- [409301c](https://github.com/stashed/mongodb/commit/409301c) Add script to update release tracker on pr merge (#41) +- [deed415](https://github.com/stashed/mongodb/commit/deed415) [cherry-pick] Update release.yml (#42) (#43) +- [7efcffb](https://github.com/stashed/mongodb/commit/7efcffb) [cherry-pick] Add workflow to cherry pick commits to master (#29) (#30) +- [2ed8277](https://github.com/stashed/mongodb/commit/2ed8277) Fix chart release process (#28) +- [b7b3bc6](https://github.com/stashed/mongodb/commit/b7b3bc6) Update .kodiak.toml +- [33abf73](https://github.com/stashed/mongodb/commit/33abf73) Allow overwriting secret key via SecretTransformation (#27) +- [ad30b7d](https://github.com/stashed/mongodb/commit/ad30b7d) Make waitTimeout configurable through flag (#26) +- [80f62d1](https://github.com/stashed/mongodb/commit/80f62d1) Create .kodiak.toml +- [d8e7b86](https://github.com/stashed/mongodb/commit/d8e7b86) Fix typos +- [f5dfaea](https://github.com/stashed/mongodb/commit/f5dfaea) Update to Kubernetes v1.18.3 (#25) +- [4a462cb](https://github.com/stashed/mongodb/commit/4a462cb) Update crazy-max/ghaction-docker-buildx flag +- [961fad3](https://github.com/stashed/mongodb/commit/961fad3) Fix typos +- [14024ab](https://github.com/stashed/mongodb/commit/14024ab) Trigger the workflow on push or pull request +- [c80a723](https://github.com/stashed/mongodb/commit/c80a723) Auto generate chart readme file +- [223dbfd](https://github.com/stashed/mongodb/commit/223dbfd) Correctly mark optional fields +- [8b3b75d](https://github.com/stashed/mongodb/commit/8b3b75d) Add openapi v3 schema for values file (#21) +- [6229815](https://github.com/stashed/mongodb/commit/6229815) Update CI configuration +- [3f2f090](https://github.com/stashed/mongodb/commit/3f2f090) Add support for specifying S3 region (#20) +- [55f007d](https://github.com/stashed/mongodb/commit/55f007d) Make output.json file writable to all users + Fix Flag types (#19) +- [93643f3](https://github.com/stashed/mongodb/commit/93643f3) Fix with arguments to mongorestore (#14) +- [0d9595c](https://github.com/stashed/mongodb/commit/0d9595c) Update hugo frontmatter for stash website +- [cb27f47](https://github.com/stashed/mongodb/commit/cb27f47) Added --nsExclude=config.changelog to standalone +- [a941eb0](https://github.com/stashed/mongodb/commit/a941eb0) Enable race detector in e2e tests +- [2ed387f](https://github.com/stashed/mongodb/commit/2ed387f) Fix broken link and add AppBinding scheme field (#13) +- [8dd0ea1](https://github.com/stashed/mongodb/commit/8dd0ea1) Test installers (#12) +- [5199d20](https://github.com/stashed/mongodb/commit/5199d20) Add license header to files (#11) +- [f89adec](https://github.com/stashed/mongodb/commit/f89adec) Split imports into 3 parts (#10) +- [1c447f4](https://github.com/stashed/mongodb/commit/1c447f4) Fix BackupSession's Print Columns (#9) +- [201a06e](https://github.com/stashed/mongodb/commit/201a06e) Enable make ci (#8) +- [613feea](https://github.com/stashed/mongodb/commit/613feea) Remove --enable-status-subresource flag (#7) +- [95c3974](https://github.com/stashed/mongodb/commit/95c3974) Update totalHosts from backup/restore process (#6) +- [3097a67](https://github.com/stashed/mongodb/commit/3097a67) Fix argument passing (#5) +- [ccdf81f](https://github.com/stashed/mongodb/commit/ccdf81f) Remove support for arm and arm64 architecture +- [f0b8e87](https://github.com/stashed/mongodb/commit/f0b8e87) Prepare for 3.4.17 release +- [16ad538](https://github.com/stashed/mongodb/commit/16ad538) Prepare for 3.4 release +- [c4eb920](https://github.com/stashed/mongodb/commit/c4eb920) Add release pipeline (#4) +- [02b9a9f](https://github.com/stashed/mongodb/commit/02b9a9f) Update go.yml +- [7ede5fd](https://github.com/stashed/mongodb/commit/7ede5fd) Finalize doc template (#3) +- [bb3b7fd](https://github.com/stashed/mongodb/commit/bb3b7fd) Enable GitHub actions +- [6874298](https://github.com/stashed/mongodb/commit/6874298) Improve error handling + remove metrics handling part (#2) +- [000f2c6](https://github.com/stashed/mongodb/commit/000f2c6) Use docker buildx to build docker image +- [867a620](https://github.com/stashed/mongodb/commit/867a620) Use github.com/Azure/go-autorest/autorest@v0.7.0 +- [ecb6143](https://github.com/stashed/mongodb/commit/ecb6143) run `go fmt` +- [618886d](https://github.com/stashed/mongodb/commit/618886d) Improve Mongodump for sharded and replicaset cluster && Chart and documentation (#1) +- [4a7d5c8](https://github.com/stashed/mongodb/commit/4a7d5c8) Reorganize repo +- [1972a9a](https://github.com/stashed/mongodb/commit/1972a9a) VolumeSnapshot (#787) +- [3f1f4cf](https://github.com/stashed/mongodb/commit/3f1f4cf) Remove importance of order of rule in RestoreSession (#795) +- [86a4af0](https://github.com/stashed/mongodb/commit/86a4af0) Skip BackupSession creation if target does not exist + use timestamp … (#797) +- [3abe6f6](https://github.com/stashed/mongodb/commit/3abe6f6) Use restic 0.9.5 (#789) +- [85b21bf](https://github.com/stashed/mongodb/commit/85b21bf) Update concept doc (#739) +- [ad5c8f2](https://github.com/stashed/mongodb/commit/ad5c8f2) Add support for backup cluster resources YAML (#721) +- [2bb8ec3](https://github.com/stashed/mongodb/commit/2bb8ec3) Backup and restore Elasticsearch (#702) +- [1f21268](https://github.com/stashed/mongodb/commit/1f21268) Update package path to stash.appscode.dev/stash (#776) +- [e8fb571](https://github.com/stashed/mongodb/commit/e8fb571) Update to k8s 1.14.0 client libraries using go.mod (#775) +- [eab0f8e](https://github.com/stashed/mongodb/commit/eab0f8e) Remove --rbac flag (#761) +- [4c3e7ea](https://github.com/stashed/mongodb/commit/4c3e7ea) Skip creating/processing backup-session when backup-config is paused (#759) +- [7905eff](https://github.com/stashed/mongodb/commit/7905eff) Stash v1beta1 E2E test for PVC (#753) +- [2c44ee8](https://github.com/stashed/mongodb/commit/2c44ee8) Implement snapshots for v1beta1 api (#749) +- [c88df7a](https://github.com/stashed/mongodb/commit/c88df7a) Run restic commands using docker (#754) +- [8e24d32](https://github.com/stashed/mongodb/commit/8e24d32) Fixed scratch-dir, output-dir and hostname in functions/tasks yamls (#744) +- [8d5944d](https://github.com/stashed/mongodb/commit/8d5944d) Add Stash CLI (#734) +- [550ab37](https://github.com/stashed/mongodb/commit/550ab37) Apply nice/ionice settings from env (#746) +- [42ed76b](https://github.com/stashed/mongodb/commit/42ed76b) Stash V1beta1 E2E test for Deployment (#710) +- [d63f9e9](https://github.com/stashed/mongodb/commit/d63f9e9) Fix openapi path prefixes for validators and mutators (#732) +- [c1347ed](https://github.com/stashed/mongodb/commit/c1347ed) Add max-connections for GCS, Azure, B2 backend (#730) +- [859c4ee](https://github.com/stashed/mongodb/commit/859c4ee) Rename admission webhooks to avoid name collision (#725) +- [d631bb9](https://github.com/stashed/mongodb/commit/d631bb9) Apply EmptyDir settings to TmpDir (#719) +- [cc70068](https://github.com/stashed/mongodb/commit/cc70068) Add support for rest backend (#713) +- [e4db000](https://github.com/stashed/mongodb/commit/e4db000) Add support for OpenShift DeploymentConfig (#714) +- [3fa7bdb](https://github.com/stashed/mongodb/commit/3fa7bdb) Backup and restore Mongo DB (#699) +- [4c39235](https://github.com/stashed/mongodb/commit/4c39235) Backup and restore MySQL DB (#696) +- [3e89d32](https://github.com/stashed/mongodb/commit/3e89d32) Backup and restore Postgres DB (#695) +- [03b95f3](https://github.com/stashed/mongodb/commit/03b95f3) Add BackupSession Controller for Sidecar (#701) +- [cacbc7d](https://github.com/stashed/mongodb/commit/cacbc7d) Update workload controller for new design (#675) +- [5c173e5](https://github.com/stashed/mongodb/commit/5c173e5) Post backup/restore status update (#691) +- [50bbb0a](https://github.com/stashed/mongodb/commit/50bbb0a) Backup and restore PVC (#676) +- [d4a53e2](https://github.com/stashed/mongodb/commit/d4a53e2) Add BackupConfiguration Controller (#671) +- [ef9a4ae](https://github.com/stashed/mongodb/commit/ef9a4ae) Update Kubernetes client libraries to 1.13.0 (#687) +- [c48dbfc](https://github.com/stashed/mongodb/commit/c48dbfc) Separate type definitions into individual files (#646) +- [77f2113](https://github.com/stashed/mongodb/commit/77f2113) Use flags.DumpAll to dump flags (#624) +- [cb54d8c](https://github.com/stashed/mongodb/commit/cb54d8c) Set periodic analytics (#623) +- [248a53a](https://github.com/stashed/mongodb/commit/248a53a) Add validation webhook xray (#618) +- [2029bf4](https://github.com/stashed/mongodb/commit/2029bf4) Use dynamic pushgateway url (#614) +- [bcf5926](https://github.com/stashed/mongodb/commit/bcf5926) Fix offline backup (#537) +- [5049a63](https://github.com/stashed/mongodb/commit/5049a63) Fix extended apiserver issues with Kubernetes 1.11 (#536) +- [9d31255](https://github.com/stashed/mongodb/commit/9d31255) Update client-go to v8.0.0 (#528) +- [d872b4c](https://github.com/stashed/mongodb/commit/d872b4c) Enable status subresource for crds (#524) +- [4795dba](https://github.com/stashed/mongodb/commit/4795dba) Remove ops-address port (#518) +- [e95b151](https://github.com/stashed/mongodb/commit/e95b151) Add support for initial backoff to the apiserver call on recover (#476) +- [120e5de](https://github.com/stashed/mongodb/commit/120e5de) Disable admission controllers for webhook server (#468) +- [2f19545](https://github.com/stashed/mongodb/commit/2f19545) Update client-go to 7.0.0 (#463) +- [e613ff5](https://github.com/stashed/mongodb/commit/e613ff5) Fixes RBAC issue in test (#449) +- [56a3a74](https://github.com/stashed/mongodb/commit/56a3a74) Some cleanup (#446) +- [02565bb](https://github.com/stashed/mongodb/commit/02565bb) Delete restic repository from backend if Repository CRD is deleted (#438) +- [ea98067](https://github.com/stashed/mongodb/commit/ea98067) Fix go_vet error (#440) +- [9d626eb](https://github.com/stashed/mongodb/commit/9d626eb) Increase qps and burst limits (#435) +- [5c6713f](https://github.com/stashed/mongodb/commit/5c6713f) Show repository snapshot list (#417) +- [6d8ef78](https://github.com/stashed/mongodb/commit/6d8ef78) Expose swagger.json (#420) +- [8e04ca0](https://github.com/stashed/mongodb/commit/8e04ca0) Create repository crd for each Restic repository (#394) +- [4c9a478](https://github.com/stashed/mongodb/commit/4c9a478) Rename --analytics to --enable-analytics (#384) +- [7ea2220](https://github.com/stashed/mongodb/commit/7ea2220) Replace initializers with mutation webhook for workloads (#363) +- [2770e6b](https://github.com/stashed/mongodb/commit/2770e6b) Use admission hook helpers from kutil (#360) +- [d3754d7](https://github.com/stashed/mongodb/commit/d3754d7) Implement offline backup for multiple replica (#335) +- [13a2d14](https://github.com/stashed/mongodb/commit/13a2d14) Use official code generator scripts (#336) +- [90642ce](https://github.com/stashed/mongodb/commit/90642ce) Fix e2e tests after webhook merger (#333) +- [2fc3239](https://github.com/stashed/mongodb/commit/2fc3239) Leave secure port unset +- [7cb52b2](https://github.com/stashed/mongodb/commit/7cb52b2) Merge admission webhook and operator into one binary (#329) +- [3306427](https://github.com/stashed/mongodb/commit/3306427) Implement informer factory for backup scheduler (#325) +- [7bb027b](https://github.com/stashed/mongodb/commit/7bb027b) Cleanup apiserver +- [fb8c1e4](https://github.com/stashed/mongodb/commit/fb8c1e4) Copy generic-admission-server into pkg (#318) +- [5a5093f](https://github.com/stashed/mongodb/commit/5a5093f) Use shared infromer factory (#317) +- [0ccb948](https://github.com/stashed/mongodb/commit/0ccb948) Use GetBaseVersion method from kutil (#316) +- [8c5e6ff](https://github.com/stashed/mongodb/commit/8c5e6ff) Fix webhook command description (#314) +- [775a2b6](https://github.com/stashed/mongodb/commit/775a2b6) Merge webhook plugins into one. (#311) +- [a8659fe](https://github.com/stashed/mongodb/commit/a8659fe) Add ValidatingAdmissionWebhook for Stash CRDs (#299) +- [c3e177c](https://github.com/stashed/mongodb/commit/c3e177c) Added support for private docker registry (#300) +- [62ec42e](https://github.com/stashed/mongodb/commit/62ec42e) Update dependencies to Kubernetes 1.9 (#297) +- [cf3ea7c](https://github.com/stashed/mongodb/commit/cf3ea7c) Update appscode/go log wrapper (#287) +- [470cc31](https://github.com/stashed/mongodb/commit/470cc31) Pass --pushgateway-url for injected containers. (#284) +- [e2e79c6](https://github.com/stashed/mongodb/commit/e2e79c6) Fix kubectl version parsing generation in GKE (#267) +- [326aea4](https://github.com/stashed/mongodb/commit/326aea4) Detect analytics client id using env vars (#265) +- [4a5912c](https://github.com/stashed/mongodb/commit/4a5912c) Prepare docs for 0.6.0 release (#264) +- [f75d5df](https://github.com/stashed/mongodb/commit/f75d5df) Remove restic-dependency from recovery (#258) +- [86f01f3](https://github.com/stashed/mongodb/commit/86f01f3) Log operator version on start (#253) +- [4e29b70](https://github.com/stashed/mongodb/commit/4e29b70) Simplify clientID generation for analytics (#247) +- [a45937f](https://github.com/stashed/mongodb/commit/a45937f) Set analytics clientID (#246) +- [ea53cea](https://github.com/stashed/mongodb/commit/ea53cea) Enable Restic cahce-dir flag (#241) +- [dc0030d](https://github.com/stashed/mongodb/commit/dc0030d) Implement offline backup (#229) +- [ae40f35](https://github.com/stashed/mongodb/commit/ae40f35) Revendor kutil (#230) +- [d68a34d](https://github.com/stashed/mongodb/commit/d68a34d) Record recovery status for individual FileGroup (#222) +- [15a24b7](https://github.com/stashed/mongodb/commit/15a24b7) Leader election for deployment, replica set and rc (#206) +- [4a75689](https://github.com/stashed/mongodb/commit/4a75689) Implement Recovery for Restic Backup (#202) +- [78b3942](https://github.com/stashed/mongodb/commit/78b3942) Use typed versioned client for CRD +- [b857b05](https://github.com/stashed/mongodb/commit/b857b05) Change `k8s.io/api/core/v1` pkg alias to core (#204) +- [e52f848](https://github.com/stashed/mongodb/commit/e52f848) Use client-go 5.x +- [4f376ad](https://github.com/stashed/mongodb/commit/4f376ad) Set hostname based on resource type (#198) +- [e530116](https://github.com/stashed/mongodb/commit/e530116) Manage RoleBinding for rbac enabled cluster (#197) +- [e28c13f](https://github.com/stashed/mongodb/commit/e28c13f) Use workqueue for scheduler (#194) +- [2719cbd](https://github.com/stashed/mongodb/commit/2719cbd) Fix e2e tests (#183) +- [9c1cc43](https://github.com/stashed/mongodb/commit/9c1cc43) Use workqueue (#182) +- [b3ee076](https://github.com/stashed/mongodb/commit/b3ee076) Only watch apps/v1beta1 Deployment (#178) +- [4f92ca6](https://github.com/stashed/mongodb/commit/4f92ca6) Use Namespace() method from kutil. +- [78f1e7f](https://github.com/stashed/mongodb/commit/78f1e7f) Update kutil (#170) +- [29a8a1f](https://github.com/stashed/mongodb/commit/29a8a1f) Use apis/v1alpha1 instead of internal version (#167) +- [da3eb2e](https://github.com/stashed/mongodb/commit/da3eb2e) Use kubernetes/code-generator (#163) +- [3b1d6bf](https://github.com/stashed/mongodb/commit/3b1d6bf) Expose resync-period as flag +- [35d8dc6](https://github.com/stashed/mongodb/commit/35d8dc6) Move analytics collector to root command (#164) +- [6a55694](https://github.com/stashed/mongodb/commit/6a55694) Migrate TPR to CRD (#160) +- [91f678f](https://github.com/stashed/mongodb/commit/91f678f) Rename RepositorySecretName to StorageSecretName (#135) +- [d666c81](https://github.com/stashed/mongodb/commit/d666c81) Change mount path for labels to /etc/stash +- [1177d60](https://github.com/stashed/mongodb/commit/1177d60) Part 6 - Update docs (#121) +- [a15689d](https://github.com/stashed/mongodb/commit/a15689d) Various bug fixes (#118) +- [d8a5771](https://github.com/stashed/mongodb/commit/d8a5771) Set TMPDIR env var for restic (#115) +- [60ed8f7](https://github.com/stashed/mongodb/commit/60ed8f7) Update user guide (#94) + + +### [3.4.2-rc.20200826](https://github.com/stashed/mongodb/releases/tag/3.4.2-rc.20200826) + + + +### [3.6.1-rc.20200826](https://github.com/stashed/mongodb/releases/tag/3.6.1-rc.20200826) + + + +### [3.6.8-rc.20200826](https://github.com/stashed/mongodb/releases/tag/3.6.8-rc.20200826) + + + +### [4.0.3-rc.20200826](https://github.com/stashed/mongodb/releases/tag/4.0.3-rc.20200826) + + + +### [4.0.5-rc.20200826](https://github.com/stashed/mongodb/releases/tag/4.0.5-rc.20200826) + + + +### [4.0.11-rc.20200826](https://github.com/stashed/mongodb/releases/tag/4.0.11-rc.20200826) + + + +### [4.1.1-rc.20200826](https://github.com/stashed/mongodb/releases/tag/4.1.1-rc.20200826) + + + +### [4.1.4-rc.20200826](https://github.com/stashed/mongodb/releases/tag/4.1.4-rc.20200826) + + + +### [4.1.7-rc.20200826](https://github.com/stashed/mongodb/releases/tag/4.1.7-rc.20200826) + + + +### [4.2.3-rc.20200826](https://github.com/stashed/mongodb/releases/tag/4.2.3-rc.20200826) + + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-rc.20200826](https://github.com/stashed/mysql/releases/tag/5.7.25-rc.20200826) + +- [3cb98d3](https://github.com/stashed/mysql/commit/3cb98d3) Prepare for release 5.7.25-rc.20200826 (#92) +- [d5b1978](https://github.com/stashed/mysql/commit/d5b1978) [cherry-pick] Update README.md (#89) +- [813ee01](https://github.com/stashed/mysql/commit/813ee01) Prepare for release 5.7.25-beta.20200826 (#85) +- [e646be7](https://github.com/stashed/mysql/commit/e646be7) [cherry-pick] Update Stash installation link (#81) (#82) +- [ecc7d0c](https://github.com/stashed/mysql/commit/ecc7d0c) [cherry-pick] Fix output format (#46) (#78) +- [7fcbd24](https://github.com/stashed/mysql/commit/7fcbd24) [cherry-pick] Pass image tag in values.yaml file (#74) (#75) +- [3188584](https://github.com/stashed/mysql/commit/3188584) [cherry-pick] Update chart icon (#71) +- [9060c7a](https://github.com/stashed/mysql/commit/9060c7a) [cherry-pick] Make chart registry configurable (#67) (#68) +- [422a411](https://github.com/stashed/mysql/commit/422a411) Prepare for release 5.7.25-beta.20200709 (#63) +- [e345110](https://github.com/stashed/mysql/commit/e345110) [cherry-pick] Build docker image in release workflow (#59) (#60) +- [3a44b41](https://github.com/stashed/mysql/commit/3a44b41) Prepare for release 5.7.25-beta.20200708 (#55) +- [7e2984b](https://github.com/stashed/mysql/commit/7e2984b) [cherry-pick] Publish to testing dir for alpha/beta releases (#51) (#52) +- [aa1eac2](https://github.com/stashed/mysql/commit/aa1eac2) [cherry-pick] Update License (#47) (#48) +- [d4370c9](https://github.com/stashed/mysql/commit/d4370c9) Add commands to update chart version (#45) +- [38fb308](https://github.com/stashed/mysql/commit/38fb308) [cherry-pick] Update update-release-tracker.sh (#42) +- [f3bfd48](https://github.com/stashed/mysql/commit/f3bfd48) [cherry-pick] Update update-release-tracker.sh (#39) +- [56e92c4](https://github.com/stashed/mysql/commit/56e92c4) [cherry-pick] Update release.yml (#36) +- [be341e7](https://github.com/stashed/mysql/commit/be341e7) [cherry-pick] Add script to update release tracker on pr merge (#32) (#33) +- [96504a7](https://github.com/stashed/mysql/commit/96504a7) [cherry-pick] Add workflow to cherry pick commits to master (#28) (#29) +- [fcbe891](https://github.com/stashed/mysql/commit/fcbe891) Fix chart release process (#27) +- [c012edf](https://github.com/stashed/mysql/commit/c012edf) Update .kodiak.toml +- [0d22657](https://github.com/stashed/mysql/commit/0d22657) Allow overwriting secret key via SecretTransformation (#26) +- [f717a19](https://github.com/stashed/mysql/commit/f717a19) Fix unit tests (#25) +- [d4f5c4c](https://github.com/stashed/mysql/commit/d4f5c4c) Create .kodiak.toml +- [2bfa098](https://github.com/stashed/mysql/commit/2bfa098) Fix typos +- [5c1a53d](https://github.com/stashed/mysql/commit/5c1a53d) mend +- [9eb402f](https://github.com/stashed/mysql/commit/9eb402f) Update to Kubernetes v1.18.3 (#24) +- [4d4afa2](https://github.com/stashed/mysql/commit/4d4afa2) Fix waitForDBReady() logic + Make timeout configurable (#23) +- [4548802](https://github.com/stashed/mysql/commit/4548802) Update crazy-max/ghaction-docker-buildx flag +- [ce1fa72](https://github.com/stashed/mysql/commit/ce1fa72) Trigger the workflow on push or pull request +- [dad10df](https://github.com/stashed/mysql/commit/dad10df) Auto generate chart readme file +- [462eecf](https://github.com/stashed/mysql/commit/462eecf) Correctly mark optional fields +- [424ec5a](https://github.com/stashed/mysql/commit/424ec5a) Add openapi v3 schema for values file (#20) +- [4755987](https://github.com/stashed/mysql/commit/4755987) Update CI configuration +- [22e8141](https://github.com/stashed/mysql/commit/22e8141) Add support for providing s3 region (#18) +- [793e5e4](https://github.com/stashed/mysql/commit/793e5e4) Make output.json file writable to all users + Fix Flag types (#17) +- [7d65a07](https://github.com/stashed/mysql/commit/7d65a07) Update hugo frontmatter for stash website +- [9392ce0](https://github.com/stashed/mysql/commit/9392ce0) Enable race detector in e2e tests +- [111bbfe](https://github.com/stashed/mysql/commit/111bbfe) Test installers (#15) +- [6eb327f](https://github.com/stashed/mysql/commit/6eb327f) Fix broken link and add AppBinding scheme field (#16) +- [292afdc](https://github.com/stashed/mysql/commit/292afdc) Add license header to files (#14) +- [35bd620](https://github.com/stashed/mysql/commit/35bd620) Split imports into 3 parts (#13) +- [799ee9b](https://github.com/stashed/mysql/commit/799ee9b) Fix BackupSession's Print Columns (#12) +- [6d62faa](https://github.com/stashed/mysql/commit/6d62faa) Enable make ci (#11) +- [9f5d50e](https://github.com/stashed/mysql/commit/9f5d50e) Remove --enable-status-subresource flag (#10) +- [fb1cedd](https://github.com/stashed/mysql/commit/fb1cedd) Fix argument passing (#9) +- [56f9fdb](https://github.com/stashed/mysql/commit/56f9fdb) Only build x86-64 images +- [a2bcae7](https://github.com/stashed/mysql/commit/a2bcae7) Add release pipeline (#8) +- [36eb1be](https://github.com/stashed/mysql/commit/36eb1be) Prepare 5.7.25 release +- [09896d9](https://github.com/stashed/mysql/commit/09896d9) Update go.yml +- [eed5d07](https://github.com/stashed/mysql/commit/eed5d07) Fix link (#7) +- [8278413](https://github.com/stashed/mysql/commit/8278413) Finalize doc template (#6) +- [4ef23ee](https://github.com/stashed/mysql/commit/4ef23ee) Enable GitHub actions +- [5454aac](https://github.com/stashed/mysql/commit/5454aac) Improve error handling + remove metrics handling part (#5) +- [be8e2b6](https://github.com/stashed/mysql/commit/be8e2b6) Use docker buildx to build docker image +- [3d169a2](https://github.com/stashed/mysql/commit/3d169a2) Use github.com/Azure/go-autorest/autorest@v0.7.0 +- [bd920eb](https://github.com/stashed/mysql/commit/bd920eb) Backup and Restore for MySQL-8.0.14 (#3) +- [de01833](https://github.com/stashed/mysql/commit/de01833) Add License headers to make files (#2) +- [cc3ee32](https://github.com/stashed/mysql/commit/cc3ee32) Reorganize repo (#1) +- [1972a9a](https://github.com/stashed/mysql/commit/1972a9a) VolumeSnapshot (#787) +- [3f1f4cf](https://github.com/stashed/mysql/commit/3f1f4cf) Remove importance of order of rule in RestoreSession (#795) +- [86a4af0](https://github.com/stashed/mysql/commit/86a4af0) Skip BackupSession creation if target does not exist + use timestamp … (#797) +- [3abe6f6](https://github.com/stashed/mysql/commit/3abe6f6) Use restic 0.9.5 (#789) +- [85b21bf](https://github.com/stashed/mysql/commit/85b21bf) Update concept doc (#739) +- [ad5c8f2](https://github.com/stashed/mysql/commit/ad5c8f2) Add support for backup cluster resources YAML (#721) +- [2bb8ec3](https://github.com/stashed/mysql/commit/2bb8ec3) Backup and restore Elasticsearch (#702) +- [1f21268](https://github.com/stashed/mysql/commit/1f21268) Update package path to stash.appscode.dev/stash (#776) +- [e8fb571](https://github.com/stashed/mysql/commit/e8fb571) Update to k8s 1.14.0 client libraries using go.mod (#775) +- [eab0f8e](https://github.com/stashed/mysql/commit/eab0f8e) Remove --rbac flag (#761) +- [4c3e7ea](https://github.com/stashed/mysql/commit/4c3e7ea) Skip creating/processing backup-session when backup-config is paused (#759) +- [7905eff](https://github.com/stashed/mysql/commit/7905eff) Stash v1beta1 E2E test for PVC (#753) +- [2c44ee8](https://github.com/stashed/mysql/commit/2c44ee8) Implement snapshots for v1beta1 api (#749) +- [c88df7a](https://github.com/stashed/mysql/commit/c88df7a) Run restic commands using docker (#754) +- [8e24d32](https://github.com/stashed/mysql/commit/8e24d32) Fixed scratch-dir, output-dir and hostname in functions/tasks yamls (#744) +- [8d5944d](https://github.com/stashed/mysql/commit/8d5944d) Add Stash CLI (#734) +- [550ab37](https://github.com/stashed/mysql/commit/550ab37) Apply nice/ionice settings from env (#746) +- [42ed76b](https://github.com/stashed/mysql/commit/42ed76b) Stash V1beta1 E2E test for Deployment (#710) +- [d63f9e9](https://github.com/stashed/mysql/commit/d63f9e9) Fix openapi path prefixes for validators and mutators (#732) +- [c1347ed](https://github.com/stashed/mysql/commit/c1347ed) Add max-connections for GCS, Azure, B2 backend (#730) +- [859c4ee](https://github.com/stashed/mysql/commit/859c4ee) Rename admission webhooks to avoid name collision (#725) +- [d631bb9](https://github.com/stashed/mysql/commit/d631bb9) Apply EmptyDir settings to TmpDir (#719) +- [cc70068](https://github.com/stashed/mysql/commit/cc70068) Add support for rest backend (#713) +- [e4db000](https://github.com/stashed/mysql/commit/e4db000) Add support for OpenShift DeploymentConfig (#714) +- [3fa7bdb](https://github.com/stashed/mysql/commit/3fa7bdb) Backup and restore Mongo DB (#699) +- [4c39235](https://github.com/stashed/mysql/commit/4c39235) Backup and restore MySQL DB (#696) +- [3e89d32](https://github.com/stashed/mysql/commit/3e89d32) Backup and restore Postgres DB (#695) +- [03b95f3](https://github.com/stashed/mysql/commit/03b95f3) Add BackupSession Controller for Sidecar (#701) +- [cacbc7d](https://github.com/stashed/mysql/commit/cacbc7d) Update workload controller for new design (#675) +- [5c173e5](https://github.com/stashed/mysql/commit/5c173e5) Post backup/restore status update (#691) +- [50bbb0a](https://github.com/stashed/mysql/commit/50bbb0a) Backup and restore PVC (#676) +- [d4a53e2](https://github.com/stashed/mysql/commit/d4a53e2) Add BackupConfiguration Controller (#671) +- [ef9a4ae](https://github.com/stashed/mysql/commit/ef9a4ae) Update Kubernetes client libraries to 1.13.0 (#687) +- [c48dbfc](https://github.com/stashed/mysql/commit/c48dbfc) Separate type definitions into individual files (#646) +- [77f2113](https://github.com/stashed/mysql/commit/77f2113) Use flags.DumpAll to dump flags (#624) +- [cb54d8c](https://github.com/stashed/mysql/commit/cb54d8c) Set periodic analytics (#623) +- [248a53a](https://github.com/stashed/mysql/commit/248a53a) Add validation webhook xray (#618) +- [2029bf4](https://github.com/stashed/mysql/commit/2029bf4) Use dynamic pushgateway url (#614) +- [bcf5926](https://github.com/stashed/mysql/commit/bcf5926) Fix offline backup (#537) +- [5049a63](https://github.com/stashed/mysql/commit/5049a63) Fix extended apiserver issues with Kubernetes 1.11 (#536) +- [9d31255](https://github.com/stashed/mysql/commit/9d31255) Update client-go to v8.0.0 (#528) +- [d872b4c](https://github.com/stashed/mysql/commit/d872b4c) Enable status subresource for crds (#524) +- [4795dba](https://github.com/stashed/mysql/commit/4795dba) Remove ops-address port (#518) +- [e95b151](https://github.com/stashed/mysql/commit/e95b151) Add support for initial backoff to the apiserver call on recover (#476) +- [120e5de](https://github.com/stashed/mysql/commit/120e5de) Disable admission controllers for webhook server (#468) +- [2f19545](https://github.com/stashed/mysql/commit/2f19545) Update client-go to 7.0.0 (#463) +- [e613ff5](https://github.com/stashed/mysql/commit/e613ff5) Fixes RBAC issue in test (#449) +- [56a3a74](https://github.com/stashed/mysql/commit/56a3a74) Some cleanup (#446) +- [02565bb](https://github.com/stashed/mysql/commit/02565bb) Delete restic repository from backend if Repository CRD is deleted (#438) +- [ea98067](https://github.com/stashed/mysql/commit/ea98067) Fix go_vet error (#440) +- [9d626eb](https://github.com/stashed/mysql/commit/9d626eb) Increase qps and burst limits (#435) +- [5c6713f](https://github.com/stashed/mysql/commit/5c6713f) Show repository snapshot list (#417) +- [6d8ef78](https://github.com/stashed/mysql/commit/6d8ef78) Expose swagger.json (#420) +- [8e04ca0](https://github.com/stashed/mysql/commit/8e04ca0) Create repository crd for each Restic repository (#394) +- [4c9a478](https://github.com/stashed/mysql/commit/4c9a478) Rename --analytics to --enable-analytics (#384) +- [7ea2220](https://github.com/stashed/mysql/commit/7ea2220) Replace initializers with mutation webhook for workloads (#363) +- [2770e6b](https://github.com/stashed/mysql/commit/2770e6b) Use admission hook helpers from kutil (#360) +- [d3754d7](https://github.com/stashed/mysql/commit/d3754d7) Implement offline backup for multiple replica (#335) +- [13a2d14](https://github.com/stashed/mysql/commit/13a2d14) Use official code generator scripts (#336) +- [90642ce](https://github.com/stashed/mysql/commit/90642ce) Fix e2e tests after webhook merger (#333) +- [2fc3239](https://github.com/stashed/mysql/commit/2fc3239) Leave secure port unset +- [7cb52b2](https://github.com/stashed/mysql/commit/7cb52b2) Merge admission webhook and operator into one binary (#329) +- [3306427](https://github.com/stashed/mysql/commit/3306427) Implement informer factory for backup scheduler (#325) +- [7bb027b](https://github.com/stashed/mysql/commit/7bb027b) Cleanup apiserver +- [fb8c1e4](https://github.com/stashed/mysql/commit/fb8c1e4) Copy generic-admission-server into pkg (#318) +- [5a5093f](https://github.com/stashed/mysql/commit/5a5093f) Use shared infromer factory (#317) +- [0ccb948](https://github.com/stashed/mysql/commit/0ccb948) Use GetBaseVersion method from kutil (#316) +- [8c5e6ff](https://github.com/stashed/mysql/commit/8c5e6ff) Fix webhook command description (#314) +- [775a2b6](https://github.com/stashed/mysql/commit/775a2b6) Merge webhook plugins into one. (#311) +- [a8659fe](https://github.com/stashed/mysql/commit/a8659fe) Add ValidatingAdmissionWebhook for Stash CRDs (#299) +- [c3e177c](https://github.com/stashed/mysql/commit/c3e177c) Added support for private docker registry (#300) +- [62ec42e](https://github.com/stashed/mysql/commit/62ec42e) Update dependencies to Kubernetes 1.9 (#297) +- [cf3ea7c](https://github.com/stashed/mysql/commit/cf3ea7c) Update appscode/go log wrapper (#287) +- [470cc31](https://github.com/stashed/mysql/commit/470cc31) Pass --pushgateway-url for injected containers. (#284) +- [e2e79c6](https://github.com/stashed/mysql/commit/e2e79c6) Fix kubectl version parsing generation in GKE (#267) +- [326aea4](https://github.com/stashed/mysql/commit/326aea4) Detect analytics client id using env vars (#265) +- [4a5912c](https://github.com/stashed/mysql/commit/4a5912c) Prepare docs for 0.6.0 release (#264) +- [f75d5df](https://github.com/stashed/mysql/commit/f75d5df) Remove restic-dependency from recovery (#258) +- [86f01f3](https://github.com/stashed/mysql/commit/86f01f3) Log operator version on start (#253) +- [4e29b70](https://github.com/stashed/mysql/commit/4e29b70) Simplify clientID generation for analytics (#247) +- [a45937f](https://github.com/stashed/mysql/commit/a45937f) Set analytics clientID (#246) +- [ea53cea](https://github.com/stashed/mysql/commit/ea53cea) Enable Restic cahce-dir flag (#241) +- [dc0030d](https://github.com/stashed/mysql/commit/dc0030d) Implement offline backup (#229) +- [ae40f35](https://github.com/stashed/mysql/commit/ae40f35) Revendor kutil (#230) +- [d68a34d](https://github.com/stashed/mysql/commit/d68a34d) Record recovery status for individual FileGroup (#222) +- [15a24b7](https://github.com/stashed/mysql/commit/15a24b7) Leader election for deployment, replica set and rc (#206) +- [4a75689](https://github.com/stashed/mysql/commit/4a75689) Implement Recovery for Restic Backup (#202) +- [78b3942](https://github.com/stashed/mysql/commit/78b3942) Use typed versioned client for CRD +- [b857b05](https://github.com/stashed/mysql/commit/b857b05) Change `k8s.io/api/core/v1` pkg alias to core (#204) +- [e52f848](https://github.com/stashed/mysql/commit/e52f848) Use client-go 5.x +- [4f376ad](https://github.com/stashed/mysql/commit/4f376ad) Set hostname based on resource type (#198) +- [e530116](https://github.com/stashed/mysql/commit/e530116) Manage RoleBinding for rbac enabled cluster (#197) +- [e28c13f](https://github.com/stashed/mysql/commit/e28c13f) Use workqueue for scheduler (#194) +- [2719cbd](https://github.com/stashed/mysql/commit/2719cbd) Fix e2e tests (#183) +- [9c1cc43](https://github.com/stashed/mysql/commit/9c1cc43) Use workqueue (#182) +- [b3ee076](https://github.com/stashed/mysql/commit/b3ee076) Only watch apps/v1beta1 Deployment (#178) +- [4f92ca6](https://github.com/stashed/mysql/commit/4f92ca6) Use Namespace() method from kutil. +- [78f1e7f](https://github.com/stashed/mysql/commit/78f1e7f) Update kutil (#170) +- [29a8a1f](https://github.com/stashed/mysql/commit/29a8a1f) Use apis/v1alpha1 instead of internal version (#167) +- [da3eb2e](https://github.com/stashed/mysql/commit/da3eb2e) Use kubernetes/code-generator (#163) +- [3b1d6bf](https://github.com/stashed/mysql/commit/3b1d6bf) Expose resync-period as flag +- [35d8dc6](https://github.com/stashed/mysql/commit/35d8dc6) Move analytics collector to root command (#164) +- [6a55694](https://github.com/stashed/mysql/commit/6a55694) Migrate TPR to CRD (#160) +- [91f678f](https://github.com/stashed/mysql/commit/91f678f) Rename RepositorySecretName to StorageSecretName (#135) +- [d666c81](https://github.com/stashed/mysql/commit/d666c81) Change mount path for labels to /etc/stash +- [1177d60](https://github.com/stashed/mysql/commit/1177d60) Part 6 - Update docs (#121) +- [a15689d](https://github.com/stashed/mysql/commit/a15689d) Various bug fixes (#118) +- [d8a5771](https://github.com/stashed/mysql/commit/d8a5771) Set TMPDIR env var for restic (#115) +- [60ed8f7](https://github.com/stashed/mysql/commit/60ed8f7) Update user guide (#94) + + +### [8.0.3-rc.20200826](https://github.com/stashed/mysql/releases/tag/8.0.3-rc.20200826) + + + +### [8.0.14-rc.20200826](https://github.com/stashed/mysql/releases/tag/8.0.14-rc.20200826) + + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-rc.20200826](https://github.com/stashed/percona-xtradb/releases/tag/5.7-rc.20200826) + +- [416d7d8](https://github.com/stashed/percona-xtradb/commit/416d7d8) Prepare for release 5.7-rc.20200826 (#52) +- [b390913](https://github.com/stashed/percona-xtradb/commit/b390913) [cherry-pick] Update issues link (#51) +- [10b9a66](https://github.com/stashed/percona-xtradb/commit/10b9a66) Prepare for release 5.7-beta.20200826 (#49) +- [53f26da](https://github.com/stashed/percona-xtradb/commit/53f26da) [cherry-pick] Update Stash installation link (#47) (#48) +- [3eae3d3](https://github.com/stashed/percona-xtradb/commit/3eae3d3) [cherry-pick] Fix output format + Add PreBackupActions logic (#43) (#46) +- [0fa2765](https://github.com/stashed/percona-xtradb/commit/0fa2765) [cherry-pick] Make image.tag in values.yaml file as same as $APP_VERSION (#44) (#45) +- [7ad46c0](https://github.com/stashed/percona-xtradb/commit/7ad46c0) [cherry-pick] Update chart icon (#42) +- [97f7e6d](https://github.com/stashed/percona-xtradb/commit/97f7e6d) [cherry-pick] Make chart registry configurable (#40) (#41) +- [7fc07cc](https://github.com/stashed/percona-xtradb/commit/7fc07cc) Prepare for release 5.7-beta.20200709 (#38) +- [ca32b31](https://github.com/stashed/percona-xtradb/commit/ca32b31) [cherry-pick] Build docker image in release workflow (#36) (#37) +- [efb98e4](https://github.com/stashed/percona-xtradb/commit/efb98e4) [cherry-pick] Publish to testing dir for alpha/beta releases (#32) (#35) +- [0535469](https://github.com/stashed/percona-xtradb/commit/0535469) Prepare for release 5.7-beta.20200708 (#33) +- [6aac98e](https://github.com/stashed/percona-xtradb/commit/6aac98e) Add commands to update chart version (#30) +- [24431c1](https://github.com/stashed/percona-xtradb/commit/24431c1) [cherry-pick] Update update-release-tracker.sh (#29) +- [89c2a37](https://github.com/stashed/percona-xtradb/commit/89c2a37) [cherry-pick] Update update-release-tracker.sh (#28) +- [4163a9c](https://github.com/stashed/percona-xtradb/commit/4163a9c) [cherry-pick] Update release.yml (#27) +- [66d54d2](https://github.com/stashed/percona-xtradb/commit/66d54d2) [cherry-pick] Add script to update release tracker on pr merge (#25) (#26) +- [f280602](https://github.com/stashed/percona-xtradb/commit/f280602) [cherry-pick] Add workflow to cherry pick commits to master (#23) (#24) +- [7ca441c](https://github.com/stashed/percona-xtradb/commit/7ca441c) Fix chart release process (#21) +- [76fca67](https://github.com/stashed/percona-xtradb/commit/76fca67) Update .kodiak.toml +- [ecbd60c](https://github.com/stashed/percona-xtradb/commit/ecbd60c) Allow overwriting secret key via SecretTransformation (#20) +- [8404948](https://github.com/stashed/percona-xtradb/commit/8404948) Make waitTimeout configurable through flag (#19) +- [110985a](https://github.com/stashed/percona-xtradb/commit/110985a) Create .kodiak.toml +- [70ed4b2](https://github.com/stashed/percona-xtradb/commit/70ed4b2) Update to Kubernetes v1.18.3 (#18) +- [75efdb9](https://github.com/stashed/percona-xtradb/commit/75efdb9) Update crazy-max/ghaction-docker-buildx flag +- [56b5472](https://github.com/stashed/percona-xtradb/commit/56b5472) Trigger the workflow on push or pull request +- [14e9f5a](https://github.com/stashed/percona-xtradb/commit/14e9f5a) Auto generate chart readme file +- [31ff6c4](https://github.com/stashed/percona-xtradb/commit/31ff6c4) Correctly mark optional fields +- [3676857](https://github.com/stashed/percona-xtradb/commit/3676857) Add openapi v3 schema for values file (#15) +- [9b32ca9](https://github.com/stashed/percona-xtradb/commit/9b32ca9) Update CI configuration +- [9ba20af](https://github.com/stashed/percona-xtradb/commit/9ba20af) Add support for providing s3 region (#14) +- [2ee6c3b](https://github.com/stashed/percona-xtradb/commit/2ee6c3b) Update percona standalone backup-restore (#13) +- [af1a30b](https://github.com/stashed/percona-xtradb/commit/af1a30b) Update PerconaXtraDB version for percona xtradb cluster (#12) +- [7ddb43a](https://github.com/stashed/percona-xtradb/commit/7ddb43a) Make output.json file writable to all users + Fix Flag types (#11) +- [06aa5c3](https://github.com/stashed/percona-xtradb/commit/06aa5c3) Update hugo frontmatter for stash website +- [4171676](https://github.com/stashed/percona-xtradb/commit/4171676) Enable race detector in e2e tests +- [9ab6f35](https://github.com/stashed/percona-xtradb/commit/9ab6f35) Added scheme field in AppBinding (#10) +- [a4262ea](https://github.com/stashed/percona-xtradb/commit/a4262ea) Test installers (#9) +- [72be668](https://github.com/stashed/percona-xtradb/commit/72be668) Don't build docker image for arm64 +- [2974e8b](https://github.com/stashed/percona-xtradb/commit/2974e8b) Update license file templates +- [dd96199](https://github.com/stashed/percona-xtradb/commit/dd96199) Add license header to files (#8) +- [93e37a6](https://github.com/stashed/percona-xtradb/commit/93e37a6) Backup and restore doc for Percona XtraDB 5.7 (#7) +- [aafee30](https://github.com/stashed/percona-xtradb/commit/aafee30) Fix percona-xtradb backup & restore (#6) +- [06cbe89](https://github.com/stashed/percona-xtradb/commit/06cbe89) Fix Docker image badge (#5) +- [2e6c4c6](https://github.com/stashed/percona-xtradb/commit/2e6c4c6) Update Makefile (#4) +- [11da7a1](https://github.com/stashed/percona-xtradb/commit/11da7a1) Add release pipeline (#3) +- [75ca782](https://github.com/stashed/percona-xtradb/commit/75ca782) Update go.yml +- [998acad](https://github.com/stashed/percona-xtradb/commit/998acad) Enable GitHub actions +- [a32083a](https://github.com/stashed/percona-xtradb/commit/a32083a) Improve error handling + remove metrics handling part (#2) +- [87b38a5](https://github.com/stashed/percona-xtradb/commit/87b38a5) Backup & Restore PerconaXtraDB using Stash (#1) +- [a4485ab](https://github.com/stashed/percona-xtradb/commit/a4485ab) Reorganize repo +- [1972a9a](https://github.com/stashed/percona-xtradb/commit/1972a9a) VolumeSnapshot (#787) +- [3f1f4cf](https://github.com/stashed/percona-xtradb/commit/3f1f4cf) Remove importance of order of rule in RestoreSession (#795) +- [86a4af0](https://github.com/stashed/percona-xtradb/commit/86a4af0) Skip BackupSession creation if target does not exist + use timestamp … (#797) +- [3abe6f6](https://github.com/stashed/percona-xtradb/commit/3abe6f6) Use restic 0.9.5 (#789) +- [85b21bf](https://github.com/stashed/percona-xtradb/commit/85b21bf) Update concept doc (#739) +- [ad5c8f2](https://github.com/stashed/percona-xtradb/commit/ad5c8f2) Add support for backup cluster resources YAML (#721) +- [2bb8ec3](https://github.com/stashed/percona-xtradb/commit/2bb8ec3) Backup and restore Elasticsearch (#702) +- [1f21268](https://github.com/stashed/percona-xtradb/commit/1f21268) Update package path to stash.appscode.dev/stash (#776) +- [e8fb571](https://github.com/stashed/percona-xtradb/commit/e8fb571) Update to k8s 1.14.0 client libraries using go.mod (#775) +- [eab0f8e](https://github.com/stashed/percona-xtradb/commit/eab0f8e) Remove --rbac flag (#761) +- [4c3e7ea](https://github.com/stashed/percona-xtradb/commit/4c3e7ea) Skip creating/processing backup-session when backup-config is paused (#759) +- [7905eff](https://github.com/stashed/percona-xtradb/commit/7905eff) Stash v1beta1 E2E test for PVC (#753) +- [2c44ee8](https://github.com/stashed/percona-xtradb/commit/2c44ee8) Implement snapshots for v1beta1 api (#749) +- [c88df7a](https://github.com/stashed/percona-xtradb/commit/c88df7a) Run restic commands using docker (#754) +- [8e24d32](https://github.com/stashed/percona-xtradb/commit/8e24d32) Fixed scratch-dir, output-dir and hostname in functions/tasks yamls (#744) +- [8d5944d](https://github.com/stashed/percona-xtradb/commit/8d5944d) Add Stash CLI (#734) +- [550ab37](https://github.com/stashed/percona-xtradb/commit/550ab37) Apply nice/ionice settings from env (#746) +- [42ed76b](https://github.com/stashed/percona-xtradb/commit/42ed76b) Stash V1beta1 E2E test for Deployment (#710) +- [d63f9e9](https://github.com/stashed/percona-xtradb/commit/d63f9e9) Fix openapi path prefixes for validators and mutators (#732) +- [c1347ed](https://github.com/stashed/percona-xtradb/commit/c1347ed) Add max-connections for GCS, Azure, B2 backend (#730) +- [859c4ee](https://github.com/stashed/percona-xtradb/commit/859c4ee) Rename admission webhooks to avoid name collision (#725) +- [d631bb9](https://github.com/stashed/percona-xtradb/commit/d631bb9) Apply EmptyDir settings to TmpDir (#719) +- [cc70068](https://github.com/stashed/percona-xtradb/commit/cc70068) Add support for rest backend (#713) +- [e4db000](https://github.com/stashed/percona-xtradb/commit/e4db000) Add support for OpenShift DeploymentConfig (#714) +- [3fa7bdb](https://github.com/stashed/percona-xtradb/commit/3fa7bdb) Backup and restore Mongo DB (#699) +- [4c39235](https://github.com/stashed/percona-xtradb/commit/4c39235) Backup and restore MySQL DB (#696) +- [3e89d32](https://github.com/stashed/percona-xtradb/commit/3e89d32) Backup and restore Postgres DB (#695) +- [03b95f3](https://github.com/stashed/percona-xtradb/commit/03b95f3) Add BackupSession Controller for Sidecar (#701) +- [cacbc7d](https://github.com/stashed/percona-xtradb/commit/cacbc7d) Update workload controller for new design (#675) +- [5c173e5](https://github.com/stashed/percona-xtradb/commit/5c173e5) Post backup/restore status update (#691) +- [50bbb0a](https://github.com/stashed/percona-xtradb/commit/50bbb0a) Backup and restore PVC (#676) +- [d4a53e2](https://github.com/stashed/percona-xtradb/commit/d4a53e2) Add BackupConfiguration Controller (#671) +- [ef9a4ae](https://github.com/stashed/percona-xtradb/commit/ef9a4ae) Update Kubernetes client libraries to 1.13.0 (#687) +- [c48dbfc](https://github.com/stashed/percona-xtradb/commit/c48dbfc) Separate type definitions into individual files (#646) +- [77f2113](https://github.com/stashed/percona-xtradb/commit/77f2113) Use flags.DumpAll to dump flags (#624) +- [cb54d8c](https://github.com/stashed/percona-xtradb/commit/cb54d8c) Set periodic analytics (#623) +- [248a53a](https://github.com/stashed/percona-xtradb/commit/248a53a) Add validation webhook xray (#618) +- [2029bf4](https://github.com/stashed/percona-xtradb/commit/2029bf4) Use dynamic pushgateway url (#614) +- [bcf5926](https://github.com/stashed/percona-xtradb/commit/bcf5926) Fix offline backup (#537) +- [5049a63](https://github.com/stashed/percona-xtradb/commit/5049a63) Fix extended apiserver issues with Kubernetes 1.11 (#536) +- [9d31255](https://github.com/stashed/percona-xtradb/commit/9d31255) Update client-go to v8.0.0 (#528) +- [d872b4c](https://github.com/stashed/percona-xtradb/commit/d872b4c) Enable status subresource for crds (#524) +- [4795dba](https://github.com/stashed/percona-xtradb/commit/4795dba) Remove ops-address port (#518) +- [e95b151](https://github.com/stashed/percona-xtradb/commit/e95b151) Add support for initial backoff to the apiserver call on recover (#476) +- [120e5de](https://github.com/stashed/percona-xtradb/commit/120e5de) Disable admission controllers for webhook server (#468) +- [2f19545](https://github.com/stashed/percona-xtradb/commit/2f19545) Update client-go to 7.0.0 (#463) +- [e613ff5](https://github.com/stashed/percona-xtradb/commit/e613ff5) Fixes RBAC issue in test (#449) +- [56a3a74](https://github.com/stashed/percona-xtradb/commit/56a3a74) Some cleanup (#446) +- [02565bb](https://github.com/stashed/percona-xtradb/commit/02565bb) Delete restic repository from backend if Repository CRD is deleted (#438) +- [ea98067](https://github.com/stashed/percona-xtradb/commit/ea98067) Fix go_vet error (#440) +- [9d626eb](https://github.com/stashed/percona-xtradb/commit/9d626eb) Increase qps and burst limits (#435) +- [5c6713f](https://github.com/stashed/percona-xtradb/commit/5c6713f) Show repository snapshot list (#417) +- [6d8ef78](https://github.com/stashed/percona-xtradb/commit/6d8ef78) Expose swagger.json (#420) +- [8e04ca0](https://github.com/stashed/percona-xtradb/commit/8e04ca0) Create repository crd for each Restic repository (#394) +- [4c9a478](https://github.com/stashed/percona-xtradb/commit/4c9a478) Rename --analytics to --enable-analytics (#384) +- [7ea2220](https://github.com/stashed/percona-xtradb/commit/7ea2220) Replace initializers with mutation webhook for workloads (#363) +- [2770e6b](https://github.com/stashed/percona-xtradb/commit/2770e6b) Use admission hook helpers from kutil (#360) +- [d3754d7](https://github.com/stashed/percona-xtradb/commit/d3754d7) Implement offline backup for multiple replica (#335) +- [13a2d14](https://github.com/stashed/percona-xtradb/commit/13a2d14) Use official code generator scripts (#336) +- [90642ce](https://github.com/stashed/percona-xtradb/commit/90642ce) Fix e2e tests after webhook merger (#333) +- [2fc3239](https://github.com/stashed/percona-xtradb/commit/2fc3239) Leave secure port unset +- [7cb52b2](https://github.com/stashed/percona-xtradb/commit/7cb52b2) Merge admission webhook and operator into one binary (#329) +- [3306427](https://github.com/stashed/percona-xtradb/commit/3306427) Implement informer factory for backup scheduler (#325) +- [7bb027b](https://github.com/stashed/percona-xtradb/commit/7bb027b) Cleanup apiserver +- [fb8c1e4](https://github.com/stashed/percona-xtradb/commit/fb8c1e4) Copy generic-admission-server into pkg (#318) +- [5a5093f](https://github.com/stashed/percona-xtradb/commit/5a5093f) Use shared infromer factory (#317) +- [0ccb948](https://github.com/stashed/percona-xtradb/commit/0ccb948) Use GetBaseVersion method from kutil (#316) +- [8c5e6ff](https://github.com/stashed/percona-xtradb/commit/8c5e6ff) Fix webhook command description (#314) +- [775a2b6](https://github.com/stashed/percona-xtradb/commit/775a2b6) Merge webhook plugins into one. (#311) +- [a8659fe](https://github.com/stashed/percona-xtradb/commit/a8659fe) Add ValidatingAdmissionWebhook for Stash CRDs (#299) +- [c3e177c](https://github.com/stashed/percona-xtradb/commit/c3e177c) Added support for private docker registry (#300) +- [62ec42e](https://github.com/stashed/percona-xtradb/commit/62ec42e) Update dependencies to Kubernetes 1.9 (#297) +- [cf3ea7c](https://github.com/stashed/percona-xtradb/commit/cf3ea7c) Update appscode/go log wrapper (#287) +- [470cc31](https://github.com/stashed/percona-xtradb/commit/470cc31) Pass --pushgateway-url for injected containers. (#284) +- [e2e79c6](https://github.com/stashed/percona-xtradb/commit/e2e79c6) Fix kubectl version parsing generation in GKE (#267) +- [326aea4](https://github.com/stashed/percona-xtradb/commit/326aea4) Detect analytics client id using env vars (#265) +- [4a5912c](https://github.com/stashed/percona-xtradb/commit/4a5912c) Prepare docs for 0.6.0 release (#264) +- [f75d5df](https://github.com/stashed/percona-xtradb/commit/f75d5df) Remove restic-dependency from recovery (#258) +- [86f01f3](https://github.com/stashed/percona-xtradb/commit/86f01f3) Log operator version on start (#253) +- [4e29b70](https://github.com/stashed/percona-xtradb/commit/4e29b70) Simplify clientID generation for analytics (#247) +- [a45937f](https://github.com/stashed/percona-xtradb/commit/a45937f) Set analytics clientID (#246) +- [ea53cea](https://github.com/stashed/percona-xtradb/commit/ea53cea) Enable Restic cahce-dir flag (#241) +- [dc0030d](https://github.com/stashed/percona-xtradb/commit/dc0030d) Implement offline backup (#229) +- [ae40f35](https://github.com/stashed/percona-xtradb/commit/ae40f35) Revendor kutil (#230) +- [d68a34d](https://github.com/stashed/percona-xtradb/commit/d68a34d) Record recovery status for individual FileGroup (#222) +- [15a24b7](https://github.com/stashed/percona-xtradb/commit/15a24b7) Leader election for deployment, replica set and rc (#206) +- [4a75689](https://github.com/stashed/percona-xtradb/commit/4a75689) Implement Recovery for Restic Backup (#202) +- [78b3942](https://github.com/stashed/percona-xtradb/commit/78b3942) Use typed versioned client for CRD +- [b857b05](https://github.com/stashed/percona-xtradb/commit/b857b05) Change `k8s.io/api/core/v1` pkg alias to core (#204) +- [e52f848](https://github.com/stashed/percona-xtradb/commit/e52f848) Use client-go 5.x +- [4f376ad](https://github.com/stashed/percona-xtradb/commit/4f376ad) Set hostname based on resource type (#198) +- [e530116](https://github.com/stashed/percona-xtradb/commit/e530116) Manage RoleBinding for rbac enabled cluster (#197) +- [e28c13f](https://github.com/stashed/percona-xtradb/commit/e28c13f) Use workqueue for scheduler (#194) +- [2719cbd](https://github.com/stashed/percona-xtradb/commit/2719cbd) Fix e2e tests (#183) +- [9c1cc43](https://github.com/stashed/percona-xtradb/commit/9c1cc43) Use workqueue (#182) +- [b3ee076](https://github.com/stashed/percona-xtradb/commit/b3ee076) Only watch apps/v1beta1 Deployment (#178) +- [4f92ca6](https://github.com/stashed/percona-xtradb/commit/4f92ca6) Use Namespace() method from kutil. +- [78f1e7f](https://github.com/stashed/percona-xtradb/commit/78f1e7f) Update kutil (#170) +- [29a8a1f](https://github.com/stashed/percona-xtradb/commit/29a8a1f) Use apis/v1alpha1 instead of internal version (#167) +- [da3eb2e](https://github.com/stashed/percona-xtradb/commit/da3eb2e) Use kubernetes/code-generator (#163) +- [3b1d6bf](https://github.com/stashed/percona-xtradb/commit/3b1d6bf) Expose resync-period as flag +- [35d8dc6](https://github.com/stashed/percona-xtradb/commit/35d8dc6) Move analytics collector to root command (#164) +- [6a55694](https://github.com/stashed/percona-xtradb/commit/6a55694) Migrate TPR to CRD (#160) +- [91f678f](https://github.com/stashed/percona-xtradb/commit/91f678f) Rename RepositorySecretName to StorageSecretName (#135) +- [d666c81](https://github.com/stashed/percona-xtradb/commit/d666c81) Change mount path for labels to /etc/stash +- [1177d60](https://github.com/stashed/percona-xtradb/commit/1177d60) Part 6 - Update docs (#121) +- [a15689d](https://github.com/stashed/percona-xtradb/commit/a15689d) Various bug fixes (#118) +- [d8a5771](https://github.com/stashed/percona-xtradb/commit/d8a5771) Set TMPDIR env var for restic (#115) +- [60ed8f7](https://github.com/stashed/percona-xtradb/commit/60ed8f7) Update user guide (#94) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6-rc.20200826](https://github.com/stashed/postgres/releases/tag/9.6-rc.20200826) + +- [5715456](https://github.com/stashed/postgres/commit/5715456) Prepare for release 9.6-rc.20200826 (#152) +- [0442f99](https://github.com/stashed/postgres/commit/0442f99) [cherry-pick] Update README.md (#147) +- [61c4425](https://github.com/stashed/postgres/commit/61c4425) Prepare for release 9.6-beta.20200826 (#141) +- [b313c2c](https://github.com/stashed/postgres/commit/b313c2c) Update Stash installation link (#131) (#136) +- [d73595e](https://github.com/stashed/postgres/commit/d73595e) [cherry-pick] Update twitter handle (#125) (#130) +- [875edd5](https://github.com/stashed/postgres/commit/875edd5) [cherry-pick] Use image tag same as the $APP_VERSION (#114) (#124) +- [5a9a784](https://github.com/stashed/postgres/commit/5a9a784) [cherry-pick] Fix output format + Add PreBackupActions logic (#113) (#119) +- [ce47f3a](https://github.com/stashed/postgres/commit/ce47f3a) [cherry-pick] Update chart icon (#112) +- [decfbb0](https://github.com/stashed/postgres/commit/decfbb0) [cherry-pick] Make chart registry configurable (#102) (#107) +- [5befa82](https://github.com/stashed/postgres/commit/5befa82) Prepare for release 9.6-beta.20200709 (#100) +- [52fab57](https://github.com/stashed/postgres/commit/52fab57) [cherry-pick] Build docker images in release workflow (#90) (#95) +- [d85fc80](https://github.com/stashed/postgres/commit/d85fc80) Prepare for release 9.6-beta.20200708 (#88) +- [fbd6766](https://github.com/stashed/postgres/commit/fbd6766) [cherry-pick] Publish to testing dir for alpha/beta releases (#78) (#83) +- [1b32879](https://github.com/stashed/postgres/commit/1b32879) [cherry-pick] Update License (#72) (#77) +- [388ddee](https://github.com/stashed/postgres/commit/388ddee) Add commands to update chart version (#71) +- [875c1f0](https://github.com/stashed/postgres/commit/875c1f0) [cherry-pick] Update update-release-tracker.sh (#70) +- [0e71e2d](https://github.com/stashed/postgres/commit/0e71e2d) [cherry-pick] Update update-release-tracker.sh (#65) +- [bbfac61](https://github.com/stashed/postgres/commit/bbfac61) [cherry-pick] Update release.yml (#55) (#60) +- [986d0a7](https://github.com/stashed/postgres/commit/986d0a7) [cherry-pick] Add script to update release tracker on pr merge (#49) (#54) +- [6edaf36](https://github.com/stashed/postgres/commit/6edaf36) [cherry-pick] Remove /cherry-pick from cherry picked prs (#43) (#48) +- [6743dbe](https://github.com/stashed/postgres/commit/6743dbe) [cherry-pick] Add workflow to cherry pick commits to master (#37) (#42) +- [fb4f222](https://github.com/stashed/postgres/commit/fb4f222) Fix chart release process (#36) +- [b5ddf5f](https://github.com/stashed/postgres/commit/b5ddf5f) Update .kodiak.toml +- [7951787](https://github.com/stashed/postgres/commit/7951787) Fix waitForDBReady() logic + Make timeout configurable (#35) +- [e7bb18f](https://github.com/stashed/postgres/commit/e7bb18f) Create .kodiak.toml +- [60acc09](https://github.com/stashed/postgres/commit/60acc09) Merge pull request Allow overriding secret keys from AppBinding #33 +- [aaff7fb](https://github.com/stashed/postgres/commit/aaff7fb) Fix typos (#32) +- [568f584](https://github.com/stashed/postgres/commit/568f584) Update to Kubernetes v1.18.3 (#34) +- [098bb78](https://github.com/stashed/postgres/commit/098bb78) Update crazy-max/ghaction-docker-buildx flag +- [4385362](https://github.com/stashed/postgres/commit/4385362) function-args: add pg-back-cmd option +- [7cd065c](https://github.com/stashed/postgres/commit/7cd065c) Trigger the workflow on push or pull request +- [b63e3e5](https://github.com/stashed/postgres/commit/b63e3e5) Auto generate chart readme file +- [dea1a41](https://github.com/stashed/postgres/commit/dea1a41) Correctly mark optional fields +- [efc4283](https://github.com/stashed/postgres/commit/efc4283) Add openapi v3 schema for values file (#27) +- [99a417e](https://github.com/stashed/postgres/commit/99a417e) Update CI configuration +- [712aabb](https://github.com/stashed/postgres/commit/712aabb) Add support for providing s3 region (#26) +- [111a3fe](https://github.com/stashed/postgres/commit/111a3fe) Make output.json file writable to all users + Fix Flag types (#25) +- [1694bb7](https://github.com/stashed/postgres/commit/1694bb7) Update hugo frontmatter for stash website +- [ab592bd](https://github.com/stashed/postgres/commit/ab592bd) Enable race detector in e2e tests +- [6df8761](https://github.com/stashed/postgres/commit/6df8761) Fixed broken link, Added AppBinding scheme field (#24) +- [e3f4905](https://github.com/stashed/postgres/commit/e3f4905) Test installers (#23) +- [a3c2d0f](https://github.com/stashed/postgres/commit/a3c2d0f) Add license header to files (#22) +- [320def8](https://github.com/stashed/postgres/commit/320def8) Enable make ci (#21) +- [9a7b843](https://github.com/stashed/postgres/commit/9a7b843) Fix BackupSession's Print Columns (#20) +- [73d7b1c](https://github.com/stashed/postgres/commit/73d7b1c) Enable make ci (#19) +- [46d5ae8](https://github.com/stashed/postgres/commit/46d5ae8) Remove --enable-status-subresource flag (#18) +- [08067ca](https://github.com/stashed/postgres/commit/08067ca) Fix arguments passing (#17) +- [0c1db21](https://github.com/stashed/postgres/commit/0c1db21) Add release pipeline (#16) +- [3d33fd4](https://github.com/stashed/postgres/commit/3d33fd4) adjust frontmatter weight +- [41e3555](https://github.com/stashed/postgres/commit/41e3555) Update resources for 9.6 +- [775ffab](https://github.com/stashed/postgres/commit/775ffab) Update go.yml +- [67cb695](https://github.com/stashed/postgres/commit/67cb695) Fix BackupConfiguration retention policy (#11) +- [9228437](https://github.com/stashed/postgres/commit/9228437) Fix link + grammar (#10) +- [bddb9cd](https://github.com/stashed/postgres/commit/bddb9cd) Enable GitHub actions +- [f42ada5](https://github.com/stashed/postgres/commit/f42ada5) Fix menu id in frontmatter +- [a59bed1](https://github.com/stashed/postgres/commit/a59bed1) Finalize doc template (#9) +- [08274c9](https://github.com/stashed/postgres/commit/08274c9) Fix typo (#8) +- [afad5db](https://github.com/stashed/postgres/commit/afad5db) Refactor error + metric handling (#7) +- [248d0ea](https://github.com/stashed/postgres/commit/248d0ea) Use Endpoint for REST server URL (remove --rest-server-url flag) (#6) +- [41d2a53](https://github.com/stashed/postgres/commit/41d2a53) Remove metrics options from function (#5) +- [d276da0](https://github.com/stashed/postgres/commit/d276da0) Use docker buildx to build docker image +- [3c0e71d](https://github.com/stashed/postgres/commit/3c0e71d) Use github.com/Azure/go-autorest/autorest@v0.7.0 +- [5eab8f5](https://github.com/stashed/postgres/commit/5eab8f5) Update postgres.md +- [0f37446](https://github.com/stashed/postgres/commit/0f37446) Rename Functions and Tasks (#4) +- [b1b3e80](https://github.com/stashed/postgres/commit/b1b3e80) Update Chart.yaml +- [a1bee9b](https://github.com/stashed/postgres/commit/a1bee9b) Update README.md +- [904549a](https://github.com/stashed/postgres/commit/904549a) Update postgres.md +- [1c99280](https://github.com/stashed/postgres/commit/1c99280) Add Chart and documentation (#2) +- [0238497](https://github.com/stashed/postgres/commit/0238497) Add ca-certificates package in Docker image (#3) +- [b0e6b2b](https://github.com/stashed/postgres/commit/b0e6b2b) Reorganize repo (#1) +- [1972a9a](https://github.com/stashed/postgres/commit/1972a9a) VolumeSnapshot (#787) +- [3f1f4cf](https://github.com/stashed/postgres/commit/3f1f4cf) Remove importance of order of rule in RestoreSession (#795) +- [86a4af0](https://github.com/stashed/postgres/commit/86a4af0) Skip BackupSession creation if target does not exist + use timestamp … (#797) +- [3abe6f6](https://github.com/stashed/postgres/commit/3abe6f6) Use restic 0.9.5 (#789) +- [85b21bf](https://github.com/stashed/postgres/commit/85b21bf) Update concept doc (#739) +- [ad5c8f2](https://github.com/stashed/postgres/commit/ad5c8f2) Add support for backup cluster resources YAML (#721) +- [2bb8ec3](https://github.com/stashed/postgres/commit/2bb8ec3) Backup and restore Elasticsearch (#702) +- [1f21268](https://github.com/stashed/postgres/commit/1f21268) Update package path to stash.appscode.dev/stash (#776) +- [e8fb571](https://github.com/stashed/postgres/commit/e8fb571) Update to k8s 1.14.0 client libraries using go.mod (#775) +- [eab0f8e](https://github.com/stashed/postgres/commit/eab0f8e) Remove --rbac flag (#761) +- [4c3e7ea](https://github.com/stashed/postgres/commit/4c3e7ea) Skip creating/processing backup-session when backup-config is paused (#759) +- [7905eff](https://github.com/stashed/postgres/commit/7905eff) Stash v1beta1 E2E test for PVC (#753) +- [2c44ee8](https://github.com/stashed/postgres/commit/2c44ee8) Implement snapshots for v1beta1 api (#749) +- [c88df7a](https://github.com/stashed/postgres/commit/c88df7a) Run restic commands using docker (#754) +- [8e24d32](https://github.com/stashed/postgres/commit/8e24d32) Fixed scratch-dir, output-dir and hostname in functions/tasks yamls (#744) +- [8d5944d](https://github.com/stashed/postgres/commit/8d5944d) Add Stash CLI (#734) +- [550ab37](https://github.com/stashed/postgres/commit/550ab37) Apply nice/ionice settings from env (#746) +- [42ed76b](https://github.com/stashed/postgres/commit/42ed76b) Stash V1beta1 E2E test for Deployment (#710) +- [d63f9e9](https://github.com/stashed/postgres/commit/d63f9e9) Fix openapi path prefixes for validators and mutators (#732) +- [c1347ed](https://github.com/stashed/postgres/commit/c1347ed) Add max-connections for GCS, Azure, B2 backend (#730) +- [859c4ee](https://github.com/stashed/postgres/commit/859c4ee) Rename admission webhooks to avoid name collision (#725) +- [d631bb9](https://github.com/stashed/postgres/commit/d631bb9) Apply EmptyDir settings to TmpDir (#719) +- [cc70068](https://github.com/stashed/postgres/commit/cc70068) Add support for rest backend (#713) +- [e4db000](https://github.com/stashed/postgres/commit/e4db000) Add support for OpenShift DeploymentConfig (#714) +- [3fa7bdb](https://github.com/stashed/postgres/commit/3fa7bdb) Backup and restore Mongo DB (#699) +- [4c39235](https://github.com/stashed/postgres/commit/4c39235) Backup and restore MySQL DB (#696) +- [3e89d32](https://github.com/stashed/postgres/commit/3e89d32) Backup and restore Postgres DB (#695) +- [03b95f3](https://github.com/stashed/postgres/commit/03b95f3) Add BackupSession Controller for Sidecar (#701) +- [cacbc7d](https://github.com/stashed/postgres/commit/cacbc7d) Update workload controller for new design (#675) +- [5c173e5](https://github.com/stashed/postgres/commit/5c173e5) Post backup/restore status update (#691) +- [50bbb0a](https://github.com/stashed/postgres/commit/50bbb0a) Backup and restore PVC (#676) +- [d4a53e2](https://github.com/stashed/postgres/commit/d4a53e2) Add BackupConfiguration Controller (#671) +- [ef9a4ae](https://github.com/stashed/postgres/commit/ef9a4ae) Update Kubernetes client libraries to 1.13.0 (#687) +- [c48dbfc](https://github.com/stashed/postgres/commit/c48dbfc) Separate type definitions into individual files (#646) +- [77f2113](https://github.com/stashed/postgres/commit/77f2113) Use flags.DumpAll to dump flags (#624) +- [cb54d8c](https://github.com/stashed/postgres/commit/cb54d8c) Set periodic analytics (#623) +- [248a53a](https://github.com/stashed/postgres/commit/248a53a) Add validation webhook xray (#618) +- [2029bf4](https://github.com/stashed/postgres/commit/2029bf4) Use dynamic pushgateway url (#614) +- [bcf5926](https://github.com/stashed/postgres/commit/bcf5926) Fix offline backup (#537) +- [5049a63](https://github.com/stashed/postgres/commit/5049a63) Fix extended apiserver issues with Kubernetes 1.11 (#536) +- [9d31255](https://github.com/stashed/postgres/commit/9d31255) Update client-go to v8.0.0 (#528) +- [d872b4c](https://github.com/stashed/postgres/commit/d872b4c) Enable status subresource for crds (#524) +- [4795dba](https://github.com/stashed/postgres/commit/4795dba) Remove ops-address port (#518) +- [e95b151](https://github.com/stashed/postgres/commit/e95b151) Add support for initial backoff to the apiserver call on recover (#476) +- [120e5de](https://github.com/stashed/postgres/commit/120e5de) Disable admission controllers for webhook server (#468) +- [2f19545](https://github.com/stashed/postgres/commit/2f19545) Update client-go to 7.0.0 (#463) +- [e613ff5](https://github.com/stashed/postgres/commit/e613ff5) Fixes RBAC issue in test (#449) +- [56a3a74](https://github.com/stashed/postgres/commit/56a3a74) Some cleanup (#446) +- [02565bb](https://github.com/stashed/postgres/commit/02565bb) Delete restic repository from backend if Repository CRD is deleted (#438) +- [ea98067](https://github.com/stashed/postgres/commit/ea98067) Fix go_vet error (#440) +- [9d626eb](https://github.com/stashed/postgres/commit/9d626eb) Increase qps and burst limits (#435) +- [5c6713f](https://github.com/stashed/postgres/commit/5c6713f) Show repository snapshot list (#417) +- [6d8ef78](https://github.com/stashed/postgres/commit/6d8ef78) Expose swagger.json (#420) +- [8e04ca0](https://github.com/stashed/postgres/commit/8e04ca0) Create repository crd for each Restic repository (#394) +- [4c9a478](https://github.com/stashed/postgres/commit/4c9a478) Rename --analytics to --enable-analytics (#384) +- [7ea2220](https://github.com/stashed/postgres/commit/7ea2220) Replace initializers with mutation webhook for workloads (#363) +- [2770e6b](https://github.com/stashed/postgres/commit/2770e6b) Use admission hook helpers from kutil (#360) +- [d3754d7](https://github.com/stashed/postgres/commit/d3754d7) Implement offline backup for multiple replica (#335) +- [13a2d14](https://github.com/stashed/postgres/commit/13a2d14) Use official code generator scripts (#336) +- [90642ce](https://github.com/stashed/postgres/commit/90642ce) Fix e2e tests after webhook merger (#333) +- [2fc3239](https://github.com/stashed/postgres/commit/2fc3239) Leave secure port unset +- [7cb52b2](https://github.com/stashed/postgres/commit/7cb52b2) Merge admission webhook and operator into one binary (#329) +- [3306427](https://github.com/stashed/postgres/commit/3306427) Implement informer factory for backup scheduler (#325) +- [7bb027b](https://github.com/stashed/postgres/commit/7bb027b) Cleanup apiserver +- [fb8c1e4](https://github.com/stashed/postgres/commit/fb8c1e4) Copy generic-admission-server into pkg (#318) +- [5a5093f](https://github.com/stashed/postgres/commit/5a5093f) Use shared infromer factory (#317) +- [0ccb948](https://github.com/stashed/postgres/commit/0ccb948) Use GetBaseVersion method from kutil (#316) +- [8c5e6ff](https://github.com/stashed/postgres/commit/8c5e6ff) Fix webhook command description (#314) +- [775a2b6](https://github.com/stashed/postgres/commit/775a2b6) Merge webhook plugins into one. (#311) +- [a8659fe](https://github.com/stashed/postgres/commit/a8659fe) Add ValidatingAdmissionWebhook for Stash CRDs (#299) +- [c3e177c](https://github.com/stashed/postgres/commit/c3e177c) Added support for private docker registry (#300) +- [62ec42e](https://github.com/stashed/postgres/commit/62ec42e) Update dependencies to Kubernetes 1.9 (#297) +- [cf3ea7c](https://github.com/stashed/postgres/commit/cf3ea7c) Update appscode/go log wrapper (#287) +- [470cc31](https://github.com/stashed/postgres/commit/470cc31) Pass --pushgateway-url for injected containers. (#284) +- [e2e79c6](https://github.com/stashed/postgres/commit/e2e79c6) Fix kubectl version parsing generation in GKE (#267) +- [326aea4](https://github.com/stashed/postgres/commit/326aea4) Detect analytics client id using env vars (#265) +- [4a5912c](https://github.com/stashed/postgres/commit/4a5912c) Prepare docs for 0.6.0 release (#264) +- [f75d5df](https://github.com/stashed/postgres/commit/f75d5df) Remove restic-dependency from recovery (#258) +- [86f01f3](https://github.com/stashed/postgres/commit/86f01f3) Log operator version on start (#253) +- [4e29b70](https://github.com/stashed/postgres/commit/4e29b70) Simplify clientID generation for analytics (#247) +- [a45937f](https://github.com/stashed/postgres/commit/a45937f) Set analytics clientID (#246) +- [ea53cea](https://github.com/stashed/postgres/commit/ea53cea) Enable Restic cahce-dir flag (#241) +- [dc0030d](https://github.com/stashed/postgres/commit/dc0030d) Implement offline backup (#229) +- [ae40f35](https://github.com/stashed/postgres/commit/ae40f35) Revendor kutil (#230) +- [d68a34d](https://github.com/stashed/postgres/commit/d68a34d) Record recovery status for individual FileGroup (#222) +- [15a24b7](https://github.com/stashed/postgres/commit/15a24b7) Leader election for deployment, replica set and rc (#206) +- [4a75689](https://github.com/stashed/postgres/commit/4a75689) Implement Recovery for Restic Backup (#202) +- [78b3942](https://github.com/stashed/postgres/commit/78b3942) Use typed versioned client for CRD +- [b857b05](https://github.com/stashed/postgres/commit/b857b05) Change `k8s.io/api/core/v1` pkg alias to core (#204) +- [e52f848](https://github.com/stashed/postgres/commit/e52f848) Use client-go 5.x +- [4f376ad](https://github.com/stashed/postgres/commit/4f376ad) Set hostname based on resource type (#198) +- [e530116](https://github.com/stashed/postgres/commit/e530116) Manage RoleBinding for rbac enabled cluster (#197) +- [e28c13f](https://github.com/stashed/postgres/commit/e28c13f) Use workqueue for scheduler (#194) +- [2719cbd](https://github.com/stashed/postgres/commit/2719cbd) Fix e2e tests (#183) +- [9c1cc43](https://github.com/stashed/postgres/commit/9c1cc43) Use workqueue (#182) +- [b3ee076](https://github.com/stashed/postgres/commit/b3ee076) Only watch apps/v1beta1 Deployment (#178) +- [4f92ca6](https://github.com/stashed/postgres/commit/4f92ca6) Use Namespace() method from kutil. +- [78f1e7f](https://github.com/stashed/postgres/commit/78f1e7f) Update kutil (#170) +- [29a8a1f](https://github.com/stashed/postgres/commit/29a8a1f) Use apis/v1alpha1 instead of internal version (#167) +- [da3eb2e](https://github.com/stashed/postgres/commit/da3eb2e) Use kubernetes/code-generator (#163) +- [3b1d6bf](https://github.com/stashed/postgres/commit/3b1d6bf) Expose resync-period as flag +- [35d8dc6](https://github.com/stashed/postgres/commit/35d8dc6) Move analytics collector to root command (#164) +- [6a55694](https://github.com/stashed/postgres/commit/6a55694) Migrate TPR to CRD (#160) +- [91f678f](https://github.com/stashed/postgres/commit/91f678f) Rename RepositorySecretName to StorageSecretName (#135) +- [d666c81](https://github.com/stashed/postgres/commit/d666c81) Change mount path for labels to /etc/stash +- [1177d60](https://github.com/stashed/postgres/commit/1177d60) Part 6 - Update docs (#121) +- [a15689d](https://github.com/stashed/postgres/commit/a15689d) Various bug fixes (#118) +- [d8a5771](https://github.com/stashed/postgres/commit/d8a5771) Set TMPDIR env var for restic (#115) +- [60ed8f7](https://github.com/stashed/postgres/commit/60ed8f7) Update user guide (#94) + + +### [10.2-rc.20200826](https://github.com/stashed/postgres/releases/tag/10.2-rc.20200826) + + + +### [10.6-rc.20200826](https://github.com/stashed/postgres/releases/tag/10.6-rc.20200826) + + + +### [11.1-rc.20200826](https://github.com/stashed/postgres/releases/tag/11.1-rc.20200826) + + + +### [11.2-rc.20200826](https://github.com/stashed/postgres/releases/tag/11.2-rc.20200826) + + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.10.0-rc.1](https://github.com/stashed/stash/releases/tag/v0.10.0-rc.1) + +- [20d585f4](https://github.com/stashed/stash/commit/20d585f4) Prepare for release v0.10.0-rc.1 (#1180) +- [76fe3ebd](https://github.com/stashed/stash/commit/76fe3ebd) Create GitHub release from release workflow +- [f3e5cccc](https://github.com/stashed/stash/commit/f3e5cccc) Fix installation link + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2020.08.27-rc.0.md b/content/docs/v2024.12.18/CHANGELOG-v2020.08.27-rc.0.md new file mode 100644 index 0000000000..0550a0889d --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2020.08.27-rc.0.md @@ -0,0 +1,319 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2020.08.27-rc.0 + name: Changelog-v2020.08.27-rc.0 + parent: welcome + weight: 20200827 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2020.08.27-rc.0/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2020.08.27-rc.0/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2020.08.27-rc.0 (2020-08-27) + + +## [appscode/stash-enterprise](https://github.com/appscode/stash-enterprise) + +### [v0.10.0-rc.2](https://github.com/appscode/stash-enterprise/releases/tag/v0.10.0-rc.2) + +- [be8d7f35](https://github.com/appscode/stash-enterprise/commit/be8d7f35) Prepare for release v0.10.0-rc.2 (#20) + + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.10.0-rc.2](https://github.com/stashed/apimachinery/releases/tag/v0.10.0-rc.2) + + + + +## [stashed/catalog](https://github.com/stashed/catalog) + +### [v2020.08.27-rc.0](https://github.com/stashed/catalog/releases/tag/v2020.08.27-rc.0) + +- [131d570](https://github.com/stashed/catalog/commit/131d570) Prepare for release v2020.08.27-rc.0 (#35) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.10.0-rc.2](https://github.com/stashed/cli/releases/tag/v0.10.0-rc.2) + +- [bcff194](https://github.com/stashed/cli/commit/bcff194) Prepare for release v0.10.0-rc.2 (#40) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-rc.20200827](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-rc.20200827) + +- [51262cc](https://github.com/stashed/elasticsearch/commit/51262cc) Prepare for release 5.6.4-rc.20200827 (#192) +- [bcba1e7](https://github.com/stashed/elasticsearch/commit/bcba1e7) [cherry-pick] Upload charts without updating index (#184) + + +### [6.2.4-rc.20200827](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-rc.20200827) + +- [00cc0e7](https://github.com/stashed/elasticsearch/commit/00cc0e7) Prepare for release 6.2.4-rc.20200827 (#193) +- [54bab71](https://github.com/stashed/elasticsearch/commit/54bab71) [cherry-pick] Upload charts without updating index (#185) + + +### [6.3.0-rc.20200827](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-rc.20200827) + +- [4bf05ac](https://github.com/stashed/elasticsearch/commit/4bf05ac) Prepare for release 6.3.0-rc.20200827 (#194) +- [16053f8](https://github.com/stashed/elasticsearch/commit/16053f8) [cherry-pick] Upload charts without updating index (#186) + + +### [6.4.0-rc.20200827](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-rc.20200827) + +- [c37a5b5](https://github.com/stashed/elasticsearch/commit/c37a5b5) Prepare for release 6.4.0-rc.20200827 (#195) +- [6a44a65](https://github.com/stashed/elasticsearch/commit/6a44a65) [cherry-pick] Upload charts without updating index (#187) + + +### [6.5.3-rc.20200827](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-rc.20200827) + +- [68b5356](https://github.com/stashed/elasticsearch/commit/68b5356) Prepare for release 6.5.3-rc.20200827 (#196) +- [babe6ed](https://github.com/stashed/elasticsearch/commit/babe6ed) [cherry-pick] Upload charts without updating index (#188) + + +### [6.8.0-rc.20200827](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-rc.20200827) + +- [74bcf84](https://github.com/stashed/elasticsearch/commit/74bcf84) Prepare for release 6.8.0-rc.20200827 (#197) +- [a836713](https://github.com/stashed/elasticsearch/commit/a836713) [cherry-pick] Upload charts without updating index (#189) + + +### [7.2.0-rc.20200827](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-rc.20200827) + +- [036e850](https://github.com/stashed/elasticsearch/commit/036e850) Prepare for release 7.2.0-rc.20200827 (#198) +- [54fd94d](https://github.com/stashed/elasticsearch/commit/54fd94d) [cherry-pick] Upload charts without updating index (#190) + + +### [7.3.2-rc.20200827](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-rc.20200827) + +- [c6f8b5d](https://github.com/stashed/elasticsearch/commit/c6f8b5d) Prepare for release 7.3.2-rc.20200827 (#199) +- [0f8ba19](https://github.com/stashed/elasticsearch/commit/0f8ba19) [cherry-pick] Upload charts without updating index (#191) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v0.10.0-rc.2](https://github.com/stashed/installer/releases/tag/v0.10.0-rc.2) + +- [7d5e440](https://github.com/stashed/installer/commit/7d5e440) Prepare for release v0.10.0-rc.2 (#92) +- [f4cae9f](https://github.com/stashed/installer/commit/f4cae9f) Upload charts without updating index +- [90d9c52](https://github.com/stashed/installer/commit/90d9c52) Update Kubernetes v1.18.3 dependencies (#91) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.1-rc.20200827](https://github.com/stashed/mongodb/releases/tag/3.4.1-rc.20200827) + +- [9890353](https://github.com/stashed/mongodb/commit/9890353) Prepare for release 3.4.1-rc.20200827 (#231) +- [d941a98](https://github.com/stashed/mongodb/commit/d941a98) [cherry-pick] Upload charts without updating index (#220) + + +### [3.4.2-rc.20200827](https://github.com/stashed/mongodb/releases/tag/3.4.2-rc.20200827) + +- [fe63b2a](https://github.com/stashed/mongodb/commit/fe63b2a) Prepare for release 3.4.2-rc.20200827 (#232) +- [80c8ad0](https://github.com/stashed/mongodb/commit/80c8ad0) [cherry-pick] Upload charts without updating index (#221) + + +### [3.6.1-rc.20200827](https://github.com/stashed/mongodb/releases/tag/3.6.1-rc.20200827) + +- [c3b738a](https://github.com/stashed/mongodb/commit/c3b738a) Prepare for release 3.6.1-rc.20200827 (#233) +- [451d4c9](https://github.com/stashed/mongodb/commit/451d4c9) [cherry-pick] Upload charts without updating index (#222) + + +### [3.6.8-rc.20200827](https://github.com/stashed/mongodb/releases/tag/3.6.8-rc.20200827) + +- [fae0fa3](https://github.com/stashed/mongodb/commit/fae0fa3) Prepare for release 3.6.8-rc.20200827 (#234) +- [59da835](https://github.com/stashed/mongodb/commit/59da835) [cherry-pick] Upload charts without updating index (#223) + + +### [4.0.3-rc.20200827](https://github.com/stashed/mongodb/releases/tag/4.0.3-rc.20200827) + +- [e6669a9](https://github.com/stashed/mongodb/commit/e6669a9) Prepare for release 4.0.3-rc.20200827 (#236) +- [7a1efc6](https://github.com/stashed/mongodb/commit/7a1efc6) [cherry-pick] Upload charts without updating index (#225) + + +### [4.0.5-rc.20200827](https://github.com/stashed/mongodb/releases/tag/4.0.5-rc.20200827) + +- [8bded32](https://github.com/stashed/mongodb/commit/8bded32) Prepare for release 4.0.5-rc.20200827 (#237) +- [58fa99e](https://github.com/stashed/mongodb/commit/58fa99e) [cherry-pick] Upload charts without updating index (#226) + + +### [4.0.11-rc.20200827](https://github.com/stashed/mongodb/releases/tag/4.0.11-rc.20200827) + +- [2dfe220](https://github.com/stashed/mongodb/commit/2dfe220) Prepare for release 4.0.11-rc.20200827 (#235) +- [7ccf88d](https://github.com/stashed/mongodb/commit/7ccf88d) [cherry-pick] Upload charts without updating index (#224) + + +### [4.1.1-rc.20200827](https://github.com/stashed/mongodb/releases/tag/4.1.1-rc.20200827) + +- [f5a95fc](https://github.com/stashed/mongodb/commit/f5a95fc) Prepare for release 4.1.1-rc.20200827 (#238) +- [a68fafc](https://github.com/stashed/mongodb/commit/a68fafc) [cherry-pick] Upload charts without updating index (#227) + + +### [4.1.4-rc.20200827](https://github.com/stashed/mongodb/releases/tag/4.1.4-rc.20200827) + +- [84e97a4](https://github.com/stashed/mongodb/commit/84e97a4) Prepare for release 4.1.4-rc.20200827 (#239) +- [3a168e8](https://github.com/stashed/mongodb/commit/3a168e8) [cherry-pick] Upload charts without updating index (#228) + + +### [4.1.7-rc.20200827](https://github.com/stashed/mongodb/releases/tag/4.1.7-rc.20200827) + +- [df9852f](https://github.com/stashed/mongodb/commit/df9852f) Prepare for release 4.1.7-rc.20200827 (#240) +- [b22a028](https://github.com/stashed/mongodb/commit/b22a028) [cherry-pick] Upload charts without updating index (#229) + + +### [4.2.3-rc.20200827](https://github.com/stashed/mongodb/releases/tag/4.2.3-rc.20200827) + +- [e4c8466](https://github.com/stashed/mongodb/commit/e4c8466) Prepare for release 4.2.3-rc.20200827 (#241) +- [b45397b](https://github.com/stashed/mongodb/commit/b45397b) [cherry-pick] Upload charts without updating index (#230) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-rc.20200827](https://github.com/stashed/mysql/releases/tag/5.7.25-rc.20200827) + +- [263f795](https://github.com/stashed/mysql/commit/263f795) Prepare for release 5.7.25-rc.20200827 (#99) +- [96023d1](https://github.com/stashed/mysql/commit/96023d1) [cherry-pick] Upload charts without updating index (#96) + + +### [8.0.3-rc.20200827](https://github.com/stashed/mysql/releases/tag/8.0.3-rc.20200827) + +- [7d02720](https://github.com/stashed/mysql/commit/7d02720) Prepare for release 8.0.3-rc.20200827 (#101) +- [dc8e2b5](https://github.com/stashed/mysql/commit/dc8e2b5) [cherry-pick] Upload charts without updating index (#98) + + +### [8.0.14-rc.20200827](https://github.com/stashed/mysql/releases/tag/8.0.14-rc.20200827) + +- [720aa02](https://github.com/stashed/mysql/commit/720aa02) Prepare for release 8.0.14-rc.20200827 (#100) +- [7019c00](https://github.com/stashed/mysql/commit/7019c00) [cherry-pick] Upload charts without updating index (#97) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-rc.20200827](https://github.com/stashed/percona-xtradb/releases/tag/5.7-rc.20200827) + +- [c854199](https://github.com/stashed/percona-xtradb/commit/c854199) Prepare for release 5.7-rc.20200827 (#55) +- [e798257](https://github.com/stashed/percona-xtradb/commit/e798257) [cherry-pick] Upload charts without updating index (#54) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6-rc.20200827](https://github.com/stashed/postgres/releases/tag/9.6-rc.20200827) + +- [e9febb8](https://github.com/stashed/postgres/commit/e9febb8) Prepare for release 9.6-rc.20200827 (#163) +- [3f724ee](https://github.com/stashed/postgres/commit/3f724ee) [cherry-pick] Upload charts without updating index (#158) + + +### [10.2-rc.20200827](https://github.com/stashed/postgres/releases/tag/10.2-rc.20200827) + +- [fd9fc7a](https://github.com/stashed/postgres/commit/fd9fc7a) Prepare for release 10.2-rc.20200827 (#159) +- [7d1033a](https://github.com/stashed/postgres/commit/7d1033a) [cherry-pick] Upload charts without updating index (#154) + + +### [10.6-rc.20200827](https://github.com/stashed/postgres/releases/tag/10.6-rc.20200827) + +- [4724218](https://github.com/stashed/postgres/commit/4724218) Prepare for release 10.6-rc.20200827 (#160) +- [1167129](https://github.com/stashed/postgres/commit/1167129) [cherry-pick] Upload charts without updating index (#155) + + +### [11.1-rc.20200827](https://github.com/stashed/postgres/releases/tag/11.1-rc.20200827) + +- [0fbd548](https://github.com/stashed/postgres/commit/0fbd548) Prepare for release 11.1-rc.20200827 (#161) +- [fc8cb58](https://github.com/stashed/postgres/commit/fc8cb58) [cherry-pick] Upload charts without updating index (#156) + + +### [11.2-rc.20200827](https://github.com/stashed/postgres/releases/tag/11.2-rc.20200827) + +- [342b6bb](https://github.com/stashed/postgres/commit/342b6bb) Prepare for release 11.2-rc.20200827 (#162) +- [4688cde](https://github.com/stashed/postgres/commit/4688cde) [cherry-pick] Upload charts without updating index (#157) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.10.0-rc.2](https://github.com/stashed/stash/releases/tag/v0.10.0-rc.2) + +- [485f80c6](https://github.com/stashed/stash/commit/485f80c6) Prepare for release v0.10.0-rc.2 (#1181) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2020.08.27.md b/content/docs/v2024.12.18/CHANGELOG-v2020.08.27.md new file mode 100644 index 0000000000..fb09f369c8 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2020.08.27.md @@ -0,0 +1,3430 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2020.08.27 + name: Changelog-v2020.08.27 + parent: welcome + weight: 20200827 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2020.08.27/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2020.08.27/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2020.08.27 (2020-08-27) + + +## [appscode/stash-enterprise](https://github.com/appscode/stash-enterprise) + +### [v0.10.0](https://github.com/appscode/stash-enterprise/releases/tag/v0.10.0) + +- [113f8111](https://github.com/appscode/stash-enterprise/commit/113f8111) Prepare for release v0.10.0 (#21) +- [be8d7f35](https://github.com/appscode/stash-enterprise/commit/be8d7f35) Prepare for release v0.10.0-rc.2 (#20) +- [dc0c6cf5](https://github.com/appscode/stash-enterprise/commit/dc0c6cf5) Prepare for release v0.10.0-rc.1 (#19) +- [4836ebc0](https://github.com/appscode/stash-enterprise/commit/4836ebc0) Create GitHub release from release workflow +- [58833f91](https://github.com/appscode/stash-enterprise/commit/58833f91) Prepare for release v0.10.0-rc.0 (#18) +- [5a3d33e1](https://github.com/appscode/stash-enterprise/commit/5a3d33e1) Update README.md +- [cbd97623](https://github.com/appscode/stash-enterprise/commit/cbd97623) Use Docker hub for release images (#17) +- [d997d3e7](https://github.com/appscode/stash-enterprise/commit/d997d3e7) Refactor parameter passing via annotations (#16) +- [5300842d](https://github.com/appscode/stash-enterprise/commit/5300842d) Update feature table in README.md (#15) +- [695b2993](https://github.com/appscode/stash-enterprise/commit/695b2993) Fix update status section + fix tests (#14) +- [60f3fecd](https://github.com/appscode/stash-enterprise/commit/60f3fecd) Use license-verifier v0.2.2 (#13) +- [53acec48](https://github.com/appscode/stash-enterprise/commit/53acec48) Add ENFORCE_LICENSE override for licence enforcer (#11) +- [bd0912d3](https://github.com/appscode/stash-enterprise/commit/bd0912d3) Add offline license verification (#10) +- [33444a3a](https://github.com/appscode/stash-enterprise/commit/33444a3a) Add license verifier info to build process (#9) +- [0d8c7294](https://github.com/appscode/stash-enterprise/commit/0d8c7294) Fix restore init-container order (#8) +- [733d9d47](https://github.com/appscode/stash-enterprise/commit/733d9d47) Pass offshoot labels to backup & restore job's pods (#7) +- [357341a9](https://github.com/appscode/stash-enterprise/commit/357341a9) Add params and schedule annotation for auto-backup (#6) +- [aa862d01](https://github.com/appscode/stash-enterprise/commit/aa862d01) Support Snapshot listing for NFS backend without workload running (#5) +- [6ffc7392](https://github.com/appscode/stash-enterprise/commit/6ffc7392) Introduce RestoreBatch CRD + Additional Improvements (#2) +- [f3fb0f15](https://github.com/appscode/stash-enterprise/commit/f3fb0f15) Disable e2e tests (#4) +- [a00abcbb](https://github.com/appscode/stash-enterprise/commit/a00abcbb) Update ci.yml +- [fb1e1fee](https://github.com/appscode/stash-enterprise/commit/fb1e1fee) Update .kodiak.toml +- [5d2f056f](https://github.com/appscode/stash-enterprise/commit/5d2f056f) Update update-release-tracker.sh +- [5160b7a6](https://github.com/appscode/stash-enterprise/commit/5160b7a6) Update update-release-tracker.sh +- [530542b5](https://github.com/appscode/stash-enterprise/commit/530542b5) Add script to update release tracker on pr merge (#3) +- [c1e2163f](https://github.com/appscode/stash-enterprise/commit/c1e2163f) Update .kodiak.toml +- [dd1d1c16](https://github.com/appscode/stash-enterprise/commit/dd1d1c16) Use GCR for enterprise images (#1) +- [bbde40a3](https://github.com/appscode/stash-enterprise/commit/bbde40a3) Update to Kubernetes v1.18.3 (#1129) +- [38eb3781](https://github.com/appscode/stash-enterprise/commit/38eb3781) Update to Kubernetes v1.18.3 +- [197aa7bd](https://github.com/appscode/stash-enterprise/commit/197aa7bd) Create .kodiak.toml +- [181ca49e](https://github.com/appscode/stash-enterprise/commit/181ca49e) Update coverage script +- [26602c96](https://github.com/appscode/stash-enterprise/commit/26602c96) Merge pull request #1125 from stashed/fix-ci-tests +- [54f87b78](https://github.com/appscode/stash-enterprise/commit/54f87b78) Increase wait timeout +- [43428085](https://github.com/appscode/stash-enterprise/commit/43428085) Remove unnecessary test codes + run test in parallel +- [8a780e0c](https://github.com/appscode/stash-enterprise/commit/8a780e0c) Fix clone-pvc tests +- [7027c0f6](https://github.com/appscode/stash-enterprise/commit/7027c0f6) Fix E2E test +- [31de588a](https://github.com/appscode/stash-enterprise/commit/31de588a) Change GCS test bucket name to stash-ci (#1122) +- [30a490a6](https://github.com/appscode/stash-enterprise/commit/30a490a6) Merge pull request #1121 from stashed/baseline-psp +- [419a18e3](https://github.com/appscode/stash-enterprise/commit/419a18e3) Use StringSlice type flag +- [9dd3804d](https://github.com/appscode/stash-enterprise/commit/9dd3804d) Make PSP names configurable through flag +- [e4edef44](https://github.com/appscode/stash-enterprise/commit/e4edef44) Always use baseline PSP +- [cf1538a0](https://github.com/appscode/stash-enterprise/commit/cf1538a0) Use filepath.Join to generate Repository prefix for BackupBatch (#1120) +- [be189169](https://github.com/appscode/stash-enterprise/commit/be189169) Go back to using engineerd/setup-kind +- [ae2d74fa](https://github.com/appscode/stash-enterprise/commit/ae2d74fa) Update dependencies (#1117) +- [a93a5b4c](https://github.com/appscode/stash-enterprise/commit/a93a5b4c) Remove defaults from CRD v1beta1 (#1116) +- [40e65761](https://github.com/appscode/stash-enterprise/commit/40e65761) Use CRD v1 for Kubernetes >= 1.16 (#1115) +- [7d851e53](https://github.com/appscode/stash-enterprise/commit/7d851e53) Merge pull request #1114 from stashed/x7 +- [352ddeed](https://github.com/appscode/stash-enterprise/commit/352ddeed) Use preinstalled kind +- [11c9e422](https://github.com/appscode/stash-enterprise/commit/11c9e422) Pass context +- [21053603](https://github.com/appscode/stash-enterprise/commit/21053603) Update to Kubernetes 1.18.3 +- [f450e9cc](https://github.com/appscode/stash-enterprise/commit/f450e9cc) Add wait for target logic + add conditions for BackupConfiguration + BackupBatch + RestoreSession (#1108) +- [8f8ff87e](https://github.com/appscode/stash-enterprise/commit/8f8ff87e) Fix volume snapshot job cleanup (#1090) +- [a4a868b5](https://github.com/appscode/stash-enterprise/commit/a4a868b5) Merge pull request #1111 from stashed/fix-interimVolume +- [108d0252](https://github.com/appscode/stash-enterprise/commit/108d0252) Set BackupSession as owner of the pvc created from interimVolumeTemplate +- [fd136c53](https://github.com/appscode/stash-enterprise/commit/fd136c53) Use Go 1.14.3 +- [74c71d22](https://github.com/appscode/stash-enterprise/commit/74c71d22) Update crazy-max/ghaction-docker-buildx flag +- [f783899b](https://github.com/appscode/stash-enterprise/commit/f783899b) Trigger the workflow on push to master +- [e7eceb30](https://github.com/appscode/stash-enterprise/commit/e7eceb30) Trigger the workflow on push or pull request +- [fe479e8c](https://github.com/appscode/stash-enterprise/commit/fe479e8c) Use kind v0.8.0 +- [9fc4665a](https://github.com/appscode/stash-enterprise/commit/9fc4665a) Merge pull request #1093 from robotinfra/master +- [ef2d57e3](https://github.com/appscode/stash-enterprise/commit/ef2d57e3) fix typo succesSfully +- [d8d35c49](https://github.com/appscode/stash-enterprise/commit/d8d35c49) fix event types mismatch +- [53dfe8b0](https://github.com/appscode/stash-enterprise/commit/53dfe8b0) Update stash labels in Makefile +- [c8081c1d](https://github.com/appscode/stash-enterprise/commit/c8081c1d) Pass image pull secrets to helm chart +- [37b9b312](https://github.com/appscode/stash-enterprise/commit/37b9b312) Use Go 1.14.2 (#1074) +- [09621974](https://github.com/appscode/stash-enterprise/commit/09621974) Update K8s version 1.14.6 to 1.14.10 (#1084) +- [8a1ab32c](https://github.com/appscode/stash-enterprise/commit/8a1ab32c) Give backup triggering CronJob all permissions for Stash crds (#1083) +- [53b932b1](https://github.com/appscode/stash-enterprise/commit/53b932b1) Use kubectl 1.17 (#1082) +- [5cdeebee](https://github.com/appscode/stash-enterprise/commit/5cdeebee) Fix nil pointer exception during VolumeSnapshot (#1073) +- [30630d60](https://github.com/appscode/stash-enterprise/commit/30630d60) Assign returned error properly crateRestoreSessoin() (#1069) +- [3fcbe1b7](https://github.com/appscode/stash-enterprise/commit/3fcbe1b7) Update README.md to reflect Stash's capability properly (#1060) +- [53513cfe](https://github.com/appscode/stash-enterprise/commit/53513cfe) Update README.md +- [d615e2c0](https://github.com/appscode/stash-enterprise/commit/d615e2c0) Add license scan report and status (#1031) +- [473dab81](https://github.com/appscode/stash-enterprise/commit/473dab81) Use stash.appscode.dev/apimachinery@v0.9.0-rc.6 +- [81be166a](https://github.com/appscode/stash-enterprise/commit/81be166a) Use stash.appscode.dev/apimachinery (#1051) +- [99dcf0a5](https://github.com/appscode/stash-enterprise/commit/99dcf0a5) Add support for specifying "region" for S3 backend (#1050) +- [deeaaafe](https://github.com/appscode/stash-enterprise/commit/deeaaafe) Fix event message (#1048) +- [7bb2ae55](https://github.com/appscode/stash-enterprise/commit/7bb2ae55) Merge pull request #1047 from stashed/rm-fsgroup +- [a7c3a60b](https://github.com/appscode/stash-enterprise/commit/a7c3a60b) Remove defaulting FSGroup +- [49bf689d](https://github.com/appscode/stash-enterprise/commit/49bf689d) Fix Repository CRDs print column (#1046) +- [feb204be](https://github.com/appscode/stash-enterprise/commit/feb204be) Update README.md to v0.9.0-rc.4 +- [ba1733eb](https://github.com/appscode/stash-enterprise/commit/ba1733eb) Don't check if target exist from BackupSession creating CronJob (#1028) +- [ddc65ceb](https://github.com/appscode/stash-enterprise/commit/ddc65ceb) Fix ServiceAccount name mitchmatch (#1025) +- [013e5254](https://github.com/appscode/stash-enterprise/commit/013e5254) Suspend CronJob but keep instant backup working while backup is paused (#1024) +- [64f75bb7](https://github.com/appscode/stash-enterprise/commit/64f75bb7) Add stash specific prefix to automatically created resources (#1023) +- [d44e0ae2](https://github.com/appscode/stash-enterprise/commit/d44e0ae2) Fix CronJob creation failure handling (#1021) +- [b2640d36](https://github.com/appscode/stash-enterprise/commit/b2640d36) Use Go 1.13.6 +- [1eb8da6e](https://github.com/appscode/stash-enterprise/commit/1eb8da6e) Update gendocs command (#1016) +- [6f7c8191](https://github.com/appscode/stash-enterprise/commit/6f7c8191) Add hook tests for BackupBatch (#1014) +- [84272af9](https://github.com/appscode/stash-enterprise/commit/84272af9) check nil pointer error (#1015) +- [36ef1d2b](https://github.com/appscode/stash-enterprise/commit/36ef1d2b) Enable tests for K8s 1.11 (#1013) +- [7c774d77](https://github.com/appscode/stash-enterprise/commit/7c774d77) Fix backup-batch issues (#1004) +- [5bf1e2c2](https://github.com/appscode/stash-enterprise/commit/5bf1e2c2) Bring back support for k8s 1.11 (#1008) +- [d6e0fe4b](https://github.com/appscode/stash-enterprise/commit/d6e0fe4b) Remove creationTimestamp from PartialObjectMeta (#1006) +- [6ae79134](https://github.com/appscode/stash-enterprise/commit/6ae79134) Add BackupBatch support (#985) +- [ed42b159](https://github.com/appscode/stash-enterprise/commit/ed42b159) Update twitter account (#1003) +- [c8513185](https://github.com/appscode/stash-enterprise/commit/c8513185) Add Repository Validation for local backend `mountPath` (#947) +- [11f4c5e2](https://github.com/appscode/stash-enterprise/commit/11f4c5e2) Fix invalid flag name for PVC restorer job (#960) +- [93358115](https://github.com/appscode/stash-enterprise/commit/93358115) Add Backend e2e Test (#975) +- [ca688540](https://github.com/appscode/stash-enterprise/commit/ca688540) Update client-go to kubernetes-1.16.3 (#987) +- [e18f30dd](https://github.com/appscode/stash-enterprise/commit/e18f30dd) Use RWX for restic output.json (#1001) +- [4d9cdbc8](https://github.com/appscode/stash-enterprise/commit/4d9cdbc8) Run `chmod` on `output.json` only by owner container + Improve… (#1000) +- [8378f141](https://github.com/appscode/stash-enterprise/commit/8378f141) Add Backup and Restore hooks (#978) +- [a4dd1a1d](https://github.com/appscode/stash-enterprise/commit/a4dd1a1d) Use helm chart instead of script to install operator (#999) +- [ec5c9efd](https://github.com/appscode/stash-enterprise/commit/ec5c9efd) Update hack/fmt.sh script +- [54dbef4c](https://github.com/appscode/stash-enterprise/commit/54dbef4c) Add helper library for CRDs (#977) +- [16483ce1](https://github.com/appscode/stash-enterprise/commit/16483ce1) Use kubebuilder generated CRD yamls (#971) +- [eacba300](https://github.com/appscode/stash-enterprise/commit/eacba300) Fix typo (#976) +- [dd500b08](https://github.com/appscode/stash-enterprise/commit/dd500b08) Use controller-tools@v0.2.2 to generate structural schema (#974) +- [53331837](https://github.com/appscode/stash-enterprise/commit/53331837) Migrate Repository status.size, Recovery status.observedGeneration (#969) +- [69ef388b](https://github.com/appscode/stash-enterprise/commit/69ef388b) Generate protobuf files for api types (#967) +- [decea34f](https://github.com/appscode/stash-enterprise/commit/decea34f) Fix Repository returned error message (#961) +- [5a9e0356](https://github.com/appscode/stash-enterprise/commit/5a9e0356) Apply valid name functionality (#950) +- [122ed35f](https://github.com/appscode/stash-enterprise/commit/122ed35f) Test installer against multiple k8s version (#953) +- [63cfc0f9](https://github.com/appscode/stash-enterprise/commit/63cfc0f9) Format shell scripts (#952) +- [c77dfcd4](https://github.com/appscode/stash-enterprise/commit/c77dfcd4) Add missing license header +- [780fd2cb](https://github.com/appscode/stash-enterprise/commit/780fd2cb) Rename Dockerfiles (#946) +- [dc34560a](https://github.com/appscode/stash-enterprise/commit/dc34560a) Add AutoBackup e2e test (#939) +- [6979ff8b](https://github.com/appscode/stash-enterprise/commit/6979ff8b) Enable race detector (#944) +- [69acf528](https://github.com/appscode/stash-enterprise/commit/69acf528) Add license header to files (#943) +- [b2636f8b](https://github.com/appscode/stash-enterprise/commit/b2636f8b) Don't add AppBinding labels in metric when AppBinding is not available (#942) +- [18e1ab7e](https://github.com/appscode/stash-enterprise/commit/18e1ab7e) Fix BackupSession creation for ReplicaSet (#940) +- [8ce4ab86](https://github.com/appscode/stash-enterprise/commit/8ce4ab86) Fix klog flag parsing +- [efd614f9](https://github.com/appscode/stash-enterprise/commit/efd614f9) Revendor +- [f3fa386f](https://github.com/appscode/stash-enterprise/commit/f3fa386f) Use crazy-max/ghaction-docker-buildx@v1 +- [5cc99c53](https://github.com/appscode/stash-enterprise/commit/5cc99c53) Show diff when files `make verify` fails (#937) +- [d20892dd](https://github.com/appscode/stash-enterprise/commit/d20892dd) Update make fmt +- [fc827b84](https://github.com/appscode/stash-enterprise/commit/fc827b84) Split imports into 3 blocks (#936) +- [269527cf](https://github.com/appscode/stash-enterprise/commit/269527cf) Volume e2e test github action (#933) +- [926dcd20](https://github.com/appscode/stash-enterprise/commit/926dcd20) Fix BackupSession additional print column (#932) +- [f052f7a2](https://github.com/appscode/stash-enterprise/commit/f052f7a2) Remove spec.backupConfiguration from BackupSession (#931) +- [d378ef2d](https://github.com/appscode/stash-enterprise/commit/d378ef2d) Update e2e tests to run on GitHub actions (#917) +- [bc27645c](https://github.com/appscode/stash-enterprise/commit/bc27645c) Enable make ci (#928) +- [9ef3cfeb](https://github.com/appscode/stash-enterprise/commit/9ef3cfeb) Don't restart workload on backup pause+Use ImagePullPolicy: "Always" for Function-Task model (#929) +- [a5f00836](https://github.com/appscode/stash-enterprise/commit/a5f00836) Add status.observedGeneration (#927) +- [57eadd03](https://github.com/appscode/stash-enterprise/commit/57eadd03) Implement RetentionPolicy for VolumeSnapshot (#926) +- [db709fdc](https://github.com/appscode/stash-enterprise/commit/db709fdc) Verify generated files are up to date (#925) +- [5fb54194](https://github.com/appscode/stash-enterprise/commit/5fb54194) Update and rename go.yml to ci.yml (#922) +- [0be34c5e](https://github.com/appscode/stash-enterprise/commit/0be34c5e) Add probe and BackupBatch api (#890) +- [a55b6e84](https://github.com/appscode/stash-enterprise/commit/a55b6e84) Use core package from k8s.io/api repo (#921) +- [f5a271be](https://github.com/appscode/stash-enterprise/commit/f5a271be) Bring back dependency to github.com/golang/protobuf@v1.2.0 (#918) +- [5dfeecbc](https://github.com/appscode/stash-enterprise/commit/5dfeecbc) Update tag pattern for release pipeline +- [e31f5e9a](https://github.com/appscode/stash-enterprise/commit/e31f5e9a) Run e2e tests using GitHub actions (#909) +- [8bb3ef36](https://github.com/appscode/stash-enterprise/commit/8bb3ef36) Add app=stash label to crd yamls +- [b50b47c9](https://github.com/appscode/stash-enterprise/commit/b50b47c9) Generate swagger.json for v1beta1 (#916) +- [095a4a6c](https://github.com/appscode/stash-enterprise/commit/095a4a6c) Add release pipeline (#915) +- [66926055](https://github.com/appscode/stash-enterprise/commit/66926055) Fix Restore PVC using Task Function method (#897) +- [404840e4](https://github.com/appscode/stash-enterprise/commit/404840e4) Fix VolumeSnapshot Issues (#912) +- [7f3b2250](https://github.com/appscode/stash-enterprise/commit/7f3b2250) Add Kubebuilder annotations (#911) +- [0a499f13](https://github.com/appscode/stash-enterprise/commit/0a499f13) Use kubebuilder to generate crd yamls (#843) +- [4903508f](https://github.com/appscode/stash-enterprise/commit/4903508f) Update go.yml +- [23c44bc0](https://github.com/appscode/stash-enterprise/commit/23c44bc0) Introduce InterimVolumeTemplate and BackupHistoryLimit field. (#907) +- [4ee56d63](https://github.com/appscode/stash-enterprise/commit/4ee56d63) Make RetentionPolicy required in v1beta1 api (#905) +- [5476cd7a](https://github.com/appscode/stash-enterprise/commit/5476cd7a) Enable GitHub actions (#903) +- [fe87b789](https://github.com/appscode/stash-enterprise/commit/fe87b789) Fix snapshot listing for local backend (#902) +- [5f49f5d2](https://github.com/appscode/stash-enterprise/commit/5f49f5d2) Improve Error Handling + Code refactor (#891) +- [88c84275](https://github.com/appscode/stash-enterprise/commit/88c84275) Add `NICE` and `IONICE` into distroless image (#883) +- [f63d5c1a](https://github.com/appscode/stash-enterprise/commit/f63d5c1a) Improve metrics handling + make update status uniform (#872) +- [ea68de24](https://github.com/appscode/stash-enterprise/commit/ea68de24) Use default fsGroup: 65535 (#874) +- [9bbcabab](https://github.com/appscode/stash-enterprise/commit/9bbcabab) Add DumpEnv func to Restic Config file (#870) +- [ebde15db](https://github.com/appscode/stash-enterprise/commit/ebde15db) Allow to specify subPath in auto-backup annotation (#871) +- [6c127323](https://github.com/appscode/stash-enterprise/commit/6c127323) Silence docker buildx command (#866) +- [5c47abc3](https://github.com/appscode/stash-enterprise/commit/5c47abc3) Update README.md (#865) +- [50f69ffe](https://github.com/appscode/stash-enterprise/commit/50f69ffe) Use docker buildx to build docker image (#864) +- [d8c0b1d8](https://github.com/appscode/stash-enterprise/commit/d8c0b1d8) Update version in gendocs script +- [cb972a98](https://github.com/appscode/stash-enterprise/commit/cb972a98) Use github.com/Azure/go-autorest/autorest@v0.7.0 (#862) +- [ae5c1325](https://github.com/appscode/stash-enterprise/commit/ae5c1325) Remove the `bs` short name for BackupSession (#859) +- [1c01d69d](https://github.com/appscode/stash-enterprise/commit/1c01d69d) Use github.com/golang/protobuf@v1.2.0 (#855) +- [998fac02](https://github.com/appscode/stash-enterprise/commit/998fac02) New variable from type field of AppBinding + Fix RoleBinding nam… (#845) +- [b97b7622](https://github.com/appscode/stash-enterprise/commit/b97b7622) Fix resolving Task if volumeClaimTemplate is set in RestoreSession(#852) +- [4ec6caf8](https://github.com/appscode/stash-enterprise/commit/4ec6caf8) Rename BackupConfigurationTemplate to BackupBlueprint (#847) +- [d8efb120](https://github.com/appscode/stash-enterprise/commit/d8efb120) Use POD_ORDINAL env var to restore using PVC template (#849) +- [8df5be99](https://github.com/appscode/stash-enterprise/commit/8df5be99) Pass replicas from RestoreSession to Function (#848) +- [ae5eabd4](https://github.com/appscode/stash-enterprise/commit/ae5eabd4) Use variable for version in BackupConfigurationTemplate name (#846) +- [fe5b2049](https://github.com/appscode/stash-enterprise/commit/fe5b2049) Fix Platforms Issue (#844) +- [33fc37cd](https://github.com/appscode/stash-enterprise/commit/33fc37cd) Add support to restore using volumeClaimTemplate in Function-Task model (#841) +- [3de534ba](https://github.com/appscode/stash-enterprise/commit/3de534ba) Add GetSnapshotSize() function (#839) +- [6bc80ce2](https://github.com/appscode/stash-enterprise/commit/6bc80ce2) Fix travis build (#837) +- [1c51a7c5](https://github.com/appscode/stash-enterprise/commit/1c51a7c5) Add support for parallel backup & restore (#833) +- [e250bb62](https://github.com/appscode/stash-enterprise/commit/e250bb62) Fix RestoreSession replicas logic (#835) +- [37618091](https://github.com/appscode/stash-enterprise/commit/37618091) Use cron.ParseStandard helper +- [5015a60d](https://github.com/appscode/stash-enterprise/commit/5015a60d) Update azure-sdk-for-go dependencies (#836) +- [920dfaea](https://github.com/appscode/stash-enterprise/commit/920dfaea) Update github.com/appscode/go@master +- [ca2fad07](https://github.com/appscode/stash-enterprise/commit/ca2fad07) Use robfig/cron@v3 (#834) +- [95728126](https://github.com/appscode/stash-enterprise/commit/95728126) Fix restore Job parallel execution (#832) +- [94cbae13](https://github.com/appscode/stash-enterprise/commit/94cbae13) Remove unused code (#829) +- [4dc11263](https://github.com/appscode/stash-enterprise/commit/4dc11263) Generate docs files inside docs repo (#828) +- [6fb5bc7f](https://github.com/appscode/stash-enterprise/commit/6fb5bc7f) Create default Functions and Tasks from operator (#824) +- [bb675f67](https://github.com/appscode/stash-enterprise/commit/bb675f67) Fix restore job RBAC (#821) +- [f96852fc](https://github.com/appscode/stash-enterprise/commit/f96852fc) Fixed volumeSnapshot Error Issue (#819) +- [08b0f50f](https://github.com/appscode/stash-enterprise/commit/08b0f50f) fix default securityContext passing to restore init-container/job + fix container name (#823) +- [4aa94675](https://github.com/appscode/stash-enterprise/commit/4aa94675) Add License notice to makefile (#825) +- [955b1adb](https://github.com/appscode/stash-enterprise/commit/955b1adb) Make --image-tag a required flag. (#817) +- [9ca08aa6](https://github.com/appscode/stash-enterprise/commit/9ca08aa6) Always attempt to pull a newer image for `make container` (#818) +- [b88cb9dc](https://github.com/appscode/stash-enterprise/commit/b88cb9dc) Update constants.go +- [aa0c41f4](https://github.com/appscode/stash-enterprise/commit/aa0c41f4) Add PusgatewayURL input for Functions (#816) +- [0a45b44a](https://github.com/appscode/stash-enterprise/commit/0a45b44a) Restore PVCs from templates using Restic (#809) +- [0729ab19](https://github.com/appscode/stash-enterprise/commit/0729ab19) Add TARGET_RESOURCE variable for BackupConfigurationTemplate (#814) +- [bab795c2](https://github.com/appscode/stash-enterprise/commit/bab795c2) Add make install, uninstall, purge commands (#813) +- [604af0d5](https://github.com/appscode/stash-enterprise/commit/604af0d5) Move chart & deploy scripts to github.com/stashed/installer (#811) +- [521f441b](https://github.com/appscode/stash-enterprise/commit/521f441b) Use stashed/docs repo +- [4c89667d](https://github.com/appscode/stash-enterprise/commit/4c89667d) Move docs to github.com/stashed/docs repo (#810) +- [e6614482](https://github.com/appscode/stash-enterprise/commit/e6614482) Fix travis build (#804) +- [d8f565f4](https://github.com/appscode/stash-enterprise/commit/d8f565f4) Pass labels to offshoot + add generic offshoot labels (#801) +- [eadca45d](https://github.com/appscode/stash-enterprise/commit/eadca45d) Move HandleResticError to util package (#806) +- [df42b83f](https://github.com/appscode/stash-enterprise/commit/df42b83f) Remove canary support (#805) +- [82614d32](https://github.com/appscode/stash-enterprise/commit/82614d32) Update Version.go (#803) +- [74453ad8](https://github.com/appscode/stash-enterprise/commit/74453ad8) Added ARM64 support to the install script and manifest (#802) +- [24ece6cc](https://github.com/appscode/stash-enterprise/commit/24ece6cc) Load modules from vendor folder for linter +- [2672ee05](https://github.com/appscode/stash-enterprise/commit/2672ee05) Add Makefile (#800) +- [ac829f30](https://github.com/appscode/stash-enterprise/commit/ac829f30) VolumeSnapshot (#787) +- [a8f3172f](https://github.com/appscode/stash-enterprise/commit/a8f3172f) Remove importance of order of rule in RestoreSession (#795) +- [886649ed](https://github.com/appscode/stash-enterprise/commit/886649ed) Skip BackupSession creation if target does not exist + use timestamp … (#797) +- [f038d86e](https://github.com/appscode/stash-enterprise/commit/f038d86e) Use absolute path as aliases for reference docs. (#796) +- [b9100307](https://github.com/appscode/stash-enterprise/commit/b9100307) Support PSP enabled cluster (#729) +- [e94399dc](https://github.com/appscode/stash-enterprise/commit/e94399dc) Use restic 0.9.5 (#789) +- [e962a1c4](https://github.com/appscode/stash-enterprise/commit/e962a1c4) Fix: User and group creation of stash for mongodb and mysql (#786) +- [228df5a3](https://github.com/appscode/stash-enterprise/commit/228df5a3) Update concept doc (#739) +- [de9536cd](https://github.com/appscode/stash-enterprise/commit/de9536cd) Update backup manager (#782) +- [739273a5](https://github.com/appscode/stash-enterprise/commit/739273a5) Configure Env variables for Functions (#780) +- [c49b24f6](https://github.com/appscode/stash-enterprise/commit/c49b24f6) Add support for backup cluster resources YAML (#721) +- [91bce2fd](https://github.com/appscode/stash-enterprise/commit/91bce2fd) Add "Supported Backends" doc to new guides (#756) +- [a8ef2d36](https://github.com/appscode/stash-enterprise/commit/a8ef2d36) Fix rest backend for workloads + add more authentication method for swift backend (#778) +- [775b6660](https://github.com/appscode/stash-enterprise/commit/775b6660) Backup and restore Elasticsearch (#702) +- [0fbb9c75](https://github.com/appscode/stash-enterprise/commit/0fbb9c75) Add guides template for new design (#755) +- [03689414](https://github.com/appscode/stash-enterprise/commit/03689414) Update package path to stash.appscode.dev/stash (#776) +- [639d499f](https://github.com/appscode/stash-enterprise/commit/639d499f) Update to k8s 1.14.0 client libraries using go.mod (#775) +- [9ba906d8](https://github.com/appscode/stash-enterprise/commit/9ba906d8) MutatingWebhooks must be without side-effect (#773) +- [937012d5](https://github.com/appscode/stash-enterprise/commit/937012d5) Introduce VolumeSnapshot APIs (#772) +- [2b0f0560](https://github.com/appscode/stash-enterprise/commit/2b0f0560) Use osm pkg from kmodules/objectstore-api (#770) +- [cd9f6ad6](https://github.com/appscode/stash-enterprise/commit/cd9f6ad6) Remove --rbac flag (#761) +- [09af5d31](https://github.com/appscode/stash-enterprise/commit/09af5d31) Skip creating/processing backup-session when backup-config is paused (#759) +- [99753f73](https://github.com/appscode/stash-enterprise/commit/99753f73) Fix go fmt +- [64bb9bdd](https://github.com/appscode/stash-enterprise/commit/64bb9bdd) Stash v1beta1 E2E test for PVC (#753) +- [bcf8b90d](https://github.com/appscode/stash-enterprise/commit/bcf8b90d) Implement snapshots for v1beta1 api (#749) +- [3f0ae2d4](https://github.com/appscode/stash-enterprise/commit/3f0ae2d4) Run restic commands using docker (#754) +- [17feb41c](https://github.com/appscode/stash-enterprise/commit/17feb41c) Update Kubernetes client libraries to 1.13.5 (#752) +- [2d413ee0](https://github.com/appscode/stash-enterprise/commit/2d413ee0) Stash v1beta1 E2E test for ReplicaSet (#747) +- [80b2b3d9](https://github.com/appscode/stash-enterprise/commit/80b2b3d9) Enable pipefail and update restore yamls (#750) +- [c908df9f](https://github.com/appscode/stash-enterprise/commit/c908df9f) Stash v1beta1 E2E test for ReplicationController (#742) +- [82c17eaf](https://github.com/appscode/stash-enterprise/commit/82c17eaf) Fixed scratch-dir, output-dir and hostname in functions/tasks yamls (#744) +- [d113b24f](https://github.com/appscode/stash-enterprise/commit/d113b24f) Add Stash CLI (#734) +- [286792a6](https://github.com/appscode/stash-enterprise/commit/286792a6) Stash v1beta1 E2E test for DaemonSet (#741) +- [62960e5b](https://github.com/appscode/stash-enterprise/commit/62960e5b) Apply nice/ionice settings from env (#746) +- [a2534c97](https://github.com/appscode/stash-enterprise/commit/a2534c97) Stash V1beta1 E2E test for StatefulSet (#737) +- [37087b38](https://github.com/appscode/stash-enterprise/commit/37087b38) Stash V1beta1 E2E test for Deployment (#710) +- [c08f04e4](https://github.com/appscode/stash-enterprise/commit/c08f04e4) Attach local backend (#736) +- [7a282d91](https://github.com/appscode/stash-enterprise/commit/7a282d91) Fix openapi path prefixes for validators and mutators (#732) +- [a8aef590](https://github.com/appscode/stash-enterprise/commit/a8aef590) Add max-connections for GCS, Azure, B2 backend (#730) +- [dd3f459c](https://github.com/appscode/stash-enterprise/commit/dd3f459c) Rename admission webhooks to avoid name collision (#725) +- [a32ceff5](https://github.com/appscode/stash-enterprise/commit/a32ceff5) Apply EmptyDir settings to TmpDir (#719) +- [36fdb9ae](https://github.com/appscode/stash-enterprise/commit/36fdb9ae) Use FailurePolicy ignore for K8s resource webhooks (#726) +- [4cab69a0](https://github.com/appscode/stash-enterprise/commit/4cab69a0) Don't write secret data inside temp dir (#724) +- [e2bcc4a8](https://github.com/appscode/stash-enterprise/commit/e2bcc4a8) Use ionice and nice with Restic CMD (#716) +- [bf91db4e](https://github.com/appscode/stash-enterprise/commit/bf91db4e) Use cleanup-cache flag (#717) +- [f2669f17](https://github.com/appscode/stash-enterprise/commit/f2669f17) Add TempDir and PSP settings for Function (#720) +- [dfc3fbd6](https://github.com/appscode/stash-enterprise/commit/dfc3fbd6) Add support for rest backend (#713) +- [47cf2dd4](https://github.com/appscode/stash-enterprise/commit/47cf2dd4) Add support for OpenShift DeploymentConfig (#714) +- [8c2b81b0](https://github.com/appscode/stash-enterprise/commit/8c2b81b0) Backup and restore Mongo DB (#699) +- [2849319a](https://github.com/appscode/stash-enterprise/commit/2849319a) Backup and restore MySQL DB (#696) +- [49fe8404](https://github.com/appscode/stash-enterprise/commit/49fe8404) Backup and restore Postgres DB (#695) +- [dbff05f6](https://github.com/appscode/stash-enterprise/commit/dbff05f6) Backup from stdin and dump to stdout (#694) +- [08ff2fa5](https://github.com/appscode/stash-enterprise/commit/08ff2fa5) Add BackupSession Controller for Sidecar (#701) +- [83f1c6e5](https://github.com/appscode/stash-enterprise/commit/83f1c6e5) Update workload controller for new design (#675) +- [13fb68bd](https://github.com/appscode/stash-enterprise/commit/13fb68bd) Post backup/restore status update (#691) +- [30993c08](https://github.com/appscode/stash-enterprise/commit/30993c08) Backup and restore PVC (#676) +- [7bdf0752](https://github.com/appscode/stash-enterprise/commit/7bdf0752) Resolve tasks for backup/restore sessions (#674) +- [6a74602a](https://github.com/appscode/stash-enterprise/commit/6a74602a) Add restic wrapper library (#673) +- [7b8309a5](https://github.com/appscode/stash-enterprise/commit/7b8309a5) Add BackupConfiguration Controller (#671) +- [6f6c25d1](https://github.com/appscode/stash-enterprise/commit/6f6c25d1) Use ContainerRuntimeSettings in Function spec (#689) +- [4d80cf6b](https://github.com/appscode/stash-enterprise/commit/4d80cf6b) Update Kubernetes client libraries to 1.13.0 (#687) +- [361d4ad3](https://github.com/appscode/stash-enterprise/commit/361d4ad3) Fix v1beta1 api for BackupConfigurationTemplate (#688) +- [302311af](https://github.com/appscode/stash-enterprise/commit/302311af) Introduce v1beta1 api (#647) +- [ccf4469b](https://github.com/appscode/stash-enterprise/commit/ccf4469b) Prepare docs for 0.8.3 release (#683) +- [54fb4998](https://github.com/appscode/stash-enterprise/commit/54fb4998) Update changelog for 0.8.3 (#682) +- [277ef3b7](https://github.com/appscode/stash-enterprise/commit/277ef3b7) Update dependencies (#681) +- [80d55446](https://github.com/appscode/stash-enterprise/commit/80d55446) Don't add hostname label to Prometheus metrics. (#680) +- [e5b7f32c](https://github.com/appscode/stash-enterprise/commit/e5b7f32c) Pass pod annotation to deployment (#679) +- [b342a954](https://github.com/appscode/stash-enterprise/commit/b342a954) Fix the case for deploying using MINGW64 for windows (#678) +- [4cdc5596](https://github.com/appscode/stash-enterprise/commit/4cdc5596) Use onessl 0.10.0 (#677) +- [296712f0](https://github.com/appscode/stash-enterprise/commit/296712f0) Fix typo +- [fbb98590](https://github.com/appscode/stash-enterprise/commit/fbb98590) s/rook/azure/ in possible copy/paste error. (#669) +- [29e7b6ce](https://github.com/appscode/stash-enterprise/commit/29e7b6ce) Fix builtin monitoring doc (#668) +- [4b7fe1e4](https://github.com/appscode/stash-enterprise/commit/4b7fe1e4) Update install.md +- [8a3b2ee6](https://github.com/appscode/stash-enterprise/commit/8a3b2ee6) Don't use priority class when operator namespace is not kube-system (#666) +- [5bf48b1b](https://github.com/appscode/stash-enterprise/commit/5bf48b1b) Separate type definitions into individual files (#646) +- [80f21a0d](https://github.com/appscode/stash-enterprise/commit/80f21a0d) Update changelog for 0.8.2 +- [ed5c6b86](https://github.com/appscode/stash-enterprise/commit/ed5c6b86) Prepare docs for 0.8.2 release (#644) +- [a56261b0](https://github.com/appscode/stash-enterprise/commit/a56261b0) Update copyright notice for 2019 (#643) +- [812f13e1](https://github.com/appscode/stash-enterprise/commit/812f13e1) Use fullname to generate cleaner name in chart +- [9daa8a0e](https://github.com/appscode/stash-enterprise/commit/9daa8a0e) apply stash.labels to operator pods +- [c36875f0](https://github.com/appscode/stash-enterprise/commit/c36875f0) Use stash.labels template in chart (#642) +- [946df536](https://github.com/appscode/stash-enterprise/commit/946df536) Fixed broken link for bakend (#641) +- [38d3c734](https://github.com/appscode/stash-enterprise/commit/38d3c734) Only mount stash apiserver `tls.crt` into Prometheus (#639) +- [9e6a6604](https://github.com/appscode/stash-enterprise/commit/9e6a6604) Fix typo in installer (#638) +- [0a4488cf](https://github.com/appscode/stash-enterprise/commit/0a4488cf) Fix monitoring in helm + update doc to match with third-party-tools tutorial (#637) +- [903d9649](https://github.com/appscode/stash-enterprise/commit/903d9649) Add certificate health checker (#636) +- [a931bbd9](https://github.com/appscode/stash-enterprise/commit/a931bbd9) Update install.md +- [99e6afba](https://github.com/appscode/stash-enterprise/commit/99e6afba) Update chart readme (#632) +- [d19ae9fa](https://github.com/appscode/stash-enterprise/commit/d19ae9fa) Update webhook error message format for Kubernetes 1.13+ (#631) +- [cd9b42df](https://github.com/appscode/stash-enterprise/commit/cd9b42df) Fix typos (#630) +- [ce1e0d98](https://github.com/appscode/stash-enterprise/commit/ce1e0d98) Fix dependencies. +- [c2e41214](https://github.com/appscode/stash-enterprise/commit/c2e41214) Update changelog +- [55233451](https://github.com/appscode/stash-enterprise/commit/55233451) Prepare docs for 0.8.1 release (#629) +- [d5086aa6](https://github.com/appscode/stash-enterprise/commit/d5086aa6) Add missing validator for respository resource in chart (#628) +- [d9d7f1d4](https://github.com/appscode/stash-enterprise/commit/d9d7f1d4) Update version matrix +- [7af5e82c](https://github.com/appscode/stash-enterprise/commit/7af5e82c) Prepare docs for 0.8.0 release (#626) +- [a1e250f6](https://github.com/appscode/stash-enterprise/commit/a1e250f6) Update docs (Minio, Rook, NFS) (#625) +- [92779d6c](https://github.com/appscode/stash-enterprise/commit/92779d6c) Use flags.DumpAll to dump flags (#624) +- [affdebf6](https://github.com/appscode/stash-enterprise/commit/affdebf6) Merge commit '619323825a3fabc55ce2584dd63f8005fd3b78b3' +- [dddb09f8](https://github.com/appscode/stash-enterprise/commit/dddb09f8) Set periodic analytics (#623) +- [f054ecf7](https://github.com/appscode/stash-enterprise/commit/f054ecf7) Fix e2e test (#622) +- [92bcb0e9](https://github.com/appscode/stash-enterprise/commit/92bcb0e9) Recovery Job: Use nodeName for DaemonSet and nodeSelector for other workloads (#620) +- [3dc6fc5d](https://github.com/appscode/stash-enterprise/commit/3dc6fc5d) Pass --enable-***-webhook flags to operator (#619) +- [257b33e0](https://github.com/appscode/stash-enterprise/commit/257b33e0) Add validation webhook xray (#618) +- [fcb6cfdf](https://github.com/appscode/stash-enterprise/commit/fcb6cfdf) Add docs for AKS and EKS (#609) +- [d1594955](https://github.com/appscode/stash-enterprise/commit/d1594955) Improve monitoring facility (#606) +- [f484b196](https://github.com/appscode/stash-enterprise/commit/f484b196) Use dynamic pushgateway url (#614) +- [78b288d3](https://github.com/appscode/stash-enterprise/commit/78b288d3) Pass image pull secrets for cleaner job in chart (#598) +- [773bd24c](https://github.com/appscode/stash-enterprise/commit/773bd24c) Update kubernetes client libraries to 1.12.0 (#597) +- [2ff8cb30](https://github.com/appscode/stash-enterprise/commit/2ff8cb30) Support LogLevel in chart (#594) +- [c71b4cdf](https://github.com/appscode/stash-enterprise/commit/c71b4cdf) Check if Kubernetes version is supported before running operator (#593) +- [3b443c68](https://github.com/appscode/stash-enterprise/commit/3b443c68) Enable webhooks by default in chart (#591) +- [9b28c755](https://github.com/appscode/stash-enterprise/commit/9b28c755) Update chart readme for cleaner values (#590) +- [0da860c2](https://github.com/appscode/stash-enterprise/commit/0da860c2) Update values.yaml +- [ef90bd48](https://github.com/appscode/stash-enterprise/commit/ef90bd48) Fix #583 and pushgateway version (#584) +- [fbbaf380](https://github.com/appscode/stash-enterprise/commit/fbbaf380) Use --pull flag with docker build (#581) +- [0cc79ee4](https://github.com/appscode/stash-enterprise/commit/0cc79ee4) Merge commit '593cbc0910006952073295cea802d37f30ab8e3f' +- [8a7e068d](https://github.com/appscode/stash-enterprise/commit/8a7e068d) Use kubernetes-1.11.3 (#578) +- [bd5e17b7](https://github.com/appscode/stash-enterprise/commit/bd5e17b7) Update CertStore (#576) +- [ea4b0243](https://github.com/appscode/stash-enterprise/commit/ea4b0243) Use apps/v1 apigroup in installer scripts (#574) +- [fc043125](https://github.com/appscode/stash-enterprise/commit/fc043125) Support pod annotations in chart (#573) +- [8c840810](https://github.com/appscode/stash-enterprise/commit/8c840810) Set serviceAccount for clearner job (#572) +- [4506adea](https://github.com/appscode/stash-enterprise/commit/4506adea) Set SecurityContext for stash sidecar (#570) +- [82416111](https://github.com/appscode/stash-enterprise/commit/82416111) Cleanup webhooks when chart is deleted (#569) +- [5e466ace](https://github.com/appscode/stash-enterprise/commit/5e466ace) fix success list (#567) +- [e65fcbf0](https://github.com/appscode/stash-enterprise/commit/e65fcbf0) Use IntHash as status.observedGeneration (#568) +- [3848ad8d](https://github.com/appscode/stash-enterprise/commit/3848ad8d) Update pipeline (#565) +- [dcf5c40b](https://github.com/appscode/stash-enterprise/commit/dcf5c40b) Merge commit 'dc51668e81aad9349769f0287cb885477836f2b1' +- [14797878](https://github.com/appscode/stash-enterprise/commit/14797878) Add observedGenerationHash field (#564) +- [83ceccc2](https://github.com/appscode/stash-enterprise/commit/83ceccc2) Merge commit 'c73f89c561b2e686d2898b0c8dea8c0bd327e6fd' +- [af105158](https://github.com/appscode/stash-enterprise/commit/af105158) Fix uninstall for concourse (#563) +- [41bb7c71](https://github.com/appscode/stash-enterprise/commit/41bb7c71) Fix chart values file (#562) +- [761d2af9](https://github.com/appscode/stash-enterprise/commit/761d2af9) Improve Helm chart options (#561) +- [7c69854a](https://github.com/appscode/stash-enterprise/commit/7c69854a) Use apps/v1 apigroup (#555) +- [067fd837](https://github.com/appscode/stash-enterprise/commit/067fd837) Merge commit 'e0a3eef3ad5bb45a6967704531a303bc7ea7d865' +- [b93bdb20](https://github.com/appscode/stash-enterprise/commit/b93bdb20) Refactor concourse scripts (#554) +- [6ba7fc6c](https://github.com/appscode/stash-enterprise/commit/6ba7fc6c) Merge commit '2a5664a73d8d23ced4598e61327a3d7003db2e04' +- [5f769633](https://github.com/appscode/stash-enterprise/commit/5f769633) Add AlreadyObserved methods (#553) +- [98998f2c](https://github.com/appscode/stash-enterprise/commit/98998f2c) Add categories support to crds (#552) +- [cc46dc11](https://github.com/appscode/stash-enterprise/commit/cc46dc11) Improve doc (#550) +- [59a763c5](https://github.com/appscode/stash-enterprise/commit/59a763c5) Fix concourse test (#496) +- [7a7145da](https://github.com/appscode/stash-enterprise/commit/7a7145da) Check for snapshot existence before delete (#548) +- [a3a91ebc](https://github.com/appscode/stash-enterprise/commit/a3a91ebc) Improve logging (#551) +- [9bb3bbfd](https://github.com/appscode/stash-enterprise/commit/9bb3bbfd) Fix offline backup (#537) +- [cb676e37](https://github.com/appscode/stash-enterprise/commit/cb676e37) Enable status sub resource for crd yamls (#546) +- [4f1e66a4](https://github.com/appscode/stash-enterprise/commit/4f1e66a4) Remove old UpdateRecoveryStatus +- [6d6d5dcf](https://github.com/appscode/stash-enterprise/commit/6d6d5dcf) Retry UpdateStatus calls (#544) +- [3d191095](https://github.com/appscode/stash-enterprise/commit/3d191095) Retry UpdateStatus calls (#543) +- [38401b36](https://github.com/appscode/stash-enterprise/commit/38401b36) Revendor objectstore api (#542) +- [8dc3b6a2](https://github.com/appscode/stash-enterprise/commit/8dc3b6a2) Use kmodules.xyz/objectstore-api (#541) +- [1d3b1ea1](https://github.com/appscode/stash-enterprise/commit/1d3b1ea1) Merge commit 'da9eaba42e9b93d6975059b7f37c7863e54e1db1' +- [cee03417](https://github.com/appscode/stash-enterprise/commit/cee03417) Update install.md +- [e0a00726](https://github.com/appscode/stash-enterprise/commit/e0a00726) Fix extended apiserver issues with Kubernetes 1.11 (#536) +- [4ee36486](https://github.com/appscode/stash-enterprise/commit/4ee36486) Correctly handle ignored openapi prefixes (#533) +- [ee3945c4](https://github.com/appscode/stash-enterprise/commit/ee3945c4) Rename dev script (#532) +- [1bbc5632](https://github.com/appscode/stash-enterprise/commit/1bbc5632) Add rbac permissions for snapshots (#531) +- [0de9fa5f](https://github.com/appscode/stash-enterprise/commit/0de9fa5f) Use version and additional columns for crds (#530) +- [dde60d6b](https://github.com/appscode/stash-enterprise/commit/dde60d6b) Don't add admission/v1beta1 group as a prioritized version (#529) +- [6913f840](https://github.com/appscode/stash-enterprise/commit/6913f840) Update client-go to v8.0.0 (#528) +- [160b1162](https://github.com/appscode/stash-enterprise/commit/160b1162) Update chart installation instruction for Kubernetes 1.11 (#527) +- [8cce9279](https://github.com/appscode/stash-enterprise/commit/8cce9279) Format shell scripts (#526) +- [07a44f72](https://github.com/appscode/stash-enterprise/commit/07a44f72) Merge commit 'bcebfb5adef7b4de9d4da7e48d9ba50a66e75fd3' +- [e14f357b](https://github.com/appscode/stash-enterprise/commit/e14f357b) Merge commit '2c8b49681a6875886b6be4d90c35908f12b73c65' +- [0c019e96](https://github.com/appscode/stash-enterprise/commit/0c019e96) Enable status subresource for crds (#524) +- [54270853](https://github.com/appscode/stash-enterprise/commit/54270853) Remove status from crd.yaml (#523) +- [97e97d1f](https://github.com/appscode/stash-enterprise/commit/97e97d1f) Upgrade to restic 0.9.1 (#522) +- [f7910af6](https://github.com/appscode/stash-enterprise/commit/f7910af6) Support node selector for recovery job (#516) +- [5b4981a1](https://github.com/appscode/stash-enterprise/commit/5b4981a1) Upgrade to prom/pushgateway:v0.5.2 (#519) +- [05ead203](https://github.com/appscode/stash-enterprise/commit/05ead203) Remove ops-address port (#518) +- [ceb699f4](https://github.com/appscode/stash-enterprise/commit/ceb699f4) Set cpu limits to 100m (#517) +- [e426c6cb](https://github.com/appscode/stash-enterprise/commit/e426c6cb) Update stash.sh +- [97a7d622](https://github.com/appscode/stash-enterprise/commit/97a7d622) Add links to java client +- [9f6b9a17](https://github.com/appscode/stash-enterprise/commit/9f6b9a17) Move openapi-spec to api folder (#513) +- [1a2a1af1](https://github.com/appscode/stash-enterprise/commit/1a2a1af1) Deploy operator in kube-system namespace via Helm (#511) +- [3476b49f](https://github.com/appscode/stash-enterprise/commit/3476b49f) Add togglable tabs for Installation: Script & Helm (#509) +- [b386851d](https://github.com/appscode/stash-enterprise/commit/b386851d) Revendor dependencies (#508) +- [0c5d5a41](https://github.com/appscode/stash-enterprise/commit/0c5d5a41) added front matter (#507) +- [42b26588](https://github.com/appscode/stash-enterprise/commit/42b26588) Improve installer (#504) +- [705ecd09](https://github.com/appscode/stash-enterprise/commit/705ecd09) Prepare docs for 0.7.0 release. (#502) +- [72c9e20e](https://github.com/appscode/stash-enterprise/commit/72c9e20e) Prepare docs for 0.7.0-rc.5 (#498) +- [0da98a7b](https://github.com/appscode/stash-enterprise/commit/0da98a7b) Fix storage implementation for snapshots (#497) +- [247c0168](https://github.com/appscode/stash-enterprise/commit/247c0168) Update changelog (#495) +- [8181d490](https://github.com/appscode/stash-enterprise/commit/8181d490) Delete user roles on purge. (#494) +- [b2f4ab9e](https://github.com/appscode/stash-enterprise/commit/b2f4ab9e) Revert "Add app: stash label to user roles. (#493)" +- [c7ae0d44](https://github.com/appscode/stash-enterprise/commit/c7ae0d44) Add app: stash label to user roles. (#493) +- [5ee7ff1d](https://github.com/appscode/stash-enterprise/commit/5ee7ff1d) Use hooks for user roles and fix hook deletion policy +- [872450a3](https://github.com/appscode/stash-enterprise/commit/872450a3) Use post-install hooks to install admission controller in chart (#492) +- [5448cd43](https://github.com/appscode/stash-enterprise/commit/5448cd43) Revert "Remove stash crds before uninstalling operator (#458)" +- [a1d73a47](https://github.com/appscode/stash-enterprise/commit/a1d73a47) Update changelog (#491) +- [100dd7e4](https://github.com/appscode/stash-enterprise/commit/100dd7e4) Prepare docs for 0.7.0-rc.4 (#483) +- [7f2665dd](https://github.com/appscode/stash-enterprise/commit/7f2665dd) Avoid creating apiservice when webhooks are not used. (#490) +- [ff32a4aa](https://github.com/appscode/stash-enterprise/commit/ff32a4aa) Install correct version of stash chart (#489) +- [74e6f4aa](https://github.com/appscode/stash-enterprise/commit/74e6f4aa) Concourse (#486) +- [cd2cf249](https://github.com/appscode/stash-enterprise/commit/cd2cf249) Use wait-until instead of fixed delay (#488) +- [9f023116](https://github.com/appscode/stash-enterprise/commit/9f023116) Removed owner reference from repo-reader role-binding (#484) +- [d2d3d49f](https://github.com/appscode/stash-enterprise/commit/d2d3d49f) Revendor (#481) +- [5dc386d6](https://github.com/appscode/stash-enterprise/commit/5dc386d6) Support recovering from repository in different namespace (#474) +- [b694835b](https://github.com/appscode/stash-enterprise/commit/b694835b) Add support for initial backoff to the apiserver call on recover (#476) +- [b921d4ed](https://github.com/appscode/stash-enterprise/commit/b921d4ed) Fix enableRBAC flag for sidecar (#480) +- [c8c18fb5](https://github.com/appscode/stash-enterprise/commit/c8c18fb5) Typo (`Weclome` → `Welcome`) in page title (#479) +- [4bddc2e1](https://github.com/appscode/stash-enterprise/commit/4bddc2e1) Update docs (run minio in v1.9.4+ cluster and add example yaml files in respective backends) (#473) +- [fd676b12](https://github.com/appscode/stash-enterprise/commit/fd676b12) Limit the GCS file permissions to owner only (#472) +- [0dc74e93](https://github.com/appscode/stash-enterprise/commit/0dc74e93) Fix a typo (#471) +- [3ca33f76](https://github.com/appscode/stash-enterprise/commit/3ca33f76) Don't panic if admission options is nil (#469) +- [bc889236](https://github.com/appscode/stash-enterprise/commit/bc889236) Disable admission controllers for webhook server (#468) +- [4b5ac49d](https://github.com/appscode/stash-enterprise/commit/4b5ac49d) Added SSL support for deleting restic repository from Minio backend (#464) +- [c8d023a8](https://github.com/appscode/stash-enterprise/commit/c8d023a8) Use new UpdateRecoveryStatus method (#466) +- [6c0166e2](https://github.com/appscode/stash-enterprise/commit/6c0166e2) Add Update***Status helpers (#465) +- [5c5ff150](https://github.com/appscode/stash-enterprise/commit/5c5ff150) Update client-go to 7.0.0 (#463) +- [476a9a88](https://github.com/appscode/stash-enterprise/commit/476a9a88) Rename webhook files in chart (#460) +- [3e828ad4](https://github.com/appscode/stash-enterprise/commit/3e828ad4) Update workload api (#459) +- [d3d766d9](https://github.com/appscode/stash-enterprise/commit/d3d766d9) Remove stash crds before uninstalling operator (#458) +- [8fa3ef63](https://github.com/appscode/stash-enterprise/commit/8fa3ef63) Export kube-ca only if required (#457) +- [6a294acc](https://github.com/appscode/stash-enterprise/commit/6a294acc) Improve installer (#456) +- [5c0b35fa](https://github.com/appscode/stash-enterprise/commit/5c0b35fa) Update changelog (#455) +- [bd9b4b50](https://github.com/appscode/stash-enterprise/commit/bd9b4b50) Various installer fixes (#454) +- [6f2d013f](https://github.com/appscode/stash-enterprise/commit/6f2d013f) Update workload client (#453) +- [5d4faa22](https://github.com/appscode/stash-enterprise/commit/5d4faa22) Update workload client (#452) +- [cbea156f](https://github.com/appscode/stash-enterprise/commit/cbea156f) Revendor workload client (#451) +- [81a18190](https://github.com/appscode/stash-enterprise/commit/81a18190) Update workload api (#450) +- [468e6489](https://github.com/appscode/stash-enterprise/commit/468e6489) Fixes RBAC issue in test (#449) +- [4ba3af7b](https://github.com/appscode/stash-enterprise/commit/4ba3af7b) fixed wipeOut + fixed doc (#447) +- [3940c79c](https://github.com/appscode/stash-enterprise/commit/3940c79c) Some cleanup (#446) +- [45f070ff](https://github.com/appscode/stash-enterprise/commit/45f070ff) Delete profile.out +- [3af16023](https://github.com/appscode/stash-enterprise/commit/3af16023) Add docs for GKE and Rook (#430) +- [db31cbeb](https://github.com/appscode/stash-enterprise/commit/db31cbeb) concourse configs (#429) +- [5f288cbc](https://github.com/appscode/stash-enterprise/commit/5f288cbc) Delete restic repository from backend if Repository CRD is deleted (#438) +- [9940d367](https://github.com/appscode/stash-enterprise/commit/9940d367) Recover specific snapshot (#437) +- [26571992](https://github.com/appscode/stash-enterprise/commit/26571992) Use Repository data in Recovery CRD (#436) +- [e1d44499](https://github.com/appscode/stash-enterprise/commit/e1d44499) Update StatefulSet doc (#445) +- [c6e62f34](https://github.com/appscode/stash-enterprise/commit/c6e62f34) pkg/util: fix error found by vet (#442) +- [d5b93f8a](https://github.com/appscode/stash-enterprise/commit/d5b93f8a) Move Stash swagger.json to top level folder (#441) +- [c7753f9b](https://github.com/appscode/stash-enterprise/commit/c7753f9b) Fix go_vet error (#440) +- [564e63ad](https://github.com/appscode/stash-enterprise/commit/564e63ad) Increase qps and burst limits (#435) +- [442bfb40](https://github.com/appscode/stash-enterprise/commit/442bfb40) Permit stash operator to perform pods/exec (#433) +- [4243e931](https://github.com/appscode/stash-enterprise/commit/4243e931) Add RBAC instructions for GKE cluster (#432) +- [6df2f677](https://github.com/appscode/stash-enterprise/commit/6df2f677) Update charts location (#431) +- [a980a2c2](https://github.com/appscode/stash-enterprise/commit/a980a2c2) Skip lock while listing snapshots (#428) +- [a74e2637](https://github.com/appscode/stash-enterprise/commit/a74e2637) Purge repository objects in installer (#427) +- [435359e0](https://github.com/appscode/stash-enterprise/commit/435359e0) Add SCRIPT_LOCATION variable to installer (#426) +- [4d6f7eac](https://github.com/appscode/stash-enterprise/commit/4d6f7eac) Show repository snapshot list (#417) +- [733ec93d](https://github.com/appscode/stash-enterprise/commit/733ec93d) Fixed Repository YAML (#425) +- [6f50f168](https://github.com/appscode/stash-enterprise/commit/6f50f168) Add delete method for snapshots to swagger.json (#424) +- [d43b4890](https://github.com/appscode/stash-enterprise/commit/d43b4890) Generate swagger.json (#423) +- [9ad3d098](https://github.com/appscode/stash-enterprise/commit/9ad3d098) Add install pkg for stash crds (#422) +- [6ff11a1c](https://github.com/appscode/stash-enterprise/commit/6ff11a1c) Fix openapi spec for stash crds (#421) +- [a76f6ac5](https://github.com/appscode/stash-enterprise/commit/a76f6ac5) Expose swagger.json (#420) +- [3f62a44d](https://github.com/appscode/stash-enterprise/commit/3f62a44d) Add missing batch jobs get RBAC permission (#419) +- [3775b7f9](https://github.com/appscode/stash-enterprise/commit/3775b7f9) Update README.md +- [8ed47d37](https://github.com/appscode/stash-enterprise/commit/8ed47d37) Add registry skeleton for snapshots (#415) +- [9d95f38f](https://github.com/appscode/stash-enterprise/commit/9d95f38f) Update chart readme (#413) +- [429afdaa](https://github.com/appscode/stash-enterprise/commit/429afdaa) Add enableAnalytics to chart readme +- [b0a197df](https://github.com/appscode/stash-enterprise/commit/b0a197df) Add frontmatter for repository crd (#412) +- [0dac6862](https://github.com/appscode/stash-enterprise/commit/0dac6862) Use separate registry key for docker images (#410) +- [b09d7bf9](https://github.com/appscode/stash-enterprise/commit/b09d7bf9) Prepare docs for 0.7.0-rc.3 (#411) +- [fce51b73](https://github.com/appscode/stash-enterprise/commit/fce51b73) Add test for recovery (#409) +- [a7dae2e7](https://github.com/appscode/stash-enterprise/commit/a7dae2e7) Skip setting ListKind (#407) +- [9ecb57c1](https://github.com/appscode/stash-enterprise/commit/9ecb57c1) Add CRD Validation (#406) +- [7568e62e](https://github.com/appscode/stash-enterprise/commit/7568e62e) Create repository crd for each Restic repository (#394) +- [f2e78da4](https://github.com/appscode/stash-enterprise/commit/f2e78da4) Generate openapi spec for stash api (#405) +- [3ef2eed4](https://github.com/appscode/stash-enterprise/commit/3ef2eed4) Fix install script for minikube 0.24.x (Kube 1.8.0) (#404) +- [301fb68c](https://github.com/appscode/stash-enterprise/commit/301fb68c) Skip downloading onessl if already installed (#401) +- [9f389a13](https://github.com/appscode/stash-enterprise/commit/9f389a13) Use Restic spec hash instead of resource version to restart pods (#399) +- [ee28df02](https://github.com/appscode/stash-enterprise/commit/ee28df02) Revendor webhook util and jsonpatch fixes (#400) +- [716a3548](https://github.com/appscode/stash-enterprise/commit/716a3548) Check for valid owner object (#397) +- [3b340c16](https://github.com/appscode/stash-enterprise/commit/3b340c16) Revendor webhook library (#393) +- [cd3c0005](https://github.com/appscode/stash-enterprise/commit/cd3c0005) Update changelog +- [c556745f](https://github.com/appscode/stash-enterprise/commit/c556745f) Prepare docs for 0.7.0-rc.2 (#391) +- [e5aee757](https://github.com/appscode/stash-enterprise/commit/e5aee757) Update chart version +- [270a4983](https://github.com/appscode/stash-enterprise/commit/270a4983) Add variable for dockerRegistry (#390) +- [c694593b](https://github.com/appscode/stash-enterprise/commit/c694593b) Reorg objects deleted in uninstall command (#389) +- [d29aa374](https://github.com/appscode/stash-enterprise/commit/d29aa374) Fix --enable-analytics flag (#387) +- [798253c1](https://github.com/appscode/stash-enterprise/commit/798253c1) Fix flag parsing in tests (#386) +- [7834ce77](https://github.com/appscode/stash-enterprise/commit/7834ce77) Fix Statefulset Example (#385) +- [d53219d0](https://github.com/appscode/stash-enterprise/commit/d53219d0) Rename --analytics to --enable-analytics (#384) +- [0c9daeb1](https://github.com/appscode/stash-enterprise/commit/0c9daeb1) Use separated appscode/kubernetes-webhook-util package (#383) +- [05686c2a](https://github.com/appscode/stash-enterprise/commit/05686c2a) Update the image tag in operator.yaml (#382) +- [7e52922b](https://github.com/appscode/stash-enterprise/commit/7e52922b) Don't enable mutator for StatefulSet updates (#381) +- [6f5cc417](https://github.com/appscode/stash-enterprise/commit/6f5cc417) Update docs to 0.7.0-rc.1 (#380) +- [208f89b7](https://github.com/appscode/stash-enterprise/commit/208f89b7) Stop using field selectors for CRDs (#379) +- [da0362b5](https://github.com/appscode/stash-enterprise/commit/da0362b5) Add types for Repository apigroup (#377) +- [f1b12fea](https://github.com/appscode/stash-enterprise/commit/f1b12fea) Replace initializers with mutation webhook for workloads (#363) +- [55309b0f](https://github.com/appscode/stash-enterprise/commit/55309b0f) Merge pull request #375 from galexrt/fix373 +- [6acc5711](https://github.com/appscode/stash-enterprise/commit/6acc5711) Add missing front matter (#376) +- [17254282](https://github.com/appscode/stash-enterprise/commit/17254282) Added error log on restic command error +- [1685f179](https://github.com/appscode/stash-enterprise/commit/1685f179) Don't fail if check Job already exists +- [224a1713](https://github.com/appscode/stash-enterprise/commit/224a1713) Update README.md +- [3992df7d](https://github.com/appscode/stash-enterprise/commit/3992df7d) Fix buid +- [98eae3a0](https://github.com/appscode/stash-enterprise/commit/98eae3a0) Add travis.yaml (#370) +- [fc14b6d2](https://github.com/appscode/stash-enterprise/commit/fc14b6d2) Add --purge flag (#369) +- [c3c18ebe](https://github.com/appscode/stash-enterprise/commit/c3c18ebe) Make it clear that installer is a single command (#365) +- [182cc702](https://github.com/appscode/stash-enterprise/commit/182cc702) Update installer (#364) +- [cb573593](https://github.com/appscode/stash-enterprise/commit/cb573593) Update chart to match RBAC best practices for charts (#362) +- [248bba94](https://github.com/appscode/stash-enterprise/commit/248bba94) Add checks to installer script (#361) +- [41df1df4](https://github.com/appscode/stash-enterprise/commit/41df1df4) Use admission hook helpers from kutil (#360) +- [b90a4564](https://github.com/appscode/stash-enterprise/commit/b90a4564) Fix admission webhook flag (#359) +- [201c871d](https://github.com/appscode/stash-enterprise/commit/201c871d) Support --enable-admission-webhook=false (#358) +- [d70fc0b2](https://github.com/appscode/stash-enterprise/commit/d70fc0b2) Support multiple webhooks of same apiversion (#357) +- [da965aee](https://github.com/appscode/stash-enterprise/commit/da965aee) Sync chart to stable charts repo (#356) +- [34f364f3](https://github.com/appscode/stash-enterprise/commit/34f364f3) Use restic 0.8.3 (#355) +- [0b0e2cd2](https://github.com/appscode/stash-enterprise/commit/0b0e2cd2) Update README.md (#352) +- [0d781b4b](https://github.com/appscode/stash-enterprise/commit/0d781b4b) Set RollingUpdate for DaemonSet (#349) +- [25b60645](https://github.com/appscode/stash-enterprise/commit/25b60645) Document user roles (#348) +- [a1796d2e](https://github.com/appscode/stash-enterprise/commit/a1796d2e) Add upgrade instructions. +- [2616f6f7](https://github.com/appscode/stash-enterprise/commit/2616f6f7) Add changelog for 0.7.0-rc.0 (#347) +- [6f3e7883](https://github.com/appscode/stash-enterprise/commit/6f3e7883) Implement offline backup for multiple replica (#335) +- [3140f3ab](https://github.com/appscode/stash-enterprise/commit/3140f3ab) Update readme to point to 0.6.4 (#345) +- [5a2e635a](https://github.com/appscode/stash-enterprise/commit/5a2e635a) Don't block deletion of owner by default (#342) +- [e6cb9a31](https://github.com/appscode/stash-enterprise/commit/e6cb9a31) Skip generating UpdateStatus method (#341) +- [9d93b3ed](https://github.com/appscode/stash-enterprise/commit/9d93b3ed) Remove internal types (#340) +- [59ccb497](https://github.com/appscode/stash-enterprise/commit/59ccb497) Use rbac/v1 apis (#339) +- [1a532f9b](https://github.com/appscode/stash-enterprise/commit/1a532f9b) Add user roles (#338) +- [76f18553](https://github.com/appscode/stash-enterprise/commit/76f18553) Use restic 0.8.2 (#337) +- [fb47ea99](https://github.com/appscode/stash-enterprise/commit/fb47ea99) Use official code generator scripts (#336) +- [4367fe03](https://github.com/appscode/stash-enterprise/commit/4367fe03) Update rbac-list.yaml +- [8bcff71f](https://github.com/appscode/stash-enterprise/commit/8bcff71f) Rename appendGroupVersion to appendUniqueGroupVersion +- [050c9991](https://github.com/appscode/stash-enterprise/commit/050c9991) Update charts to support api registration (#334) +- [dd82aec9](https://github.com/appscode/stash-enterprise/commit/dd82aec9) Fix e2e tests after webhook merger (#333) +- [1df3e40a](https://github.com/appscode/stash-enterprise/commit/1df3e40a) Ensure stash can be run locally (#332) +- [9d8ff669](https://github.com/appscode/stash-enterprise/commit/9d8ff669) Label all stash installer resources +- [da602cf3](https://github.com/appscode/stash-enterprise/commit/da602cf3) Update Grafana dashboard (#330) +- [2127401f](https://github.com/appscode/stash-enterprise/commit/2127401f) Delete all stash installer resources +- [29a51e21](https://github.com/appscode/stash-enterprise/commit/29a51e21) Use binary operator for checking stauts of semver command +- [5d726907](https://github.com/appscode/stash-enterprise/commit/5d726907) Leave secure port unset +- [5cba3d0f](https://github.com/appscode/stash-enterprise/commit/5cba3d0f) Use ${} form for onessl envsubst +- [0b4aa075](https://github.com/appscode/stash-enterprise/commit/0b4aa075) Vendor client-go auth pkg (#331) +- [4b702a47](https://github.com/appscode/stash-enterprise/commit/4b702a47) Don't append duplicate group versions +- [ccffa360](https://github.com/appscode/stash-enterprise/commit/ccffa360) Merge admission webhook and operator into one binary (#329) +- [c3e76f96](https://github.com/appscode/stash-enterprise/commit/c3e76f96) Use envsubst from onessl +- [639e3fec](https://github.com/appscode/stash-enterprise/commit/639e3fec) Install admission webhook for Kubernetes >=1.9.0 +- [85562989](https://github.com/appscode/stash-enterprise/commit/85562989) Merge uninstall script into the stash.sh script (#328) +- [cb11fca0](https://github.com/appscode/stash-enterprise/commit/cb11fca0) Implement informer factory for backup scheduler (#325) +- [29c489e5](https://github.com/appscode/stash-enterprise/commit/29c489e5) Fixed abnormal pod recreation when Restic is deleted (#322) +- [4238fabc](https://github.com/appscode/stash-enterprise/commit/4238fabc) Implement Pause Restic (#315) +- [f96cff24](https://github.com/appscode/stash-enterprise/commit/f96cff24) Cleanup apiserver +- [c13df9c6](https://github.com/appscode/stash-enterprise/commit/c13df9c6) Copy generic-admission-server into pkg (#318) +- [2b0cf064](https://github.com/appscode/stash-enterprise/commit/2b0cf064) Use shared infromer factory (#317) +- [b5d67a67](https://github.com/appscode/stash-enterprise/commit/b5d67a67) Support self-signed ca cert for backends (#294) +- [50639b72](https://github.com/appscode/stash-enterprise/commit/50639b72) Use GetBaseVersion method from kutil (#316) +- [603c42a1](https://github.com/appscode/stash-enterprise/commit/603c42a1) Update install.md +- [b1b72d4b](https://github.com/appscode/stash-enterprise/commit/b1b72d4b) Remove system prefix from admission server rbac +- [1666bc34](https://github.com/appscode/stash-enterprise/commit/1666bc34) Fix webhook command description (#314) +- [b44f26b2](https://github.com/appscode/stash-enterprise/commit/b44f26b2) Use rbac/v1beta1 api. (#313) +- [c77b2ccd](https://github.com/appscode/stash-enterprise/commit/c77b2ccd) Reduce log level for admission webhook +- [147c0788](https://github.com/appscode/stash-enterprise/commit/147c0788) Support Create & Update operations in admission webhook (#312) +- [45ee2879](https://github.com/appscode/stash-enterprise/commit/45ee2879) Merge webhook plugins into one. (#311) +- [4403d50c](https://github.com/appscode/stash-enterprise/commit/4403d50c) Fix installer script +- [2c9166fc](https://github.com/appscode/stash-enterprise/commit/2c9166fc) Support private docker registry in installer (#310) +- [cfe79458](https://github.com/appscode/stash-enterprise/commit/cfe79458) Add ValidatingAdmissionWebhook for Stash CRDs (#299) +- [5a93ff74](https://github.com/appscode/stash-enterprise/commit/5a93ff74) Compress go binaries (#309) +- [24307b0f](https://github.com/appscode/stash-enterprise/commit/24307b0f) Merge commit 'dd01a18d6821b218669437b491e71eff9cf82c89' +- [75be0ffe](https://github.com/appscode/stash-enterprise/commit/75be0ffe) Merge commit '6cd6efaa2491aea24a0f7f588c86b0ff5ff03283' +- [6dc58fe7](https://github.com/appscode/stash-enterprise/commit/6dc58fe7) Rename --initializer flag to --enable-initializer (#308) +- [976e674a](https://github.com/appscode/stash-enterprise/commit/976e674a) Remove STASH_ROLE_TYPE from installer scripts (#307) +- [310f7395](https://github.com/appscode/stash-enterprise/commit/310f7395) Use rbac/v1 api (#306) +- [d6be7daf](https://github.com/appscode/stash-enterprise/commit/d6be7daf) Use kubectl auth reconcile (#305) +- [8a420951](https://github.com/appscode/stash-enterprise/commit/8a420951) Fixed backup count (#295) +- [38282b43](https://github.com/appscode/stash-enterprise/commit/38282b43) Write restic stderror in error events (#296) +- [c71ac206](https://github.com/appscode/stash-enterprise/commit/c71ac206) Added support for private docker registry (#300) +- [1a190437](https://github.com/appscode/stash-enterprise/commit/1a190437) Add --initializer flag to installer (#304) +- [da0ad798](https://github.com/appscode/stash-enterprise/commit/da0ad798) Prepare docs for 0.7.0-alpha.0 (#302) +- [3faece70](https://github.com/appscode/stash-enterprise/commit/3faece70) Change installer script (#301) +- [654bc988](https://github.com/appscode/stash-enterprise/commit/654bc988) Merge commit '5e307d69dbf7e02331cc5bc60154e79a52285060' +- [0e9ebfc6](https://github.com/appscode/stash-enterprise/commit/0e9ebfc6) Remove TPR to CRD migrator (#298) +- [b6086636](https://github.com/appscode/stash-enterprise/commit/b6086636) Update dependencies to Kubernetes 1.9 (#297) +- [4b00589b](https://github.com/appscode/stash-enterprise/commit/4b00589b) Cleanup headless service (#292) +- [58da0f35](https://github.com/appscode/stash-enterprise/commit/58da0f35) Prepare docs for 0.6.3 +- [fb1629fb](https://github.com/appscode/stash-enterprise/commit/fb1629fb) Fixed parsing argument error (#291) +- [edd09058](https://github.com/appscode/stash-enterprise/commit/edd09058) Update reference docs +- [27948f53](https://github.com/appscode/stash-enterprise/commit/27948f53) Update appscode/go log wrapper (#287) +- [b9526600](https://github.com/appscode/stash-enterprise/commit/b9526600) Fix inline volumeSource marshalling for LocalSpec (#289) +- [1fe92cef](https://github.com/appscode/stash-enterprise/commit/1fe92cef) Fix roadmap link +- [f8c6641e](https://github.com/appscode/stash-enterprise/commit/f8c6641e) Added Grafana Stash overview dashboard (#286) +- [12916afc](https://github.com/appscode/stash-enterprise/commit/12916afc) Pass --pushgateway-url for injected containers. (#284) +- [321d7414](https://github.com/appscode/stash-enterprise/commit/321d7414) Prepare docs for 0.6.2 release (#278) +- [001d1592](https://github.com/appscode/stash-enterprise/commit/001d1592) Merge pull request #277 from whereisaaron/master +- [ae8e801a](https://github.com/appscode/stash-enterprise/commit/ae8e801a) Update Helm chart to use newer 'fullname' template that avoid duplicate (e.g. 'stash-stash-...') resource names +- [fac516a2](https://github.com/appscode/stash-enterprise/commit/fac516a2) Fix RBAC roles in chart (#276) +- [6f10418a](https://github.com/appscode/stash-enterprise/commit/6f10418a) Garbage collect service-accounts and role-bindings for jobs (#275) +- [a021b63f](https://github.com/appscode/stash-enterprise/commit/a021b63f) Update initializer.md +- [bc24ae45](https://github.com/appscode/stash-enterprise/commit/bc24ae45) Update initializer.md +- [b1573eba](https://github.com/appscode/stash-enterprise/commit/b1573eba) Fix new restic format in upgrade docs (#274) +- [c1f54279](https://github.com/appscode/stash-enterprise/commit/c1f54279) Add statefulsets to stash-sidecar ClusterRole creation (#273) +- [1bc0a02a](https://github.com/appscode/stash-enterprise/commit/1bc0a02a) Reduce operator permissions for service accounts (#270) +- [d2502bbe](https://github.com/appscode/stash-enterprise/commit/d2502bbe) Fix formatting of uninstall.md (#269) +- [1341a5fd](https://github.com/appscode/stash-enterprise/commit/1341a5fd) Prepare docs for 0.6.1 (#268) +- [ac4e8c93](https://github.com/appscode/stash-enterprise/commit/ac4e8c93) Fix kubectl version parsing generation in GKE (#267) +- [588a2947](https://github.com/appscode/stash-enterprise/commit/588a2947) Fix upgrade instructions. +- [ea46d9a9](https://github.com/appscode/stash-enterprise/commit/ea46d9a9) Detect analytics client id using env vars (#265) +- [078f5cfb](https://github.com/appscode/stash-enterprise/commit/078f5cfb) Cleanup release script +- [937b682c](https://github.com/appscode/stash-enterprise/commit/937b682c) Prepare docs for 0.6.0 release (#264) +- [ee6e1068](https://github.com/appscode/stash-enterprise/commit/ee6e1068) Reorganize docs (#263) +- [721dace8](https://github.com/appscode/stash-enterprise/commit/721dace8) Add support for B2 (#262) +- [39405c0c](https://github.com/appscode/stash-enterprise/commit/39405c0c) Update restic website link (#261) +- [9058a9bc](https://github.com/appscode/stash-enterprise/commit/9058a9bc) Revendor kutil +- [f472517e](https://github.com/appscode/stash-enterprise/commit/f472517e) Fix doc +- [915c53ff](https://github.com/appscode/stash-enterprise/commit/915c53ff) Update docs for unified LocalSpec (#260) +- [e2bd7c1b](https://github.com/appscode/stash-enterprise/commit/e2bd7c1b) Unify LocalSpec and RecoveredVolume (#259) +- [cde4f137](https://github.com/appscode/stash-enterprise/commit/cde4f137) Remove restic-dependency from recovery (#258) +- [6e599853](https://github.com/appscode/stash-enterprise/commit/6e599853) Update restic version to 0.8.1 (#257) +- [d66a53df](https://github.com/appscode/stash-enterprise/commit/d66a53df) Use cmp methods from kutil (#255) +- [da8f2331](https://github.com/appscode/stash-enterprise/commit/da8f2331) Remove TryPatch methods (#254) +- [41e1ff43](https://github.com/appscode/stash-enterprise/commit/41e1ff43) Use log.LEVEL() instead of fmt.Printf() (#252) +- [aa91dadd](https://github.com/appscode/stash-enterprise/commit/aa91dadd) Log operator version on start (#253) +- [8b36f5d1](https://github.com/appscode/stash-enterprise/commit/8b36f5d1) Use verb type for mutation (#251) +- [4a3afb07](https://github.com/appscode/stash-enterprise/commit/4a3afb07) Use CreateOrPatchCronJob from kutil (#250) +- [fad6e8bb](https://github.com/appscode/stash-enterprise/commit/fad6e8bb) Indicate mutation in PATCH helper method return (#249) +- [7bd56db6](https://github.com/appscode/stash-enterprise/commit/7bd56db6) Update RBAC for analytics +- [afa4f8fa](https://github.com/appscode/stash-enterprise/commit/afa4f8fa) Simplify clientID generation for analytics (#247) +- [fb31ed72](https://github.com/appscode/stash-enterprise/commit/fb31ed72) Set analytics clientID (#246) +- [29812d44](https://github.com/appscode/stash-enterprise/commit/29812d44) Update README.md +- [8dd9bb20](https://github.com/appscode/stash-enterprise/commit/8dd9bb20) Cleanup docs +- [cebe13bf](https://github.com/appscode/stash-enterprise/commit/cebe13bf) Reorganize docs (#245) +- [4987b08a](https://github.com/appscode/stash-enterprise/commit/4987b08a) Upgrade procedure for 0.5.1 to 0.6.0 (#243) +- [7997564b](https://github.com/appscode/stash-enterprise/commit/7997564b) Update docs (#236) +- [8d614880](https://github.com/appscode/stash-enterprise/commit/8d614880) Enable Restic cahce-dir flag (#241) +- [780754d9](https://github.com/appscode/stash-enterprise/commit/780754d9) Fix retentionPolicyName not found error (#242) +- [4d291178](https://github.com/appscode/stash-enterprise/commit/4d291178) Lower case workload.kind in prefix (#240) +- [eaaae57f](https://github.com/appscode/stash-enterprise/commit/eaaae57f) Use RegisterCRDs helper (#239) +- [2becb354](https://github.com/appscode/stash-enterprise/commit/2becb354) Change left_menu -> menu_name (#235) +- [a1e2f14d](https://github.com/appscode/stash-enterprise/commit/a1e2f14d) Revendor dependencies (#234) +- [7241c6dd](https://github.com/appscode/stash-enterprise/commit/7241c6dd) Implement offline backup (#229) +- [03318f1a](https://github.com/appscode/stash-enterprise/commit/03318f1a) Add aliases for README file (#233) +- [a560bcb0](https://github.com/appscode/stash-enterprise/commit/a560bcb0) Add Docs Front Matter for 0.5.1 (#231) +- [a8ff09c0](https://github.com/appscode/stash-enterprise/commit/a8ff09c0) Update bundles restic to 0.8.0 (#232) +- [84238d2c](https://github.com/appscode/stash-enterprise/commit/84238d2c) Revendor kutil (#230) +- [0cfe9187](https://github.com/appscode/stash-enterprise/commit/0cfe9187) Fix configmap-lock-name (#228) +- [cd3c9e36](https://github.com/appscode/stash-enterprise/commit/cd3c9e36) Minor fixes +- [86157814](https://github.com/appscode/stash-enterprise/commit/86157814) Run `restic check` once every 3 days (#223) +- [1161ff0b](https://github.com/appscode/stash-enterprise/commit/1161ff0b) Record recovery status for individual FileGroup (#222) +- [9aeba2e6](https://github.com/appscode/stash-enterprise/commit/9aeba2e6) PollInfinitely for recovery job to succeed +- [aa3459e6](https://github.com/appscode/stash-enterprise/commit/aa3459e6) Dynamically create stash-sidecar ClusterRole in operator (#221) +- [6ae7222c](https://github.com/appscode/stash-enterprise/commit/6ae7222c) Implement workload initializer in stash operator (#207) +- [ef10c66e](https://github.com/appscode/stash-enterprise/commit/ef10c66e) Leader election for deployment, replica set and rc (#206) +- [106d049d](https://github.com/appscode/stash-enterprise/commit/106d049d) Generate docs +- [f476f444](https://github.com/appscode/stash-enterprise/commit/f476f444) Implement Recovery for Restic Backup (#202) +- [d56e913c](https://github.com/appscode/stash-enterprise/commit/d56e913c) Update install.md +- [7bbe582d](https://github.com/appscode/stash-enterprise/commit/7bbe582d) Update install.md +- [aa8aaa48](https://github.com/appscode/stash-enterprise/commit/aa8aaa48) Update install.md +- [b97ebbaf](https://github.com/appscode/stash-enterprise/commit/b97ebbaf) Update chart +- [0751780f](https://github.com/appscode/stash-enterprise/commit/0751780f) Update install.md +- [edcab803](https://github.com/appscode/stash-enterprise/commit/edcab803) Update _helpers.tpl +- [565ae057](https://github.com/appscode/stash-enterprise/commit/565ae057) Support imagePullSecrets in chart +- [8ae6dc7e](https://github.com/appscode/stash-enterprise/commit/8ae6dc7e) Update _helpers.tpl +- [2085d5b5](https://github.com/appscode/stash-enterprise/commit/2085d5b5) Make stash chart namespaced (#210) +- [88e512f5](https://github.com/appscode/stash-enterprise/commit/88e512f5) Update docs to point to 0.4.2 release +- [88885373](https://github.com/appscode/stash-enterprise/commit/88885373) Update codegen.sh +- [39108498](https://github.com/appscode/stash-enterprise/commit/39108498) Use typed versioned client for CRD +- [484df692](https://github.com/appscode/stash-enterprise/commit/484df692) Change `k8s.io/api/core/v1` pkg alias to core (#204) +- [b854e1cb](https://github.com/appscode/stash-enterprise/commit/b854e1cb) Use client-go 5.x +- [e2488aa5](https://github.com/appscode/stash-enterprise/commit/e2488aa5) Update rbac.md +- [8b51195d](https://github.com/appscode/stash-enterprise/commit/8b51195d) Add recovery CRD (#201) +- [779c373f](https://github.com/appscode/stash-enterprise/commit/779c373f) Merge commit 'bf3f3307acbd69e5147db8abdb75b1529147f0c5' +- [ad5d6c98](https://github.com/appscode/stash-enterprise/commit/ad5d6c98) Clarify support for DO +- [f87995af](https://github.com/appscode/stash-enterprise/commit/f87995af) Prepare docs for 0.5.1 +- [cb99e324](https://github.com/appscode/stash-enterprise/commit/cb99e324) Update RBAC permissions +- [4656ba57](https://github.com/appscode/stash-enterprise/commit/4656ba57) Correctly detect "default" service account (#200) +- [3e4af9b2](https://github.com/appscode/stash-enterprise/commit/3e4af9b2) Add label to installer objects in rbac mode +- [1057d95e](https://github.com/appscode/stash-enterprise/commit/1057d95e) Clarify that --tag foo,tag bar style tags are not supported. (#199) +- [9b6bb88e](https://github.com/appscode/stash-enterprise/commit/9b6bb88e) Set hostname based on resource type (#198) +- [d2cd1c2d](https://github.com/appscode/stash-enterprise/commit/d2cd1c2d) Manage RoleBinding for rbac enabled cluster (#197) +- [3b2a281d](https://github.com/appscode/stash-enterprise/commit/3b2a281d) Update install.md +- [2a550c40](https://github.com/appscode/stash-enterprise/commit/2a550c40) Update install.md +- [c3ca4669](https://github.com/appscode/stash-enterprise/commit/c3ca4669) Document how to detect operator version (#196) +- [85b0f16a](https://github.com/appscode/stash-enterprise/commit/85b0f16a) Prepare docs for 0.5.0 release +- [3003c01a](https://github.com/appscode/stash-enterprise/commit/3003c01a) Rename Scheduler to Controller +- [e69ec81d](https://github.com/appscode/stash-enterprise/commit/e69ec81d) Stop dumping env vars +- [657fa06a](https://github.com/appscode/stash-enterprise/commit/657fa06a) Prepare docs for 0.5.0-beta.3 release +- [a6a98e51](https://github.com/appscode/stash-enterprise/commit/a6a98e51) Use workqueue for scheduler (#194) +- [cccc23cf](https://github.com/appscode/stash-enterprise/commit/cccc23cf) Register events api group +- [fadd0ab8](https://github.com/appscode/stash-enterprise/commit/fadd0ab8) Revise RBAC permissions +- [d3dc55f7](https://github.com/appscode/stash-enterprise/commit/d3dc55f7) Prepare docs for 0.5.0-beta.2 +- [770ff1cd](https://github.com/appscode/stash-enterprise/commit/770ff1cd) Update tutorial.md (#186) +- [2c0b4836](https://github.com/appscode/stash-enterprise/commit/2c0b4836) Add tests for DO (#193) +- [2aeef6da](https://github.com/appscode/stash-enterprise/commit/2aeef6da) Use object reference to write events +- [0ccaa324](https://github.com/appscode/stash-enterprise/commit/0ccaa324) Disable StatefulSet support +- [0a55c0b8](https://github.com/appscode/stash-enterprise/commit/0a55c0b8) Prepare docs for 0.5.0-beta.1 +- [c268e249](https://github.com/appscode/stash-enterprise/commit/c268e249) Fix prometheus metrics collection (#192) +- [17da332e](https://github.com/appscode/stash-enterprise/commit/17da332e) Disable StatefulSet controller. +- [7191de11](https://github.com/appscode/stash-enterprise/commit/7191de11) Fix StatefulSet tests (#190) +- [c91b9292](https://github.com/appscode/stash-enterprise/commit/c91b9292) Replace reflect.Equal with github.com/google/go-cmp (#188) +- [027c6d98](https://github.com/appscode/stash-enterprise/commit/027c6d98) Only handle Restic when spec changes. +- [c80f1a9f](https://github.com/appscode/stash-enterprise/commit/c80f1a9f) Reorder cache controller +- [9dd89304](https://github.com/appscode/stash-enterprise/commit/9dd89304) Skip ReplicaSet owned by Deployments (#187) +- [06df8f94](https://github.com/appscode/stash-enterprise/commit/06df8f94) Merge commit '32217c844015816b86c46a8d74a175c42f0e307a' +- [6ad7ada4](https://github.com/appscode/stash-enterprise/commit/6ad7ada4) Prepare docs for 5.0.0-beta.0 (#185) +- [f7939ceb](https://github.com/appscode/stash-enterprise/commit/f7939ceb) Don't store status in annotations +- [94419091](https://github.com/appscode/stash-enterprise/commit/94419091) Rename LastAppliedConfiguration +- [2237978f](https://github.com/appscode/stash-enterprise/commit/2237978f) Fix patching +- [ec02f851](https://github.com/appscode/stash-enterprise/commit/ec02f851) Set namespaceIndex as indexer (#184) +- [3868041c](https://github.com/appscode/stash-enterprise/commit/3868041c) Fix e2e tests (#183) +- [94c7d2d4](https://github.com/appscode/stash-enterprise/commit/94c7d2d4) Rename injector methods +- [755e28bc](https://github.com/appscode/stash-enterprise/commit/755e28bc) Use workqueue (#182) +- [2d41478f](https://github.com/appscode/stash-enterprise/commit/2d41478f) Use Deployment from apps/v1beta1 (#181) +- [a5229147](https://github.com/appscode/stash-enterprise/commit/a5229147) Delete *.generated.go files for ugorji (#180) +- [05abff50](https://github.com/appscode/stash-enterprise/commit/05abff50) Use WaitForCRDReady from kutil (#179) +- [096e1410](https://github.com/appscode/stash-enterprise/commit/096e1410) Only watch apps/v1beta1 Deployment (#178) +- [ade40c61](https://github.com/appscode/stash-enterprise/commit/ade40c61) Move kutil to client package (#177) +- [226ffe83](https://github.com/appscode/stash-enterprise/commit/226ffe83) Generate ugorji stuff (#176) +- [030e7b32](https://github.com/appscode/stash-enterprise/commit/030e7b32) Remove kubernetes/code-generator from builddeps +- [5c2773d1](https://github.com/appscode/stash-enterprise/commit/5c2773d1) Prepare docs for 0.5.0 (#174) +- [04afd1cf](https://github.com/appscode/stash-enterprise/commit/04afd1cf) Install stash as a critical addon (#173) +- [d59093d1](https://github.com/appscode/stash-enterprise/commit/d59093d1) Update chart to add roles for CRD +- [7ec22dfc](https://github.com/appscode/stash-enterprise/commit/7ec22dfc) Use Namespace() method from kutil. +- [f4850c29](https://github.com/appscode/stash-enterprise/commit/f4850c29) Add release script. +- [9a91e124](https://github.com/appscode/stash-enterprise/commit/9a91e124) Prepare docs for 0.5.0-rc.0 +- [324a62fb](https://github.com/appscode/stash-enterprise/commit/324a62fb) Revendor kutil. +- [2c8add5f](https://github.com/appscode/stash-enterprise/commit/2c8add5f) Set RESTIC_VER to 0.7.3 (#172) +- [a04187d5](https://github.com/appscode/stash-enterprise/commit/a04187d5) Refresh charts to match recent convention (#171) +- [c9b5662a](https://github.com/appscode/stash-enterprise/commit/c9b5662a) Fix deployment name in tutorial (#169) +- [1356b31b](https://github.com/appscode/stash-enterprise/commit/1356b31b) Update kutil (#170) +- [4ea31986](https://github.com/appscode/stash-enterprise/commit/4ea31986) Set RESTIC_VER to 0.7.2 +- [f7d9c903](https://github.com/appscode/stash-enterprise/commit/f7d9c903) Use object ref for Restic +- [49e5a33b](https://github.com/appscode/stash-enterprise/commit/49e5a33b) Fix command in Developer-guide (#168) +- [9bacd5bb](https://github.com/appscode/stash-enterprise/commit/9bacd5bb) Set root scope kinds +- [6bb6c582](https://github.com/appscode/stash-enterprise/commit/6bb6c582) Use apis/v1alpha1 instead of internal version (#167) +- [1206be03](https://github.com/appscode/stash-enterprise/commit/1206be03) Remove resource:path (#166) +- [d1b790de](https://github.com/appscode/stash-enterprise/commit/d1b790de) Use kubernetes/code-generator (#163) +- [9cfb37cf](https://github.com/appscode/stash-enterprise/commit/9cfb37cf) Update kutil +- [cac94ede](https://github.com/appscode/stash-enterprise/commit/cac94ede) Expose resync-period as flag +- [e31dd8f7](https://github.com/appscode/stash-enterprise/commit/e31dd8f7) Remove pkg/analytics +- [5f79c4da](https://github.com/appscode/stash-enterprise/commit/5f79c4da) Move analytics collector to root command (#164) +- [e4a88e55](https://github.com/appscode/stash-enterprise/commit/e4a88e55) Revendor k8s.io/apiextensions-apiserver (#162) +- [2fe16a61](https://github.com/appscode/stash-enterprise/commit/2fe16a61) Migrate TPR to CRD (#160) +- [cc22b572](https://github.com/appscode/stash-enterprise/commit/cc22b572) Fix Restic (#159) +- [ae0d9406](https://github.com/appscode/stash-enterprise/commit/ae0d9406) Update kutil dependency (#158) +- [cc9ee0e5](https://github.com/appscode/stash-enterprise/commit/cc9ee0e5) Use CheckAPIVersion() (#157) +- [b7e97424](https://github.com/appscode/stash-enterprise/commit/b7e97424) Use PATCH api instead of UPDATE (#156) +- [5a50804a](https://github.com/appscode/stash-enterprise/commit/5a50804a) Check version using semver library (#152) +- [8364234d](https://github.com/appscode/stash-enterprise/commit/8364234d) Support adding Sidecar containers for StatefulSet. (#151) +- [d20e52ed](https://github.com/appscode/stash-enterprise/commit/d20e52ed) Update client-go to 4.0.0 (#150) +- [24c79bf5](https://github.com/appscode/stash-enterprise/commit/24c79bf5) Update build commands for restic. (#149) +- [f276cd38](https://github.com/appscode/stash-enterprise/commit/f276cd38) Update client-go to 3.0.0 from 3.0.0-beta (#148) +- [c4a3bfe3](https://github.com/appscode/stash-enterprise/commit/c4a3bfe3) Add DCO +- [f98d1877](https://github.com/appscode/stash-enterprise/commit/f98d1877) Fix typos of tutorial.md file (#138) +- [e7c5154b](https://github.com/appscode/stash-enterprise/commit/e7c5154b) Add uninstall.sh script (#144) +- [15deeba0](https://github.com/appscode/stash-enterprise/commit/15deeba0) Change receiver for Invocation to fi +- [7b8829fc](https://github.com/appscode/stash-enterprise/commit/7b8829fc) Use console type instead of sh +- [e6065cb2](https://github.com/appscode/stash-enterprise/commit/e6065cb2) Prepare docs for 0.4.1 release +- [1d1dbbfb](https://github.com/appscode/stash-enterprise/commit/1d1dbbfb) Build binary inside Docker image +- [ceafa959](https://github.com/appscode/stash-enterprise/commit/ceafa959) Merge commit 'b8c45d0d4379587a31302b834334047cc77e59db' +- [b629d0cd](https://github.com/appscode/stash-enterprise/commit/b629d0cd) Revendor forked robfig/cron (#139) +- [5e34ea69](https://github.com/appscode/stash-enterprise/commit/5e34ea69) Update stash-without-rbac.yaml +- [9ae078bb](https://github.com/appscode/stash-enterprise/commit/9ae078bb) Add omitempty for Local storage +- [7ac0a7a2](https://github.com/appscode/stash-enterprise/commit/7ac0a7a2) Move resource consts to api pkg +- [42ccbccd](https://github.com/appscode/stash-enterprise/commit/42ccbccd) Fix Fake restic resource Url (#137) +- [c25545b6](https://github.com/appscode/stash-enterprise/commit/c25545b6) Clarify bucket location +- [cec2d878](https://github.com/appscode/stash-enterprise/commit/cec2d878) Update gcs-restic.yaml +- [8bf7efc1](https://github.com/appscode/stash-enterprise/commit/8bf7efc1) Update backends.md +- [cc75a55a](https://github.com/appscode/stash-enterprise/commit/cc75a55a) Update tutorial.md +- [f05372b9](https://github.com/appscode/stash-enterprise/commit/f05372b9) Update backends.md +- [f657a4cf](https://github.com/appscode/stash-enterprise/commit/f657a4cf) Add example e2e env file for OpenStack swift. +- [53f97fe3](https://github.com/appscode/stash-enterprise/commit/53f97fe3) Update docs to 0.4.0 release. +- [e2bf7234](https://github.com/appscode/stash-enterprise/commit/e2bf7234) Update docs to remove setting name for local.VolumeSource +- [50aff91d](https://github.com/appscode/stash-enterprise/commit/50aff91d) Support selecting restic branch +- [a7f0a995](https://github.com/appscode/stash-enterprise/commit/a7f0a995) Prepare docs for 0.4.0 release. +- [df7bd521](https://github.com/appscode/stash-enterprise/commit/df7bd521) Update concept.md +- [bc4f6f13](https://github.com/appscode/stash-enterprise/commit/bc4f6f13) Rename RepositorySecretName to StorageSecretName (#135) +- [8ff66993](https://github.com/appscode/stash-enterprise/commit/8ff66993) Rename Volume to VolumeSource (#134) +- [39a390f9](https://github.com/appscode/stash-enterprise/commit/39a390f9) Use updated URL format (: after container) +- [993faac2](https://github.com/appscode/stash-enterprise/commit/993faac2) Update charts +- [3f68045b](https://github.com/appscode/stash-enterprise/commit/3f68045b) Use VolumeSource instead of Volume for Local backend. (#132) +- [883cebd4](https://github.com/appscode/stash-enterprise/commit/883cebd4) Update concept.md +- [387ac071](https://github.com/appscode/stash-enterprise/commit/387ac071) Fix linting issues in chart +- [dc19110f](https://github.com/appscode/stash-enterprise/commit/dc19110f) Add String() method to PrefixType. +- [f4cf5e67](https://github.com/appscode/stash-enterprise/commit/f4cf5e67) Remove unused type Source +- [f1a21897](https://github.com/appscode/stash-enterprise/commit/f1a21897) Update readme +- [a3827bf5](https://github.com/appscode/stash-enterprise/commit/a3827bf5) Various corrections to chart based on code review. +- [c12c3fab](https://github.com/appscode/stash-enterprise/commit/c12c3fab) Prepare docs for 0.3.1 release. +- [def4f783](https://github.com/appscode/stash-enterprise/commit/def4f783) Add tests for swift (#130) +- [12ee8e9e](https://github.com/appscode/stash-enterprise/commit/12ee8e9e) Support setting compute resources for sidecar (#129) +- [6eb6ba6e](https://github.com/appscode/stash-enterprise/commit/6eb6ba6e) Update chart with rbac +- [0ba63fb7](https://github.com/appscode/stash-enterprise/commit/0ba63fb7) Update rbac.md +- [fdbd84a2](https://github.com/appscode/stash-enterprise/commit/fdbd84a2) Fix RBAC docs (#127) +- [68b6b0c5](https://github.com/appscode/stash-enterprise/commit/68b6b0c5) Update release.md +- [33a59ad8](https://github.com/appscode/stash-enterprise/commit/33a59ad8) Merge commit 'fba07b3994b0e1fd3a95c91d890353aa23a0f3c1' +- [c0ed3b61](https://github.com/appscode/stash-enterprise/commit/c0ed3b61) Print commit timestamp with version command +- [5c6f2d27](https://github.com/appscode/stash-enterprise/commit/5c6f2d27) Prepare docs for 0.3.0 release +- [97630f69](https://github.com/appscode/stash-enterprise/commit/97630f69) Document RBAC +- [59e09023](https://github.com/appscode/stash-enterprise/commit/59e09023) Document behavior in case of multiple Restic +- [9ae9107d](https://github.com/appscode/stash-enterprise/commit/9ae9107d) Document e2e test setup +- [a6ba0787](https://github.com/appscode/stash-enterprise/commit/a6ba0787) Document swift (#124) +- [2a38a883](https://github.com/appscode/stash-enterprise/commit/2a38a883) Remove support for B2 & Rest server for now. +- [8a4ca945](https://github.com/appscode/stash-enterprise/commit/8a4ca945) Remove Location choice for GCS +- [c89b9109](https://github.com/appscode/stash-enterprise/commit/c89b9109) Fix spelling +- [7ecffb1f](https://github.com/appscode/stash-enterprise/commit/7ecffb1f) Update backends.md +- [61385e73](https://github.com/appscode/stash-enterprise/commit/61385e73) Update uninstall.md +- [50e98026](https://github.com/appscode/stash-enterprise/commit/50e98026) Update uninstall.md +- [c1fd8915](https://github.com/appscode/stash-enterprise/commit/c1fd8915) Use TPR labels to verify installation +- [d896d763](https://github.com/appscode/stash-enterprise/commit/d896d763) Add labels to TPR registration +- [0644dc8a](https://github.com/appscode/stash-enterprise/commit/0644dc8a) Remove pod template name +- [011bba8e](https://github.com/appscode/stash-enterprise/commit/011bba8e) Don't fail scheduler if bad credetials are given +- [50d5b35d](https://github.com/appscode/stash-enterprise/commit/50d5b35d) Fix google sa file permission +- [569b1289](https://github.com/appscode/stash-enterprise/commit/569b1289) Change mount path for labels to /etc/stash +- [7483b929](https://github.com/appscode/stash-enterprise/commit/7483b929) Fix remote backend repository format +- [d6ba05c6](https://github.com/appscode/stash-enterprise/commit/d6ba05c6) Part 6 - Update docs (#121) +- [6c95f2d6](https://github.com/appscode/stash-enterprise/commit/6c95f2d6) Update docs (#120) +- [a979c4bc](https://github.com/appscode/stash-enterprise/commit/a979c4bc) Update docs for 0.2.0 release +- [ba6bf1bb](https://github.com/appscode/stash-enterprise/commit/ba6bf1bb) Fix build. +- [e27cf027](https://github.com/appscode/stash-enterprise/commit/e27cf027) Various bug fixes (#118) +- [33fe5ebe](https://github.com/appscode/stash-enterprise/commit/33fe5ebe) Mention swift in readme +- [4df56363](https://github.com/appscode/stash-enterprise/commit/4df56363) Update pitch (#117) +- [e92e6f93](https://github.com/appscode/stash-enterprise/commit/e92e6f93) Various changes to RetentionPolicy (#116) +- [bbf726ee](https://github.com/appscode/stash-enterprise/commit/bbf726ee) Set TMPDIR env var for restic (#115) +- [7e2944aa](https://github.com/appscode/stash-enterprise/commit/7e2944aa) Update ROADMAP.md +- [ac262649](https://github.com/appscode/stash-enterprise/commit/ac262649) Update tutorial.md +- [1405e499](https://github.com/appscode/stash-enterprise/commit/1405e499) Update ROADMAP.md +- [9ba3bf8a](https://github.com/appscode/stash-enterprise/commit/9ba3bf8a) Update workloads.md +- [a3e41c8e](https://github.com/appscode/stash-enterprise/commit/a3e41c8e) Part 5 - User Guide (#114) +- [3484d8fc](https://github.com/appscode/stash-enterprise/commit/3484d8fc) Update ROADMAP.md +- [d3369091](https://github.com/appscode/stash-enterprise/commit/d3369091) Part 4- User Guide (#113) +- [6ada7f4b](https://github.com/appscode/stash-enterprise/commit/6ada7f4b) Part 3 - User Guide (#110) +- [565e2a34](https://github.com/appscode/stash-enterprise/commit/565e2a34) Part - 2 of User guide (#99) +- [e32edec6](https://github.com/appscode/stash-enterprise/commit/e32edec6) Update user guide (#94) +- [ba7ef578](https://github.com/appscode/stash-enterprise/commit/ba7ef578) Update release.md +- [40a12019](https://github.com/appscode/stash-enterprise/commit/40a12019) Update Prometheus job name to use restic ns & name (#93) +- [46da38ea](https://github.com/appscode/stash-enterprise/commit/46da38ea) Create separate restic for each type of backend. (#92) +- [b5a8abea](https://github.com/appscode/stash-enterprise/commit/b5a8abea) Update README.md +- [f42511ea](https://github.com/appscode/stash-enterprise/commit/f42511ea) Use app & release name labels together in chart +- [cdeb926d](https://github.com/appscode/stash-enterprise/commit/cdeb926d) Update chart readme +- [56fa7765](https://github.com/appscode/stash-enterprise/commit/56fa7765) Update Stash chart (#89) +- [1ed35f09](https://github.com/appscode/stash-enterprise/commit/1ed35f09) Remove selectors so that `template.metadata.labels` are used (#91) +- [8d9065de](https://github.com/appscode/stash-enterprise/commit/8d9065de) Update CONTRIBUTING.md +- [550eb7e4](https://github.com/appscode/stash-enterprise/commit/550eb7e4) Update contribution guide +- [8f0e31e6](https://github.com/appscode/stash-enterprise/commit/8f0e31e6) Fix dev guide (#88) +- [6b61ee27](https://github.com/appscode/stash-enterprise/commit/6b61ee27) Add docs for commands (#90) +- [d85cd5f9](https://github.com/appscode/stash-enterprise/commit/d85cd5f9) Update stash.yaml +- [8577bee3](https://github.com/appscode/stash-enterprise/commit/8577bee3) Update stash.yaml +- [a948319b](https://github.com/appscode/stash-enterprise/commit/a948319b) Change stash version to 0.1.0 +- [db3d1813](https://github.com/appscode/stash-enterprise/commit/db3d1813) Cleanup test commands +- [a6144456](https://github.com/appscode/stash-enterprise/commit/a6144456) Add e2e tests for major cloud providers (#84) +- [4d219217](https://github.com/appscode/stash-enterprise/commit/4d219217) Fix headless service for statefulset e2e test +- [7fbc6cd6](https://github.com/appscode/stash-enterprise/commit/7fbc6cd6) Create separate selectors for each invocation of framework +- [7e949c96](https://github.com/appscode/stash-enterprise/commit/7e949c96) Move check for sidecars inside retry loop +- [60e0cec4](https://github.com/appscode/stash-enterprise/commit/60e0cec4) Don't update resource from update calls. +- [5c75cb0d](https://github.com/appscode/stash-enterprise/commit/5c75cb0d) Fix selectors for Deployment e2e tests +- [87ae2427](https://github.com/appscode/stash-enterprise/commit/87ae2427) Add node selector for DaemonSet e2e test +- [9b946345](https://github.com/appscode/stash-enterprise/commit/9b946345) Check for successful backup events +- [30bd7d6b](https://github.com/appscode/stash-enterprise/commit/30bd7d6b) Fix e2e tests (#83) +- [a220d50a](https://github.com/appscode/stash-enterprise/commit/a220d50a) Add /snapshots endpoint in operator (#82) +- [35428b88](https://github.com/appscode/stash-enterprise/commit/35428b88) Mount scratchDir with operator (#80) +- [887c432b](https://github.com/appscode/stash-enterprise/commit/887c432b) Fix scheduler (#79) +- [f120695e](https://github.com/appscode/stash-enterprise/commit/f120695e) Handle update conflicts (#78) +- [36245014](https://github.com/appscode/stash-enterprise/commit/36245014) Test e2e tests (#76) +- [7410da10](https://github.com/appscode/stash-enterprise/commit/7410da10) Remove restic source downloaded for building binary +- [01b72b61](https://github.com/appscode/stash-enterprise/commit/01b72b61) . import custom matchers +- [44416b81](https://github.com/appscode/stash-enterprise/commit/44416b81) Review analytics events. +- [5d6169e3](https://github.com/appscode/stash-enterprise/commit/5d6169e3) Remove unused and/or duplicate constants +- [d425d674](https://github.com/appscode/stash-enterprise/commit/d425d674) Delete old testify tests (#75) +- [80a96849](https://github.com/appscode/stash-enterprise/commit/80a96849) Add ginkgo based e2e tests (#70) +- [8de3189a](https://github.com/appscode/stash-enterprise/commit/8de3189a) Create a cli wrapper for restic (#74) +- [da41f6ed](https://github.com/appscode/stash-enterprise/commit/da41f6ed) Revise EnsureXXXSidecar methods (#73) +- [75aa7458](https://github.com/appscode/stash-enterprise/commit/75aa7458) Avoid pushing metrics if missing gateway URL +- [c42c6cae](https://github.com/appscode/stash-enterprise/commit/c42c6cae) Fix pushgateway --web.listen-address flag +- [efd42e00](https://github.com/appscode/stash-enterprise/commit/efd42e00) Use service account with operator pods +- [5729f7b0](https://github.com/appscode/stash-enterprise/commit/5729f7b0) Create RBAC objects for operator (#69) +- [3b5b0291](https://github.com/appscode/stash-enterprise/commit/3b5b0291) Push metrics to Prometheus push gateway (#67) +- [6ec35ada](https://github.com/appscode/stash-enterprise/commit/6ec35ada) Mount labels using Downward api (#66) +- [76a9ced7](https://github.com/appscode/stash-enterprise/commit/76a9ced7) Vendor go-sh dependency (#65) +- [d505ad0e](https://github.com/appscode/stash-enterprise/commit/d505ad0e) Use go-sh to execute restic commands (#63) +- [585b33f9](https://github.com/appscode/stash-enterprise/commit/585b33f9) Add scratchPad Dir & prefixHostname flags (#62) +- [e5c9f69b](https://github.com/appscode/stash-enterprise/commit/e5c9f69b) Support remote backends (#58) +- [af2e14a7](https://github.com/appscode/stash-enterprise/commit/af2e14a7) Expose metrics port from Docker +- [87dfdae4](https://github.com/appscode/stash-enterprise/commit/87dfdae4) Rename cron pkg to scheduler. +- [0503fe64](https://github.com/appscode/stash-enterprise/commit/0503fe64) Organize backup code. (#54) +- [12c0921a](https://github.com/appscode/stash-enterprise/commit/12c0921a) Synchronize scheduler reconfiguration (#53) +- [cbebb9de](https://github.com/appscode/stash-enterprise/commit/cbebb9de) Build master branch of restic +- [23e92576](https://github.com/appscode/stash-enterprise/commit/23e92576) Fix tag detection from Version +- [af2f9271](https://github.com/appscode/stash-enterprise/commit/af2f9271) Update e2e tests (#52) +- [e7b85533](https://github.com/appscode/stash-enterprise/commit/e7b85533) Fix NPE +- [8308dd26](https://github.com/appscode/stash-enterprise/commit/8308dd26) Fix unit tests (#51) +- [52b6cfb7](https://github.com/appscode/stash-enterprise/commit/52b6cfb7) Update README.md +- [d41bd0db](https://github.com/appscode/stash-enterprise/commit/d41bd0db) Run watchers for preferred api group version kind (#50) +- [f8878a34](https://github.com/appscode/stash-enterprise/commit/f8878a34) Build restic from source by default (#49) +- [7d240bbf](https://github.com/appscode/stash-enterprise/commit/7d240bbf) Use updated docker build script format +- [f87445d4](https://github.com/appscode/stash-enterprise/commit/f87445d4) Merge commit '6d30c353f174f641159a88f6280f6be163a44cb4' +- [abd7fcca](https://github.com/appscode/stash-enterprise/commit/abd7fcca) Rename variable watcher to ctrl +- [e8cb5c06](https://github.com/appscode/stash-enterprise/commit/e8cb5c06) Watch individual object types. (#48) +- [3bc3fc81](https://github.com/appscode/stash-enterprise/commit/3bc3fc81) Various code cleanup (#47) +- [1ba94a88](https://github.com/appscode/stash-enterprise/commit/1ba94a88) Reorganize cron controller (#46) +- [d9c5ead9](https://github.com/appscode/stash-enterprise/commit/d9c5ead9) Check docker image tag before starting operator (#45) +- [3887dd92](https://github.com/appscode/stash-enterprise/commit/3887dd92) Expose metrics from operator (#44) +- [cadf7c1d](https://github.com/appscode/stash-enterprise/commit/cadf7c1d) Run push gateway as a side-car for restik operator. (#43) +- [966564b0](https://github.com/appscode/stash-enterprise/commit/966564b0) Pre-install ca-certificates. +- [bb5b24b2](https://github.com/appscode/stash-enterprise/commit/bb5b24b2) Send analytics for start & stop events. +- [95e4209a](https://github.com/appscode/stash-enterprise/commit/95e4209a) Move all commands to root folder. +- [f6816d8e](https://github.com/appscode/stash-enterprise/commit/f6816d8e) Remove all reference to k8s.io/kubernetes repo. +- [edb64910](https://github.com/appscode/stash-enterprise/commit/edb64910) Move main.go to root folder. +- [f7bfd1a8](https://github.com/appscode/stash-enterprise/commit/f7bfd1a8) Merge commit 'e6c0614c629d719cc9300e71a668a43f42b37f68' +- [4c1a638b](https://github.com/appscode/stash-enterprise/commit/4c1a638b) Point to client-go in versioning policy. +- [17fbce2b](https://github.com/appscode/stash-enterprise/commit/17fbce2b) Update README.md +- [d57ddc79](https://github.com/appscode/stash-enterprise/commit/d57ddc79) Add analytics (#41) +- [59d38bd5](https://github.com/appscode/stash-enterprise/commit/59d38bd5) Use V1alpha1SchemeGroupVersion for Restik (#40) +- [b258051b](https://github.com/appscode/stash-enterprise/commit/b258051b) Fix registration of wrong group (#39) +- [572eab2b](https://github.com/appscode/stash-enterprise/commit/572eab2b) fix status update (#38) +- [f3b0e990](https://github.com/appscode/stash-enterprise/commit/f3b0e990) Upgrade restic version to 0.6.1 (#37) +- [52f44f88](https://github.com/appscode/stash-enterprise/commit/52f44f88) Use client-go (#36) +- [8f9eaa75](https://github.com/appscode/stash-enterprise/commit/8f9eaa75) Merge commit '4a5c3083fd86cbe409e8a0f8db02ebc92b403cdc' +- [fa30bfde](https://github.com/appscode/stash-enterprise/commit/fa30bfde) Create conversion_v1alpha1.go +- [71dd7331](https://github.com/appscode/stash-enterprise/commit/71dd7331) Create register_v1alpha1.go +- [a4dd5595](https://github.com/appscode/stash-enterprise/commit/a4dd5595) fmt api & client pkg-es +- [34651f88](https://github.com/appscode/stash-enterprise/commit/34651f88) Use same var as receiver +- [028e312f](https://github.com/appscode/stash-enterprise/commit/028e312f) Add version policy & analytics collection to readme +- [7377c5e0](https://github.com/appscode/stash-enterprise/commit/7377c5e0) Change api version to v1alpha1 (#30) +- [f893fd1d](https://github.com/appscode/stash-enterprise/commit/f893fd1d) Merge commit '7ade13456a688a54292abaf589c2e9f1804f7d8b' +- [ce677bb9](https://github.com/appscode/stash-enterprise/commit/ce677bb9) Rename clientset +- [570bea8c](https://github.com/appscode/stash-enterprise/commit/570bea8c) Rename function and structure (#29) +- [db1643f2](https://github.com/appscode/stash-enterprise/commit/db1643f2) Rename Backup into Restik (#28) +- [f5db80b4](https://github.com/appscode/stash-enterprise/commit/f5db80b4) Move api from k8s-addons (#27) +- [94ce3a20](https://github.com/appscode/stash-enterprise/commit/94ce3a20) Add Restik chart (#20) +- [f1955669](https://github.com/appscode/stash-enterprise/commit/f1955669) Bubble up errors to caller (#26) +- [2b6d4735](https://github.com/appscode/stash-enterprise/commit/2b6d4735) Update README.md +- [90fbf2ab](https://github.com/appscode/stash-enterprise/commit/90fbf2ab) Allow modifying the cron expression (#25) +- [3e416598](https://github.com/appscode/stash-enterprise/commit/3e416598) Merge commit '958f7da4904598c85aabadf104c687e321eacb33' +- [0f787535](https://github.com/appscode/stash-enterprise/commit/0f787535) Use unversioned time (#23) +- [3521adfb](https://github.com/appscode/stash-enterprise/commit/3521adfb) Update design.md +- [ebfa0624](https://github.com/appscode/stash-enterprise/commit/ebfa0624) Update design.md +- [7785bc86](https://github.com/appscode/stash-enterprise/commit/7785bc86) example added (#19) +- [ca8a2ec6](https://github.com/appscode/stash-enterprise/commit/ca8a2ec6) Use restik api and client from k8s-addons (#18) +- [2aae97a9](https://github.com/appscode/stash-enterprise/commit/2aae97a9) Error print fix (#17) +- [379b853e](https://github.com/appscode/stash-enterprise/commit/379b853e) Check group registration Before Register Groups (#16) +- [f2643e91](https://github.com/appscode/stash-enterprise/commit/f2643e91) Add Restik docs (#15) +- [fb8e6c12](https://github.com/appscode/stash-enterprise/commit/fb8e6c12) Restik unit test, e2e test (#14) +- [45f9bc69](https://github.com/appscode/stash-enterprise/commit/45f9bc69) Restik create delete initial implementation (#12) +- [829887a0](https://github.com/appscode/stash-enterprise/commit/829887a0) Update restic to 0.5.0 +- [4e0c40f9](https://github.com/appscode/stash-enterprise/commit/4e0c40f9) Don't allow push with tags. +- [b33d8142](https://github.com/appscode/stash-enterprise/commit/b33d8142) Unify restic and restik docker images. +- [6c7484ad](https://github.com/appscode/stash-enterprise/commit/6c7484ad) Make restic executable. +- [67272949](https://github.com/appscode/stash-enterprise/commit/67272949) Build docker image (#11) +- [1d3b939c](https://github.com/appscode/stash-enterprise/commit/1d3b939c) Add links to proposal in readme +- [6548fd84](https://github.com/appscode/stash-enterprise/commit/6548fd84) Use cobra to structure restik commands. +- [8c6425b6](https://github.com/appscode/stash-enterprise/commit/8c6425b6) Clone skeleton from appscode/k3pc (#10) +- [ba60c6d4](https://github.com/appscode/stash-enterprise/commit/ba60c6d4) Merge commit 'a3e8a4a46d31a8c6e9fcceda85d3a55f36293f67' as 'hack/libbuild' + + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.10.0](https://github.com/stashed/apimachinery/releases/tag/v0.10.0) + +- [7dbdff5f](https://github.com/stashed/apimachinery/commit/7dbdff5f) Update README.md +- [254ee64e](https://github.com/stashed/apimachinery/commit/254ee64e) Rename param annotation (#42) +- [2210ed42](https://github.com/stashed/apimachinery/commit/2210ed42) Update Kubernetes v1.18.3 dependencies (#41) +- [835c0358](https://github.com/stashed/apimachinery/commit/835c0358) Update Kubernetes v1.18.3 dependencies (#40) +- [692909fe](https://github.com/stashed/apimachinery/commit/692909fe) Add params and schedule annotation (#38) +- [b9ff4f14](https://github.com/stashed/apimachinery/commit/b9ff4f14) Update Kubernetes v1.18.3 dependencies (#37) +- [c44c52c8](https://github.com/stashed/apimachinery/commit/c44c52c8) Update Kubernetes v1.18.3 dependencies (#36) +- [073a93c8](https://github.com/stashed/apimachinery/commit/073a93c8) Rename StashLocalBackendAccessor to StashNetVolAccessor (#35) +- [e29c2724](https://github.com/stashed/apimachinery/commit/e29c2724) Update Kubernetes v1.18.3 dependencies (#34) +- [a4807149](https://github.com/stashed/apimachinery/commit/a4807149) Update Kubernetes v1.18.3 dependencies (#33) +- [d6fcb2c6](https://github.com/stashed/apimachinery/commit/d6fcb2c6) Fix protobuf tags (#32) +- [d255d800](https://github.com/stashed/apimachinery/commit/d255d800) Pass target reference for restore job condition (#31) +- [a3ce1cee](https://github.com/stashed/apimachinery/commit/a3ce1cee) Add helper method for NFS backend (#30) +- [a4be15a1](https://github.com/stashed/apimachinery/commit/a4be15a1) Introduce RestoreBatch CRD + Additional Improvements (#22) +- [710228f4](https://github.com/stashed/apimachinery/commit/710228f4) Update to Kubernetes v1.18.3 (#29) +- [0f69a3ab](https://github.com/stashed/apimachinery/commit/0f69a3ab) Update to Kubernetes v1.18.3 (#28) +- [504a57e7](https://github.com/stashed/apimachinery/commit/504a57e7) Update to Kubernetes v1.18.3 (#27) +- [843421e4](https://github.com/stashed/apimachinery/commit/843421e4) Show AppsCode in copyright file header (#26) +- [ad462cc4](https://github.com/stashed/apimachinery/commit/ad462cc4) Update to Kubernetes v1.18.3 (#25) +- [28d53699](https://github.com/stashed/apimachinery/commit/28d53699) Update update-release-tracker.sh +- [34624044](https://github.com/stashed/apimachinery/commit/34624044) Update update-release-tracker.sh +- [5f5de63c](https://github.com/stashed/apimachinery/commit/5f5de63c) Fix openapi path (#24) +- [6e0ad5f8](https://github.com/stashed/apimachinery/commit/6e0ad5f8) Add script to update release tracker on pr merge (#23) +- [cbf9b376](https://github.com/stashed/apimachinery/commit/cbf9b376) Update .kodiak.toml +- [d12b3d4b](https://github.com/stashed/apimachinery/commit/d12b3d4b) Update to Kubernetes v1.18.3 (#21) +- [1956a312](https://github.com/stashed/apimachinery/commit/1956a312) Update to Kubernetes v1.18.3 +- [c3966002](https://github.com/stashed/apimachinery/commit/c3966002) Unwrap top level api folder (#20) +- [5ba03fb5](https://github.com/stashed/apimachinery/commit/5ba03fb5) Update to Kubernetes v1.18.3 (#19) +- [abeb620e](https://github.com/stashed/apimachinery/commit/abeb620e) Update to Kubernetes v1.18.3 +- [6fdf8a60](https://github.com/stashed/apimachinery/commit/6fdf8a60) Enable https://kodiakhq.com (#13) +- [479258ed](https://github.com/stashed/apimachinery/commit/479258ed) Update dev scripts (#12) +- [a85ced99](https://github.com/stashed/apimachinery/commit/a85ced99) Merge pull request #11 from stashed/k8s-gomod-refresher-1591208266 +- [82df6f26](https://github.com/stashed/apimachinery/commit/82df6f26) Update to Kubernetes v1.18.3 +- [788f6921](https://github.com/stashed/apimachinery/commit/788f6921) Add default annotation for Snapshotter (#9) +- [d2f3f5d4](https://github.com/stashed/apimachinery/commit/d2f3f5d4) Remove defaults from crd v1beta1 YAML (#8) +- [1a09ffde](https://github.com/stashed/apimachinery/commit/1a09ffde) Update dependencies +- [58525b4b](https://github.com/stashed/apimachinery/commit/58525b4b) Update dependencies +- [c34c2ec1](https://github.com/stashed/apimachinery/commit/c34c2ec1) Generate both v1beta1 and v1 CRD YAML (#7) +- [e81205a3](https://github.com/stashed/apimachinery/commit/e81205a3) Bring back mistakenly removed SetRecoveryStats +- [5f8cf3a6](https://github.com/stashed/apimachinery/commit/5f8cf3a6) Merge pull request #6 from stashed/k-1.18.3 +- [723f4de9](https://github.com/stashed/apimachinery/commit/723f4de9) Add context to crd utils +- [59478af4](https://github.com/stashed/apimachinery/commit/59478af4) Update to Kubernetes 1.18.3 +- [e83b90a7](https://github.com/stashed/apimachinery/commit/e83b90a7) Merge pull request #3 from stashed/wait-for-target +- [a5b9a011](https://github.com/stashed/apimachinery/commit/a5b9a011) Simplify targetMatched() function +- [58948bd9](https://github.com/stashed/apimachinery/commit/58948bd9) Refactor +- [5568cb90](https://github.com/stashed/apimachinery/commit/5568cb90) Add RestoreSession conditions +- [906c5910](https://github.com/stashed/apimachinery/commit/906c5910) Add TypeMeta to invoker +- [22843fdb](https://github.com/stashed/apimachinery/commit/22843fdb) Use Go 1.14.3 +- [238d1bd0](https://github.com/stashed/apimachinery/commit/238d1bd0) Add backup invoker condition transion reasons +- [275965f9](https://github.com/stashed/apimachinery/commit/275965f9) Introduce conditions for BackupConfiguration and BackupBatch +- [35159c81](https://github.com/stashed/apimachinery/commit/35159c81) Merge pull request #5 from stashed/fix-updatestatus +- [f1d78326](https://github.com/stashed/apimachinery/commit/f1d78326) Fix helper methods +- [dbb02873](https://github.com/stashed/apimachinery/commit/dbb02873) Fix UpdateStatus() function +- [a7bd75ad](https://github.com/stashed/apimachinery/commit/a7bd75ad) Update crazy-max/ghaction-docker-buildx flag +- [1d65a7d4](https://github.com/stashed/apimachinery/commit/1d65a7d4) Use recommended kubernetes app labels (#4) +- [5b322e9f](https://github.com/stashed/apimachinery/commit/5b322e9f) Add Enum markers to api types +- [e6017151](https://github.com/stashed/apimachinery/commit/e6017151) Trigger the workflow on push or pull request +- [54097441](https://github.com/stashed/apimachinery/commit/54097441) Use kubectl v1.17 (#1) +- [43743e92](https://github.com/stashed/apimachinery/commit/43743e92) Update module path +- [9c16896f](https://github.com/stashed/apimachinery/commit/9c16896f) Add support for specifying "region" for S3 backend (#1050) +- [b8c83f74](https://github.com/stashed/apimachinery/commit/b8c83f74) Fix Repository CRDs print column (#1046) +- [52367e1b](https://github.com/stashed/apimachinery/commit/52367e1b) Update README.md to v0.9.0-rc.4 +- [48dba9c9](https://github.com/stashed/apimachinery/commit/48dba9c9) Fix ServiceAccount name mitchmatch (#1025) +- [a0fceff6](https://github.com/stashed/apimachinery/commit/a0fceff6) Suspend CronJob but keep instant backup working while backup is paused (#1024) +- [3d591020](https://github.com/stashed/apimachinery/commit/3d591020) Add stash specific prefix to automatically created resources (#1023) +- [b113839c](https://github.com/stashed/apimachinery/commit/b113839c) Use Go 1.13.6 +- [50071f71](https://github.com/stashed/apimachinery/commit/50071f71) Enable tests for K8s 1.11 (#1013) +- [e1069c9a](https://github.com/stashed/apimachinery/commit/e1069c9a) Bring back support for k8s 1.11 (#1008) +- [427a9c57](https://github.com/stashed/apimachinery/commit/427a9c57) Remove creationTimestamp from PartialObjectMeta (#1006) +- [62ce8323](https://github.com/stashed/apimachinery/commit/62ce8323) Add BackupBatch support (#985) +- [190e4cc3](https://github.com/stashed/apimachinery/commit/190e4cc3) Update twitter account (#1003) +- [35e8db63](https://github.com/stashed/apimachinery/commit/35e8db63) Add Repository Validation for local backend `mountPath` (#947) +- [f28abce2](https://github.com/stashed/apimachinery/commit/f28abce2) Add Backend e2e Test (#975) +- [4283b841](https://github.com/stashed/apimachinery/commit/4283b841) Update client-go to kubernetes-1.16.3 (#987) +- [999fc6e3](https://github.com/stashed/apimachinery/commit/999fc6e3) Use RWX for restic output.json (#1001) +- [3bd3b357](https://github.com/stashed/apimachinery/commit/3bd3b357) Run `chmod` on `output.json` only by owner container + Improve… (#1000) +- [fa597188](https://github.com/stashed/apimachinery/commit/fa597188) Add Backup and Restore hooks (#978) +- [cc11d985](https://github.com/stashed/apimachinery/commit/cc11d985) Use helm chart instead of script to install operator (#999) +- [7fa6e4c2](https://github.com/stashed/apimachinery/commit/7fa6e4c2) Update hack/fmt.sh script +- [56ef2680](https://github.com/stashed/apimachinery/commit/56ef2680) Add helper library for CRDs (#977) +- [1c1c41c2](https://github.com/stashed/apimachinery/commit/1c1c41c2) Use kubebuilder generated CRD yamls (#971) +- [9c43c131](https://github.com/stashed/apimachinery/commit/9c43c131) Use controller-tools@v0.2.2 to generate structural schema (#974) +- [7e1a1899](https://github.com/stashed/apimachinery/commit/7e1a1899) Generate protobuf files for api types (#967) +- [a9e058d8](https://github.com/stashed/apimachinery/commit/a9e058d8) Fix Repository returned error message (#961) +- [1bfbca9b](https://github.com/stashed/apimachinery/commit/1bfbca9b) Apply valid name functionality (#950) +- [1cd02749](https://github.com/stashed/apimachinery/commit/1cd02749) Test installer against multiple k8s version (#953) +- [a6808bfa](https://github.com/stashed/apimachinery/commit/a6808bfa) Format shell scripts (#952) +- [1e513927](https://github.com/stashed/apimachinery/commit/1e513927) Add missing license header +- [00596ec8](https://github.com/stashed/apimachinery/commit/00596ec8) Rename Dockerfiles (#946) +- [b8eea322](https://github.com/stashed/apimachinery/commit/b8eea322) Add AutoBackup e2e test (#939) +- [e469e86e](https://github.com/stashed/apimachinery/commit/e469e86e) Enable race detector (#944) +- [81778745](https://github.com/stashed/apimachinery/commit/81778745) Add license header to files (#943) +- [f5000aa5](https://github.com/stashed/apimachinery/commit/f5000aa5) Don't add AppBinding labels in metric when AppBinding is not available (#942) +- [06537e5e](https://github.com/stashed/apimachinery/commit/06537e5e) Fix klog flag parsing +- [926f960a](https://github.com/stashed/apimachinery/commit/926f960a) Revendor +- [6ce2ee96](https://github.com/stashed/apimachinery/commit/6ce2ee96) Use crazy-max/ghaction-docker-buildx@v1 +- [5adb77e4](https://github.com/stashed/apimachinery/commit/5adb77e4) Show diff when files `make verify` fails (#937) +- [86be7d3e](https://github.com/stashed/apimachinery/commit/86be7d3e) Update make fmt +- [d3c773c2](https://github.com/stashed/apimachinery/commit/d3c773c2) Split imports into 3 blocks (#936) +- [a1326209](https://github.com/stashed/apimachinery/commit/a1326209) Volume e2e test github action (#933) +- [497a062a](https://github.com/stashed/apimachinery/commit/497a062a) Fix BackupSession additional print column (#932) +- [ed8fc701](https://github.com/stashed/apimachinery/commit/ed8fc701) Remove spec.backupConfiguration from BackupSession (#931) +- [5b202733](https://github.com/stashed/apimachinery/commit/5b202733) Update e2e tests to run on GitHub actions (#917) +- [c35f0b5f](https://github.com/stashed/apimachinery/commit/c35f0b5f) Enable make ci (#928) +- [18559697](https://github.com/stashed/apimachinery/commit/18559697) Don't restart workload on backup pause+Use ImagePullPolicy: "Always" for Function-Task model (#929) +- [65095dfe](https://github.com/stashed/apimachinery/commit/65095dfe) Add status.observedGeneration (#927) +- [f6181414](https://github.com/stashed/apimachinery/commit/f6181414) Implement RetentionPolicy for VolumeSnapshot (#926) +- [e69a37ca](https://github.com/stashed/apimachinery/commit/e69a37ca) Verify generated files are up to date (#925) +- [9514193d](https://github.com/stashed/apimachinery/commit/9514193d) Update and rename go.yml to ci.yml (#922) +- [675769a7](https://github.com/stashed/apimachinery/commit/675769a7) Add probe and BackupBatch api (#890) +- [149cf02d](https://github.com/stashed/apimachinery/commit/149cf02d) Use core package from k8s.io/api repo (#921) +- [f5cf5adf](https://github.com/stashed/apimachinery/commit/f5cf5adf) Bring back dependency to github.com/golang/protobuf@v1.2.0 (#918) +- [76e892de](https://github.com/stashed/apimachinery/commit/76e892de) Update tag pattern for release pipeline +- [8329fa4f](https://github.com/stashed/apimachinery/commit/8329fa4f) Run e2e tests using GitHub actions (#909) +- [11dabe80](https://github.com/stashed/apimachinery/commit/11dabe80) Add app=stash label to crd yamls +- [b1c9e012](https://github.com/stashed/apimachinery/commit/b1c9e012) Generate swagger.json for v1beta1 (#916) +- [538973b8](https://github.com/stashed/apimachinery/commit/538973b8) Add release pipeline (#915) +- [eeb53e04](https://github.com/stashed/apimachinery/commit/eeb53e04) Fix VolumeSnapshot Issues (#912) +- [d61e7bac](https://github.com/stashed/apimachinery/commit/d61e7bac) Add Kubebuilder annotations (#911) +- [e190f29a](https://github.com/stashed/apimachinery/commit/e190f29a) Use kubebuilder to generate crd yamls (#843) +- [bb4b5267](https://github.com/stashed/apimachinery/commit/bb4b5267) Update go.yml +- [84fbd266](https://github.com/stashed/apimachinery/commit/84fbd266) Introduce InterimVolumeTemplate and BackupHistoryLimit field. (#907) +- [4fda42c8](https://github.com/stashed/apimachinery/commit/4fda42c8) Make RetentionPolicy required in v1beta1 api (#905) +- [75c2560e](https://github.com/stashed/apimachinery/commit/75c2560e) Enable GitHub actions (#903) +- [326051df](https://github.com/stashed/apimachinery/commit/326051df) Fix snapshot listing for local backend (#902) +- [3950661b](https://github.com/stashed/apimachinery/commit/3950661b) Improve Error Handling + Code refactor (#891) +- [215680ee](https://github.com/stashed/apimachinery/commit/215680ee) Add `NICE` and `IONICE` into distroless image (#883) +- [91ff6961](https://github.com/stashed/apimachinery/commit/91ff6961) Improve metrics handling + make update status uniform (#872) +- [54acd006](https://github.com/stashed/apimachinery/commit/54acd006) Add DumpEnv func to Restic Config file (#870) +- [02f7f1e5](https://github.com/stashed/apimachinery/commit/02f7f1e5) Allow to specify subPath in auto-backup annotation (#871) +- [8a67406f](https://github.com/stashed/apimachinery/commit/8a67406f) Silence docker buildx command (#866) +- [50110a2d](https://github.com/stashed/apimachinery/commit/50110a2d) Update README.md (#865) +- [9dfef064](https://github.com/stashed/apimachinery/commit/9dfef064) Use docker buildx to build docker image (#864) +- [67974206](https://github.com/stashed/apimachinery/commit/67974206) Update version in gendocs script +- [d3613ff4](https://github.com/stashed/apimachinery/commit/d3613ff4) Use github.com/Azure/go-autorest/autorest@v0.7.0 (#862) +- [da23461d](https://github.com/stashed/apimachinery/commit/da23461d) Remove the `bs` short name for BackupSession (#859) +- [f4c425ec](https://github.com/stashed/apimachinery/commit/f4c425ec) Use github.com/golang/protobuf@v1.2.0 (#855) +- [90a9cd35](https://github.com/stashed/apimachinery/commit/90a9cd35) New variable from type field of AppBinding + Fix RoleBinding nam… (#845) +- [26a35938](https://github.com/stashed/apimachinery/commit/26a35938) Fix resolving Task if volumeClaimTemplate is set in RestoreSession(#852) +- [f6de2e47](https://github.com/stashed/apimachinery/commit/f6de2e47) Rename BackupConfigurationTemplate to BackupBlueprint (#847) +- [a18041a9](https://github.com/stashed/apimachinery/commit/a18041a9) Pass replicas from RestoreSession to Function (#848) +- [e061c7df](https://github.com/stashed/apimachinery/commit/e061c7df) Use variable for version in BackupConfigurationTemplate name (#846) +- [18ee8f1e](https://github.com/stashed/apimachinery/commit/18ee8f1e) Fix Platforms Issue (#844) +- [a3e48977](https://github.com/stashed/apimachinery/commit/a3e48977) Add GetSnapshotSize() function (#839) +- [a2563e2a](https://github.com/stashed/apimachinery/commit/a2563e2a) Fix travis build (#837) +- [737a9f9f](https://github.com/stashed/apimachinery/commit/737a9f9f) Add support for parallel backup & restore (#833) +- [ff29a86f](https://github.com/stashed/apimachinery/commit/ff29a86f) Use cron.ParseStandard helper +- [60dfc70e](https://github.com/stashed/apimachinery/commit/60dfc70e) Update azure-sdk-for-go dependencies (#836) +- [690424c6](https://github.com/stashed/apimachinery/commit/690424c6) Update github.com/appscode/go@master +- [975b72f7](https://github.com/stashed/apimachinery/commit/975b72f7) Use robfig/cron@v3 (#834) +- [db237826](https://github.com/stashed/apimachinery/commit/db237826) Remove unused code (#829) +- [cf8d0316](https://github.com/stashed/apimachinery/commit/cf8d0316) Generate docs files inside docs repo (#828) +- [0b7642b2](https://github.com/stashed/apimachinery/commit/0b7642b2) Add License notice to makefile (#825) +- [7aeda1a7](https://github.com/stashed/apimachinery/commit/7aeda1a7) Always attempt to pull a newer image for `make container` (#818) +- [2dd72ed0](https://github.com/stashed/apimachinery/commit/2dd72ed0) Update constants.go +- [6b54344b](https://github.com/stashed/apimachinery/commit/6b54344b) Add PusgatewayURL input for Functions (#816) +- [48f909ff](https://github.com/stashed/apimachinery/commit/48f909ff) Restore PVCs from templates using Restic (#809) +- [9c01bc29](https://github.com/stashed/apimachinery/commit/9c01bc29) Add TARGET_RESOURCE variable for BackupConfigurationTemplate (#814) +- [f88e6ce6](https://github.com/stashed/apimachinery/commit/f88e6ce6) Add make install, uninstall, purge commands (#813) +- [ecbe5573](https://github.com/stashed/apimachinery/commit/ecbe5573) Move chart & deploy scripts to github.com/stashed/installer (#811) +- [41bb5197](https://github.com/stashed/apimachinery/commit/41bb5197) Use stashed/docs repo +- [1348e419](https://github.com/stashed/apimachinery/commit/1348e419) Move docs to github.com/stashed/docs repo (#810) +- [7ebb2319](https://github.com/stashed/apimachinery/commit/7ebb2319) Fix travis build (#804) +- [06f0bf36](https://github.com/stashed/apimachinery/commit/06f0bf36) Pass labels to offshoot + add generic offshoot labels (#801) +- [e66ed12a](https://github.com/stashed/apimachinery/commit/e66ed12a) Remove canary support (#805) +- [7a2d937b](https://github.com/stashed/apimachinery/commit/7a2d937b) Update Version.go (#803) +- [1f00c4e5](https://github.com/stashed/apimachinery/commit/1f00c4e5) Added ARM64 support to the install script and manifest (#802) +- [b7582d56](https://github.com/stashed/apimachinery/commit/b7582d56) Load modules from vendor folder for linter +- [3afc2b8c](https://github.com/stashed/apimachinery/commit/3afc2b8c) Add Makefile (#800) +- [27d43b71](https://github.com/stashed/apimachinery/commit/27d43b71) VolumeSnapshot (#787) +- [31d0538c](https://github.com/stashed/apimachinery/commit/31d0538c) Remove importance of order of rule in RestoreSession (#795) +- [840611ac](https://github.com/stashed/apimachinery/commit/840611ac) Skip BackupSession creation if target does not exist + use timestamp … (#797) +- [3d514977](https://github.com/stashed/apimachinery/commit/3d514977) Use absolute path as aliases for reference docs. (#796) +- [c7cd13cd](https://github.com/stashed/apimachinery/commit/c7cd13cd) Support PSP enabled cluster (#729) +- [74b90737](https://github.com/stashed/apimachinery/commit/74b90737) Use restic 0.9.5 (#789) +- [7b52a1d9](https://github.com/stashed/apimachinery/commit/7b52a1d9) Fix: User and group creation of stash for mongodb and mysql (#786) +- [42eb3082](https://github.com/stashed/apimachinery/commit/42eb3082) Update concept doc (#739) +- [34516293](https://github.com/stashed/apimachinery/commit/34516293) Update backup manager (#782) +- [d451c9e6](https://github.com/stashed/apimachinery/commit/d451c9e6) Configure Env variables for Functions (#780) +- [3045aa70](https://github.com/stashed/apimachinery/commit/3045aa70) Add support for backup cluster resources YAML (#721) +- [84be8e6f](https://github.com/stashed/apimachinery/commit/84be8e6f) Add "Supported Backends" doc to new guides (#756) +- [43700290](https://github.com/stashed/apimachinery/commit/43700290) Fix rest backend for workloads + add more authentication method for swift backend (#778) +- [c347fecc](https://github.com/stashed/apimachinery/commit/c347fecc) Backup and restore Elasticsearch (#702) +- [1a90ede6](https://github.com/stashed/apimachinery/commit/1a90ede6) Add guides template for new design (#755) +- [b784b8ee](https://github.com/stashed/apimachinery/commit/b784b8ee) Update package path to stash.appscode.dev/stash (#776) +- [bd05d186](https://github.com/stashed/apimachinery/commit/bd05d186) Update to k8s 1.14.0 client libraries using go.mod (#775) +- [eaa16de0](https://github.com/stashed/apimachinery/commit/eaa16de0) Introduce VolumeSnapshot APIs (#772) +- [2265c79d](https://github.com/stashed/apimachinery/commit/2265c79d) Use osm pkg from kmodules/objectstore-api (#770) +- [fc13863f](https://github.com/stashed/apimachinery/commit/fc13863f) Remove --rbac flag (#761) +- [039d0fd7](https://github.com/stashed/apimachinery/commit/039d0fd7) Skip creating/processing backup-session when backup-config is paused (#759) +- [2be48d23](https://github.com/stashed/apimachinery/commit/2be48d23) Stash v1beta1 E2E test for PVC (#753) +- [8c1949c2](https://github.com/stashed/apimachinery/commit/8c1949c2) Update Kubernetes client libraries to 1.13.5 (#752) +- [b40b5d72](https://github.com/stashed/apimachinery/commit/b40b5d72) Enable pipefail and update restore yamls (#750) +- [ba94ee71](https://github.com/stashed/apimachinery/commit/ba94ee71) Fixed scratch-dir, output-dir and hostname in functions/tasks yamls (#744) +- [a5d80180](https://github.com/stashed/apimachinery/commit/a5d80180) Add Stash CLI (#734) +- [fdb56095](https://github.com/stashed/apimachinery/commit/fdb56095) Stash v1beta1 E2E test for DaemonSet (#741) +- [04344b00](https://github.com/stashed/apimachinery/commit/04344b00) Apply nice/ionice settings from env (#746) +- [7782f71b](https://github.com/stashed/apimachinery/commit/7782f71b) Stash V1beta1 E2E test for Deployment (#710) +- [263f7f6e](https://github.com/stashed/apimachinery/commit/263f7f6e) Fix openapi path prefixes for validators and mutators (#732) +- [fe9c3ecb](https://github.com/stashed/apimachinery/commit/fe9c3ecb) Add max-connections for GCS, Azure, B2 backend (#730) +- [3af1ee29](https://github.com/stashed/apimachinery/commit/3af1ee29) Rename admission webhooks to avoid name collision (#725) +- [b1f960cd](https://github.com/stashed/apimachinery/commit/b1f960cd) Apply EmptyDir settings to TmpDir (#719) +- [a8749398](https://github.com/stashed/apimachinery/commit/a8749398) Use FailurePolicy ignore for K8s resource webhooks (#726) +- [af242f16](https://github.com/stashed/apimachinery/commit/af242f16) Don't write secret data inside temp dir (#724) +- [1ede0246](https://github.com/stashed/apimachinery/commit/1ede0246) Use ionice and nice with Restic CMD (#716) +- [ccdd4294](https://github.com/stashed/apimachinery/commit/ccdd4294) Use cleanup-cache flag (#717) +- [9e0bd095](https://github.com/stashed/apimachinery/commit/9e0bd095) Add TempDir and PSP settings for Function (#720) +- [117e6f0b](https://github.com/stashed/apimachinery/commit/117e6f0b) Add support for rest backend (#713) +- [f7d9de0f](https://github.com/stashed/apimachinery/commit/f7d9de0f) Add support for OpenShift DeploymentConfig (#714) +- [94b53f5f](https://github.com/stashed/apimachinery/commit/94b53f5f) Backup and restore Mongo DB (#699) +- [a505764b](https://github.com/stashed/apimachinery/commit/a505764b) Backup and restore MySQL DB (#696) +- [260f79d5](https://github.com/stashed/apimachinery/commit/260f79d5) Backup and restore Postgres DB (#695) +- [dc5d0ce4](https://github.com/stashed/apimachinery/commit/dc5d0ce4) Backup from stdin and dump to stdout (#694) +- [b911253c](https://github.com/stashed/apimachinery/commit/b911253c) Add BackupSession Controller for Sidecar (#701) +- [886adaa9](https://github.com/stashed/apimachinery/commit/886adaa9) Update workload controller for new design (#675) +- [30e17229](https://github.com/stashed/apimachinery/commit/30e17229) Post backup/restore status update (#691) +- [ef3ca6ba](https://github.com/stashed/apimachinery/commit/ef3ca6ba) Backup and restore PVC (#676) +- [e98d1357](https://github.com/stashed/apimachinery/commit/e98d1357) Resolve tasks for backup/restore sessions (#674) +- [2d5e2a40](https://github.com/stashed/apimachinery/commit/2d5e2a40) Add restic wrapper library (#673) +- [22ce2f85](https://github.com/stashed/apimachinery/commit/22ce2f85) Add BackupConfiguration Controller (#671) +- [73478a31](https://github.com/stashed/apimachinery/commit/73478a31) Use ContainerRuntimeSettings in Function spec (#689) +- [8daa144d](https://github.com/stashed/apimachinery/commit/8daa144d) Update Kubernetes client libraries to 1.13.0 (#687) +- [ffe7eff3](https://github.com/stashed/apimachinery/commit/ffe7eff3) Fix v1beta1 api for BackupConfigurationTemplate (#688) +- [6310146c](https://github.com/stashed/apimachinery/commit/6310146c) Introduce v1beta1 api (#647) +- [a806c546](https://github.com/stashed/apimachinery/commit/a806c546) Prepare docs for 0.8.3 release (#683) +- [c0a281a2](https://github.com/stashed/apimachinery/commit/c0a281a2) Update changelog for 0.8.3 (#682) +- [057b41d4](https://github.com/stashed/apimachinery/commit/057b41d4) Update dependencies (#681) +- [ccf44b55](https://github.com/stashed/apimachinery/commit/ccf44b55) Pass pod annotation to deployment (#679) +- [322e9812](https://github.com/stashed/apimachinery/commit/322e9812) Fix the case for deploying using MINGW64 for windows (#678) +- [c096b55a](https://github.com/stashed/apimachinery/commit/c096b55a) Use onessl 0.10.0 (#677) +- [ffa27f22](https://github.com/stashed/apimachinery/commit/ffa27f22) Fix typo +- [f4d6ecc1](https://github.com/stashed/apimachinery/commit/f4d6ecc1) s/rook/azure/ in possible copy/paste error. (#669) +- [99f44fa1](https://github.com/stashed/apimachinery/commit/99f44fa1) Fix builtin monitoring doc (#668) +- [747b7ba2](https://github.com/stashed/apimachinery/commit/747b7ba2) Update install.md +- [85ecd963](https://github.com/stashed/apimachinery/commit/85ecd963) Don't use priority class when operator namespace is not kube-system (#666) +- [78c88a52](https://github.com/stashed/apimachinery/commit/78c88a52) Separate type definitions into individual files (#646) +- [760613d2](https://github.com/stashed/apimachinery/commit/760613d2) Update changelog for 0.8.2 +- [fe861de7](https://github.com/stashed/apimachinery/commit/fe861de7) Prepare docs for 0.8.2 release (#644) +- [a9c7e3da](https://github.com/stashed/apimachinery/commit/a9c7e3da) Update copyright notice for 2019 (#643) +- [5a9efe76](https://github.com/stashed/apimachinery/commit/5a9efe76) Use fullname to generate cleaner name in chart +- [a876a9da](https://github.com/stashed/apimachinery/commit/a876a9da) apply stash.labels to operator pods +- [09b83f2e](https://github.com/stashed/apimachinery/commit/09b83f2e) Use stash.labels template in chart (#642) +- [70d2af23](https://github.com/stashed/apimachinery/commit/70d2af23) Fixed broken link for bakend (#641) +- [21b91a96](https://github.com/stashed/apimachinery/commit/21b91a96) Only mount stash apiserver `tls.crt` into Prometheus (#639) +- [d9c87802](https://github.com/stashed/apimachinery/commit/d9c87802) Fix typo in installer (#638) +- [893b3a41](https://github.com/stashed/apimachinery/commit/893b3a41) Fix monitoring in helm + update doc to match with third-party-tools tutorial (#637) +- [5fd484ba](https://github.com/stashed/apimachinery/commit/5fd484ba) Add certificate health checker (#636) +- [ecbefd44](https://github.com/stashed/apimachinery/commit/ecbefd44) Update install.md +- [5e8221d4](https://github.com/stashed/apimachinery/commit/5e8221d4) Update chart readme (#632) +- [960dac71](https://github.com/stashed/apimachinery/commit/960dac71) Update webhook error message format for Kubernetes 1.13+ (#631) +- [096afccb](https://github.com/stashed/apimachinery/commit/096afccb) Fix typos (#630) +- [e2a7f03a](https://github.com/stashed/apimachinery/commit/e2a7f03a) Fix dependencies. +- [591a7cec](https://github.com/stashed/apimachinery/commit/591a7cec) Update changelog +- [248daebf](https://github.com/stashed/apimachinery/commit/248daebf) Prepare docs for 0.8.1 release (#629) +- [7ce0d537](https://github.com/stashed/apimachinery/commit/7ce0d537) Add missing validator for respository resource in chart (#628) +- [2114829d](https://github.com/stashed/apimachinery/commit/2114829d) Update version matrix +- [18c29c62](https://github.com/stashed/apimachinery/commit/18c29c62) Prepare docs for 0.8.0 release (#626) +- [b5779f22](https://github.com/stashed/apimachinery/commit/b5779f22) Update docs (Minio, Rook, NFS) (#625) +- [fb104264](https://github.com/stashed/apimachinery/commit/fb104264) Use flags.DumpAll to dump flags (#624) +- [7e11a97c](https://github.com/stashed/apimachinery/commit/7e11a97c) Merge commit '619323825a3fabc55ce2584dd63f8005fd3b78b3' +- [8f32db19](https://github.com/stashed/apimachinery/commit/8f32db19) Set periodic analytics (#623) +- [b8b20447](https://github.com/stashed/apimachinery/commit/b8b20447) Fix e2e test (#622) +- [e4da720f](https://github.com/stashed/apimachinery/commit/e4da720f) Pass --enable-***-webhook flags to operator (#619) +- [e5a91c47](https://github.com/stashed/apimachinery/commit/e5a91c47) Add validation webhook xray (#618) +- [de6a6c03](https://github.com/stashed/apimachinery/commit/de6a6c03) Add docs for AKS and EKS (#609) +- [2eb4e9df](https://github.com/stashed/apimachinery/commit/2eb4e9df) Improve monitoring facility (#606) +- [6b1b8f3f](https://github.com/stashed/apimachinery/commit/6b1b8f3f) Use dynamic pushgateway url (#614) +- [4f2aaca3](https://github.com/stashed/apimachinery/commit/4f2aaca3) Pass image pull secrets for cleaner job in chart (#598) +- [5f59b5ba](https://github.com/stashed/apimachinery/commit/5f59b5ba) Update kubernetes client libraries to 1.12.0 (#597) +- [9a9916ac](https://github.com/stashed/apimachinery/commit/9a9916ac) Support LogLevel in chart (#594) +- [b7c9253a](https://github.com/stashed/apimachinery/commit/b7c9253a) Check if Kubernetes version is supported before running operator (#593) +- [a3a0c8d2](https://github.com/stashed/apimachinery/commit/a3a0c8d2) Enable webhooks by default in chart (#591) +- [d84b36ae](https://github.com/stashed/apimachinery/commit/d84b36ae) Update chart readme for cleaner values (#590) +- [dde9fe0f](https://github.com/stashed/apimachinery/commit/dde9fe0f) Update values.yaml +- [b401f6af](https://github.com/stashed/apimachinery/commit/b401f6af) Fix #583 and pushgateway version (#584) +- [df29c67d](https://github.com/stashed/apimachinery/commit/df29c67d) Use --pull flag with docker build (#581) +- [bab17f30](https://github.com/stashed/apimachinery/commit/bab17f30) Merge commit '593cbc0910006952073295cea802d37f30ab8e3f' +- [36a54348](https://github.com/stashed/apimachinery/commit/36a54348) Use kubernetes-1.11.3 (#578) +- [0f78cc59](https://github.com/stashed/apimachinery/commit/0f78cc59) Update CertStore (#576) +- [b6ad4fd8](https://github.com/stashed/apimachinery/commit/b6ad4fd8) Use apps/v1 apigroup in installer scripts (#574) +- [21a3a0fa](https://github.com/stashed/apimachinery/commit/21a3a0fa) Support pod annotations in chart (#573) +- [f4188df6](https://github.com/stashed/apimachinery/commit/f4188df6) Set serviceAccount for clearner job (#572) +- [71419568](https://github.com/stashed/apimachinery/commit/71419568) Cleanup webhooks when chart is deleted (#569) +- [1afecd9c](https://github.com/stashed/apimachinery/commit/1afecd9c) Use IntHash as status.observedGeneration (#568) +- [06fb96ef](https://github.com/stashed/apimachinery/commit/06fb96ef) Update pipeline (#565) +- [a5c10e03](https://github.com/stashed/apimachinery/commit/a5c10e03) Merge commit 'dc51668e81aad9349769f0287cb885477836f2b1' +- [f3e41a08](https://github.com/stashed/apimachinery/commit/f3e41a08) Add observedGenerationHash field (#564) +- [a228cfd5](https://github.com/stashed/apimachinery/commit/a228cfd5) Merge commit 'c73f89c561b2e686d2898b0c8dea8c0bd327e6fd' +- [b9c2405b](https://github.com/stashed/apimachinery/commit/b9c2405b) Fix uninstall for concourse (#563) +- [9b494b4b](https://github.com/stashed/apimachinery/commit/9b494b4b) Fix chart values file (#562) +- [dac75e67](https://github.com/stashed/apimachinery/commit/dac75e67) Improve Helm chart options (#561) +- [fdcd84af](https://github.com/stashed/apimachinery/commit/fdcd84af) Use apps/v1 apigroup (#555) +- [7a3d3a6d](https://github.com/stashed/apimachinery/commit/7a3d3a6d) Merge commit 'e0a3eef3ad5bb45a6967704531a303bc7ea7d865' +- [7ecb7aa6](https://github.com/stashed/apimachinery/commit/7ecb7aa6) Refactor concourse scripts (#554) +- [97675d40](https://github.com/stashed/apimachinery/commit/97675d40) Merge commit '2a5664a73d8d23ced4598e61327a3d7003db2e04' +- [0dde94b8](https://github.com/stashed/apimachinery/commit/0dde94b8) Add AlreadyObserved methods (#553) +- [1471ef4b](https://github.com/stashed/apimachinery/commit/1471ef4b) Add categories support to crds (#552) +- [a49b2e35](https://github.com/stashed/apimachinery/commit/a49b2e35) Improve doc (#550) +- [0f3876ce](https://github.com/stashed/apimachinery/commit/0f3876ce) Fix concourse test (#496) +- [1c7af39a](https://github.com/stashed/apimachinery/commit/1c7af39a) Check for snapshot existence before delete (#548) +- [a06e72b5](https://github.com/stashed/apimachinery/commit/a06e72b5) Fix offline backup (#537) +- [dafa74fb](https://github.com/stashed/apimachinery/commit/dafa74fb) Enable status sub resource for crd yamls (#546) +- [f2a91600](https://github.com/stashed/apimachinery/commit/f2a91600) Remove old UpdateRecoveryStatus +- [6da21a36](https://github.com/stashed/apimachinery/commit/6da21a36) Retry UpdateStatus calls (#544) +- [acfcf7a5](https://github.com/stashed/apimachinery/commit/acfcf7a5) Retry UpdateStatus calls (#543) +- [e180ef6a](https://github.com/stashed/apimachinery/commit/e180ef6a) Revendor objectstore api (#542) +- [71bb0853](https://github.com/stashed/apimachinery/commit/71bb0853) Use kmodules.xyz/objectstore-api (#541) +- [dd3cf1ca](https://github.com/stashed/apimachinery/commit/dd3cf1ca) Merge commit 'da9eaba42e9b93d6975059b7f37c7863e54e1db1' +- [e6370a8b](https://github.com/stashed/apimachinery/commit/e6370a8b) Update install.md +- [676e1d02](https://github.com/stashed/apimachinery/commit/676e1d02) Fix extended apiserver issues with Kubernetes 1.11 (#536) +- [e8249dde](https://github.com/stashed/apimachinery/commit/e8249dde) Correctly handle ignored openapi prefixes (#533) +- [90f9a296](https://github.com/stashed/apimachinery/commit/90f9a296) Add rbac permissions for snapshots (#531) +- [f7976e7e](https://github.com/stashed/apimachinery/commit/f7976e7e) Use version and additional columns for crds (#530) +- [f3ec9a1e](https://github.com/stashed/apimachinery/commit/f3ec9a1e) Update client-go to v8.0.0 (#528) +- [3321c0c0](https://github.com/stashed/apimachinery/commit/3321c0c0) Update chart installation instruction for Kubernetes 1.11 (#527) +- [2bfa4a03](https://github.com/stashed/apimachinery/commit/2bfa4a03) Format shell scripts (#526) +- [f83f57d5](https://github.com/stashed/apimachinery/commit/f83f57d5) Merge commit 'bcebfb5adef7b4de9d4da7e48d9ba50a66e75fd3' +- [7a184805](https://github.com/stashed/apimachinery/commit/7a184805) Merge commit '2c8b49681a6875886b6be4d90c35908f12b73c65' +- [ec81f6b9](https://github.com/stashed/apimachinery/commit/ec81f6b9) Enable status subresource for crds (#524) +- [8a3a3bad](https://github.com/stashed/apimachinery/commit/8a3a3bad) Remove status from crd.yaml (#523) +- [0ebf9294](https://github.com/stashed/apimachinery/commit/0ebf9294) Upgrade to restic 0.9.1 (#522) +- [820a432c](https://github.com/stashed/apimachinery/commit/820a432c) Support node selector for recovery job (#516) +- [7313940f](https://github.com/stashed/apimachinery/commit/7313940f) Upgrade to prom/pushgateway:v0.5.2 (#519) +- [762193ce](https://github.com/stashed/apimachinery/commit/762193ce) Remove ops-address port (#518) +- [a944b88a](https://github.com/stashed/apimachinery/commit/a944b88a) Set cpu limits to 100m (#517) +- [02eca27a](https://github.com/stashed/apimachinery/commit/02eca27a) Update stash.sh +- [63783cc8](https://github.com/stashed/apimachinery/commit/63783cc8) Add links to java client +- [25005f65](https://github.com/stashed/apimachinery/commit/25005f65) Move openapi-spec to api folder (#513) +- [02ac221a](https://github.com/stashed/apimachinery/commit/02ac221a) Deploy operator in kube-system namespace via Helm (#511) +- [472d823a](https://github.com/stashed/apimachinery/commit/472d823a) Add togglable tabs for Installation: Script & Helm (#509) +- [60d571e4](https://github.com/stashed/apimachinery/commit/60d571e4) Revendor dependencies (#508) +- [5d56183b](https://github.com/stashed/apimachinery/commit/5d56183b) added front matter (#507) +- [ec715ab3](https://github.com/stashed/apimachinery/commit/ec715ab3) Improve installer (#504) +- [935db661](https://github.com/stashed/apimachinery/commit/935db661) Prepare docs for 0.7.0 release. (#502) +- [ecd85f2a](https://github.com/stashed/apimachinery/commit/ecd85f2a) Prepare docs for 0.7.0-rc.5 (#498) +- [6df2325b](https://github.com/stashed/apimachinery/commit/6df2325b) Fix storage implementation for snapshots (#497) +- [d3fdad71](https://github.com/stashed/apimachinery/commit/d3fdad71) Update changelog (#495) +- [794d4aca](https://github.com/stashed/apimachinery/commit/794d4aca) Delete user roles on purge. (#494) +- [f8744a6f](https://github.com/stashed/apimachinery/commit/f8744a6f) Revert "Add app: stash label to user roles. (#493)" +- [c506dc4c](https://github.com/stashed/apimachinery/commit/c506dc4c) Add app: stash label to user roles. (#493) +- [e1b0d6c7](https://github.com/stashed/apimachinery/commit/e1b0d6c7) Use hooks for user roles and fix hook deletion policy +- [bf59c614](https://github.com/stashed/apimachinery/commit/bf59c614) Use post-install hooks to install admission controller in chart (#492) +- [b50824e2](https://github.com/stashed/apimachinery/commit/b50824e2) Revert "Remove stash crds before uninstalling operator (#458)" +- [7b15b320](https://github.com/stashed/apimachinery/commit/7b15b320) Update changelog (#491) +- [8ec73428](https://github.com/stashed/apimachinery/commit/8ec73428) Prepare docs for 0.7.0-rc.4 (#483) +- [e1967d97](https://github.com/stashed/apimachinery/commit/e1967d97) Avoid creating apiservice when webhooks are not used. (#490) +- [ee1ef7c1](https://github.com/stashed/apimachinery/commit/ee1ef7c1) Install correct version of stash chart (#489) +- [5e5181fc](https://github.com/stashed/apimachinery/commit/5e5181fc) Concourse (#486) +- [02366a87](https://github.com/stashed/apimachinery/commit/02366a87) Revendor (#481) +- [b69f01df](https://github.com/stashed/apimachinery/commit/b69f01df) Support recovering from repository in different namespace (#474) +- [42c42112](https://github.com/stashed/apimachinery/commit/42c42112) Add support for initial backoff to the apiserver call on recover (#476) +- [b3ffb323](https://github.com/stashed/apimachinery/commit/b3ffb323) Typo (`Weclome` → `Welcome`) in page title (#479) +- [c448e138](https://github.com/stashed/apimachinery/commit/c448e138) Update docs (run minio in v1.9.4+ cluster and add example yaml files in respective backends) (#473) +- [6510947d](https://github.com/stashed/apimachinery/commit/6510947d) Fix a typo (#471) +- [5ce9da2d](https://github.com/stashed/apimachinery/commit/5ce9da2d) Don't panic if admission options is nil (#469) +- [7fdf126a](https://github.com/stashed/apimachinery/commit/7fdf126a) Disable admission controllers for webhook server (#468) +- [89f5b0c8](https://github.com/stashed/apimachinery/commit/89f5b0c8) Added SSL support for deleting restic repository from Minio backend (#464) +- [4e328d3e](https://github.com/stashed/apimachinery/commit/4e328d3e) Use new UpdateRecoveryStatus method (#466) +- [166e9283](https://github.com/stashed/apimachinery/commit/166e9283) Add Update***Status helpers (#465) +- [9a3c0b21](https://github.com/stashed/apimachinery/commit/9a3c0b21) Update client-go to 7.0.0 (#463) +- [7f995931](https://github.com/stashed/apimachinery/commit/7f995931) Rename webhook files in chart (#460) +- [2cf5cceb](https://github.com/stashed/apimachinery/commit/2cf5cceb) Update workload api (#459) +- [eeca55cf](https://github.com/stashed/apimachinery/commit/eeca55cf) Remove stash crds before uninstalling operator (#458) +- [b5319061](https://github.com/stashed/apimachinery/commit/b5319061) Export kube-ca only if required (#457) +- [37510e21](https://github.com/stashed/apimachinery/commit/37510e21) Improve installer (#456) +- [9b5fcbb2](https://github.com/stashed/apimachinery/commit/9b5fcbb2) Update changelog (#455) +- [b17c2190](https://github.com/stashed/apimachinery/commit/b17c2190) Various installer fixes (#454) +- [ca561960](https://github.com/stashed/apimachinery/commit/ca561960) Update workload client (#453) +- [28298bd1](https://github.com/stashed/apimachinery/commit/28298bd1) Update workload client (#452) +- [2d5b2882](https://github.com/stashed/apimachinery/commit/2d5b2882) Revendor workload client (#451) +- [274410b9](https://github.com/stashed/apimachinery/commit/274410b9) Update workload api (#450) +- [3899e0b7](https://github.com/stashed/apimachinery/commit/3899e0b7) Fixes RBAC issue in test (#449) +- [5afb9c7f](https://github.com/stashed/apimachinery/commit/5afb9c7f) fixed wipeOut + fixed doc (#447) +- [6565cb35](https://github.com/stashed/apimachinery/commit/6565cb35) Delete profile.out +- [3f7945c2](https://github.com/stashed/apimachinery/commit/3f7945c2) Add docs for GKE and Rook (#430) +- [d317210a](https://github.com/stashed/apimachinery/commit/d317210a) concourse configs (#429) +- [ff9d8e99](https://github.com/stashed/apimachinery/commit/ff9d8e99) Delete restic repository from backend if Repository CRD is deleted (#438) +- [2af3de25](https://github.com/stashed/apimachinery/commit/2af3de25) Use Repository data in Recovery CRD (#436) +- [1f71dae1](https://github.com/stashed/apimachinery/commit/1f71dae1) Update StatefulSet doc (#445) +- [d5a461b3](https://github.com/stashed/apimachinery/commit/d5a461b3) Move Stash swagger.json to top level folder (#441) +- [2a2eb1dd](https://github.com/stashed/apimachinery/commit/2a2eb1dd) Fix go_vet error (#440) +- [40a357e4](https://github.com/stashed/apimachinery/commit/40a357e4) Increase qps and burst limits (#435) +- [ceb8d0fc](https://github.com/stashed/apimachinery/commit/ceb8d0fc) Permit stash operator to perform pods/exec (#433) +- [0aaaf1bf](https://github.com/stashed/apimachinery/commit/0aaaf1bf) Add RBAC instructions for GKE cluster (#432) +- [1c414b05](https://github.com/stashed/apimachinery/commit/1c414b05) Update charts location (#431) +- [4a08b918](https://github.com/stashed/apimachinery/commit/4a08b918) Purge repository objects in installer (#427) +- [a25ff455](https://github.com/stashed/apimachinery/commit/a25ff455) Add SCRIPT_LOCATION variable to installer (#426) +- [4dcfe82f](https://github.com/stashed/apimachinery/commit/4dcfe82f) Show repository snapshot list (#417) +- [d33ffd85](https://github.com/stashed/apimachinery/commit/d33ffd85) Fixed Repository YAML (#425) +- [367009a4](https://github.com/stashed/apimachinery/commit/367009a4) Add delete method for snapshots to swagger.json (#424) +- [84085086](https://github.com/stashed/apimachinery/commit/84085086) Generate swagger.json (#423) +- [36cfec54](https://github.com/stashed/apimachinery/commit/36cfec54) Add install pkg for stash crds (#422) +- [18dc29a5](https://github.com/stashed/apimachinery/commit/18dc29a5) Fix openapi spec for stash crds (#421) +- [22256ccc](https://github.com/stashed/apimachinery/commit/22256ccc) Update README.md +- [12a039f9](https://github.com/stashed/apimachinery/commit/12a039f9) Add registry skeleton for snapshots (#415) +- [c18af633](https://github.com/stashed/apimachinery/commit/c18af633) Update chart readme (#413) +- [5ef3ca58](https://github.com/stashed/apimachinery/commit/5ef3ca58) Add enableAnalytics to chart readme +- [fd0ece69](https://github.com/stashed/apimachinery/commit/fd0ece69) Add frontmatter for repository crd (#412) +- [af50930a](https://github.com/stashed/apimachinery/commit/af50930a) Use separate registry key for docker images (#410) +- [c59e3fbb](https://github.com/stashed/apimachinery/commit/c59e3fbb) Prepare docs for 0.7.0-rc.3 (#411) +- [159c2750](https://github.com/stashed/apimachinery/commit/159c2750) Add test for recovery (#409) +- [aa36b115](https://github.com/stashed/apimachinery/commit/aa36b115) Skip setting ListKind (#407) +- [964c6f35](https://github.com/stashed/apimachinery/commit/964c6f35) Add CRD Validation (#406) +- [a7351a48](https://github.com/stashed/apimachinery/commit/a7351a48) Create repository crd for each Restic repository (#394) +- [273794d8](https://github.com/stashed/apimachinery/commit/273794d8) Generate openapi spec for stash api (#405) +- [9c2df315](https://github.com/stashed/apimachinery/commit/9c2df315) Fix install script for minikube 0.24.x (Kube 1.8.0) (#404) +- [aca52873](https://github.com/stashed/apimachinery/commit/aca52873) Skip downloading onessl if already installed (#401) +- [afb1746b](https://github.com/stashed/apimachinery/commit/afb1746b) Use Restic spec hash instead of resource version to restart pods (#399) +- [44867248](https://github.com/stashed/apimachinery/commit/44867248) Revendor webhook util and jsonpatch fixes (#400) +- [ce710f86](https://github.com/stashed/apimachinery/commit/ce710f86) Check for valid owner object (#397) +- [7b7821da](https://github.com/stashed/apimachinery/commit/7b7821da) Revendor webhook library (#393) +- [f763a5c1](https://github.com/stashed/apimachinery/commit/f763a5c1) Update changelog +- [b9b409e0](https://github.com/stashed/apimachinery/commit/b9b409e0) Prepare docs for 0.7.0-rc.2 (#391) +- [472e7cad](https://github.com/stashed/apimachinery/commit/472e7cad) Update chart version +- [296a6b4d](https://github.com/stashed/apimachinery/commit/296a6b4d) Add variable for dockerRegistry (#390) +- [2f29b8dd](https://github.com/stashed/apimachinery/commit/2f29b8dd) Reorg objects deleted in uninstall command (#389) +- [8a44a744](https://github.com/stashed/apimachinery/commit/8a44a744) Fix --enable-analytics flag (#387) +- [85c0a2a1](https://github.com/stashed/apimachinery/commit/85c0a2a1) Fix flag parsing in tests (#386) +- [e1c1d543](https://github.com/stashed/apimachinery/commit/e1c1d543) Fix Statefulset Example (#385) +- [d0b7eb1c](https://github.com/stashed/apimachinery/commit/d0b7eb1c) Rename --analytics to --enable-analytics (#384) +- [44383721](https://github.com/stashed/apimachinery/commit/44383721) Use separated appscode/kubernetes-webhook-util package (#383) +- [e5199369](https://github.com/stashed/apimachinery/commit/e5199369) Update the image tag in operator.yaml (#382) +- [dd9f165d](https://github.com/stashed/apimachinery/commit/dd9f165d) Don't enable mutator for StatefulSet updates (#381) +- [fe9fcda6](https://github.com/stashed/apimachinery/commit/fe9fcda6) Update docs to 0.7.0-rc.1 (#380) +- [2e5d9bb5](https://github.com/stashed/apimachinery/commit/2e5d9bb5) Add types for Repository apigroup (#377) +- [59f3eb1b](https://github.com/stashed/apimachinery/commit/59f3eb1b) Replace initializers with mutation webhook for workloads (#363) +- [ef98338c](https://github.com/stashed/apimachinery/commit/ef98338c) Merge pull request #375 from galexrt/fix373 +- [37e6f8a8](https://github.com/stashed/apimachinery/commit/37e6f8a8) Add missing front matter (#376) +- [293f27f7](https://github.com/stashed/apimachinery/commit/293f27f7) Update README.md +- [3e1a16ae](https://github.com/stashed/apimachinery/commit/3e1a16ae) Fix buid +- [7d300d87](https://github.com/stashed/apimachinery/commit/7d300d87) Add travis.yaml (#370) +- [9f14db3b](https://github.com/stashed/apimachinery/commit/9f14db3b) Add --purge flag (#369) +- [3e9ac0bc](https://github.com/stashed/apimachinery/commit/3e9ac0bc) Make it clear that installer is a single command (#365) +- [f1f3228d](https://github.com/stashed/apimachinery/commit/f1f3228d) Update installer (#364) +- [048e2f42](https://github.com/stashed/apimachinery/commit/048e2f42) Update chart to match RBAC best practices for charts (#362) +- [b0a50b64](https://github.com/stashed/apimachinery/commit/b0a50b64) Add checks to installer script (#361) +- [d96dd1c8](https://github.com/stashed/apimachinery/commit/d96dd1c8) Use admission hook helpers from kutil (#360) +- [18501324](https://github.com/stashed/apimachinery/commit/18501324) Fix admission webhook flag (#359) +- [731c6e1b](https://github.com/stashed/apimachinery/commit/731c6e1b) Support --enable-admission-webhook=false (#358) +- [41a93897](https://github.com/stashed/apimachinery/commit/41a93897) Sync chart to stable charts repo (#356) +- [f2cb99dd](https://github.com/stashed/apimachinery/commit/f2cb99dd) Use restic 0.8.3 (#355) +- [ce618fd3](https://github.com/stashed/apimachinery/commit/ce618fd3) Update README.md (#352) +- [9b82c516](https://github.com/stashed/apimachinery/commit/9b82c516) Document user roles (#348) +- [ab638a29](https://github.com/stashed/apimachinery/commit/ab638a29) Add upgrade instructions. +- [9369e1bb](https://github.com/stashed/apimachinery/commit/9369e1bb) Add changelog for 0.7.0-rc.0 (#347) +- [03bd2d5f](https://github.com/stashed/apimachinery/commit/03bd2d5f) Implement offline backup for multiple replica (#335) +- [628b1713](https://github.com/stashed/apimachinery/commit/628b1713) Update readme to point to 0.6.4 (#345) +- [68f09062](https://github.com/stashed/apimachinery/commit/68f09062) Don't block deletion of owner by default (#342) +- [7a8f7e29](https://github.com/stashed/apimachinery/commit/7a8f7e29) Skip generating UpdateStatus method (#341) +- [ffd0701b](https://github.com/stashed/apimachinery/commit/ffd0701b) Remove internal types (#340) +- [9b497a83](https://github.com/stashed/apimachinery/commit/9b497a83) Use rbac/v1 apis (#339) +- [5f1a8d58](https://github.com/stashed/apimachinery/commit/5f1a8d58) Add user roles (#338) +- [e909732f](https://github.com/stashed/apimachinery/commit/e909732f) Use restic 0.8.2 (#337) +- [f811c096](https://github.com/stashed/apimachinery/commit/f811c096) Use official code generator scripts (#336) +- [45fe6695](https://github.com/stashed/apimachinery/commit/45fe6695) Update rbac-list.yaml +- [4bab2035](https://github.com/stashed/apimachinery/commit/4bab2035) Update charts to support api registration (#334) +- [e882132d](https://github.com/stashed/apimachinery/commit/e882132d) Fix e2e tests after webhook merger (#333) +- [327dc4d6](https://github.com/stashed/apimachinery/commit/327dc4d6) Ensure stash can be run locally (#332) +- [8b69538e](https://github.com/stashed/apimachinery/commit/8b69538e) Label all stash installer resources +- [201a9e23](https://github.com/stashed/apimachinery/commit/201a9e23) Update Grafana dashboard (#330) +- [ab583820](https://github.com/stashed/apimachinery/commit/ab583820) Delete all stash installer resources +- [f933585b](https://github.com/stashed/apimachinery/commit/f933585b) Use binary operator for checking stauts of semver command +- [3e9418ab](https://github.com/stashed/apimachinery/commit/3e9418ab) Leave secure port unset +- [fedfa749](https://github.com/stashed/apimachinery/commit/fedfa749) Use ${} form for onessl envsubst +- [a6a0a3ec](https://github.com/stashed/apimachinery/commit/a6a0a3ec) Vendor client-go auth pkg (#331) +- [f6f821f3](https://github.com/stashed/apimachinery/commit/f6f821f3) Merge admission webhook and operator into one binary (#329) +- [adf04545](https://github.com/stashed/apimachinery/commit/adf04545) Use envsubst from onessl +- [f90dc3c1](https://github.com/stashed/apimachinery/commit/f90dc3c1) Install admission webhook for Kubernetes >=1.9.0 +- [d4ff727c](https://github.com/stashed/apimachinery/commit/d4ff727c) Merge uninstall script into the stash.sh script (#328) +- [98e2b892](https://github.com/stashed/apimachinery/commit/98e2b892) Implement Pause Restic (#315) +- [f2d86207](https://github.com/stashed/apimachinery/commit/f2d86207) Copy generic-admission-server into pkg (#318) +- [2381c8bc](https://github.com/stashed/apimachinery/commit/2381c8bc) Use shared infromer factory (#317) +- [da343f4e](https://github.com/stashed/apimachinery/commit/da343f4e) Support self-signed ca cert for backends (#294) +- [e3ef7e8e](https://github.com/stashed/apimachinery/commit/e3ef7e8e) Use GetBaseVersion method from kutil (#316) +- [0c3b7cc6](https://github.com/stashed/apimachinery/commit/0c3b7cc6) Update install.md +- [e3e52e79](https://github.com/stashed/apimachinery/commit/e3e52e79) Remove system prefix from admission server rbac +- [373f7a1f](https://github.com/stashed/apimachinery/commit/373f7a1f) Fix webhook command description (#314) +- [57ddc07c](https://github.com/stashed/apimachinery/commit/57ddc07c) Use rbac/v1beta1 api. (#313) +- [5a58a810](https://github.com/stashed/apimachinery/commit/5a58a810) Reduce log level for admission webhook +- [0dee8016](https://github.com/stashed/apimachinery/commit/0dee8016) Support Create & Update operations in admission webhook (#312) +- [2af05ccb](https://github.com/stashed/apimachinery/commit/2af05ccb) Merge webhook plugins into one. (#311) +- [326a2151](https://github.com/stashed/apimachinery/commit/326a2151) Fix installer script +- [f13b1a52](https://github.com/stashed/apimachinery/commit/f13b1a52) Support private docker registry in installer (#310) +- [bb97b9f2](https://github.com/stashed/apimachinery/commit/bb97b9f2) Add ValidatingAdmissionWebhook for Stash CRDs (#299) +- [5d6fe487](https://github.com/stashed/apimachinery/commit/5d6fe487) Compress go binaries (#309) +- [be4c3242](https://github.com/stashed/apimachinery/commit/be4c3242) Merge commit 'dd01a18d6821b218669437b491e71eff9cf82c89' +- [a7add4ea](https://github.com/stashed/apimachinery/commit/a7add4ea) Merge commit '6cd6efaa2491aea24a0f7f588c86b0ff5ff03283' +- [02c433af](https://github.com/stashed/apimachinery/commit/02c433af) Rename --initializer flag to --enable-initializer (#308) +- [d711439e](https://github.com/stashed/apimachinery/commit/d711439e) Remove STASH_ROLE_TYPE from installer scripts (#307) +- [b607b2ab](https://github.com/stashed/apimachinery/commit/b607b2ab) Use rbac/v1 api (#306) +- [eb4e3fac](https://github.com/stashed/apimachinery/commit/eb4e3fac) Use kubectl auth reconcile (#305) +- [c90dd8e1](https://github.com/stashed/apimachinery/commit/c90dd8e1) Added support for private docker registry (#300) +- [6a624c75](https://github.com/stashed/apimachinery/commit/6a624c75) Add --initializer flag to installer (#304) +- [89115fb2](https://github.com/stashed/apimachinery/commit/89115fb2) Prepare docs for 0.7.0-alpha.0 (#302) +- [9b0130f4](https://github.com/stashed/apimachinery/commit/9b0130f4) Change installer script (#301) +- [e9233056](https://github.com/stashed/apimachinery/commit/e9233056) Merge commit '5e307d69dbf7e02331cc5bc60154e79a52285060' +- [6fda8eb8](https://github.com/stashed/apimachinery/commit/6fda8eb8) Remove TPR to CRD migrator (#298) +- [7216f7b7](https://github.com/stashed/apimachinery/commit/7216f7b7) Update dependencies to Kubernetes 1.9 (#297) +- [f43201d5](https://github.com/stashed/apimachinery/commit/f43201d5) Prepare docs for 0.6.3 +- [ef1196ba](https://github.com/stashed/apimachinery/commit/ef1196ba) Fixed parsing argument error (#291) +- [d88d57cc](https://github.com/stashed/apimachinery/commit/d88d57cc) Update reference docs +- [7398bce7](https://github.com/stashed/apimachinery/commit/7398bce7) Update appscode/go log wrapper (#287) +- [85deef48](https://github.com/stashed/apimachinery/commit/85deef48) Fix inline volumeSource marshalling for LocalSpec (#289) +- [d62b7a77](https://github.com/stashed/apimachinery/commit/d62b7a77) Fix roadmap link +- [96211379](https://github.com/stashed/apimachinery/commit/96211379) Added Grafana Stash overview dashboard (#286) +- [76878d55](https://github.com/stashed/apimachinery/commit/76878d55) Prepare docs for 0.6.2 release (#278) +- [976257be](https://github.com/stashed/apimachinery/commit/976257be) Merge pull request #277 from whereisaaron/master +- [0d5b2f92](https://github.com/stashed/apimachinery/commit/0d5b2f92) Update Helm chart to use newer 'fullname' template that avoid duplicate (e.g. 'stash-stash-...') resource names +- [f1c7ab64](https://github.com/stashed/apimachinery/commit/f1c7ab64) Fix RBAC roles in chart (#276) +- [8f13869d](https://github.com/stashed/apimachinery/commit/8f13869d) Update initializer.md +- [43c1a121](https://github.com/stashed/apimachinery/commit/43c1a121) Update initializer.md +- [3031ea25](https://github.com/stashed/apimachinery/commit/3031ea25) Fix new restic format in upgrade docs (#274) +- [d8bdd9ed](https://github.com/stashed/apimachinery/commit/d8bdd9ed) Reduce operator permissions for service accounts (#270) +- [33e15c12](https://github.com/stashed/apimachinery/commit/33e15c12) Fix formatting of uninstall.md (#269) +- [ac0bcc4e](https://github.com/stashed/apimachinery/commit/ac0bcc4e) Prepare docs for 0.6.1 (#268) +- [bf7406f9](https://github.com/stashed/apimachinery/commit/bf7406f9) Fix upgrade instructions. +- [d1814caa](https://github.com/stashed/apimachinery/commit/d1814caa) Detect analytics client id using env vars (#265) +- [0a320152](https://github.com/stashed/apimachinery/commit/0a320152) Cleanup release script +- [197c7f90](https://github.com/stashed/apimachinery/commit/197c7f90) Prepare docs for 0.6.0 release (#264) +- [68fa5fd3](https://github.com/stashed/apimachinery/commit/68fa5fd3) Reorganize docs (#263) +- [8a189576](https://github.com/stashed/apimachinery/commit/8a189576) Add support for B2 (#262) +- [7dabc027](https://github.com/stashed/apimachinery/commit/7dabc027) Update restic website link (#261) +- [450ed8a7](https://github.com/stashed/apimachinery/commit/450ed8a7) Revendor kutil +- [1411550c](https://github.com/stashed/apimachinery/commit/1411550c) Fix doc +- [c751baa0](https://github.com/stashed/apimachinery/commit/c751baa0) Update docs for unified LocalSpec (#260) +- [d614bdb6](https://github.com/stashed/apimachinery/commit/d614bdb6) Unify LocalSpec and RecoveredVolume (#259) +- [7a8cfd9f](https://github.com/stashed/apimachinery/commit/7a8cfd9f) Remove restic-dependency from recovery (#258) +- [a24707a0](https://github.com/stashed/apimachinery/commit/a24707a0) Update restic version to 0.8.1 (#257) +- [61e86c73](https://github.com/stashed/apimachinery/commit/61e86c73) Use cmp methods from kutil (#255) +- [2677c1d5](https://github.com/stashed/apimachinery/commit/2677c1d5) Remove TryPatch methods (#254) +- [7706452d](https://github.com/stashed/apimachinery/commit/7706452d) Use verb type for mutation (#251) +- [2b3eff73](https://github.com/stashed/apimachinery/commit/2b3eff73) Use CreateOrPatchCronJob from kutil (#250) +- [d86c9ddb](https://github.com/stashed/apimachinery/commit/d86c9ddb) Indicate mutation in PATCH helper method return (#249) +- [98f87c60](https://github.com/stashed/apimachinery/commit/98f87c60) Update RBAC for analytics +- [b1a6b198](https://github.com/stashed/apimachinery/commit/b1a6b198) Simplify clientID generation for analytics (#247) +- [dfbd6691](https://github.com/stashed/apimachinery/commit/dfbd6691) Set analytics clientID (#246) +- [266190d0](https://github.com/stashed/apimachinery/commit/266190d0) Update README.md +- [6e56e5d4](https://github.com/stashed/apimachinery/commit/6e56e5d4) Cleanup docs +- [d7fd65de](https://github.com/stashed/apimachinery/commit/d7fd65de) Reorganize docs (#245) +- [e314b186](https://github.com/stashed/apimachinery/commit/e314b186) Upgrade procedure for 0.5.1 to 0.6.0 (#243) +- [dfc5eeba](https://github.com/stashed/apimachinery/commit/dfc5eeba) Update docs (#236) +- [e30693ac](https://github.com/stashed/apimachinery/commit/e30693ac) Fix retentionPolicyName not found error (#242) +- [d9d63b9f](https://github.com/stashed/apimachinery/commit/d9d63b9f) Lower case workload.kind in prefix (#240) +- [e9796acc](https://github.com/stashed/apimachinery/commit/e9796acc) Use RegisterCRDs helper (#239) +- [a347ce80](https://github.com/stashed/apimachinery/commit/a347ce80) Change left_menu -> menu_name (#235) +- [f5a15dd4](https://github.com/stashed/apimachinery/commit/f5a15dd4) Revendor dependencies (#234) +- [3a63651b](https://github.com/stashed/apimachinery/commit/3a63651b) Implement offline backup (#229) +- [fd5b997c](https://github.com/stashed/apimachinery/commit/fd5b997c) Add aliases for README file (#233) +- [9fa96d42](https://github.com/stashed/apimachinery/commit/9fa96d42) Add Docs Front Matter for 0.5.1 (#231) +- [20f207ea](https://github.com/stashed/apimachinery/commit/20f207ea) Update bundles restic to 0.8.0 (#232) +- [46b995a0](https://github.com/stashed/apimachinery/commit/46b995a0) Revendor kutil (#230) +- [06f4dade](https://github.com/stashed/apimachinery/commit/06f4dade) Run `restic check` once every 3 days (#223) +- [88d0679a](https://github.com/stashed/apimachinery/commit/88d0679a) Record recovery status for individual FileGroup (#222) +- [5bbeab6c](https://github.com/stashed/apimachinery/commit/5bbeab6c) PollInfinitely for recovery job to succeed +- [d18c00b9](https://github.com/stashed/apimachinery/commit/d18c00b9) Dynamically create stash-sidecar ClusterRole in operator (#221) +- [51530bed](https://github.com/stashed/apimachinery/commit/51530bed) Implement workload initializer in stash operator (#207) +- [2739bf10](https://github.com/stashed/apimachinery/commit/2739bf10) Leader election for deployment, replica set and rc (#206) +- [836f8395](https://github.com/stashed/apimachinery/commit/836f8395) Generate docs +- [fd5261e5](https://github.com/stashed/apimachinery/commit/fd5261e5) Implement Recovery for Restic Backup (#202) +- [44062f68](https://github.com/stashed/apimachinery/commit/44062f68) Update install.md +- [1fc29cbf](https://github.com/stashed/apimachinery/commit/1fc29cbf) Update install.md +- [3bf7fb00](https://github.com/stashed/apimachinery/commit/3bf7fb00) Update install.md +- [14ad778f](https://github.com/stashed/apimachinery/commit/14ad778f) Update chart +- [5b35477e](https://github.com/stashed/apimachinery/commit/5b35477e) Update install.md +- [59f2943c](https://github.com/stashed/apimachinery/commit/59f2943c) Update _helpers.tpl +- [a80b1f9d](https://github.com/stashed/apimachinery/commit/a80b1f9d) Support imagePullSecrets in chart +- [dee95f21](https://github.com/stashed/apimachinery/commit/dee95f21) Update _helpers.tpl +- [1fd9876f](https://github.com/stashed/apimachinery/commit/1fd9876f) Make stash chart namespaced (#210) +- [ea616292](https://github.com/stashed/apimachinery/commit/ea616292) Update docs to point to 0.4.2 release +- [1458c97a](https://github.com/stashed/apimachinery/commit/1458c97a) Update codegen.sh +- [8e1ca40b](https://github.com/stashed/apimachinery/commit/8e1ca40b) Use typed versioned client for CRD +- [ed12717a](https://github.com/stashed/apimachinery/commit/ed12717a) Change `k8s.io/api/core/v1` pkg alias to core (#204) +- [d938ead0](https://github.com/stashed/apimachinery/commit/d938ead0) Use client-go 5.x +- [499b759a](https://github.com/stashed/apimachinery/commit/499b759a) Update rbac.md +- [da60e496](https://github.com/stashed/apimachinery/commit/da60e496) Add recovery CRD (#201) +- [9b5b6ba9](https://github.com/stashed/apimachinery/commit/9b5b6ba9) Merge commit 'bf3f3307acbd69e5147db8abdb75b1529147f0c5' +- [acd149eb](https://github.com/stashed/apimachinery/commit/acd149eb) Clarify support for DO +- [9d65b92b](https://github.com/stashed/apimachinery/commit/9d65b92b) Prepare docs for 0.5.1 +- [8eedf90f](https://github.com/stashed/apimachinery/commit/8eedf90f) Update RBAC permissions +- [041e109b](https://github.com/stashed/apimachinery/commit/041e109b) Add label to installer objects in rbac mode +- [fad14779](https://github.com/stashed/apimachinery/commit/fad14779) Clarify that --tag foo,tag bar style tags are not supported. (#199) +- [0da46f7d](https://github.com/stashed/apimachinery/commit/0da46f7d) Set hostname based on resource type (#198) +- [d04f26f3](https://github.com/stashed/apimachinery/commit/d04f26f3) Manage RoleBinding for rbac enabled cluster (#197) +- [44b9ea19](https://github.com/stashed/apimachinery/commit/44b9ea19) Update install.md +- [1c098d38](https://github.com/stashed/apimachinery/commit/1c098d38) Update install.md +- [002ee683](https://github.com/stashed/apimachinery/commit/002ee683) Document how to detect operator version (#196) +- [a7fd4940](https://github.com/stashed/apimachinery/commit/a7fd4940) Prepare docs for 0.5.0 release +- [a0cea425](https://github.com/stashed/apimachinery/commit/a0cea425) Rename Scheduler to Controller +- [c094e627](https://github.com/stashed/apimachinery/commit/c094e627) Stop dumping env vars +- [43881e0b](https://github.com/stashed/apimachinery/commit/43881e0b) Prepare docs for 0.5.0-beta.3 release +- [d1654675](https://github.com/stashed/apimachinery/commit/d1654675) Use workqueue for scheduler (#194) +- [7d27c516](https://github.com/stashed/apimachinery/commit/7d27c516) Revise RBAC permissions +- [d53e59a8](https://github.com/stashed/apimachinery/commit/d53e59a8) Prepare docs for 0.5.0-beta.2 +- [fb496b89](https://github.com/stashed/apimachinery/commit/fb496b89) Update tutorial.md (#186) +- [717ee431](https://github.com/stashed/apimachinery/commit/717ee431) Add tests for DO (#193) +- [0306530e](https://github.com/stashed/apimachinery/commit/0306530e) Use object reference to write events +- [dc1fe141](https://github.com/stashed/apimachinery/commit/dc1fe141) Prepare docs for 0.5.0-beta.1 +- [b0f94976](https://github.com/stashed/apimachinery/commit/b0f94976) Fix prometheus metrics collection (#192) +- [060a4748](https://github.com/stashed/apimachinery/commit/060a4748) Replace reflect.Equal with github.com/google/go-cmp (#188) +- [0002e64c](https://github.com/stashed/apimachinery/commit/0002e64c) Skip ReplicaSet owned by Deployments (#187) +- [daf989e6](https://github.com/stashed/apimachinery/commit/daf989e6) Merge commit '32217c844015816b86c46a8d74a175c42f0e307a' +- [cfea8b51](https://github.com/stashed/apimachinery/commit/cfea8b51) Prepare docs for 5.0.0-beta.0 (#185) +- [8cac1df7](https://github.com/stashed/apimachinery/commit/8cac1df7) Rename LastAppliedConfiguration +- [d8ed50dc](https://github.com/stashed/apimachinery/commit/d8ed50dc) Fix e2e tests (#183) +- [9dcef9ef](https://github.com/stashed/apimachinery/commit/9dcef9ef) Use workqueue (#182) +- [c37c155b](https://github.com/stashed/apimachinery/commit/c37c155b) Use Deployment from apps/v1beta1 (#181) +- [7f4653e9](https://github.com/stashed/apimachinery/commit/7f4653e9) Delete *.generated.go files for ugorji (#180) +- [f98e1f7e](https://github.com/stashed/apimachinery/commit/f98e1f7e) Use WaitForCRDReady from kutil (#179) +- [003980d8](https://github.com/stashed/apimachinery/commit/003980d8) Only watch apps/v1beta1 Deployment (#178) +- [1e5eb1ba](https://github.com/stashed/apimachinery/commit/1e5eb1ba) Move kutil to client package (#177) +- [87b78d76](https://github.com/stashed/apimachinery/commit/87b78d76) Generate ugorji stuff (#176) +- [a92313c0](https://github.com/stashed/apimachinery/commit/a92313c0) Remove kubernetes/code-generator from builddeps +- [e74eeb0e](https://github.com/stashed/apimachinery/commit/e74eeb0e) Prepare docs for 0.5.0 (#174) +- [02cd8fe9](https://github.com/stashed/apimachinery/commit/02cd8fe9) Install stash as a critical addon (#173) +- [f1b74850](https://github.com/stashed/apimachinery/commit/f1b74850) Update chart to add roles for CRD +- [5f3061a2](https://github.com/stashed/apimachinery/commit/5f3061a2) Use Namespace() method from kutil. +- [16eaf13c](https://github.com/stashed/apimachinery/commit/16eaf13c) Add release script. +- [2f9775fd](https://github.com/stashed/apimachinery/commit/2f9775fd) Prepare docs for 0.5.0-rc.0 +- [60949d9f](https://github.com/stashed/apimachinery/commit/60949d9f) Revendor kutil. +- [6c3f64fa](https://github.com/stashed/apimachinery/commit/6c3f64fa) Set RESTIC_VER to 0.7.3 (#172) +- [0676e71f](https://github.com/stashed/apimachinery/commit/0676e71f) Refresh charts to match recent convention (#171) +- [ceb87bf7](https://github.com/stashed/apimachinery/commit/ceb87bf7) Fix deployment name in tutorial (#169) +- [081e1fe1](https://github.com/stashed/apimachinery/commit/081e1fe1) Update kutil (#170) +- [5cfd7024](https://github.com/stashed/apimachinery/commit/5cfd7024) Set RESTIC_VER to 0.7.2 +- [7ed720e6](https://github.com/stashed/apimachinery/commit/7ed720e6) Use object ref for Restic +- [e391de24](https://github.com/stashed/apimachinery/commit/e391de24) Fix command in Developer-guide (#168) +- [4fc51330](https://github.com/stashed/apimachinery/commit/4fc51330) Set root scope kinds +- [25b61d96](https://github.com/stashed/apimachinery/commit/25b61d96) Use apis/v1alpha1 instead of internal version (#167) +- [51d82b9b](https://github.com/stashed/apimachinery/commit/51d82b9b) Remove resource:path (#166) +- [fc386932](https://github.com/stashed/apimachinery/commit/fc386932) Use kubernetes/code-generator (#163) +- [0e086fec](https://github.com/stashed/apimachinery/commit/0e086fec) Update kutil +- [819b0364](https://github.com/stashed/apimachinery/commit/819b0364) Expose resync-period as flag +- [ffdecbc7](https://github.com/stashed/apimachinery/commit/ffdecbc7) Remove pkg/analytics +- [4a448fbd](https://github.com/stashed/apimachinery/commit/4a448fbd) Move analytics collector to root command (#164) +- [378e869a](https://github.com/stashed/apimachinery/commit/378e869a) Revendor k8s.io/apiextensions-apiserver (#162) +- [a9b2bb4a](https://github.com/stashed/apimachinery/commit/a9b2bb4a) Migrate TPR to CRD (#160) +- [42e52e41](https://github.com/stashed/apimachinery/commit/42e52e41) Fix Restic (#159) +- [9f04a977](https://github.com/stashed/apimachinery/commit/9f04a977) Update kutil dependency (#158) +- [772866f7](https://github.com/stashed/apimachinery/commit/772866f7) Use CheckAPIVersion() (#157) +- [35bd52a0](https://github.com/stashed/apimachinery/commit/35bd52a0) Use PATCH api instead of UPDATE (#156) +- [0c4d7901](https://github.com/stashed/apimachinery/commit/0c4d7901) Check version using semver library (#152) +- [dee5c57d](https://github.com/stashed/apimachinery/commit/dee5c57d) Update client-go to 4.0.0 (#150) +- [b351150d](https://github.com/stashed/apimachinery/commit/b351150d) Update build commands for restic. (#149) +- [1f3b2d7c](https://github.com/stashed/apimachinery/commit/1f3b2d7c) Update client-go to 3.0.0 from 3.0.0-beta (#148) +- [59e7171e](https://github.com/stashed/apimachinery/commit/59e7171e) Add DCO +- [22ed31d1](https://github.com/stashed/apimachinery/commit/22ed31d1) Fix typos of tutorial.md file (#138) +- [757186ec](https://github.com/stashed/apimachinery/commit/757186ec) Add uninstall.sh script (#144) +- [d3328e52](https://github.com/stashed/apimachinery/commit/d3328e52) Use console type instead of sh +- [1d3c6c27](https://github.com/stashed/apimachinery/commit/1d3c6c27) Prepare docs for 0.4.1 release +- [c1906d66](https://github.com/stashed/apimachinery/commit/c1906d66) Build binary inside Docker image +- [7c528e4a](https://github.com/stashed/apimachinery/commit/7c528e4a) Merge commit 'b8c45d0d4379587a31302b834334047cc77e59db' +- [ad005cab](https://github.com/stashed/apimachinery/commit/ad005cab) Revendor forked robfig/cron (#139) +- [46720dff](https://github.com/stashed/apimachinery/commit/46720dff) Update stash-without-rbac.yaml +- [244f7ca8](https://github.com/stashed/apimachinery/commit/244f7ca8) Add omitempty for Local storage +- [8f479b3c](https://github.com/stashed/apimachinery/commit/8f479b3c) Move resource consts to api pkg +- [ace063eb](https://github.com/stashed/apimachinery/commit/ace063eb) Fix Fake restic resource Url (#137) +- [7ec252b1](https://github.com/stashed/apimachinery/commit/7ec252b1) Clarify bucket location +- [6d31b48b](https://github.com/stashed/apimachinery/commit/6d31b48b) Update gcs-restic.yaml +- [bc394d4a](https://github.com/stashed/apimachinery/commit/bc394d4a) Update backends.md +- [98d90308](https://github.com/stashed/apimachinery/commit/98d90308) Update tutorial.md +- [9a6ea80f](https://github.com/stashed/apimachinery/commit/9a6ea80f) Update backends.md +- [191dd168](https://github.com/stashed/apimachinery/commit/191dd168) Update docs to 0.4.0 release. +- [0ebf939c](https://github.com/stashed/apimachinery/commit/0ebf939c) Update docs to remove setting name for local.VolumeSource +- [7369ffde](https://github.com/stashed/apimachinery/commit/7369ffde) Support selecting restic branch +- [b038ac58](https://github.com/stashed/apimachinery/commit/b038ac58) Prepare docs for 0.4.0 release. +- [df04e61f](https://github.com/stashed/apimachinery/commit/df04e61f) Update concept.md +- [168b1d51](https://github.com/stashed/apimachinery/commit/168b1d51) Rename RepositorySecretName to StorageSecretName (#135) +- [b783c47b](https://github.com/stashed/apimachinery/commit/b783c47b) Rename Volume to VolumeSource (#134) +- [40340c60](https://github.com/stashed/apimachinery/commit/40340c60) Update charts +- [b2e9e439](https://github.com/stashed/apimachinery/commit/b2e9e439) Use VolumeSource instead of Volume for Local backend. (#132) +- [c1a10199](https://github.com/stashed/apimachinery/commit/c1a10199) Update concept.md +- [522e057b](https://github.com/stashed/apimachinery/commit/522e057b) Fix linting issues in chart +- [335b721c](https://github.com/stashed/apimachinery/commit/335b721c) Add String() method to PrefixType. +- [158bdabd](https://github.com/stashed/apimachinery/commit/158bdabd) Remove unused type Source +- [ebee1005](https://github.com/stashed/apimachinery/commit/ebee1005) Update readme +- [13ebd392](https://github.com/stashed/apimachinery/commit/13ebd392) Various corrections to chart based on code review. +- [a96ddcda](https://github.com/stashed/apimachinery/commit/a96ddcda) Prepare docs for 0.3.1 release. +- [dcf34f1c](https://github.com/stashed/apimachinery/commit/dcf34f1c) Support setting compute resources for sidecar (#129) +- [ef468bc0](https://github.com/stashed/apimachinery/commit/ef468bc0) Update chart with rbac +- [fd9d6c02](https://github.com/stashed/apimachinery/commit/fd9d6c02) Update rbac.md +- [f743cb66](https://github.com/stashed/apimachinery/commit/f743cb66) Fix RBAC docs (#127) +- [3cd9c508](https://github.com/stashed/apimachinery/commit/3cd9c508) Update release.md +- [6ff18600](https://github.com/stashed/apimachinery/commit/6ff18600) Merge commit 'fba07b3994b0e1fd3a95c91d890353aa23a0f3c1' +- [0fe79c4b](https://github.com/stashed/apimachinery/commit/0fe79c4b) Print commit timestamp with version command +- [7379cec6](https://github.com/stashed/apimachinery/commit/7379cec6) Prepare docs for 0.3.0 release +- [8632871c](https://github.com/stashed/apimachinery/commit/8632871c) Document RBAC +- [703edc49](https://github.com/stashed/apimachinery/commit/703edc49) Document behavior in case of multiple Restic +- [0282621a](https://github.com/stashed/apimachinery/commit/0282621a) Document e2e test setup +- [8f320ccc](https://github.com/stashed/apimachinery/commit/8f320ccc) Document swift (#124) +- [b6068d83](https://github.com/stashed/apimachinery/commit/b6068d83) Remove support for B2 & Rest server for now. +- [f3f02ecb](https://github.com/stashed/apimachinery/commit/f3f02ecb) Remove Location choice for GCS +- [2ad0c18c](https://github.com/stashed/apimachinery/commit/2ad0c18c) Fix spelling +- [a56137ea](https://github.com/stashed/apimachinery/commit/a56137ea) Update backends.md +- [a0e3f118](https://github.com/stashed/apimachinery/commit/a0e3f118) Update uninstall.md +- [0c270985](https://github.com/stashed/apimachinery/commit/0c270985) Update uninstall.md +- [bca4db3f](https://github.com/stashed/apimachinery/commit/bca4db3f) Use TPR labels to verify installation +- [6cdbd8f5](https://github.com/stashed/apimachinery/commit/6cdbd8f5) Don't fail scheduler if bad credetials are given +- [a61a45eb](https://github.com/stashed/apimachinery/commit/a61a45eb) Change mount path for labels to /etc/stash +- [84c1149a](https://github.com/stashed/apimachinery/commit/84c1149a) Fix remote backend repository format +- [58eeed1c](https://github.com/stashed/apimachinery/commit/58eeed1c) Part 6 - Update docs (#121) +- [21034ebe](https://github.com/stashed/apimachinery/commit/21034ebe) Update docs (#120) +- [f24a1f03](https://github.com/stashed/apimachinery/commit/f24a1f03) Update docs for 0.2.0 release +- [9478e1d6](https://github.com/stashed/apimachinery/commit/9478e1d6) Various bug fixes (#118) +- [ee8fca49](https://github.com/stashed/apimachinery/commit/ee8fca49) Mention swift in readme +- [1b5dd702](https://github.com/stashed/apimachinery/commit/1b5dd702) Update pitch (#117) +- [f6153296](https://github.com/stashed/apimachinery/commit/f6153296) Various changes to RetentionPolicy (#116) +- [943cf880](https://github.com/stashed/apimachinery/commit/943cf880) Update ROADMAP.md +- [5b1bf69e](https://github.com/stashed/apimachinery/commit/5b1bf69e) Update tutorial.md +- [46047d57](https://github.com/stashed/apimachinery/commit/46047d57) Update ROADMAP.md +- [91fc8541](https://github.com/stashed/apimachinery/commit/91fc8541) Update workloads.md +- [6e004526](https://github.com/stashed/apimachinery/commit/6e004526) Part 5 - User Guide (#114) +- [a1d825b5](https://github.com/stashed/apimachinery/commit/a1d825b5) Update ROADMAP.md +- [f8c093a4](https://github.com/stashed/apimachinery/commit/f8c093a4) Part 4- User Guide (#113) +- [735536c4](https://github.com/stashed/apimachinery/commit/735536c4) Part 3 - User Guide (#110) +- [53c775b3](https://github.com/stashed/apimachinery/commit/53c775b3) Part - 2 of User guide (#99) +- [b9d61921](https://github.com/stashed/apimachinery/commit/b9d61921) Update user guide (#94) +- [38612df3](https://github.com/stashed/apimachinery/commit/38612df3) Update release.md +- [612a019b](https://github.com/stashed/apimachinery/commit/612a019b) Update Prometheus job name to use restic ns & name (#93) +- [47b3b9fe](https://github.com/stashed/apimachinery/commit/47b3b9fe) Update README.md +- [6c186ba0](https://github.com/stashed/apimachinery/commit/6c186ba0) Use app & release name labels together in chart +- [b5ed18bc](https://github.com/stashed/apimachinery/commit/b5ed18bc) Update chart readme +- [09c69811](https://github.com/stashed/apimachinery/commit/09c69811) Update Stash chart (#89) +- [a3d0ca9a](https://github.com/stashed/apimachinery/commit/a3d0ca9a) Update CONTRIBUTING.md +- [be57d29e](https://github.com/stashed/apimachinery/commit/be57d29e) Update contribution guide +- [d7cc52af](https://github.com/stashed/apimachinery/commit/d7cc52af) Fix dev guide (#88) +- [b51e6516](https://github.com/stashed/apimachinery/commit/b51e6516) Add docs for commands (#90) +- [c7cac80e](https://github.com/stashed/apimachinery/commit/c7cac80e) Update stash.yaml +- [b6108163](https://github.com/stashed/apimachinery/commit/b6108163) Update stash.yaml +- [0d6b20fc](https://github.com/stashed/apimachinery/commit/0d6b20fc) Change stash version to 0.1.0 +- [aede78dd](https://github.com/stashed/apimachinery/commit/aede78dd) Cleanup test commands +- [272cd162](https://github.com/stashed/apimachinery/commit/272cd162) Add e2e tests for major cloud providers (#84) +- [75c10a5c](https://github.com/stashed/apimachinery/commit/75c10a5c) Add node selector for DaemonSet e2e test +- [51052056](https://github.com/stashed/apimachinery/commit/51052056) Check for successful backup events +- [a22f6c68](https://github.com/stashed/apimachinery/commit/a22f6c68) Fix e2e tests (#83) +- [b4a8af40](https://github.com/stashed/apimachinery/commit/b4a8af40) Add /snapshots endpoint in operator (#82) +- [a6571440](https://github.com/stashed/apimachinery/commit/a6571440) Mount scratchDir with operator (#80) +- [27e45297](https://github.com/stashed/apimachinery/commit/27e45297) Fix scheduler (#79) +- [5617d2ef](https://github.com/stashed/apimachinery/commit/5617d2ef) Test e2e tests (#76) +- [343b29e2](https://github.com/stashed/apimachinery/commit/343b29e2) Remove restic source downloaded for building binary +- [d66b5f7e](https://github.com/stashed/apimachinery/commit/d66b5f7e) Review analytics events. +- [d6c926e3](https://github.com/stashed/apimachinery/commit/d6c926e3) Remove unused and/or duplicate constants +- [97c801aa](https://github.com/stashed/apimachinery/commit/97c801aa) Add ginkgo based e2e tests (#70) +- [a636d882](https://github.com/stashed/apimachinery/commit/a636d882) Create a cli wrapper for restic (#74) +- [365f7478](https://github.com/stashed/apimachinery/commit/365f7478) Revise EnsureXXXSidecar methods (#73) +- [3c0ed950](https://github.com/stashed/apimachinery/commit/3c0ed950) Avoid pushing metrics if missing gateway URL +- [663a7f47](https://github.com/stashed/apimachinery/commit/663a7f47) Fix pushgateway --web.listen-address flag +- [6c120054](https://github.com/stashed/apimachinery/commit/6c120054) Use service account with operator pods +- [7b908422](https://github.com/stashed/apimachinery/commit/7b908422) Create RBAC objects for operator (#69) +- [b29d5e3a](https://github.com/stashed/apimachinery/commit/b29d5e3a) Push metrics to Prometheus push gateway (#67) +- [472a3396](https://github.com/stashed/apimachinery/commit/472a3396) Vendor go-sh dependency (#65) +- [90140fbe](https://github.com/stashed/apimachinery/commit/90140fbe) Use go-sh to execute restic commands (#63) +- [f8173749](https://github.com/stashed/apimachinery/commit/f8173749) Add scratchPad Dir & prefixHostname flags (#62) +- [25d006a7](https://github.com/stashed/apimachinery/commit/25d006a7) Support remote backends (#58) +- [6e13780f](https://github.com/stashed/apimachinery/commit/6e13780f) Expose metrics port from Docker +- [4ce7c500](https://github.com/stashed/apimachinery/commit/4ce7c500) Rename cron pkg to scheduler. +- [94e8dacc](https://github.com/stashed/apimachinery/commit/94e8dacc) Organize backup code. (#54) +- [72992971](https://github.com/stashed/apimachinery/commit/72992971) Synchronize scheduler reconfiguration (#53) +- [23a65283](https://github.com/stashed/apimachinery/commit/23a65283) Build master branch of restic +- [db3db58e](https://github.com/stashed/apimachinery/commit/db3db58e) Fix tag detection from Version +- [8ed3b177](https://github.com/stashed/apimachinery/commit/8ed3b177) Fix unit tests (#51) +- [b4c1e981](https://github.com/stashed/apimachinery/commit/b4c1e981) Update README.md +- [cf75d645](https://github.com/stashed/apimachinery/commit/cf75d645) Run watchers for preferred api group version kind (#50) +- [1d8ffe81](https://github.com/stashed/apimachinery/commit/1d8ffe81) Build restic from source by default (#49) +- [2ceb34ce](https://github.com/stashed/apimachinery/commit/2ceb34ce) Use updated docker build script format +- [1a5464f3](https://github.com/stashed/apimachinery/commit/1a5464f3) Merge commit '6d30c353f174f641159a88f6280f6be163a44cb4' +- [84da3fea](https://github.com/stashed/apimachinery/commit/84da3fea) Watch individual object types. (#48) +- [7e496f22](https://github.com/stashed/apimachinery/commit/7e496f22) Various code cleanup (#47) +- [7a3e1fc6](https://github.com/stashed/apimachinery/commit/7a3e1fc6) Reorganize cron controller (#46) +- [4a85189c](https://github.com/stashed/apimachinery/commit/4a85189c) Check docker image tag before starting operator (#45) +- [3c6c7cd6](https://github.com/stashed/apimachinery/commit/3c6c7cd6) Expose metrics from operator (#44) +- [4a3e8bc3](https://github.com/stashed/apimachinery/commit/4a3e8bc3) Run push gateway as a side-car for restik operator. (#43) +- [51509a81](https://github.com/stashed/apimachinery/commit/51509a81) Pre-install ca-certificates. +- [10fc9162](https://github.com/stashed/apimachinery/commit/10fc9162) Send analytics for start & stop events. +- [1bb9c517](https://github.com/stashed/apimachinery/commit/1bb9c517) Move all commands to root folder. +- [92778ce7](https://github.com/stashed/apimachinery/commit/92778ce7) Remove all reference to k8s.io/kubernetes repo. +- [e010916a](https://github.com/stashed/apimachinery/commit/e010916a) Move main.go to root folder. +- [ab5c7220](https://github.com/stashed/apimachinery/commit/ab5c7220) Merge commit 'e6c0614c629d719cc9300e71a668a43f42b37f68' +- [f86c51e0](https://github.com/stashed/apimachinery/commit/f86c51e0) Point to client-go in versioning policy. +- [28fc893b](https://github.com/stashed/apimachinery/commit/28fc893b) Update README.md +- [8b71920b](https://github.com/stashed/apimachinery/commit/8b71920b) Add analytics (#41) +- [e9dfb675](https://github.com/stashed/apimachinery/commit/e9dfb675) Use V1alpha1SchemeGroupVersion for Restik (#40) +- [cf30acfd](https://github.com/stashed/apimachinery/commit/cf30acfd) Fix registration of wrong group (#39) +- [33174390](https://github.com/stashed/apimachinery/commit/33174390) Upgrade restic version to 0.6.1 (#37) +- [d36ac63b](https://github.com/stashed/apimachinery/commit/d36ac63b) Use client-go (#36) +- [00673a90](https://github.com/stashed/apimachinery/commit/00673a90) Merge commit '4a5c3083fd86cbe409e8a0f8db02ebc92b403cdc' +- [6aa832cf](https://github.com/stashed/apimachinery/commit/6aa832cf) Create conversion_v1alpha1.go +- [792dd3cb](https://github.com/stashed/apimachinery/commit/792dd3cb) Create register_v1alpha1.go +- [5168d87f](https://github.com/stashed/apimachinery/commit/5168d87f) fmt api & client pkg-es +- [63bd2a07](https://github.com/stashed/apimachinery/commit/63bd2a07) Add version policy & analytics collection to readme +- [0d32a717](https://github.com/stashed/apimachinery/commit/0d32a717) Change api version to v1alpha1 (#30) +- [476b4e24](https://github.com/stashed/apimachinery/commit/476b4e24) Merge commit '7ade13456a688a54292abaf589c2e9f1804f7d8b' +- [11e8a6b0](https://github.com/stashed/apimachinery/commit/11e8a6b0) Rename clientset +- [352bce7f](https://github.com/stashed/apimachinery/commit/352bce7f) Rename function and structure (#29) +- [d9f6f85d](https://github.com/stashed/apimachinery/commit/d9f6f85d) Rename Backup into Restik (#28) +- [4bdd455c](https://github.com/stashed/apimachinery/commit/4bdd455c) Move api from k8s-addons (#27) +- [9fb9a1ea](https://github.com/stashed/apimachinery/commit/9fb9a1ea) Add Restik chart (#20) +- [ffd4e2f9](https://github.com/stashed/apimachinery/commit/ffd4e2f9) Bubble up errors to caller (#26) +- [f6e1f093](https://github.com/stashed/apimachinery/commit/f6e1f093) Update README.md +- [15723957](https://github.com/stashed/apimachinery/commit/15723957) Merge commit '958f7da4904598c85aabadf104c687e321eacb33' +- [3409789a](https://github.com/stashed/apimachinery/commit/3409789a) Use unversioned time (#23) +- [8e932b24](https://github.com/stashed/apimachinery/commit/8e932b24) Update design.md +- [4dff3b04](https://github.com/stashed/apimachinery/commit/4dff3b04) Update design.md +- [bf01be6f](https://github.com/stashed/apimachinery/commit/bf01be6f) example added (#19) +- [6c3712fd](https://github.com/stashed/apimachinery/commit/6c3712fd) Use restik api and client from k8s-addons (#18) +- [70b9e4ad](https://github.com/stashed/apimachinery/commit/70b9e4ad) Error print fix (#17) +- [c1cfa79d](https://github.com/stashed/apimachinery/commit/c1cfa79d) Check group registration Before Register Groups (#16) +- [16640d0c](https://github.com/stashed/apimachinery/commit/16640d0c) Add Restik docs (#15) +- [caf774ce](https://github.com/stashed/apimachinery/commit/caf774ce) Restik unit test, e2e test (#14) +- [36909bf0](https://github.com/stashed/apimachinery/commit/36909bf0) Restik create delete initial implementation (#12) +- [183b9a7b](https://github.com/stashed/apimachinery/commit/183b9a7b) Update restic to 0.5.0 +- [850131ea](https://github.com/stashed/apimachinery/commit/850131ea) Don't allow push with tags. +- [2111829a](https://github.com/stashed/apimachinery/commit/2111829a) Unify restic and restik docker images. +- [7d93e330](https://github.com/stashed/apimachinery/commit/7d93e330) Make restic executable. +- [ab14ac0b](https://github.com/stashed/apimachinery/commit/ab14ac0b) Build docker image (#11) +- [bc29563f](https://github.com/stashed/apimachinery/commit/bc29563f) Add links to proposal in readme +- [cafc63fb](https://github.com/stashed/apimachinery/commit/cafc63fb) Use cobra to structure restik commands. +- [8c6425b6](https://github.com/stashed/apimachinery/commit/8c6425b6) Clone skeleton from appscode/k3pc (#10) +- [ba60c6d4](https://github.com/stashed/apimachinery/commit/ba60c6d4) Merge commit 'a3e8a4a46d31a8c6e9fcceda85d3a55f36293f67' as 'hack/libbuild' + + + +## [stashed/catalog](https://github.com/stashed/catalog) + +### [v2020.08.27](https://github.com/stashed/catalog/releases/tag/v2020.08.27) + + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.10.0](https://github.com/stashed/cli/releases/tag/v0.10.0) + +- [8921695](https://github.com/stashed/cli/commit/8921695) Prepare for release v0.10.0 (#41) +- [bcff194](https://github.com/stashed/cli/commit/bcff194) Prepare for release v0.10.0-rc.2 (#40) +- [43e0370](https://github.com/stashed/cli/commit/43e0370) Prepare for release v0.10.0-rc.1 (#39) +- [2c90092](https://github.com/stashed/cli/commit/2c90092) Update README.md +- [fdfe6b8](https://github.com/stashed/cli/commit/fdfe6b8) Prepare for release v0.10.0-rc.0 (#38) +- [132ae15](https://github.com/stashed/cli/commit/132ae15) Fix build (#37) +- [77a76a7](https://github.com/stashed/cli/commit/77a76a7) Update Kubernetes v1.18.3 dependencies (#36) +- [efe0fc5](https://github.com/stashed/cli/commit/efe0fc5) Update Kubernetes v1.18.3 dependencies (#35) +- [d39bd97](https://github.com/stashed/cli/commit/d39bd97) Update Kubernetes v1.18.3 dependencies (#34) +- [3e074e7](https://github.com/stashed/cli/commit/3e074e7) Update Kubernetes v1.18.3 dependencies (#33) +- [f020137](https://github.com/stashed/cli/commit/f020137) Update Kubernetes v1.18.3 dependencies (#32) +- [99d27f0](https://github.com/stashed/cli/commit/99d27f0) Update Kubernetes v1.18.3 dependencies (#31) +- [3c78ec5](https://github.com/stashed/cli/commit/3c78ec5) Use actions/upload-artifact@v2 +- [e416569](https://github.com/stashed/cli/commit/e416569) Update to Kubernetes v1.18.3 (#30) +- [2baaae1](https://github.com/stashed/cli/commit/2baaae1) Update to Kubernetes v1.18.3 (#29) +- [44a1514](https://github.com/stashed/cli/commit/44a1514) Update to Kubernetes v1.18.3 (#28) +- [250372c](https://github.com/stashed/cli/commit/250372c) Prepare for release v0.10.0-beta.1 (#27) +- [3728110](https://github.com/stashed/cli/commit/3728110) Prepare for release v0.10.0-beta.0 (#26) +- [e7111a5](https://github.com/stashed/cli/commit/e7111a5) Update License +- [7fe1e07](https://github.com/stashed/cli/commit/7fe1e07) Update to Kubernetes v1.18.3 (#25) +- [66b3b46](https://github.com/stashed/cli/commit/66b3b46) Shorten command name for cli (#24) +- [b913cfc](https://github.com/stashed/cli/commit/b913cfc) Add workflow to update docs (#23) +- [1881c64](https://github.com/stashed/cli/commit/1881c64) Update update-release-tracker.sh +- [0548bdc](https://github.com/stashed/cli/commit/0548bdc) Update update-release-tracker.sh +- [b1b28ff](https://github.com/stashed/cli/commit/b1b28ff) Use GITHUB_BASE_REF to detect target branch +- [1e16b99](https://github.com/stashed/cli/commit/1e16b99) Add script to update release tracker on pr merge (#21) +- [f91bf33](https://github.com/stashed/cli/commit/f91bf33) Make release non-draft +- [d29bdb6](https://github.com/stashed/cli/commit/d29bdb6) Update .kodiak.toml +- [b727108](https://github.com/stashed/cli/commit/b727108) Update to Kubernetes v1.18.3 (#20) +- [f3f03aa](https://github.com/stashed/cli/commit/f3f03aa) Update to Kubernetes v1.18.3 +- [bcd7c5e](https://github.com/stashed/cli/commit/bcd7c5e) Create .kodiak.toml +- [9882aa2](https://github.com/stashed/cli/commit/9882aa2) Add blank line after license header (#19) +- [7774218](https://github.com/stashed/cli/commit/7774218) Update dev scripts (#18) +- [38eb35c](https://github.com/stashed/cli/commit/38eb35c) Run unit tests against SRC_PKGS +- [526949c](https://github.com/stashed/cli/commit/526949c) Update to Kubernetes v1.18.3 (#17) +- [fc3e6c5](https://github.com/stashed/cli/commit/fc3e6c5) Update crazy-max/ghaction-docker-buildx flag +- [3943575](https://github.com/stashed/cli/commit/3943575) Trigger the workflow on push or pull request + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v1](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v1) + +- [840132d](https://github.com/stashed/elasticsearch/commit/840132d) Prepare for release 5.6.4-v1 (#201) +- [51262cc](https://github.com/stashed/elasticsearch/commit/51262cc) Prepare for release 5.6.4-rc.20200827 (#192) +- [bcba1e7](https://github.com/stashed/elasticsearch/commit/bcba1e7) [cherry-pick] Upload charts without updating index (#184) +- [48d00db](https://github.com/stashed/elasticsearch/commit/48d00db) Prepare for release 5.6.4-rc.20200826 (#175) +- [46c78a6](https://github.com/stashed/elasticsearch/commit/46c78a6) [cherry-pick] Update README.md (#167) +- [df82b88](https://github.com/stashed/elasticsearch/commit/df82b88) Prepare for release 5.6.4-beta.20200826 (#158) +- [465a9f0](https://github.com/stashed/elasticsearch/commit/465a9f0) [cherry-pick] Update Stash installation link (#149) (#150) +- [4fd2af7](https://github.com/stashed/elasticsearch/commit/4fd2af7) [cherry-pick] Make image.tag in values.yaml file same as the $APP_VERSION (#132) (#141) +- [f9f6ab1](https://github.com/stashed/elasticsearch/commit/f9f6ab1) [cherry-pick] Fix output format + Add PreBackupActions logic (#131) (#133) +- [cf70698](https://github.com/stashed/elasticsearch/commit/cf70698) [cherry-pick] Update chart icon (#123) +- [f1c9257](https://github.com/stashed/elasticsearch/commit/f1c9257) [cherry-pick] Make chart registry configurable (#114) (#115) +- [4f6f04d](https://github.com/stashed/elasticsearch/commit/4f6f04d) Prepare for release 5.6.4-beta.20200709 (#105) +- [c0b63a8](https://github.com/stashed/elasticsearch/commit/c0b63a8) [cherry-pick] Build docker image in release workflow (#96) (#97) +- [7115da1](https://github.com/stashed/elasticsearch/commit/7115da1) Prepare for release 5.6.4-beta.20200708 (#87) +- [f5ab33d](https://github.com/stashed/elasticsearch/commit/f5ab33d) [cherry-pick] Publish to testing dir for alpha/beta releases (#78) (#79) +- [7d73d30](https://github.com/stashed/elasticsearch/commit/7d73d30) [cherry-pick] Update License (#69) (#70) +- [04e8a63](https://github.com/stashed/elasticsearch/commit/04e8a63) Add commands to update chart version (#68) +- [3a5cd78](https://github.com/stashed/elasticsearch/commit/3a5cd78) [cherry-pick] Update update-release-tracker.sh (#60) +- [77bb76e](https://github.com/stashed/elasticsearch/commit/77bb76e) [cherry-pick] Update update-release-tracker.sh (#52) +- [3b47ba6](https://github.com/stashed/elasticsearch/commit/3b47ba6) [cherry-pick] Update release.yml (#43) (#44) +- [444cb3b](https://github.com/stashed/elasticsearch/commit/444cb3b) [cherry-pick] Add script to update release tracker on pr merge (#34) (#35) +- [d349617](https://github.com/stashed/elasticsearch/commit/d349617) [cherry-pick] Add workflow to cherry pick commits to master (#25) (#26) +- [4038abd](https://github.com/stashed/elasticsearch/commit/4038abd) Fix chart release process (#24) +- [895a73f](https://github.com/stashed/elasticsearch/commit/895a73f) Update .kodiak.toml +- [6b9451c](https://github.com/stashed/elasticsearch/commit/6b9451c) Allow overwriting secret key via SecretTransformation (#23) +- [0fcb64e](https://github.com/stashed/elasticsearch/commit/0fcb64e) Make waitTimeout Configurable through flag (#22) +- [b3859b9](https://github.com/stashed/elasticsearch/commit/b3859b9) Create .kodiak.toml +- [c0f3b97](https://github.com/stashed/elasticsearch/commit/c0f3b97) Update to Kubernetes v1.18.3 (#21) +- [210dd08](https://github.com/stashed/elasticsearch/commit/210dd08) Update crazy-max/ghaction-docker-buildx flag +- [5c74a42](https://github.com/stashed/elasticsearch/commit/5c74a42) Trigger the workflow on push or pull request +- [76424d0](https://github.com/stashed/elasticsearch/commit/76424d0) Auto generate chart readme file +- [fc144c2](https://github.com/stashed/elasticsearch/commit/fc144c2) Correctly mark optional fields +- [3559c2c](https://github.com/stashed/elasticsearch/commit/3559c2c) Add openapi v3 schema for values file (#18) + + +### [6.2.4-v1](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v1) + +- [931aab3](https://github.com/stashed/elasticsearch/commit/931aab3) Prepare for release 6.2.4-v1 (#202) +- [00cc0e7](https://github.com/stashed/elasticsearch/commit/00cc0e7) Prepare for release 6.2.4-rc.20200827 (#193) +- [54bab71](https://github.com/stashed/elasticsearch/commit/54bab71) [cherry-pick] Upload charts without updating index (#185) +- [e73aada](https://github.com/stashed/elasticsearch/commit/e73aada) Prepare for release 6.2.4-rc.20200826 (#176) +- [3547a90](https://github.com/stashed/elasticsearch/commit/3547a90) [cherry-pick] Update README.md (#168) +- [6c3dfa5](https://github.com/stashed/elasticsearch/commit/6c3dfa5) Prepare for release 6.2.4-beta.20200826 (#159) +- [4aa0746](https://github.com/stashed/elasticsearch/commit/4aa0746) [cherry-pick] Update Stash installation link (#149) (#151) +- [9847b08](https://github.com/stashed/elasticsearch/commit/9847b08) [cherry-pick] Make image.tag in values.yaml file same as the $APP_VERSION (#132) (#142) +- [e13632d](https://github.com/stashed/elasticsearch/commit/e13632d) [cherry-pick] Fix output format + Add PreBackupActions logic (#131) (#134) +- [94dc85b](https://github.com/stashed/elasticsearch/commit/94dc85b) [cherry-pick] Update chart icon (#124) +- [efc6ad0](https://github.com/stashed/elasticsearch/commit/efc6ad0) [cherry-pick] Make chart registry configurable (#114) (#116) +- [eb90a4d](https://github.com/stashed/elasticsearch/commit/eb90a4d) Prepare for release 6.2.4-beta.20200709 (#106) +- [341d4ad](https://github.com/stashed/elasticsearch/commit/341d4ad) [cherry-pick] Build docker image in release workflow (#96) (#98) +- [ec42b5c](https://github.com/stashed/elasticsearch/commit/ec42b5c) Prepare for release 6.2.4-beta.20200708 (#88) +- [89d065d](https://github.com/stashed/elasticsearch/commit/89d065d) [cherry-pick] Publish to testing dir for alpha/beta releases (#78) (#80) +- [0210d13](https://github.com/stashed/elasticsearch/commit/0210d13) [cherry-pick] Update License (#69) (#71) +- [a2e7d5f](https://github.com/stashed/elasticsearch/commit/a2e7d5f) Add commands to update chart version (#68) +- [e60d8f5](https://github.com/stashed/elasticsearch/commit/e60d8f5) [cherry-pick] Update update-release-tracker.sh (#61) +- [a91e4a3](https://github.com/stashed/elasticsearch/commit/a91e4a3) [cherry-pick] Update update-release-tracker.sh (#53) +- [0cab17a](https://github.com/stashed/elasticsearch/commit/0cab17a) [cherry-pick] Update release.yml (#43) (#45) +- [778f2fa](https://github.com/stashed/elasticsearch/commit/778f2fa) [cherry-pick] Add script to update release tracker on pr merge (#34) (#36) +- [6ed9b1e](https://github.com/stashed/elasticsearch/commit/6ed9b1e) [cherry-pick] Add workflow to cherry pick commits to master (#25) (#27) +- [fdcde29](https://github.com/stashed/elasticsearch/commit/fdcde29) Fix chart release process (#24) +- [906159b](https://github.com/stashed/elasticsearch/commit/906159b) Update .kodiak.toml +- [dd28147](https://github.com/stashed/elasticsearch/commit/dd28147) Allow overwriting secret key via SecretTransformation (#23) +- [e0be3ed](https://github.com/stashed/elasticsearch/commit/e0be3ed) Make waitTimeout Configurable through flag (#22) +- [ef3a476](https://github.com/stashed/elasticsearch/commit/ef3a476) Create .kodiak.toml +- [cac2d27](https://github.com/stashed/elasticsearch/commit/cac2d27) Update to Kubernetes v1.18.3 (#21) +- [2a32dad](https://github.com/stashed/elasticsearch/commit/2a32dad) Update crazy-max/ghaction-docker-buildx flag +- [eebd43c](https://github.com/stashed/elasticsearch/commit/eebd43c) Trigger the workflow on push or pull request +- [ecf774c](https://github.com/stashed/elasticsearch/commit/ecf774c) Auto generate chart readme file +- [5e0f88c](https://github.com/stashed/elasticsearch/commit/5e0f88c) Correctly mark optional fields +- [59e28fe](https://github.com/stashed/elasticsearch/commit/59e28fe) Add openapi v3 schema for values file (#18) + + +### [6.3.0-v1](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v1) + +- [bbfd144](https://github.com/stashed/elasticsearch/commit/bbfd144) Prepare for release 6.3.0-v1 (#203) +- [4bf05ac](https://github.com/stashed/elasticsearch/commit/4bf05ac) Prepare for release 6.3.0-rc.20200827 (#194) +- [16053f8](https://github.com/stashed/elasticsearch/commit/16053f8) [cherry-pick] Upload charts without updating index (#186) +- [0cafcc1](https://github.com/stashed/elasticsearch/commit/0cafcc1) Prepare for release 6.3.0-rc.20200826 (#177) +- [c1ac9ec](https://github.com/stashed/elasticsearch/commit/c1ac9ec) [cherry-pick] Update README.md (#169) +- [4a32c49](https://github.com/stashed/elasticsearch/commit/4a32c49) Prepare for release 6.3.0-beta.20200826 (#160) +- [4bc4449](https://github.com/stashed/elasticsearch/commit/4bc4449) [cherry-pick] Update Stash installation link (#149) (#152) +- [31d3860](https://github.com/stashed/elasticsearch/commit/31d3860) [cherry-pick] Make image.tag in values.yaml file same as the $APP_VERSION (#132) (#143) +- [c19466a](https://github.com/stashed/elasticsearch/commit/c19466a) [cherry-pick] Fix output format + Add PreBackupActions logic (#131) (#135) +- [1aaa172](https://github.com/stashed/elasticsearch/commit/1aaa172) [cherry-pick] Update chart icon (#125) +- [30412a8](https://github.com/stashed/elasticsearch/commit/30412a8) [cherry-pick] Make chart registry configurable (#114) (#117) +- [ba97538](https://github.com/stashed/elasticsearch/commit/ba97538) Prepare for release 6.3.0-beta.20200709 (#107) +- [fe8fad4](https://github.com/stashed/elasticsearch/commit/fe8fad4) [cherry-pick] Build docker image in release workflow (#96) (#99) +- [671e33a](https://github.com/stashed/elasticsearch/commit/671e33a) Prepare for release 6.3.0-beta.20200708 (#89) +- [c5b5810](https://github.com/stashed/elasticsearch/commit/c5b5810) [cherry-pick] Publish to testing dir for alpha/beta releases (#78) (#81) +- [a2139f0](https://github.com/stashed/elasticsearch/commit/a2139f0) [cherry-pick] Update License (#69) (#72) +- [3ffe99c](https://github.com/stashed/elasticsearch/commit/3ffe99c) Add commands to update chart version (#68) +- [4232c66](https://github.com/stashed/elasticsearch/commit/4232c66) [cherry-pick] Update update-release-tracker.sh (#62) +- [edbc756](https://github.com/stashed/elasticsearch/commit/edbc756) [cherry-pick] Update update-release-tracker.sh (#54) +- [476a2ef](https://github.com/stashed/elasticsearch/commit/476a2ef) [cherry-pick] Update release.yml (#43) (#46) +- [f0b82c7](https://github.com/stashed/elasticsearch/commit/f0b82c7) [cherry-pick] Add script to update release tracker on pr merge (#34) (#37) +- [4908f3a](https://github.com/stashed/elasticsearch/commit/4908f3a) [cherry-pick] Add workflow to cherry pick commits to master (#25) (#28) +- [5a35f5c](https://github.com/stashed/elasticsearch/commit/5a35f5c) Fix chart release process (#24) +- [6b491ca](https://github.com/stashed/elasticsearch/commit/6b491ca) Update .kodiak.toml +- [4aaf57b](https://github.com/stashed/elasticsearch/commit/4aaf57b) Allow overwriting secret key via SecretTransformation (#23) +- [eaaa73a](https://github.com/stashed/elasticsearch/commit/eaaa73a) Make waitTimeout Configurable through flag (#22) +- [a4d67ec](https://github.com/stashed/elasticsearch/commit/a4d67ec) Create .kodiak.toml +- [f644e81](https://github.com/stashed/elasticsearch/commit/f644e81) Update to Kubernetes v1.18.3 (#21) +- [1f37605](https://github.com/stashed/elasticsearch/commit/1f37605) Update crazy-max/ghaction-docker-buildx flag +- [1e8d99b](https://github.com/stashed/elasticsearch/commit/1e8d99b) Trigger the workflow on push or pull request +- [07ae51e](https://github.com/stashed/elasticsearch/commit/07ae51e) Auto generate chart readme file +- [e8e4382](https://github.com/stashed/elasticsearch/commit/e8e4382) Correctly mark optional fields +- [cd05619](https://github.com/stashed/elasticsearch/commit/cd05619) Add openapi v3 schema for values file (#18) + + +### [6.4.0-v1](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v1) + +- [32230ba](https://github.com/stashed/elasticsearch/commit/32230ba) Prepare for release 6.4.0-v1 (#204) +- [c37a5b5](https://github.com/stashed/elasticsearch/commit/c37a5b5) Prepare for release 6.4.0-rc.20200827 (#195) +- [6a44a65](https://github.com/stashed/elasticsearch/commit/6a44a65) [cherry-pick] Upload charts without updating index (#187) +- [92d193d](https://github.com/stashed/elasticsearch/commit/92d193d) Prepare for release 6.4.0-rc.20200826 (#178) +- [6c2c0c1](https://github.com/stashed/elasticsearch/commit/6c2c0c1) [cherry-pick] Update README.md (#170) +- [0770775](https://github.com/stashed/elasticsearch/commit/0770775) Prepare for release 6.4.0-beta.20200826 (#161) +- [38be1db](https://github.com/stashed/elasticsearch/commit/38be1db) [cherry-pick] Update Stash installation link (#149) (#153) +- [87ca905](https://github.com/stashed/elasticsearch/commit/87ca905) [cherry-pick] Make image.tag in values.yaml file same as the $APP_VERSION (#132) (#144) +- [75dd0a5](https://github.com/stashed/elasticsearch/commit/75dd0a5) [cherry-pick] Fix output format + Add PreBackupActions logic (#131) (#136) +- [ad75b67](https://github.com/stashed/elasticsearch/commit/ad75b67) [cherry-pick] Update chart icon (#126) +- [e5e9c7b](https://github.com/stashed/elasticsearch/commit/e5e9c7b) [cherry-pick] Make chart registry configurable (#114) (#118) +- [223de60](https://github.com/stashed/elasticsearch/commit/223de60) Prepare for release 6.4.0-beta.20200709 (#108) +- [3eb01b0](https://github.com/stashed/elasticsearch/commit/3eb01b0) [cherry-pick] Build docker image in release workflow (#96) (#100) +- [cc612b9](https://github.com/stashed/elasticsearch/commit/cc612b9) Prepare for release 6.4.0-beta.20200708 (#90) +- [f92c1c7](https://github.com/stashed/elasticsearch/commit/f92c1c7) [cherry-pick] Publish to testing dir for alpha/beta releases (#78) (#82) +- [f54017a](https://github.com/stashed/elasticsearch/commit/f54017a) [cherry-pick] Update License (#69) (#73) +- [7ad416e](https://github.com/stashed/elasticsearch/commit/7ad416e) Add commands to update chart version (#68) +- [af7e6b4](https://github.com/stashed/elasticsearch/commit/af7e6b4) [cherry-pick] Update update-release-tracker.sh (#63) +- [a7477ba](https://github.com/stashed/elasticsearch/commit/a7477ba) [cherry-pick] Update update-release-tracker.sh (#55) +- [98c4094](https://github.com/stashed/elasticsearch/commit/98c4094) [cherry-pick] Update release.yml (#43) (#47) +- [59323ef](https://github.com/stashed/elasticsearch/commit/59323ef) [cherry-pick] Add script to update release tracker on pr merge (#34) (#38) +- [0b9c91c](https://github.com/stashed/elasticsearch/commit/0b9c91c) [cherry-pick] Add workflow to cherry pick commits to master (#25) (#29) +- [900203b](https://github.com/stashed/elasticsearch/commit/900203b) Fix chart release process (#24) +- [cfe9a92](https://github.com/stashed/elasticsearch/commit/cfe9a92) Update .kodiak.toml +- [aa1fe2c](https://github.com/stashed/elasticsearch/commit/aa1fe2c) Allow overwriting secret key via SecretTransformation (#23) +- [a8153db](https://github.com/stashed/elasticsearch/commit/a8153db) Make waitTimeout Configurable through flag (#22) +- [55c09d2](https://github.com/stashed/elasticsearch/commit/55c09d2) Create .kodiak.toml +- [1623bac](https://github.com/stashed/elasticsearch/commit/1623bac) Update to Kubernetes v1.18.3 (#21) +- [5467acc](https://github.com/stashed/elasticsearch/commit/5467acc) Update crazy-max/ghaction-docker-buildx flag +- [82a9e18](https://github.com/stashed/elasticsearch/commit/82a9e18) Trigger the workflow on push or pull request +- [50e977c](https://github.com/stashed/elasticsearch/commit/50e977c) Auto generate chart readme file +- [9057ff5](https://github.com/stashed/elasticsearch/commit/9057ff5) Correctly mark optional fields +- [13753df](https://github.com/stashed/elasticsearch/commit/13753df) Add openapi v3 schema for values file (#18) + + +### [6.5.3-v1](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v1) + +- [03483cd](https://github.com/stashed/elasticsearch/commit/03483cd) Prepare for release 6.5.3-v1 (#205) +- [68b5356](https://github.com/stashed/elasticsearch/commit/68b5356) Prepare for release 6.5.3-rc.20200827 (#196) +- [babe6ed](https://github.com/stashed/elasticsearch/commit/babe6ed) [cherry-pick] Upload charts without updating index (#188) +- [b50a46f](https://github.com/stashed/elasticsearch/commit/b50a46f) Prepare for release 6.5.3-rc.20200826 (#179) +- [c600cf4](https://github.com/stashed/elasticsearch/commit/c600cf4) [cherry-pick] Update README.md (#171) +- [58af00f](https://github.com/stashed/elasticsearch/commit/58af00f) Prepare for release 6.5.3-beta.20200826 (#162) +- [1365067](https://github.com/stashed/elasticsearch/commit/1365067) [cherry-pick] Update Stash installation link (#149) (#154) +- [16f9593](https://github.com/stashed/elasticsearch/commit/16f9593) [cherry-pick] Make image.tag in values.yaml file same as the $APP_VERSION (#132) (#145) +- [8413eba](https://github.com/stashed/elasticsearch/commit/8413eba) [cherry-pick] Fix output format + Add PreBackupActions logic (#131) (#137) +- [b0237a3](https://github.com/stashed/elasticsearch/commit/b0237a3) [cherry-pick] Update chart icon (#127) +- [daec12d](https://github.com/stashed/elasticsearch/commit/daec12d) [cherry-pick] Make chart registry configurable (#114) (#119) +- [27ca5d7](https://github.com/stashed/elasticsearch/commit/27ca5d7) Prepare for release 6.5.3-beta.20200709 (#109) +- [cfc95c6](https://github.com/stashed/elasticsearch/commit/cfc95c6) [cherry-pick] Build docker image in release workflow (#96) (#101) +- [398bb23](https://github.com/stashed/elasticsearch/commit/398bb23) Prepare for release 6.5.3-beta.20200708 (#91) +- [2644470](https://github.com/stashed/elasticsearch/commit/2644470) [cherry-pick] Publish to testing dir for alpha/beta releases (#78) (#83) +- [f2550a7](https://github.com/stashed/elasticsearch/commit/f2550a7) [cherry-pick] Update License (#69) (#74) +- [a6e78ba](https://github.com/stashed/elasticsearch/commit/a6e78ba) Add commands to update chart version (#68) +- [f748f8a](https://github.com/stashed/elasticsearch/commit/f748f8a) [cherry-pick] Update update-release-tracker.sh (#64) +- [3834375](https://github.com/stashed/elasticsearch/commit/3834375) [cherry-pick] Update update-release-tracker.sh (#56) +- [199053c](https://github.com/stashed/elasticsearch/commit/199053c) [cherry-pick] Update release.yml (#43) (#48) +- [c1e785f](https://github.com/stashed/elasticsearch/commit/c1e785f) [cherry-pick] Add script to update release tracker on pr merge (#34) (#39) +- [8b7e78c](https://github.com/stashed/elasticsearch/commit/8b7e78c) [cherry-pick] Add workflow to cherry pick commits to master (#25) (#30) +- [d36469f](https://github.com/stashed/elasticsearch/commit/d36469f) Fix chart release process (#24) +- [973b2c0](https://github.com/stashed/elasticsearch/commit/973b2c0) Update .kodiak.toml +- [f85e675](https://github.com/stashed/elasticsearch/commit/f85e675) Allow overwriting secret key via SecretTransformation (#23) +- [6d12042](https://github.com/stashed/elasticsearch/commit/6d12042) Make waitTimeout Configurable through flag (#22) +- [e7cfd20](https://github.com/stashed/elasticsearch/commit/e7cfd20) Create .kodiak.toml +- [bc228b6](https://github.com/stashed/elasticsearch/commit/bc228b6) Update to Kubernetes v1.18.3 (#21) +- [12c840e](https://github.com/stashed/elasticsearch/commit/12c840e) Update crazy-max/ghaction-docker-buildx flag +- [4cbb496](https://github.com/stashed/elasticsearch/commit/4cbb496) Trigger the workflow on push or pull request +- [9a6392c](https://github.com/stashed/elasticsearch/commit/9a6392c) Auto generate chart readme file +- [44be3d5](https://github.com/stashed/elasticsearch/commit/44be3d5) Correctly mark optional fields +- [86d7264](https://github.com/stashed/elasticsearch/commit/86d7264) Add openapi v3 schema for values file (#18) + + +### [6.8.0-v1](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v1) + +- [94537ac](https://github.com/stashed/elasticsearch/commit/94537ac) Prepare for release 6.8.0-v1 (#206) +- [74bcf84](https://github.com/stashed/elasticsearch/commit/74bcf84) Prepare for release 6.8.0-rc.20200827 (#197) +- [a836713](https://github.com/stashed/elasticsearch/commit/a836713) [cherry-pick] Upload charts without updating index (#189) +- [0f1874b](https://github.com/stashed/elasticsearch/commit/0f1874b) Prepare for release 6.8.0-rc.20200826 (#180) +- [db75b3b](https://github.com/stashed/elasticsearch/commit/db75b3b) [cherry-pick] Update README.md (#172) +- [8811915](https://github.com/stashed/elasticsearch/commit/8811915) Prepare for release 6.8.0-beta.20200826 (#163) +- [46e0b2a](https://github.com/stashed/elasticsearch/commit/46e0b2a) [cherry-pick] Update Stash installation link (#149) (#155) +- [9a00bba](https://github.com/stashed/elasticsearch/commit/9a00bba) [cherry-pick] Make image.tag in values.yaml file same as the $APP_VERSION (#132) (#146) +- [f0ae71f](https://github.com/stashed/elasticsearch/commit/f0ae71f) [cherry-pick] Fix output format + Add PreBackupActions logic (#131) (#138) +- [9561dd8](https://github.com/stashed/elasticsearch/commit/9561dd8) [cherry-pick] Update chart icon (#128) +- [bc40c89](https://github.com/stashed/elasticsearch/commit/bc40c89) [cherry-pick] Make chart registry configurable (#114) (#120) +- [ebff50b](https://github.com/stashed/elasticsearch/commit/ebff50b) Prepare for release 6.8.0-beta.20200709 (#110) +- [c4322e7](https://github.com/stashed/elasticsearch/commit/c4322e7) [cherry-pick] Build docker image in release workflow (#96) (#102) +- [7c3b8da](https://github.com/stashed/elasticsearch/commit/7c3b8da) Prepare for release 6.8.0-beta.20200708 (#92) +- [3f7975e](https://github.com/stashed/elasticsearch/commit/3f7975e) [cherry-pick] Publish to testing dir for alpha/beta releases (#78) (#84) +- [ee4b2d9](https://github.com/stashed/elasticsearch/commit/ee4b2d9) [cherry-pick] Update License (#69) (#75) +- [5658bcf](https://github.com/stashed/elasticsearch/commit/5658bcf) Add commands to update chart version (#68) +- [e79b0c3](https://github.com/stashed/elasticsearch/commit/e79b0c3) [cherry-pick] Update update-release-tracker.sh (#65) +- [d3a4ebb](https://github.com/stashed/elasticsearch/commit/d3a4ebb) [cherry-pick] Update update-release-tracker.sh (#57) +- [22f1387](https://github.com/stashed/elasticsearch/commit/22f1387) [cherry-pick] Update release.yml (#43) (#49) +- [94f3e61](https://github.com/stashed/elasticsearch/commit/94f3e61) [cherry-pick] Add script to update release tracker on pr merge (#34) (#40) +- [00e3510](https://github.com/stashed/elasticsearch/commit/00e3510) [cherry-pick] Add workflow to cherry pick commits to master (#25) (#31) +- [f9ed864](https://github.com/stashed/elasticsearch/commit/f9ed864) Fix chart release process (#24) +- [b629030](https://github.com/stashed/elasticsearch/commit/b629030) Update .kodiak.toml +- [0c4cd3b](https://github.com/stashed/elasticsearch/commit/0c4cd3b) Allow overwriting secret key via SecretTransformation (#23) +- [dbd81ad](https://github.com/stashed/elasticsearch/commit/dbd81ad) Make waitTimeout Configurable through flag (#22) +- [fc71aac](https://github.com/stashed/elasticsearch/commit/fc71aac) Create .kodiak.toml +- [da8f470](https://github.com/stashed/elasticsearch/commit/da8f470) Update to Kubernetes v1.18.3 (#21) +- [ee7cc8d](https://github.com/stashed/elasticsearch/commit/ee7cc8d) Update crazy-max/ghaction-docker-buildx flag +- [66e3fa8](https://github.com/stashed/elasticsearch/commit/66e3fa8) Trigger the workflow on push or pull request +- [af6e9ba](https://github.com/stashed/elasticsearch/commit/af6e9ba) Auto generate chart readme file +- [ae3168a](https://github.com/stashed/elasticsearch/commit/ae3168a) Correctly mark optional fields +- [700bda7](https://github.com/stashed/elasticsearch/commit/700bda7) Add openapi v3 schema for values file (#18) + + +### [7.2.0-v1](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v1) + +- [a4f5de4](https://github.com/stashed/elasticsearch/commit/a4f5de4) Prepare for release 7.2.0-v1 (#207) +- [036e850](https://github.com/stashed/elasticsearch/commit/036e850) Prepare for release 7.2.0-rc.20200827 (#198) +- [54fd94d](https://github.com/stashed/elasticsearch/commit/54fd94d) [cherry-pick] Upload charts without updating index (#190) +- [592ebd3](https://github.com/stashed/elasticsearch/commit/592ebd3) Prepare for release 7.2.0-rc.20200826 (#181) +- [29f8c8f](https://github.com/stashed/elasticsearch/commit/29f8c8f) [cherry-pick] Update README.md (#173) +- [bd2c6bc](https://github.com/stashed/elasticsearch/commit/bd2c6bc) Prepare for release 7.2.0-beta.20200826 (#164) +- [2c3a9e1](https://github.com/stashed/elasticsearch/commit/2c3a9e1) [cherry-pick] Update Stash installation link (#149) (#156) +- [c862e31](https://github.com/stashed/elasticsearch/commit/c862e31) [cherry-pick] Make image.tag in values.yaml file same as the $APP_VERSION (#132) (#147) +- [1010749](https://github.com/stashed/elasticsearch/commit/1010749) [cherry-pick] Fix output format + Add PreBackupActions logic (#131) (#139) +- [b0cac90](https://github.com/stashed/elasticsearch/commit/b0cac90) [cherry-pick] Update chart icon (#129) +- [abd52d3](https://github.com/stashed/elasticsearch/commit/abd52d3) [cherry-pick] Make chart registry configurable (#114) (#121) +- [bf94d4d](https://github.com/stashed/elasticsearch/commit/bf94d4d) Prepare for release 7.2.0-beta.20200709 (#111) +- [d1cdabd](https://github.com/stashed/elasticsearch/commit/d1cdabd) [cherry-pick] Build docker image in release workflow (#96) (#103) +- [756fd43](https://github.com/stashed/elasticsearch/commit/756fd43) Prepare for release 7.2.0-beta.20200708 (#93) +- [b3432e1](https://github.com/stashed/elasticsearch/commit/b3432e1) [cherry-pick] Publish to testing dir for alpha/beta releases (#78) (#85) +- [281635d](https://github.com/stashed/elasticsearch/commit/281635d) [cherry-pick] Update License (#69) (#76) +- [497de33](https://github.com/stashed/elasticsearch/commit/497de33) Add commands to update chart version (#68) +- [fd38969](https://github.com/stashed/elasticsearch/commit/fd38969) [cherry-pick] Update update-release-tracker.sh (#66) +- [e5941de](https://github.com/stashed/elasticsearch/commit/e5941de) [cherry-pick] Update update-release-tracker.sh (#58) +- [e59ef4e](https://github.com/stashed/elasticsearch/commit/e59ef4e) [cherry-pick] Update release.yml (#43) (#50) +- [05145d3](https://github.com/stashed/elasticsearch/commit/05145d3) [cherry-pick] Add script to update release tracker on pr merge (#34) (#41) +- [ee1d54b](https://github.com/stashed/elasticsearch/commit/ee1d54b) [cherry-pick] Add workflow to cherry pick commits to master (#25) (#32) +- [2179a5b](https://github.com/stashed/elasticsearch/commit/2179a5b) Fix chart release process (#24) +- [846f589](https://github.com/stashed/elasticsearch/commit/846f589) Update .kodiak.toml +- [fe25329](https://github.com/stashed/elasticsearch/commit/fe25329) Allow overwriting secret key via SecretTransformation (#23) +- [14c4329](https://github.com/stashed/elasticsearch/commit/14c4329) Make waitTimeout Configurable through flag (#22) +- [9e9da11](https://github.com/stashed/elasticsearch/commit/9e9da11) Create .kodiak.toml +- [a4136d6](https://github.com/stashed/elasticsearch/commit/a4136d6) Update to Kubernetes v1.18.3 (#21) +- [76eeee5](https://github.com/stashed/elasticsearch/commit/76eeee5) Update crazy-max/ghaction-docker-buildx flag +- [c7b7250](https://github.com/stashed/elasticsearch/commit/c7b7250) Trigger the workflow on push or pull request +- [cebf7fc](https://github.com/stashed/elasticsearch/commit/cebf7fc) Auto generate chart readme file +- [64104e9](https://github.com/stashed/elasticsearch/commit/64104e9) Correctly mark optional fields +- [d7807e4](https://github.com/stashed/elasticsearch/commit/d7807e4) Add openapi v3 schema for values file (#18) + + +### [7.3.2-v1](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v1) + +- [c451831](https://github.com/stashed/elasticsearch/commit/c451831) Prepare for release 7.3.2-v1 (#208) +- [c6f8b5d](https://github.com/stashed/elasticsearch/commit/c6f8b5d) Prepare for release 7.3.2-rc.20200827 (#199) +- [0f8ba19](https://github.com/stashed/elasticsearch/commit/0f8ba19) [cherry-pick] Upload charts without updating index (#191) +- [d502610](https://github.com/stashed/elasticsearch/commit/d502610) Prepare for release 7.3.2-rc.20200826 (#182) +- [00b3cee](https://github.com/stashed/elasticsearch/commit/00b3cee) [cherry-pick] Update README.md (#174) +- [a163678](https://github.com/stashed/elasticsearch/commit/a163678) Prepare for release 7.3.2-beta.20200826 (#165) +- [152792e](https://github.com/stashed/elasticsearch/commit/152792e) [cherry-pick] Update Stash installation link (#149) (#157) +- [2d0f427](https://github.com/stashed/elasticsearch/commit/2d0f427) [cherry-pick] Make image.tag in values.yaml file same as the $APP_VERSION (#132) (#148) +- [281a0ce](https://github.com/stashed/elasticsearch/commit/281a0ce) [cherry-pick] Fix output format + Add PreBackupActions logic (#131) (#140) +- [e89cbde](https://github.com/stashed/elasticsearch/commit/e89cbde) [cherry-pick] Update chart icon (#130) +- [a4c3327](https://github.com/stashed/elasticsearch/commit/a4c3327) [cherry-pick] Make chart registry configurable (#114) (#122) +- [d0e8ff7](https://github.com/stashed/elasticsearch/commit/d0e8ff7) Prepare for release 7.3.2-beta.20200709 (#112) +- [0b0df2e](https://github.com/stashed/elasticsearch/commit/0b0df2e) [cherry-pick] Build docker image in release workflow (#96) (#104) +- [7ca1e93](https://github.com/stashed/elasticsearch/commit/7ca1e93) Prepare for release 7.3.2-beta.20200708 (#94) +- [8d81227](https://github.com/stashed/elasticsearch/commit/8d81227) [cherry-pick] Publish to testing dir for alpha/beta releases (#78) (#86) +- [a095aa8](https://github.com/stashed/elasticsearch/commit/a095aa8) [cherry-pick] Update License (#69) (#77) +- [28fd99f](https://github.com/stashed/elasticsearch/commit/28fd99f) Add commands to update chart version (#68) +- [40ea5b4](https://github.com/stashed/elasticsearch/commit/40ea5b4) [cherry-pick] Update update-release-tracker.sh (#67) +- [83391c5](https://github.com/stashed/elasticsearch/commit/83391c5) [cherry-pick] Update update-release-tracker.sh (#59) +- [3968178](https://github.com/stashed/elasticsearch/commit/3968178) [cherry-pick] Update release.yml (#43) (#51) +- [b8a89f4](https://github.com/stashed/elasticsearch/commit/b8a89f4) [cherry-pick] Add script to update release tracker on pr merge (#34) (#42) +- [2d87390](https://github.com/stashed/elasticsearch/commit/2d87390) [cherry-pick] Add workflow to cherry pick commits to master (#25) (#33) +- [f367b58](https://github.com/stashed/elasticsearch/commit/f367b58) Fix chart release process (#24) +- [74b4d4b](https://github.com/stashed/elasticsearch/commit/74b4d4b) Update .kodiak.toml +- [40f7aa5](https://github.com/stashed/elasticsearch/commit/40f7aa5) Allow overwriting secret key via SecretTransformation (#23) +- [f223f71](https://github.com/stashed/elasticsearch/commit/f223f71) Make waitTimeout Configurable through flag (#22) +- [911d6cb](https://github.com/stashed/elasticsearch/commit/911d6cb) Create .kodiak.toml +- [ea27783](https://github.com/stashed/elasticsearch/commit/ea27783) Update to Kubernetes v1.18.3 (#21) +- [2e1b526](https://github.com/stashed/elasticsearch/commit/2e1b526) Update crazy-max/ghaction-docker-buildx flag +- [987346a](https://github.com/stashed/elasticsearch/commit/987346a) Trigger the workflow on push or pull request +- [83197f1](https://github.com/stashed/elasticsearch/commit/83197f1) Auto generate chart readme file +- [da8d9f0](https://github.com/stashed/elasticsearch/commit/da8d9f0) Correctly mark optional fields +- [808a7c0](https://github.com/stashed/elasticsearch/commit/808a7c0) Add openapi v3 schema for values file (#18) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v0.10.0](https://github.com/stashed/installer/releases/tag/v0.10.0) + +- [cc6a53e](https://github.com/stashed/installer/commit/cc6a53e) Prepare for release v0.10.0 (#93) +- [7d5e440](https://github.com/stashed/installer/commit/7d5e440) Prepare for release v0.10.0-rc.2 (#92) +- [f4cae9f](https://github.com/stashed/installer/commit/f4cae9f) Upload charts without updating index +- [90d9c52](https://github.com/stashed/installer/commit/90d9c52) Update Kubernetes v1.18.3 dependencies (#91) +- [037a349](https://github.com/stashed/installer/commit/037a349) Prepare for release v0.10.0-rc.1 (#90) +- [f94e175](https://github.com/stashed/installer/commit/f94e175) Correctly pass license to CI workflow +- [9f6539d](https://github.com/stashed/installer/commit/9f6539d) Update stash-enterprise chart version +- [5904e2c](https://github.com/stashed/installer/commit/5904e2c) Update README.md +- [d3d30cc](https://github.com/stashed/installer/commit/d3d30cc) Add link to the steps to get a license (#89) +- [1fb05d9](https://github.com/stashed/installer/commit/1fb05d9) Issue license for testing enterprise charts (#88) +- [6018270](https://github.com/stashed/installer/commit/6018270) Prepare for release v0.10.0-rc.0 (#87) +- [9da1502](https://github.com/stashed/installer/commit/9da1502) Port changes from enterprise version (#85) +- [0838112](https://github.com/stashed/installer/commit/0838112) Add offline license verification (#84) +- [d869f33](https://github.com/stashed/installer/commit/d869f33) Always give use permission for baseline psp to operator (#83) +- [d1e0142](https://github.com/stashed/installer/commit/d1e0142) Support Snapshot listing for NFS backend without workload running (#80) +- [53bab27](https://github.com/stashed/installer/commit/53bab27) Pass imagePullSecrets as operator flag (#71) +- [4e3a984](https://github.com/stashed/installer/commit/4e3a984) Update to Kubernetes v1.18.3 (#79) +- [6e57dd4](https://github.com/stashed/installer/commit/6e57dd4) Update to Kubernetes v1.18.3 (#78) +- [5c681fe](https://github.com/stashed/installer/commit/5c681fe) Update to Kubernetes v1.18.3 (#77) +- [c268a57](https://github.com/stashed/installer/commit/c268a57) Make chart registry configurable +- [bed8319](https://github.com/stashed/installer/commit/bed8319) Prepare for release v0.10.0-beta.1 (#76) +- [cd44ba9](https://github.com/stashed/installer/commit/cd44ba9) Prepare for release v0.10.0-beta.0 (#75) +- [a04e173](https://github.com/stashed/installer/commit/a04e173) Publish to testing dir for alpha/beta releases +- [4b23e1c](https://github.com/stashed/installer/commit/4b23e1c) Update License (#74) +- [9b7a4e0](https://github.com/stashed/installer/commit/9b7a4e0) Update to Kubernetes v1.18.3 (#72) +- [4318306](https://github.com/stashed/installer/commit/4318306) Update ci.yml +- [15d1594](https://github.com/stashed/installer/commit/15d1594) Fix Stash Enterprise installer (#70) +- [31c9dcc](https://github.com/stashed/installer/commit/31c9dcc) Tag chart and app version as string for yq (#69) +- [1782049](https://github.com/stashed/installer/commit/1782049) Update links (#68) +- [634da4d](https://github.com/stashed/installer/commit/634da4d) Update update-release-tracker.sh +- [1155610](https://github.com/stashed/installer/commit/1155610) Update update-release-tracker.sh +- [1b10b5e](https://github.com/stashed/installer/commit/1b10b5e) Add script to update release tracker on pr merge (#67) +- [ce0b28e](https://github.com/stashed/installer/commit/ce0b28e) Update release workflow +- [c3ac668](https://github.com/stashed/installer/commit/c3ac668) Update ci.yml +- [98bad7e](https://github.com/stashed/installer/commit/98bad7e) Add Stash Enterprise chart (#63) +- [73f52a6](https://github.com/stashed/installer/commit/73f52a6) Add commands to update chart (#65) +- [0dc7f91](https://github.com/stashed/installer/commit/0dc7f91) Fix chart release process (#64) +- [0d5c4e1](https://github.com/stashed/installer/commit/0d5c4e1) Update .kodiak.toml +- [3b53e64](https://github.com/stashed/installer/commit/3b53e64) Update to Kubernetes v1.18.3 (#58) +- [43c5dbe](https://github.com/stashed/installer/commit/43c5dbe) Update to Kubernetes v1.18.3 +- [b9e784c](https://github.com/stashed/installer/commit/b9e784c) Create .kodiak.toml +- [b30b3b0](https://github.com/stashed/installer/commit/b30b3b0) Merge pull request #57 from stashed/psp +- [1b89401](https://github.com/stashed/installer/commit/1b89401) Disable apparmor and seccomp by default +- [6bed1aa](https://github.com/stashed/installer/commit/6bed1aa) Pass psp names for the jobs through flag +- [bd35d81](https://github.com/stashed/installer/commit/bd35d81) Always use baseline psp for stash +- [4e3474a](https://github.com/stashed/installer/commit/4e3474a) Add RBAC permission for generic-garbage-collector (#56) +- [be006f6](https://github.com/stashed/installer/commit/be006f6) Permit configmap list/watch -ing for delegated authentication checking (#55) +- [5685c15](https://github.com/stashed/installer/commit/5685c15) Update dependencies +- [8b7b805](https://github.com/stashed/installer/commit/8b7b805) Update dependencies +- [d2b2b09](https://github.com/stashed/installer/commit/d2b2b09) Generate both v1beta1 and v1 CRD YAML (#54) +- [7fbcb29](https://github.com/stashed/installer/commit/7fbcb29) Update to Kubernetes v1.18.3 (#53) +- [88e5e8c](https://github.com/stashed/installer/commit/88e5e8c) Use Go 1.14.3 +- [8e56cb1](https://github.com/stashed/installer/commit/8e56cb1) Trigger build on push to only master branch +- [562caf8](https://github.com/stashed/installer/commit/562caf8) Use recommended kubernetes app labels (#52) +- [cc55e5a](https://github.com/stashed/installer/commit/cc55e5a) Trigger the workflow on push or pull request +- [fd8acf5](https://github.com/stashed/installer/commit/fd8acf5) Update chart readme +- [672f37e](https://github.com/stashed/installer/commit/672f37e) Show examples in chart readme +- [39f4ca1](https://github.com/stashed/installer/commit/39f4ca1) Auto generate chart readme file (#50) +- [47f4250](https://github.com/stashed/installer/commit/47f4250) Update release.yml +- [b68d9cb](https://github.com/stashed/installer/commit/b68d9cb) Cleanup newlines +- [20d51b0](https://github.com/stashed/installer/commit/20d51b0) Reformat stash chart template (#49) +- [65f8bee](https://github.com/stashed/installer/commit/65f8bee) Use kubectl v1.16 as cleaner (#48) +- [85a7cfd](https://github.com/stashed/installer/commit/85a7cfd) Rename prometheus.io/coreos-operator to prometheus.io/operator (#47) +- [b042def](https://github.com/stashed/installer/commit/b042def) Move apireg annotation to operator pod (#46) +- [a543953](https://github.com/stashed/installer/commit/a543953) Various cleanup (#44) +- [b6e2bec](https://github.com/stashed/installer/commit/b6e2bec) Fix helm install --wait flag (#42) +- [806aada](https://github.com/stashed/installer/commit/806aada) Do not harcode namespace (#40) +- [a2713aa](https://github.com/stashed/installer/commit/a2713aa) Add release script to upload charts (#39) +- [57f829a](https://github.com/stashed/installer/commit/57f829a) Prepare charts for v0.9.0-rc.6 release (#38) +- [72e0aff](https://github.com/stashed/installer/commit/72e0aff) Properly mark optional fields (#37) +- [388fcc0](https://github.com/stashed/installer/commit/388fcc0) Update chart readme +- [8595fa6](https://github.com/stashed/installer/commit/8595fa6) Properly mark options fields. (#36) +- [4c491b6](https://github.com/stashed/installer/commit/4c491b6) Prepare v0.9.0-rc.4 release (#35) +- [79f59b6](https://github.com/stashed/installer/commit/79f59b6) Allow specifying rather than generating certs (#34) +- [23a9b97](https://github.com/stashed/installer/commit/23a9b97) Test against k8s 1.11 +- [a0b9659](https://github.com/stashed/installer/commit/a0b9659) Bring back support for k8s 1.11 (#33) +- [c753211](https://github.com/stashed/installer/commit/c753211) Change minimum k8s req to 1.12 and use helm 3 in chart readme (#32) +- [3dec466](https://github.com/stashed/installer/commit/3dec466) Update twitter account +- [3ab35e3](https://github.com/stashed/installer/commit/3ab35e3) Delete orphaned apiservice (#31) +- [a9c33b3](https://github.com/stashed/installer/commit/a9c33b3) Delete script based installer (#30) +- [2d9ea3d](https://github.com/stashed/installer/commit/2d9ea3d) Pass imagePullSecrets via service account (#29) +- [04f65d8](https://github.com/stashed/installer/commit/04f65d8) Add endpoint get permission (#26) +- [e5a3418](https://github.com/stashed/installer/commit/e5a3418) Use helm 3 for chart testing (#28) +- [19fa9b6](https://github.com/stashed/installer/commit/19fa9b6) Move chart Vaules of the root of the spec. (#27) +- [26fcf6c](https://github.com/stashed/installer/commit/26fcf6c) Use int32 for Stash operator installer CRD +- [f41c997](https://github.com/stashed/installer/commit/f41c997) Update license headers +- [baa751a](https://github.com/stashed/installer/commit/baa751a) Run fuzz tests for generated API schemas (#25) +- [b92981a](https://github.com/stashed/installer/commit/b92981a) Update client-go to kubernetes-1.16.3 (#24) +- [310e243](https://github.com/stashed/installer/commit/310e243) Fix #981 RBAC permissions missing from chart (#22) +- [77703f3](https://github.com/stashed/installer/commit/77703f3) Properly handle empty image pull secret name in installer (#23) +- [31b4634](https://github.com/stashed/installer/commit/31b4634) Update swagger.json +- [9425820](https://github.com/stashed/installer/commit/9425820) Update Chart.yaml +- [74abc6e](https://github.com/stashed/installer/commit/74abc6e) Add StashOperator crd (#17) +- [c0ff647](https://github.com/stashed/installer/commit/c0ff647) Fix rbac permission for PVC in chart (#20) +- [51a712b](https://github.com/stashed/installer/commit/51a712b) Test against multiple k8s version (#19) +- [2afb705](https://github.com/stashed/installer/commit/2afb705) Update icon +- [ea1561e](https://github.com/stashed/installer/commit/ea1561e) Fix linter errors +- [170af3a](https://github.com/stashed/installer/commit/170af3a) Enable race detector +- [848e9fa](https://github.com/stashed/installer/commit/848e9fa) Test installers (#18) +- [2b3b665](https://github.com/stashed/installer/commit/2b3b665) Prepare for release v0.9.0-rc.2 (#16) +- [b1ef8b5](https://github.com/stashed/installer/commit/b1ef8b5) Remove --enable-status-subresource flag (#15) +- [0c87e77](https://github.com/stashed/installer/commit/0c87e77) Add delete permission ClusterRole to vs (#13) +- [5387b57](https://github.com/stashed/installer/commit/5387b57) Ignore error while delete resources from uninstaller script (#14) +- [b8dc5e9](https://github.com/stashed/installer/commit/b8dc5e9) Prepare for v0.9.0-rc.1 release (#12) +- [48f2f3b](https://github.com/stashed/installer/commit/48f2f3b) Download onessl version v0.13.1 for Kubernetes 1.16 fix (#11) +- [4c0ce1f](https://github.com/stashed/installer/commit/4c0ce1f) Update onessl for Kubernetes 1.16+ (#10) +- [478817b](https://github.com/stashed/installer/commit/478817b) Run as fsGroup: 65535 (#8) +- [366a4f5](https://github.com/stashed/installer/commit/366a4f5) Prepare v0.9.0-rc.0 release (#7) +- [8674bc6](https://github.com/stashed/installer/commit/8674bc6) Rename BackupConfigurationTemplates to BackupBlueprints (#6) +- [fcf2297](https://github.com/stashed/installer/commit/fcf2297) Cleanup default Functions & Tasks while uninstall+ refactor installer script (#4) +- [68de871](https://github.com/stashed/installer/commit/68de871) Always set --image-tag flag (#3) +- [4b3f2a7](https://github.com/stashed/installer/commit/4b3f2a7) Fix purging non-namespaced crd (#2) +- [e9f0e2c](https://github.com/stashed/installer/commit/e9f0e2c) Fix script path for installer repo (#1) +- [525fff8](https://github.com/stashed/installer/commit/525fff8) Add License & DCO +- [257f0f2](https://github.com/stashed/installer/commit/257f0f2) Added ARM64 support to the install script and manifest (#802) +- [e490367](https://github.com/stashed/installer/commit/e490367) Add Makefile (#800) +- [cb2289d](https://github.com/stashed/installer/commit/cb2289d) VolumeSnapshot (#787) +- [bde38a8](https://github.com/stashed/installer/commit/bde38a8) Remove importance of order of rule in RestoreSession (#795) +- [0c150a7](https://github.com/stashed/installer/commit/0c150a7) Support PSP enabled cluster (#729) +- [f0d7e34](https://github.com/stashed/installer/commit/f0d7e34) Update package path to stash.appscode.dev/stash (#776) +- [f10a28c](https://github.com/stashed/installer/commit/f10a28c) Remove --rbac flag (#761) +- [1ab5470](https://github.com/stashed/installer/commit/1ab5470) Stash v1beta1 E2E test for DaemonSet (#741) +- [786b827](https://github.com/stashed/installer/commit/786b827) Stash V1beta1 E2E test for Deployment (#710) +- [0d65d5d](https://github.com/stashed/installer/commit/0d65d5d) Fix openapi path prefixes for validators and mutators (#732) +- [13ddd4b](https://github.com/stashed/installer/commit/13ddd4b) Rename admission webhooks to avoid name collision (#725) +- [bd11979](https://github.com/stashed/installer/commit/bd11979) Use FailurePolicy ignore for K8s resource webhooks (#726) +- [bbd9bd4](https://github.com/stashed/installer/commit/bbd9bd4) Add support for OpenShift DeploymentConfig (#714) +- [8c019a2](https://github.com/stashed/installer/commit/8c019a2) Update workload controller for new design (#675) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.1-v1](https://github.com/stashed/mongodb/releases/tag/3.4.1-v1) + +- [1ca3960](https://github.com/stashed/mongodb/commit/1ca3960) Prepare for release 3.4.1-v1 (#243) +- [9890353](https://github.com/stashed/mongodb/commit/9890353) Prepare for release 3.4.1-rc.20200827 (#231) +- [d941a98](https://github.com/stashed/mongodb/commit/d941a98) [cherry-pick] Upload charts without updating index (#220) +- [1d2811c](https://github.com/stashed/mongodb/commit/1d2811c) Prepare for release 3.4.1-rc.20200826 (#208) +- [b3501fb](https://github.com/stashed/mongodb/commit/b3501fb) [cherry-pick] Update README.md (#197) +- [1c08dfd](https://github.com/stashed/mongodb/commit/1c08dfd) Prepare for release 3.4.1-beta.20200826 (#185) +- [a4d2b49](https://github.com/stashed/mongodb/commit/a4d2b49) [cherry-pick] Update Stash installation link (#173) (#174) +- [3ae949e](https://github.com/stashed/mongodb/commit/3ae949e) [cherry-pick] Fix output format + Add PreBackupActions logic (#149) (#162) +- [75ebc36](https://github.com/stashed/mongodb/commit/75ebc36) [cherry-pick] Make image.tag in values.yaml same as $APP_VERSION (#150) (#151) +- [c261899](https://github.com/stashed/mongodb/commit/c261899) [cherry-pick] Update chart icon (#138) +- [465f36c](https://github.com/stashed/mongodb/commit/465f36c) [cherry-pick] Make chart registry configurable (#126) (#127) +- [a354b6c](https://github.com/stashed/mongodb/commit/a354b6c) Prepare for release 3.4.1-beta.20200709 (#114) +- [2269fa6](https://github.com/stashed/mongodb/commit/2269fa6) [cherry-pick] Build docker image in release workflow (#102) (#103) +- [47b1d72](https://github.com/stashed/mongodb/commit/47b1d72) Prepare for release 3.4.1-beta.20200708 (#90) +- [67b293a](https://github.com/stashed/mongodb/commit/67b293a) [cherry-pick] Publish to testing dir for alpha/beta releases (#78) (#79) +- [d8c9489](https://github.com/stashed/mongodb/commit/d8c9489) [cherry-pick] Update License (#66) (#67) +- [13f91cd](https://github.com/stashed/mongodb/commit/13f91cd) Add commands to update chart version (#65) +- [5ec5c3c](https://github.com/stashed/mongodb/commit/5ec5c3c) [cherry-pick] Update update-release-tracker.sh (#54) +- [409301c](https://github.com/stashed/mongodb/commit/409301c) Add script to update release tracker on pr merge (#41) +- [deed415](https://github.com/stashed/mongodb/commit/deed415) [cherry-pick] Update release.yml (#42) (#43) +- [7efcffb](https://github.com/stashed/mongodb/commit/7efcffb) [cherry-pick] Add workflow to cherry pick commits to master (#29) (#30) +- [2ed8277](https://github.com/stashed/mongodb/commit/2ed8277) Fix chart release process (#28) +- [b7b3bc6](https://github.com/stashed/mongodb/commit/b7b3bc6) Update .kodiak.toml +- [33abf73](https://github.com/stashed/mongodb/commit/33abf73) Allow overwriting secret key via SecretTransformation (#27) +- [ad30b7d](https://github.com/stashed/mongodb/commit/ad30b7d) Make waitTimeout configurable through flag (#26) +- [80f62d1](https://github.com/stashed/mongodb/commit/80f62d1) Create .kodiak.toml +- [d8e7b86](https://github.com/stashed/mongodb/commit/d8e7b86) Fix typos +- [f5dfaea](https://github.com/stashed/mongodb/commit/f5dfaea) Update to Kubernetes v1.18.3 (#25) +- [4a462cb](https://github.com/stashed/mongodb/commit/4a462cb) Update crazy-max/ghaction-docker-buildx flag +- [961fad3](https://github.com/stashed/mongodb/commit/961fad3) Fix typos +- [14024ab](https://github.com/stashed/mongodb/commit/14024ab) Trigger the workflow on push or pull request +- [c80a723](https://github.com/stashed/mongodb/commit/c80a723) Auto generate chart readme file +- [223dbfd](https://github.com/stashed/mongodb/commit/223dbfd) Correctly mark optional fields +- [8b3b75d](https://github.com/stashed/mongodb/commit/8b3b75d) Add openapi v3 schema for values file (#21) +- [6229815](https://github.com/stashed/mongodb/commit/6229815) Update CI configuration +- [3f2f090](https://github.com/stashed/mongodb/commit/3f2f090) Add support for specifying S3 region (#20) +- [55f007d](https://github.com/stashed/mongodb/commit/55f007d) Make output.json file writable to all users + Fix Flag types (#19) +- [93643f3](https://github.com/stashed/mongodb/commit/93643f3) Fix with arguments to mongorestore (#14) +- [0d9595c](https://github.com/stashed/mongodb/commit/0d9595c) Update hugo frontmatter for stash website +- [cb27f47](https://github.com/stashed/mongodb/commit/cb27f47) Added --nsExclude=config.changelog to standalone +- [a941eb0](https://github.com/stashed/mongodb/commit/a941eb0) Enable race detector in e2e tests +- [2ed387f](https://github.com/stashed/mongodb/commit/2ed387f) Fix broken link and add AppBinding scheme field (#13) +- [8dd0ea1](https://github.com/stashed/mongodb/commit/8dd0ea1) Test installers (#12) +- [5199d20](https://github.com/stashed/mongodb/commit/5199d20) Add license header to files (#11) +- [f89adec](https://github.com/stashed/mongodb/commit/f89adec) Split imports into 3 parts (#10) +- [1c447f4](https://github.com/stashed/mongodb/commit/1c447f4) Fix BackupSession's Print Columns (#9) +- [201a06e](https://github.com/stashed/mongodb/commit/201a06e) Enable make ci (#8) +- [613feea](https://github.com/stashed/mongodb/commit/613feea) Remove --enable-status-subresource flag (#7) +- [95c3974](https://github.com/stashed/mongodb/commit/95c3974) Update totalHosts from backup/restore process (#6) +- [3097a67](https://github.com/stashed/mongodb/commit/3097a67) Fix argument passing (#5) +- [ccdf81f](https://github.com/stashed/mongodb/commit/ccdf81f) Remove support for arm and arm64 architecture +- [f0b8e87](https://github.com/stashed/mongodb/commit/f0b8e87) Prepare for 3.4.17 release +- [16ad538](https://github.com/stashed/mongodb/commit/16ad538) Prepare for 3.4 release +- [c4eb920](https://github.com/stashed/mongodb/commit/c4eb920) Add release pipeline (#4) +- [02b9a9f](https://github.com/stashed/mongodb/commit/02b9a9f) Update go.yml +- [7ede5fd](https://github.com/stashed/mongodb/commit/7ede5fd) Finalize doc template (#3) +- [bb3b7fd](https://github.com/stashed/mongodb/commit/bb3b7fd) Enable GitHub actions +- [6874298](https://github.com/stashed/mongodb/commit/6874298) Improve error handling + remove metrics handling part (#2) +- [000f2c6](https://github.com/stashed/mongodb/commit/000f2c6) Use docker buildx to build docker image +- [867a620](https://github.com/stashed/mongodb/commit/867a620) Use github.com/Azure/go-autorest/autorest@v0.7.0 +- [ecb6143](https://github.com/stashed/mongodb/commit/ecb6143) run `go fmt` +- [618886d](https://github.com/stashed/mongodb/commit/618886d) Improve Mongodump for sharded and replicaset cluster && Chart and documentation (#1) +- [4a7d5c8](https://github.com/stashed/mongodb/commit/4a7d5c8) Reorganize repo +- [1972a9a](https://github.com/stashed/mongodb/commit/1972a9a) VolumeSnapshot (#787) +- [3f1f4cf](https://github.com/stashed/mongodb/commit/3f1f4cf) Remove importance of order of rule in RestoreSession (#795) +- [86a4af0](https://github.com/stashed/mongodb/commit/86a4af0) Skip BackupSession creation if target does not exist + use timestamp … (#797) +- [3abe6f6](https://github.com/stashed/mongodb/commit/3abe6f6) Use restic 0.9.5 (#789) +- [85b21bf](https://github.com/stashed/mongodb/commit/85b21bf) Update concept doc (#739) +- [ad5c8f2](https://github.com/stashed/mongodb/commit/ad5c8f2) Add support for backup cluster resources YAML (#721) +- [2bb8ec3](https://github.com/stashed/mongodb/commit/2bb8ec3) Backup and restore Elasticsearch (#702) +- [1f21268](https://github.com/stashed/mongodb/commit/1f21268) Update package path to stash.appscode.dev/stash (#776) +- [e8fb571](https://github.com/stashed/mongodb/commit/e8fb571) Update to k8s 1.14.0 client libraries using go.mod (#775) +- [eab0f8e](https://github.com/stashed/mongodb/commit/eab0f8e) Remove --rbac flag (#761) +- [4c3e7ea](https://github.com/stashed/mongodb/commit/4c3e7ea) Skip creating/processing backup-session when backup-config is paused (#759) +- [7905eff](https://github.com/stashed/mongodb/commit/7905eff) Stash v1beta1 E2E test for PVC (#753) +- [2c44ee8](https://github.com/stashed/mongodb/commit/2c44ee8) Implement snapshots for v1beta1 api (#749) +- [c88df7a](https://github.com/stashed/mongodb/commit/c88df7a) Run restic commands using docker (#754) +- [8e24d32](https://github.com/stashed/mongodb/commit/8e24d32) Fixed scratch-dir, output-dir and hostname in functions/tasks yamls (#744) +- [8d5944d](https://github.com/stashed/mongodb/commit/8d5944d) Add Stash CLI (#734) +- [550ab37](https://github.com/stashed/mongodb/commit/550ab37) Apply nice/ionice settings from env (#746) +- [42ed76b](https://github.com/stashed/mongodb/commit/42ed76b) Stash V1beta1 E2E test for Deployment (#710) +- [d63f9e9](https://github.com/stashed/mongodb/commit/d63f9e9) Fix openapi path prefixes for validators and mutators (#732) +- [c1347ed](https://github.com/stashed/mongodb/commit/c1347ed) Add max-connections for GCS, Azure, B2 backend (#730) +- [859c4ee](https://github.com/stashed/mongodb/commit/859c4ee) Rename admission webhooks to avoid name collision (#725) +- [d631bb9](https://github.com/stashed/mongodb/commit/d631bb9) Apply EmptyDir settings to TmpDir (#719) +- [cc70068](https://github.com/stashed/mongodb/commit/cc70068) Add support for rest backend (#713) +- [e4db000](https://github.com/stashed/mongodb/commit/e4db000) Add support for OpenShift DeploymentConfig (#714) +- [3fa7bdb](https://github.com/stashed/mongodb/commit/3fa7bdb) Backup and restore Mongo DB (#699) +- [4c39235](https://github.com/stashed/mongodb/commit/4c39235) Backup and restore MySQL DB (#696) +- [3e89d32](https://github.com/stashed/mongodb/commit/3e89d32) Backup and restore Postgres DB (#695) +- [03b95f3](https://github.com/stashed/mongodb/commit/03b95f3) Add BackupSession Controller for Sidecar (#701) +- [cacbc7d](https://github.com/stashed/mongodb/commit/cacbc7d) Update workload controller for new design (#675) +- [5c173e5](https://github.com/stashed/mongodb/commit/5c173e5) Post backup/restore status update (#691) +- [50bbb0a](https://github.com/stashed/mongodb/commit/50bbb0a) Backup and restore PVC (#676) +- [d4a53e2](https://github.com/stashed/mongodb/commit/d4a53e2) Add BackupConfiguration Controller (#671) +- [ef9a4ae](https://github.com/stashed/mongodb/commit/ef9a4ae) Update Kubernetes client libraries to 1.13.0 (#687) +- [c48dbfc](https://github.com/stashed/mongodb/commit/c48dbfc) Separate type definitions into individual files (#646) +- [77f2113](https://github.com/stashed/mongodb/commit/77f2113) Use flags.DumpAll to dump flags (#624) +- [cb54d8c](https://github.com/stashed/mongodb/commit/cb54d8c) Set periodic analytics (#623) +- [248a53a](https://github.com/stashed/mongodb/commit/248a53a) Add validation webhook xray (#618) +- [2029bf4](https://github.com/stashed/mongodb/commit/2029bf4) Use dynamic pushgateway url (#614) +- [bcf5926](https://github.com/stashed/mongodb/commit/bcf5926) Fix offline backup (#537) +- [5049a63](https://github.com/stashed/mongodb/commit/5049a63) Fix extended apiserver issues with Kubernetes 1.11 (#536) +- [9d31255](https://github.com/stashed/mongodb/commit/9d31255) Update client-go to v8.0.0 (#528) +- [d872b4c](https://github.com/stashed/mongodb/commit/d872b4c) Enable status subresource for crds (#524) +- [4795dba](https://github.com/stashed/mongodb/commit/4795dba) Remove ops-address port (#518) +- [e95b151](https://github.com/stashed/mongodb/commit/e95b151) Add support for initial backoff to the apiserver call on recover (#476) +- [120e5de](https://github.com/stashed/mongodb/commit/120e5de) Disable admission controllers for webhook server (#468) +- [2f19545](https://github.com/stashed/mongodb/commit/2f19545) Update client-go to 7.0.0 (#463) +- [e613ff5](https://github.com/stashed/mongodb/commit/e613ff5) Fixes RBAC issue in test (#449) +- [56a3a74](https://github.com/stashed/mongodb/commit/56a3a74) Some cleanup (#446) +- [02565bb](https://github.com/stashed/mongodb/commit/02565bb) Delete restic repository from backend if Repository CRD is deleted (#438) +- [ea98067](https://github.com/stashed/mongodb/commit/ea98067) Fix go_vet error (#440) +- [9d626eb](https://github.com/stashed/mongodb/commit/9d626eb) Increase qps and burst limits (#435) +- [5c6713f](https://github.com/stashed/mongodb/commit/5c6713f) Show repository snapshot list (#417) +- [6d8ef78](https://github.com/stashed/mongodb/commit/6d8ef78) Expose swagger.json (#420) +- [8e04ca0](https://github.com/stashed/mongodb/commit/8e04ca0) Create repository crd for each Restic repository (#394) +- [4c9a478](https://github.com/stashed/mongodb/commit/4c9a478) Rename --analytics to --enable-analytics (#384) +- [7ea2220](https://github.com/stashed/mongodb/commit/7ea2220) Replace initializers with mutation webhook for workloads (#363) +- [2770e6b](https://github.com/stashed/mongodb/commit/2770e6b) Use admission hook helpers from kutil (#360) +- [d3754d7](https://github.com/stashed/mongodb/commit/d3754d7) Implement offline backup for multiple replica (#335) +- [13a2d14](https://github.com/stashed/mongodb/commit/13a2d14) Use official code generator scripts (#336) +- [90642ce](https://github.com/stashed/mongodb/commit/90642ce) Fix e2e tests after webhook merger (#333) +- [2fc3239](https://github.com/stashed/mongodb/commit/2fc3239) Leave secure port unset +- [7cb52b2](https://github.com/stashed/mongodb/commit/7cb52b2) Merge admission webhook and operator into one binary (#329) +- [3306427](https://github.com/stashed/mongodb/commit/3306427) Implement informer factory for backup scheduler (#325) +- [7bb027b](https://github.com/stashed/mongodb/commit/7bb027b) Cleanup apiserver +- [fb8c1e4](https://github.com/stashed/mongodb/commit/fb8c1e4) Copy generic-admission-server into pkg (#318) +- [5a5093f](https://github.com/stashed/mongodb/commit/5a5093f) Use shared infromer factory (#317) +- [0ccb948](https://github.com/stashed/mongodb/commit/0ccb948) Use GetBaseVersion method from kutil (#316) +- [8c5e6ff](https://github.com/stashed/mongodb/commit/8c5e6ff) Fix webhook command description (#314) +- [775a2b6](https://github.com/stashed/mongodb/commit/775a2b6) Merge webhook plugins into one. (#311) +- [a8659fe](https://github.com/stashed/mongodb/commit/a8659fe) Add ValidatingAdmissionWebhook for Stash CRDs (#299) +- [c3e177c](https://github.com/stashed/mongodb/commit/c3e177c) Added support for private docker registry (#300) +- [62ec42e](https://github.com/stashed/mongodb/commit/62ec42e) Update dependencies to Kubernetes 1.9 (#297) +- [cf3ea7c](https://github.com/stashed/mongodb/commit/cf3ea7c) Update appscode/go log wrapper (#287) +- [470cc31](https://github.com/stashed/mongodb/commit/470cc31) Pass --pushgateway-url for injected containers. (#284) +- [e2e79c6](https://github.com/stashed/mongodb/commit/e2e79c6) Fix kubectl version parsing generation in GKE (#267) +- [326aea4](https://github.com/stashed/mongodb/commit/326aea4) Detect analytics client id using env vars (#265) +- [4a5912c](https://github.com/stashed/mongodb/commit/4a5912c) Prepare docs for 0.6.0 release (#264) +- [f75d5df](https://github.com/stashed/mongodb/commit/f75d5df) Remove restic-dependency from recovery (#258) +- [86f01f3](https://github.com/stashed/mongodb/commit/86f01f3) Log operator version on start (#253) +- [4e29b70](https://github.com/stashed/mongodb/commit/4e29b70) Simplify clientID generation for analytics (#247) +- [a45937f](https://github.com/stashed/mongodb/commit/a45937f) Set analytics clientID (#246) +- [ea53cea](https://github.com/stashed/mongodb/commit/ea53cea) Enable Restic cahce-dir flag (#241) +- [dc0030d](https://github.com/stashed/mongodb/commit/dc0030d) Implement offline backup (#229) +- [ae40f35](https://github.com/stashed/mongodb/commit/ae40f35) Revendor kutil (#230) +- [d68a34d](https://github.com/stashed/mongodb/commit/d68a34d) Record recovery status for individual FileGroup (#222) +- [15a24b7](https://github.com/stashed/mongodb/commit/15a24b7) Leader election for deployment, replica set and rc (#206) +- [4a75689](https://github.com/stashed/mongodb/commit/4a75689) Implement Recovery for Restic Backup (#202) +- [78b3942](https://github.com/stashed/mongodb/commit/78b3942) Use typed versioned client for CRD +- [b857b05](https://github.com/stashed/mongodb/commit/b857b05) Change `k8s.io/api/core/v1` pkg alias to core (#204) +- [e52f848](https://github.com/stashed/mongodb/commit/e52f848) Use client-go 5.x +- [4f376ad](https://github.com/stashed/mongodb/commit/4f376ad) Set hostname based on resource type (#198) +- [e530116](https://github.com/stashed/mongodb/commit/e530116) Manage RoleBinding for rbac enabled cluster (#197) +- [e28c13f](https://github.com/stashed/mongodb/commit/e28c13f) Use workqueue for scheduler (#194) +- [2719cbd](https://github.com/stashed/mongodb/commit/2719cbd) Fix e2e tests (#183) +- [9c1cc43](https://github.com/stashed/mongodb/commit/9c1cc43) Use workqueue (#182) +- [b3ee076](https://github.com/stashed/mongodb/commit/b3ee076) Only watch apps/v1beta1 Deployment (#178) +- [4f92ca6](https://github.com/stashed/mongodb/commit/4f92ca6) Use Namespace() method from kutil. +- [78f1e7f](https://github.com/stashed/mongodb/commit/78f1e7f) Update kutil (#170) +- [29a8a1f](https://github.com/stashed/mongodb/commit/29a8a1f) Use apis/v1alpha1 instead of internal version (#167) +- [da3eb2e](https://github.com/stashed/mongodb/commit/da3eb2e) Use kubernetes/code-generator (#163) +- [3b1d6bf](https://github.com/stashed/mongodb/commit/3b1d6bf) Expose resync-period as flag +- [35d8dc6](https://github.com/stashed/mongodb/commit/35d8dc6) Move analytics collector to root command (#164) +- [6a55694](https://github.com/stashed/mongodb/commit/6a55694) Migrate TPR to CRD (#160) +- [91f678f](https://github.com/stashed/mongodb/commit/91f678f) Rename RepositorySecretName to StorageSecretName (#135) +- [d666c81](https://github.com/stashed/mongodb/commit/d666c81) Change mount path for labels to /etc/stash +- [1177d60](https://github.com/stashed/mongodb/commit/1177d60) Part 6 - Update docs (#121) +- [a15689d](https://github.com/stashed/mongodb/commit/a15689d) Various bug fixes (#118) +- [d8a5771](https://github.com/stashed/mongodb/commit/d8a5771) Set TMPDIR env var for restic (#115) +- [60ed8f7](https://github.com/stashed/mongodb/commit/60ed8f7) Update user guide (#94) + + +### [3.4.2-v1](https://github.com/stashed/mongodb/releases/tag/3.4.2-v1) + + + +### [3.6.1-v1](https://github.com/stashed/mongodb/releases/tag/3.6.1-v1) + + + +### [3.6.8-v1](https://github.com/stashed/mongodb/releases/tag/3.6.8-v1) + +- [384ac18](https://github.com/stashed/mongodb/commit/384ac18) Prepare for release 3.6.8-v1 (#246) +- [fae0fa3](https://github.com/stashed/mongodb/commit/fae0fa3) Prepare for release 3.6.8-rc.20200827 (#234) +- [59da835](https://github.com/stashed/mongodb/commit/59da835) [cherry-pick] Upload charts without updating index (#223) +- [ae2ba11](https://github.com/stashed/mongodb/commit/ae2ba11) Prepare for release 3.6.8-rc.20200826 (#211) +- [f6bbd70](https://github.com/stashed/mongodb/commit/f6bbd70) [cherry-pick] Update README.md (#200) +- [a2098a8](https://github.com/stashed/mongodb/commit/a2098a8) Prepare for release 3.6.8-beta.20200826 (#188) +- [81cad93](https://github.com/stashed/mongodb/commit/81cad93) [cherry-pick] Update Stash installation link (#173) (#177) +- [0711cec](https://github.com/stashed/mongodb/commit/0711cec) [cherry-pick] Fix output format + Add PreBackupActions logic (#149) (#165) +- [cd921b7](https://github.com/stashed/mongodb/commit/cd921b7) [cherry-pick] Make image.tag in values.yaml same as $APP_VERSION (#150) (#154) +- [5d29173](https://github.com/stashed/mongodb/commit/5d29173) [cherry-pick] Update chart icon (#141) +- [a8265a7](https://github.com/stashed/mongodb/commit/a8265a7) [cherry-pick] Make chart registry configurable (#126) (#130) +- [a95f051](https://github.com/stashed/mongodb/commit/a95f051) Prepare for release 3.6.8-beta.20200709 (#117) +- [8f74e62](https://github.com/stashed/mongodb/commit/8f74e62) [cherry-pick] Build docker image in release workflow (#102) (#106) +- [2c74f48](https://github.com/stashed/mongodb/commit/2c74f48) Prepare for release 3.6.8-beta.20200708 (#93) +- [ad45d26](https://github.com/stashed/mongodb/commit/ad45d26) [cherry-pick] Publish to testing dir for alpha/beta releases (#78) (#82) +- [8eb1169](https://github.com/stashed/mongodb/commit/8eb1169) [cherry-pick] Update License (#66) (#70) +- [0d12f73](https://github.com/stashed/mongodb/commit/0d12f73) Add commands to update chart version (#65) +- [ab1ca6b](https://github.com/stashed/mongodb/commit/ab1ca6b) [cherry-pick] Update update-release-tracker.sh (#57) +- [5c13265](https://github.com/stashed/mongodb/commit/5c13265) Add script to update release tracker on pr merge (#41) +- [300fd5d](https://github.com/stashed/mongodb/commit/300fd5d) [cherry-pick] Update release.yml (#42) (#46) +- [0b1ef75](https://github.com/stashed/mongodb/commit/0b1ef75) [cherry-pick] Add workflow to cherry pick commits to master (#29) (#33) +- [37671b0](https://github.com/stashed/mongodb/commit/37671b0) Fix chart release process (#28) +- [4c11ef1](https://github.com/stashed/mongodb/commit/4c11ef1) Update .kodiak.toml +- [438d408](https://github.com/stashed/mongodb/commit/438d408) Allow overwriting secret key via SecretTransformation (#27) +- [64c3cef](https://github.com/stashed/mongodb/commit/64c3cef) Make waitTimeout configurable through flag (#26) +- [f22e19d](https://github.com/stashed/mongodb/commit/f22e19d) Create .kodiak.toml +- [bbcdca0](https://github.com/stashed/mongodb/commit/bbcdca0) Fix typos +- [cae40f7](https://github.com/stashed/mongodb/commit/cae40f7) Update to Kubernetes v1.18.3 (#25) +- [6e726c5](https://github.com/stashed/mongodb/commit/6e726c5) Update crazy-max/ghaction-docker-buildx flag +- [7e0a42b](https://github.com/stashed/mongodb/commit/7e0a42b) Fix typos +- [a908726](https://github.com/stashed/mongodb/commit/a908726) Trigger the workflow on push or pull request +- [cfda73c](https://github.com/stashed/mongodb/commit/cfda73c) Auto generate chart readme file +- [f38510e](https://github.com/stashed/mongodb/commit/f38510e) Correctly mark optional fields +- [9d9fc23](https://github.com/stashed/mongodb/commit/9d9fc23) Add openapi v3 schema for values file (#21) + + +### [4.0.3-v1](https://github.com/stashed/mongodb/releases/tag/4.0.3-v1) + +- [fa38022](https://github.com/stashed/mongodb/commit/fa38022) Prepare for release 4.0.3-v1 (#248) +- [e6669a9](https://github.com/stashed/mongodb/commit/e6669a9) Prepare for release 4.0.3-rc.20200827 (#236) +- [7a1efc6](https://github.com/stashed/mongodb/commit/7a1efc6) [cherry-pick] Upload charts without updating index (#225) +- [0166946](https://github.com/stashed/mongodb/commit/0166946) Prepare for release 4.0.3-rc.20200826 (#213) +- [0d636e1](https://github.com/stashed/mongodb/commit/0d636e1) [cherry-pick] Update README.md (#202) +- [fd4d40e](https://github.com/stashed/mongodb/commit/fd4d40e) Prepare for release 4.0.3-beta.20200826 (#190) +- [3b2f40b](https://github.com/stashed/mongodb/commit/3b2f40b) [cherry-pick] Update Stash installation link (#173) (#179) +- [5ba31a4](https://github.com/stashed/mongodb/commit/5ba31a4) [cherry-pick] Fix output format + Add PreBackupActions logic (#149) (#167) +- [349f6c0](https://github.com/stashed/mongodb/commit/349f6c0) [cherry-pick] Make image.tag in values.yaml same as $APP_VERSION (#150) (#156) +- [eb32485](https://github.com/stashed/mongodb/commit/eb32485) [cherry-pick] Update chart icon (#143) +- [e2b05d8](https://github.com/stashed/mongodb/commit/e2b05d8) [cherry-pick] Make chart registry configurable (#126) (#132) +- [b7719bd](https://github.com/stashed/mongodb/commit/b7719bd) Prepare for release 4.0.3-beta.20200709 (#119) +- [7c9074d](https://github.com/stashed/mongodb/commit/7c9074d) [cherry-pick] Build docker image in release workflow (#102) (#108) +- [974b230](https://github.com/stashed/mongodb/commit/974b230) Prepare for release 4.0.3-beta.20200708 (#95) +- [70d290e](https://github.com/stashed/mongodb/commit/70d290e) [cherry-pick] Publish to testing dir for alpha/beta releases (#78) (#84) +- [ffb3cc5](https://github.com/stashed/mongodb/commit/ffb3cc5) [cherry-pick] Update License (#66) (#72) +- [42c182f](https://github.com/stashed/mongodb/commit/42c182f) Add commands to update chart version (#65) +- [602e631](https://github.com/stashed/mongodb/commit/602e631) [cherry-pick] Update update-release-tracker.sh (#59) +- [f2c40c3](https://github.com/stashed/mongodb/commit/f2c40c3) Add script to update release tracker on pr merge (#41) +- [f2fe3de](https://github.com/stashed/mongodb/commit/f2fe3de) [cherry-pick] Update release.yml (#42) (#48) +- [69e0816](https://github.com/stashed/mongodb/commit/69e0816) [cherry-pick] Add workflow to cherry pick commits to master (#29) (#35) +- [5d3ebfa](https://github.com/stashed/mongodb/commit/5d3ebfa) Fix chart release process (#28) +- [6c1edad](https://github.com/stashed/mongodb/commit/6c1edad) Update .kodiak.toml +- [6ec1e40](https://github.com/stashed/mongodb/commit/6ec1e40) Allow overwriting secret key via SecretTransformation (#27) +- [8ec94bf](https://github.com/stashed/mongodb/commit/8ec94bf) Make waitTimeout configurable through flag (#26) +- [ebd3f81](https://github.com/stashed/mongodb/commit/ebd3f81) Create .kodiak.toml +- [ade156f](https://github.com/stashed/mongodb/commit/ade156f) Fix typos +- [b5e7b0f](https://github.com/stashed/mongodb/commit/b5e7b0f) Update to Kubernetes v1.18.3 (#25) +- [41fa9af](https://github.com/stashed/mongodb/commit/41fa9af) Update crazy-max/ghaction-docker-buildx flag +- [55eb7fe](https://github.com/stashed/mongodb/commit/55eb7fe) Fix typos +- [a94509b](https://github.com/stashed/mongodb/commit/a94509b) Trigger the workflow on push or pull request +- [d00083a](https://github.com/stashed/mongodb/commit/d00083a) Auto generate chart readme file +- [2347473](https://github.com/stashed/mongodb/commit/2347473) Correctly mark optional fields +- [22c33b8](https://github.com/stashed/mongodb/commit/22c33b8) Add openapi v3 schema for values file (#21) + + +### [4.0.5-v1](https://github.com/stashed/mongodb/releases/tag/4.0.5-v1) + +- [0559144](https://github.com/stashed/mongodb/commit/0559144) Prepare for release 4.0.5-v1 (#249) +- [8bded32](https://github.com/stashed/mongodb/commit/8bded32) Prepare for release 4.0.5-rc.20200827 (#237) +- [58fa99e](https://github.com/stashed/mongodb/commit/58fa99e) [cherry-pick] Upload charts without updating index (#226) +- [77353e5](https://github.com/stashed/mongodb/commit/77353e5) Prepare for release 4.0.5-rc.20200826 (#214) +- [8d3af1e](https://github.com/stashed/mongodb/commit/8d3af1e) [cherry-pick] Update README.md (#203) +- [1bbff77](https://github.com/stashed/mongodb/commit/1bbff77) Prepare for release 4.0.5-beta.20200826 (#191) +- [51d0388](https://github.com/stashed/mongodb/commit/51d0388) [cherry-pick] Update Stash installation link (#173) (#180) +- [444ed15](https://github.com/stashed/mongodb/commit/444ed15) [cherry-pick] Fix output format + Add PreBackupActions logic (#149) (#168) +- [00cfb11](https://github.com/stashed/mongodb/commit/00cfb11) [cherry-pick] Make image.tag in values.yaml same as $APP_VERSION (#150) (#157) +- [8a0c6ce](https://github.com/stashed/mongodb/commit/8a0c6ce) [cherry-pick] Update chart icon (#144) +- [e514864](https://github.com/stashed/mongodb/commit/e514864) [cherry-pick] Make chart registry configurable (#126) (#133) +- [78ab8d2](https://github.com/stashed/mongodb/commit/78ab8d2) Prepare for release 4.0.5-beta.20200709 (#120) +- [12af669](https://github.com/stashed/mongodb/commit/12af669) [cherry-pick] Build docker image in release workflow (#102) (#109) +- [18a8386](https://github.com/stashed/mongodb/commit/18a8386) Prepare for release 4.0.5-beta.20200708 (#96) +- [cdba01e](https://github.com/stashed/mongodb/commit/cdba01e) [cherry-pick] Publish to testing dir for alpha/beta releases (#78) (#85) +- [54ac1e0](https://github.com/stashed/mongodb/commit/54ac1e0) [cherry-pick] Update License (#66) (#73) +- [84c004f](https://github.com/stashed/mongodb/commit/84c004f) Add commands to update chart version (#65) +- [46d5d4c](https://github.com/stashed/mongodb/commit/46d5d4c) [cherry-pick] Update update-release-tracker.sh (#60) +- [a4d76a8](https://github.com/stashed/mongodb/commit/a4d76a8) Add script to update release tracker on pr merge (#41) +- [49bffca](https://github.com/stashed/mongodb/commit/49bffca) [cherry-pick] Update release.yml (#42) (#49) +- [f55af9c](https://github.com/stashed/mongodb/commit/f55af9c) [cherry-pick] Add workflow to cherry pick commits to master (#29) (#36) +- [2e094ad](https://github.com/stashed/mongodb/commit/2e094ad) Fix chart release process (#28) +- [57335b4](https://github.com/stashed/mongodb/commit/57335b4) Update .kodiak.toml +- [d2be592](https://github.com/stashed/mongodb/commit/d2be592) Allow overwriting secret key via SecretTransformation (#27) +- [123c843](https://github.com/stashed/mongodb/commit/123c843) Make waitTimeout configurable through flag (#26) +- [e63c62b](https://github.com/stashed/mongodb/commit/e63c62b) Create .kodiak.toml +- [96a2417](https://github.com/stashed/mongodb/commit/96a2417) Fix typos +- [2a8fd96](https://github.com/stashed/mongodb/commit/2a8fd96) Update to Kubernetes v1.18.3 (#25) +- [b9efbb1](https://github.com/stashed/mongodb/commit/b9efbb1) Update crazy-max/ghaction-docker-buildx flag +- [048464c](https://github.com/stashed/mongodb/commit/048464c) Fix typos +- [fc3d4aa](https://github.com/stashed/mongodb/commit/fc3d4aa) Trigger the workflow on push or pull request +- [901f4d0](https://github.com/stashed/mongodb/commit/901f4d0) Auto generate chart readme file +- [7775e7c](https://github.com/stashed/mongodb/commit/7775e7c) Correctly mark optional fields +- [480ad5b](https://github.com/stashed/mongodb/commit/480ad5b) Add openapi v3 schema for values file (#21) + + +### [4.0.11-v1](https://github.com/stashed/mongodb/releases/tag/4.0.11-v1) + +- [bc7a353](https://github.com/stashed/mongodb/commit/bc7a353) Prepare for release 4.0.11-v1 (#247) +- [2dfe220](https://github.com/stashed/mongodb/commit/2dfe220) Prepare for release 4.0.11-rc.20200827 (#235) +- [7ccf88d](https://github.com/stashed/mongodb/commit/7ccf88d) [cherry-pick] Upload charts without updating index (#224) +- [5f7ae55](https://github.com/stashed/mongodb/commit/5f7ae55) Prepare for release 4.0.11-rc.20200826 (#212) +- [359a868](https://github.com/stashed/mongodb/commit/359a868) [cherry-pick] Update README.md (#201) +- [b794eee](https://github.com/stashed/mongodb/commit/b794eee) Prepare for release 4.0.1-beta.20200826 (#189) +- [8e835ce](https://github.com/stashed/mongodb/commit/8e835ce) [cherry-pick] Update Stash installation link (#173) (#178) +- [0025cc4](https://github.com/stashed/mongodb/commit/0025cc4) [cherry-pick] Fix output format + Add PreBackupActions logic (#149) (#166) +- [bc8f7a5](https://github.com/stashed/mongodb/commit/bc8f7a5) [cherry-pick] Make image.tag in values.yaml same as $APP_VERSION (#150) (#155) +- [7b0bb50](https://github.com/stashed/mongodb/commit/7b0bb50) [cherry-pick] Update chart icon (#142) +- [a9621b6](https://github.com/stashed/mongodb/commit/a9621b6) [cherry-pick] Make chart registry configurable (#126) (#131) +- [4168a4b](https://github.com/stashed/mongodb/commit/4168a4b) Prepare for release 4.0.1-beta.20200709 (#118) +- [90723f4](https://github.com/stashed/mongodb/commit/90723f4) [cherry-pick] Build docker image in release workflow (#102) (#107) +- [0304c42](https://github.com/stashed/mongodb/commit/0304c42) Prepare for release 4.0.1-beta.20200708 (#94) +- [276fcb6](https://github.com/stashed/mongodb/commit/276fcb6) [cherry-pick] Publish to testing dir for alpha/beta releases (#78) (#83) +- [bf8701f](https://github.com/stashed/mongodb/commit/bf8701f) [cherry-pick] Update License (#66) (#71) +- [6aaff28](https://github.com/stashed/mongodb/commit/6aaff28) Add commands to update chart version (#65) +- [222720b](https://github.com/stashed/mongodb/commit/222720b) [cherry-pick] Update update-release-tracker.sh (#58) +- [3184ed5](https://github.com/stashed/mongodb/commit/3184ed5) Add script to update release tracker on pr merge (#41) +- [fa39e11](https://github.com/stashed/mongodb/commit/fa39e11) [cherry-pick] Update release.yml (#42) (#47) +- [3bbadab](https://github.com/stashed/mongodb/commit/3bbadab) [cherry-pick] Add workflow to cherry pick commits to master (#29) (#34) +- [576171a](https://github.com/stashed/mongodb/commit/576171a) Fix chart release process (#28) +- [2b84c51](https://github.com/stashed/mongodb/commit/2b84c51) Update .kodiak.toml +- [bfcfd1e](https://github.com/stashed/mongodb/commit/bfcfd1e) Allow overwriting secret key via SecretTransformation (#27) +- [4830c47](https://github.com/stashed/mongodb/commit/4830c47) Make waitTimeout configurable through flag (#26) +- [cf7ae46](https://github.com/stashed/mongodb/commit/cf7ae46) Create .kodiak.toml +- [3c23777](https://github.com/stashed/mongodb/commit/3c23777) Fix typos +- [b774f8d](https://github.com/stashed/mongodb/commit/b774f8d) Update to Kubernetes v1.18.3 (#25) +- [83bfeeb](https://github.com/stashed/mongodb/commit/83bfeeb) Update crazy-max/ghaction-docker-buildx flag +- [ec8d37a](https://github.com/stashed/mongodb/commit/ec8d37a) Fix typos +- [5478e9b](https://github.com/stashed/mongodb/commit/5478e9b) Trigger the workflow on push or pull request +- [b35efa4](https://github.com/stashed/mongodb/commit/b35efa4) Auto generate chart readme file +- [f6c6cf8](https://github.com/stashed/mongodb/commit/f6c6cf8) Correctly mark optional fields +- [3e35f9b](https://github.com/stashed/mongodb/commit/3e35f9b) Add openapi v3 schema for values file (#21) + + +### [4.1.1-v1](https://github.com/stashed/mongodb/releases/tag/4.1.1-v1) + + + +### [4.1.4-v1](https://github.com/stashed/mongodb/releases/tag/4.1.4-v1) + +- [2fba087](https://github.com/stashed/mongodb/commit/2fba087) Prepare for release 4.1.4-v1 (#251) +- [84e97a4](https://github.com/stashed/mongodb/commit/84e97a4) Prepare for release 4.1.4-rc.20200827 (#239) +- [3a168e8](https://github.com/stashed/mongodb/commit/3a168e8) [cherry-pick] Upload charts without updating index (#228) +- [14aaf6c](https://github.com/stashed/mongodb/commit/14aaf6c) Prepare for release 4.1.4-rc.20200826 (#216) +- [20d3e9d](https://github.com/stashed/mongodb/commit/20d3e9d) [cherry-pick] Update README.md (#205) +- [c092f8a](https://github.com/stashed/mongodb/commit/c092f8a) Prepare for release 4.1.4-beta.20200826 (#193) +- [cbb683a](https://github.com/stashed/mongodb/commit/cbb683a) [cherry-pick] Update Stash installation link (#173) (#182) +- [f8b1f2c](https://github.com/stashed/mongodb/commit/f8b1f2c) [cherry-pick] Fix output format + Add PreBackupActions logic (#149) (#170) +- [b99744e](https://github.com/stashed/mongodb/commit/b99744e) [cherry-pick] Make image.tag in values.yaml same as $APP_VERSION (#150) (#159) +- [9ee1654](https://github.com/stashed/mongodb/commit/9ee1654) [cherry-pick] Update chart icon (#146) +- [8604d7b](https://github.com/stashed/mongodb/commit/8604d7b) [cherry-pick] Make chart registry configurable (#126) (#135) +- [e3cd383](https://github.com/stashed/mongodb/commit/e3cd383) Prepare for release 4.1.4-beta.20200709 (#122) +- [a310c43](https://github.com/stashed/mongodb/commit/a310c43) [cherry-pick] Build docker image in release workflow (#102) (#111) +- [ae591b4](https://github.com/stashed/mongodb/commit/ae591b4) Prepare for release 4.1.4-beta.20200708 (#98) +- [266e031](https://github.com/stashed/mongodb/commit/266e031) [cherry-pick] Publish to testing dir for alpha/beta releases (#78) (#87) +- [50a7cbd](https://github.com/stashed/mongodb/commit/50a7cbd) [cherry-pick] Update License (#66) (#75) +- [8bbbe69](https://github.com/stashed/mongodb/commit/8bbbe69) Add commands to update chart version (#65) +- [10150b9](https://github.com/stashed/mongodb/commit/10150b9) [cherry-pick] Update update-release-tracker.sh (#62) +- [119fea1](https://github.com/stashed/mongodb/commit/119fea1) Add script to update release tracker on pr merge (#41) +- [1ac6874](https://github.com/stashed/mongodb/commit/1ac6874) [cherry-pick] Update release.yml (#42) (#51) +- [1df644f](https://github.com/stashed/mongodb/commit/1df644f) [cherry-pick] Add workflow to cherry pick commits to master (#29) (#38) +- [053a6bb](https://github.com/stashed/mongodb/commit/053a6bb) Fix chart release process (#28) +- [b65cd98](https://github.com/stashed/mongodb/commit/b65cd98) Update .kodiak.toml +- [b477602](https://github.com/stashed/mongodb/commit/b477602) Allow overwriting secret key via SecretTransformation (#27) +- [77eb85a](https://github.com/stashed/mongodb/commit/77eb85a) Make waitTimeout configurable through flag (#26) +- [4efe18c](https://github.com/stashed/mongodb/commit/4efe18c) Create .kodiak.toml +- [fceb614](https://github.com/stashed/mongodb/commit/fceb614) Fix typos +- [bba7918](https://github.com/stashed/mongodb/commit/bba7918) Update to Kubernetes v1.18.3 (#25) +- [a6540e2](https://github.com/stashed/mongodb/commit/a6540e2) Update crazy-max/ghaction-docker-buildx flag +- [b4b3d8d](https://github.com/stashed/mongodb/commit/b4b3d8d) Fix typos +- [85802fd](https://github.com/stashed/mongodb/commit/85802fd) Trigger the workflow on push or pull request +- [da3e334](https://github.com/stashed/mongodb/commit/da3e334) Auto generate chart readme file +- [56f2d0f](https://github.com/stashed/mongodb/commit/56f2d0f) Correctly mark optional fields +- [f96b2a0](https://github.com/stashed/mongodb/commit/f96b2a0) Add openapi v3 schema for values file (#21) + + +### [4.1.7-v1](https://github.com/stashed/mongodb/releases/tag/4.1.7-v1) + +- [c3f18aa](https://github.com/stashed/mongodb/commit/c3f18aa) Prepare for release 4.1.7-v1 (#252) +- [df9852f](https://github.com/stashed/mongodb/commit/df9852f) Prepare for release 4.1.7-rc.20200827 (#240) +- [b22a028](https://github.com/stashed/mongodb/commit/b22a028) [cherry-pick] Upload charts without updating index (#229) +- [5f2dd1f](https://github.com/stashed/mongodb/commit/5f2dd1f) Prepare for release 4.1.7-rc.20200826 (#217) +- [57fc2d0](https://github.com/stashed/mongodb/commit/57fc2d0) [cherry-pick] Update README.md (#206) +- [8334c89](https://github.com/stashed/mongodb/commit/8334c89) Prepare for release 4.1.7-beta.20200826 (#194) +- [905bdde](https://github.com/stashed/mongodb/commit/905bdde) [cherry-pick] Update Stash installation link (#173) (#183) +- [1eea836](https://github.com/stashed/mongodb/commit/1eea836) [cherry-pick] Fix output format + Add PreBackupActions logic (#149) (#171) +- [52c06d6](https://github.com/stashed/mongodb/commit/52c06d6) [cherry-pick] Make image.tag in values.yaml same as $APP_VERSION (#150) (#160) +- [7765f65](https://github.com/stashed/mongodb/commit/7765f65) [cherry-pick] Update chart icon (#147) +- [7426cba](https://github.com/stashed/mongodb/commit/7426cba) [cherry-pick] Make chart registry configurable (#126) (#136) +- [3eccd08](https://github.com/stashed/mongodb/commit/3eccd08) Prepare for release 4.1.7-beta.20200709 (#123) +- [6377c55](https://github.com/stashed/mongodb/commit/6377c55) [cherry-pick] Build docker image in release workflow (#102) (#112) +- [984ef29](https://github.com/stashed/mongodb/commit/984ef29) Prepare for release 4.1.7-beta.20200708 (#99) +- [09a6e49](https://github.com/stashed/mongodb/commit/09a6e49) [cherry-pick] Publish to testing dir for alpha/beta releases (#78) (#88) +- [6ae5da1](https://github.com/stashed/mongodb/commit/6ae5da1) [cherry-pick] Update License (#66) (#76) +- [e110d7f](https://github.com/stashed/mongodb/commit/e110d7f) Add commands to update chart version (#65) +- [d98d524](https://github.com/stashed/mongodb/commit/d98d524) [cherry-pick] Update update-release-tracker.sh (#63) +- [e7400cf](https://github.com/stashed/mongodb/commit/e7400cf) Add script to update release tracker on pr merge (#41) +- [5917bb7](https://github.com/stashed/mongodb/commit/5917bb7) [cherry-pick] Update release.yml (#42) (#52) +- [2cf14b2](https://github.com/stashed/mongodb/commit/2cf14b2) [cherry-pick] Add workflow to cherry pick commits to master (#29) (#39) +- [e4467cf](https://github.com/stashed/mongodb/commit/e4467cf) Fix chart release process (#28) +- [98ff251](https://github.com/stashed/mongodb/commit/98ff251) Update .kodiak.toml +- [58e7c6b](https://github.com/stashed/mongodb/commit/58e7c6b) Allow overwriting secret key via SecretTransformation (#27) +- [d9381b5](https://github.com/stashed/mongodb/commit/d9381b5) Make waitTimeout configurable through flag (#26) +- [8f0549f](https://github.com/stashed/mongodb/commit/8f0549f) Create .kodiak.toml +- [e06d601](https://github.com/stashed/mongodb/commit/e06d601) Fix typos +- [e2f9971](https://github.com/stashed/mongodb/commit/e2f9971) Update to Kubernetes v1.18.3 (#25) +- [7a93c56](https://github.com/stashed/mongodb/commit/7a93c56) Update crazy-max/ghaction-docker-buildx flag +- [1518e46](https://github.com/stashed/mongodb/commit/1518e46) Fix typos +- [95f7060](https://github.com/stashed/mongodb/commit/95f7060) Trigger the workflow on push or pull request +- [4cc04fb](https://github.com/stashed/mongodb/commit/4cc04fb) Auto generate chart readme file +- [250c96d](https://github.com/stashed/mongodb/commit/250c96d) Correctly mark optional fields +- [672f36e](https://github.com/stashed/mongodb/commit/672f36e) Add openapi v3 schema for values file (#21) + + +### [4.2.3-v1](https://github.com/stashed/mongodb/releases/tag/4.2.3-v1) + +- [3c800d5](https://github.com/stashed/mongodb/commit/3c800d5) Prepare for release 4.2.3-v1 (#253) +- [e4c8466](https://github.com/stashed/mongodb/commit/e4c8466) Prepare for release 4.2.3-rc.20200827 (#241) +- [b45397b](https://github.com/stashed/mongodb/commit/b45397b) [cherry-pick] Upload charts without updating index (#230) +- [ed39fa9](https://github.com/stashed/mongodb/commit/ed39fa9) Prepare for release 4.2.3-rc.20200826 (#218) +- [d4b3301](https://github.com/stashed/mongodb/commit/d4b3301) [cherry-pick] Update README.md (#207) +- [244da2c](https://github.com/stashed/mongodb/commit/244da2c) Prepare for release 4.2.3-beta.20200826 (#195) +- [953e51f](https://github.com/stashed/mongodb/commit/953e51f) Update Stash installation link (#173) (#184) +- [d9c6d0b](https://github.com/stashed/mongodb/commit/d9c6d0b) [cherry-pick] Fix output format + Add PreBackupActions logic (#149) (#172) +- [0ef5cc0](https://github.com/stashed/mongodb/commit/0ef5cc0) [cherry-pick] Make image.tag in values.yaml same as $APP_VERSION (#150) (#161) +- [a51bdac](https://github.com/stashed/mongodb/commit/a51bdac) [cherry-pick] Update chart icon (#148) +- [2ad3b80](https://github.com/stashed/mongodb/commit/2ad3b80) [cherry-pick] Make chart registry configurable (#126) (#137) +- [149e6ba](https://github.com/stashed/mongodb/commit/149e6ba) Prepare for release 4.2.3-beta.20200709 (#124) +- [47879da](https://github.com/stashed/mongodb/commit/47879da) [cherry-pick] Build docker image in release workflow (#102) (#113) +- [51831a5](https://github.com/stashed/mongodb/commit/51831a5) Prepare for release 4.2.3-beta.20200708 (#100) +- [a165f10](https://github.com/stashed/mongodb/commit/a165f10) [cherry-pick] Publish to testing dir for alpha/beta releases (#78) (#89) +- [bff9a6c](https://github.com/stashed/mongodb/commit/bff9a6c) [cherry-pick] Update License (#66) (#77) +- [453ee35](https://github.com/stashed/mongodb/commit/453ee35) Add commands to update chart version (#65) +- [aa8bb11](https://github.com/stashed/mongodb/commit/aa8bb11) [cherry-pick] Update update-release-tracker.sh (#64) +- [14cbd6b](https://github.com/stashed/mongodb/commit/14cbd6b) Add script to update release tracker on pr merge (#41) +- [9c196ca](https://github.com/stashed/mongodb/commit/9c196ca) [cherry-pick] Update release.yml (#42) (#53) +- [e23a429](https://github.com/stashed/mongodb/commit/e23a429) [cherry-pick] Add workflow to cherry pick commits to master (#29) (#40) +- [9e025b1](https://github.com/stashed/mongodb/commit/9e025b1) Fix chart release process (#28) +- [3eff74c](https://github.com/stashed/mongodb/commit/3eff74c) Update .kodiak.toml +- [d0b7108](https://github.com/stashed/mongodb/commit/d0b7108) Allow overwriting secret key via SecretTransformation (#27) +- [5fc5d46](https://github.com/stashed/mongodb/commit/5fc5d46) Make waitTimeout configurable through flag (#26) +- [b5df21e](https://github.com/stashed/mongodb/commit/b5df21e) Create .kodiak.toml +- [7ee7c62](https://github.com/stashed/mongodb/commit/7ee7c62) Fix typos +- [28c4d75](https://github.com/stashed/mongodb/commit/28c4d75) Update to Kubernetes v1.18.3 (#25) +- [579ca21](https://github.com/stashed/mongodb/commit/579ca21) Update crazy-max/ghaction-docker-buildx flag +- [0f7868a](https://github.com/stashed/mongodb/commit/0f7868a) Fix typos +- [812f4a6](https://github.com/stashed/mongodb/commit/812f4a6) Trigger the workflow on push or pull request +- [47f71ff](https://github.com/stashed/mongodb/commit/47f71ff) Auto generate chart readme file +- [c6e0879](https://github.com/stashed/mongodb/commit/c6e0879) Correctly mark optional fields +- [ce90c63](https://github.com/stashed/mongodb/commit/ce90c63) Add openapi v3 schema for values file (#21) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v1](https://github.com/stashed/mysql/releases/tag/5.7.25-v1) + +- [87d41e0](https://github.com/stashed/mysql/commit/87d41e0) Prepare for release 5.7.25-v1 (#103) +- [263f795](https://github.com/stashed/mysql/commit/263f795) Prepare for release 5.7.25-rc.20200827 (#99) +- [96023d1](https://github.com/stashed/mysql/commit/96023d1) [cherry-pick] Upload charts without updating index (#96) +- [3cb98d3](https://github.com/stashed/mysql/commit/3cb98d3) Prepare for release 5.7.25-rc.20200826 (#92) +- [d5b1978](https://github.com/stashed/mysql/commit/d5b1978) [cherry-pick] Update README.md (#89) +- [813ee01](https://github.com/stashed/mysql/commit/813ee01) Prepare for release 5.7.25-beta.20200826 (#85) +- [e646be7](https://github.com/stashed/mysql/commit/e646be7) [cherry-pick] Update Stash installation link (#81) (#82) +- [ecc7d0c](https://github.com/stashed/mysql/commit/ecc7d0c) [cherry-pick] Fix output format (#46) (#78) +- [7fcbd24](https://github.com/stashed/mysql/commit/7fcbd24) [cherry-pick] Pass image tag in values.yaml file (#74) (#75) +- [3188584](https://github.com/stashed/mysql/commit/3188584) [cherry-pick] Update chart icon (#71) +- [9060c7a](https://github.com/stashed/mysql/commit/9060c7a) [cherry-pick] Make chart registry configurable (#67) (#68) +- [422a411](https://github.com/stashed/mysql/commit/422a411) Prepare for release 5.7.25-beta.20200709 (#63) +- [e345110](https://github.com/stashed/mysql/commit/e345110) [cherry-pick] Build docker image in release workflow (#59) (#60) +- [3a44b41](https://github.com/stashed/mysql/commit/3a44b41) Prepare for release 5.7.25-beta.20200708 (#55) +- [7e2984b](https://github.com/stashed/mysql/commit/7e2984b) [cherry-pick] Publish to testing dir for alpha/beta releases (#51) (#52) +- [aa1eac2](https://github.com/stashed/mysql/commit/aa1eac2) [cherry-pick] Update License (#47) (#48) +- [d4370c9](https://github.com/stashed/mysql/commit/d4370c9) Add commands to update chart version (#45) +- [38fb308](https://github.com/stashed/mysql/commit/38fb308) [cherry-pick] Update update-release-tracker.sh (#42) +- [f3bfd48](https://github.com/stashed/mysql/commit/f3bfd48) [cherry-pick] Update update-release-tracker.sh (#39) +- [56e92c4](https://github.com/stashed/mysql/commit/56e92c4) [cherry-pick] Update release.yml (#36) +- [be341e7](https://github.com/stashed/mysql/commit/be341e7) [cherry-pick] Add script to update release tracker on pr merge (#32) (#33) +- [96504a7](https://github.com/stashed/mysql/commit/96504a7) [cherry-pick] Add workflow to cherry pick commits to master (#28) (#29) +- [fcbe891](https://github.com/stashed/mysql/commit/fcbe891) Fix chart release process (#27) +- [c012edf](https://github.com/stashed/mysql/commit/c012edf) Update .kodiak.toml +- [0d22657](https://github.com/stashed/mysql/commit/0d22657) Allow overwriting secret key via SecretTransformation (#26) +- [f717a19](https://github.com/stashed/mysql/commit/f717a19) Fix unit tests (#25) +- [d4f5c4c](https://github.com/stashed/mysql/commit/d4f5c4c) Create .kodiak.toml +- [2bfa098](https://github.com/stashed/mysql/commit/2bfa098) Fix typos +- [5c1a53d](https://github.com/stashed/mysql/commit/5c1a53d) mend +- [9eb402f](https://github.com/stashed/mysql/commit/9eb402f) Update to Kubernetes v1.18.3 (#24) +- [4d4afa2](https://github.com/stashed/mysql/commit/4d4afa2) Fix waitForDBReady() logic + Make timeout configurable (#23) +- [4548802](https://github.com/stashed/mysql/commit/4548802) Update crazy-max/ghaction-docker-buildx flag +- [ce1fa72](https://github.com/stashed/mysql/commit/ce1fa72) Trigger the workflow on push or pull request +- [dad10df](https://github.com/stashed/mysql/commit/dad10df) Auto generate chart readme file +- [462eecf](https://github.com/stashed/mysql/commit/462eecf) Correctly mark optional fields +- [424ec5a](https://github.com/stashed/mysql/commit/424ec5a) Add openapi v3 schema for values file (#20) + + +### [8.0.3-v1](https://github.com/stashed/mysql/releases/tag/8.0.3-v1) + +- [cc49837](https://github.com/stashed/mysql/commit/cc49837) Prepare for release 8.0.3-v1 (#105) +- [7d02720](https://github.com/stashed/mysql/commit/7d02720) Prepare for release 8.0.3-rc.20200827 (#101) +- [dc8e2b5](https://github.com/stashed/mysql/commit/dc8e2b5) [cherry-pick] Upload charts without updating index (#98) +- [f80506e](https://github.com/stashed/mysql/commit/f80506e) Prepare for release 8.0.3-rc.20200826 (#94) +- [130b967](https://github.com/stashed/mysql/commit/130b967) [cherry-pick] Update README.md (#91) +- [7326b37](https://github.com/stashed/mysql/commit/7326b37) Prepare for release 8.0.3-beta.20200826 (#87) +- [72ba0ee](https://github.com/stashed/mysql/commit/72ba0ee) [cherry-pick] Update Stash installation link (#81) (#84) +- [3e856a9](https://github.com/stashed/mysql/commit/3e856a9) [cherry-pick] Fix output format (#46) (#80) +- [8621d51](https://github.com/stashed/mysql/commit/8621d51) [cherry-pick] Pass image tag in values.yaml file (#74) (#77) +- [41702eb](https://github.com/stashed/mysql/commit/41702eb) [cherry-pick] Update chart icon (#73) +- [31740f9](https://github.com/stashed/mysql/commit/31740f9) [cherry-pick] Make chart registry configurable (#67) (#70) +- [ced3feb](https://github.com/stashed/mysql/commit/ced3feb) Prepare for release 8.0.3-beta.20200709 (#65) +- [8299693](https://github.com/stashed/mysql/commit/8299693) [cherry-pick] Build docker image in release workflow (#59) (#62) +- [18cc48f](https://github.com/stashed/mysql/commit/18cc48f) Prepare for release 8.0.3-beta.20200708 (#57) +- [4e94b93](https://github.com/stashed/mysql/commit/4e94b93) [cherry-pick] Publish to testing dir for alpha/beta releases (#51) (#54) +- [1c7bfc4](https://github.com/stashed/mysql/commit/1c7bfc4) [cherry-pick] Update License (#47) (#50) +- [56485b1](https://github.com/stashed/mysql/commit/56485b1) Add commands to update chart version (#45) +- [4f200fd](https://github.com/stashed/mysql/commit/4f200fd) [cherry-pick] Update update-release-tracker.sh (#44) +- [0df0fc6](https://github.com/stashed/mysql/commit/0df0fc6) [cherry-pick] Update update-release-tracker.sh (#41) +- [432da4e](https://github.com/stashed/mysql/commit/432da4e) [cherry-pick] Update release.yml (#38) +- [0f1c7b3](https://github.com/stashed/mysql/commit/0f1c7b3) [cherry-pick] Add script to update release tracker on pr merge (#32) (#35) +- [287a12f](https://github.com/stashed/mysql/commit/287a12f) [cherry-pick] Add workflow to cherry pick commits to master (#28) (#31) +- [a962fe3](https://github.com/stashed/mysql/commit/a962fe3) Fix chart release process (#27) +- [83c0565](https://github.com/stashed/mysql/commit/83c0565) Update .kodiak.toml +- [a87889d](https://github.com/stashed/mysql/commit/a87889d) Allow overwriting secret key via SecretTransformation (#26) +- [ca8f6b8](https://github.com/stashed/mysql/commit/ca8f6b8) Fix unit tests (#25) +- [a38f3d9](https://github.com/stashed/mysql/commit/a38f3d9) Create .kodiak.toml +- [119de10](https://github.com/stashed/mysql/commit/119de10) Fix typos +- [71efc34](https://github.com/stashed/mysql/commit/71efc34) mend +- [d4b025d](https://github.com/stashed/mysql/commit/d4b025d) Update to Kubernetes v1.18.3 (#24) +- [270997e](https://github.com/stashed/mysql/commit/270997e) Fix waitForDBReady() logic + Make timeout configurable (#23) +- [764ab66](https://github.com/stashed/mysql/commit/764ab66) Update crazy-max/ghaction-docker-buildx flag +- [1325c75](https://github.com/stashed/mysql/commit/1325c75) Trigger the workflow on push or pull request +- [dc106c2](https://github.com/stashed/mysql/commit/dc106c2) Auto generate chart readme file +- [cb99aeb](https://github.com/stashed/mysql/commit/cb99aeb) Correctly mark optional fields +- [0d30048](https://github.com/stashed/mysql/commit/0d30048) Add openapi v3 schema for values file (#20) + + +### [8.0.14-v1](https://github.com/stashed/mysql/releases/tag/8.0.14-v1) + +- [ced706b](https://github.com/stashed/mysql/commit/ced706b) Prepare for release 8.0.14-v1 (#104) +- [720aa02](https://github.com/stashed/mysql/commit/720aa02) Prepare for release 8.0.14-rc.20200827 (#100) +- [7019c00](https://github.com/stashed/mysql/commit/7019c00) [cherry-pick] Upload charts without updating index (#97) +- [0b6f158](https://github.com/stashed/mysql/commit/0b6f158) Prepare for release 8.0.14-rc.20200826 (#93) +- [e4c86da](https://github.com/stashed/mysql/commit/e4c86da) [cherry-pick] Update README.md (#90) +- [5816915](https://github.com/stashed/mysql/commit/5816915) Prepare for release 8.0.14-beta.20200826 (#86) +- [96b78ca](https://github.com/stashed/mysql/commit/96b78ca) [cherry-pick] Update Stash installation link (#81) (#83) +- [4f6c15b](https://github.com/stashed/mysql/commit/4f6c15b) [cherry-pick] Fix output format (#46) (#79) +- [9da1616](https://github.com/stashed/mysql/commit/9da1616) [cherry-pick] Pass image tag in values.yaml file (#74) (#76) +- [72edf00](https://github.com/stashed/mysql/commit/72edf00) [cherry-pick] Update chart icon (#72) +- [9f253db](https://github.com/stashed/mysql/commit/9f253db) [cherry-pick] Make chart registry configurable (#67) (#69) +- [bf2dd2d](https://github.com/stashed/mysql/commit/bf2dd2d) Prepare for release 8.0.14-beta.20200709 (#64) +- [226b3a9](https://github.com/stashed/mysql/commit/226b3a9) [cherry-pick] Build docker image in release workflow (#59) (#61) +- [5a303f2](https://github.com/stashed/mysql/commit/5a303f2) Prepare for release 8.0.14-beta.20200708 (#56) +- [840101a](https://github.com/stashed/mysql/commit/840101a) [cherry-pick] Publish to testing dir for alpha/beta releases (#51) (#53) +- [9cf212d](https://github.com/stashed/mysql/commit/9cf212d) [cherry-pick] Update License (#47) (#49) +- [4d460b1](https://github.com/stashed/mysql/commit/4d460b1) Add commands to update chart version (#45) +- [ad14dcd](https://github.com/stashed/mysql/commit/ad14dcd) [cherry-pick] Update update-release-tracker.sh (#43) +- [7612f08](https://github.com/stashed/mysql/commit/7612f08) [cherry-pick] Update update-release-tracker.sh (#40) +- [bb67fea](https://github.com/stashed/mysql/commit/bb67fea) [cherry-pick] Update release.yml (#37) +- [5551469](https://github.com/stashed/mysql/commit/5551469) [cherry-pick] Add script to update release tracker on pr merge (#32) (#34) +- [cf2d0a5](https://github.com/stashed/mysql/commit/cf2d0a5) [cherry-pick] Add workflow to cherry pick commits to master (#28) (#30) +- [b983837](https://github.com/stashed/mysql/commit/b983837) Fix chart release process (#27) +- [e2d3718](https://github.com/stashed/mysql/commit/e2d3718) Update .kodiak.toml +- [1779968](https://github.com/stashed/mysql/commit/1779968) Allow overwriting secret key via SecretTransformation (#26) +- [1ff9fa6](https://github.com/stashed/mysql/commit/1ff9fa6) Fix unit tests (#25) +- [8c86606](https://github.com/stashed/mysql/commit/8c86606) Create .kodiak.toml +- [d6cfde9](https://github.com/stashed/mysql/commit/d6cfde9) Fix typos +- [065eb14](https://github.com/stashed/mysql/commit/065eb14) mend +- [43335f5](https://github.com/stashed/mysql/commit/43335f5) Update to Kubernetes v1.18.3 (#24) +- [9d5a550](https://github.com/stashed/mysql/commit/9d5a550) Fix waitForDBReady() logic + Make timeout configurable (#23) +- [1ce533a](https://github.com/stashed/mysql/commit/1ce533a) Update crazy-max/ghaction-docker-buildx flag +- [4daf2f0](https://github.com/stashed/mysql/commit/4daf2f0) Trigger the workflow on push or pull request +- [dee1282](https://github.com/stashed/mysql/commit/dee1282) Auto generate chart readme file +- [857d7dc](https://github.com/stashed/mysql/commit/857d7dc) Correctly mark optional fields +- [915ff47](https://github.com/stashed/mysql/commit/915ff47) Add openapi v3 schema for values file (#20) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-v1](https://github.com/stashed/percona-xtradb/releases/tag/5.7-v1) + + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6-v1](https://github.com/stashed/postgres/releases/tag/9.6-v1) + +- [473cc47](https://github.com/stashed/postgres/commit/473cc47) Prepare for release 9.6-v1 (#169) +- [e9febb8](https://github.com/stashed/postgres/commit/e9febb8) Prepare for release 9.6-rc.20200827 (#163) +- [3f724ee](https://github.com/stashed/postgres/commit/3f724ee) [cherry-pick] Upload charts without updating index (#158) +- [5715456](https://github.com/stashed/postgres/commit/5715456) Prepare for release 9.6-rc.20200826 (#152) +- [0442f99](https://github.com/stashed/postgres/commit/0442f99) [cherry-pick] Update README.md (#147) +- [61c4425](https://github.com/stashed/postgres/commit/61c4425) Prepare for release 9.6-beta.20200826 (#141) +- [b313c2c](https://github.com/stashed/postgres/commit/b313c2c) Update Stash installation link (#131) (#136) +- [d73595e](https://github.com/stashed/postgres/commit/d73595e) [cherry-pick] Update twitter handle (#125) (#130) +- [875edd5](https://github.com/stashed/postgres/commit/875edd5) [cherry-pick] Use image tag same as the $APP_VERSION (#114) (#124) +- [5a9a784](https://github.com/stashed/postgres/commit/5a9a784) [cherry-pick] Fix output format + Add PreBackupActions logic (#113) (#119) +- [ce47f3a](https://github.com/stashed/postgres/commit/ce47f3a) [cherry-pick] Update chart icon (#112) +- [decfbb0](https://github.com/stashed/postgres/commit/decfbb0) [cherry-pick] Make chart registry configurable (#102) (#107) +- [5befa82](https://github.com/stashed/postgres/commit/5befa82) Prepare for release 9.6-beta.20200709 (#100) +- [52fab57](https://github.com/stashed/postgres/commit/52fab57) [cherry-pick] Build docker images in release workflow (#90) (#95) +- [d85fc80](https://github.com/stashed/postgres/commit/d85fc80) Prepare for release 9.6-beta.20200708 (#88) +- [fbd6766](https://github.com/stashed/postgres/commit/fbd6766) [cherry-pick] Publish to testing dir for alpha/beta releases (#78) (#83) +- [1b32879](https://github.com/stashed/postgres/commit/1b32879) [cherry-pick] Update License (#72) (#77) +- [388ddee](https://github.com/stashed/postgres/commit/388ddee) Add commands to update chart version (#71) +- [875c1f0](https://github.com/stashed/postgres/commit/875c1f0) [cherry-pick] Update update-release-tracker.sh (#70) +- [0e71e2d](https://github.com/stashed/postgres/commit/0e71e2d) [cherry-pick] Update update-release-tracker.sh (#65) +- [bbfac61](https://github.com/stashed/postgres/commit/bbfac61) [cherry-pick] Update release.yml (#55) (#60) +- [986d0a7](https://github.com/stashed/postgres/commit/986d0a7) [cherry-pick] Add script to update release tracker on pr merge (#49) (#54) +- [6edaf36](https://github.com/stashed/postgres/commit/6edaf36) [cherry-pick] Remove /cherry-pick from cherry picked prs (#43) (#48) +- [6743dbe](https://github.com/stashed/postgres/commit/6743dbe) [cherry-pick] Add workflow to cherry pick commits to master (#37) (#42) +- [fb4f222](https://github.com/stashed/postgres/commit/fb4f222) Fix chart release process (#36) +- [b5ddf5f](https://github.com/stashed/postgres/commit/b5ddf5f) Update .kodiak.toml +- [7951787](https://github.com/stashed/postgres/commit/7951787) Fix waitForDBReady() logic + Make timeout configurable (#35) +- [e7bb18f](https://github.com/stashed/postgres/commit/e7bb18f) Create .kodiak.toml +- [60acc09](https://github.com/stashed/postgres/commit/60acc09) Merge pull request Allow overriding secret keys from AppBinding #33 +- [aaff7fb](https://github.com/stashed/postgres/commit/aaff7fb) Fix typos (#32) +- [568f584](https://github.com/stashed/postgres/commit/568f584) Update to Kubernetes v1.18.3 (#34) +- [098bb78](https://github.com/stashed/postgres/commit/098bb78) Update crazy-max/ghaction-docker-buildx flag +- [4385362](https://github.com/stashed/postgres/commit/4385362) function-args: add pg-back-cmd option +- [7cd065c](https://github.com/stashed/postgres/commit/7cd065c) Trigger the workflow on push or pull request +- [b63e3e5](https://github.com/stashed/postgres/commit/b63e3e5) Auto generate chart readme file +- [dea1a41](https://github.com/stashed/postgres/commit/dea1a41) Correctly mark optional fields +- [efc4283](https://github.com/stashed/postgres/commit/efc4283) Add openapi v3 schema for values file (#27) + + +### [10.2-v1](https://github.com/stashed/postgres/releases/tag/10.2-v1) + +- [7973fe4](https://github.com/stashed/postgres/commit/7973fe4) Prepare for release 10.2-v1 (#165) +- [fd9fc7a](https://github.com/stashed/postgres/commit/fd9fc7a) Prepare for release 10.2-rc.20200827 (#159) +- [7d1033a](https://github.com/stashed/postgres/commit/7d1033a) [cherry-pick] Upload charts without updating index (#154) +- [4777da6](https://github.com/stashed/postgres/commit/4777da6) Prepare for release 10.2-rc.20200826 (#148) +- [2f2a469](https://github.com/stashed/postgres/commit/2f2a469) [cherry-pick] Update README.md (#143) +- [ac65186](https://github.com/stashed/postgres/commit/ac65186) Prepare for release 10.2-beta.20200826 (#137) +- [1757b5f](https://github.com/stashed/postgres/commit/1757b5f) [cherry-pick] Update Stash installation link (#131) (#132) +- [56f90c7](https://github.com/stashed/postgres/commit/56f90c7) [cherry-pick] Update twitter handle (#125) (#126) +- [9734711](https://github.com/stashed/postgres/commit/9734711) [cherry-pick] Use image tag same as the $APP_VERSION (#114) (#120) +- [9556ade](https://github.com/stashed/postgres/commit/9556ade) [cherry-pick] Fix output format + Add PreBackupActions logic (#113) (#115) +- [ce7257e](https://github.com/stashed/postgres/commit/ce7257e) [cherry-pick] Update chart icon (#108) +- [754640f](https://github.com/stashed/postgres/commit/754640f) [cherry-pick] Make chart registry configurable (#102) (#103) +- [d8a2be0](https://github.com/stashed/postgres/commit/d8a2be0) Prepare for release 10.2-beta.20200709 (#96) +- [0bba297](https://github.com/stashed/postgres/commit/0bba297) [cherry-pick] Build docker images in release workflow (#90) (#91) +- [168bd5a](https://github.com/stashed/postgres/commit/168bd5a) Prepare for release 10.2-beta.20200708 (#84) +- [5ad2e00](https://github.com/stashed/postgres/commit/5ad2e00) [cherry-pick] Publish to testing dir for alpha/beta releases (#78) (#79) +- [8eb154d](https://github.com/stashed/postgres/commit/8eb154d) [cherry-pick] Update License (#72) (#73) +- [27604a5](https://github.com/stashed/postgres/commit/27604a5) Add commands to update chart version (#71) +- [bac456e](https://github.com/stashed/postgres/commit/bac456e) [cherry-pick] Update update-release-tracker.sh (#66) +- [a50a3a8](https://github.com/stashed/postgres/commit/a50a3a8) [cherry-pick] Update update-release-tracker.sh (#61) +- [2d792b7](https://github.com/stashed/postgres/commit/2d792b7) [cherry-pick] Update release.yml (#55) (#56) +- [c4603ac](https://github.com/stashed/postgres/commit/c4603ac) [cherry-pick] Add script to update release tracker on pr merge (#49) (#50) +- [0c08bad](https://github.com/stashed/postgres/commit/0c08bad) [cherry-pick] Remove /cherry-pick from cherry picked prs (#43) (#44) +- [6764fe3](https://github.com/stashed/postgres/commit/6764fe3) [cherry-pick] Add workflow to cherry pick commits to master (#37) (#38) +- [826f678](https://github.com/stashed/postgres/commit/826f678) Fix chart release process (#36) +- [e5146e3](https://github.com/stashed/postgres/commit/e5146e3) Update .kodiak.toml +- [d4d68ef](https://github.com/stashed/postgres/commit/d4d68ef) Fix waitForDBReady() logic + Make timeout configurable (#35) +- [78fa0ac](https://github.com/stashed/postgres/commit/78fa0ac) Create .kodiak.toml +- [23cfc56](https://github.com/stashed/postgres/commit/23cfc56) Merge pull request Allow overriding secret keys from AppBinding #33 +- [0cdc7c9](https://github.com/stashed/postgres/commit/0cdc7c9) Fix typos (#32) +- [a148ace](https://github.com/stashed/postgres/commit/a148ace) Update to Kubernetes v1.18.3 (#34) +- [db126f4](https://github.com/stashed/postgres/commit/db126f4) Update crazy-max/ghaction-docker-buildx flag +- [854a522](https://github.com/stashed/postgres/commit/854a522) function-args: add pg-back-cmd option +- [e64e5b0](https://github.com/stashed/postgres/commit/e64e5b0) Trigger the workflow on push or pull request +- [d667589](https://github.com/stashed/postgres/commit/d667589) Auto generate chart readme file +- [f562d87](https://github.com/stashed/postgres/commit/f562d87) Correctly mark optional fields +- [3c5b7bc](https://github.com/stashed/postgres/commit/3c5b7bc) Add openapi v3 schema for values file (#27) + + +### [10.6-v1](https://github.com/stashed/postgres/releases/tag/10.6-v1) + +- [6b0077a](https://github.com/stashed/postgres/commit/6b0077a) Prepare for release 10.6-v1 (#166) +- [4724218](https://github.com/stashed/postgres/commit/4724218) Prepare for release 10.6-rc.20200827 (#160) +- [1167129](https://github.com/stashed/postgres/commit/1167129) [cherry-pick] Upload charts without updating index (#155) +- [bd548b2](https://github.com/stashed/postgres/commit/bd548b2) Prepare for release 10.6-rc.20200826 (#149) +- [3d86318](https://github.com/stashed/postgres/commit/3d86318) [cherry-pick] Update README.md (#144) +- [1446996](https://github.com/stashed/postgres/commit/1446996) Prepare for release 10.6-beta.20200826 (#138) +- [720cc7b](https://github.com/stashed/postgres/commit/720cc7b) [cherry-pick] Update Stash installation link (#131) (#133) +- [6b17dea](https://github.com/stashed/postgres/commit/6b17dea) [cherry-pick] Update twitter handle (#125) (#127) +- [d1af1c6](https://github.com/stashed/postgres/commit/d1af1c6) [cherry-pick] Use image tag same as the $APP_VERSION (#114) (#121) +- [cd2f8ec](https://github.com/stashed/postgres/commit/cd2f8ec) [cherry-pick] Fix output format + Add PreBackupActions logic (#113) (#116) +- [d89559c](https://github.com/stashed/postgres/commit/d89559c) [cherry-pick] Update chart icon (#109) +- [192c564](https://github.com/stashed/postgres/commit/192c564) [cherry-pick] Make chart registry configurable (#102) (#104) +- [78fdd94](https://github.com/stashed/postgres/commit/78fdd94) Prepare for release 10.6-beta.20200709 (#97) +- [c70d2d9](https://github.com/stashed/postgres/commit/c70d2d9) [cherry-pick] Build docker images in release workflow (#90) (#92) +- [0c873e0](https://github.com/stashed/postgres/commit/0c873e0) Prepare for release 10.6-beta.20200708 (#85) +- [aa80111](https://github.com/stashed/postgres/commit/aa80111) [cherry-pick] Publish to testing dir for alpha/beta releases (#78) (#80) +- [2989c96](https://github.com/stashed/postgres/commit/2989c96) [cherry-pick] Update License (#72) (#74) +- [8ae0673](https://github.com/stashed/postgres/commit/8ae0673) Add commands to update chart version (#71) +- [44bf83d](https://github.com/stashed/postgres/commit/44bf83d) [cherry-pick] Update update-release-tracker.sh (#67) +- [e20f246](https://github.com/stashed/postgres/commit/e20f246) [cherry-pick] Update update-release-tracker.sh (#62) +- [0120b84](https://github.com/stashed/postgres/commit/0120b84) [cherry-pick] Update release.yml (#55) (#57) +- [ddfc26d](https://github.com/stashed/postgres/commit/ddfc26d) [cherry-pick] Add script to update release tracker on pr merge (#49) (#51) +- [bde7425](https://github.com/stashed/postgres/commit/bde7425) [cherry-pick] Remove /cherry-pick from cherry picked prs (#43) (#45) +- [00a5c97](https://github.com/stashed/postgres/commit/00a5c97) [cherry-pick] Add workflow to cherry pick commits to master (#37) (#39) +- [1720053](https://github.com/stashed/postgres/commit/1720053) Fix chart release process (#36) +- [f67d343](https://github.com/stashed/postgres/commit/f67d343) Update .kodiak.toml +- [6f70879](https://github.com/stashed/postgres/commit/6f70879) Fix waitForDBReady() logic + Make timeout configurable (#35) +- [39a7fc4](https://github.com/stashed/postgres/commit/39a7fc4) Create .kodiak.toml +- [4ba7a9f](https://github.com/stashed/postgres/commit/4ba7a9f) Merge pull request Allow overriding secret keys from AppBinding #33 +- [804433c](https://github.com/stashed/postgres/commit/804433c) Fix typos (#32) +- [42e792f](https://github.com/stashed/postgres/commit/42e792f) Update to Kubernetes v1.18.3 (#34) +- [b15f604](https://github.com/stashed/postgres/commit/b15f604) Update crazy-max/ghaction-docker-buildx flag +- [288b3ea](https://github.com/stashed/postgres/commit/288b3ea) function-args: add pg-back-cmd option +- [d0ff5d9](https://github.com/stashed/postgres/commit/d0ff5d9) Trigger the workflow on push or pull request +- [23e9f4a](https://github.com/stashed/postgres/commit/23e9f4a) Auto generate chart readme file +- [9431b3a](https://github.com/stashed/postgres/commit/9431b3a) Correctly mark optional fields +- [0fe49c0](https://github.com/stashed/postgres/commit/0fe49c0) Add openapi v3 schema for values file (#27) + + +### [11.1-v1](https://github.com/stashed/postgres/releases/tag/11.1-v1) + +- [229fba7](https://github.com/stashed/postgres/commit/229fba7) Prepare for release 11.1-v1 (#167) +- [0fbd548](https://github.com/stashed/postgres/commit/0fbd548) Prepare for release 11.1-rc.20200827 (#161) +- [fc8cb58](https://github.com/stashed/postgres/commit/fc8cb58) [cherry-pick] Upload charts without updating index (#156) +- [32e008c](https://github.com/stashed/postgres/commit/32e008c) Prepare for release 11.1-rc.20200826 (#150) +- [aa588fa](https://github.com/stashed/postgres/commit/aa588fa) [cherry-pick] Update README.md (#145) +- [0cc9647](https://github.com/stashed/postgres/commit/0cc9647) Prepare for release 11.1-beta.20200826 (#139) +- [dff51be](https://github.com/stashed/postgres/commit/dff51be) [cherry-pick] Update Stash installation link (#131) (#134) +- [b8480c8](https://github.com/stashed/postgres/commit/b8480c8) [cherry-pick] Update twitter handle (#125) (#128) +- [33fe94b](https://github.com/stashed/postgres/commit/33fe94b) [cherry-pick] Use image tag same as the $APP_VERSION (#114) (#122) +- [6a631b0](https://github.com/stashed/postgres/commit/6a631b0) [cherry-pick] Fix output format + Add PreBackupActions logic (#113) (#117) +- [8bccb9c](https://github.com/stashed/postgres/commit/8bccb9c) [cherry-pick] Update chart icon (#110) +- [aca1577](https://github.com/stashed/postgres/commit/aca1577) [cherry-pick] Make chart registry configurable (#102) (#105) +- [81b21f0](https://github.com/stashed/postgres/commit/81b21f0) Prepare for release 11.1-beta.20200709 (#98) +- [4fc87ef](https://github.com/stashed/postgres/commit/4fc87ef) [cherry-pick] Build docker images in release workflow (#90) (#93) +- [2a43673](https://github.com/stashed/postgres/commit/2a43673) Prepare for release 11.1-beta.20200708 (#86) +- [296b239](https://github.com/stashed/postgres/commit/296b239) [cherry-pick] Publish to testing dir for alpha/beta releases (#78) (#81) +- [c811e7e](https://github.com/stashed/postgres/commit/c811e7e) [cherry-pick] Update License (#72) (#75) +- [7bf38e7](https://github.com/stashed/postgres/commit/7bf38e7) Add commands to update chart version (#71) +- [6ecb8bc](https://github.com/stashed/postgres/commit/6ecb8bc) [cherry-pick] Update update-release-tracker.sh (#68) +- [526e335](https://github.com/stashed/postgres/commit/526e335) [cherry-pick] Update update-release-tracker.sh (#63) +- [e5fff5c](https://github.com/stashed/postgres/commit/e5fff5c) [cherry-pick] Update release.yml (#55) (#58) +- [81f3b07](https://github.com/stashed/postgres/commit/81f3b07) [cherry-pick] Add script to update release tracker on pr merge (#49) (#52) +- [5ba7bd6](https://github.com/stashed/postgres/commit/5ba7bd6) [cherry-pick] Remove /cherry-pick from cherry picked prs (#43) (#46) +- [12adf32](https://github.com/stashed/postgres/commit/12adf32) [cherry-pick] Add workflow to cherry pick commits to master (#37) (#40) +- [cac2584](https://github.com/stashed/postgres/commit/cac2584) Fix chart release process (#36) +- [fadf4ec](https://github.com/stashed/postgres/commit/fadf4ec) Update .kodiak.toml +- [46669d7](https://github.com/stashed/postgres/commit/46669d7) Fix waitForDBReady() logic + Make timeout configurable (#35) +- [338ab6c](https://github.com/stashed/postgres/commit/338ab6c) Create .kodiak.toml +- [3acfe21](https://github.com/stashed/postgres/commit/3acfe21) Merge pull request Allow overriding secret keys from AppBinding #33 +- [1c5cd1c](https://github.com/stashed/postgres/commit/1c5cd1c) Fix typos (#32) +- [5c09c1b](https://github.com/stashed/postgres/commit/5c09c1b) Update to Kubernetes v1.18.3 (#34) +- [ed629e5](https://github.com/stashed/postgres/commit/ed629e5) Update crazy-max/ghaction-docker-buildx flag +- [0b8cd43](https://github.com/stashed/postgres/commit/0b8cd43) function-args: add pg-back-cmd option +- [161a325](https://github.com/stashed/postgres/commit/161a325) Trigger the workflow on push or pull request +- [062a652](https://github.com/stashed/postgres/commit/062a652) Auto generate chart readme file +- [ec94eac](https://github.com/stashed/postgres/commit/ec94eac) Correctly mark optional fields +- [5656c62](https://github.com/stashed/postgres/commit/5656c62) Add openapi v3 schema for values file (#27) + + +### [11.2-v1](https://github.com/stashed/postgres/releases/tag/11.2-v1) + +- [e4e7c2c](https://github.com/stashed/postgres/commit/e4e7c2c) Prepare for release 11.2-v1 (#168) +- [342b6bb](https://github.com/stashed/postgres/commit/342b6bb) Prepare for release 11.2-rc.20200827 (#162) +- [4688cde](https://github.com/stashed/postgres/commit/4688cde) [cherry-pick] Upload charts without updating index (#157) +- [a8f414d](https://github.com/stashed/postgres/commit/a8f414d) Prepare for release 11.2-rc.20200826 (#151) +- [f9020fb](https://github.com/stashed/postgres/commit/f9020fb) [cherry-pick] Update README.md (#146) +- [cf876d3](https://github.com/stashed/postgres/commit/cf876d3) Prepare for release 11.2-beta.20200826 (#140) +- [22d4f2c](https://github.com/stashed/postgres/commit/22d4f2c) [cherry-pick] Update Stash installation link (#131) (#135) +- [462bf9f](https://github.com/stashed/postgres/commit/462bf9f) [cherry-pick] Update twitter handle (#125) (#129) +- [baa8b56](https://github.com/stashed/postgres/commit/baa8b56) [cherry-pick] Use image tag same as the $APP_VERSION (#114) (#123) +- [b09b460](https://github.com/stashed/postgres/commit/b09b460) [cherry-pick] Fix output format + Add PreBackupActions logic (#113) (#118) +- [08ea901](https://github.com/stashed/postgres/commit/08ea901) [cherry-pick] Update chart icon (#111) +- [a6b8c9e](https://github.com/stashed/postgres/commit/a6b8c9e) [cherry-pick] Make chart registry configurable (#102) (#106) +- [a3efd1a](https://github.com/stashed/postgres/commit/a3efd1a) Prepare for release 11.2-beta.20200709 (#99) +- [c0a32e5](https://github.com/stashed/postgres/commit/c0a32e5) [cherry-pick] Build docker images in release workflow (#90) (#94) +- [5c4b396](https://github.com/stashed/postgres/commit/5c4b396) Prepare for release 11.2-beta.20200708 (#87) +- [00c2f4e](https://github.com/stashed/postgres/commit/00c2f4e) [cherry-pick] Publish to testing dir for alpha/beta releases (#78) (#82) +- [5d795f9](https://github.com/stashed/postgres/commit/5d795f9) [cherry-pick] Update License (#72) (#76) +- [03fd7d3](https://github.com/stashed/postgres/commit/03fd7d3) Add commands to update chart version (#71) +- [a48d053](https://github.com/stashed/postgres/commit/a48d053) [cherry-pick] Update update-release-tracker.sh (#69) +- [7ac5c11](https://github.com/stashed/postgres/commit/7ac5c11) [cherry-pick] Update update-release-tracker.sh (#64) +- [ecf236a](https://github.com/stashed/postgres/commit/ecf236a) [cherry-pick] Update release.yml (#55) (#59) +- [013242e](https://github.com/stashed/postgres/commit/013242e) [cherry-pick] Add script to update release tracker on pr merge (#49) (#53) +- [c8b360b](https://github.com/stashed/postgres/commit/c8b360b) [cherry-pick] Remove /cherry-pick from cherry picked prs (#43) (#47) +- [2503240](https://github.com/stashed/postgres/commit/2503240) [cherry-pick] Add workflow to cherry pick commits to master (#37) (#41) +- [3f7525c](https://github.com/stashed/postgres/commit/3f7525c) Fix chart release process (#36) +- [4afcc41](https://github.com/stashed/postgres/commit/4afcc41) Update .kodiak.toml +- [861eaa3](https://github.com/stashed/postgres/commit/861eaa3) Fix waitForDBReady() logic + Make timeout configurable (#35) +- [85ea8d6](https://github.com/stashed/postgres/commit/85ea8d6) Create .kodiak.toml +- [f240c25](https://github.com/stashed/postgres/commit/f240c25) Merge pull request Allow overriding secret keys from AppBinding #33 +- [4e5898f](https://github.com/stashed/postgres/commit/4e5898f) Fix typos (#32) +- [b4b61cf](https://github.com/stashed/postgres/commit/b4b61cf) Update to Kubernetes v1.18.3 (#34) +- [62f2714](https://github.com/stashed/postgres/commit/62f2714) Update crazy-max/ghaction-docker-buildx flag +- [962df30](https://github.com/stashed/postgres/commit/962df30) function-args: add pg-back-cmd option +- [55e792e](https://github.com/stashed/postgres/commit/55e792e) Trigger the workflow on push or pull request +- [66b4a51](https://github.com/stashed/postgres/commit/66b4a51) Auto generate chart readme file +- [dd606bf](https://github.com/stashed/postgres/commit/dd606bf) Correctly mark optional fields +- [efe4799](https://github.com/stashed/postgres/commit/efe4799) Add openapi v3 schema for values file (#27) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.10.0](https://github.com/stashed/stash/releases/tag/v0.10.0) + +- [e58a2267](https://github.com/stashed/stash/commit/e58a2267) Prepare for release v0.10.0 (#1182) +- [485f80c6](https://github.com/stashed/stash/commit/485f80c6) Prepare for release v0.10.0-rc.2 (#1181) +- [20d585f4](https://github.com/stashed/stash/commit/20d585f4) Prepare for release v0.10.0-rc.1 (#1180) +- [76fe3ebd](https://github.com/stashed/stash/commit/76fe3ebd) Create GitHub release from release workflow +- [f3e5cccc](https://github.com/stashed/stash/commit/f3e5cccc) Fix installation link +- [3ebb7788](https://github.com/stashed/stash/commit/3ebb7788) Prepare for release v0.10.0-rc.0 (#1179) +- [48e5c87e](https://github.com/stashed/stash/commit/48e5c87e) Update Kubernetes v1.18.3 dependencies (#1178) +- [c269c8ed](https://github.com/stashed/stash/commit/c269c8ed) Port changes from enterprise version (#1176) +- [0fea720b](https://github.com/stashed/stash/commit/0fea720b) Update Kubernetes v1.18.3 dependencies (#1174) +- [c4b6013f](https://github.com/stashed/stash/commit/c4b6013f) Update Kubernetes v1.18.3 dependencies (#1173) +- [77b3eab8](https://github.com/stashed/stash/commit/77b3eab8) Update Kubernetes v1.18.3 dependencies (#1169) +- [64f7c292](https://github.com/stashed/stash/commit/64f7c292) Update Kubernetes v1.18.3 dependencies (#1168) +- [2d6fd7da](https://github.com/stashed/stash/commit/2d6fd7da) Update Kubernetes v1.18.3 dependencies (#1167) +- [378de04d](https://github.com/stashed/stash/commit/378de04d) Update Kubernetes v1.18.3 dependencies (#1159) +- [20decffa](https://github.com/stashed/stash/commit/20decffa) Build images in e2e workflow +- [4919cb03](https://github.com/stashed/stash/commit/4919cb03) Allow configuring k8s in e2e tests (#1155) +- [6e71662a](https://github.com/stashed/stash/commit/6e71662a) Update to Kubernetes v1.18.3 (#1154) +- [a83021fd](https://github.com/stashed/stash/commit/a83021fd) Trigger e2e tests on /ok-to-test command (#1150) +- [6bf44ceb](https://github.com/stashed/stash/commit/6bf44ceb) Update to Kubernetes v1.18.3 (#1149) +- [bcbb3a98](https://github.com/stashed/stash/commit/bcbb3a98) Update to Kubernetes v1.18.3 (#1148) +- [3b717aac](https://github.com/stashed/stash/commit/3b717aac) Prepare for release v0.10.0-beta.1 (#1146) +- [c8b81cf7](https://github.com/stashed/stash/commit/c8b81cf7) Prepare for release v0.10.0-beta.0 (#1145) +- [2d145f47](https://github.com/stashed/stash/commit/2d145f47) Clarify Docker images are dually licensed +- [693ab7df](https://github.com/stashed/stash/commit/693ab7df) Update License (#1144) +- [e13d67eb](https://github.com/stashed/stash/commit/e13d67eb) Update to Kubernetes v1.18.3 (#1142) +- [26ee605a](https://github.com/stashed/stash/commit/26ee605a) Update ci.yml +- [9fa95666](https://github.com/stashed/stash/commit/9fa95666) Add workflow to update docs (#1136) +- [95a62a95](https://github.com/stashed/stash/commit/95a62a95) Update update-release-tracker.sh +- [379c90d5](https://github.com/stashed/stash/commit/379c90d5) Update update-release-tracker.sh +- [cd0a70ee](https://github.com/stashed/stash/commit/cd0a70ee) Use GITHUB_BASE_REF to detect target branch +- [e27c5f66](https://github.com/stashed/stash/commit/e27c5f66) Add script to update release tracker on pr merge (#1132) +- [b0dd5051](https://github.com/stashed/stash/commit/b0dd5051) Update .kodiak.toml +- [e87bad80](https://github.com/stashed/stash/commit/e87bad80) Parameterize installer namespace +- [da8d8956](https://github.com/stashed/stash/commit/da8d8956) Format CI workflows +- [bbde40a3](https://github.com/stashed/stash/commit/bbde40a3) Update to Kubernetes v1.18.3 (#1129) +- [38eb3781](https://github.com/stashed/stash/commit/38eb3781) Update to Kubernetes v1.18.3 +- [197aa7bd](https://github.com/stashed/stash/commit/197aa7bd) Create .kodiak.toml +- [181ca49e](https://github.com/stashed/stash/commit/181ca49e) Update coverage script +- [26602c96](https://github.com/stashed/stash/commit/26602c96) Merge pull request #1125 from stashed/fix-ci-tests +- [54f87b78](https://github.com/stashed/stash/commit/54f87b78) Increase wait timeout +- [43428085](https://github.com/stashed/stash/commit/43428085) Remove unnecessary test codes + run test in parallel +- [8a780e0c](https://github.com/stashed/stash/commit/8a780e0c) Fix clone-pvc tests +- [7027c0f6](https://github.com/stashed/stash/commit/7027c0f6) Fix E2E test +- [31de588a](https://github.com/stashed/stash/commit/31de588a) Change GCS test bucket name to stash-ci (#1122) +- [30a490a6](https://github.com/stashed/stash/commit/30a490a6) Merge pull request #1121 from stashed/baseline-psp +- [419a18e3](https://github.com/stashed/stash/commit/419a18e3) Use StringSlice type flag +- [9dd3804d](https://github.com/stashed/stash/commit/9dd3804d) Make PSP names configurable through flag +- [e4edef44](https://github.com/stashed/stash/commit/e4edef44) Always use baseline PSP +- [cf1538a0](https://github.com/stashed/stash/commit/cf1538a0) Use filepath.Join to generate Repository prefix for BackupBatch (#1120) +- [be189169](https://github.com/stashed/stash/commit/be189169) Go back to using engineerd/setup-kind +- [ae2d74fa](https://github.com/stashed/stash/commit/ae2d74fa) Update dependencies (#1117) +- [a93a5b4c](https://github.com/stashed/stash/commit/a93a5b4c) Remove defaults from CRD v1beta1 (#1116) +- [40e65761](https://github.com/stashed/stash/commit/40e65761) Use CRD v1 for Kubernetes >= 1.16 (#1115) +- [7d851e53](https://github.com/stashed/stash/commit/7d851e53) Merge pull request #1114 from stashed/x7 +- [352ddeed](https://github.com/stashed/stash/commit/352ddeed) Use preinstalled kind +- [11c9e422](https://github.com/stashed/stash/commit/11c9e422) Pass context +- [21053603](https://github.com/stashed/stash/commit/21053603) Update to Kubernetes 1.18.3 +- [f450e9cc](https://github.com/stashed/stash/commit/f450e9cc) Add wait for target logic + add conditions for BackupConfiguration + BackupBatch + RestoreSession (#1108) +- [8f8ff87e](https://github.com/stashed/stash/commit/8f8ff87e) Fix volume snapshot job cleanup (#1090) +- [a4a868b5](https://github.com/stashed/stash/commit/a4a868b5) Merge pull request #1111 from stashed/fix-interimVolume +- [108d0252](https://github.com/stashed/stash/commit/108d0252) Set BackupSession as owner of the pvc created from interimVolumeTemplate +- [fd136c53](https://github.com/stashed/stash/commit/fd136c53) Use Go 1.14.3 +- [74c71d22](https://github.com/stashed/stash/commit/74c71d22) Update crazy-max/ghaction-docker-buildx flag +- [f783899b](https://github.com/stashed/stash/commit/f783899b) Trigger the workflow on push to master +- [e7eceb30](https://github.com/stashed/stash/commit/e7eceb30) Trigger the workflow on push or pull request +- [fe479e8c](https://github.com/stashed/stash/commit/fe479e8c) Use kind v0.8.0 +- [9fc4665a](https://github.com/stashed/stash/commit/9fc4665a) Merge pull request #1093 from robotinfra/master +- [ef2d57e3](https://github.com/stashed/stash/commit/ef2d57e3) fix typo succesSfully +- [d8d35c49](https://github.com/stashed/stash/commit/d8d35c49) fix event types mismatch +- [53dfe8b0](https://github.com/stashed/stash/commit/53dfe8b0) Update stash labels in Makefile +- [c8081c1d](https://github.com/stashed/stash/commit/c8081c1d) Pass image pull secrets to helm chart +- [37b9b312](https://github.com/stashed/stash/commit/37b9b312) Use Go 1.14.2 (#1074) +- [09621974](https://github.com/stashed/stash/commit/09621974) Update K8s version 1.14.6 to 1.14.10 (#1084) +- [8a1ab32c](https://github.com/stashed/stash/commit/8a1ab32c) Give backup triggering CronJob all permissions for Stash crds (#1083) +- [53b932b1](https://github.com/stashed/stash/commit/53b932b1) Use kubectl 1.17 (#1082) +- [5cdeebee](https://github.com/stashed/stash/commit/5cdeebee) Fix nil pointer exception during VolumeSnapshot (#1073) +- [30630d60](https://github.com/stashed/stash/commit/30630d60) Assign returned error properly crateRestoreSessoin() (#1069) +- [3fcbe1b7](https://github.com/stashed/stash/commit/3fcbe1b7) Update README.md to reflect Stash's capability properly (#1060) +- [53513cfe](https://github.com/stashed/stash/commit/53513cfe) Update README.md +- [d615e2c0](https://github.com/stashed/stash/commit/d615e2c0) Add license scan report and status (#1031) +- [473dab81](https://github.com/stashed/stash/commit/473dab81) Use stash.appscode.dev/apimachinery@v0.9.0-rc.6 +- [81be166a](https://github.com/stashed/stash/commit/81be166a) Use stash.appscode.dev/apimachinery (#1051) +- [99dcf0a5](https://github.com/stashed/stash/commit/99dcf0a5) Add support for specifying "region" for S3 backend (#1050) +- [deeaaafe](https://github.com/stashed/stash/commit/deeaaafe) Fix event message (#1048) +- [7bb2ae55](https://github.com/stashed/stash/commit/7bb2ae55) Merge pull request #1047 from stashed/rm-fsgroup +- [a7c3a60b](https://github.com/stashed/stash/commit/a7c3a60b) Remove defaulting FSGroup +- [49bf689d](https://github.com/stashed/stash/commit/49bf689d) Fix Repository CRDs print column (#1046) +- [feb204be](https://github.com/stashed/stash/commit/feb204be) Update README.md to v0.9.0-rc.4 +- [ba1733eb](https://github.com/stashed/stash/commit/ba1733eb) Don't check if target exist from BackupSession creating CronJob (#1028) +- [ddc65ceb](https://github.com/stashed/stash/commit/ddc65ceb) Fix ServiceAccount name mitchmatch (#1025) +- [013e5254](https://github.com/stashed/stash/commit/013e5254) Suspend CronJob but keep instant backup working while backup is paused (#1024) +- [64f75bb7](https://github.com/stashed/stash/commit/64f75bb7) Add stash specific prefix to automatically created resources (#1023) +- [d44e0ae2](https://github.com/stashed/stash/commit/d44e0ae2) Fix CronJob creation failure handling (#1021) +- [b2640d36](https://github.com/stashed/stash/commit/b2640d36) Use Go 1.13.6 +- [1eb8da6e](https://github.com/stashed/stash/commit/1eb8da6e) Update gendocs command (#1016) +- [6f7c8191](https://github.com/stashed/stash/commit/6f7c8191) Add hook tests for BackupBatch (#1014) +- [84272af9](https://github.com/stashed/stash/commit/84272af9) check nil pointer error (#1015) +- [36ef1d2b](https://github.com/stashed/stash/commit/36ef1d2b) Enable tests for K8s 1.11 (#1013) +- [7c774d77](https://github.com/stashed/stash/commit/7c774d77) Fix backup-batch issues (#1004) +- [5bf1e2c2](https://github.com/stashed/stash/commit/5bf1e2c2) Bring back support for k8s 1.11 (#1008) +- [d6e0fe4b](https://github.com/stashed/stash/commit/d6e0fe4b) Remove creationTimestamp from PartialObjectMeta (#1006) +- [6ae79134](https://github.com/stashed/stash/commit/6ae79134) Add BackupBatch support (#985) +- [ed42b159](https://github.com/stashed/stash/commit/ed42b159) Update twitter account (#1003) +- [c8513185](https://github.com/stashed/stash/commit/c8513185) Add Repository Validation for local backend `mountPath` (#947) +- [11f4c5e2](https://github.com/stashed/stash/commit/11f4c5e2) Fix invalid flag name for PVC restorer job (#960) +- [93358115](https://github.com/stashed/stash/commit/93358115) Add Backend e2e Test (#975) +- [ca688540](https://github.com/stashed/stash/commit/ca688540) Update client-go to kubernetes-1.16.3 (#987) +- [e18f30dd](https://github.com/stashed/stash/commit/e18f30dd) Use RWX for restic output.json (#1001) +- [4d9cdbc8](https://github.com/stashed/stash/commit/4d9cdbc8) Run `chmod` on `output.json` only by owner container + Improve… (#1000) +- [8378f141](https://github.com/stashed/stash/commit/8378f141) Add Backup and Restore hooks (#978) +- [a4dd1a1d](https://github.com/stashed/stash/commit/a4dd1a1d) Use helm chart instead of script to install operator (#999) +- [ec5c9efd](https://github.com/stashed/stash/commit/ec5c9efd) Update hack/fmt.sh script +- [54dbef4c](https://github.com/stashed/stash/commit/54dbef4c) Add helper library for CRDs (#977) +- [16483ce1](https://github.com/stashed/stash/commit/16483ce1) Use kubebuilder generated CRD yamls (#971) +- [eacba300](https://github.com/stashed/stash/commit/eacba300) Fix typo (#976) +- [dd500b08](https://github.com/stashed/stash/commit/dd500b08) Use controller-tools@v0.2.2 to generate structural schema (#974) +- [53331837](https://github.com/stashed/stash/commit/53331837) Migrate Repository status.size, Recovery status.observedGeneration (#969) +- [69ef388b](https://github.com/stashed/stash/commit/69ef388b) Generate protobuf files for api types (#967) +- [decea34f](https://github.com/stashed/stash/commit/decea34f) Fix Repository returned error message (#961) +- [5a9e0356](https://github.com/stashed/stash/commit/5a9e0356) Apply valid name functionality (#950) +- [122ed35f](https://github.com/stashed/stash/commit/122ed35f) Test installer against multiple k8s version (#953) +- [63cfc0f9](https://github.com/stashed/stash/commit/63cfc0f9) Format shell scripts (#952) +- [c77dfcd4](https://github.com/stashed/stash/commit/c77dfcd4) Add missing license header +- [780fd2cb](https://github.com/stashed/stash/commit/780fd2cb) Rename Dockerfiles (#946) +- [dc34560a](https://github.com/stashed/stash/commit/dc34560a) Add AutoBackup e2e test (#939) +- [6979ff8b](https://github.com/stashed/stash/commit/6979ff8b) Enable race detector (#944) +- [69acf528](https://github.com/stashed/stash/commit/69acf528) Add license header to files (#943) +- [b2636f8b](https://github.com/stashed/stash/commit/b2636f8b) Don't add AppBinding labels in metric when AppBinding is not available (#942) +- [18e1ab7e](https://github.com/stashed/stash/commit/18e1ab7e) Fix BackupSession creation for ReplicaSet (#940) +- [8ce4ab86](https://github.com/stashed/stash/commit/8ce4ab86) Fix klog flag parsing +- [efd614f9](https://github.com/stashed/stash/commit/efd614f9) Revendor +- [f3fa386f](https://github.com/stashed/stash/commit/f3fa386f) Use crazy-max/ghaction-docker-buildx@v1 +- [5cc99c53](https://github.com/stashed/stash/commit/5cc99c53) Show diff when files `make verify` fails (#937) +- [d20892dd](https://github.com/stashed/stash/commit/d20892dd) Update make fmt +- [fc827b84](https://github.com/stashed/stash/commit/fc827b84) Split imports into 3 blocks (#936) +- [269527cf](https://github.com/stashed/stash/commit/269527cf) Volume e2e test github action (#933) +- [926dcd20](https://github.com/stashed/stash/commit/926dcd20) Fix BackupSession additional print column (#932) +- [f052f7a2](https://github.com/stashed/stash/commit/f052f7a2) Remove spec.backupConfiguration from BackupSession (#931) +- [d378ef2d](https://github.com/stashed/stash/commit/d378ef2d) Update e2e tests to run on GitHub actions (#917) +- [bc27645c](https://github.com/stashed/stash/commit/bc27645c) Enable make ci (#928) +- [9ef3cfeb](https://github.com/stashed/stash/commit/9ef3cfeb) Don't restart workload on backup pause+Use ImagePullPolicy: "Always" for Function-Task model (#929) +- [a5f00836](https://github.com/stashed/stash/commit/a5f00836) Add status.observedGeneration (#927) +- [57eadd03](https://github.com/stashed/stash/commit/57eadd03) Implement RetentionPolicy for VolumeSnapshot (#926) +- [db709fdc](https://github.com/stashed/stash/commit/db709fdc) Verify generated files are up to date (#925) +- [5fb54194](https://github.com/stashed/stash/commit/5fb54194) Update and rename go.yml to ci.yml (#922) +- [0be34c5e](https://github.com/stashed/stash/commit/0be34c5e) Add probe and BackupBatch api (#890) +- [a55b6e84](https://github.com/stashed/stash/commit/a55b6e84) Use core package from k8s.io/api repo (#921) +- [f5a271be](https://github.com/stashed/stash/commit/f5a271be) Bring back dependency to github.com/golang/protobuf@v1.2.0 (#918) +- [5dfeecbc](https://github.com/stashed/stash/commit/5dfeecbc) Update tag pattern for release pipeline +- [e31f5e9a](https://github.com/stashed/stash/commit/e31f5e9a) Run e2e tests using GitHub actions (#909) +- [8bb3ef36](https://github.com/stashed/stash/commit/8bb3ef36) Add app=stash label to crd yamls +- [b50b47c9](https://github.com/stashed/stash/commit/b50b47c9) Generate swagger.json for v1beta1 (#916) +- [095a4a6c](https://github.com/stashed/stash/commit/095a4a6c) Add release pipeline (#915) +- [66926055](https://github.com/stashed/stash/commit/66926055) Fix Restore PVC using Task Function method (#897) +- [404840e4](https://github.com/stashed/stash/commit/404840e4) Fix VolumeSnapshot Issues (#912) +- [7f3b2250](https://github.com/stashed/stash/commit/7f3b2250) Add Kubebuilder annotations (#911) +- [0a499f13](https://github.com/stashed/stash/commit/0a499f13) Use kubebuilder to generate crd yamls (#843) +- [4903508f](https://github.com/stashed/stash/commit/4903508f) Update go.yml +- [23c44bc0](https://github.com/stashed/stash/commit/23c44bc0) Introduce InterimVolumeTemplate and BackupHistoryLimit field. (#907) +- [4ee56d63](https://github.com/stashed/stash/commit/4ee56d63) Make RetentionPolicy required in v1beta1 api (#905) +- [5476cd7a](https://github.com/stashed/stash/commit/5476cd7a) Enable GitHub actions (#903) +- [fe87b789](https://github.com/stashed/stash/commit/fe87b789) Fix snapshot listing for local backend (#902) +- [5f49f5d2](https://github.com/stashed/stash/commit/5f49f5d2) Improve Error Handling + Code refactor (#891) +- [88c84275](https://github.com/stashed/stash/commit/88c84275) Add `NICE` and `IONICE` into distroless image (#883) +- [f63d5c1a](https://github.com/stashed/stash/commit/f63d5c1a) Improve metrics handling + make update status uniform (#872) +- [ea68de24](https://github.com/stashed/stash/commit/ea68de24) Use default fsGroup: 65535 (#874) +- [9bbcabab](https://github.com/stashed/stash/commit/9bbcabab) Add DumpEnv func to Restic Config file (#870) +- [ebde15db](https://github.com/stashed/stash/commit/ebde15db) Allow to specify subPath in auto-backup annotation (#871) +- [6c127323](https://github.com/stashed/stash/commit/6c127323) Silence docker buildx command (#866) +- [5c47abc3](https://github.com/stashed/stash/commit/5c47abc3) Update README.md (#865) +- [50f69ffe](https://github.com/stashed/stash/commit/50f69ffe) Use docker buildx to build docker image (#864) +- [d8c0b1d8](https://github.com/stashed/stash/commit/d8c0b1d8) Update version in gendocs script +- [cb972a98](https://github.com/stashed/stash/commit/cb972a98) Use github.com/Azure/go-autorest/autorest@v0.7.0 (#862) +- [ae5c1325](https://github.com/stashed/stash/commit/ae5c1325) Remove the `bs` short name for BackupSession (#859) +- [1c01d69d](https://github.com/stashed/stash/commit/1c01d69d) Use github.com/golang/protobuf@v1.2.0 (#855) +- [998fac02](https://github.com/stashed/stash/commit/998fac02) New variable from type field of AppBinding + Fix RoleBinding nam… (#845) +- [b97b7622](https://github.com/stashed/stash/commit/b97b7622) Fix resolving Task if volumeClaimTemplate is set in RestoreSession(#852) +- [4ec6caf8](https://github.com/stashed/stash/commit/4ec6caf8) Rename BackupConfigurationTemplate to BackupBlueprint (#847) +- [d8efb120](https://github.com/stashed/stash/commit/d8efb120) Use POD_ORDINAL env var to restore using PVC template (#849) +- [8df5be99](https://github.com/stashed/stash/commit/8df5be99) Pass replicas from RestoreSession to Function (#848) +- [ae5eabd4](https://github.com/stashed/stash/commit/ae5eabd4) Use variable for version in BackupConfigurationTemplate name (#846) +- [fe5b2049](https://github.com/stashed/stash/commit/fe5b2049) Fix Platforms Issue (#844) +- [33fc37cd](https://github.com/stashed/stash/commit/33fc37cd) Add support to restore using volumeClaimTemplate in Function-Task model (#841) +- [3de534ba](https://github.com/stashed/stash/commit/3de534ba) Add GetSnapshotSize() function (#839) +- [6bc80ce2](https://github.com/stashed/stash/commit/6bc80ce2) Fix travis build (#837) +- [1c51a7c5](https://github.com/stashed/stash/commit/1c51a7c5) Add support for parallel backup & restore (#833) +- [e250bb62](https://github.com/stashed/stash/commit/e250bb62) Fix RestoreSession replicas logic (#835) +- [37618091](https://github.com/stashed/stash/commit/37618091) Use cron.ParseStandard helper +- [5015a60d](https://github.com/stashed/stash/commit/5015a60d) Update azure-sdk-for-go dependencies (#836) +- [920dfaea](https://github.com/stashed/stash/commit/920dfaea) Update github.com/appscode/go@master +- [ca2fad07](https://github.com/stashed/stash/commit/ca2fad07) Use robfig/cron@v3 (#834) +- [95728126](https://github.com/stashed/stash/commit/95728126) Fix restore Job parallel execution (#832) +- [94cbae13](https://github.com/stashed/stash/commit/94cbae13) Remove unused code (#829) +- [4dc11263](https://github.com/stashed/stash/commit/4dc11263) Generate docs files inside docs repo (#828) +- [6fb5bc7f](https://github.com/stashed/stash/commit/6fb5bc7f) Create default Functions and Tasks from operator (#824) +- [bb675f67](https://github.com/stashed/stash/commit/bb675f67) Fix restore job RBAC (#821) +- [f96852fc](https://github.com/stashed/stash/commit/f96852fc) Fixed volumeSnapshot Error Issue (#819) +- [08b0f50f](https://github.com/stashed/stash/commit/08b0f50f) fix default securityContext passing to restore init-container/job + fix container name (#823) +- [4aa94675](https://github.com/stashed/stash/commit/4aa94675) Add License notice to makefile (#825) +- [955b1adb](https://github.com/stashed/stash/commit/955b1adb) Make --image-tag a required flag. (#817) +- [9ca08aa6](https://github.com/stashed/stash/commit/9ca08aa6) Always attempt to pull a newer image for `make container` (#818) +- [b88cb9dc](https://github.com/stashed/stash/commit/b88cb9dc) Update constants.go +- [aa0c41f4](https://github.com/stashed/stash/commit/aa0c41f4) Add PusgatewayURL input for Functions (#816) +- [0a45b44a](https://github.com/stashed/stash/commit/0a45b44a) Restore PVCs from templates using Restic (#809) +- [0729ab19](https://github.com/stashed/stash/commit/0729ab19) Add TARGET_RESOURCE variable for BackupConfigurationTemplate (#814) +- [bab795c2](https://github.com/stashed/stash/commit/bab795c2) Add make install, uninstall, purge commands (#813) +- [604af0d5](https://github.com/stashed/stash/commit/604af0d5) Move chart & deploy scripts to github.com/stashed/installer (#811) +- [521f441b](https://github.com/stashed/stash/commit/521f441b) Use stashed/docs repo +- [4c89667d](https://github.com/stashed/stash/commit/4c89667d) Move docs to github.com/stashed/docs repo (#810) +- [e6614482](https://github.com/stashed/stash/commit/e6614482) Fix travis build (#804) +- [d8f565f4](https://github.com/stashed/stash/commit/d8f565f4) Pass labels to offshoot + add generic offshoot labels (#801) +- [eadca45d](https://github.com/stashed/stash/commit/eadca45d) Move HandleResticError to util package (#806) +- [df42b83f](https://github.com/stashed/stash/commit/df42b83f) Remove canary support (#805) +- [82614d32](https://github.com/stashed/stash/commit/82614d32) Update Version.go (#803) +- [74453ad8](https://github.com/stashed/stash/commit/74453ad8) Added ARM64 support to the install script and manifest (#802) +- [24ece6cc](https://github.com/stashed/stash/commit/24ece6cc) Load modules from vendor folder for linter +- [2672ee05](https://github.com/stashed/stash/commit/2672ee05) Add Makefile (#800) +- [ac829f30](https://github.com/stashed/stash/commit/ac829f30) VolumeSnapshot (#787) +- [a8f3172f](https://github.com/stashed/stash/commit/a8f3172f) Remove importance of order of rule in RestoreSession (#795) +- [886649ed](https://github.com/stashed/stash/commit/886649ed) Skip BackupSession creation if target does not exist + use timestamp … (#797) +- [f038d86e](https://github.com/stashed/stash/commit/f038d86e) Use absolute path as aliases for reference docs. (#796) +- [b9100307](https://github.com/stashed/stash/commit/b9100307) Support PSP enabled cluster (#729) +- [e94399dc](https://github.com/stashed/stash/commit/e94399dc) Use restic 0.9.5 (#789) +- [e962a1c4](https://github.com/stashed/stash/commit/e962a1c4) Fix: User and group creation of stash for mongodb and mysql (#786) +- [228df5a3](https://github.com/stashed/stash/commit/228df5a3) Update concept doc (#739) +- [de9536cd](https://github.com/stashed/stash/commit/de9536cd) Update backup manager (#782) +- [739273a5](https://github.com/stashed/stash/commit/739273a5) Configure Env variables for Functions (#780) +- [c49b24f6](https://github.com/stashed/stash/commit/c49b24f6) Add support for backup cluster resources YAML (#721) +- [91bce2fd](https://github.com/stashed/stash/commit/91bce2fd) Add "Supported Backends" doc to new guides (#756) +- [a8ef2d36](https://github.com/stashed/stash/commit/a8ef2d36) Fix rest backend for workloads + add more authentication method for swift backend (#778) +- [775b6660](https://github.com/stashed/stash/commit/775b6660) Backup and restore Elasticsearch (#702) +- [0fbb9c75](https://github.com/stashed/stash/commit/0fbb9c75) Add guides template for new design (#755) +- [03689414](https://github.com/stashed/stash/commit/03689414) Update package path to stash.appscode.dev/stash (#776) +- [639d499f](https://github.com/stashed/stash/commit/639d499f) Update to k8s 1.14.0 client libraries using go.mod (#775) +- [9ba906d8](https://github.com/stashed/stash/commit/9ba906d8) MutatingWebhooks must be without side-effect (#773) +- [937012d5](https://github.com/stashed/stash/commit/937012d5) Introduce VolumeSnapshot APIs (#772) +- [2b0f0560](https://github.com/stashed/stash/commit/2b0f0560) Use osm pkg from kmodules/objectstore-api (#770) +- [cd9f6ad6](https://github.com/stashed/stash/commit/cd9f6ad6) Remove --rbac flag (#761) +- [09af5d31](https://github.com/stashed/stash/commit/09af5d31) Skip creating/processing backup-session when backup-config is paused (#759) +- [99753f73](https://github.com/stashed/stash/commit/99753f73) Fix go fmt +- [64bb9bdd](https://github.com/stashed/stash/commit/64bb9bdd) Stash v1beta1 E2E test for PVC (#753) +- [bcf8b90d](https://github.com/stashed/stash/commit/bcf8b90d) Implement snapshots for v1beta1 api (#749) +- [3f0ae2d4](https://github.com/stashed/stash/commit/3f0ae2d4) Run restic commands using docker (#754) +- [17feb41c](https://github.com/stashed/stash/commit/17feb41c) Update Kubernetes client libraries to 1.13.5 (#752) +- [2d413ee0](https://github.com/stashed/stash/commit/2d413ee0) Stash v1beta1 E2E test for ReplicaSet (#747) +- [80b2b3d9](https://github.com/stashed/stash/commit/80b2b3d9) Enable pipefail and update restore yamls (#750) +- [c908df9f](https://github.com/stashed/stash/commit/c908df9f) Stash v1beta1 E2E test for ReplicationController (#742) +- [82c17eaf](https://github.com/stashed/stash/commit/82c17eaf) Fixed scratch-dir, output-dir and hostname in functions/tasks yamls (#744) +- [d113b24f](https://github.com/stashed/stash/commit/d113b24f) Add Stash CLI (#734) +- [286792a6](https://github.com/stashed/stash/commit/286792a6) Stash v1beta1 E2E test for DaemonSet (#741) +- [62960e5b](https://github.com/stashed/stash/commit/62960e5b) Apply nice/ionice settings from env (#746) +- [a2534c97](https://github.com/stashed/stash/commit/a2534c97) Stash V1beta1 E2E test for StatefulSet (#737) +- [37087b38](https://github.com/stashed/stash/commit/37087b38) Stash V1beta1 E2E test for Deployment (#710) +- [c08f04e4](https://github.com/stashed/stash/commit/c08f04e4) Attach local backend (#736) +- [7a282d91](https://github.com/stashed/stash/commit/7a282d91) Fix openapi path prefixes for validators and mutators (#732) +- [a8aef590](https://github.com/stashed/stash/commit/a8aef590) Add max-connections for GCS, Azure, B2 backend (#730) +- [dd3f459c](https://github.com/stashed/stash/commit/dd3f459c) Rename admission webhooks to avoid name collision (#725) +- [a32ceff5](https://github.com/stashed/stash/commit/a32ceff5) Apply EmptyDir settings to TmpDir (#719) +- [36fdb9ae](https://github.com/stashed/stash/commit/36fdb9ae) Use FailurePolicy ignore for K8s resource webhooks (#726) +- [4cab69a0](https://github.com/stashed/stash/commit/4cab69a0) Don't write secret data inside temp dir (#724) +- [e2bcc4a8](https://github.com/stashed/stash/commit/e2bcc4a8) Use ionice and nice with Restic CMD (#716) +- [bf91db4e](https://github.com/stashed/stash/commit/bf91db4e) Use cleanup-cache flag (#717) +- [f2669f17](https://github.com/stashed/stash/commit/f2669f17) Add TempDir and PSP settings for Function (#720) +- [dfc3fbd6](https://github.com/stashed/stash/commit/dfc3fbd6) Add support for rest backend (#713) +- [47cf2dd4](https://github.com/stashed/stash/commit/47cf2dd4) Add support for OpenShift DeploymentConfig (#714) +- [8c2b81b0](https://github.com/stashed/stash/commit/8c2b81b0) Backup and restore Mongo DB (#699) +- [2849319a](https://github.com/stashed/stash/commit/2849319a) Backup and restore MySQL DB (#696) +- [49fe8404](https://github.com/stashed/stash/commit/49fe8404) Backup and restore Postgres DB (#695) +- [dbff05f6](https://github.com/stashed/stash/commit/dbff05f6) Backup from stdin and dump to stdout (#694) +- [08ff2fa5](https://github.com/stashed/stash/commit/08ff2fa5) Add BackupSession Controller for Sidecar (#701) +- [83f1c6e5](https://github.com/stashed/stash/commit/83f1c6e5) Update workload controller for new design (#675) +- [13fb68bd](https://github.com/stashed/stash/commit/13fb68bd) Post backup/restore status update (#691) +- [30993c08](https://github.com/stashed/stash/commit/30993c08) Backup and restore PVC (#676) +- [7bdf0752](https://github.com/stashed/stash/commit/7bdf0752) Resolve tasks for backup/restore sessions (#674) +- [6a74602a](https://github.com/stashed/stash/commit/6a74602a) Add restic wrapper library (#673) +- [7b8309a5](https://github.com/stashed/stash/commit/7b8309a5) Add BackupConfiguration Controller (#671) +- [6f6c25d1](https://github.com/stashed/stash/commit/6f6c25d1) Use ContainerRuntimeSettings in Function spec (#689) +- [4d80cf6b](https://github.com/stashed/stash/commit/4d80cf6b) Update Kubernetes client libraries to 1.13.0 (#687) +- [361d4ad3](https://github.com/stashed/stash/commit/361d4ad3) Fix v1beta1 api for BackupConfigurationTemplate (#688) +- [302311af](https://github.com/stashed/stash/commit/302311af) Introduce v1beta1 api (#647) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2020.09.16.md b/content/docs/v2024.12.18/CHANGELOG-v2020.09.16.md new file mode 100644 index 0000000000..edfffeb00f --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2020.09.16.md @@ -0,0 +1,433 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2020.09.16 + name: Changelog-v2020.09.16 + parent: welcome + weight: 20200916 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2020.09.16/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2020.09.16/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2020.09.16 (2020-09-16) + + +## [appscode/stash-enterprise](https://github.com/appscode/stash-enterprise) + +### [v0.11.0](https://github.com/appscode/stash-enterprise/releases/tag/v0.11.0) + +- [8add0e83](https://github.com/appscode/stash-enterprise/commit/8add0e83) Prepare for release v0.11.0 (#24) +- [0b689384](https://github.com/appscode/stash-enterprise/commit/0b689384) Install license handler to operator webhook server (#23) +- [19e8313d](https://github.com/appscode/stash-enterprise/commit/19e8313d) Update Prometheus client version (#22) + + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.11.0](https://github.com/stashed/apimachinery/releases/tag/v0.11.0) + +- [0189ba36](https://github.com/stashed/apimachinery/commit/0189ba36) Add license related constants (#47) +- [de630b13](https://github.com/stashed/apimachinery/commit/de630b13) Update Kubernetes v1.18.3 dependencies (#48) +- [546ceea9](https://github.com/stashed/apimachinery/commit/546ceea9) Update Prometheus client version (#44) +- [88df3b0c](https://github.com/stashed/apimachinery/commit/88df3b0c) Update Kubernetes v1.18.3 dependencies (#46) +- [8608f5c5](https://github.com/stashed/apimachinery/commit/8608f5c5) Update Kubernetes v1.18.3 dependencies (#45) +- [41eca8e8](https://github.com/stashed/apimachinery/commit/41eca8e8) Update Kubernetes v1.18.3 dependencies (#43) + + + +## [stashed/catalog](https://github.com/stashed/catalog) + +### [v2020.09.16](https://github.com/stashed/catalog/releases/tag/v2020.09.16) + +- [1f44b9a](https://github.com/stashed/catalog/commit/1f44b9a) Prepare for release v2020.09.16 (#38) +- [c49f66f](https://github.com/stashed/catalog/commit/c49f66f) Use AppsCode Community License (#37) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.11.0](https://github.com/stashed/cli/releases/tag/v0.11.0) + +- [28f863f](https://github.com/stashed/cli/commit/28f863f) Prepare for release v0.11.0 (#48) +- [fe90a5a](https://github.com/stashed/cli/commit/fe90a5a) Update Kubernetes v1.18.3 dependencies (#47) +- [bdc2eb8](https://github.com/stashed/cli/commit/bdc2eb8) Use github.com/prometheus/client_golang@v1.7.1 (#46) +- [fea66e1](https://github.com/stashed/cli/commit/fea66e1) Update Kubernetes v1.18.3 dependencies (#45) +- [334aff0](https://github.com/stashed/cli/commit/334aff0) Use AppsCode Community License (#44) +- [5e07d8f](https://github.com/stashed/cli/commit/5e07d8f) Update Kubernetes v1.18.3 dependencies (#43) +- [c6a8d81](https://github.com/stashed/cli/commit/c6a8d81) Update Kubernetes v1.18.3 dependencies (#42) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v2](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v2) + +- [ced22a9](https://github.com/stashed/elasticsearch/commit/ced22a9) Prepare for release 5.6.4-v2 (#246) +- [2ff93eb](https://github.com/stashed/elasticsearch/commit/2ff93eb) [cherry-pick] Verify license info from stash operator (#237) (#238) +- [9fffb2d](https://github.com/stashed/elasticsearch/commit/9fffb2d) [cherry-pick] Use github.com/prometheus/client_golang@v1.7.1 (#228) (#229) +- [54e853c](https://github.com/stashed/elasticsearch/commit/54e853c) [cherry-pick] Switch to AppsCode Trial license (#219) (#220) +- [cf45e19](https://github.com/stashed/elasticsearch/commit/cf45e19) [cherry-pick] Use AppsCode Community License (#210) (#211) + + +### [6.2.4-v2](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v2) + +- [a4a25fb](https://github.com/stashed/elasticsearch/commit/a4a25fb) Prepare for release 6.2.4-v2 (#247) +- [faccd9c](https://github.com/stashed/elasticsearch/commit/faccd9c) [cherry-pick] Verify license info from stash operator (#237) (#239) +- [1fcca35](https://github.com/stashed/elasticsearch/commit/1fcca35) [cherry-pick] Use github.com/prometheus/client_golang@v1.7.1 (#228) (#230) +- [5ff3d49](https://github.com/stashed/elasticsearch/commit/5ff3d49) [cherry-pick] Switch to AppsCode Trial license (#219) (#221) +- [f3fae80](https://github.com/stashed/elasticsearch/commit/f3fae80) [cherry-pick] Use AppsCode Community License (#210) (#212) + + +### [6.3.0-v2](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v2) + +- [0e19668](https://github.com/stashed/elasticsearch/commit/0e19668) Prepare for release 6.3.0-v2 (#248) +- [9648ed3](https://github.com/stashed/elasticsearch/commit/9648ed3) [cherry-pick] Verify license info from stash operator (#237) (#240) +- [4d23c41](https://github.com/stashed/elasticsearch/commit/4d23c41) [cherry-pick] Use github.com/prometheus/client_golang@v1.7.1 (#228) (#231) +- [58649ad](https://github.com/stashed/elasticsearch/commit/58649ad) [cherry-pick] Switch to AppsCode Trial license (#219) (#222) +- [d950285](https://github.com/stashed/elasticsearch/commit/d950285) [cherry-pick] Use AppsCode Community License (#210) (#213) + + +### [6.4.0-v2](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v2) + +- [1020631](https://github.com/stashed/elasticsearch/commit/1020631) Prepare for release 6.4.0-v2 (#249) +- [7bfb7d7](https://github.com/stashed/elasticsearch/commit/7bfb7d7) [cherry-pick] Verify license info from stash operator (#237) (#241) +- [3eb4fb9](https://github.com/stashed/elasticsearch/commit/3eb4fb9) [cherry-pick] Use github.com/prometheus/client_golang@v1.7.1 (#228) (#232) +- [f7c6228](https://github.com/stashed/elasticsearch/commit/f7c6228) [cherry-pick] Switch to AppsCode Trial license (#219) (#223) +- [b80c2f4](https://github.com/stashed/elasticsearch/commit/b80c2f4) [cherry-pick] Use AppsCode Community License (#210) (#214) + + +### [6.5.3-v2](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v2) + +- [3793d92](https://github.com/stashed/elasticsearch/commit/3793d92) Prepare for release 6.5.3-v2 (#250) +- [0e38789](https://github.com/stashed/elasticsearch/commit/0e38789) [cherry-pick] Verify license info from stash operator (#237) (#242) +- [3560a7e](https://github.com/stashed/elasticsearch/commit/3560a7e) [cherry-pick] Use github.com/prometheus/client_golang@v1.7.1 (#228) (#233) +- [b904573](https://github.com/stashed/elasticsearch/commit/b904573) [cherry-pick] Switch to AppsCode Trial license (#219) (#224) +- [7b0b5f9](https://github.com/stashed/elasticsearch/commit/7b0b5f9) [cherry-pick] Use AppsCode Community License (#210) (#215) + + +### [6.8.0-v2](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v2) + +- [3c46fa4](https://github.com/stashed/elasticsearch/commit/3c46fa4) Prepare for release 6.8.0-v2 (#251) +- [489bf75](https://github.com/stashed/elasticsearch/commit/489bf75) [cherry-pick] Verify license info from stash operator (#237) (#243) +- [5dee02e](https://github.com/stashed/elasticsearch/commit/5dee02e) [cherry-pick] Use github.com/prometheus/client_golang@v1.7.1 (#228) (#234) +- [067642a](https://github.com/stashed/elasticsearch/commit/067642a) [cherry-pick] Switch to AppsCode Trial license (#219) (#225) +- [7f96aea](https://github.com/stashed/elasticsearch/commit/7f96aea) [cherry-pick] Use AppsCode Community License (#210) (#216) + + +### [7.2.0-v2](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v2) + +- [32cffd2](https://github.com/stashed/elasticsearch/commit/32cffd2) Prepare for release 7.2.0-v2 (#252) +- [d123f35](https://github.com/stashed/elasticsearch/commit/d123f35) [cherry-pick] Verify license info from stash operator (#237) (#244) +- [25e8779](https://github.com/stashed/elasticsearch/commit/25e8779) [cherry-pick] Use github.com/prometheus/client_golang@v1.7.1 (#228) (#235) +- [ddcd7ef](https://github.com/stashed/elasticsearch/commit/ddcd7ef) [cherry-pick] Switch to AppsCode Trial license (#219) (#226) +- [96add80](https://github.com/stashed/elasticsearch/commit/96add80) [cherry-pick] Use AppsCode Community License (#210) (#217) + + +### [7.3.2-v2](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v2) + +- [3acdbad](https://github.com/stashed/elasticsearch/commit/3acdbad) Prepare for release 7.3.2-v2 (#253) +- [346f7d8](https://github.com/stashed/elasticsearch/commit/346f7d8) [cherry-pick] Verify license info from stash operator (#237) (#245) +- [5ad4ebb](https://github.com/stashed/elasticsearch/commit/5ad4ebb) [cherry-pick] Use github.com/prometheus/client_golang@v1.7.1 (#228) (#236) +- [fbe8fdc](https://github.com/stashed/elasticsearch/commit/fbe8fdc) [cherry-pick] Switch to AppsCode Trial license (#219) (#227) +- [bfdd1fb](https://github.com/stashed/elasticsearch/commit/bfdd1fb) [cherry-pick] Use AppsCode Community License (#210) (#218) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v0.11.0](https://github.com/stashed/installer/releases/tag/v0.11.0) + +- [11a4b97](https://github.com/stashed/installer/commit/11a4b97) Prepare for release v0.11.0 (#101) +- [96e1ea0](https://github.com/stashed/installer/commit/96e1ea0) Add permission to list nodes (#100) +- [e18b2f9](https://github.com/stashed/installer/commit/e18b2f9) Add cluster role for license checker (#98) +- [25ee54b](https://github.com/stashed/installer/commit/25ee54b) Update Kubernetes v1.18.3 dependencies (#99) +- [194b734](https://github.com/stashed/installer/commit/194b734) Update Kubernetes v1.18.3 dependencies (#97) +- [a9c363b](https://github.com/stashed/installer/commit/a9c363b) Use AppsCode Community License (#96) +- [48e8a45](https://github.com/stashed/installer/commit/48e8a45) Update Kubernetes v1.18.3 dependencies (#95) +- [85e89b2](https://github.com/stashed/installer/commit/85e89b2) Update Kubernetes v1.18.3 dependencies (#94) +- [a7ebe2f](https://github.com/stashed/installer/commit/a7ebe2f) Update chart icons + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.1-v2](https://github.com/stashed/mongodb/releases/tag/3.4.1-v2) + +- [d6cd42a](https://github.com/stashed/mongodb/commit/d6cd42a) Prepare for release 3.4.1-v2 (#315) +- [5d846c3](https://github.com/stashed/mongodb/commit/5d846c3) [cherry-pick] Verify license info from stash operator (#303) (#304) +- [f0f5274](https://github.com/stashed/mongodb/commit/f0f5274) [cherry-pick] Switch to tls secret from pem in AppBinding (#255) (#292) +- [3e1f75b](https://github.com/stashed/mongodb/commit/3e1f75b) [cherry-pick] Use github.com/prometheus/client_golang@v1.7.1 (#280) (#281) +- [58f36c3](https://github.com/stashed/mongodb/commit/58f36c3) [cherry-pick] Switch to AppsCode Trial license (#268) (#269) +- [d8bfed7](https://github.com/stashed/mongodb/commit/d8bfed7) [cherry-pick] Use AppsCode Community License (#256) (#257) + + +### [3.4.2-v2](https://github.com/stashed/mongodb/releases/tag/3.4.2-v2) + +- [9f39b16](https://github.com/stashed/mongodb/commit/9f39b16) Prepare for release 3.4.2-v2 (#316) +- [342b46f](https://github.com/stashed/mongodb/commit/342b46f) [cherry-pick] Verify license info from stash operator (#303) (#305) +- [056167e](https://github.com/stashed/mongodb/commit/056167e) [cherry-pick] Switch to tls secret from pem in AppBinding (#255) (#293) +- [a4fbda4](https://github.com/stashed/mongodb/commit/a4fbda4) [cherry-pick] Use github.com/prometheus/client_golang@v1.7.1 (#280) (#282) +- [10dd2fe](https://github.com/stashed/mongodb/commit/10dd2fe) [cherry-pick] Switch to AppsCode Trial license (#268) (#270) +- [89323b4](https://github.com/stashed/mongodb/commit/89323b4) [cherry-pick] Use AppsCode Community License (#256) (#258) + + +### [3.6.1-v2](https://github.com/stashed/mongodb/releases/tag/3.6.1-v2) + +- [fe0e93b](https://github.com/stashed/mongodb/commit/fe0e93b) Prepare for release 3.6.1-v2 (#317) +- [b53756a](https://github.com/stashed/mongodb/commit/b53756a) [cherry-pick] Verify license info from stash operator (#303) (#306) +- [239ef49](https://github.com/stashed/mongodb/commit/239ef49) [cherry-pick] Switch to tls secret from pem in AppBinding (#255) (#294) +- [9684b9b](https://github.com/stashed/mongodb/commit/9684b9b) [cherry-pick] Use github.com/prometheus/client_golang@v1.7.1 (#280) (#283) +- [6697768](https://github.com/stashed/mongodb/commit/6697768) [cherry-pick] Switch to AppsCode Trial license (#268) (#271) +- [b25b9e0](https://github.com/stashed/mongodb/commit/b25b9e0) [cherry-pick] Use AppsCode Community License (#256) (#259) + + +### [3.6.8-v2](https://github.com/stashed/mongodb/releases/tag/3.6.8-v2) + +- [f358adb](https://github.com/stashed/mongodb/commit/f358adb) Prepare for release 3.6.8-v2 (#318) +- [57d51f3](https://github.com/stashed/mongodb/commit/57d51f3) [cherry-pick] Verify license info from stash operator (#303) (#307) +- [e25588b](https://github.com/stashed/mongodb/commit/e25588b) [cherry-pick] Switch to tls secret from pem in AppBinding (#255) (#295) +- [e727df2](https://github.com/stashed/mongodb/commit/e727df2) [cherry-pick] Use github.com/prometheus/client_golang@v1.7.1 (#280) (#284) +- [e2a3e54](https://github.com/stashed/mongodb/commit/e2a3e54) [cherry-pick] Switch to AppsCode Trial license (#268) (#272) +- [3125f19](https://github.com/stashed/mongodb/commit/3125f19) [cherry-pick] Use AppsCode Community License (#256) (#260) + + +### [4.0.3-v2](https://github.com/stashed/mongodb/releases/tag/4.0.3-v2) + +- [5734929](https://github.com/stashed/mongodb/commit/5734929) Prepare for release 4.0.3-v2 (#320) +- [554125f](https://github.com/stashed/mongodb/commit/554125f) [cherry-pick] Verify license info from stash operator (#303) (#309) +- [51fc4fc](https://github.com/stashed/mongodb/commit/51fc4fc) [cherry-pick] Switch to tls secret from pem in AppBinding (#255) (#297) +- [5a25af3](https://github.com/stashed/mongodb/commit/5a25af3) [cherry-pick] Use github.com/prometheus/client_golang@v1.7.1 (#280) (#286) +- [791057c](https://github.com/stashed/mongodb/commit/791057c) [cherry-pick] Switch to AppsCode Trial license (#268) (#274) +- [cab86cc](https://github.com/stashed/mongodb/commit/cab86cc) [cherry-pick] Use AppsCode Community License (#256) (#262) + + +### [4.0.5-v2](https://github.com/stashed/mongodb/releases/tag/4.0.5-v2) + +- [4939a48](https://github.com/stashed/mongodb/commit/4939a48) Prepare for release 4.0.5-v2 (#321) +- [b5df908](https://github.com/stashed/mongodb/commit/b5df908) [cherry-pick] Verify license info from stash operator (#303) (#310) +- [051f4cd](https://github.com/stashed/mongodb/commit/051f4cd) [cherry-pick] Switch to tls secret from pem in AppBinding (#255) (#298) +- [3ba1f6c](https://github.com/stashed/mongodb/commit/3ba1f6c) [cherry-pick] Use github.com/prometheus/client_golang@v1.7.1 (#280) (#287) +- [8f1e9ae](https://github.com/stashed/mongodb/commit/8f1e9ae) [cherry-pick] Switch to AppsCode Trial license (#268) (#275) +- [6ff6079](https://github.com/stashed/mongodb/commit/6ff6079) [cherry-pick] Use AppsCode Community License (#256) (#263) + + +### [4.0.11-v2](https://github.com/stashed/mongodb/releases/tag/4.0.11-v2) + +- [dd45e66](https://github.com/stashed/mongodb/commit/dd45e66) Prepare for release 4.0.11-v2 (#319) +- [909ce13](https://github.com/stashed/mongodb/commit/909ce13) [cherry-pick] Verify license info from stash operator (#303) (#308) +- [27c9145](https://github.com/stashed/mongodb/commit/27c9145) [cherry-pick] Switch to tls secret from pem in AppBinding (#255) (#296) +- [c0fd352](https://github.com/stashed/mongodb/commit/c0fd352) [cherry-pick] Use github.com/prometheus/client_golang@v1.7.1 (#280) (#285) +- [9594c13](https://github.com/stashed/mongodb/commit/9594c13) [cherry-pick] Switch to AppsCode Trial license (#268) (#273) +- [4d211b9](https://github.com/stashed/mongodb/commit/4d211b9) [cherry-pick] Use AppsCode Community License (#256) (#261) + + +### [4.1.1-v2](https://github.com/stashed/mongodb/releases/tag/4.1.1-v2) + +- [5740420](https://github.com/stashed/mongodb/commit/5740420) Prepare for release 4.1.1-v2 (#322) +- [2b824a1](https://github.com/stashed/mongodb/commit/2b824a1) [cherry-pick] Verify license info from stash operator (#303) (#311) +- [d19b059](https://github.com/stashed/mongodb/commit/d19b059) [cherry-pick] Switch to tls secret from pem in AppBinding (#255) (#299) +- [271906b](https://github.com/stashed/mongodb/commit/271906b) [cherry-pick] Use github.com/prometheus/client_golang@v1.7.1 (#280) (#288) +- [0de8dd3](https://github.com/stashed/mongodb/commit/0de8dd3) [cherry-pick] Switch to AppsCode Trial license (#268) (#276) +- [159d83f](https://github.com/stashed/mongodb/commit/159d83f) [cherry-pick] Use AppsCode Community License (#256) (#264) + + +### [4.1.4-v2](https://github.com/stashed/mongodb/releases/tag/4.1.4-v2) + +- [6507bd9](https://github.com/stashed/mongodb/commit/6507bd9) Prepare for release 4.1.4-v2 (#323) +- [2faa4f1](https://github.com/stashed/mongodb/commit/2faa4f1) [cherry-pick] Verify license info from stash operator (#303) (#312) +- [4201854](https://github.com/stashed/mongodb/commit/4201854) [cherry-pick] Switch to tls secret from pem in AppBinding (#255) (#300) +- [a106836](https://github.com/stashed/mongodb/commit/a106836) [cherry-pick] Use github.com/prometheus/client_golang@v1.7.1 (#280) (#289) +- [e1ad15f](https://github.com/stashed/mongodb/commit/e1ad15f) [cherry-pick] Switch to AppsCode Trial license (#268) (#277) +- [721bef2](https://github.com/stashed/mongodb/commit/721bef2) [cherry-pick] Use AppsCode Community License (#256) (#265) + + +### [4.1.7-v2](https://github.com/stashed/mongodb/releases/tag/4.1.7-v2) + +- [833905a](https://github.com/stashed/mongodb/commit/833905a) Prepare for release 4.1.7-v2 (#324) +- [2e06c98](https://github.com/stashed/mongodb/commit/2e06c98) [cherry-pick] Verify license info from stash operator (#303) (#313) +- [d7b6f14](https://github.com/stashed/mongodb/commit/d7b6f14) [cherry-pick] Switch to tls secret from pem in AppBinding (#255) (#301) +- [1f70c99](https://github.com/stashed/mongodb/commit/1f70c99) [cherry-pick] Use github.com/prometheus/client_golang@v1.7.1 (#280) (#290) +- [dadc11a](https://github.com/stashed/mongodb/commit/dadc11a) [cherry-pick] Switch to AppsCode Trial license (#268) (#278) +- [9ebe64f](https://github.com/stashed/mongodb/commit/9ebe64f) [cherry-pick] Use AppsCode Community License (#256) (#266) + + +### [4.2.3-v2](https://github.com/stashed/mongodb/releases/tag/4.2.3-v2) + +- [ae039dd](https://github.com/stashed/mongodb/commit/ae039dd) Prepare for release 4.2.3-v2 (#325) +- [99fe171](https://github.com/stashed/mongodb/commit/99fe171) [cherry-pick] Verify license info from stash operator (#303) (#314) +- [60ee4a0](https://github.com/stashed/mongodb/commit/60ee4a0) [cherry-pick] Switch to tls secret from pem in AppBinding (#255) (#302) +- [c24a9bc](https://github.com/stashed/mongodb/commit/c24a9bc) [cherry-pick] Use github.com/prometheus/client_golang@v1.7.1 (#280) (#291) +- [add112a](https://github.com/stashed/mongodb/commit/add112a) [cherry-pick] Switch to AppsCode Trial license (#268) (#279) +- [e9dded8](https://github.com/stashed/mongodb/commit/e9dded8) [cherry-pick] Use AppsCode Community License (#256) (#267) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v2](https://github.com/stashed/mysql/releases/tag/5.7.25-v2) + +- [c28b084](https://github.com/stashed/mysql/commit/c28b084) Prepare for release 5.7.25-v2 (#123) +- [c2f5aab](https://github.com/stashed/mysql/commit/c2f5aab) [cherry-pick] Verify license info from stash operator (#119) (#120) +- [4686afa](https://github.com/stashed/mysql/commit/4686afa) [cherry-pick] Use github.com/prometheus/client_golang@v1.7.1 (#115) (#116) +- [09c142d](https://github.com/stashed/mysql/commit/09c142d) [cherry-pick] Switch to AppsCode Trial license (#111) (#112) +- [b0b47b4](https://github.com/stashed/mysql/commit/b0b47b4) [cherry-pick] Use AppsCode Community License (#107) (#108) + + +### [8.0.3-v2](https://github.com/stashed/mysql/releases/tag/8.0.3-v2) + +- [0bd9422](https://github.com/stashed/mysql/commit/0bd9422) Prepare for release 8.0.3-v2 (#125) +- [753c3b5](https://github.com/stashed/mysql/commit/753c3b5) [cherry-pick] Verify license info from stash operator (#119) (#122) +- [e931e41](https://github.com/stashed/mysql/commit/e931e41) [cherry-pick] Use github.com/prometheus/client_golang@v1.7.1 (#115) (#118) +- [96c677d](https://github.com/stashed/mysql/commit/96c677d) [cherry-pick] Switch to AppsCode Trial license (#111) (#114) +- [3f231cf](https://github.com/stashed/mysql/commit/3f231cf) [cherry-pick] Use AppsCode Community License (#107) (#110) + + +### [8.0.14-v2](https://github.com/stashed/mysql/releases/tag/8.0.14-v2) + +- [5e20d12](https://github.com/stashed/mysql/commit/5e20d12) Prepare for release 8.0.14-v2 (#124) +- [7c4801f](https://github.com/stashed/mysql/commit/7c4801f) [cherry-pick] Verify license info from stash operator (#119) (#121) +- [76980c4](https://github.com/stashed/mysql/commit/76980c4) [cherry-pick] Use github.com/prometheus/client_golang@v1.7.1 (#115) (#117) +- [23a26cd](https://github.com/stashed/mysql/commit/23a26cd) [cherry-pick] Switch to AppsCode Trial license (#111) (#113) +- [3954180](https://github.com/stashed/mysql/commit/3954180) [cherry-pick] Use AppsCode Community License (#107) (#109) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-v2](https://github.com/stashed/percona-xtradb/releases/tag/5.7-v2) + +- [d33e539](https://github.com/stashed/percona-xtradb/commit/d33e539) Prepare for release 5.7-v2 (#65) +- [b53cfc8](https://github.com/stashed/percona-xtradb/commit/b53cfc8) [cherry-pick] Verify license info from stash operator (#63) (#64) +- [859b6a4](https://github.com/stashed/percona-xtradb/commit/859b6a4) [cherry-pick] Use github.com/prometheus/client_golang@v1.7.1 (#61) (#62) +- [14f50b8](https://github.com/stashed/percona-xtradb/commit/14f50b8) Switch to AppsCode Trial license +- [c287878](https://github.com/stashed/percona-xtradb/commit/c287878) Delete LICENSE + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19](https://github.com/stashed/postgres/releases/tag/9.6.19) + +- [6fd2741](https://github.com/stashed/postgres/commit/6fd2741) Prepare for release 9.6.19 (#198) +- [06b6542](https://github.com/stashed/postgres/commit/06b6542) Add support for postgres:9.6.19 +- [e1cfed8](https://github.com/stashed/postgres/commit/e1cfed8) [cherry-pick] Verify license info from stash operator (#189) (#194) +- [82fc42b](https://github.com/stashed/postgres/commit/82fc42b) [cherry-pick] Use github.com/prometheus/client_golang@v1.7.1 (#183) (#188) +- [e64c0c7](https://github.com/stashed/postgres/commit/e64c0c7) [cherry-pick] Switch to AppsCode Trial license (#177) (#182) +- [1004dfb](https://github.com/stashed/postgres/commit/1004dfb) [cherry-pick] Use AppsCode Community License (#171) (#176) + + +### [10.14.0](https://github.com/stashed/postgres/releases/tag/10.14.0) + +- [4642779](https://github.com/stashed/postgres/commit/4642779) Prepare for release 10.14.0 (#195) +- [2e94c31](https://github.com/stashed/postgres/commit/2e94c31) Add support for postgres:10.14 +- [9d1856e](https://github.com/stashed/postgres/commit/9d1856e) [cherry-pick] Verify license info from stash operator (#189) (#191) +- [86798e0](https://github.com/stashed/postgres/commit/86798e0) [cherry-pick] Use github.com/prometheus/client_golang@v1.7.1 (#183) (#185) +- [f58127c](https://github.com/stashed/postgres/commit/f58127c) [cherry-pick] Switch to AppsCode Trial license (#177) (#179) +- [d1929f1](https://github.com/stashed/postgres/commit/d1929f1) [cherry-pick] Use AppsCode Community License (#171) (#173) + + +### [11.9.0](https://github.com/stashed/postgres/releases/tag/11.9.0) + +- [5138fc7](https://github.com/stashed/postgres/commit/5138fc7) Prepare for release 11.9.0 (#196) +- [81de1d6](https://github.com/stashed/postgres/commit/81de1d6) Add support for postgres:11.9 +- [747613b](https://github.com/stashed/postgres/commit/747613b) [cherry-pick] Verify license info from stash operator (#189) (#193) +- [af40fa9](https://github.com/stashed/postgres/commit/af40fa9) [cherry-pick] Use github.com/prometheus/client_golang@v1.7.1 (#183) (#187) +- [00f48a6](https://github.com/stashed/postgres/commit/00f48a6) [cherry-pick] Switch to AppsCode Trial license (#177) (#181) +- [d673cea](https://github.com/stashed/postgres/commit/d673cea) [cherry-pick] Use AppsCode Community License (#171) (#175) + + +### [12.4.0](https://github.com/stashed/postgres/releases/tag/12.4.0) + + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.11.0](https://github.com/stashed/stash/releases/tag/v0.11.0) + +- [a919b347](https://github.com/stashed/stash/commit/a919b347) Prepare for release v0.11.0 (#1198) +- [33cc3131](https://github.com/stashed/stash/commit/33cc3131) Update Kubernetes v1.18.3 dependencies (#1197) +- [58b28e02](https://github.com/stashed/stash/commit/58b28e02) Install license handler to operator webhook server (#1194) +- [642f935c](https://github.com/stashed/stash/commit/642f935c) Update Kubernetes v1.18.3 dependencies (#1196) +- [09f7213e](https://github.com/stashed/stash/commit/09f7213e) Document database addons as enterprise feature (#1195) +- [77b40b2b](https://github.com/stashed/stash/commit/77b40b2b) Update Prometheus client version (#1191) +- [f452230c](https://github.com/stashed/stash/commit/f452230c) Update Kubernetes v1.18.3 dependencies (#1189) +- [9f5e1c70](https://github.com/stashed/stash/commit/9f5e1c70) Use AppsCode Community License (#1188) +- [6802b5aa](https://github.com/stashed/stash/commit/6802b5aa) Update Kubernetes v1.18.3 dependencies (#1186) +- [b5a4a690](https://github.com/stashed/stash/commit/b5a4a690) Update Kubernetes v1.18.3 dependencies (#1185) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2020.09.29.md b/content/docs/v2024.12.18/CHANGELOG-v2020.09.29.md new file mode 100644 index 0000000000..56e75f720b --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2020.09.29.md @@ -0,0 +1,175 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2020.09.29 + name: Changelog-v2020.09.29 + parent: welcome + weight: 20200929 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2020.09.29/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2020.09.29/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2020.09.29 (2020-09-29) + + +## [appscode/stash-enterprise](https://github.com/appscode/stash-enterprise) + +### [v0.11.2](https://github.com/appscode/stash-enterprise/releases/tag/v0.11.2) + +- [b6b0c6ac](https://github.com/appscode/stash-enterprise/commit/b6b0c6ac) Prepare for release v0.11.2 (#28) +- [281b513c](https://github.com/appscode/stash-enterprise/commit/281b513c) Fix database auto-backup + Repository status update (#27) +- [10da79b8](https://github.com/appscode/stash-enterprise/commit/10da79b8) Update repository config (#26) +- [0aecb235](https://github.com/appscode/stash-enterprise/commit/0aecb235) Update repository config (#25) +- [81726ec5](https://github.com/appscode/stash-enterprise/commit/81726ec5) Update features table + + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.11.2](https://github.com/stashed/apimachinery/releases/tag/v0.11.2) + +- [fdc12ac2](https://github.com/stashed/apimachinery/commit/fdc12ac2) Update Kubernetes v1.18.9 dependencies (#56) +- [6ed3a17b](https://github.com/stashed/apimachinery/commit/6ed3a17b) Use POST instead of PUT method to push metrics into pushgateway (#55) +- [1cff3b6b](https://github.com/stashed/apimachinery/commit/1cff3b6b) Update Kubernetes v1.18.9 dependencies (#54) +- [596541c6](https://github.com/stashed/apimachinery/commit/596541c6) Update repository config (#53) +- [64f1e392](https://github.com/stashed/apimachinery/commit/64f1e392) Update repository config (#52) +- [3b73ec67](https://github.com/stashed/apimachinery/commit/3b73ec67) Update Kubernetes v1.18.9 dependencies (#51) +- [0c4ff5e6](https://github.com/stashed/apimachinery/commit/0c4ff5e6) Update Kubernetes v1.18.3 dependencies (#50) +- [01d9fb4d](https://github.com/stashed/apimachinery/commit/01d9fb4d) Update Kubernetes v1.18.3 dependencies (#49) + + + +## [stashed/catalog](https://github.com/stashed/catalog) + +### [v2020.09.29](https://github.com/stashed/catalog/releases/tag/v2020.09.29) + +- [c971630](https://github.com/stashed/catalog/commit/c971630) Prepare for release v2020.09.29 (#41) +- [bacd576](https://github.com/stashed/catalog/commit/bacd576) Update repository config (#40) +- [2d001cd](https://github.com/stashed/catalog/commit/2d001cd) Update repository config (#39) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.11.2](https://github.com/stashed/cli/releases/tag/v0.11.2) + +- [9566b46](https://github.com/stashed/cli/commit/9566b46) Prepare for release v0.11.2 (#56) +- [8eab6d9](https://github.com/stashed/cli/commit/8eab6d9) Update Kubernetes v1.18.9 dependencies (#55) +- [91ae713](https://github.com/stashed/cli/commit/91ae713) Update Kubernetes v1.18.9 dependencies (#54) +- [ae36a24](https://github.com/stashed/cli/commit/ae36a24) Update repository config (#53) +- [a2f4793](https://github.com/stashed/cli/commit/a2f4793) Update Kubernetes v1.18.9 dependencies (#52) +- [6edbe6d](https://github.com/stashed/cli/commit/6edbe6d) Update Kubernetes v1.18.3 dependencies (#51) +- [37eee1c](https://github.com/stashed/cli/commit/37eee1c) Update Kubernetes v1.18.3 dependencies (#50) +- [7045e6b](https://github.com/stashed/cli/commit/7045e6b) Update Kubernetes v1.18.3 dependencies (#49) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v0.11.2](https://github.com/stashed/installer/releases/tag/v0.11.2) + +- [6b6c270](https://github.com/stashed/installer/commit/6b6c270) Prepare for release v0.11.2 (#110) +- [15d8827](https://github.com/stashed/installer/commit/15d8827) Update Kubernetes v1.18.9 dependencies (#109) +- [ade81f7](https://github.com/stashed/installer/commit/ade81f7) Update pushgateway version (#108) +- [4b8dcbf](https://github.com/stashed/installer/commit/4b8dcbf) Update Kubernetes v1.18.9 dependencies (#107) +- [72b9d7d](https://github.com/stashed/installer/commit/72b9d7d) Update repository config (#106) +- [d4c3d9f](https://github.com/stashed/installer/commit/d4c3d9f) Update repository config (#105) +- [a1b99bd](https://github.com/stashed/installer/commit/a1b99bd) Update Kubernetes v1.18.9 dependencies (#104) +- [2d13138](https://github.com/stashed/installer/commit/2d13138) Update Kubernetes v1.18.3 dependencies (#103) +- [7f17beb](https://github.com/stashed/installer/commit/7f17beb) Update Kubernetes v1.18.3 dependencies (#102) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.11.2](https://github.com/stashed/stash/releases/tag/v0.11.2) + +- [ba1cb598](https://github.com/stashed/stash/commit/ba1cb598) Prepare for release v0.11.2 (#1211) +- [09b06beb](https://github.com/stashed/stash/commit/09b06beb) Update Kubernetes v1.18.9 dependencies (#1209) +- [d0bae661](https://github.com/stashed/stash/commit/d0bae661) Fix repository status update (#1208) +- [d7ee2d1e](https://github.com/stashed/stash/commit/d7ee2d1e) Update Kubernetes v1.18.9 dependencies (#1205) +- [b97403dc](https://github.com/stashed/stash/commit/b97403dc) Update repository config (#1204) +- [44173b82](https://github.com/stashed/stash/commit/44173b82) Update repository config (#1203) +- [3e62cd2d](https://github.com/stashed/stash/commit/3e62cd2d) Update repository config (#1202) +- [bfac4f0f](https://github.com/stashed/stash/commit/bfac4f0f) Update Kubernetes v1.18.9 dependencies (#1201) +- [022c5eac](https://github.com/stashed/stash/commit/022c5eac) Update Kubernetes v1.18.3 dependencies (#1200) +- [9793d44b](https://github.com/stashed/stash/commit/9793d44b) Update README.md +- [2970d018](https://github.com/stashed/stash/commit/2970d018) Update Kubernetes v1.18.3 dependencies (#1199) +- [86e90746](https://github.com/stashed/stash/commit/86e90746) Implicitly import go.bytebuilders.dev/license-verifier +- [8acf60c2](https://github.com/stashed/stash/commit/8acf60c2) Update README.md + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2020.10.21.md b/content/docs/v2024.12.18/CHANGELOG-v2020.10.21.md new file mode 100644 index 0000000000..995cab0406 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2020.10.21.md @@ -0,0 +1,684 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2020.10.21 + name: Changelog-v2020.10.21 + parent: welcome + weight: 20201021 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2020.10.21/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2020.10.21/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2020.10.21 (2020-10-22) + + +## [appscode/stash-enterprise](https://github.com/appscode/stash-enterprise) + +### [v0.11.3](https://github.com/appscode/stash-enterprise/releases/tag/v0.11.3) + +- [371a7035](https://github.com/appscode/stash-enterprise/commit/371a7035) Prepare for release v0.11.3 (#41) +- [2e72fb71](https://github.com/appscode/stash-enterprise/commit/2e72fb71) Pass offshoot labels to CronJob pods (#40) +- [c1c186bf](https://github.com/appscode/stash-enterprise/commit/c1c186bf) Use BackoffLimit=0 for backup/restore job (#30) +- [1d39bbf9](https://github.com/appscode/stash-enterprise/commit/1d39bbf9) Fix ClusterRoleBinding name conflict (#39) +- [07c17b9c](https://github.com/appscode/stash-enterprise/commit/07c17b9c) Use restic 0.10.0 (#35) +- [e6757e0f](https://github.com/appscode/stash-enterprise/commit/e6757e0f) Update Kubernetes v1.18.9 dependencies (#34) +- [22b9bc3a](https://github.com/appscode/stash-enterprise/commit/22b9bc3a) Update repository config (#36) +- [701ba9f1](https://github.com/appscode/stash-enterprise/commit/701ba9f1) Publish docker images to ghcr.io (#33) +- [e975d3e4](https://github.com/appscode/stash-enterprise/commit/e975d3e4) Update repository config (#32) +- [26bfbe64](https://github.com/appscode/stash-enterprise/commit/26bfbe64) Update Kubernetes v1.18.9 dependencies (#29) + + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.11.3](https://github.com/stashed/apimachinery/releases/tag/v0.11.3) + +- [e8a63084](https://github.com/stashed/apimachinery/commit/e8a63084) Update dependencies (#63) +- [403ba163](https://github.com/stashed/apimachinery/commit/403ba163) Update Kubernetes v1.18.9 dependencies (#61) +- [8f316890](https://github.com/stashed/apimachinery/commit/8f316890) Use restic 0.10.0 (#60) +- [28c0ca71](https://github.com/stashed/apimachinery/commit/28c0ca71) Update Kubernetes v1.18.9 dependencies (#59) +- [9df9f83e](https://github.com/stashed/apimachinery/commit/9df9f83e) Update Kubernetes v1.18.9 dependencies (#58) +- [fed98cfa](https://github.com/stashed/apimachinery/commit/fed98cfa) Update Kubernetes v1.18.9 dependencies (#57) + + + +## [stashed/catalog](https://github.com/stashed/catalog) + +### [v2020.10.21](https://github.com/stashed/catalog/releases/tag/v2020.10.21) + +- [0e40f71](https://github.com/stashed/catalog/commit/0e40f71) Prepare for release v2020.10.21 (#44) +- [1cf5e3e](https://github.com/stashed/catalog/commit/1cf5e3e) Update repository config (#43) +- [ccae76e](https://github.com/stashed/catalog/commit/ccae76e) Update repository config (#42) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.11.3](https://github.com/stashed/cli/releases/tag/v0.11.3) + +- [1b821c8](https://github.com/stashed/cli/commit/1b821c8) Prepare for release v0.11.3 (#66) +- [2aa47f7](https://github.com/stashed/cli/commit/2aa47f7) Update Kubernetes v1.18.9 dependencies (#65) +- [82b3843](https://github.com/stashed/cli/commit/82b3843) Update Kubernetes v1.18.9 dependencies (#64) +- [51bd7b7](https://github.com/stashed/cli/commit/51bd7b7) Update Kubernetes v1.18.9 dependencies (#63) +- [fc82c5d](https://github.com/stashed/cli/commit/fc82c5d) Don't update krew manifest for pre-releases +- [673758d](https://github.com/stashed/cli/commit/673758d) Change plugin name to stash from kubectl-stash +- [119fefc](https://github.com/stashed/cli/commit/119fefc) Fix krew plugin.yaml +- [5467516](https://github.com/stashed/cli/commit/5467516) Fix plugin name +- [d3c25e5](https://github.com/stashed/cli/commit/d3c25e5) Publish krew manifest via CI (#62) +- [c4552d9](https://github.com/stashed/cli/commit/c4552d9) Publish to krew index (#61) +- [c1389c4](https://github.com/stashed/cli/commit/c1389c4) Update Kubernetes v1.18.9 dependencies (#60) +- [e902dfc](https://github.com/stashed/cli/commit/e902dfc) Add completion command (#59) +- [0037eb7](https://github.com/stashed/cli/commit/0037eb7) Update Kubernetes v1.18.9 dependencies (#58) +- [f94e368](https://github.com/stashed/cli/commit/f94e368) Update Kubernetes v1.18.9 dependencies (#57) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v3](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v3) + +- [85da764](https://github.com/stashed/elasticsearch/commit/85da764) Prepare for release 5.6.4-v3 (#381) +- [8033c85](https://github.com/stashed/elasticsearch/commit/8033c85) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#372) (#373) +- [5033b27](https://github.com/stashed/elasticsearch/commit/5033b27) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#363) (#364) +- [1cf0819](https://github.com/stashed/elasticsearch/commit/1cf0819) [cherry-pick] Use restic 0.10.0 (#336) (#355) +- [9011d54](https://github.com/stashed/elasticsearch/commit/9011d54) [cherry-pick] Update repository config (#346) (#347) +- [9ef801a](https://github.com/stashed/elasticsearch/commit/9ef801a) [cherry-pick] Update repository config (#337) (#338) +- [8e65c75](https://github.com/stashed/elasticsearch/commit/8e65c75) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#327) (#328) +- [0ba0f67](https://github.com/stashed/elasticsearch/commit/0ba0f67) [cherry-pick] Publish docker images to ghcr.io (#318) (#319) +- [ebd8b01](https://github.com/stashed/elasticsearch/commit/ebd8b01) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#309) (#310) +- [a3ea8c5](https://github.com/stashed/elasticsearch/commit/a3ea8c5) [cherry-pick] Update repository config (#300) (#301) +- [ba742d4](https://github.com/stashed/elasticsearch/commit/ba742d4) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#291) (#292) +- [85d6a43](https://github.com/stashed/elasticsearch/commit/85d6a43) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#282) (#283) +- [16a665b](https://github.com/stashed/elasticsearch/commit/16a665b) [cherry-pick] Update repository config (#273) (#274) +- [63cd812](https://github.com/stashed/elasticsearch/commit/63cd812) [cherry-pick] Update repository config (#264) (#265) + + +### [6.2.4-v3](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v3) + +- [25d0528](https://github.com/stashed/elasticsearch/commit/25d0528) Prepare for release 6.2.4-v3 (#382) +- [d81f012](https://github.com/stashed/elasticsearch/commit/d81f012) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#372) (#374) +- [109eb77](https://github.com/stashed/elasticsearch/commit/109eb77) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#363) (#365) +- [05ba1a8](https://github.com/stashed/elasticsearch/commit/05ba1a8) [cherry-pick] Use restic 0.10.0 (#336) (#356) +- [827473f](https://github.com/stashed/elasticsearch/commit/827473f) [cherry-pick] Update repository config (#346) (#348) +- [6f0cde4](https://github.com/stashed/elasticsearch/commit/6f0cde4) [cherry-pick] Update repository config (#337) (#339) +- [4793f49](https://github.com/stashed/elasticsearch/commit/4793f49) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#327) (#329) +- [dd6b467](https://github.com/stashed/elasticsearch/commit/dd6b467) [cherry-pick] Publish docker images to ghcr.io (#318) (#320) +- [21be63d](https://github.com/stashed/elasticsearch/commit/21be63d) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#309) (#311) +- [71db88d](https://github.com/stashed/elasticsearch/commit/71db88d) [cherry-pick] Update repository config (#300) (#302) +- [270ffce](https://github.com/stashed/elasticsearch/commit/270ffce) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#291) (#293) +- [3242dd7](https://github.com/stashed/elasticsearch/commit/3242dd7) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#282) (#284) +- [1c629ba](https://github.com/stashed/elasticsearch/commit/1c629ba) [cherry-pick] Update repository config (#273) (#275) +- [cea5a3d](https://github.com/stashed/elasticsearch/commit/cea5a3d) [cherry-pick] Update repository config (#264) (#266) + + +### [6.3.0-v3](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v3) + +- [e811b13](https://github.com/stashed/elasticsearch/commit/e811b13) Prepare for release 6.3.0-v3 (#383) +- [05dfd0c](https://github.com/stashed/elasticsearch/commit/05dfd0c) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#372) (#375) +- [4926a53](https://github.com/stashed/elasticsearch/commit/4926a53) Update Kubernetes v1.18.9 dependencies (#363) (#366) +- [567890b](https://github.com/stashed/elasticsearch/commit/567890b) [cherry-pick] Use restic 0.10.0 (#336) (#357) +- [759d6f1](https://github.com/stashed/elasticsearch/commit/759d6f1) [cherry-pick] Update repository config (#346) (#349) +- [7585820](https://github.com/stashed/elasticsearch/commit/7585820) [cherry-pick] Update repository config (#337) (#340) +- [aa7664a](https://github.com/stashed/elasticsearch/commit/aa7664a) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#327) (#330) +- [f076e39](https://github.com/stashed/elasticsearch/commit/f076e39) [cherry-pick] Publish docker images to ghcr.io (#318) (#321) +- [40bbf42](https://github.com/stashed/elasticsearch/commit/40bbf42) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#309) (#312) +- [73e96e2](https://github.com/stashed/elasticsearch/commit/73e96e2) [cherry-pick] Update repository config (#300) (#303) +- [9026cba](https://github.com/stashed/elasticsearch/commit/9026cba) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#291) (#294) +- [10a886d](https://github.com/stashed/elasticsearch/commit/10a886d) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#282) (#285) +- [c15b3f4](https://github.com/stashed/elasticsearch/commit/c15b3f4) [cherry-pick] Update repository config (#273) (#276) +- [3ddc2ed](https://github.com/stashed/elasticsearch/commit/3ddc2ed) [cherry-pick] Update repository config (#264) (#267) + + +### [6.4.0-v3](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v3) + +- [4ae7651](https://github.com/stashed/elasticsearch/commit/4ae7651) Prepare for release 6.4.0-v3 (#384) +- [ceb1e31](https://github.com/stashed/elasticsearch/commit/ceb1e31) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#372) (#376) +- [fd798f7](https://github.com/stashed/elasticsearch/commit/fd798f7) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#363) (#367) +- [5f53d79](https://github.com/stashed/elasticsearch/commit/5f53d79) [cherry-pick] Use restic 0.10.0 (#336) (#358) +- [06e35d1](https://github.com/stashed/elasticsearch/commit/06e35d1) [cherry-pick] Update repository config (#346) (#350) +- [1867c78](https://github.com/stashed/elasticsearch/commit/1867c78) [cherry-pick] Update repository config (#337) (#341) +- [5e24b84](https://github.com/stashed/elasticsearch/commit/5e24b84) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#327) (#331) +- [4db1d24](https://github.com/stashed/elasticsearch/commit/4db1d24) [cherry-pick] Publish docker images to ghcr.io (#318) (#322) +- [6e0b947](https://github.com/stashed/elasticsearch/commit/6e0b947) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#309) (#313) +- [93daeb7](https://github.com/stashed/elasticsearch/commit/93daeb7) [cherry-pick] Update repository config (#300) (#304) +- [6e5ab75](https://github.com/stashed/elasticsearch/commit/6e5ab75) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#291) (#295) +- [606f4b1](https://github.com/stashed/elasticsearch/commit/606f4b1) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#282) (#286) +- [acee769](https://github.com/stashed/elasticsearch/commit/acee769) [cherry-pick] Update repository config (#273) (#277) +- [637761f](https://github.com/stashed/elasticsearch/commit/637761f) [cherry-pick] Update repository config (#264) (#268) + + +### [6.5.3-v3](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v3) + +- [2cb12c4](https://github.com/stashed/elasticsearch/commit/2cb12c4) Prepare for release 6.5.3-v3 (#385) +- [b32658b](https://github.com/stashed/elasticsearch/commit/b32658b) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#372) (#377) +- [bd148dc](https://github.com/stashed/elasticsearch/commit/bd148dc) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#363) (#368) +- [4377647](https://github.com/stashed/elasticsearch/commit/4377647) [cherry-pick] Use restic 0.10.0 (#336) (#359) +- [3d78224](https://github.com/stashed/elasticsearch/commit/3d78224) [cherry-pick] Update repository config (#346) (#351) +- [4722acb](https://github.com/stashed/elasticsearch/commit/4722acb) [cherry-pick] Update repository config (#337) (#342) +- [f8a4dec](https://github.com/stashed/elasticsearch/commit/f8a4dec) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#327) (#332) +- [b5d9a78](https://github.com/stashed/elasticsearch/commit/b5d9a78) [cherry-pick] Publish docker images to ghcr.io (#318) (#323) +- [b5e6e6b](https://github.com/stashed/elasticsearch/commit/b5e6e6b) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#309) (#314) +- [a8cb4a7](https://github.com/stashed/elasticsearch/commit/a8cb4a7) [cherry-pick] Update repository config (#300) (#305) +- [2d2506e](https://github.com/stashed/elasticsearch/commit/2d2506e) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#291) (#296) +- [6516f35](https://github.com/stashed/elasticsearch/commit/6516f35) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#282) (#287) +- [e20572d](https://github.com/stashed/elasticsearch/commit/e20572d) [cherry-pick] Update repository config (#273) (#278) +- [19ad8d4](https://github.com/stashed/elasticsearch/commit/19ad8d4) [cherry-pick] Update repository config (#264) (#269) + + +### [6.8.0-v3](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v3) + +- [121adfc](https://github.com/stashed/elasticsearch/commit/121adfc) Prepare for release 6.8.0-v3 (#386) +- [ac6b38c](https://github.com/stashed/elasticsearch/commit/ac6b38c) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#372) (#378) +- [e862e81](https://github.com/stashed/elasticsearch/commit/e862e81) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#363) (#369) +- [6a6168a](https://github.com/stashed/elasticsearch/commit/6a6168a) [cherry-pick] Use restic 0.10.0 (#336) (#360) +- [25dc520](https://github.com/stashed/elasticsearch/commit/25dc520) [cherry-pick] Update repository config (#346) (#352) +- [df21854](https://github.com/stashed/elasticsearch/commit/df21854) [cherry-pick] Update repository config (#337) (#343) +- [2245053](https://github.com/stashed/elasticsearch/commit/2245053) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#327) (#333) +- [0edc5c0](https://github.com/stashed/elasticsearch/commit/0edc5c0) [cherry-pick] Publish docker images to ghcr.io (#318) (#324) +- [e79e6e2](https://github.com/stashed/elasticsearch/commit/e79e6e2) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#309) (#315) +- [0d09a3f](https://github.com/stashed/elasticsearch/commit/0d09a3f) [cherry-pick] Update repository config (#300) (#306) +- [e1610ff](https://github.com/stashed/elasticsearch/commit/e1610ff) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#291) (#297) +- [6df475d](https://github.com/stashed/elasticsearch/commit/6df475d) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#282) (#288) +- [ac5361a](https://github.com/stashed/elasticsearch/commit/ac5361a) [cherry-pick] Update repository config (#273) (#279) +- [ef7e1a4](https://github.com/stashed/elasticsearch/commit/ef7e1a4) [cherry-pick] Update repository config (#264) (#270) + + +### [7.2.0-v3](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v3) + +- [827b433](https://github.com/stashed/elasticsearch/commit/827b433) Prepare for release 7.2.0-v3 (#387) +- [e9af2ff](https://github.com/stashed/elasticsearch/commit/e9af2ff) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#372) (#379) +- [32e7298](https://github.com/stashed/elasticsearch/commit/32e7298) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#363) (#370) +- [ac680c9](https://github.com/stashed/elasticsearch/commit/ac680c9) [cherry-pick] Use restic 0.10.0 (#336) (#361) +- [1f7630e](https://github.com/stashed/elasticsearch/commit/1f7630e) [cherry-pick] Update repository config (#346) (#353) +- [882b6a3](https://github.com/stashed/elasticsearch/commit/882b6a3) [cherry-pick] Update repository config (#337) (#344) +- [cc0183f](https://github.com/stashed/elasticsearch/commit/cc0183f) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#327) (#334) +- [d91b62c](https://github.com/stashed/elasticsearch/commit/d91b62c) [cherry-pick] Publish docker images to ghcr.io (#318) (#325) +- [147f502](https://github.com/stashed/elasticsearch/commit/147f502) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#309) (#316) +- [a69fe96](https://github.com/stashed/elasticsearch/commit/a69fe96) [cherry-pick] Update repository config (#300) (#307) +- [5071afd](https://github.com/stashed/elasticsearch/commit/5071afd) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#291) (#298) +- [d22dbda](https://github.com/stashed/elasticsearch/commit/d22dbda) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#282) (#289) +- [16d53cc](https://github.com/stashed/elasticsearch/commit/16d53cc) [cherry-pick] Update repository config (#273) (#280) +- [49b59ff](https://github.com/stashed/elasticsearch/commit/49b59ff) [cherry-pick] Update repository config (#264) (#271) + + +### [7.3.2-v3](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v3) + +- [6186f5a](https://github.com/stashed/elasticsearch/commit/6186f5a) Prepare for release 7.3.2-v3 (#388) +- [f77d957](https://github.com/stashed/elasticsearch/commit/f77d957) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#372) (#380) +- [8be3043](https://github.com/stashed/elasticsearch/commit/8be3043) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#363) (#371) +- [b5a442b](https://github.com/stashed/elasticsearch/commit/b5a442b) [cherry-pick] Use restic 0.10.0 (#336) (#362) +- [06b10eb](https://github.com/stashed/elasticsearch/commit/06b10eb) [cherry-pick] Update repository config (#346) (#354) +- [583623a](https://github.com/stashed/elasticsearch/commit/583623a) [cherry-pick] Update repository config (#337) (#345) +- [ba82277](https://github.com/stashed/elasticsearch/commit/ba82277) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#327) (#335) +- [b74b188](https://github.com/stashed/elasticsearch/commit/b74b188) [cherry-pick] Publish docker images to ghcr.io (#318) (#326) +- [6005177](https://github.com/stashed/elasticsearch/commit/6005177) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#309) (#317) +- [fae3083](https://github.com/stashed/elasticsearch/commit/fae3083) [cherry-pick] Update repository config (#300) (#308) +- [9f418d2](https://github.com/stashed/elasticsearch/commit/9f418d2) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#291) (#299) +- [c14c36d](https://github.com/stashed/elasticsearch/commit/c14c36d) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#282) (#290) +- [f088a35](https://github.com/stashed/elasticsearch/commit/f088a35) [cherry-pick] Update repository config (#273) (#281) +- [f12f5b6](https://github.com/stashed/elasticsearch/commit/f12f5b6) [cherry-pick] Update repository config (#264) (#272) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v0.11.3](https://github.com/stashed/installer/releases/tag/v0.11.3) + +- [5bc51f3](https://github.com/stashed/installer/commit/5bc51f3) Prepare for release v0.11.3 (#116) +- [c22bc9a](https://github.com/stashed/installer/commit/c22bc9a) Create ServiceMonitor in the same namespace as the operator (#115) +- [003bc08](https://github.com/stashed/installer/commit/003bc08) Update Kubernetes v1.18.9 dependencies (#114) +- [33956a8](https://github.com/stashed/installer/commit/33956a8) Update repository config (#113) +- [501c63e](https://github.com/stashed/installer/commit/501c63e) Update Kubernetes v1.18.9 dependencies (#112) +- [ee560a1](https://github.com/stashed/installer/commit/ee560a1) Update repository config (#111) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v3](https://github.com/stashed/mongodb/releases/tag/3.4.17-v3) + +- [bfdd9972](https://github.com/stashed/mongodb/commit/bfdd9972) Prepare for release 3.4.17-v3 (#495) +- [bda45485](https://github.com/stashed/mongodb/commit/bda45485) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#483) (#484) +- [cb43638f](https://github.com/stashed/mongodb/commit/cb43638f) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#471) (#472) +- [c3adc69f](https://github.com/stashed/mongodb/commit/c3adc69f) [cherry-pick] Use restic 0.10.0 (#435) (#460) +- [d768e676](https://github.com/stashed/mongodb/commit/d768e676) [cherry-pick] Update repository config (#448) (#449) +- [9453ae69](https://github.com/stashed/mongodb/commit/9453ae69) [cherry-pick] Update repository config (#436) (#437) +- [ed7222d7](https://github.com/stashed/mongodb/commit/ed7222d7) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#423) (#424) +- [cf6ffd6e](https://github.com/stashed/mongodb/commit/cf6ffd6e) [cherry-pick] Publish docker images to ghcr.io (#411) (#412) +- [8e996ed8](https://github.com/stashed/mongodb/commit/8e996ed8) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#399) (#400) +- [0d9a59d8](https://github.com/stashed/mongodb/commit/0d9a59d8) [cherry-pick] Update repository config (#387) (#388) +- [277a9390](https://github.com/stashed/mongodb/commit/277a9390) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#375) (#376) +- [f06e0951](https://github.com/stashed/mongodb/commit/f06e0951) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#363) (#364) +- [b00216d6](https://github.com/stashed/mongodb/commit/b00216d6) [cherry-pick] Update repository config (#351) (#352) +- [ab7f8f0c](https://github.com/stashed/mongodb/commit/ab7f8f0c) [cherry-pick] Update repository config (#339) (#340) + + +### [3.4.22-v3](https://github.com/stashed/mongodb/releases/tag/3.4.22-v3) + +- [9255e7b5](https://github.com/stashed/mongodb/commit/9255e7b5) Prepare for release 3.4.22-v3 (#496) +- [89c73b0b](https://github.com/stashed/mongodb/commit/89c73b0b) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#483) (#485) +- [ee9a261e](https://github.com/stashed/mongodb/commit/ee9a261e) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#471) (#473) +- [6117deca](https://github.com/stashed/mongodb/commit/6117deca) [cherry-pick] Use restic 0.10.0 (#435) (#461) +- [bee02903](https://github.com/stashed/mongodb/commit/bee02903) [cherry-pick] Update repository config (#448) (#450) +- [c7711aec](https://github.com/stashed/mongodb/commit/c7711aec) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#423) (#425) +- [f7a2a2cb](https://github.com/stashed/mongodb/commit/f7a2a2cb) [cherry-pick] Update repository config (#436) (#438) +- [d4e1aef8](https://github.com/stashed/mongodb/commit/d4e1aef8) [cherry-pick] Publish docker images to ghcr.io (#411) (#413) +- [2aceb1cb](https://github.com/stashed/mongodb/commit/2aceb1cb) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#399) (#401) +- [3b5521bd](https://github.com/stashed/mongodb/commit/3b5521bd) [cherry-pick] Update repository config (#387) (#389) +- [29da42f2](https://github.com/stashed/mongodb/commit/29da42f2) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#375) (#377) +- [739876b8](https://github.com/stashed/mongodb/commit/739876b8) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#363) (#365) +- [e7ee7aca](https://github.com/stashed/mongodb/commit/e7ee7aca) [cherry-pick] Update repository config (#351) (#353) +- [2c4f42bd](https://github.com/stashed/mongodb/commit/2c4f42bd) [cherry-pick] Update repository config (#339) (#341) + + +### [3.6.8-v3](https://github.com/stashed/mongodb/releases/tag/3.6.8-v3) + +- [92d7be92](https://github.com/stashed/mongodb/commit/92d7be92) Prepare for release 3.6.8-v3 (#498) +- [51f20d93](https://github.com/stashed/mongodb/commit/51f20d93) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#483) (#487) +- [06a92af9](https://github.com/stashed/mongodb/commit/06a92af9) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#471) (#475) +- [dbabdcdd](https://github.com/stashed/mongodb/commit/dbabdcdd) [cherry-pick] Use restic 0.10.0 (#435) (#463) +- [4cd8e248](https://github.com/stashed/mongodb/commit/4cd8e248) [cherry-pick] Update repository config (#448) (#452) +- [e59cad4a](https://github.com/stashed/mongodb/commit/e59cad4a) [cherry-pick] Update repository config (#436) (#440) +- [e793b48d](https://github.com/stashed/mongodb/commit/e793b48d) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#423) (#427) +- [726f238c](https://github.com/stashed/mongodb/commit/726f238c) [cherry-pick] Publish docker images to ghcr.io (#411) (#415) +- [15a96fd5](https://github.com/stashed/mongodb/commit/15a96fd5) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#399) (#403) +- [742141e4](https://github.com/stashed/mongodb/commit/742141e4) [cherry-pick] Update repository config (#387) (#391) +- [dc32bd9f](https://github.com/stashed/mongodb/commit/dc32bd9f) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#375) (#379) +- [d419ad0f](https://github.com/stashed/mongodb/commit/d419ad0f) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#363) (#367) +- [0293db64](https://github.com/stashed/mongodb/commit/0293db64) [cherry-pick] Update repository config (#351) (#355) +- [9bb9955a](https://github.com/stashed/mongodb/commit/9bb9955a) [cherry-pick] Update repository config (#339) (#343) + + +### [3.6.13-v3](https://github.com/stashed/mongodb/releases/tag/3.6.13-v3) + +- [68276550](https://github.com/stashed/mongodb/commit/68276550) Prepare for release 3.6.13-v3 (#497) +- [f336cc12](https://github.com/stashed/mongodb/commit/f336cc12) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#483) (#486) +- [21c24e47](https://github.com/stashed/mongodb/commit/21c24e47) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#471) (#474) +- [e7b8dfa3](https://github.com/stashed/mongodb/commit/e7b8dfa3) [cherry-pick] Use restic 0.10.0 (#435) (#462) +- [98f15137](https://github.com/stashed/mongodb/commit/98f15137) [cherry-pick] Update repository config (#448) (#451) +- [e2a1df01](https://github.com/stashed/mongodb/commit/e2a1df01) [cherry-pick] Update repository config (#436) (#439) +- [6107c923](https://github.com/stashed/mongodb/commit/6107c923) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#423) (#426) +- [02466320](https://github.com/stashed/mongodb/commit/02466320) [cherry-pick] Publish docker images to ghcr.io (#411) (#414) +- [6f243714](https://github.com/stashed/mongodb/commit/6f243714) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#399) (#402) +- [da2c0f8a](https://github.com/stashed/mongodb/commit/da2c0f8a) [cherry-pick] Update repository config (#387) (#390) +- [914652f8](https://github.com/stashed/mongodb/commit/914652f8) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#375) (#378) +- [d28b54dc](https://github.com/stashed/mongodb/commit/d28b54dc) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#363) (#366) +- [21f8b4e4](https://github.com/stashed/mongodb/commit/21f8b4e4) [cherry-pick] Update repository config (#351) (#354) +- [c3d7cc46](https://github.com/stashed/mongodb/commit/c3d7cc46) [cherry-pick] Update repository config (#339) (#342) + + +### [4.0.3-v3](https://github.com/stashed/mongodb/releases/tag/4.0.3-v3) + +- [37ee960a](https://github.com/stashed/mongodb/commit/37ee960a) Prepare for release 4.0.3-v3 (#500) +- [dad34b57](https://github.com/stashed/mongodb/commit/dad34b57) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#483) (#489) +- [65073380](https://github.com/stashed/mongodb/commit/65073380) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#471) (#477) +- [9a3020cd](https://github.com/stashed/mongodb/commit/9a3020cd) [cherry-pick] Use restic 0.10.0 (#435) (#465) +- [00c89fbe](https://github.com/stashed/mongodb/commit/00c89fbe) [cherry-pick] Update repository config (#448) (#454) +- [f49d19fb](https://github.com/stashed/mongodb/commit/f49d19fb) [cherry-pick] Update repository config (#436) (#442) +- [0b0da5eb](https://github.com/stashed/mongodb/commit/0b0da5eb) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#423) (#429) +- [ea1769a1](https://github.com/stashed/mongodb/commit/ea1769a1) [cherry-pick] Publish docker images to ghcr.io (#411) (#417) +- [65c185b6](https://github.com/stashed/mongodb/commit/65c185b6) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#399) (#405) +- [091ff716](https://github.com/stashed/mongodb/commit/091ff716) [cherry-pick] Update repository config (#387) (#393) +- [d9c42eba](https://github.com/stashed/mongodb/commit/d9c42eba) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#375) (#381) +- [0940ece2](https://github.com/stashed/mongodb/commit/0940ece2) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#363) (#369) +- [b64ee104](https://github.com/stashed/mongodb/commit/b64ee104) [cherry-pick] Update repository config (#351) (#357) +- [db6b3d2b](https://github.com/stashed/mongodb/commit/db6b3d2b) [cherry-pick] Update repository config (#339) (#345) + + +### [4.0.5-v3](https://github.com/stashed/mongodb/releases/tag/4.0.5-v3) + +- [90d2a873](https://github.com/stashed/mongodb/commit/90d2a873) Prepare for release 4.0.5-v3 (#501) +- [88752110](https://github.com/stashed/mongodb/commit/88752110) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#483) (#490) +- [79b382fb](https://github.com/stashed/mongodb/commit/79b382fb) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#471) (#478) +- [337faf82](https://github.com/stashed/mongodb/commit/337faf82) [cherry-pick] Use restic 0.10.0 (#435) (#466) +- [6d9af4e6](https://github.com/stashed/mongodb/commit/6d9af4e6) [cherry-pick] Update repository config (#448) (#455) +- [74efde48](https://github.com/stashed/mongodb/commit/74efde48) [cherry-pick] Update repository config (#436) (#443) +- [c97e5478](https://github.com/stashed/mongodb/commit/c97e5478) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#423) (#430) +- [beeb45d5](https://github.com/stashed/mongodb/commit/beeb45d5) [cherry-pick] Publish docker images to ghcr.io (#411) (#418) +- [da3d70b2](https://github.com/stashed/mongodb/commit/da3d70b2) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#399) (#406) +- [d410f276](https://github.com/stashed/mongodb/commit/d410f276) [cherry-pick] Update repository config (#387) (#394) +- [35f0003b](https://github.com/stashed/mongodb/commit/35f0003b) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#375) (#382) +- [2acd384e](https://github.com/stashed/mongodb/commit/2acd384e) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#363) (#370) +- [aeec3423](https://github.com/stashed/mongodb/commit/aeec3423) [cherry-pick] Update repository config (#351) (#358) +- [825f4c0e](https://github.com/stashed/mongodb/commit/825f4c0e) [cherry-pick] Update repository config (#339) (#346) + + +### [4.0.11-v3](https://github.com/stashed/mongodb/releases/tag/4.0.11-v3) + +- [54a9e1ce](https://github.com/stashed/mongodb/commit/54a9e1ce) Prepare for release 4.0.11-v3 (#499) +- [bfee3d7f](https://github.com/stashed/mongodb/commit/bfee3d7f) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#483) (#488) +- [72e304a2](https://github.com/stashed/mongodb/commit/72e304a2) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#471) (#476) +- [bd3b7d54](https://github.com/stashed/mongodb/commit/bd3b7d54) [cherry-pick] Use restic 0.10.0 (#435) (#464) +- [958a2347](https://github.com/stashed/mongodb/commit/958a2347) [cherry-pick] Update repository config (#448) (#453) +- [7d7a9059](https://github.com/stashed/mongodb/commit/7d7a9059) [cherry-pick] Update repository config (#436) (#441) +- [a175a0c3](https://github.com/stashed/mongodb/commit/a175a0c3) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#423) (#428) +- [0c2f9839](https://github.com/stashed/mongodb/commit/0c2f9839) [cherry-pick] Publish docker images to ghcr.io (#411) (#416) +- [4bb8bc3c](https://github.com/stashed/mongodb/commit/4bb8bc3c) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#399) (#404) +- [7ec86ea4](https://github.com/stashed/mongodb/commit/7ec86ea4) [cherry-pick] Update repository config (#387) (#392) +- [f53bcb00](https://github.com/stashed/mongodb/commit/f53bcb00) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#375) (#380) +- [4329109b](https://github.com/stashed/mongodb/commit/4329109b) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#363) (#368) +- [c70b759e](https://github.com/stashed/mongodb/commit/c70b759e) [cherry-pick] Update repository config (#351) (#356) +- [903ddcc7](https://github.com/stashed/mongodb/commit/903ddcc7) [cherry-pick] Update repository config (#339) (#344) + + +### [4.1.4-v3](https://github.com/stashed/mongodb/releases/tag/4.1.4-v3) + +- [f613ba52](https://github.com/stashed/mongodb/commit/f613ba52) Prepare for release 4.1.4-v3 (#503) +- [f6ebfa88](https://github.com/stashed/mongodb/commit/f6ebfa88) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#483) (#492) +- [10d6f4db](https://github.com/stashed/mongodb/commit/10d6f4db) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#471) (#480) +- [4f317902](https://github.com/stashed/mongodb/commit/4f317902) [cherry-pick] Use restic 0.10.0 (#435) (#468) +- [700b1a17](https://github.com/stashed/mongodb/commit/700b1a17) [cherry-pick] Update repository config (#448) (#457) +- [99681cd5](https://github.com/stashed/mongodb/commit/99681cd5) [cherry-pick] Update repository config (#436) (#445) +- [5b571e5d](https://github.com/stashed/mongodb/commit/5b571e5d) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#423) (#432) +- [056f45d2](https://github.com/stashed/mongodb/commit/056f45d2) [cherry-pick] Publish docker images to ghcr.io (#411) (#420) +- [6a983254](https://github.com/stashed/mongodb/commit/6a983254) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#399) (#408) +- [0dbf712c](https://github.com/stashed/mongodb/commit/0dbf712c) [cherry-pick] Update repository config (#387) (#396) +- [8adbb6fe](https://github.com/stashed/mongodb/commit/8adbb6fe) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#375) (#384) +- [0d7db778](https://github.com/stashed/mongodb/commit/0d7db778) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#363) (#372) +- [e0da102b](https://github.com/stashed/mongodb/commit/e0da102b) [cherry-pick] Update repository config (#351) (#360) +- [37a2bbc2](https://github.com/stashed/mongodb/commit/37a2bbc2) [cherry-pick] Update repository config (#339) (#348) + + +### [4.1.7-v3](https://github.com/stashed/mongodb/releases/tag/4.1.7-v3) + +- [5dc82c7f](https://github.com/stashed/mongodb/commit/5dc82c7f) Prepare for release 4.1.7-v3 (#504) +- [e2263058](https://github.com/stashed/mongodb/commit/e2263058) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#483) (#493) +- [5620f9d1](https://github.com/stashed/mongodb/commit/5620f9d1) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#471) (#481) +- [5d00564b](https://github.com/stashed/mongodb/commit/5d00564b) [cherry-pick] Use restic 0.10.0 (#435) (#469) +- [7765d8ad](https://github.com/stashed/mongodb/commit/7765d8ad) [cherry-pick] Update repository config (#448) (#458) +- [07b43086](https://github.com/stashed/mongodb/commit/07b43086) [cherry-pick] Update repository config (#436) (#446) +- [18e0c740](https://github.com/stashed/mongodb/commit/18e0c740) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#423) (#433) +- [ec344370](https://github.com/stashed/mongodb/commit/ec344370) [cherry-pick] Publish docker images to ghcr.io (#411) (#421) +- [a5080eee](https://github.com/stashed/mongodb/commit/a5080eee) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#399) (#409) +- [ffc08e7d](https://github.com/stashed/mongodb/commit/ffc08e7d) [cherry-pick] Update repository config (#387) (#397) +- [05e7d62d](https://github.com/stashed/mongodb/commit/05e7d62d) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#375) (#385) +- [17c7be7f](https://github.com/stashed/mongodb/commit/17c7be7f) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#363) (#373) +- [1f3a9e97](https://github.com/stashed/mongodb/commit/1f3a9e97) [cherry-pick] Update repository config (#351) (#361) +- [c1606922](https://github.com/stashed/mongodb/commit/c1606922) [cherry-pick] Update repository config (#339) (#349) + + +### [4.1.13-v3](https://github.com/stashed/mongodb/releases/tag/4.1.13-v3) + +- [0894946b](https://github.com/stashed/mongodb/commit/0894946b) Prepare for release 4.1.13-v3 (#502) +- [c314b3ff](https://github.com/stashed/mongodb/commit/c314b3ff) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#483) (#491) +- [63228a0e](https://github.com/stashed/mongodb/commit/63228a0e) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#471) (#479) +- [69573d31](https://github.com/stashed/mongodb/commit/69573d31) [cherry-pick] Use restic 0.10.0 (#435) (#467) +- [d4a1fa82](https://github.com/stashed/mongodb/commit/d4a1fa82) [cherry-pick] Update repository config (#448) (#456) +- [af592612](https://github.com/stashed/mongodb/commit/af592612) [cherry-pick] Update repository config (#436) (#444) +- [4ab1a722](https://github.com/stashed/mongodb/commit/4ab1a722) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#423) (#431) +- [0c9f73d1](https://github.com/stashed/mongodb/commit/0c9f73d1) [cherry-pick] Publish docker images to ghcr.io (#411) (#419) +- [4b27ac15](https://github.com/stashed/mongodb/commit/4b27ac15) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#399) (#407) +- [029af23f](https://github.com/stashed/mongodb/commit/029af23f) [cherry-pick] Update repository config (#387) (#395) +- [f177f223](https://github.com/stashed/mongodb/commit/f177f223) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#375) (#383) +- [5158cad9](https://github.com/stashed/mongodb/commit/5158cad9) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#363) (#371) +- [3b549e4d](https://github.com/stashed/mongodb/commit/3b549e4d) [cherry-pick] Update repository config (#351) (#359) +- [d4c9d08b](https://github.com/stashed/mongodb/commit/d4c9d08b) [cherry-pick] Update repository config (#339) (#347) + + +### [4.2.3-v3](https://github.com/stashed/mongodb/releases/tag/4.2.3-v3) + +- [7d17e60d](https://github.com/stashed/mongodb/commit/7d17e60d) Prepare for release 4.2.3-v3 (#505) +- [2447962e](https://github.com/stashed/mongodb/commit/2447962e) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#483) (#494) +- [096c0d3c](https://github.com/stashed/mongodb/commit/096c0d3c) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#471) (#482) +- [0e167aa8](https://github.com/stashed/mongodb/commit/0e167aa8) [cherry-pick] Use restic 0.10.0 (#435) (#470) +- [7e234b8f](https://github.com/stashed/mongodb/commit/7e234b8f) [cherry-pick] Update repository config (#448) (#459) +- [e9be7ed0](https://github.com/stashed/mongodb/commit/e9be7ed0) [cherry-pick] Update repository config (#436) (#447) +- [84a983b8](https://github.com/stashed/mongodb/commit/84a983b8) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#423) (#434) +- [31f3c2ca](https://github.com/stashed/mongodb/commit/31f3c2ca) [cherry-pick] Publish docker images to ghcr.io (#411) (#422) +- [ffb3f579](https://github.com/stashed/mongodb/commit/ffb3f579) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#399) (#410) +- [018f5609](https://github.com/stashed/mongodb/commit/018f5609) [cherry-pick] Update repository config (#387) (#398) +- [2b32ca70](https://github.com/stashed/mongodb/commit/2b32ca70) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#375) (#386) +- [f4a3ffd1](https://github.com/stashed/mongodb/commit/f4a3ffd1) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#363) (#374) +- [5bf63e9e](https://github.com/stashed/mongodb/commit/5bf63e9e) [cherry-pick] Update repository config (#351) (#362) +- [04de4a95](https://github.com/stashed/mongodb/commit/04de4a95) [cherry-pick] Update repository config (#339) (#350) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v3](https://github.com/stashed/mysql/releases/tag/5.7.25-v3) + +- [8fffb58](https://github.com/stashed/mysql/commit/8fffb58) Prepare for release 5.7.25-v3 (#183) +- [0e93a3e](https://github.com/stashed/mysql/commit/0e93a3e) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#179) (#180) +- [01e10af](https://github.com/stashed/mysql/commit/01e10af) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#175) (#176) +- [f781cd8](https://github.com/stashed/mysql/commit/f781cd8) [cherry-pick] Use restic 0.10.0 (#163) (#172) +- [0a0711d](https://github.com/stashed/mysql/commit/0a0711d) [cherry-pick] Update repository config (#168) (#169) +- [97afbc9](https://github.com/stashed/mysql/commit/97afbc9) [cherry-pick] Update repository config (#164) (#165) +- [dc985b5](https://github.com/stashed/mysql/commit/dc985b5) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#159) (#160) +- [d1cddb5](https://github.com/stashed/mysql/commit/d1cddb5) [cherry-pick] Publish docker images to ghcr.io (#155) (#156) +- [ac6abcb](https://github.com/stashed/mysql/commit/ac6abcb) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#151) (#152) +- [303e216](https://github.com/stashed/mysql/commit/303e216) [cherry-pick] Update repository config (#147) (#148) +- [a24b811](https://github.com/stashed/mysql/commit/a24b811) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#143) (#144) +- [3601274](https://github.com/stashed/mysql/commit/3601274) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#139) (#140) +- [f3a52c3](https://github.com/stashed/mysql/commit/f3a52c3) [cherry-pick] Update repository config (#135) (#136) +- [3432c46](https://github.com/stashed/mysql/commit/3432c46) [cherry-pick] Update repository config (#131) (#132) + + +### [8.0.3-v3](https://github.com/stashed/mysql/releases/tag/8.0.3-v3) + +- [07d878c](https://github.com/stashed/mysql/commit/07d878c) Prepare for release 8.0.3-v3 (#185) +- [dfc1eb2](https://github.com/stashed/mysql/commit/dfc1eb2) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#179) (#182) +- [6aa4e78](https://github.com/stashed/mysql/commit/6aa4e78) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#175) (#178) +- [b6c8270](https://github.com/stashed/mysql/commit/b6c8270) [cherry-pick] Use restic 0.10.0 (#163) (#174) +- [02e5cac](https://github.com/stashed/mysql/commit/02e5cac) [cherry-pick] Update repository config (#168) (#171) +- [a31cca9](https://github.com/stashed/mysql/commit/a31cca9) [cherry-pick] Update repository config (#164) (#167) +- [035be38](https://github.com/stashed/mysql/commit/035be38) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#159) (#162) +- [5befb61](https://github.com/stashed/mysql/commit/5befb61) [cherry-pick] Publish docker images to ghcr.io (#155) (#158) +- [faaceb5](https://github.com/stashed/mysql/commit/faaceb5) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#151) (#154) +- [e749438](https://github.com/stashed/mysql/commit/e749438) [cherry-pick] Update repository config (#147) (#150) +- [abaf351](https://github.com/stashed/mysql/commit/abaf351) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#143) (#146) +- [e6e71d1](https://github.com/stashed/mysql/commit/e6e71d1) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#139) (#142) +- [06a5e8c](https://github.com/stashed/mysql/commit/06a5e8c) [cherry-pick] Update repository config (#135) (#138) +- [9764674](https://github.com/stashed/mysql/commit/9764674) [cherry-pick] Update repository config (#131) (#134) + + +### [8.0.14-v3](https://github.com/stashed/mysql/releases/tag/8.0.14-v3) + +- [c6bebde](https://github.com/stashed/mysql/commit/c6bebde) Prepare for release 8.0.14-v3 (#184) +- [5310d2b](https://github.com/stashed/mysql/commit/5310d2b) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#179) (#181) +- [995d648](https://github.com/stashed/mysql/commit/995d648) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#175) (#177) +- [815641c](https://github.com/stashed/mysql/commit/815641c) [cherry-pick] Use restic 0.10.0 (#163) (#173) +- [1935314](https://github.com/stashed/mysql/commit/1935314) [cherry-pick] Update repository config (#168) (#170) +- [9f92086](https://github.com/stashed/mysql/commit/9f92086) [cherry-pick] Update repository config (#164) (#166) +- [1c1676e](https://github.com/stashed/mysql/commit/1c1676e) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#159) (#161) +- [4ea5a3a](https://github.com/stashed/mysql/commit/4ea5a3a) [cherry-pick] Publish docker images to ghcr.io (#155) (#157) +- [75c3e72](https://github.com/stashed/mysql/commit/75c3e72) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#151) (#153) +- [4c59612](https://github.com/stashed/mysql/commit/4c59612) [cherry-pick] Update repository config (#147) (#149) +- [a452552](https://github.com/stashed/mysql/commit/a452552) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#143) (#145) +- [0ec08a0](https://github.com/stashed/mysql/commit/0ec08a0) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#139) (#141) +- [33bb32c](https://github.com/stashed/mysql/commit/33bb32c) [cherry-pick] Update repository config (#135) (#137) +- [406ff18](https://github.com/stashed/mysql/commit/406ff18) [cherry-pick] Update repository config (#131) (#133) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-v3](https://github.com/stashed/percona-xtradb/releases/tag/5.7-v3) + +- [6ec4bc6](https://github.com/stashed/percona-xtradb/commit/6ec4bc6) Prepare for release 5.7-v3 (#95) +- [9220f29](https://github.com/stashed/percona-xtradb/commit/9220f29) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#93) (#94) +- [c4bda0f](https://github.com/stashed/percona-xtradb/commit/c4bda0f) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#91) (#92) +- [1c5d488](https://github.com/stashed/percona-xtradb/commit/1c5d488) [cherry-pick] Use restic 0.10.0 (#85) (#90) +- [90ba980](https://github.com/stashed/percona-xtradb/commit/90ba980) [cherry-pick] Update repository config (#88) (#89) +- [dc078b6](https://github.com/stashed/percona-xtradb/commit/dc078b6) [cherry-pick] Update repository config (#86) (#87) +- [c549a51](https://github.com/stashed/percona-xtradb/commit/c549a51) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#83) (#84) +- [f885a87](https://github.com/stashed/percona-xtradb/commit/f885a87) [cherry-pick] Publish docker images to ghcr.io (#81) (#82) +- [055383c](https://github.com/stashed/percona-xtradb/commit/055383c) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#79) (#80) +- [360e25e](https://github.com/stashed/percona-xtradb/commit/360e25e) [cherry-pick] Update repository config (#77) (#78) +- [7462c45](https://github.com/stashed/percona-xtradb/commit/7462c45) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#75) (#76) +- [3a85cc3](https://github.com/stashed/percona-xtradb/commit/3a85cc3) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#73) (#74) +- [079d748](https://github.com/stashed/percona-xtradb/commit/079d748) [cherry-pick] Update repository config (#71) (#72) +- [7e96bac](https://github.com/stashed/percona-xtradb/commit/7e96bac) [cherry-pick] Update repository config (#69) (#70) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v1](https://github.com/stashed/postgres/releases/tag/9.6.19-v1) + +- [3ecdb2c](https://github.com/stashed/postgres/commit/3ecdb2c) Prepare for release 9.6.19-v1 (#343) +- [0207e35](https://github.com/stashed/postgres/commit/0207e35) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#330) (#339) +- [93a38c4](https://github.com/stashed/postgres/commit/93a38c4) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#320) (#329) +- [983a662](https://github.com/stashed/postgres/commit/983a662) [cherry-pick] Use restic 0.10.0 (#290) (#319) +- [77e72e0](https://github.com/stashed/postgres/commit/77e72e0) [cherry-pick] Update repository config (#301) (#310) +- [52e2c2b](https://github.com/stashed/postgres/commit/52e2c2b) [cherry-pick] Update repository config (#291) (#300) +- [57fb376](https://github.com/stashed/postgres/commit/57fb376) [cherry-pick] Publish docker images to ghcr.io (#280) (#289) +- [edb421c](https://github.com/stashed/postgres/commit/edb421c) [cherry-pick] Use username/password as keys in Postgres secret (#270) (#279) +- [16746e3](https://github.com/stashed/postgres/commit/16746e3) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#260) (#269) +- [2516277](https://github.com/stashed/postgres/commit/2516277) [cherry-pick] Update repository config (#250) (#259) +- [715c9ce](https://github.com/stashed/postgres/commit/715c9ce) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#240) (#249) +- [11c7486](https://github.com/stashed/postgres/commit/11c7486) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#230) (#239) +- [3f6f398](https://github.com/stashed/postgres/commit/3f6f398) [cherry-pick] Update repository config (#220) (#229) +- [8248525](https://github.com/stashed/postgres/commit/8248525) [cherry-pick] Update repository config (#210) (#219) + + +### [10.14.0-v1](https://github.com/stashed/postgres/releases/tag/10.14.0-v1) + +- [bc318b1](https://github.com/stashed/postgres/commit/bc318b1) Prepare for release 10.14.0-v1 (#340) +- [ed3ba4d](https://github.com/stashed/postgres/commit/ed3ba4d) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#330) (#331) +- [475f8df](https://github.com/stashed/postgres/commit/475f8df) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#320) (#321) +- [dc58fd7](https://github.com/stashed/postgres/commit/dc58fd7) [cherry-pick] Use restic 0.10.0 (#290) (#311) +- [e15907e](https://github.com/stashed/postgres/commit/e15907e) [cherry-pick] Update repository config (#301) (#302) +- [6d00f88](https://github.com/stashed/postgres/commit/6d00f88) [cherry-pick] Update repository config (#291) (#292) +- [d1d0d7f](https://github.com/stashed/postgres/commit/d1d0d7f) [cherry-pick] Publish docker images to ghcr.io (#280) (#281) +- [50d9b08](https://github.com/stashed/postgres/commit/50d9b08) [cherry-pick] Use username/password as keys in Postgres secret (#270) (#271) +- [f583dac](https://github.com/stashed/postgres/commit/f583dac) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#260) (#261) +- [e98ef32](https://github.com/stashed/postgres/commit/e98ef32) [cherry-pick] Update repository config (#250) (#251) +- [7fc8ed4](https://github.com/stashed/postgres/commit/7fc8ed4) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#240) (#241) +- [a915d80](https://github.com/stashed/postgres/commit/a915d80) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#230) (#231) +- [e057b5b](https://github.com/stashed/postgres/commit/e057b5b) [cherry-pick] Update repository config (#220) (#221) +- [9c4f01e](https://github.com/stashed/postgres/commit/9c4f01e) [cherry-pick] Update repository config (#210) (#211) + + +### [11.9.0-v1](https://github.com/stashed/postgres/releases/tag/11.9.0-v1) + +- [f6ceacc](https://github.com/stashed/postgres/commit/f6ceacc) Prepare for release 11.9.0-v1 (#341) +- [07763d6](https://github.com/stashed/postgres/commit/07763d6) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#330) (#336) +- [8727e7f](https://github.com/stashed/postgres/commit/8727e7f) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#320) (#326) +- [70ec71b](https://github.com/stashed/postgres/commit/70ec71b) [cherry-pick] Use restic 0.10.0 (#290) (#316) +- [f0353c4](https://github.com/stashed/postgres/commit/f0353c4) [cherry-pick] Update repository config (#301) (#307) +- [ed3a066](https://github.com/stashed/postgres/commit/ed3a066) [cherry-pick] Update repository config (#291) (#297) +- [84d9e99](https://github.com/stashed/postgres/commit/84d9e99) [cherry-pick] Publish docker images to ghcr.io (#280) (#286) +- [8179b10](https://github.com/stashed/postgres/commit/8179b10) [cherry-pick] Use username/password as keys in Postgres secret (#270) (#276) +- [afe907a](https://github.com/stashed/postgres/commit/afe907a) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#260) (#266) +- [e983f84](https://github.com/stashed/postgres/commit/e983f84) [cherry-pick] Update repository config (#250) (#256) +- [8c56fc1](https://github.com/stashed/postgres/commit/8c56fc1) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#240) (#246) +- [af1b43a](https://github.com/stashed/postgres/commit/af1b43a) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#230) (#236) +- [c46c99c](https://github.com/stashed/postgres/commit/c46c99c) [cherry-pick] Update repository config (#220) (#226) +- [d5bfd9a](https://github.com/stashed/postgres/commit/d5bfd9a) [cherry-pick] Update repository config (#210) (#216) + + +### [12.4.0-v1](https://github.com/stashed/postgres/releases/tag/12.4.0-v1) + +- [03355e3](https://github.com/stashed/postgres/commit/03355e3) Prepare for release 12.4.0-v1 (#342) +- [f686d3d](https://github.com/stashed/postgres/commit/f686d3d) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#330) (#337) +- [223e0df](https://github.com/stashed/postgres/commit/223e0df) Update Kubernetes v1.18.9 dependencies (#320) (#327) +- [c429d54](https://github.com/stashed/postgres/commit/c429d54) [cherry-pick] Use restic 0.10.0 (#290) (#317) +- [317e415](https://github.com/stashed/postgres/commit/317e415) [cherry-pick] Update repository config (#301) (#308) +- [2050c60](https://github.com/stashed/postgres/commit/2050c60) [cherry-pick] Update repository config (#291) (#298) +- [8e7195e](https://github.com/stashed/postgres/commit/8e7195e) [cherry-pick] Publish docker images to ghcr.io (#280) (#287) +- [d4f998c](https://github.com/stashed/postgres/commit/d4f998c) [cherry-pick] Use username/password as keys in Postgres secret (#270) (#277) +- [a6c0345](https://github.com/stashed/postgres/commit/a6c0345) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#260) (#267) +- [14024cc](https://github.com/stashed/postgres/commit/14024cc) [cherry-pick] Update repository config (#250) (#257) +- [0363817](https://github.com/stashed/postgres/commit/0363817) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#240) (#247) +- [7c742dc](https://github.com/stashed/postgres/commit/7c742dc) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#230) (#237) +- [2cd3054](https://github.com/stashed/postgres/commit/2cd3054) [cherry-pick] Update repository config (#220) (#227) +- [bbc34f5](https://github.com/stashed/postgres/commit/bbc34f5) [cherry-pick] Update repository config (#210) (#217) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.11.3](https://github.com/stashed/stash/releases/tag/v0.11.3) + +- [ab872821](https://github.com/stashed/stash/commit/ab872821) Prepare for release v0.11.3 (#1233) +- [d64e9c1e](https://github.com/stashed/stash/commit/d64e9c1e) Pass offshoot labels to CronJob pods (#1232) +- [40a233c2](https://github.com/stashed/stash/commit/40a233c2) Use BackoffLimit=0 for backup/restore job (#1216) +- [a206a9ce](https://github.com/stashed/stash/commit/a206a9ce) Fix ClusterRoleBinding name conflict (#1231) +- [a5ec7562](https://github.com/stashed/stash/commit/a5ec7562) Update Kubernetes v1.18.9 dependencies (#1230) +- [8cf2e397](https://github.com/stashed/stash/commit/8cf2e397) Update Kubernetes v1.18.9 dependencies (#1228) +- [a4c19094](https://github.com/stashed/stash/commit/a4c19094) Use restic 0.10.0 (#1223) +- [fad497a6](https://github.com/stashed/stash/commit/fad497a6) Update repository config (#1226) +- [80933bde](https://github.com/stashed/stash/commit/80933bde) Update repository config (#1225) +- [7974b478](https://github.com/stashed/stash/commit/7974b478) Update repository config (#1224) +- [c7497ebc](https://github.com/stashed/stash/commit/c7497ebc) Update Kubernetes v1.18.9 dependencies (#1222) +- [0280f08d](https://github.com/stashed/stash/commit/0280f08d) Publish docker images to ghcr.io (#1221) +- [bf1df8d5](https://github.com/stashed/stash/commit/bf1df8d5) Update Kubernetes v1.18.9 dependencies (#1220) +- [d2e86335](https://github.com/stashed/stash/commit/d2e86335) Update repository config (#1219) +- [d8ccdd2b](https://github.com/stashed/stash/commit/d8ccdd2b) Update Kubernetes v1.18.9 dependencies (#1218) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2020.10.29.md b/content/docs/v2024.12.18/CHANGELOG-v2020.10.29.md new file mode 100644 index 0000000000..195b2f98c7 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2020.10.29.md @@ -0,0 +1,157 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2020.10.29 + name: Changelog-v2020.10.29 + parent: welcome + weight: 20201029 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2020.10.29/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2020.10.29/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2020.10.29 (2020-10-29) + + +## [appscode/stash-enterprise](https://github.com/appscode/stash-enterprise) + +### [v0.11.4](https://github.com/appscode/stash-enterprise/releases/tag/v0.11.4) + +- [5b7c911d](https://github.com/appscode/stash-enterprise/commit/5b7c911d) Prepare for release v0.11.4 (#45) +- [6c8b88e9](https://github.com/appscode/stash-enterprise/commit/6c8b88e9) Update README.md +- [385ef36d](https://github.com/appscode/stash-enterprise/commit/385ef36d) Fix status updating for backup using RunParallelBackup() (#44) +- [3edaf566](https://github.com/appscode/stash-enterprise/commit/3edaf566) Add preBackupAction and postBackupAction only for Restic driver (#43) +- [3e5ac158](https://github.com/appscode/stash-enterprise/commit/3e5ac158) Update readme + + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.11.4](https://github.com/stashed/apimachinery/releases/tag/v0.11.4) + +- [1b48bb3a](https://github.com/stashed/apimachinery/commit/1b48bb3a) Update Kubernetes v1.18.9 dependencies (#66) +- [24d76627](https://github.com/stashed/apimachinery/commit/24d76627) Update Kubernetes v1.18.9 dependencies (#65) +- [5e34b047](https://github.com/stashed/apimachinery/commit/5e34b047) Update readme +- [04872fc9](https://github.com/stashed/apimachinery/commit/04872fc9) Update Kubernetes v1.18.9 dependencies (#64) + + + +## [stashed/catalog](https://github.com/stashed/catalog) + +### [v2020.10.29](https://github.com/stashed/catalog/releases/tag/v2020.10.29) + +- [858d610](https://github.com/stashed/catalog/commit/858d610) Update readme +- [3d011d9](https://github.com/stashed/catalog/commit/3d011d9) Update readme + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.11.4](https://github.com/stashed/cli/releases/tag/v0.11.4) + +- [236c29f](https://github.com/stashed/cli/commit/236c29f) Prepare for release v0.11.4 (#69) +- [885792c](https://github.com/stashed/cli/commit/885792c) Update README.md +- [80f916f](https://github.com/stashed/cli/commit/80f916f) Update Kubernetes v1.18.9 dependencies (#68) +- [d2b4ad3](https://github.com/stashed/cli/commit/d2b4ad3) Update readme +- [4889acc](https://github.com/stashed/cli/commit/4889acc) Update Kubernetes v1.18.9 dependencies (#67) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v0.11.4](https://github.com/stashed/installer/releases/tag/v0.11.4) + +- [4817082](https://github.com/stashed/installer/commit/4817082) Prepare for release v0.11.4 (#120) +- [3f52053](https://github.com/stashed/installer/commit/3f52053) Update README.md +- [20ac983](https://github.com/stashed/installer/commit/20ac983) Update Kubernetes v1.18.9 dependencies (#119) +- [04b3101](https://github.com/stashed/installer/commit/04b3101) Update readme +- [cf374ce](https://github.com/stashed/installer/commit/cf374ce) Update Kubernetes v1.18.9 dependencies (#118) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.11.4](https://github.com/stashed/stash/releases/tag/v0.11.4) + +- [675b4bad](https://github.com/stashed/stash/commit/675b4bad) Prepare for release v0.11.4 (#1239) +- [008680ef](https://github.com/stashed/stash/commit/008680ef) Update README.md +- [569cdb79](https://github.com/stashed/stash/commit/569cdb79) Add preBackupAction and postBackupAction only for Restic driver (#1236) +- [6f0bb719](https://github.com/stashed/stash/commit/6f0bb719) Fix status updating for backup using RunParallelBackup() (#1238) +- [25e51b3a](https://github.com/stashed/stash/commit/25e51b3a) Update Kubernetes v1.18.9 dependencies (#1237) +- [0a6bab0f](https://github.com/stashed/stash/commit/0a6bab0f) Update readme +- [309a8f29](https://github.com/stashed/stash/commit/309a8f29) Update Kubernetes v1.18.9 dependencies (#1234) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2020.10.30.md b/content/docs/v2024.12.18/CHANGELOG-v2020.10.30.md new file mode 100644 index 0000000000..4038854159 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2020.10.30.md @@ -0,0 +1,136 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2020.10.30 + name: Changelog-v2020.10.30 + parent: welcome + weight: 20201030 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2020.10.30/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2020.10.30/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2020.10.30 (2020-10-30) + + +## [appscode/stash-enterprise](https://github.com/appscode/stash-enterprise) + +### [v0.11.5](https://github.com/appscode/stash-enterprise/releases/tag/v0.11.5) + +- [3f46fc61](https://github.com/appscode/stash-enterprise/commit/3f46fc61) Prepare for release v0.11.5 (#47) +- [b7dd790e](https://github.com/appscode/stash-enterprise/commit/b7dd790e) Fix RestoreSession targetPhase calculation (#46) + + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.11.5](https://github.com/stashed/apimachinery/releases/tag/v0.11.5) + +- [45f4ed32](https://github.com/stashed/apimachinery/commit/45f4ed32) Update readme + + + +## [stashed/catalog](https://github.com/stashed/catalog) + +### [v2020.10.30](https://github.com/stashed/catalog/releases/tag/v2020.10.30) + + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.11.5](https://github.com/stashed/cli/releases/tag/v0.11.5) + +- [0144016](https://github.com/stashed/cli/commit/0144016) Prepare for release v0.11.5 (#70) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v0.11.5](https://github.com/stashed/installer/releases/tag/v0.11.5) + +- [4cbcc62](https://github.com/stashed/installer/commit/4cbcc62) Prepare for release v0.11.5 (#121) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.11.5](https://github.com/stashed/stash/releases/tag/v0.11.5) + +- [8d19f197](https://github.com/stashed/stash/commit/8d19f197) Prepare for release v0.11.5 (#1241) +- [4fe4b3c9](https://github.com/stashed/stash/commit/4fe4b3c9) Fix RestoreSession target phase calculation (#1240) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2020.11.06.md b/content/docs/v2024.12.18/CHANGELOG-v2020.11.06.md new file mode 100644 index 0000000000..5bcd820fb0 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2020.11.06.md @@ -0,0 +1,476 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2020.11.06 + name: Changelog-v2020.11.06 + parent: welcome + weight: 20201106 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2020.11.06/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2020.11.06/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2020.11.06 (2020-11-07) + + +## [appscode/stash-enterprise](https://github.com/appscode/stash-enterprise) + +### [v0.11.6](https://github.com/appscode/stash-enterprise/releases/tag/v0.11.6) + +- [844f92dc](https://github.com/appscode/stash-enterprise/commit/844f92dc) Prepare for release v0.11.6 (#52) +- [7c121617](https://github.com/appscode/stash-enterprise/commit/7c121617) Use restic 0.11.0 (#51) +- [98cc42b4](https://github.com/appscode/stash-enterprise/commit/98cc42b4) Update Kubernetes v1.18.9 dependencies (#38) +- [a882fc9b](https://github.com/appscode/stash-enterprise/commit/a882fc9b) Fix E2E tests (#50) +- [6950f54a](https://github.com/appscode/stash-enterprise/commit/6950f54a) Use modified UpdateStatus & Invoker utils (#49) +- [079d90e2](https://github.com/appscode/stash-enterprise/commit/079d90e2) Use backup/restore invoker information as prometheus job name (#48) + + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.11.6](https://github.com/stashed/apimachinery/releases/tag/v0.11.6) + +- [5e04c853](https://github.com/stashed/apimachinery/commit/5e04c853) Use restic 0.11.0 (#70) +- [132a511f](https://github.com/stashed/apimachinery/commit/132a511f) Update Kubernetes v1.18.9 dependencies (#69) +- [b51d7c6a](https://github.com/stashed/apimachinery/commit/b51d7c6a) Use invoker variable name 'inv' +- [c2190f6b](https://github.com/stashed/apimachinery/commit/c2190f6b) Various fixes (#67) + + + +## [stashed/catalog](https://github.com/stashed/catalog) + +### [v2020.11.06](https://github.com/stashed/catalog/releases/tag/v2020.11.06) + +- [4f5b081](https://github.com/stashed/catalog/commit/4f5b081) Prepare for release v2020.11.06 (#45) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.11.6](https://github.com/stashed/cli/releases/tag/v0.11.6) + +- [ea1e330](https://github.com/stashed/cli/commit/ea1e330) Prepare for release v0.11.6 (#73) +- [803662d](https://github.com/stashed/cli/commit/803662d) Update Kubernetes v1.18.9 dependencies (#72) +- [af00ba6](https://github.com/stashed/cli/commit/af00ba6) Replace appscode/go with gomodules.xyz/x (#71) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v4](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v4) + +- [3c39fdd](https://github.com/stashed/elasticsearch/commit/3c39fdd) Prepare for release 5.6.4-v4 (#444) +- [0e8f7fb](https://github.com/stashed/elasticsearch/commit/0e8f7fb) [cherry-pick] Use restic 0.11.0 (#435) (#436) +- [096bbe4](https://github.com/stashed/elasticsearch/commit/096bbe4) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#426) (#427) +- [c6e6b02](https://github.com/stashed/elasticsearch/commit/c6e6b02) [cherry-pick] Update README.md (#416) +- [a383692](https://github.com/stashed/elasticsearch/commit/a383692) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#407) (#408) +- [830f3f1](https://github.com/stashed/elasticsearch/commit/830f3f1) [cherry-pick] Update readme (#399) +- [5f101c6](https://github.com/stashed/elasticsearch/commit/5f101c6) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#390) (#391) + + +### [6.2.4-v4](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v4) + +- [e7887a2](https://github.com/stashed/elasticsearch/commit/e7887a2) Prepare for release 6.2.4-v4 (#445) +- [575a05e](https://github.com/stashed/elasticsearch/commit/575a05e) [cherry-pick] Use restic 0.11.0 (#435) (#437) +- [569f892](https://github.com/stashed/elasticsearch/commit/569f892) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#426) (#428) +- [078a72e](https://github.com/stashed/elasticsearch/commit/078a72e) [cherry-pick] Update README.md (#417) +- [8918137](https://github.com/stashed/elasticsearch/commit/8918137) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#407) (#409) +- [6d5f1bd](https://github.com/stashed/elasticsearch/commit/6d5f1bd) [cherry-pick] Update readme (#400) +- [e42222f](https://github.com/stashed/elasticsearch/commit/e42222f) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#390) (#392) + + +### [6.3.0-v4](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v4) + +- [624a0a1](https://github.com/stashed/elasticsearch/commit/624a0a1) Prepare for release 6.3.0-v4 (#446) +- [b6dd67d](https://github.com/stashed/elasticsearch/commit/b6dd67d) [cherry-pick] Use restic 0.11.0 (#435) (#438) +- [b4bb13a](https://github.com/stashed/elasticsearch/commit/b4bb13a) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#426) (#429) +- [f18573a](https://github.com/stashed/elasticsearch/commit/f18573a) [cherry-pick] Update README.md (#418) +- [9f1ec99](https://github.com/stashed/elasticsearch/commit/9f1ec99) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#407) (#410) +- [72e6eca](https://github.com/stashed/elasticsearch/commit/72e6eca) [cherry-pick] Update readme (#401) +- [ef6e72e](https://github.com/stashed/elasticsearch/commit/ef6e72e) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#390) (#393) + + +### [6.4.0-v4](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v4) + +- [3477804](https://github.com/stashed/elasticsearch/commit/3477804) Prepare for release 6.4.0-v4 (#447) +- [c58be67](https://github.com/stashed/elasticsearch/commit/c58be67) [cherry-pick] Use restic 0.11.0 (#435) (#439) +- [27d0542](https://github.com/stashed/elasticsearch/commit/27d0542) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#426) (#430) +- [b7beb6c](https://github.com/stashed/elasticsearch/commit/b7beb6c) [cherry-pick] Update README.md (#419) +- [667b91b](https://github.com/stashed/elasticsearch/commit/667b91b) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#407) (#411) +- [4b15de5](https://github.com/stashed/elasticsearch/commit/4b15de5) [cherry-pick] Update readme (#402) +- [ec4f862](https://github.com/stashed/elasticsearch/commit/ec4f862) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#390) (#394) + + +### [6.5.3-v4](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v4) + +- [ecfeda3](https://github.com/stashed/elasticsearch/commit/ecfeda3) Prepare for release 6.5.3-v4 (#448) +- [811d778](https://github.com/stashed/elasticsearch/commit/811d778) [cherry-pick] Use restic 0.11.0 (#435) (#440) +- [a4e8fc8](https://github.com/stashed/elasticsearch/commit/a4e8fc8) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#426) (#431) +- [9bb8991](https://github.com/stashed/elasticsearch/commit/9bb8991) [cherry-pick] Update README.md (#420) +- [ca23821](https://github.com/stashed/elasticsearch/commit/ca23821) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#407) (#412) +- [81a6e81](https://github.com/stashed/elasticsearch/commit/81a6e81) [cherry-pick] Update readme (#403) +- [7c544fb](https://github.com/stashed/elasticsearch/commit/7c544fb) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#390) (#395) + + +### [6.8.0-v4](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v4) + +- [3be68de](https://github.com/stashed/elasticsearch/commit/3be68de) Prepare for release 6.8.0-v4 (#449) +- [056aec2](https://github.com/stashed/elasticsearch/commit/056aec2) [cherry-pick] Use restic 0.11.0 (#435) (#441) +- [c08d53d](https://github.com/stashed/elasticsearch/commit/c08d53d) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#426) (#432) +- [e67c72e](https://github.com/stashed/elasticsearch/commit/e67c72e) [cherry-pick] Update README.md (#421) +- [6b58712](https://github.com/stashed/elasticsearch/commit/6b58712) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#407) (#413) +- [588169f](https://github.com/stashed/elasticsearch/commit/588169f) [cherry-pick] Update readme (#404) +- [242ba7c](https://github.com/stashed/elasticsearch/commit/242ba7c) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#390) (#396) + + +### [7.2.0-v4](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v4) + +- [9004882](https://github.com/stashed/elasticsearch/commit/9004882) Prepare for release 7.2.0-v4 (#450) +- [61ac4fe](https://github.com/stashed/elasticsearch/commit/61ac4fe) [cherry-pick] Use restic 0.11.0 (#435) (#442) +- [8c47ff0](https://github.com/stashed/elasticsearch/commit/8c47ff0) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#426) (#433) +- [d9de6b0](https://github.com/stashed/elasticsearch/commit/d9de6b0) [cherry-pick] Update README.md (#422) +- [82bdf3a](https://github.com/stashed/elasticsearch/commit/82bdf3a) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#407) (#414) +- [7b12b81](https://github.com/stashed/elasticsearch/commit/7b12b81) [cherry-pick] Update readme (#405) +- [88cc572](https://github.com/stashed/elasticsearch/commit/88cc572) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#390) (#397) + + +### [7.3.2-v4](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v4) + +- [ae4510a](https://github.com/stashed/elasticsearch/commit/ae4510a) Prepare for release 7.3.2-v4 (#451) +- [c5fa263](https://github.com/stashed/elasticsearch/commit/c5fa263) [cherry-pick] Use restic 0.11.0 (#435) (#443) +- [ac4a169](https://github.com/stashed/elasticsearch/commit/ac4a169) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#426) (#434) +- [7918c06](https://github.com/stashed/elasticsearch/commit/7918c06) [cherry-pick] Update README.md (#423) +- [dc2459d](https://github.com/stashed/elasticsearch/commit/dc2459d) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#407) (#415) +- [91bccfb](https://github.com/stashed/elasticsearch/commit/91bccfb) [cherry-pick] Update readme (#406) +- [0543df9](https://github.com/stashed/elasticsearch/commit/0543df9) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#390) (#398) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v0.11.6](https://github.com/stashed/installer/releases/tag/v0.11.6) + +- [d6b5977](https://github.com/stashed/installer/commit/d6b5977) Prepare for release v0.11.6 (#124) +- [35a3dcf](https://github.com/stashed/installer/commit/35a3dcf) Update Kubernetes v1.18.9 dependencies (#123) +- [cc04710](https://github.com/stashed/installer/commit/cc04710) Update Kubernetes v1.18.9 dependencies (#122) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v4](https://github.com/stashed/mongodb/releases/tag/3.4.17-v4) + +- [3f6b306a](https://github.com/stashed/mongodb/commit/3f6b306a) Prepare for release 3.4.17-v4 (#579) +- [68d6e5de](https://github.com/stashed/mongodb/commit/68d6e5de) [cherry-pick] Use restic 0.11.0 (#567) (#568) +- [8d7f4a2c](https://github.com/stashed/mongodb/commit/8d7f4a2c) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#555) (#556) +- [4b80b637](https://github.com/stashed/mongodb/commit/4b80b637) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#543) (#544) +- [e0a76f8d](https://github.com/stashed/mongodb/commit/e0a76f8d) [cherry-pick] Update README.md (#532) +- [e78fbf27](https://github.com/stashed/mongodb/commit/e78fbf27) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#519) (#520) +- [2896604c](https://github.com/stashed/mongodb/commit/2896604c) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#507) (#508) + + +### [3.4.22-v4](https://github.com/stashed/mongodb/releases/tag/3.4.22-v4) + +- [0007f664](https://github.com/stashed/mongodb/commit/0007f664) Prepare for release 3.4.22-v4 (#580) +- [f6d2bbe5](https://github.com/stashed/mongodb/commit/f6d2bbe5) [cherry-pick] Use restic 0.11.0 (#567) (#569) +- [dceeccab](https://github.com/stashed/mongodb/commit/dceeccab) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#555) (#557) +- [b449e06b](https://github.com/stashed/mongodb/commit/b449e06b) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#543) (#545) +- [43651d6d](https://github.com/stashed/mongodb/commit/43651d6d) [cherry-pick] Update README.md (#533) +- [7955c033](https://github.com/stashed/mongodb/commit/7955c033) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#519) (#521) +- [4de72368](https://github.com/stashed/mongodb/commit/4de72368) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#507) (#509) + + +### [3.6.8-v4](https://github.com/stashed/mongodb/releases/tag/3.6.8-v4) + +- [e460c71c](https://github.com/stashed/mongodb/commit/e460c71c) Prepare for release 3.6.8-v4 (#582) +- [2de66fe3](https://github.com/stashed/mongodb/commit/2de66fe3) [cherry-pick] Use restic 0.11.0 (#567) (#571) +- [baca40a9](https://github.com/stashed/mongodb/commit/baca40a9) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#555) (#559) +- [ca71febb](https://github.com/stashed/mongodb/commit/ca71febb) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#543) (#547) +- [e6b625d4](https://github.com/stashed/mongodb/commit/e6b625d4) [cherry-pick] Update README.md (#535) +- [34b93cc6](https://github.com/stashed/mongodb/commit/34b93cc6) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#519) (#523) +- [a253c0b1](https://github.com/stashed/mongodb/commit/a253c0b1) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#507) (#511) + + +### [3.6.13-v4](https://github.com/stashed/mongodb/releases/tag/3.6.13-v4) + +- [2016d666](https://github.com/stashed/mongodb/commit/2016d666) Prepare for release 3.6.13-v4 (#581) +- [f43e0233](https://github.com/stashed/mongodb/commit/f43e0233) [cherry-pick] Use restic 0.11.0 (#567) (#570) +- [f019b7f6](https://github.com/stashed/mongodb/commit/f019b7f6) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#555) (#558) +- [0a2fe70c](https://github.com/stashed/mongodb/commit/0a2fe70c) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#543) (#546) +- [9ca6738b](https://github.com/stashed/mongodb/commit/9ca6738b) [cherry-pick] Update README.md (#534) +- [82545252](https://github.com/stashed/mongodb/commit/82545252) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#519) (#522) +- [27fcbdb5](https://github.com/stashed/mongodb/commit/27fcbdb5) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#507) (#510) + + +### [4.0.3-v4](https://github.com/stashed/mongodb/releases/tag/4.0.3-v4) + +- [47debac9](https://github.com/stashed/mongodb/commit/47debac9) Prepare for release 4.0.3-v4 (#584) +- [107d4a79](https://github.com/stashed/mongodb/commit/107d4a79) [cherry-pick] Use restic 0.11.0 (#567) (#573) +- [9c08be11](https://github.com/stashed/mongodb/commit/9c08be11) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#555) (#561) +- [172917bc](https://github.com/stashed/mongodb/commit/172917bc) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#543) (#549) +- [270d533f](https://github.com/stashed/mongodb/commit/270d533f) [cherry-pick] Update README.md (#537) +- [bd5fb620](https://github.com/stashed/mongodb/commit/bd5fb620) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#519) (#525) +- [df2a3bf5](https://github.com/stashed/mongodb/commit/df2a3bf5) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#507) (#513) + + +### [4.0.5-v4](https://github.com/stashed/mongodb/releases/tag/4.0.5-v4) + +- [328baadc](https://github.com/stashed/mongodb/commit/328baadc) Prepare for release 4.0.5-v4 (#585) +- [d10db825](https://github.com/stashed/mongodb/commit/d10db825) [cherry-pick] Use restic 0.11.0 (#567) (#574) +- [2a25fe1c](https://github.com/stashed/mongodb/commit/2a25fe1c) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#555) (#562) +- [f42c4554](https://github.com/stashed/mongodb/commit/f42c4554) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#543) (#550) +- [df2e29b0](https://github.com/stashed/mongodb/commit/df2e29b0) [cherry-pick] Update README.md (#538) +- [e810d537](https://github.com/stashed/mongodb/commit/e810d537) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#519) (#526) +- [40f8e2d1](https://github.com/stashed/mongodb/commit/40f8e2d1) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#507) (#514) + + +### [4.0.11-v4](https://github.com/stashed/mongodb/releases/tag/4.0.11-v4) + +- [36b75678](https://github.com/stashed/mongodb/commit/36b75678) Prepare for release 4.0.11-v4 (#583) +- [58bcaea8](https://github.com/stashed/mongodb/commit/58bcaea8) [cherry-pick] Use restic 0.11.0 (#567) (#572) +- [8d780f2b](https://github.com/stashed/mongodb/commit/8d780f2b) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#555) (#560) +- [4f109db3](https://github.com/stashed/mongodb/commit/4f109db3) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#543) (#548) +- [8b532dd7](https://github.com/stashed/mongodb/commit/8b532dd7) [cherry-pick] Update README.md (#536) +- [ac872685](https://github.com/stashed/mongodb/commit/ac872685) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#519) (#524) +- [056fa168](https://github.com/stashed/mongodb/commit/056fa168) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#507) (#512) + + +### [4.1.4-v4](https://github.com/stashed/mongodb/releases/tag/4.1.4-v4) + +- [dc3929e6](https://github.com/stashed/mongodb/commit/dc3929e6) Prepare for release 4.1.4-v4 (#587) +- [4eb1b197](https://github.com/stashed/mongodb/commit/4eb1b197) [cherry-pick] Use restic 0.11.0 (#567) (#576) +- [991eca5f](https://github.com/stashed/mongodb/commit/991eca5f) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#555) (#564) +- [c1bcd233](https://github.com/stashed/mongodb/commit/c1bcd233) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#543) (#552) +- [fa15af15](https://github.com/stashed/mongodb/commit/fa15af15) [cherry-pick] Update README.md (#540) +- [c80096b2](https://github.com/stashed/mongodb/commit/c80096b2) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#519) (#528) +- [e672fa66](https://github.com/stashed/mongodb/commit/e672fa66) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#507) (#516) + + +### [4.1.7-v4](https://github.com/stashed/mongodb/releases/tag/4.1.7-v4) + +- [21ab7971](https://github.com/stashed/mongodb/commit/21ab7971) Prepare for release 4.1.7-v4 (#588) +- [b4b9eb87](https://github.com/stashed/mongodb/commit/b4b9eb87) [cherry-pick] Use restic 0.11.0 (#567) (#577) +- [ab8bb239](https://github.com/stashed/mongodb/commit/ab8bb239) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#555) (#565) +- [1aa4347e](https://github.com/stashed/mongodb/commit/1aa4347e) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#543) (#553) +- [941b402d](https://github.com/stashed/mongodb/commit/941b402d) [cherry-pick] Update README.md (#541) +- [4ada82d7](https://github.com/stashed/mongodb/commit/4ada82d7) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#519) (#529) +- [1469fb25](https://github.com/stashed/mongodb/commit/1469fb25) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#507) (#517) + + +### [4.1.13-v4](https://github.com/stashed/mongodb/releases/tag/4.1.13-v4) + +- [472485fb](https://github.com/stashed/mongodb/commit/472485fb) Prepare for release 4.1.13-v4 (#586) +- [cd948e74](https://github.com/stashed/mongodb/commit/cd948e74) [cherry-pick] Use restic 0.11.0 (#567) (#575) +- [8ee583d0](https://github.com/stashed/mongodb/commit/8ee583d0) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#555) (#563) +- [fd492e62](https://github.com/stashed/mongodb/commit/fd492e62) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#543) (#551) +- [1bf69a8c](https://github.com/stashed/mongodb/commit/1bf69a8c) [cherry-pick] Update README.md (#539) +- [02c39c0c](https://github.com/stashed/mongodb/commit/02c39c0c) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#519) (#527) +- [3a803f84](https://github.com/stashed/mongodb/commit/3a803f84) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#507) (#515) + + +### [4.2.3-v4](https://github.com/stashed/mongodb/releases/tag/4.2.3-v4) + +- [89afb349](https://github.com/stashed/mongodb/commit/89afb349) Prepare for release 4.2.3-v4 (#589) +- [8d0edc1c](https://github.com/stashed/mongodb/commit/8d0edc1c) [cherry-pick] Use restic 0.11.0 (#567) (#578) +- [4affd4d6](https://github.com/stashed/mongodb/commit/4affd4d6) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#555) (#566) +- [bb26680f](https://github.com/stashed/mongodb/commit/bb26680f) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#543) (#554) +- [d1330686](https://github.com/stashed/mongodb/commit/d1330686) [cherry-pick] Update README.md (#542) +- [05eadfb2](https://github.com/stashed/mongodb/commit/05eadfb2) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#519) (#530) +- [5ebe5624](https://github.com/stashed/mongodb/commit/5ebe5624) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#507) (#518) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v4](https://github.com/stashed/mysql/releases/tag/5.7.25-v4) + +- [3a6158e](https://github.com/stashed/mysql/commit/3a6158e) Prepare for release 5.7.25-v4 (#218) +- [8a7b612](https://github.com/stashed/mysql/commit/8a7b612) [cherry-pick] Use restic 0.11.0 (#214) (#215) +- [7abed46](https://github.com/stashed/mysql/commit/7abed46) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#210) (#211) +- [8fa530d](https://github.com/stashed/mysql/commit/8fa530d) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#206) (#207) +- [83f2101](https://github.com/stashed/mysql/commit/83f2101) [cherry-pick] Update README.md (#203) +- [1ea81ab](https://github.com/stashed/mysql/commit/1ea81ab) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#199) (#200) +- [bc9131e](https://github.com/stashed/mysql/commit/bc9131e) [cherry-pick] Update readme (#196) +- [c94eb1e](https://github.com/stashed/mysql/commit/c94eb1e) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#192) (#193) +- [a1d9a87](https://github.com/stashed/mysql/commit/a1d9a87) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#188) (#189) + + +### [8.0.3-v4](https://github.com/stashed/mysql/releases/tag/8.0.3-v4) + +- [10c111d](https://github.com/stashed/mysql/commit/10c111d) Prepare for release 8.0.3-v4 (#220) +- [9204bff](https://github.com/stashed/mysql/commit/9204bff) [cherry-pick] Use restic 0.11.0 (#214) (#217) +- [833fb2e](https://github.com/stashed/mysql/commit/833fb2e) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#210) (#213) +- [c0e8ec0](https://github.com/stashed/mysql/commit/c0e8ec0) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#206) (#209) +- [31eb6c5](https://github.com/stashed/mysql/commit/31eb6c5) [cherry-pick] Update README.md (#205) +- [0679bff](https://github.com/stashed/mysql/commit/0679bff) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#199) (#202) +- [7699793](https://github.com/stashed/mysql/commit/7699793) [cherry-pick] Update readme (#198) +- [e2a2ad3](https://github.com/stashed/mysql/commit/e2a2ad3) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#192) (#195) +- [eee397e](https://github.com/stashed/mysql/commit/eee397e) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#188) (#191) + + +### [8.0.14-v4](https://github.com/stashed/mysql/releases/tag/8.0.14-v4) + +- [1dd0da8](https://github.com/stashed/mysql/commit/1dd0da8) Prepare for release 8.0.14-v4 (#219) +- [4722d69](https://github.com/stashed/mysql/commit/4722d69) [cherry-pick] Use restic 0.11.0 (#214) (#216) +- [35e0e97](https://github.com/stashed/mysql/commit/35e0e97) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#210) (#212) +- [0700e1b](https://github.com/stashed/mysql/commit/0700e1b) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#206) (#208) +- [f68dcb7](https://github.com/stashed/mysql/commit/f68dcb7) [cherry-pick] Update README.md (#204) +- [abb8870](https://github.com/stashed/mysql/commit/abb8870) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#199) (#201) +- [aea15a1](https://github.com/stashed/mysql/commit/aea15a1) [cherry-pick] Update readme (#197) +- [862d1cb](https://github.com/stashed/mysql/commit/862d1cb) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#192) (#194) +- [230a723](https://github.com/stashed/mysql/commit/230a723) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#188) (#190) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-v4](https://github.com/stashed/percona-xtradb/releases/tag/5.7-v4) + +- [2243395](https://github.com/stashed/percona-xtradb/commit/2243395) Prepare for release 5.7-v4 (#110) +- [4355836](https://github.com/stashed/percona-xtradb/commit/4355836) [cherry-pick] Use restic 0.11.0 (#108) (#109) +- [fb391dc](https://github.com/stashed/percona-xtradb/commit/fb391dc) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#106) (#107) +- [caff85c](https://github.com/stashed/percona-xtradb/commit/caff85c) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#104) (#105) +- [6b23346](https://github.com/stashed/percona-xtradb/commit/6b23346) [cherry-pick] Update README.md (#103) +- [eead980](https://github.com/stashed/percona-xtradb/commit/eead980) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#101) (#102) +- [9981cb1](https://github.com/stashed/percona-xtradb/commit/9981cb1) [cherry-pick] Update readme (#100) +- [e434d72](https://github.com/stashed/percona-xtradb/commit/e434d72) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#98) (#99) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v2](https://github.com/stashed/postgres/releases/tag/9.6.19-v2) + +- [efeac24](https://github.com/stashed/postgres/commit/efeac24) Prepare for release 9.6.19-v2 (#417) +- [be55874](https://github.com/stashed/postgres/commit/be55874) [cherry-pick] Use restic 0.11.0 (#404) (#413) +- [8844fb2](https://github.com/stashed/postgres/commit/8844fb2) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#394) (#403) +- [856fea8](https://github.com/stashed/postgres/commit/856fea8) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#384) (#393) +- [51324d8](https://github.com/stashed/postgres/commit/51324d8) [cherry-pick] Update README.md (#383) +- [da74dd2](https://github.com/stashed/postgres/commit/da74dd2) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#365) (#374) +- [472db2b](https://github.com/stashed/postgres/commit/472db2b) [cherry-pick] Update readme (#364) +- [b847956](https://github.com/stashed/postgres/commit/b847956) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#346) (#355) + + +### [10.14.0-v2](https://github.com/stashed/postgres/releases/tag/10.14.0-v2) + +- [56979a2](https://github.com/stashed/postgres/commit/56979a2) Prepare for release 10.14.0-v2 (#414) +- [6311db6](https://github.com/stashed/postgres/commit/6311db6) [cherry-pick] Use restic 0.11.0 (#404) (#405) +- [a214531](https://github.com/stashed/postgres/commit/a214531) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#394) (#395) +- [014f32d](https://github.com/stashed/postgres/commit/014f32d) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#384) (#385) +- [d2af0a7](https://github.com/stashed/postgres/commit/d2af0a7) [cherry-pick] Update README.md (#375) +- [47c1554](https://github.com/stashed/postgres/commit/47c1554) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#365) (#366) +- [f929b3f](https://github.com/stashed/postgres/commit/f929b3f) [cherry-pick] Update readme (#356) +- [c40b28e](https://github.com/stashed/postgres/commit/c40b28e) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#346) (#347) + + +### [11.9.0-v2](https://github.com/stashed/postgres/releases/tag/11.9.0-v2) + +- [cbde939](https://github.com/stashed/postgres/commit/cbde939) Prepare for release 11.9.0-v2 (#415) +- [784e869](https://github.com/stashed/postgres/commit/784e869) [cherry-pick] Use restic 0.11.0 (#404) (#410) +- [e27dc3f](https://github.com/stashed/postgres/commit/e27dc3f) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#394) (#400) +- [13f56f9](https://github.com/stashed/postgres/commit/13f56f9) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#384) (#390) +- [6bf8688](https://github.com/stashed/postgres/commit/6bf8688) [cherry-pick] Update README.md (#380) +- [7242780](https://github.com/stashed/postgres/commit/7242780) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#365) (#371) +- [f50f4aa](https://github.com/stashed/postgres/commit/f50f4aa) [cherry-pick] Update readme (#361) +- [1e42c94](https://github.com/stashed/postgres/commit/1e42c94) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#346) (#352) + + +### [12.4.0-v2](https://github.com/stashed/postgres/releases/tag/12.4.0-v2) + +- [6d8aa2f](https://github.com/stashed/postgres/commit/6d8aa2f) Prepare for release 12.4.0-v2 (#416) +- [d8ca600](https://github.com/stashed/postgres/commit/d8ca600) [cherry-pick] Use restic 0.11.0 (#404) (#411) +- [9814a3e](https://github.com/stashed/postgres/commit/9814a3e) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#394) (#401) +- [9de7a4c](https://github.com/stashed/postgres/commit/9de7a4c) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#384) (#391) +- [9901d95](https://github.com/stashed/postgres/commit/9901d95) [cherry-pick] Update README.md (#381) +- [df32228](https://github.com/stashed/postgres/commit/df32228) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#365) (#372) +- [b859a9f](https://github.com/stashed/postgres/commit/b859a9f) [cherry-pick] Update readme (#362) +- [f9186d9](https://github.com/stashed/postgres/commit/f9186d9) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#346) (#353) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.11.6](https://github.com/stashed/stash/releases/tag/v0.11.6) + +- [8cbac525](https://github.com/stashed/stash/commit/8cbac525) Prepare for release v0.11.6 (#1252) +- [57db9b74](https://github.com/stashed/stash/commit/57db9b74) Use restic 0.11.0 (#1251) +- [10d02b13](https://github.com/stashed/stash/commit/10d02b13) Update dependencies +- [437a1968](https://github.com/stashed/stash/commit/437a1968) Update Kubernetes v1.18.9 dependencies (#1250) +- [29cef180](https://github.com/stashed/stash/commit/29cef180) Fix E2E tests (#1249) +- [e88ab544](https://github.com/stashed/stash/commit/e88ab544) Use backup/restore invoker information as prometheus job name (#1248) +- [d0a4751b](https://github.com/stashed/stash/commit/d0a4751b) Use modified UpdateStatus & Invoker utils (#1247) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2020.11.17.md b/content/docs/v2024.12.18/CHANGELOG-v2020.11.17.md new file mode 100644 index 0000000000..680ce7e52a --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2020.11.17.md @@ -0,0 +1,327 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2020.11.17 + name: Changelog-v2020.11.17 + parent: welcome + weight: 20201117 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2020.11.17/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2020.11.17/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2020.11.17 (2020-11-17) + + +## [appscode/stash-enterprise](https://github.com/appscode/stash-enterprise) + +### [v0.11.7](https://github.com/appscode/stash-enterprise/releases/tag/v0.11.7) + +- [473534f4](https://github.com/appscode/stash-enterprise/commit/473534f4) Prepare for release v0.11.7 (#58) +- [016eb3dd](https://github.com/appscode/stash-enterprise/commit/016eb3dd) Skip new session if another is already running (#56) +- [90dfcb40](https://github.com/appscode/stash-enterprise/commit/90dfcb40) Fix failing E2E tests (#55) +- [af4faf84](https://github.com/appscode/stash-enterprise/commit/af4faf84) Update repository config (#57) +- [f46499dd](https://github.com/appscode/stash-enterprise/commit/f46499dd) Update license +- [650ee9a3](https://github.com/appscode/stash-enterprise/commit/650ee9a3) Update Kubernetes v1.18.9 dependencies (#54) +- [05f2c82b](https://github.com/appscode/stash-enterprise/commit/05f2c82b) Update Kubernetes v1.18.9 dependencies (#53) + + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.11.7](https://github.com/stashed/apimachinery/releases/tag/v0.11.7) + +- [9865af3b](https://github.com/stashed/apimachinery/commit/9865af3b) Add Skipped phase for BackupSession (#72) +- [81362c35](https://github.com/stashed/apimachinery/commit/81362c35) Update Kubernetes v1.18.9 dependencies (#71) + + + +## [stashed/catalog](https://github.com/stashed/catalog) + +### [v2020.11.17](https://github.com/stashed/catalog/releases/tag/v2020.11.17) + +- [95f6628](https://github.com/stashed/catalog/commit/95f6628) Prepare for release v2020.11.17 (#47) +- [0936e9a](https://github.com/stashed/catalog/commit/0936e9a) Update repository config (#46) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.11.7](https://github.com/stashed/cli/releases/tag/v0.11.7) + +- [b9bac70](https://github.com/stashed/cli/commit/b9bac70) Prepare for release v0.11.7 (#74) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v0.11.7](https://github.com/stashed/installer/releases/tag/v0.11.7) + +- [597f380](https://github.com/stashed/installer/commit/597f380) Prepare for release v0.11.7 (#127) +- [02bf752](https://github.com/stashed/installer/commit/02bf752) Update repository config (#126) +- [dba0d41](https://github.com/stashed/installer/commit/dba0d41) Update Kubernetes v1.18.9 dependencies (#125) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7.0](https://github.com/stashed/percona-xtradb/releases/tag/5.7.0) + +- [67ee725](https://github.com/stashed/percona-xtradb/commit/67ee725) Update CI configuration +- [a5c04fa](https://github.com/stashed/percona-xtradb/commit/a5c04fa) Add support for providing s3 region (#14) +- [2ee6c3b](https://github.com/stashed/percona-xtradb/commit/2ee6c3b) Update percona standalone backup-restore (#13) +- [af1a30b](https://github.com/stashed/percona-xtradb/commit/af1a30b) Update PerconaXtraDB version for percona xtradb cluster (#12) +- [7ddb43a](https://github.com/stashed/percona-xtradb/commit/7ddb43a) Make output.json file writable to all users + Fix Flag types (#11) +- [06aa5c3](https://github.com/stashed/percona-xtradb/commit/06aa5c3) Update hugo frontmatter for stash website +- [4171676](https://github.com/stashed/percona-xtradb/commit/4171676) Enable race detector in e2e tests +- [9ab6f35](https://github.com/stashed/percona-xtradb/commit/9ab6f35) Added scheme field in AppBinding (#10) +- [a4262ea](https://github.com/stashed/percona-xtradb/commit/a4262ea) Test installers (#9) +- [72be668](https://github.com/stashed/percona-xtradb/commit/72be668) Don't build docker image for arm64 +- [2974e8b](https://github.com/stashed/percona-xtradb/commit/2974e8b) Update license file templates +- [dd96199](https://github.com/stashed/percona-xtradb/commit/dd96199) Add license header to files (#8) +- [93e37a6](https://github.com/stashed/percona-xtradb/commit/93e37a6) Backup and restore doc for Percona XtraDB 5.7 (#7) +- [aafee30](https://github.com/stashed/percona-xtradb/commit/aafee30) Fix percona-xtradb backup & restore (#6) +- [06cbe89](https://github.com/stashed/percona-xtradb/commit/06cbe89) Fix Docker image badge (#5) +- [2e6c4c6](https://github.com/stashed/percona-xtradb/commit/2e6c4c6) Update Makefile (#4) +- [11da7a1](https://github.com/stashed/percona-xtradb/commit/11da7a1) Add release pipeline (#3) +- [75ca782](https://github.com/stashed/percona-xtradb/commit/75ca782) Update go.yml +- [998acad](https://github.com/stashed/percona-xtradb/commit/998acad) Enable GitHub actions +- [a32083a](https://github.com/stashed/percona-xtradb/commit/a32083a) Improve error handling + remove metrics handling part (#2) +- [87b38a5](https://github.com/stashed/percona-xtradb/commit/87b38a5) Backup & Restore PerconaXtraDB using Stash (#1) +- [a4485ab](https://github.com/stashed/percona-xtradb/commit/a4485ab) Reorganize repo +- [1972a9a](https://github.com/stashed/percona-xtradb/commit/1972a9a) VolumeSnapshot (#787) +- [3f1f4cf](https://github.com/stashed/percona-xtradb/commit/3f1f4cf) Remove importance of order of rule in RestoreSession (#795) +- [86a4af0](https://github.com/stashed/percona-xtradb/commit/86a4af0) Skip BackupSession creation if target does not exist + use timestamp … (#797) +- [3abe6f6](https://github.com/stashed/percona-xtradb/commit/3abe6f6) Use restic 0.9.5 (#789) +- [85b21bf](https://github.com/stashed/percona-xtradb/commit/85b21bf) Update concept doc (#739) +- [ad5c8f2](https://github.com/stashed/percona-xtradb/commit/ad5c8f2) Add support for backup cluster resources YAML (#721) +- [2bb8ec3](https://github.com/stashed/percona-xtradb/commit/2bb8ec3) Backup and restore Elasticsearch (#702) +- [1f21268](https://github.com/stashed/percona-xtradb/commit/1f21268) Update package path to stash.appscode.dev/stash (#776) +- [e8fb571](https://github.com/stashed/percona-xtradb/commit/e8fb571) Update to k8s 1.14.0 client libraries using go.mod (#775) +- [eab0f8e](https://github.com/stashed/percona-xtradb/commit/eab0f8e) Remove --rbac flag (#761) +- [4c3e7ea](https://github.com/stashed/percona-xtradb/commit/4c3e7ea) Skip creating/processing backup-session when backup-config is paused (#759) +- [7905eff](https://github.com/stashed/percona-xtradb/commit/7905eff) Stash v1beta1 E2E test for PVC (#753) +- [2c44ee8](https://github.com/stashed/percona-xtradb/commit/2c44ee8) Implement snapshots for v1beta1 api (#749) +- [c88df7a](https://github.com/stashed/percona-xtradb/commit/c88df7a) Run restic commands using docker (#754) +- [8e24d32](https://github.com/stashed/percona-xtradb/commit/8e24d32) Fixed scratch-dir, output-dir and hostname in functions/tasks yamls (#744) +- [8d5944d](https://github.com/stashed/percona-xtradb/commit/8d5944d) Add Stash CLI (#734) +- [550ab37](https://github.com/stashed/percona-xtradb/commit/550ab37) Apply nice/ionice settings from env (#746) +- [42ed76b](https://github.com/stashed/percona-xtradb/commit/42ed76b) Stash V1beta1 E2E test for Deployment (#710) +- [d63f9e9](https://github.com/stashed/percona-xtradb/commit/d63f9e9) Fix openapi path prefixes for validators and mutators (#732) +- [c1347ed](https://github.com/stashed/percona-xtradb/commit/c1347ed) Add max-connections for GCS, Azure, B2 backend (#730) +- [859c4ee](https://github.com/stashed/percona-xtradb/commit/859c4ee) Rename admission webhooks to avoid name collision (#725) +- [d631bb9](https://github.com/stashed/percona-xtradb/commit/d631bb9) Apply EmptyDir settings to TmpDir (#719) +- [cc70068](https://github.com/stashed/percona-xtradb/commit/cc70068) Add support for rest backend (#713) +- [e4db000](https://github.com/stashed/percona-xtradb/commit/e4db000) Add support for OpenShift DeploymentConfig (#714) +- [3fa7bdb](https://github.com/stashed/percona-xtradb/commit/3fa7bdb) Backup and restore Mongo DB (#699) +- [4c39235](https://github.com/stashed/percona-xtradb/commit/4c39235) Backup and restore MySQL DB (#696) +- [3e89d32](https://github.com/stashed/percona-xtradb/commit/3e89d32) Backup and restore Postgres DB (#695) +- [03b95f3](https://github.com/stashed/percona-xtradb/commit/03b95f3) Add BackupSession Controller for Sidecar (#701) +- [cacbc7d](https://github.com/stashed/percona-xtradb/commit/cacbc7d) Update workload controller for new design (#675) +- [5c173e5](https://github.com/stashed/percona-xtradb/commit/5c173e5) Post backup/restore status update (#691) +- [50bbb0a](https://github.com/stashed/percona-xtradb/commit/50bbb0a) Backup and restore PVC (#676) +- [d4a53e2](https://github.com/stashed/percona-xtradb/commit/d4a53e2) Add BackupConfiguration Controller (#671) +- [ef9a4ae](https://github.com/stashed/percona-xtradb/commit/ef9a4ae) Update Kubernetes client libraries to 1.13.0 (#687) +- [c48dbfc](https://github.com/stashed/percona-xtradb/commit/c48dbfc) Separate type definitions into individual files (#646) +- [77f2113](https://github.com/stashed/percona-xtradb/commit/77f2113) Use flags.DumpAll to dump flags (#624) +- [cb54d8c](https://github.com/stashed/percona-xtradb/commit/cb54d8c) Set periodic analytics (#623) +- [248a53a](https://github.com/stashed/percona-xtradb/commit/248a53a) Add validation webhook xray (#618) +- [2029bf4](https://github.com/stashed/percona-xtradb/commit/2029bf4) Use dynamic pushgateway url (#614) +- [bcf5926](https://github.com/stashed/percona-xtradb/commit/bcf5926) Fix offline backup (#537) +- [5049a63](https://github.com/stashed/percona-xtradb/commit/5049a63) Fix extended apiserver issues with Kubernetes 1.11 (#536) +- [9d31255](https://github.com/stashed/percona-xtradb/commit/9d31255) Update client-go to v8.0.0 (#528) +- [d872b4c](https://github.com/stashed/percona-xtradb/commit/d872b4c) Enable status subresource for crds (#524) +- [4795dba](https://github.com/stashed/percona-xtradb/commit/4795dba) Remove ops-address port (#518) +- [e95b151](https://github.com/stashed/percona-xtradb/commit/e95b151) Add support for initial backoff to the apiserver call on recover (#476) +- [120e5de](https://github.com/stashed/percona-xtradb/commit/120e5de) Disable admission controllers for webhook server (#468) +- [2f19545](https://github.com/stashed/percona-xtradb/commit/2f19545) Update client-go to 7.0.0 (#463) +- [e613ff5](https://github.com/stashed/percona-xtradb/commit/e613ff5) Fixes RBAC issue in test (#449) +- [56a3a74](https://github.com/stashed/percona-xtradb/commit/56a3a74) Some cleanup (#446) +- [02565bb](https://github.com/stashed/percona-xtradb/commit/02565bb) Delete restic repository from backend if Repository CRD is deleted (#438) +- [ea98067](https://github.com/stashed/percona-xtradb/commit/ea98067) Fix go_vet error (#440) +- [9d626eb](https://github.com/stashed/percona-xtradb/commit/9d626eb) Increase qps and burst limits (#435) +- [5c6713f](https://github.com/stashed/percona-xtradb/commit/5c6713f) Show repository snapshot list (#417) +- [6d8ef78](https://github.com/stashed/percona-xtradb/commit/6d8ef78) Expose swagger.json (#420) +- [8e04ca0](https://github.com/stashed/percona-xtradb/commit/8e04ca0) Create repository crd for each Restic repository (#394) +- [4c9a478](https://github.com/stashed/percona-xtradb/commit/4c9a478) Rename --analytics to --enable-analytics (#384) +- [7ea2220](https://github.com/stashed/percona-xtradb/commit/7ea2220) Replace initializers with mutation webhook for workloads (#363) +- [2770e6b](https://github.com/stashed/percona-xtradb/commit/2770e6b) Use admission hook helpers from kutil (#360) +- [d3754d7](https://github.com/stashed/percona-xtradb/commit/d3754d7) Implement offline backup for multiple replica (#335) +- [13a2d14](https://github.com/stashed/percona-xtradb/commit/13a2d14) Use official code generator scripts (#336) +- [90642ce](https://github.com/stashed/percona-xtradb/commit/90642ce) Fix e2e tests after webhook merger (#333) +- [2fc3239](https://github.com/stashed/percona-xtradb/commit/2fc3239) Leave secure port unset +- [7cb52b2](https://github.com/stashed/percona-xtradb/commit/7cb52b2) Merge admission webhook and operator into one binary (#329) +- [3306427](https://github.com/stashed/percona-xtradb/commit/3306427) Implement informer factory for backup scheduler (#325) +- [7bb027b](https://github.com/stashed/percona-xtradb/commit/7bb027b) Cleanup apiserver +- [fb8c1e4](https://github.com/stashed/percona-xtradb/commit/fb8c1e4) Copy generic-admission-server into pkg (#318) +- [5a5093f](https://github.com/stashed/percona-xtradb/commit/5a5093f) Use shared infromer factory (#317) +- [0ccb948](https://github.com/stashed/percona-xtradb/commit/0ccb948) Use GetBaseVersion method from kutil (#316) +- [8c5e6ff](https://github.com/stashed/percona-xtradb/commit/8c5e6ff) Fix webhook command description (#314) +- [775a2b6](https://github.com/stashed/percona-xtradb/commit/775a2b6) Merge webhook plugins into one. (#311) +- [a8659fe](https://github.com/stashed/percona-xtradb/commit/a8659fe) Add ValidatingAdmissionWebhook for Stash CRDs (#299) +- [c3e177c](https://github.com/stashed/percona-xtradb/commit/c3e177c) Added support for private docker registry (#300) +- [62ec42e](https://github.com/stashed/percona-xtradb/commit/62ec42e) Update dependencies to Kubernetes 1.9 (#297) +- [cf3ea7c](https://github.com/stashed/percona-xtradb/commit/cf3ea7c) Update appscode/go log wrapper (#287) +- [470cc31](https://github.com/stashed/percona-xtradb/commit/470cc31) Pass --pushgateway-url for injected containers. (#284) +- [e2e79c6](https://github.com/stashed/percona-xtradb/commit/e2e79c6) Fix kubectl version parsing generation in GKE (#267) +- [326aea4](https://github.com/stashed/percona-xtradb/commit/326aea4) Detect analytics client id using env vars (#265) +- [4a5912c](https://github.com/stashed/percona-xtradb/commit/4a5912c) Prepare docs for 0.6.0 release (#264) +- [f75d5df](https://github.com/stashed/percona-xtradb/commit/f75d5df) Remove restic-dependency from recovery (#258) +- [86f01f3](https://github.com/stashed/percona-xtradb/commit/86f01f3) Log operator version on start (#253) +- [4e29b70](https://github.com/stashed/percona-xtradb/commit/4e29b70) Simplify clientID generation for analytics (#247) +- [a45937f](https://github.com/stashed/percona-xtradb/commit/a45937f) Set analytics clientID (#246) +- [ea53cea](https://github.com/stashed/percona-xtradb/commit/ea53cea) Enable Restic cahce-dir flag (#241) +- [dc0030d](https://github.com/stashed/percona-xtradb/commit/dc0030d) Implement offline backup (#229) +- [ae40f35](https://github.com/stashed/percona-xtradb/commit/ae40f35) Revendor kutil (#230) +- [d68a34d](https://github.com/stashed/percona-xtradb/commit/d68a34d) Record recovery status for individual FileGroup (#222) +- [15a24b7](https://github.com/stashed/percona-xtradb/commit/15a24b7) Leader election for deployment, replica set and rc (#206) +- [4a75689](https://github.com/stashed/percona-xtradb/commit/4a75689) Implement Recovery for Restic Backup (#202) +- [78b3942](https://github.com/stashed/percona-xtradb/commit/78b3942) Use typed versioned client for CRD +- [b857b05](https://github.com/stashed/percona-xtradb/commit/b857b05) Change `k8s.io/api/core/v1` pkg alias to core (#204) +- [e52f848](https://github.com/stashed/percona-xtradb/commit/e52f848) Use client-go 5.x +- [4f376ad](https://github.com/stashed/percona-xtradb/commit/4f376ad) Set hostname based on resource type (#198) +- [e530116](https://github.com/stashed/percona-xtradb/commit/e530116) Manage RoleBinding for rbac enabled cluster (#197) +- [e28c13f](https://github.com/stashed/percona-xtradb/commit/e28c13f) Use workqueue for scheduler (#194) +- [2719cbd](https://github.com/stashed/percona-xtradb/commit/2719cbd) Fix e2e tests (#183) +- [9c1cc43](https://github.com/stashed/percona-xtradb/commit/9c1cc43) Use workqueue (#182) +- [b3ee076](https://github.com/stashed/percona-xtradb/commit/b3ee076) Only watch apps/v1beta1 Deployment (#178) +- [4f92ca6](https://github.com/stashed/percona-xtradb/commit/4f92ca6) Use Namespace() method from kutil. +- [78f1e7f](https://github.com/stashed/percona-xtradb/commit/78f1e7f) Update kutil (#170) +- [29a8a1f](https://github.com/stashed/percona-xtradb/commit/29a8a1f) Use apis/v1alpha1 instead of internal version (#167) +- [da3eb2e](https://github.com/stashed/percona-xtradb/commit/da3eb2e) Use kubernetes/code-generator (#163) +- [3b1d6bf](https://github.com/stashed/percona-xtradb/commit/3b1d6bf) Expose resync-period as flag +- [35d8dc6](https://github.com/stashed/percona-xtradb/commit/35d8dc6) Move analytics collector to root command (#164) +- [6a55694](https://github.com/stashed/percona-xtradb/commit/6a55694) Migrate TPR to CRD (#160) +- [91f678f](https://github.com/stashed/percona-xtradb/commit/91f678f) Rename RepositorySecretName to StorageSecretName (#135) +- [d666c81](https://github.com/stashed/percona-xtradb/commit/d666c81) Change mount path for labels to /etc/stash +- [1177d60](https://github.com/stashed/percona-xtradb/commit/1177d60) Part 6 - Update docs (#121) +- [a15689d](https://github.com/stashed/percona-xtradb/commit/a15689d) Various bug fixes (#118) +- [d8a5771](https://github.com/stashed/percona-xtradb/commit/d8a5771) Set TMPDIR env var for restic (#115) +- [60ed8f7](https://github.com/stashed/percona-xtradb/commit/60ed8f7) Update user guide (#94) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v3](https://github.com/stashed/postgres/releases/tag/9.6.19-v3) + +- [5566a42](https://github.com/stashed/postgres/commit/5566a42) Prepare for release 9.6.19-v2 (#455) +- [12fdc1e](https://github.com/stashed/postgres/commit/12fdc1e) [cherry-pick] Update repository config (#440) (#450) +- [37b94e7](https://github.com/stashed/postgres/commit/37b94e7) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#429) (#438) +- [1e0dfd2](https://github.com/stashed/postgres/commit/1e0dfd2) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#419) (#428) + + +### [10.14.0-v3](https://github.com/stashed/postgres/releases/tag/10.14.0-v3) + +- [d8099e8](https://github.com/stashed/postgres/commit/d8099e8) Prepare for release 10.14.0-v2 (#451) +- [417588f](https://github.com/stashed/postgres/commit/417588f) [cherry-pick] Update repository config (#440) (#441) +- [f3d5e72](https://github.com/stashed/postgres/commit/f3d5e72) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#429) (#430) +- [ef24baf](https://github.com/stashed/postgres/commit/ef24baf) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#419) (#420) + + +### [11.9.0-v3](https://github.com/stashed/postgres/releases/tag/11.9.0-v3) + +- [32cd3b6](https://github.com/stashed/postgres/commit/32cd3b6) Prepare for release 11.9.0-v2 (#452) +- [eb0e3dd](https://github.com/stashed/postgres/commit/eb0e3dd) [cherry-pick] Update repository config (#440) (#446) +- [4df463b](https://github.com/stashed/postgres/commit/4df463b) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#429) (#435) +- [37dcb8a](https://github.com/stashed/postgres/commit/37dcb8a) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#419) (#425) + + +### [12.4.0-v3](https://github.com/stashed/postgres/releases/tag/12.4.0-v3) + +- [1d17c0a](https://github.com/stashed/postgres/commit/1d17c0a) Prepare for release 12.4.0-v2 (#453) +- [cae2a3d](https://github.com/stashed/postgres/commit/cae2a3d) [cherry-pick] Update repository config (#440) (#447) +- [4ddacb5](https://github.com/stashed/postgres/commit/4ddacb5) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#429) (#436) +- [b132bff](https://github.com/stashed/postgres/commit/b132bff) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#419) (#426) + + +### [13.1.0](https://github.com/stashed/postgres/releases/tag/13.1.0) + + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.11.7](https://github.com/stashed/stash/releases/tag/v0.11.7) + +- [0828afc8](https://github.com/stashed/stash/commit/0828afc8) Prepare for release v0.11.7 (#1269) +- [c05e0469](https://github.com/stashed/stash/commit/c05e0469) Skip new session if another is already running (#1264) +- [db1a2005](https://github.com/stashed/stash/commit/db1a2005) Fix failing E2E tests (#1256) +- [c3c2ae05](https://github.com/stashed/stash/commit/c3c2ae05) Update repository config (#1268) +- [daa95863](https://github.com/stashed/stash/commit/daa95863) Update Kubernetes v1.18.9 dependencies (#1254) +- [d33cf738](https://github.com/stashed/stash/commit/d33cf738) Update Kubernetes v1.18.9 dependencies (#1253) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2020.12.17.md b/content/docs/v2024.12.18/CHANGELOG-v2020.12.17.md new file mode 100644 index 0000000000..a601077d8a --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2020.12.17.md @@ -0,0 +1,506 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2020.12.17 + name: Changelog-v2020.12.17 + parent: welcome + weight: 20201217 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2020.12.17/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2020.12.17/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2020.12.17 (2020-12-17) + + +## [appscode/stash-enterprise](https://github.com/appscode/stash-enterprise) + +### [v0.11.8](https://github.com/appscode/stash-enterprise/releases/tag/v0.11.8) + +- [eccabd16](https://github.com/appscode/stash-enterprise/commit/eccabd16) Prepare for release v0.11.8 (#63) +- [1e03db14](https://github.com/appscode/stash-enterprise/commit/1e03db14) Update Kubernetes v1.18.9 dependencies (#61) +- [b3031f75](https://github.com/appscode/stash-enterprise/commit/b3031f75) Run backup job as user 65535 (#62) +- [f3207a94](https://github.com/appscode/stash-enterprise/commit/f3207a94) Fix secretTransforation for AppBinding (#60) +- [c7e3248f](https://github.com/appscode/stash-enterprise/commit/c7e3248f) Update CI workflow + + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.11.8](https://github.com/stashed/apimachinery/releases/tag/v0.11.8) + +- [cec1888a](https://github.com/stashed/apimachinery/commit/cec1888a) Update Kubernetes v1.18.9 dependencies (#74) +- [c7aed993](https://github.com/stashed/apimachinery/commit/c7aed993) Update Kubernetes v1.18.9 dependencies (#73) + + + +## [stashed/catalog](https://github.com/stashed/catalog) + +### [v2020.12.17](https://github.com/stashed/catalog/releases/tag/v2020.12.17) + +- [e8c931c](https://github.com/stashed/catalog/commit/e8c931c) Prepare for release v2020.12.17 (#50) +- [d169e34](https://github.com/stashed/catalog/commit/d169e34) Add MariaDB catalog + Cleanup (#48) +- [5dd2aa2](https://github.com/stashed/catalog/commit/5dd2aa2) Update repository config (#49) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.11.8](https://github.com/stashed/cli/releases/tag/v0.11.8) + +- [33bebfb](https://github.com/stashed/cli/commit/33bebfb) Prepare for release v0.11.8 (#97) +- [d343c7e](https://github.com/stashed/cli/commit/d343c7e) Update Kubernetes v1.18.9 dependencies (#96) +- [5a5069c](https://github.com/stashed/cli/commit/5a5069c) Update Kubernetes v1.18.9 dependencies (#95) +- [0b4b68b](https://github.com/stashed/cli/commit/0b4b68b) Update Kubernetes v1.18.9 dependencies (#94) +- [99cd366](https://github.com/stashed/cli/commit/99cd366) Update Kubernetes v1.18.9 dependencies (#93) +- [84f4f2f](https://github.com/stashed/cli/commit/84f4f2f) Update Kubernetes v1.18.9 dependencies (#92) +- [018b14a](https://github.com/stashed/cli/commit/018b14a) Update Kubernetes v1.18.9 dependencies (#91) +- [18ed3c6](https://github.com/stashed/cli/commit/18ed3c6) Update Kubernetes v1.18.9 dependencies (#90) +- [ad95cbe](https://github.com/stashed/cli/commit/ad95cbe) Update Kubernetes v1.18.9 dependencies (#89) +- [42ffef5](https://github.com/stashed/cli/commit/42ffef5) Update Kubernetes v1.18.9 dependencies (#88) +- [cb657bb](https://github.com/stashed/cli/commit/cb657bb) Update Kubernetes v1.18.9 dependencies (#87) +- [8853995](https://github.com/stashed/cli/commit/8853995) Update Kubernetes v1.18.9 dependencies (#86) +- [3af9028](https://github.com/stashed/cli/commit/3af9028) Update Kubernetes v1.18.9 dependencies (#85) +- [074c37b](https://github.com/stashed/cli/commit/074c37b) Update Kubernetes v1.18.9 dependencies (#84) +- [d08b872](https://github.com/stashed/cli/commit/d08b872) Update Kubernetes v1.18.9 dependencies (#83) +- [d9b1b93](https://github.com/stashed/cli/commit/d9b1b93) Update Kubernetes v1.18.9 dependencies (#82) +- [4e96e8e](https://github.com/stashed/cli/commit/4e96e8e) Update Kubernetes v1.18.9 dependencies (#81) +- [d38c1ba](https://github.com/stashed/cli/commit/d38c1ba) Update Kubernetes v1.18.9 dependencies (#80) +- [37c7d87](https://github.com/stashed/cli/commit/37c7d87) Update Kubernetes v1.18.9 dependencies (#79) +- [67ec7d1](https://github.com/stashed/cli/commit/67ec7d1) Update Kubernetes v1.18.9 dependencies (#78) +- [328763e](https://github.com/stashed/cli/commit/328763e) Update Kubernetes v1.18.9 dependencies (#77) +- [c8cfdab](https://github.com/stashed/cli/commit/c8cfdab) Update Kubernetes v1.18.9 dependencies (#76) +- [7354628](https://github.com/stashed/cli/commit/7354628) Update Kubernetes v1.18.9 dependencies (#75) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v5](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v5) + +- [7234135](https://github.com/stashed/elasticsearch/commit/7234135) Prepare for release 5.6.4-v5 (#498) +- [d9a692f](https://github.com/stashed/elasticsearch/commit/d9a692f) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#489) (#490) +- [3c96ea3](https://github.com/stashed/elasticsearch/commit/3c96ea3) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#480) (#481) +- [0a2e843](https://github.com/stashed/elasticsearch/commit/0a2e843) [cherry-pick] Update repository config (#471) (#472) +- [4165f8e](https://github.com/stashed/elasticsearch/commit/4165f8e) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#462) (#463) +- [acdac11](https://github.com/stashed/elasticsearch/commit/acdac11) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#453) (#454) + + +### [6.2.4-v5](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v5) + +- [7b78f9e](https://github.com/stashed/elasticsearch/commit/7b78f9e) Prepare for release 6.2.4-v5 (#499) +- [413434d](https://github.com/stashed/elasticsearch/commit/413434d) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#489) (#491) +- [7bdf655](https://github.com/stashed/elasticsearch/commit/7bdf655) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#480) (#482) +- [74f4c2c](https://github.com/stashed/elasticsearch/commit/74f4c2c) [cherry-pick] Update repository config (#471) (#473) +- [4248af4](https://github.com/stashed/elasticsearch/commit/4248af4) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#462) (#464) +- [197b7c5](https://github.com/stashed/elasticsearch/commit/197b7c5) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#453) (#455) + + +### [6.3.0-v5](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v5) + +- [1c2dd6f](https://github.com/stashed/elasticsearch/commit/1c2dd6f) Prepare for release 6.3.0-v5 (#500) +- [37e2fe8](https://github.com/stashed/elasticsearch/commit/37e2fe8) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#489) (#492) +- [c27a297](https://github.com/stashed/elasticsearch/commit/c27a297) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#480) (#483) +- [2df4955](https://github.com/stashed/elasticsearch/commit/2df4955) [cherry-pick] Update repository config (#471) (#474) +- [fe7cef6](https://github.com/stashed/elasticsearch/commit/fe7cef6) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#462) (#465) +- [d94cc74](https://github.com/stashed/elasticsearch/commit/d94cc74) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#453) (#456) + + +### [6.4.0-v5](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v5) + +- [28db07e](https://github.com/stashed/elasticsearch/commit/28db07e) Prepare for release 6.4.0-v5 (#501) +- [98936e6](https://github.com/stashed/elasticsearch/commit/98936e6) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#489) (#493) +- [11f03fa](https://github.com/stashed/elasticsearch/commit/11f03fa) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#480) (#484) +- [dc339aa](https://github.com/stashed/elasticsearch/commit/dc339aa) [cherry-pick] Update repository config (#471) (#475) +- [9b131a4](https://github.com/stashed/elasticsearch/commit/9b131a4) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#462) (#466) +- [16bb8b3](https://github.com/stashed/elasticsearch/commit/16bb8b3) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#453) (#457) + + +### [6.5.3-v5](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v5) + +- [acf444e](https://github.com/stashed/elasticsearch/commit/acf444e) Prepare for release 6.5.3-v5 (#502) +- [d1c4849](https://github.com/stashed/elasticsearch/commit/d1c4849) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#489) (#494) +- [668c97a](https://github.com/stashed/elasticsearch/commit/668c97a) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#480) (#485) +- [e25a596](https://github.com/stashed/elasticsearch/commit/e25a596) [cherry-pick] Update repository config (#471) (#476) +- [0567419](https://github.com/stashed/elasticsearch/commit/0567419) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#462) (#467) +- [0b99e60](https://github.com/stashed/elasticsearch/commit/0b99e60) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#453) (#458) + + +### [6.8.0-v5](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v5) + +- [8959fd4](https://github.com/stashed/elasticsearch/commit/8959fd4) Prepare for release 6.8.0-v5 (#503) +- [6772e20](https://github.com/stashed/elasticsearch/commit/6772e20) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#489) (#495) +- [68127a5](https://github.com/stashed/elasticsearch/commit/68127a5) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#480) (#486) +- [cda62d0](https://github.com/stashed/elasticsearch/commit/cda62d0) [cherry-pick] Update repository config (#471) (#477) +- [3357ece](https://github.com/stashed/elasticsearch/commit/3357ece) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#462) (#468) +- [fcfbb43](https://github.com/stashed/elasticsearch/commit/fcfbb43) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#453) (#459) + + +### [7.2.0-v5](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v5) + +- [2d738a4](https://github.com/stashed/elasticsearch/commit/2d738a4) Prepare for release 7.2.0-v5 (#504) +- [b943b7e](https://github.com/stashed/elasticsearch/commit/b943b7e) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#489) (#496) +- [cfb5023](https://github.com/stashed/elasticsearch/commit/cfb5023) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#480) (#487) +- [551eb3b](https://github.com/stashed/elasticsearch/commit/551eb3b) [cherry-pick] Update repository config (#471) (#478) +- [df007da](https://github.com/stashed/elasticsearch/commit/df007da) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#462) (#469) +- [c218201](https://github.com/stashed/elasticsearch/commit/c218201) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#453) (#460) + + +### [7.3.2-v5](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v5) + +- [04e1f4f](https://github.com/stashed/elasticsearch/commit/04e1f4f) Prepare for release 7.3.2-v5 (#505) +- [ea147c5](https://github.com/stashed/elasticsearch/commit/ea147c5) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#489) (#497) +- [893cfea](https://github.com/stashed/elasticsearch/commit/893cfea) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#480) (#488) +- [f3ed4bf](https://github.com/stashed/elasticsearch/commit/f3ed4bf) [cherry-pick] Update repository config (#471) (#479) +- [cb65c92](https://github.com/stashed/elasticsearch/commit/cb65c92) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#462) (#470) +- [a3d520e](https://github.com/stashed/elasticsearch/commit/a3d520e) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#453) (#461) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v0.11.8](https://github.com/stashed/installer/releases/tag/v0.11.8) + +- [c2c8362](https://github.com/stashed/installer/commit/c2c8362) Prepare for release v0.11.8 (#132) +- [ae8900a](https://github.com/stashed/installer/commit/ae8900a) Speed up schema generation process (#131) +- [262e0b5](https://github.com/stashed/installer/commit/262e0b5) Update repository config (#130) +- [05f9e82](https://github.com/stashed/installer/commit/05f9e82) Delete DCO +- [abaf344](https://github.com/stashed/installer/commit/abaf344) Update Kubernetes v1.18.9 dependencies (#129) +- [2d928b1](https://github.com/stashed/installer/commit/2d928b1) Use apiregistration.k8s.io/v1 (#128) + + + +## [stashed/mariadb](https://github.com/stashed/mariadb) + +### [10.5.8](https://github.com/stashed/mariadb/releases/tag/10.5.8) + +- [c11b255](https://github.com/stashed/mariadb/commit/c11b255) Prepare for release 10.5.8 (#38) +- [2cc62f5](https://github.com/stashed/mariadb/commit/2cc62f5) [cherry-pick] Update chart-contents target (#37) +- [1d99e4d](https://github.com/stashed/mariadb/commit/1d99e4d) Add support for MariaDB 10.5.8 (#14) +- [484a8be](https://github.com/stashed/mariadb/commit/484a8be) Update Kubernetes v1.18.9 dependencies (#36) +- [8e51d89](https://github.com/stashed/mariadb/commit/8e51d89) Update Kubernetes v1.18.9 dependencies (#35) +- [f28b38c](https://github.com/stashed/mariadb/commit/f28b38c) Update Kubernetes v1.18.9 dependencies (#34) +- [6bb158b](https://github.com/stashed/mariadb/commit/6bb158b) Update Kubernetes v1.18.9 dependencies (#33) +- [96a2f9c](https://github.com/stashed/mariadb/commit/96a2f9c) Update Kubernetes v1.18.9 dependencies (#32) +- [9c039e1](https://github.com/stashed/mariadb/commit/9c039e1) Update Kubernetes v1.18.9 dependencies (#31) +- [cc724ca](https://github.com/stashed/mariadb/commit/cc724ca) Update Kubernetes v1.18.9 dependencies (#30) +- [efae597](https://github.com/stashed/mariadb/commit/efae597) Update Kubernetes v1.18.9 dependencies (#29) +- [90fd790](https://github.com/stashed/mariadb/commit/90fd790) Update Kubernetes v1.18.9 dependencies (#28) +- [ac68465](https://github.com/stashed/mariadb/commit/ac68465) Update Kubernetes v1.18.9 dependencies (#27) +- [ba7af92](https://github.com/stashed/mariadb/commit/ba7af92) Update Kubernetes v1.18.9 dependencies (#26) +- [3b6c2c7](https://github.com/stashed/mariadb/commit/3b6c2c7) Update Kubernetes v1.18.9 dependencies (#25) +- [9c9c161](https://github.com/stashed/mariadb/commit/9c9c161) Update Kubernetes v1.18.9 dependencies (#24) +- [bf87299](https://github.com/stashed/mariadb/commit/bf87299) Update Kubernetes v1.18.9 dependencies (#23) +- [947a95f](https://github.com/stashed/mariadb/commit/947a95f) Update Kubernetes v1.18.9 dependencies (#22) +- [7588fc3](https://github.com/stashed/mariadb/commit/7588fc3) Update Kubernetes v1.18.9 dependencies (#21) +- [669416e](https://github.com/stashed/mariadb/commit/669416e) Update Kubernetes v1.18.9 dependencies (#20) +- [c0d2ac5](https://github.com/stashed/mariadb/commit/c0d2ac5) Update Kubernetes v1.18.9 dependencies (#19) +- [798dd36](https://github.com/stashed/mariadb/commit/798dd36) Update Kubernetes v1.18.9 dependencies (#18) +- [1648324](https://github.com/stashed/mariadb/commit/1648324) Update Kubernetes v1.18.9 dependencies (#17) +- [6593603](https://github.com/stashed/mariadb/commit/6593603) Update Kubernetes v1.18.9 dependencies (#16) +- [aa36f3c](https://github.com/stashed/mariadb/commit/aa36f3c) Update Kubernetes v1.18.9 dependencies (#15) +- [15d9947](https://github.com/stashed/mariadb/commit/15d9947) Update Kubernetes v1.18.9 dependencies (#13) +- [479ca8d](https://github.com/stashed/mariadb/commit/479ca8d) Update Kubernetes v1.18.9 dependencies (#12) +- [ce73357](https://github.com/stashed/mariadb/commit/ce73357) Update Kubernetes v1.18.9 dependencies (#10) +- [43c3ec2](https://github.com/stashed/mariadb/commit/43c3ec2) Update repository config (#11) +- [00cd391](https://github.com/stashed/mariadb/commit/00cd391) Update Kubernetes v1.18.9 dependencies (#9) +- [aea5290](https://github.com/stashed/mariadb/commit/aea5290) Update Kubernetes v1.18.9 dependencies (#8) +- [bfff9f8](https://github.com/stashed/mariadb/commit/bfff9f8) Update Kubernetes v1.18.9 dependencies (#7) +- [d8181c8](https://github.com/stashed/mariadb/commit/d8181c8) Update Kubernetes v1.18.9 dependencies (#6) +- [fa64213](https://github.com/stashed/mariadb/commit/fa64213) Update Kubernetes v1.18.9 dependencies (#5) +- [d1bd8a2](https://github.com/stashed/mariadb/commit/d1bd8a2) Update Kubernetes v1.18.9 dependencies (#4) +- [1b64d94](https://github.com/stashed/mariadb/commit/1b64d94) Update repository config (#3) +- [bac09d7](https://github.com/stashed/mariadb/commit/bac09d7) Update repository config (#2) +- [8769371](https://github.com/stashed/mariadb/commit/8769371) Update Kubernetes v1.18.9 dependencies (#1) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v5](https://github.com/stashed/mongodb/releases/tag/3.4.17-v5) + +- [8446da57](https://github.com/stashed/mongodb/commit/8446da57) Prepare for release 3.4.17-v5 (#651) +- [e53bd66b](https://github.com/stashed/mongodb/commit/e53bd66b) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#639) (#640) +- [164a0550](https://github.com/stashed/mongodb/commit/164a0550) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#627) (#628) +- [ffd89381](https://github.com/stashed/mongodb/commit/ffd89381) [cherry-pick] Update repository config (#615) (#616) +- [038d3800](https://github.com/stashed/mongodb/commit/038d3800) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#603) (#604) +- [6b8d1b1c](https://github.com/stashed/mongodb/commit/6b8d1b1c) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#591) (#592) + + +### [3.4.22-v5](https://github.com/stashed/mongodb/releases/tag/3.4.22-v5) + +- [e33853a9](https://github.com/stashed/mongodb/commit/e33853a9) Prepare for release 3.4.22-v5 (#652) +- [9acaefc6](https://github.com/stashed/mongodb/commit/9acaefc6) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#639) (#641) +- [814695e2](https://github.com/stashed/mongodb/commit/814695e2) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#627) (#629) +- [49b00083](https://github.com/stashed/mongodb/commit/49b00083) [cherry-pick] Update repository config (#615) (#617) +- [27ba40d3](https://github.com/stashed/mongodb/commit/27ba40d3) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#603) (#605) +- [297d6932](https://github.com/stashed/mongodb/commit/297d6932) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#591) (#593) + + +### [3.6.8-v5](https://github.com/stashed/mongodb/releases/tag/3.6.8-v5) + +- [31c09024](https://github.com/stashed/mongodb/commit/31c09024) Prepare for release 3.6.8-v5 (#654) +- [e8bbdad4](https://github.com/stashed/mongodb/commit/e8bbdad4) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#639) (#643) +- [0623cd6b](https://github.com/stashed/mongodb/commit/0623cd6b) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#627) (#631) +- [e04c6e4d](https://github.com/stashed/mongodb/commit/e04c6e4d) [cherry-pick] Update repository config (#615) (#619) +- [cbb64bcd](https://github.com/stashed/mongodb/commit/cbb64bcd) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#603) (#607) +- [4485a5d4](https://github.com/stashed/mongodb/commit/4485a5d4) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#591) (#595) + + +### [3.6.13-v5](https://github.com/stashed/mongodb/releases/tag/3.6.13-v5) + +- [b6204090](https://github.com/stashed/mongodb/commit/b6204090) Prepare for release 3.6.13-v5 (#653) +- [4be9caa1](https://github.com/stashed/mongodb/commit/4be9caa1) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#639) (#642) +- [d22abaa0](https://github.com/stashed/mongodb/commit/d22abaa0) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#627) (#630) +- [54bd4ef2](https://github.com/stashed/mongodb/commit/54bd4ef2) [cherry-pick] Update repository config (#615) (#618) +- [73a1b87a](https://github.com/stashed/mongodb/commit/73a1b87a) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#603) (#606) +- [929b7d9f](https://github.com/stashed/mongodb/commit/929b7d9f) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#591) (#594) + + +### [4.0.3-v5](https://github.com/stashed/mongodb/releases/tag/4.0.3-v5) + +- [7a9825fa](https://github.com/stashed/mongodb/commit/7a9825fa) Prepare for release 4.0.3-v5 (#656) +- [8e266e3f](https://github.com/stashed/mongodb/commit/8e266e3f) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#639) (#645) +- [33b24502](https://github.com/stashed/mongodb/commit/33b24502) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#627) (#633) +- [a3f42c8c](https://github.com/stashed/mongodb/commit/a3f42c8c) [cherry-pick] Update repository config (#615) (#621) +- [9a28fdd3](https://github.com/stashed/mongodb/commit/9a28fdd3) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#603) (#609) +- [450dbfe1](https://github.com/stashed/mongodb/commit/450dbfe1) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#591) (#597) + + +### [4.0.5-v5](https://github.com/stashed/mongodb/releases/tag/4.0.5-v5) + +- [2b4d6c0b](https://github.com/stashed/mongodb/commit/2b4d6c0b) Prepare for release 4.0.5-v5 (#657) +- [1532c3c3](https://github.com/stashed/mongodb/commit/1532c3c3) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#639) (#646) +- [aa601ec9](https://github.com/stashed/mongodb/commit/aa601ec9) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#627) (#634) +- [9b423801](https://github.com/stashed/mongodb/commit/9b423801) [cherry-pick] Update repository config (#615) (#622) +- [81ae1857](https://github.com/stashed/mongodb/commit/81ae1857) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#603) (#610) +- [d4ecdf06](https://github.com/stashed/mongodb/commit/d4ecdf06) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#591) (#598) + + +### [4.0.11-v5](https://github.com/stashed/mongodb/releases/tag/4.0.11-v5) + +- [3d58d128](https://github.com/stashed/mongodb/commit/3d58d128) Prepare for release 4.0.11-v5 (#655) +- [3efd27ec](https://github.com/stashed/mongodb/commit/3efd27ec) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#639) (#644) +- [0700bb03](https://github.com/stashed/mongodb/commit/0700bb03) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#627) (#632) +- [214b8f02](https://github.com/stashed/mongodb/commit/214b8f02) [cherry-pick] Update repository config (#615) (#620) +- [adea0e7e](https://github.com/stashed/mongodb/commit/adea0e7e) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#603) (#608) +- [52d070a0](https://github.com/stashed/mongodb/commit/52d070a0) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#591) (#596) + + +### [4.1.4-v5](https://github.com/stashed/mongodb/releases/tag/4.1.4-v5) + +- [d3efc3b9](https://github.com/stashed/mongodb/commit/d3efc3b9) Prepare for release 4.1.4-v5 (#659) +- [e5ad51d9](https://github.com/stashed/mongodb/commit/e5ad51d9) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#639) (#648) +- [1a71cc31](https://github.com/stashed/mongodb/commit/1a71cc31) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#627) (#636) +- [f8f9f1f8](https://github.com/stashed/mongodb/commit/f8f9f1f8) [cherry-pick] Update repository config (#615) (#624) +- [f548d611](https://github.com/stashed/mongodb/commit/f548d611) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#603) (#612) +- [ffd16236](https://github.com/stashed/mongodb/commit/ffd16236) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#591) (#600) + + +### [4.1.7-v5](https://github.com/stashed/mongodb/releases/tag/4.1.7-v5) + +- [09645ca2](https://github.com/stashed/mongodb/commit/09645ca2) Prepare for release 4.1.7-v5 (#660) +- [4c1eb210](https://github.com/stashed/mongodb/commit/4c1eb210) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#639) (#649) +- [a4848e57](https://github.com/stashed/mongodb/commit/a4848e57) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#627) (#637) +- [63ea5b9e](https://github.com/stashed/mongodb/commit/63ea5b9e) [cherry-pick] Update repository config (#615) (#625) +- [826348c4](https://github.com/stashed/mongodb/commit/826348c4) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#603) (#613) +- [64abe141](https://github.com/stashed/mongodb/commit/64abe141) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#591) (#601) + + +### [4.1.13-v5](https://github.com/stashed/mongodb/releases/tag/4.1.13-v5) + +- [f9985076](https://github.com/stashed/mongodb/commit/f9985076) Prepare for release 4.1.13-v5 (#658) +- [271f7b13](https://github.com/stashed/mongodb/commit/271f7b13) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#639) (#647) +- [0598642c](https://github.com/stashed/mongodb/commit/0598642c) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#627) (#635) +- [d0e3ffd7](https://github.com/stashed/mongodb/commit/d0e3ffd7) [cherry-pick] Update repository config (#615) (#623) +- [21981a19](https://github.com/stashed/mongodb/commit/21981a19) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#603) (#611) +- [4213d19d](https://github.com/stashed/mongodb/commit/4213d19d) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#591) (#599) + + +### [4.2.3-v5](https://github.com/stashed/mongodb/releases/tag/4.2.3-v5) + +- [dc344fb3](https://github.com/stashed/mongodb/commit/dc344fb3) Prepare for release 4.2.3-v5 (#661) +- [451544f4](https://github.com/stashed/mongodb/commit/451544f4) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#639) (#650) +- [499bdd68](https://github.com/stashed/mongodb/commit/499bdd68) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#627) (#638) +- [f60aff42](https://github.com/stashed/mongodb/commit/f60aff42) [cherry-pick] Update repository config (#615) (#626) +- [54755039](https://github.com/stashed/mongodb/commit/54755039) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#603) (#614) +- [ad73a841](https://github.com/stashed/mongodb/commit/ad73a841) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#591) (#602) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v5](https://github.com/stashed/mysql/releases/tag/5.7.25-v5) + +- [5561dce](https://github.com/stashed/mysql/commit/5561dce) Prepare for release 5.7.25-v5 (#246) +- [7b380f0](https://github.com/stashed/mysql/commit/7b380f0) Use port from the AppBinding (#234) (#243) +- [3ea5fc8](https://github.com/stashed/mysql/commit/3ea5fc8) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#239) (#240) +- [7dcd320](https://github.com/stashed/mysql/commit/7dcd320) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#235) (#236) +- [ea65a68](https://github.com/stashed/mysql/commit/ea65a68) [cherry-pick] Update repository config (#230) (#231) +- [ba47f47](https://github.com/stashed/mysql/commit/ba47f47) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#226) (#227) +- [775ff72](https://github.com/stashed/mysql/commit/775ff72) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#222) (#223) + + +### [8.0.3-v5](https://github.com/stashed/mysql/releases/tag/8.0.3-v5) + +- [800f3da](https://github.com/stashed/mysql/commit/800f3da) Prepare for release 8.0.3-v5 (#248) +- [74da539](https://github.com/stashed/mysql/commit/74da539) Use port from the AppBinding (#234) (#245) +- [30852a5](https://github.com/stashed/mysql/commit/30852a5) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#239) (#242) +- [de0721c](https://github.com/stashed/mysql/commit/de0721c) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#235) (#238) +- [6dd1480](https://github.com/stashed/mysql/commit/6dd1480) [cherry-pick] Update repository config (#230) (#233) +- [bdf4d17](https://github.com/stashed/mysql/commit/bdf4d17) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#226) (#229) +- [b404222](https://github.com/stashed/mysql/commit/b404222) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#222) (#225) + + +### [8.0.14-v5](https://github.com/stashed/mysql/releases/tag/8.0.14-v5) + +- [1393938](https://github.com/stashed/mysql/commit/1393938) Prepare for release 8.0.14-v5 (#247) +- [672cea7](https://github.com/stashed/mysql/commit/672cea7) Use port from the AppBinding (#234) (#244) +- [1a04a62](https://github.com/stashed/mysql/commit/1a04a62) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#239) (#241) +- [dd88423](https://github.com/stashed/mysql/commit/dd88423) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#235) (#237) +- [890f0f1](https://github.com/stashed/mysql/commit/890f0f1) [cherry-pick] Update repository config (#230) (#232) +- [0868321](https://github.com/stashed/mysql/commit/0868321) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#226) (#228) +- [616dec4](https://github.com/stashed/mysql/commit/616dec4) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#222) (#224) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7.0-v1](https://github.com/stashed/percona-xtradb/releases/tag/5.7.0-v1) + +- [3e48d47](https://github.com/stashed/percona-xtradb/commit/3e48d47) Prepare for release 5.7.0-v1 (#126) +- [42458b3](https://github.com/stashed/percona-xtradb/commit/42458b3) Use port from AppBinding (#120) (#125) +- [70d872d](https://github.com/stashed/percona-xtradb/commit/70d872d) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#123) (#124) +- [2927d77](https://github.com/stashed/percona-xtradb/commit/2927d77) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#121) (#122) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v4](https://github.com/stashed/postgres/releases/tag/9.6.19-v4) + +- [ef4d4e8](https://github.com/stashed/postgres/commit/ef4d4e8) Prepare for release 9.6.19-v4 (#499) +- [6702c39](https://github.com/stashed/postgres/commit/6702c39) Use port from AppBinding (#461) (#494) +- [36c0904](https://github.com/stashed/postgres/commit/36c0904) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#474) (#484) +- [6903ab9](https://github.com/stashed/postgres/commit/6903ab9) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#462) (#472) + + +### [10.14.0-v4](https://github.com/stashed/postgres/releases/tag/10.14.0-v4) + +- [110a97f](https://github.com/stashed/postgres/commit/110a97f) Prepare for release 10.14.0-v4 (#495) +- [0b3138c](https://github.com/stashed/postgres/commit/0b3138c) Use port from AppBinding (#461) (#485) +- [1676e80](https://github.com/stashed/postgres/commit/1676e80) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#474) (#475) +- [98e3e77](https://github.com/stashed/postgres/commit/98e3e77) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#462) (#463) + + +### [11.9.0-v4](https://github.com/stashed/postgres/releases/tag/11.9.0-v4) + +- [719b8d1](https://github.com/stashed/postgres/commit/719b8d1) Prepare for release 11.9.0-v4 (#496) +- [723403f](https://github.com/stashed/postgres/commit/723403f) Use port from AppBinding (#461) (#490) +- [8b973a4](https://github.com/stashed/postgres/commit/8b973a4) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#474) (#480) +- [726a5fa](https://github.com/stashed/postgres/commit/726a5fa) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#462) (#468) + + +### [12.4.0-v4](https://github.com/stashed/postgres/releases/tag/12.4.0-v4) + +- [652db84](https://github.com/stashed/postgres/commit/652db84) Prepare for release 12.4.0-v4 (#497) +- [12cf759](https://github.com/stashed/postgres/commit/12cf759) Use port from AppBinding (#461) (#491) +- [c4f5823](https://github.com/stashed/postgres/commit/c4f5823) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#474) (#481) +- [413d475](https://github.com/stashed/postgres/commit/413d475) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#462) (#469) + + +### [13.1.0-v1](https://github.com/stashed/postgres/releases/tag/13.1.0-v1) + +- [e384f2f](https://github.com/stashed/postgres/commit/e384f2f) Prepare for release 13.1.0-v1 (#498) +- [5725c15](https://github.com/stashed/postgres/commit/5725c15) Use port from AppBinding (#461) (#492) +- [531f932](https://github.com/stashed/postgres/commit/531f932) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#474) (#482) +- [e974cca](https://github.com/stashed/postgres/commit/e974cca) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#462) (#470) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.11.8](https://github.com/stashed/stash/releases/tag/v0.11.8) + +- [d06c4f1d](https://github.com/stashed/stash/commit/d06c4f1d) Prepare for release v0.11.8 (#1287) +- [14dfff22](https://github.com/stashed/stash/commit/14dfff22) Run backup job as user 65535 (#1284) +- [2379c0f8](https://github.com/stashed/stash/commit/2379c0f8) Fix secretTransformation for AppBinding (#1274) +- [88c71b23](https://github.com/stashed/stash/commit/88c71b23) Update repository config (#1285) +- [0667b421](https://github.com/stashed/stash/commit/0667b421) Update Kubernetes v1.18.9 dependencies (#1283) +- [c01a1c95](https://github.com/stashed/stash/commit/c01a1c95) Update Kubernetes v1.18.9 dependencies (#1277) +- [e953c0af](https://github.com/stashed/stash/commit/e953c0af) Use build, config, Kubernetes jobs for e2e workflow + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2021.01.21.md b/content/docs/v2024.12.18/CHANGELOG-v2021.01.21.md new file mode 100644 index 0000000000..4b3ba7f688 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2021.01.21.md @@ -0,0 +1,307 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2021.01.21 + name: Changelog-v2021.01.21 + parent: welcome + weight: 20210121 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2021.01.21/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2021.01.21/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2021.01.21 (2021-01-22) + + +## [appscode/stash-enterprise](https://github.com/appscode/stash-enterprise) + +### [v0.11.9](https://github.com/appscode/stash-enterprise/releases/tag/v0.11.9) + +- [88d87727](https://github.com/appscode/stash-enterprise/commit/88d87727) Prepare for release v0.11.9 (#68) +- [bb802f88](https://github.com/appscode/stash-enterprise/commit/bb802f88) Update repository config (#66) +- [52c63a81](https://github.com/appscode/stash-enterprise/commit/52c63a81) Update portforwarding api (#64) + + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.11.9](https://github.com/stashed/apimachinery/releases/tag/v0.11.9) + +- [bb631c73](https://github.com/stashed/apimachinery/commit/bb631c73) Update repository config (#80) +- [d8cd6413](https://github.com/stashed/apimachinery/commit/d8cd6413) Update repository config (#79) +- [0388c111](https://github.com/stashed/apimachinery/commit/0388c111) Update Kubernetes v1.18.9 dependencies (#78) +- [10606b14](https://github.com/stashed/apimachinery/commit/10606b14) Update Kubernetes v1.18.9 dependencies (#77) +- [04f9e8bf](https://github.com/stashed/apimachinery/commit/04f9e8bf) Update Kubernetes v1.18.9 dependencies (#76) + + + +## [stashed/catalog](https://github.com/stashed/catalog) + +### [v2021.01.21](https://github.com/stashed/catalog/releases/tag/v2021.01.21) + +- [9b678ea](https://github.com/stashed/catalog/commit/9b678ea) Prepare for release v2021.01.21 (#52) +- [6a227fe](https://github.com/stashed/catalog/commit/6a227fe) Update repository config (#51) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.11.9](https://github.com/stashed/cli/releases/tag/v0.11.9) + +- [0551150](https://github.com/stashed/cli/commit/0551150) Prepare for release v0.11.9 (#103) +- [d6217c0](https://github.com/stashed/cli/commit/d6217c0) Update repository config (#102) +- [3998037](https://github.com/stashed/cli/commit/3998037) Update repository config (#101) +- [1ed5ff3](https://github.com/stashed/cli/commit/1ed5ff3) Update Kubernetes v1.18.9 dependencies (#100) +- [beccb98](https://github.com/stashed/cli/commit/beccb98) Update Kubernetes v1.18.9 dependencies (#99) +- [626d3ba](https://github.com/stashed/cli/commit/626d3ba) Update Kubernetes v1.18.9 dependencies (#98) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v6](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v6) + +- [08922c3](https://github.com/stashed/elasticsearch/commit/08922c3) Prepare for release 5.6.4-v6 (#579) +- [069a5ab](https://github.com/stashed/elasticsearch/commit/069a5ab) [cherry-pick] Update repository config (#570) (#571) +- [0d4ced1](https://github.com/stashed/elasticsearch/commit/0d4ced1) [cherry-pick] Update repository config (#561) (#562) +- [ac1bcc6](https://github.com/stashed/elasticsearch/commit/ac1bcc6) [cherry-pick] Use node:14-alpine as base image (#552) (#553) +- [0dab1a8](https://github.com/stashed/elasticsearch/commit/0dab1a8) [cherry-pick] Use BasicAuth Keys for reading credentials from secret (#543) (#544) +- [34d300d](https://github.com/stashed/elasticsearch/commit/34d300d) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#534) (#535) +- [0343edd](https://github.com/stashed/elasticsearch/commit/0343edd) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#525) (#526) +- [11fa1fd](https://github.com/stashed/elasticsearch/commit/11fa1fd) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#516) (#517) +- [b7777f3](https://github.com/stashed/elasticsearch/commit/b7777f3) [cherry-pick] Speed up schema generation process (#507) (#508) + + +### [6.2.4-v6](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v6) + +- [bf5a0fa](https://github.com/stashed/elasticsearch/commit/bf5a0fa) Prepare for release 6.2.4-v6 (#580) +- [9e6d280](https://github.com/stashed/elasticsearch/commit/9e6d280) [cherry-pick] Update repository config (#570) (#572) +- [df5cce2](https://github.com/stashed/elasticsearch/commit/df5cce2) [cherry-pick] Update repository config (#561) (#563) +- [b3d40ce](https://github.com/stashed/elasticsearch/commit/b3d40ce) [cherry-pick] Use node:14-alpine as base image (#552) (#554) +- [70b5f27](https://github.com/stashed/elasticsearch/commit/70b5f27) [cherry-pick] Use BasicAuth Keys for reading credentials from secret (#543) (#545) +- [ec498f7](https://github.com/stashed/elasticsearch/commit/ec498f7) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#534) (#536) +- [e819869](https://github.com/stashed/elasticsearch/commit/e819869) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#525) (#527) +- [dfa8a1e](https://github.com/stashed/elasticsearch/commit/dfa8a1e) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#516) (#518) +- [7e3f45c](https://github.com/stashed/elasticsearch/commit/7e3f45c) [cherry-pick] Speed up schema generation process (#507) (#509) + + +### [6.3.0-v6](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v6) + +- [e3e1afa](https://github.com/stashed/elasticsearch/commit/e3e1afa) Prepare for release 6.3.0-v6 (#581) +- [8c75683](https://github.com/stashed/elasticsearch/commit/8c75683) [cherry-pick] Update repository config (#570) (#573) +- [31557a4](https://github.com/stashed/elasticsearch/commit/31557a4) [cherry-pick] Update repository config (#561) (#564) +- [059f6ec](https://github.com/stashed/elasticsearch/commit/059f6ec) [cherry-pick] Use node:14-alpine as base image (#552) (#555) +- [87c4718](https://github.com/stashed/elasticsearch/commit/87c4718) [cherry-pick] Use BasicAuth Keys for reading credentials from secret (#543) (#546) +- [5cb8af6](https://github.com/stashed/elasticsearch/commit/5cb8af6) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#534) (#537) +- [6857924](https://github.com/stashed/elasticsearch/commit/6857924) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#525) (#528) +- [4f4114f](https://github.com/stashed/elasticsearch/commit/4f4114f) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#516) (#519) +- [0f18d62](https://github.com/stashed/elasticsearch/commit/0f18d62) [cherry-pick] Speed up schema generation process (#507) (#510) + + +### [6.4.0-v6](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v6) + +- [06e4dc6](https://github.com/stashed/elasticsearch/commit/06e4dc6) Prepare for release 6.4.0-v6 (#582) +- [7eb1e44](https://github.com/stashed/elasticsearch/commit/7eb1e44) [cherry-pick] Update repository config (#570) (#574) +- [30d0a80](https://github.com/stashed/elasticsearch/commit/30d0a80) [cherry-pick] Update repository config (#561) (#565) +- [954e23a](https://github.com/stashed/elasticsearch/commit/954e23a) [cherry-pick] Use node:14-alpine as base image (#552) (#556) +- [140abce](https://github.com/stashed/elasticsearch/commit/140abce) [cherry-pick] Use BasicAuth Keys for reading credentials from secret (#543) (#547) +- [dfcd94b](https://github.com/stashed/elasticsearch/commit/dfcd94b) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#534) (#538) +- [2eea2d2](https://github.com/stashed/elasticsearch/commit/2eea2d2) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#525) (#529) +- [d73b741](https://github.com/stashed/elasticsearch/commit/d73b741) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#516) (#520) +- [df6fd5c](https://github.com/stashed/elasticsearch/commit/df6fd5c) [cherry-pick] Speed up schema generation process (#507) (#511) + + +### [6.5.3-v6](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v6) + +- [0a497b5](https://github.com/stashed/elasticsearch/commit/0a497b5) Prepare for release 6.5.3-v6 (#583) +- [5bc7e7c](https://github.com/stashed/elasticsearch/commit/5bc7e7c) [cherry-pick] Update repository config (#570) (#575) +- [76e4df1](https://github.com/stashed/elasticsearch/commit/76e4df1) [cherry-pick] Update repository config (#561) (#566) +- [8fe2314](https://github.com/stashed/elasticsearch/commit/8fe2314) [cherry-pick] Use node:14-alpine as base image (#552) (#557) +- [20c0eda](https://github.com/stashed/elasticsearch/commit/20c0eda) [cherry-pick] Use BasicAuth Keys for reading credentials from secret (#543) (#548) +- [a567dc8](https://github.com/stashed/elasticsearch/commit/a567dc8) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#534) (#539) +- [7d00d9c](https://github.com/stashed/elasticsearch/commit/7d00d9c) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#525) (#530) +- [28df759](https://github.com/stashed/elasticsearch/commit/28df759) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#516) (#521) +- [287c59c](https://github.com/stashed/elasticsearch/commit/287c59c) [cherry-pick] Speed up schema generation process (#507) (#512) + + +### [6.8.0-v6](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v6) + +- [0c64799](https://github.com/stashed/elasticsearch/commit/0c64799) Prepare for release 6.8.0-v6 (#584) +- [da93602](https://github.com/stashed/elasticsearch/commit/da93602) [cherry-pick] Update repository config (#570) (#576) +- [197dd2f](https://github.com/stashed/elasticsearch/commit/197dd2f) [cherry-pick] Update repository config (#561) (#567) +- [abd7a78](https://github.com/stashed/elasticsearch/commit/abd7a78) [cherry-pick] Use node:14-alpine as base image (#552) (#558) +- [c942e6d](https://github.com/stashed/elasticsearch/commit/c942e6d) [cherry-pick] Use BasicAuth Keys for reading credentials from secret (#543) (#549) +- [847e41d](https://github.com/stashed/elasticsearch/commit/847e41d) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#534) (#540) +- [146df5e](https://github.com/stashed/elasticsearch/commit/146df5e) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#525) (#531) +- [74ebe8f](https://github.com/stashed/elasticsearch/commit/74ebe8f) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#516) (#522) +- [382939e](https://github.com/stashed/elasticsearch/commit/382939e) [cherry-pick] Speed up schema generation process (#507) (#513) + + +### [7.2.0-v6](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v6) + +- [0e6c708](https://github.com/stashed/elasticsearch/commit/0e6c708) Prepare for release 7.2.0-v6 (#585) +- [0da54b1](https://github.com/stashed/elasticsearch/commit/0da54b1) [cherry-pick] Update repository config (#570) (#577) +- [0818310](https://github.com/stashed/elasticsearch/commit/0818310) [cherry-pick] Update repository config (#561) (#568) +- [cd2f4e8](https://github.com/stashed/elasticsearch/commit/cd2f4e8) [cherry-pick] Use node:14-alpine as base image (#552) (#559) +- [803f2bc](https://github.com/stashed/elasticsearch/commit/803f2bc) [cherry-pick] Use BasicAuth Keys for reading credentials from secret (#543) (#550) +- [1ed55e0](https://github.com/stashed/elasticsearch/commit/1ed55e0) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#534) (#541) +- [6e65169](https://github.com/stashed/elasticsearch/commit/6e65169) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#525) (#532) +- [6ba13ae](https://github.com/stashed/elasticsearch/commit/6ba13ae) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#516) (#523) +- [c37730e](https://github.com/stashed/elasticsearch/commit/c37730e) [cherry-pick] Speed up schema generation process (#507) (#514) + + +### [7.3.2-v6](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v6) + +- [2767117](https://github.com/stashed/elasticsearch/commit/2767117) Prepare for release 7.3.2-v6 (#586) +- [ce0a302](https://github.com/stashed/elasticsearch/commit/ce0a302) [cherry-pick] Update repository config (#570) (#578) +- [01aefe2](https://github.com/stashed/elasticsearch/commit/01aefe2) [cherry-pick] Update repository config (#561) (#569) +- [3b50d61](https://github.com/stashed/elasticsearch/commit/3b50d61) [cherry-pick] Use node:14-alpine as base image (#552) (#560) +- [b7525e1](https://github.com/stashed/elasticsearch/commit/b7525e1) [cherry-pick] Use BasicAuth Keys for reading credentials from secret (#543) (#551) +- [68591ee](https://github.com/stashed/elasticsearch/commit/68591ee) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#534) (#542) +- [a14eb3e](https://github.com/stashed/elasticsearch/commit/a14eb3e) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#525) (#533) +- [ef63f91](https://github.com/stashed/elasticsearch/commit/ef63f91) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#516) (#524) +- [4eb60cb](https://github.com/stashed/elasticsearch/commit/4eb60cb) [cherry-pick] Speed up schema generation process (#507) (#515) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v0.11.9](https://github.com/stashed/installer/releases/tag/v0.11.9) + +- [297af47](https://github.com/stashed/installer/commit/297af47) Prepare for release v0.11.9 (#135) +- [9182697](https://github.com/stashed/installer/commit/9182697) Use kmodules.xyz/schema-checker to validate values schema (#134) +- [7b2f051](https://github.com/stashed/installer/commit/7b2f051) Update repository config (#133) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v6](https://github.com/stashed/mysql/releases/tag/5.7.25-v6) + +- [a323265](https://github.com/stashed/mysql/commit/a323265) Prepare for release 5.7.25-v6 (#286) +- [28fc525](https://github.com/stashed/mysql/commit/28fc525) [cherry-pick] /cherry-pick (#271) (#282) +- [8eff987](https://github.com/stashed/mysql/commit/8eff987) [cherry-pick] Update repository config (#277) (#278) +- [8c431a1](https://github.com/stashed/mysql/commit/8c431a1) [cherry-pick] Update repository config (#272) (#273) +- [90540fe](https://github.com/stashed/mysql/commit/90540fe) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#266) (#267) +- [75adb40](https://github.com/stashed/mysql/commit/75adb40) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#262) (#263) +- [8a6631c](https://github.com/stashed/mysql/commit/8a6631c) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#258) (#259) +- [c89196d](https://github.com/stashed/mysql/commit/c89196d) [cherry-pick] Generate README.md using templates (#254) (#255) +- [38d1a2e](https://github.com/stashed/mysql/commit/38d1a2e) [cherry-pick] Speed up schema generation process (#250) (#251) + + +### [8.0.3-v6](https://github.com/stashed/mysql/releases/tag/8.0.3-v6) + +- [239ab4b](https://github.com/stashed/mysql/commit/239ab4b) Prepare for release 8.0.3-v6 (#289) +- [fb952a6](https://github.com/stashed/mysql/commit/fb952a6) /cherry-pick (#271) (#285) +- [394a229](https://github.com/stashed/mysql/commit/394a229) [cherry-pick] Update repository config (#277) (#281) +- [e8e2cf5](https://github.com/stashed/mysql/commit/e8e2cf5) [cherry-pick] Update repository config (#272) (#276) +- [31a0894](https://github.com/stashed/mysql/commit/31a0894) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#266) (#270) +- [2b7e67b](https://github.com/stashed/mysql/commit/2b7e67b) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#262) (#265) +- [ca0a700](https://github.com/stashed/mysql/commit/ca0a700) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#258) (#261) +- [e7135de](https://github.com/stashed/mysql/commit/e7135de) [cherry-pick] Generate README.md using templates (#254) (#257) +- [6cf15c3](https://github.com/stashed/mysql/commit/6cf15c3) [cherry-pick] Speed up schema generation process (#250) (#253) + + +### [8.0.14-v6](https://github.com/stashed/mysql/releases/tag/8.0.14-v6) + +- [80103d0](https://github.com/stashed/mysql/commit/80103d0) Prepare for release 8.0.14-v6 (#287) +- [1ba0074](https://github.com/stashed/mysql/commit/1ba0074) [cherry-pick] /cherry-pick (#271) (#283) +- [d63cbc1](https://github.com/stashed/mysql/commit/d63cbc1) [cherry-pick] Update repository config (#277) (#279) +- [9fb2be6](https://github.com/stashed/mysql/commit/9fb2be6) [cherry-pick] Update repository config (#272) (#274) +- [9170a97](https://github.com/stashed/mysql/commit/9170a97) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#266) (#268) +- [44f99e9](https://github.com/stashed/mysql/commit/44f99e9) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#262) (#264) +- [52ffb49](https://github.com/stashed/mysql/commit/52ffb49) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#258) (#260) +- [5979f66](https://github.com/stashed/mysql/commit/5979f66) [cherry-pick] Generate README.md using templates (#254) (#256) +- [e96a04e](https://github.com/stashed/mysql/commit/e96a04e) [cherry-pick] Speed up schema generation process (#250) (#252) + + +### [8.0.21](https://github.com/stashed/mysql/releases/tag/8.0.21) + + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.11.9](https://github.com/stashed/stash/releases/tag/v0.11.9) + +- [fbc144b7](https://github.com/stashed/stash/commit/fbc144b7) Prepare for release v0.11.9 (#1300) +- [7a2ee50c](https://github.com/stashed/stash/commit/7a2ee50c) Update repository config (#1299) +- [597cd6b2](https://github.com/stashed/stash/commit/597cd6b2) Update repository config (#1298) +- [182d5ebf](https://github.com/stashed/stash/commit/182d5ebf) Update Kubernetes v1.18.9 dependencies (#1295) +- [a225db0c](https://github.com/stashed/stash/commit/a225db0c) Update portforwarding api (#1294) +- [398ffd1e](https://github.com/stashed/stash/commit/398ffd1e) Update Kubernetes v1.18.9 dependencies (#1293) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2021.03.08.md b/content/docs/v2024.12.18/CHANGELOG-v2021.03.08.md new file mode 100644 index 0000000000..ca6f2f18ee --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2021.03.08.md @@ -0,0 +1,762 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2021.03.08 + name: Changelog-v2021.03.08 + parent: welcome + weight: 20210308 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2021.03.08/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2021.03.08/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2021.03.08 (2021-03-09) + + +## [appscode/stash-enterprise](https://github.com/appscode/stash-enterprise) + +### [v0.11.10](https://github.com/appscode/stash-enterprise/releases/tag/v0.11.10) + +- [ef190112](https://github.com/appscode/stash-enterprise/commit/ef190112) Prepare for release v0.11.10 (#81) +- [ee861f80](https://github.com/appscode/stash-enterprise/commit/ee861f80) Delete ClusterRoleBinding when the backup/restore invoker is removed (#80) +- [15e9596d](https://github.com/appscode/stash-enterprise/commit/15e9596d) Use addon info from AppBinding for KubeDB managed databases (#79) +- [315d42ae](https://github.com/appscode/stash-enterprise/commit/315d42ae) Update repository config (#77) +- [ce9dd2e4](https://github.com/appscode/stash-enterprise/commit/ce9dd2e4) Update repository config (#76) +- [ec68a28d](https://github.com/appscode/stash-enterprise/commit/ec68a28d) Enable running as a kubedb extension +- [68c9eef3](https://github.com/appscode/stash-enterprise/commit/68c9eef3) Use restic 0.12.0 (#74) +- [50f3d395](https://github.com/appscode/stash-enterprise/commit/50f3d395) Update Kubernetes v1.18.9 dependencies (#73) +- [47cb4438](https://github.com/appscode/stash-enterprise/commit/47cb4438) Update Kubernetes v1.18.9 dependencies (#72) +- [e1293f53](https://github.com/appscode/stash-enterprise/commit/e1293f53) Update Kubernetes v1.18.9 dependencies (#70) +- [6d253b3d](https://github.com/appscode/stash-enterprise/commit/6d253b3d) Update repository config (#67) + + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.11.10](https://github.com/stashed/apimachinery/releases/tag/v0.11.10) + +- [224ba637](https://github.com/stashed/apimachinery/commit/224ba637) Use import-crds script (#95) +- [96a42481](https://github.com/stashed/apimachinery/commit/96a42481) Add helper function to extract addon info from AppBinding (#94) +- [08e07356](https://github.com/stashed/apimachinery/commit/08e07356) Update repository config (#93) +- [6a253c41](https://github.com/stashed/apimachinery/commit/6a253c41) Generate crd yaml for Snapshot (#92) +- [c403645d](https://github.com/stashed/apimachinery/commit/c403645d) verify-gen before verify-modules (#90) +- [b3a033ea](https://github.com/stashed/apimachinery/commit/b3a033ea) Make pipe commands a array + fix output parsing of cleanup command (#87) +- [896c3ef5](https://github.com/stashed/apimachinery/commit/896c3ef5) Revendor kmodules.xyz/custom-resources +- [f29b2219](https://github.com/stashed/apimachinery/commit/f29b2219) Update crd-importer command +- [b39a182f](https://github.com/stashed/apimachinery/commit/b39a182f) Update repository config (#86) +- [680c4df3](https://github.com/stashed/apimachinery/commit/680c4df3) Use restic 0.12.0 (#84) +- [78134f02](https://github.com/stashed/apimachinery/commit/78134f02) Update crds via GitHub actions (#83) +- [a828a28e](https://github.com/stashed/apimachinery/commit/a828a28e) Update Kubernetes v1.18.9 dependencies (#82) +- [456e1a20](https://github.com/stashed/apimachinery/commit/456e1a20) Update Kubernetes v1.18.9 dependencies (#81) + + + +## [stashed/catalog](https://github.com/stashed/catalog) + +### [v2021.03.08](https://github.com/stashed/catalog/releases/tag/v2021.03.08) + +- [d4246cf](https://github.com/stashed/catalog/commit/d4246cf) Prepare for release v2021.03.08 (#62) +- [1306ba5](https://github.com/stashed/catalog/commit/1306ba5) Generate catalog library using go:embed (#61) +- [5307970](https://github.com/stashed/catalog/commit/5307970) Update repository config (#57) +- [fe7d130](https://github.com/stashed/catalog/commit/fe7d130) Fix passing image args (#56) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.11.10](https://github.com/stashed/cli/releases/tag/v0.11.10) + +- [3c37cc4](https://github.com/stashed/cli/commit/3c37cc4) Prepare for release v0.11.10 (#112) +- [fab9603](https://github.com/stashed/cli/commit/fab9603) Update repository config (#110) +- [59b5bea](https://github.com/stashed/cli/commit/59b5bea) Update repository config (#108) +- [5bba6cf](https://github.com/stashed/cli/commit/5bba6cf) Update Kubernetes v1.18.9 dependencies (#107) +- [4c34c15](https://github.com/stashed/cli/commit/4c34c15) Update Kubernetes v1.18.9 dependencies (#106) +- [743a3b9](https://github.com/stashed/cli/commit/743a3b9) Update Kubernetes v1.18.9 dependencies (#105) +- [c305c1a](https://github.com/stashed/cli/commit/c305c1a) Update Kubernetes v1.18.9 dependencies (#104) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v7](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v7) + +- [dcba74b2](https://github.com/stashed/elasticsearch/commit/dcba74b2) Prepare for release 5.6.4-v7 (#708) +- [5a5e1542](https://github.com/stashed/elasticsearch/commit/5a5e1542) Fix Makefile (#699) (#700) +- [537d1393](https://github.com/stashed/elasticsearch/commit/537d1393) Ignore 404 status code when listing legacy templates (#690) (#691) +- [dc8f26f2](https://github.com/stashed/elasticsearch/commit/dc8f26f2) Quote password in authFile (#689) +- [755ffac5](https://github.com/stashed/elasticsearch/commit/755ffac5) [cherry-pick] Update repository config (#674) (#675) +- [27b1ee52](https://github.com/stashed/elasticsearch/commit/27b1ee52) [cherry-pick] Update documentation for KubeDB v1alpha2 (#616) (#666) +- [f49353f2](https://github.com/stashed/elasticsearch/commit/f49353f2) Use auth-file for authentication (#615) (#658) +- [eb8e7ac0](https://github.com/stashed/elasticsearch/commit/eb8e7ac0) Update repository config (#648) (#649) +- [38c6c8f9](https://github.com/stashed/elasticsearch/commit/38c6c8f9) Use restic 0.12.0 (#642) (#643) +- [1c41ea18](https://github.com/stashed/elasticsearch/commit/1c41ea18) Update Kubernetes v1.18.9 dependencies (#633) (#634) +- [9bed4e5c](https://github.com/stashed/elasticsearch/commit/9bed4e5c) [cherry-pick] Check codespan schema (#625) (#626) +- [157cb63a](https://github.com/stashed/elasticsearch/commit/157cb63a) [cherry-pick] Update repository config (#606) (#607) +- [8454a167](https://github.com/stashed/elasticsearch/commit/8454a167) [cherry-pick] Update repository config (#597) (#598) +- [84293f0b](https://github.com/stashed/elasticsearch/commit/84293f0b) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#588) (#589) + + +### [6.2.4-v7](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v7) + +- [dcdff6ca](https://github.com/stashed/elasticsearch/commit/dcdff6ca) Prepare for release 6.2.4-v7 (#709) +- [8a62603d](https://github.com/stashed/elasticsearch/commit/8a62603d) Fix Makefile (#699) (#701) +- [122f0d5e](https://github.com/stashed/elasticsearch/commit/122f0d5e) Ignore 404 status code when listing legacy templates (#690) (#692) +- [3a9a98f3](https://github.com/stashed/elasticsearch/commit/3a9a98f3) Quote password in authFile (#689) +- [4659e942](https://github.com/stashed/elasticsearch/commit/4659e942) Check codespan schema (#625) (#686) +- [7c8aeb93](https://github.com/stashed/elasticsearch/commit/7c8aeb93) [cherry-pick] Update repository config (#674) (#676) +- [59f32d92](https://github.com/stashed/elasticsearch/commit/59f32d92) [cherry-pick] Update documentation for KubeDB v1alpha2 (#616) (#667) +- [65bbb66f](https://github.com/stashed/elasticsearch/commit/65bbb66f) Use auth-file for authentication (#615) (#659) +- [5ea72da5](https://github.com/stashed/elasticsearch/commit/5ea72da5) Update repository config (#648) (#650) +- [59c7bd9e](https://github.com/stashed/elasticsearch/commit/59c7bd9e) Use restic 0.12.0 (#642) (#644) +- [4d375599](https://github.com/stashed/elasticsearch/commit/4d375599) Update Kubernetes v1.18.9 dependencies (#633) (#635) +- [9f281533](https://github.com/stashed/elasticsearch/commit/9f281533) [cherry-pick] Update repository config (#606) (#608) +- [87352ada](https://github.com/stashed/elasticsearch/commit/87352ada) [cherry-pick] Update repository config (#597) (#599) +- [d8604274](https://github.com/stashed/elasticsearch/commit/d8604274) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#588) (#590) + + +### [6.3.0-v7](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v7) + +- [e085d630](https://github.com/stashed/elasticsearch/commit/e085d630) Prepare for release 6.3.0-v7 (#710) +- [f045125b](https://github.com/stashed/elasticsearch/commit/f045125b) Fix Makefile (#699) (#702) +- [e8cab7b9](https://github.com/stashed/elasticsearch/commit/e8cab7b9) Ignore 404 status code when listing legacy templates (#690) (#693) +- [e41e7e43](https://github.com/stashed/elasticsearch/commit/e41e7e43) Quote password in authFile (#689) +- [56ab642d](https://github.com/stashed/elasticsearch/commit/56ab642d) [cherry-pick] Update repository config (#674) (#677) +- [69131a02](https://github.com/stashed/elasticsearch/commit/69131a02) [cherry-pick] Update documentation for KubeDB v1alpha2 (#616) (#668) +- [f46a84ae](https://github.com/stashed/elasticsearch/commit/f46a84ae) Use auth-file for authentication (#615) (#660) +- [648d0ff1](https://github.com/stashed/elasticsearch/commit/648d0ff1) Update repository config (#648) (#651) +- [e7201912](https://github.com/stashed/elasticsearch/commit/e7201912) Use restic 0.12.0 (#642) (#645) +- [640e1889](https://github.com/stashed/elasticsearch/commit/640e1889) Update Kubernetes v1.18.9 dependencies (#633) (#636) +- [c82402f4](https://github.com/stashed/elasticsearch/commit/c82402f4) [cherry-pick] Check codespan schema (#625) (#627) +- [af41c505](https://github.com/stashed/elasticsearch/commit/af41c505) [cherry-pick] Update repository config (#606) (#609) +- [898df067](https://github.com/stashed/elasticsearch/commit/898df067) [cherry-pick] Update repository config (#597) (#600) +- [eacda9a1](https://github.com/stashed/elasticsearch/commit/eacda9a1) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#588) (#591) + + +### [6.4.0-v7](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v7) + +- [5ed94a48](https://github.com/stashed/elasticsearch/commit/5ed94a48) Prepare for release 6.4.0-v7 (#711) +- [35fd1f71](https://github.com/stashed/elasticsearch/commit/35fd1f71) Fix Makefile (#699) (#703) +- [46e0fabb](https://github.com/stashed/elasticsearch/commit/46e0fabb) Ignore 404 status code when listing legacy templates (#690) (#694) +- [9da39aeb](https://github.com/stashed/elasticsearch/commit/9da39aeb) Quote password in authFile (#689) +- [3fb2bd21](https://github.com/stashed/elasticsearch/commit/3fb2bd21) [cherry-pick] Update repository config (#674) (#678) +- [e70e0656](https://github.com/stashed/elasticsearch/commit/e70e0656) [cherry-pick] Update documentation for KubeDB v1alpha2 (#616) (#669) +- [cd226d80](https://github.com/stashed/elasticsearch/commit/cd226d80) Use auth-file for authentication (#615) (#661) +- [edf5ba72](https://github.com/stashed/elasticsearch/commit/edf5ba72) Update repository config (#648) (#652) +- [3d3e99a1](https://github.com/stashed/elasticsearch/commit/3d3e99a1) Use restic 0.12.0 (#642) (#646) +- [0787f7f2](https://github.com/stashed/elasticsearch/commit/0787f7f2) Update Kubernetes v1.18.9 dependencies (#633) (#637) +- [0dafdc7a](https://github.com/stashed/elasticsearch/commit/0dafdc7a) [cherry-pick] Check codespan schema (#625) (#628) +- [54d3204e](https://github.com/stashed/elasticsearch/commit/54d3204e) [cherry-pick] Update repository config (#606) (#610) +- [66df46bd](https://github.com/stashed/elasticsearch/commit/66df46bd) [cherry-pick] Update repository config (#597) (#601) +- [c962f800](https://github.com/stashed/elasticsearch/commit/c962f800) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#588) (#592) + + +### [6.5.3-v7](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v7) + +- [e44bce97](https://github.com/stashed/elasticsearch/commit/e44bce97) Prepare for release 6.5.3-v7 (#712) +- [e6cee0a2](https://github.com/stashed/elasticsearch/commit/e6cee0a2) Fix Makefile (#699) (#704) +- [d6452e0a](https://github.com/stashed/elasticsearch/commit/d6452e0a) Ignore 404 status code when listing legacy templates (#690) (#695) +- [5b15ac67](https://github.com/stashed/elasticsearch/commit/5b15ac67) Quote password in authFile (#689) +- [ec5efb61](https://github.com/stashed/elasticsearch/commit/ec5efb61) Use restic 0.12.0 (#642) (#682) +- [8101a27e](https://github.com/stashed/elasticsearch/commit/8101a27e) [cherry-pick] Update repository config (#674) (#679) +- [e7b742e0](https://github.com/stashed/elasticsearch/commit/e7b742e0) [cherry-pick] Update documentation for KubeDB v1alpha2 (#616) (#670) +- [bf880257](https://github.com/stashed/elasticsearch/commit/bf880257) Use auth-file for authentication (#615) (#662) +- [d7632175](https://github.com/stashed/elasticsearch/commit/d7632175) Update repository config (#648) (#653) +- [f5c3ad75](https://github.com/stashed/elasticsearch/commit/f5c3ad75) Update Kubernetes v1.18.9 dependencies (#633) (#638) +- [f0da9c7b](https://github.com/stashed/elasticsearch/commit/f0da9c7b) [cherry-pick] Check codespan schema (#625) (#629) +- [fdaaf918](https://github.com/stashed/elasticsearch/commit/fdaaf918) [cherry-pick] Update repository config (#606) (#611) +- [db2b3682](https://github.com/stashed/elasticsearch/commit/db2b3682) [cherry-pick] Update repository config (#597) (#602) +- [bcf79171](https://github.com/stashed/elasticsearch/commit/bcf79171) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#588) (#593) + + +### [6.8.0-v7](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v7) + +- [0ec393d2](https://github.com/stashed/elasticsearch/commit/0ec393d2) Prepare for release 6.8.0-v7 (#713) +- [4073987f](https://github.com/stashed/elasticsearch/commit/4073987f) Fix Makefile (#699) (#705) +- [04d80d85](https://github.com/stashed/elasticsearch/commit/04d80d85) Ignore 404 status code when listing legacy templates (#690) (#696) +- [dcf26649](https://github.com/stashed/elasticsearch/commit/dcf26649) Quote password in authFile (#689) +- [b0181bc6](https://github.com/stashed/elasticsearch/commit/b0181bc6) Use restic 0.12.0 (#642) (#683) +- [5a2bbc2a](https://github.com/stashed/elasticsearch/commit/5a2bbc2a) [cherry-pick] Update repository config (#674) (#680) +- [587de767](https://github.com/stashed/elasticsearch/commit/587de767) [cherry-pick] Update documentation for KubeDB v1alpha2 (#616) (#671) +- [f69ced9f](https://github.com/stashed/elasticsearch/commit/f69ced9f) Use auth-file for authentication (#615) (#663) +- [f9fea1e4](https://github.com/stashed/elasticsearch/commit/f9fea1e4) Update repository config (#648) (#654) +- [dfe9f1ee](https://github.com/stashed/elasticsearch/commit/dfe9f1ee) Update Kubernetes v1.18.9 dependencies (#633) (#639) +- [efd4b10b](https://github.com/stashed/elasticsearch/commit/efd4b10b) [cherry-pick] Check codespan schema (#625) (#630) +- [39ba5829](https://github.com/stashed/elasticsearch/commit/39ba5829) [cherry-pick] Update repository config (#606) (#612) +- [ab71cf1d](https://github.com/stashed/elasticsearch/commit/ab71cf1d) [cherry-pick] Update repository config (#597) (#603) +- [de556d0f](https://github.com/stashed/elasticsearch/commit/de556d0f) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#588) (#594) + + +### [7.2.0-v7](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v7) + +- [ea85c44e](https://github.com/stashed/elasticsearch/commit/ea85c44e) Prepare for release 7.2.0-v7 (#714) +- [db945208](https://github.com/stashed/elasticsearch/commit/db945208) Fix Makefile (#699) (#706) +- [a7916ad9](https://github.com/stashed/elasticsearch/commit/a7916ad9) Ignore 404 status code when listing legacy templates (#690) (#697) +- [66cb2cc7](https://github.com/stashed/elasticsearch/commit/66cb2cc7) Quote password in authFile (#689) +- [7118f02d](https://github.com/stashed/elasticsearch/commit/7118f02d) Use restic 0.12.0 (#642) (#684) +- [5cc37a43](https://github.com/stashed/elasticsearch/commit/5cc37a43) [cherry-pick] Update repository config (#674) (#681) +- [3162e056](https://github.com/stashed/elasticsearch/commit/3162e056) [cherry-pick] Update documentation for KubeDB v1alpha2 (#616) (#672) +- [033f476c](https://github.com/stashed/elasticsearch/commit/033f476c) Use auth-file for authentication (#615) (#664) +- [7aa78714](https://github.com/stashed/elasticsearch/commit/7aa78714) Update repository config (#648) (#655) +- [387d719d](https://github.com/stashed/elasticsearch/commit/387d719d) Update Kubernetes v1.18.9 dependencies (#633) (#640) +- [91ee06fd](https://github.com/stashed/elasticsearch/commit/91ee06fd) [cherry-pick] Check codespan schema (#625) (#631) +- [1893fa75](https://github.com/stashed/elasticsearch/commit/1893fa75) [cherry-pick] Update repository config (#606) (#613) +- [bc69b962](https://github.com/stashed/elasticsearch/commit/bc69b962) [cherry-pick] Update repository config (#597) (#604) +- [aa2ec507](https://github.com/stashed/elasticsearch/commit/aa2ec507) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#588) (#595) + + +### [7.3.2-v7](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v7) + +- [34b60133](https://github.com/stashed/elasticsearch/commit/34b60133) Prepare for release 7.3.2-v7 (#715) +- [a64b4e09](https://github.com/stashed/elasticsearch/commit/a64b4e09) Fix Makefile (#699) (#707) +- [5516debf](https://github.com/stashed/elasticsearch/commit/5516debf) Ignore 404 status code when listing legacy templates (#690) (#698) +- [1af9b4f1](https://github.com/stashed/elasticsearch/commit/1af9b4f1) Quote password in authFile (#689) +- [73f1363d](https://github.com/stashed/elasticsearch/commit/73f1363d) Use Go 1.16 (#625) (#632) (#688) +- [33d55c00](https://github.com/stashed/elasticsearch/commit/33d55c00) Update repository config (#674) (#687) +- [d5acfdfe](https://github.com/stashed/elasticsearch/commit/d5acfdfe) Use restic 0.12.0 (#642) (#685) +- [b1a5ddef](https://github.com/stashed/elasticsearch/commit/b1a5ddef) [cherry-pick] Update documentation for KubeDB v1alpha2 (#616) (#673) +- [3ac327b4](https://github.com/stashed/elasticsearch/commit/3ac327b4) Use auth-file for authentication (#615) (#665) +- [b8d6fd88](https://github.com/stashed/elasticsearch/commit/b8d6fd88) Update Kubernetes v1.18.9 dependencies (#633) (#641) +- [68a99e32](https://github.com/stashed/elasticsearch/commit/68a99e32) Check codespan schema (#625) (#632) +- [2837c894](https://github.com/stashed/elasticsearch/commit/2837c894) [cherry-pick] Update repository config (#606) (#614) +- [e330a642](https://github.com/stashed/elasticsearch/commit/e330a642) [cherry-pick] Update repository config (#597) (#605) +- [a018c4f1](https://github.com/stashed/elasticsearch/commit/a018c4f1) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#588) (#596) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v0.11.10](https://github.com/stashed/installer/releases/tag/v0.11.10) + +- [bc7afef](https://github.com/stashed/installer/commit/bc7afef) Prepare for release v0.11.10 (#156) +- [34d9f1c](https://github.com/stashed/installer/commit/34d9f1c) Avoid duplicating PSPs (#139) +- [bb53887](https://github.com/stashed/installer/commit/bb53887) Fix script permission +- [0982937](https://github.com/stashed/installer/commit/0982937) Add RBAC resources list permission (#153) +- [225c09b](https://github.com/stashed/installer/commit/225c09b) Add import-crds.sh script (#152) +- [ffbd911](https://github.com/stashed/installer/commit/ffbd911) Update crds for stashed/apimachinery@96a42481 (#151) +- [2a66966](https://github.com/stashed/installer/commit/2a66966) make ct (#147) +- [fe6391b](https://github.com/stashed/installer/commit/fe6391b) Remove unused chart templates +- [eb82779](https://github.com/stashed/installer/commit/eb82779) Update repository config (#144) +- [22123dc](https://github.com/stashed/installer/commit/22123dc) Remove v1alpha1 crds from chart +- [e4752a0](https://github.com/stashed/installer/commit/e4752a0) Update stash-crds chart version +- [7fc1b31](https://github.com/stashed/installer/commit/7fc1b31) Update stash community chart name +- [1ccd0d7](https://github.com/stashed/installer/commit/1ccd0d7) Add open-pr.sh script (#143) +- [e9f1dd3](https://github.com/stashed/installer/commit/e9f1dd3) Add stash-crds chart (#142) +- [7fe38fe](https://github.com/stashed/installer/commit/7fe38fe) Rename stash chart to stash-community (#141) + + + +## [stashed/mariadb](https://github.com/stashed/mariadb) + +### [10.5.8-v1](https://github.com/stashed/mariadb/releases/tag/10.5.8-v1) + +- [b620e7d](https://github.com/stashed/mariadb/commit/b620e7d) Prepare for release 10.5.8-v1 (#83) +- [4c06280](https://github.com/stashed/mariadb/commit/4c06280) [cherry-pick] Adding TLS support on MariaDB plugin (#62) (#82) +- [d6d9a6e](https://github.com/stashed/mariadb/commit/d6d9a6e) [cherry-pick] Update Docs (#79) (#81) +- [04c81ed](https://github.com/stashed/mariadb/commit/04c81ed) [cherry-pick] Support multiple commands in backup/restore pipeline (#77) (#80) +- [95f51d1](https://github.com/stashed/mariadb/commit/95f51d1) [cherry-pick] Update repository config (#75) (#78) +- [25933ed](https://github.com/stashed/mariadb/commit/25933ed) Update repository config (#73) (#74) +- [c0e03fe](https://github.com/stashed/mariadb/commit/c0e03fe) Use restic 0.12.0 (#70) (#71) +- [41082a8](https://github.com/stashed/mariadb/commit/41082a8) Update Kubernetes v1.18.9 dependencies (#68) (#69) +- [0e8a6d6](https://github.com/stashed/mariadb/commit/0e8a6d6) Fix links to concept docs (#56) (#67) +- [68fe2fe](https://github.com/stashed/mariadb/commit/68fe2fe) [cherry-pick] Check codespan schema (#65) (#66) +- [26f0958](https://github.com/stashed/mariadb/commit/26f0958) [cherry-pick] Update repository config (#59) (#60) +- [5d08f71](https://github.com/stashed/mariadb/commit/5d08f71) [cherry-pick] Update repository config (#57) (#58) +- [e076ca9](https://github.com/stashed/mariadb/commit/e076ca9) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#54) (#55) +- [eee3847](https://github.com/stashed/mariadb/commit/eee3847) [cherry-pick] Update repository config (#52) (#53) +- [6e1230c](https://github.com/stashed/mariadb/commit/6e1230c) [cherry-pick] Update repository config (#50) (#51) +- [cd1252b](https://github.com/stashed/mariadb/commit/cd1252b) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#48) (#49) +- [bee27ba](https://github.com/stashed/mariadb/commit/bee27ba) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#46) (#47) +- [eba6dad](https://github.com/stashed/mariadb/commit/eba6dad) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#44) (#45) +- [59d93e6](https://github.com/stashed/mariadb/commit/59d93e6) [cherry-pick] Generate README.md from templates (#42) (#43) +- [5763554](https://github.com/stashed/mariadb/commit/5763554) [cherry-pick] Speed up schema generation process (#40) (#41) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v6](https://github.com/stashed/mongodb/releases/tag/3.4.17-v6) + +- [1d030cb5](https://github.com/stashed/mongodb/commit/1d030cb5) Prepare for release 3.4.17-v6 (#843) +- [6aead6a1](https://github.com/stashed/mongodb/commit/6aead6a1) [cherry-pick] Update repository config (#834) (#835) +- [605d610e](https://github.com/stashed/mongodb/commit/605d610e) [cherry-pick] Support multiple commands in backup/restore pipeline (#823) (#824) +- [af2471a0](https://github.com/stashed/mongodb/commit/af2471a0) Update repository config (#809) (#810) +- [834dd170](https://github.com/stashed/mongodb/commit/834dd170) Use restic 0.12.0 (#799) (#800) +- [aa183f6d](https://github.com/stashed/mongodb/commit/aa183f6d) Update Kubernetes v1.18.9 dependencies (#788) (#789) +- [69115627](https://github.com/stashed/mongodb/commit/69115627) [cherry-pick] Check codespan schema (#776) (#777) +- [ea1b54f2](https://github.com/stashed/mongodb/commit/ea1b54f2) [cherry-pick] Update repository config (#751) (#752) +- [a4a9dffe](https://github.com/stashed/mongodb/commit/a4a9dffe) [cherry-pick] Update repository config (#742) (#743) +- [d7815dec](https://github.com/stashed/mongodb/commit/d7815dec) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#730) (#731) +- [f2c6e6f2](https://github.com/stashed/mongodb/commit/f2c6e6f2) [cherry-pick] Update repository config (#723) (#724) +- [739c59f8](https://github.com/stashed/mongodb/commit/739c59f8) [cherry-pick] Update repository config (#711) (#712) +- [a8f735f3](https://github.com/stashed/mongodb/commit/a8f735f3) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#699) (#700) +- [43bfddc1](https://github.com/stashed/mongodb/commit/43bfddc1) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#687) (#688) +- [91b544ba](https://github.com/stashed/mongodb/commit/91b544ba) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#675) (#676) +- [a457ccd6](https://github.com/stashed/mongodb/commit/a457ccd6) [cherry-pick] Speed up schema generation process (#663) (#664) + + +### [3.4.22-v6](https://github.com/stashed/mongodb/releases/tag/3.4.22-v6) + +- [cb42eb68](https://github.com/stashed/mongodb/commit/cb42eb68) Prepare for release 3.4.22-v6 (#844) +- [bf775397](https://github.com/stashed/mongodb/commit/bf775397) [cherry-pick] Update repository config (#834) (#836) +- [bf74b479](https://github.com/stashed/mongodb/commit/bf74b479) [cherry-pick] Support multiple commands in backup/restore pipeline (#823) (#825) +- [f00814d0](https://github.com/stashed/mongodb/commit/f00814d0) Update repository config (#809) (#811) +- [892cdd6e](https://github.com/stashed/mongodb/commit/892cdd6e) Use restic 0.12.0 (#799) (#801) +- [226e63ed](https://github.com/stashed/mongodb/commit/226e63ed) Update Kubernetes v1.18.9 dependencies (#788) (#790) +- [a2278585](https://github.com/stashed/mongodb/commit/a2278585) [cherry-pick] Check codespan schema (#776) (#778) +- [9ad4d52e](https://github.com/stashed/mongodb/commit/9ad4d52e) [cherry-pick] Update repository config (#751) (#753) +- [84f82ec0](https://github.com/stashed/mongodb/commit/84f82ec0) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#730) (#732) +- [df61f073](https://github.com/stashed/mongodb/commit/df61f073) [cherry-pick] Update repository config (#723) (#725) +- [5fa8af10](https://github.com/stashed/mongodb/commit/5fa8af10) [cherry-pick] Update repository config (#711) (#713) +- [3daa60e9](https://github.com/stashed/mongodb/commit/3daa60e9) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#699) (#701) +- [5179d087](https://github.com/stashed/mongodb/commit/5179d087) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#687) (#689) +- [183c0a71](https://github.com/stashed/mongodb/commit/183c0a71) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#675) (#677) +- [ab565586](https://github.com/stashed/mongodb/commit/ab565586) [cherry-pick] Speed up schema generation process (#663) (#665) + + +### [3.6.8-v6](https://github.com/stashed/mongodb/releases/tag/3.6.8-v6) + +- [20ebf67e](https://github.com/stashed/mongodb/commit/20ebf67e) Prepare for release 3.6.8-v6 (#846) +- [0d22261d](https://github.com/stashed/mongodb/commit/0d22261d) [cherry-pick] Support multiple commands in backup/restore pipeline (#823) (#827) +- [ade100a1](https://github.com/stashed/mongodb/commit/ade100a1) Update repository config (#809) (#813) +- [0dccae77](https://github.com/stashed/mongodb/commit/0dccae77) Use restic 0.12.0 (#799) (#803) +- [be4a808c](https://github.com/stashed/mongodb/commit/be4a808c) Update Kubernetes v1.18.9 dependencies (#788) (#792) +- [98181167](https://github.com/stashed/mongodb/commit/98181167) [cherry-pick] Check codespan schema (#776) (#780) +- [1cbdbf2a](https://github.com/stashed/mongodb/commit/1cbdbf2a) [cherry-pick] Update repository config (#751) (#755) +- [f09ed6dc](https://github.com/stashed/mongodb/commit/f09ed6dc) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#730) (#734) +- [5df0856f](https://github.com/stashed/mongodb/commit/5df0856f) [cherry-pick] Update repository config (#723) (#727) +- [3037de41](https://github.com/stashed/mongodb/commit/3037de41) [cherry-pick] Update repository config (#711) (#715) +- [214a2741](https://github.com/stashed/mongodb/commit/214a2741) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#699) (#703) +- [75ae3f11](https://github.com/stashed/mongodb/commit/75ae3f11) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#687) (#691) +- [effbb2a3](https://github.com/stashed/mongodb/commit/effbb2a3) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#675) (#679) +- [5cfd4984](https://github.com/stashed/mongodb/commit/5cfd4984) [cherry-pick] Speed up schema generation process (#663) (#667) + + +### [3.6.13-v6](https://github.com/stashed/mongodb/releases/tag/3.6.13-v6) + +- [c857aca3](https://github.com/stashed/mongodb/commit/c857aca3) Prepare for release 3.6.13-v6 (#845) +- [4e30586c](https://github.com/stashed/mongodb/commit/4e30586c) [cherry-pick] Update repository config (#834) (#837) +- [98503034](https://github.com/stashed/mongodb/commit/98503034) [cherry-pick] Support multiple commands in backup/restore pipeline (#823) (#826) +- [0d0f2c56](https://github.com/stashed/mongodb/commit/0d0f2c56) Update repository config (#809) (#812) +- [d44a02ee](https://github.com/stashed/mongodb/commit/d44a02ee) Use restic 0.12.0 (#799) (#802) +- [15d8451c](https://github.com/stashed/mongodb/commit/15d8451c) Update Kubernetes v1.18.9 dependencies (#788) (#791) +- [a5dd78c9](https://github.com/stashed/mongodb/commit/a5dd78c9) [cherry-pick] Check codespan schema (#776) (#779) +- [af7e1c21](https://github.com/stashed/mongodb/commit/af7e1c21) [cherry-pick] Update repository config (#751) (#754) +- [8f1c8e34](https://github.com/stashed/mongodb/commit/8f1c8e34) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#730) (#733) +- [504df2a0](https://github.com/stashed/mongodb/commit/504df2a0) [cherry-pick] Update repository config (#723) (#726) +- [b2d56067](https://github.com/stashed/mongodb/commit/b2d56067) [cherry-pick] Update repository config (#711) (#714) +- [34db4b8d](https://github.com/stashed/mongodb/commit/34db4b8d) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#699) (#702) +- [393ee1ed](https://github.com/stashed/mongodb/commit/393ee1ed) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#687) (#690) +- [46630738](https://github.com/stashed/mongodb/commit/46630738) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#675) (#678) +- [2628b661](https://github.com/stashed/mongodb/commit/2628b661) [cherry-pick] Speed up schema generation process (#663) (#666) + + +### [4.0.3-v6](https://github.com/stashed/mongodb/releases/tag/4.0.3-v6) + +- [c4d3534d](https://github.com/stashed/mongodb/commit/c4d3534d) Prepare for release 4.0.3-v6 (#848) +- [ba7946f5](https://github.com/stashed/mongodb/commit/ba7946f5) [cherry-pick] Support multiple commands in backup/restore pipeline (#823) (#829) +- [cdf8c4ec](https://github.com/stashed/mongodb/commit/cdf8c4ec) Update repository config (#809) (#815) +- [d33cb16d](https://github.com/stashed/mongodb/commit/d33cb16d) Use restic 0.12.0 (#799) (#805) +- [6695c171](https://github.com/stashed/mongodb/commit/6695c171) Update Kubernetes v1.18.9 dependencies (#788) (#794) +- [7a7ef475](https://github.com/stashed/mongodb/commit/7a7ef475) [cherry-pick] Check codespan schema (#776) (#782) +- [3ed7924b](https://github.com/stashed/mongodb/commit/3ed7924b) [cherry-pick] Update repository config (#751) (#757) +- [dc8f11da](https://github.com/stashed/mongodb/commit/dc8f11da) [cherry-pick] Update repository config (#742) (#745) +- [b5cee38e](https://github.com/stashed/mongodb/commit/b5cee38e) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#730) (#736) +- [92fc2ef0](https://github.com/stashed/mongodb/commit/92fc2ef0) [cherry-pick] Update repository config (#723) (#729) +- [0a722b53](https://github.com/stashed/mongodb/commit/0a722b53) [cherry-pick] Update repository config (#711) (#717) +- [6487d000](https://github.com/stashed/mongodb/commit/6487d000) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#699) (#705) +- [02b8fa07](https://github.com/stashed/mongodb/commit/02b8fa07) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#687) (#693) +- [90d43ee5](https://github.com/stashed/mongodb/commit/90d43ee5) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#675) (#681) +- [296e3e78](https://github.com/stashed/mongodb/commit/296e3e78) [cherry-pick] Speed up schema generation process (#663) (#669) + + +### [4.0.5-v6](https://github.com/stashed/mongodb/releases/tag/4.0.5-v6) + +- [61478c2a](https://github.com/stashed/mongodb/commit/61478c2a) Prepare for release 4.0.5-v6 (#849) +- [68a14362](https://github.com/stashed/mongodb/commit/68a14362) [cherry-pick] Support multiple commands in backup/restore pipeline (#823) (#830) +- [44c65016](https://github.com/stashed/mongodb/commit/44c65016) Update repository config (#809) (#816) +- [a86475a8](https://github.com/stashed/mongodb/commit/a86475a8) Update Kubernetes v1.18.9 dependencies (#788) (#795) +- [c2bf2223](https://github.com/stashed/mongodb/commit/c2bf2223) [cherry-pick] Check codespan schema (#776) (#783) +- [3f1e60bf](https://github.com/stashed/mongodb/commit/3f1e60bf) [cherry-pick] Update repository config (#751) (#758) +- [917188b5](https://github.com/stashed/mongodb/commit/917188b5) [cherry-pick] Update repository config (#742) (#746) +- [8ee922e7](https://github.com/stashed/mongodb/commit/8ee922e7) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#730) (#737) +- [d5712991](https://github.com/stashed/mongodb/commit/d5712991) [cherry-pick] Update repository config (#711) (#718) +- [d2c6e8a1](https://github.com/stashed/mongodb/commit/d2c6e8a1) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#699) (#706) +- [9f99d7ed](https://github.com/stashed/mongodb/commit/9f99d7ed) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#687) (#694) +- [ba5273b3](https://github.com/stashed/mongodb/commit/ba5273b3) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#675) (#682) +- [be53a7ba](https://github.com/stashed/mongodb/commit/be53a7ba) [cherry-pick] Speed up schema generation process (#663) (#670) + + +### [4.0.11-v6](https://github.com/stashed/mongodb/releases/tag/4.0.11-v6) + +- [42b8d5b5](https://github.com/stashed/mongodb/commit/42b8d5b5) Prepare for release 4.0.11-v6 (#847) +- [3ef255bf](https://github.com/stashed/mongodb/commit/3ef255bf) [cherry-pick] Support multiple commands in backup/restore pipeline (#823) (#828) +- [fb647f1a](https://github.com/stashed/mongodb/commit/fb647f1a) Update repository config (#809) (#814) +- [7408bd14](https://github.com/stashed/mongodb/commit/7408bd14) Use restic 0.12.0 (#799) (#804) +- [647a9b97](https://github.com/stashed/mongodb/commit/647a9b97) Update Kubernetes v1.18.9 dependencies (#788) (#793) +- [e00d3aa8](https://github.com/stashed/mongodb/commit/e00d3aa8) [cherry-pick] Check codespan schema (#776) (#781) +- [b3049dd7](https://github.com/stashed/mongodb/commit/b3049dd7) [cherry-pick] Update repository config (#751) (#756) +- [459c1f22](https://github.com/stashed/mongodb/commit/459c1f22) [cherry-pick] Update repository config (#742) (#744) +- [95525f30](https://github.com/stashed/mongodb/commit/95525f30) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#730) (#735) +- [b4eeea5a](https://github.com/stashed/mongodb/commit/b4eeea5a) [cherry-pick] Update repository config (#723) (#728) +- [e2b3dac7](https://github.com/stashed/mongodb/commit/e2b3dac7) [cherry-pick] Update repository config (#711) (#716) +- [30038e11](https://github.com/stashed/mongodb/commit/30038e11) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#699) (#704) +- [a731b4f8](https://github.com/stashed/mongodb/commit/a731b4f8) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#687) (#692) +- [d45bce7d](https://github.com/stashed/mongodb/commit/d45bce7d) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#675) (#680) +- [305e2f09](https://github.com/stashed/mongodb/commit/305e2f09) [cherry-pick] Speed up schema generation process (#663) (#668) + + +### [4.1.4-v6](https://github.com/stashed/mongodb/releases/tag/4.1.4-v6) + +- [d897c8af](https://github.com/stashed/mongodb/commit/d897c8af) Prepare for release 4.1.4-v6 (#851) +- [ea3fe513](https://github.com/stashed/mongodb/commit/ea3fe513) [cherry-pick] Update repository config (#834) (#839) +- [131e8186](https://github.com/stashed/mongodb/commit/131e8186) [cherry-pick] Support multiple commands in backup/restore pipeline (#823) (#832) +- [fc8aadb3](https://github.com/stashed/mongodb/commit/fc8aadb3) Update repository config (#809) (#818) +- [540bb495](https://github.com/stashed/mongodb/commit/540bb495) [cherry-pick] Check codespan schema (#776) (#785) +- [f0223f83](https://github.com/stashed/mongodb/commit/f0223f83) [cherry-pick] Update repository config (#751) (#760) +- [181d91ff](https://github.com/stashed/mongodb/commit/181d91ff) [cherry-pick] Update repository config (#742) (#748) +- [bae3a785](https://github.com/stashed/mongodb/commit/bae3a785) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#730) (#739) +- [6794e116](https://github.com/stashed/mongodb/commit/6794e116) [cherry-pick] Update repository config (#711) (#720) +- [6679db70](https://github.com/stashed/mongodb/commit/6679db70) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#699) (#708) +- [a1e1d7ad](https://github.com/stashed/mongodb/commit/a1e1d7ad) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#687) (#696) +- [38234e03](https://github.com/stashed/mongodb/commit/38234e03) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#675) (#684) +- [bc3a9d3f](https://github.com/stashed/mongodb/commit/bc3a9d3f) [cherry-pick] Speed up schema generation process (#663) (#672) + + +### [4.1.7-v6](https://github.com/stashed/mongodb/releases/tag/4.1.7-v6) + +- [ea23f76b](https://github.com/stashed/mongodb/commit/ea23f76b) Prepare for release 4.1.7-v6 (#852) +- [0fc5aa51](https://github.com/stashed/mongodb/commit/0fc5aa51) [cherry-pick] Update repository config (#834) (#840) +- [7f3fd5ba](https://github.com/stashed/mongodb/commit/7f3fd5ba) [cherry-pick] Support multiple commands in backup/restore pipeline (#823) (#833) +- [f35f4d0a](https://github.com/stashed/mongodb/commit/f35f4d0a) Update repository config (#809) (#819) +- [dea74649](https://github.com/stashed/mongodb/commit/dea74649) Use restic 0.12.0 (#799) (#806) +- [eb99931f](https://github.com/stashed/mongodb/commit/eb99931f) Update Kubernetes v1.18.9 dependencies (#788) (#797) +- [0f047a25](https://github.com/stashed/mongodb/commit/0f047a25) [cherry-pick] Check codespan schema (#776) (#786) +- [27a57e7b](https://github.com/stashed/mongodb/commit/27a57e7b) [cherry-pick] Update repository config (#751) (#761) +- [1e887f7c](https://github.com/stashed/mongodb/commit/1e887f7c) [cherry-pick] Update repository config (#742) (#749) +- [d4cd6f9b](https://github.com/stashed/mongodb/commit/d4cd6f9b) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#730) (#740) +- [bd003974](https://github.com/stashed/mongodb/commit/bd003974) [cherry-pick] Update repository config (#711) (#721) +- [3fc526dc](https://github.com/stashed/mongodb/commit/3fc526dc) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#699) (#709) +- [b62a22cc](https://github.com/stashed/mongodb/commit/b62a22cc) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#687) (#697) +- [78981022](https://github.com/stashed/mongodb/commit/78981022) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#675) (#685) +- [e660275a](https://github.com/stashed/mongodb/commit/e660275a) [cherry-pick] Speed up schema generation process (#663) (#673) + + +### [4.1.13-v6](https://github.com/stashed/mongodb/releases/tag/4.1.13-v6) + +- [7dd79a12](https://github.com/stashed/mongodb/commit/7dd79a12) Prepare for release 4.1.13-v6 (#850) +- [2e0bf537](https://github.com/stashed/mongodb/commit/2e0bf537) [cherry-pick] Update repository config (#834) (#838) +- [5f423a11](https://github.com/stashed/mongodb/commit/5f423a11) [cherry-pick] Support multiple commands in backup/restore pipeline (#823) (#831) +- [16e63401](https://github.com/stashed/mongodb/commit/16e63401) Update repository config (#809) (#817) +- [6e5807e9](https://github.com/stashed/mongodb/commit/6e5807e9) Update Kubernetes v1.18.9 dependencies (#788) (#796) +- [00e7f5fa](https://github.com/stashed/mongodb/commit/00e7f5fa) [cherry-pick] Check codespan schema (#776) (#784) +- [e70421c3](https://github.com/stashed/mongodb/commit/e70421c3) [cherry-pick] Update repository config (#751) (#759) +- [349469bf](https://github.com/stashed/mongodb/commit/349469bf) [cherry-pick] Update repository config (#742) (#747) +- [20ab2b31](https://github.com/stashed/mongodb/commit/20ab2b31) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#730) (#738) +- [db398d0f](https://github.com/stashed/mongodb/commit/db398d0f) [cherry-pick] Update repository config (#711) (#719) +- [d7df2584](https://github.com/stashed/mongodb/commit/d7df2584) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#699) (#707) +- [c8ed983d](https://github.com/stashed/mongodb/commit/c8ed983d) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#687) (#695) +- [17fd7bb0](https://github.com/stashed/mongodb/commit/17fd7bb0) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#675) (#683) +- [ed17070e](https://github.com/stashed/mongodb/commit/ed17070e) [cherry-pick] Speed up schema generation process (#663) (#671) + + +### [4.2.3-v6](https://github.com/stashed/mongodb/releases/tag/4.2.3-v6) + +- [c9fe7d9a](https://github.com/stashed/mongodb/commit/c9fe7d9a) Prepare for release 4.2.3-v6 (#853) +- [76b6c898](https://github.com/stashed/mongodb/commit/76b6c898) [cherry-pick] Update repository config (#834) (#841) +- [f1f64838](https://github.com/stashed/mongodb/commit/f1f64838) Support multiple commands in backup/restore pipeline (#823) (#842) +- [a12d4baf](https://github.com/stashed/mongodb/commit/a12d4baf) Update repository config (#809) (#820) +- [4fb8b170](https://github.com/stashed/mongodb/commit/4fb8b170) Use restic 0.12.0 (#799) (#807) +- [46f2effa](https://github.com/stashed/mongodb/commit/46f2effa) Update Kubernetes v1.18.9 dependencies (#788) (#798) +- [e10f42bf](https://github.com/stashed/mongodb/commit/e10f42bf) [cherry-pick] Check codespan schema (#776) (#787) +- [8c09902f](https://github.com/stashed/mongodb/commit/8c09902f) [cherry-pick] Update repository config (#751) (#762) +- [0cc4c0bf](https://github.com/stashed/mongodb/commit/0cc4c0bf) [cherry-pick] Update repository config (#742) (#750) +- [08f5ff3b](https://github.com/stashed/mongodb/commit/08f5ff3b) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#730) (#741) +- [78a92f84](https://github.com/stashed/mongodb/commit/78a92f84) [cherry-pick] Update repository config (#711) (#722) +- [705dc0f9](https://github.com/stashed/mongodb/commit/705dc0f9) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#699) (#710) +- [08aecd88](https://github.com/stashed/mongodb/commit/08aecd88) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#687) (#698) +- [c7f8715b](https://github.com/stashed/mongodb/commit/c7f8715b) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#675) (#686) +- [8d3f3e59](https://github.com/stashed/mongodb/commit/8d3f3e59) [cherry-pick] Speed up schema generation process (#663) (#674) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v7](https://github.com/stashed/mysql/releases/tag/5.7.25-v7) + +- [8a1ee71](https://github.com/stashed/mysql/commit/8a1ee71) Prepare for release 5.7.25-v7 (#349) +- [366167a](https://github.com/stashed/mysql/commit/366167a) [cherry-pick] Update repository config (#344) (#345) +- [96f4404](https://github.com/stashed/mysql/commit/96f4404) [cherry-pick] Support multiple commands in backup/restore pipeline (#335) (#340) +- [02a3750](https://github.com/stashed/mysql/commit/02a3750) [cherry-pick] Add TLS support for backup and Restore (#328) (#336) +- [e8c8781](https://github.com/stashed/mysql/commit/e8c8781) Update repository config (#327) (#329) +- [864ba45](https://github.com/stashed/mysql/commit/864ba45) Use restic 0.12.0 (#321) (#322) +- [5b26633](https://github.com/stashed/mysql/commit/5b26633) Update Kubernetes v1.18.9 dependencies (#316) (#317) +- [b17c4b4](https://github.com/stashed/mysql/commit/b17c4b4) [cherry-pick] Check codespan schema (#312) (#313) +- [bd1460c](https://github.com/stashed/mysql/commit/bd1460c) [cherry-pick] Update repository config (#301) (#302) +- [4a19d88](https://github.com/stashed/mysql/commit/4a19d88) [cherry-pick] Update repository config (#296) (#297) +- [2e1a630](https://github.com/stashed/mysql/commit/2e1a630) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#291) (#292) + + +### [8.0.3-v7](https://github.com/stashed/mysql/releases/tag/8.0.3-v7) + +- [8a5311d](https://github.com/stashed/mysql/commit/8a5311d) Prepare for release 8.0.3-v7 (#352) +- [60a0157](https://github.com/stashed/mysql/commit/60a0157) [cherry-pick] Update repository config (#344) (#348) +- [a0e9506](https://github.com/stashed/mysql/commit/a0e9506) [cherry-pick] Support multiple commands in backup/restore pipeline (#335) (#343) +- [f4a09d8](https://github.com/stashed/mysql/commit/f4a09d8) [cherry-pick] Add TLS support for backup and Restore (#328) (#339) +- [271db44](https://github.com/stashed/mysql/commit/271db44) Update repository config (#327) (#332) +- [1af5d1b](https://github.com/stashed/mysql/commit/1af5d1b) Use restic 0.12.0 (#321) (#325) +- [3c6d8f7](https://github.com/stashed/mysql/commit/3c6d8f7) Update Kubernetes v1.18.9 dependencies (#316) (#320) +- [dbd0d49](https://github.com/stashed/mysql/commit/dbd0d49) [cherry-pick] Update repository config (#301) (#305) +- [889711e](https://github.com/stashed/mysql/commit/889711e) [cherry-pick] Update repository config (#296) (#300) +- [1418e6d](https://github.com/stashed/mysql/commit/1418e6d) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#291) (#295) + + +### [8.0.14-v7](https://github.com/stashed/mysql/releases/tag/8.0.14-v7) + +- [a38a02b](https://github.com/stashed/mysql/commit/a38a02b) Prepare for release 8.0.14-v7 (#350) +- [b4091b6](https://github.com/stashed/mysql/commit/b4091b6) [cherry-pick] Update repository config (#344) (#346) +- [2218549](https://github.com/stashed/mysql/commit/2218549) [cherry-pick] Support multiple commands in backup/restore pipeline (#335) (#341) +- [5e38d81](https://github.com/stashed/mysql/commit/5e38d81) [cherry-pick] Add TLS support for backup and Restore (#328) (#337) +- [431967e](https://github.com/stashed/mysql/commit/431967e) Update repository config (#327) (#330) +- [d6adbb2](https://github.com/stashed/mysql/commit/d6adbb2) Use restic 0.12.0 (#321) (#323) +- [d3cf790](https://github.com/stashed/mysql/commit/d3cf790) Update Kubernetes v1.18.9 dependencies (#316) (#318) +- [5e2356e](https://github.com/stashed/mysql/commit/5e2356e) [cherry-pick] Check codespan schema (#312) (#314) +- [bbbbc8e](https://github.com/stashed/mysql/commit/bbbbc8e) [cherry-pick] Update repository config (#301) (#303) +- [00ddfb4](https://github.com/stashed/mysql/commit/00ddfb4) [cherry-pick] Update repository config (#296) (#298) +- [08189bf](https://github.com/stashed/mysql/commit/08189bf) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#291) (#293) + + +### [8.0.21-v1](https://github.com/stashed/mysql/releases/tag/8.0.21-v1) + +- [df6aa7c](https://github.com/stashed/mysql/commit/df6aa7c) Prepare for release 8.0.21-v1 (#351) +- [bb35f6b](https://github.com/stashed/mysql/commit/bb35f6b) [cherry-pick] Update repository config (#344) (#347) +- [8571d10](https://github.com/stashed/mysql/commit/8571d10) [cherry-pick] Support multiple commands in backup/restore pipeline (#335) (#342) +- [e3bb016](https://github.com/stashed/mysql/commit/e3bb016) [cherry-pick] Add TLS support for backup and Restore (#328) (#338) +- [c9a5ddf](https://github.com/stashed/mysql/commit/c9a5ddf) Update repository config (#327) (#331) +- [4e0a065](https://github.com/stashed/mysql/commit/4e0a065) Use restic 0.12.0 (#321) (#324) +- [367e1ce](https://github.com/stashed/mysql/commit/367e1ce) Update Kubernetes v1.18.9 dependencies (#316) (#319) +- [a09b250](https://github.com/stashed/mysql/commit/a09b250) [cherry-pick] Check codespan schema (#312) (#315) +- [344d3ac](https://github.com/stashed/mysql/commit/344d3ac) [cherry-pick] Update repository config (#301) (#304) +- [fcc0e9b](https://github.com/stashed/mysql/commit/fcc0e9b) [cherry-pick] Update repository config (#296) (#299) +- [c4ab29f](https://github.com/stashed/mysql/commit/c4ab29f) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#291) (#294) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7.0-v2](https://github.com/stashed/percona-xtradb/releases/tag/5.7.0-v2) + + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v5](https://github.com/stashed/postgres/releases/tag/9.6.19-v5) + +- [66a76378](https://github.com/stashed/postgres/commit/66a76378) Prepare for release 9.6.19-v5 (#720) +- [362b2897](https://github.com/stashed/postgres/commit/362b2897) Fix Makefile (#705) (#715) +- [9c47a1fd](https://github.com/stashed/postgres/commit/9c47a1fd) TLS support for postgres (#694) (#704) +- [e2ad17a8](https://github.com/stashed/postgres/commit/e2ad17a8) [cherry-pick] Update repository config (#683) (#693) +- [e739d000](https://github.com/stashed/postgres/commit/e739d000) Add auto-backup doc + Restructure docs (#618) (#682) +- [3b4f6709](https://github.com/stashed/postgres/commit/3b4f6709) [cherry-pick] Don't overwrite superuser password of restored database (#660) (#672) +- [b5b9acb1](https://github.com/stashed/postgres/commit/b5b9acb1) Update repository config (#649) (#659) +- [d7fc51c9](https://github.com/stashed/postgres/commit/d7fc51c9) Use restic 0.12.0 (#637) (#647) +- [3a8c97eb](https://github.com/stashed/postgres/commit/3a8c97eb) Update Kubernetes v1.18.9 dependencies (#626) (#636) +- [2adf3188](https://github.com/stashed/postgres/commit/2adf3188) [cherry-pick] Update repository config (#600) (#610) +- [4143a5e1](https://github.com/stashed/postgres/commit/4143a5e1) [cherry-pick] Update repository config (#589) (#599) +- [31a2d0c1](https://github.com/stashed/postgres/commit/31a2d0c1) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#578) (#588) +- [a40a7321](https://github.com/stashed/postgres/commit/a40a7321) [cherry-pick] Update repository config (#566) (#576) +- [05b91feb](https://github.com/stashed/postgres/commit/05b91feb) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#555) (#565) +- [4f5958c7](https://github.com/stashed/postgres/commit/4f5958c7) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#544) (#554) +- [b70c6cfa](https://github.com/stashed/postgres/commit/b70c6cfa) [cherry-pick] Update README.md template (#523) (#533) +- [850e18b3](https://github.com/stashed/postgres/commit/850e18b3) [cherry-pick] Generate README.md using templates (#512) (#522) +- [4ccb4b4a](https://github.com/stashed/postgres/commit/4ccb4b4a) [cherry-pick] Speed up schema generation process (#501) (#511) + + +### [10.14.0-v5](https://github.com/stashed/postgres/releases/tag/10.14.0-v5) + +- [57eecdc3](https://github.com/stashed/postgres/commit/57eecdc3) Prepare for release 10.14.0-v5 (#716) +- [9a56adea](https://github.com/stashed/postgres/commit/9a56adea) Fix Makefile (#705) (#706) +- [925bd8e6](https://github.com/stashed/postgres/commit/925bd8e6) TLS support for postgres (#694) (#695) +- [6509c44f](https://github.com/stashed/postgres/commit/6509c44f) [cherry-pick] Update repository config (#683) (#684) +- [31626977](https://github.com/stashed/postgres/commit/31626977) Add auto-backup doc + Restructure docs (#618) (#673) +- [2602a2e5](https://github.com/stashed/postgres/commit/2602a2e5) [cherry-pick] Don't overwrite superuser password of restored database (#660) (#663) +- [3a5c3f93](https://github.com/stashed/postgres/commit/3a5c3f93) Update repository config (#649) (#650) +- [4638354a](https://github.com/stashed/postgres/commit/4638354a) Use restic 0.12.0 (#637) (#638) +- [b81480ec](https://github.com/stashed/postgres/commit/b81480ec) Update Kubernetes v1.18.9 dependencies (#626) (#627) +- [7f7c4eb8](https://github.com/stashed/postgres/commit/7f7c4eb8) [cherry-pick] Check codespan schema (#617) (#619) +- [cab4cb38](https://github.com/stashed/postgres/commit/cab4cb38) [cherry-pick] Update repository config (#600) (#601) +- [fd9fa30f](https://github.com/stashed/postgres/commit/fd9fa30f) [cherry-pick] Update repository config (#589) (#590) +- [29f17df8](https://github.com/stashed/postgres/commit/29f17df8) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#578) (#579) +- [cb6be80f](https://github.com/stashed/postgres/commit/cb6be80f) [cherry-pick] Update repository config (#566) (#567) +- [3033a772](https://github.com/stashed/postgres/commit/3033a772) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#555) (#556) +- [bf03d98d](https://github.com/stashed/postgres/commit/bf03d98d) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#544) (#545) +- [b2fdc143](https://github.com/stashed/postgres/commit/b2fdc143) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#534) (#535) +- [c898ee57](https://github.com/stashed/postgres/commit/c898ee57) [cherry-pick] Update README.md template (#523) (#524) +- [fadedccd](https://github.com/stashed/postgres/commit/fadedccd) [cherry-pick] Generate README.md using templates (#512) (#513) +- [46e2b6dd](https://github.com/stashed/postgres/commit/46e2b6dd) [cherry-pick] Speed up schema generation process (#501) (#502) + + +### [11.9.0-v5](https://github.com/stashed/postgres/releases/tag/11.9.0-v5) + +- [2a7a4f96](https://github.com/stashed/postgres/commit/2a7a4f96) Prepare for release 11.9.0-v5 (#717) +- [e673d3c0](https://github.com/stashed/postgres/commit/e673d3c0) Fix Makefile (#705) (#711) +- [c8e9b998](https://github.com/stashed/postgres/commit/c8e9b998) TLS support for postgres (#694) (#700) +- [ebc0a1f9](https://github.com/stashed/postgres/commit/ebc0a1f9) [cherry-pick] Update repository config (#683) (#689) +- [baa94cf6](https://github.com/stashed/postgres/commit/baa94cf6) Add auto-backup doc + Restructure docs (#618) (#678) +- [06d62688](https://github.com/stashed/postgres/commit/06d62688) [cherry-pick] Don't overwrite superuser password of restored database (#660) (#668) +- [7fa729aa](https://github.com/stashed/postgres/commit/7fa729aa) Update repository config (#649) (#655) +- [637daf85](https://github.com/stashed/postgres/commit/637daf85) Use restic 0.12.0 (#637) (#643) +- [2ec2a638](https://github.com/stashed/postgres/commit/2ec2a638) Update Kubernetes v1.18.9 dependencies (#626) (#632) +- [db0433ed](https://github.com/stashed/postgres/commit/db0433ed) [cherry-pick] Check codespan schema (#617) (#624) +- [bb3d5515](https://github.com/stashed/postgres/commit/bb3d5515) [cherry-pick] Update repository config (#600) (#606) +- [c5b40a97](https://github.com/stashed/postgres/commit/c5b40a97) [cherry-pick] Update repository config (#589) (#595) +- [8ad35d50](https://github.com/stashed/postgres/commit/8ad35d50) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#578) (#584) +- [b5230e5f](https://github.com/stashed/postgres/commit/b5230e5f) [cherry-pick] Update repository config (#566) (#572) +- [593a9b7e](https://github.com/stashed/postgres/commit/593a9b7e) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#555) (#561) +- [ce7aa9d1](https://github.com/stashed/postgres/commit/ce7aa9d1) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#544) (#550) +- [ce8bdb41](https://github.com/stashed/postgres/commit/ce8bdb41) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#534) (#540) +- [da4c7f5b](https://github.com/stashed/postgres/commit/da4c7f5b) [cherry-pick] Update README.md template (#523) (#529) +- [d928f7ac](https://github.com/stashed/postgres/commit/d928f7ac) [cherry-pick] Generate README.md using templates (#512) (#518) +- [8bdef7b5](https://github.com/stashed/postgres/commit/8bdef7b5) [cherry-pick] Speed up schema generation process (#501) (#507) + + +### [12.4.0-v5](https://github.com/stashed/postgres/releases/tag/12.4.0-v5) + +- [b1140414](https://github.com/stashed/postgres/commit/b1140414) Prepare for release 12.4.0-v5 (#718) +- [403dfb51](https://github.com/stashed/postgres/commit/403dfb51) Fix Makefile (#705) (#712) +- [0e98e14e](https://github.com/stashed/postgres/commit/0e98e14e) TLS support for postgres (#694) (#701) +- [dfc98b6e](https://github.com/stashed/postgres/commit/dfc98b6e) [cherry-pick] Update repository config (#683) (#690) +- [3a8c1036](https://github.com/stashed/postgres/commit/3a8c1036) Add auto-backup doc + Restructure docs (#618) (#679) +- [a14c26d8](https://github.com/stashed/postgres/commit/a14c26d8) [cherry-pick] Don't overwrite superuser password of restored database (#660) (#669) +- [fc9f2302](https://github.com/stashed/postgres/commit/fc9f2302) Update repository config (#649) (#656) +- [ee83ac04](https://github.com/stashed/postgres/commit/ee83ac04) Use restic 0.12.0 (#637) (#644) +- [9b27b063](https://github.com/stashed/postgres/commit/9b27b063) Update Kubernetes v1.18.9 dependencies (#626) (#633) +- [32d5df70](https://github.com/stashed/postgres/commit/32d5df70) [cherry-pick] Check codespan schema (#617) (#625) +- [54bba3b1](https://github.com/stashed/postgres/commit/54bba3b1) [cherry-pick] Update repository config (#600) (#607) +- [2ac504d2](https://github.com/stashed/postgres/commit/2ac504d2) [cherry-pick] Update repository config (#589) (#596) +- [0b4f7bea](https://github.com/stashed/postgres/commit/0b4f7bea) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#578) (#585) +- [e3e822f3](https://github.com/stashed/postgres/commit/e3e822f3) [cherry-pick] Update repository config (#566) (#573) +- [956653e3](https://github.com/stashed/postgres/commit/956653e3) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#555) (#562) +- [ef5cc730](https://github.com/stashed/postgres/commit/ef5cc730) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#544) (#551) +- [02a8fc1b](https://github.com/stashed/postgres/commit/02a8fc1b) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#534) (#541) +- [8c4e765f](https://github.com/stashed/postgres/commit/8c4e765f) [cherry-pick] Update README.md template (#523) (#530) +- [66da0577](https://github.com/stashed/postgres/commit/66da0577) [cherry-pick] Generate README.md using templates (#512) (#519) +- [a5be3888](https://github.com/stashed/postgres/commit/a5be3888) [cherry-pick] Speed up schema generation process (#501) (#508) + + +### [13.1.0-v2](https://github.com/stashed/postgres/releases/tag/13.1.0-v2) + +- [6c59e1eb](https://github.com/stashed/postgres/commit/6c59e1eb) Prepare for release 13.1.0-v2 (#719) +- [be6c043a](https://github.com/stashed/postgres/commit/be6c043a) Fix Makefile (#705) (#713) +- [8805ee06](https://github.com/stashed/postgres/commit/8805ee06) TLS support for postgres (#694) (#702) +- [517a4e20](https://github.com/stashed/postgres/commit/517a4e20) [cherry-pick] Update repository config (#683) (#691) +- [fc935ae7](https://github.com/stashed/postgres/commit/fc935ae7) Add auto-backup doc + Restructure docs (#618) (#680) +- [ac84e6d3](https://github.com/stashed/postgres/commit/ac84e6d3) [cherry-pick] Don't overwrite superuser password of restored database (#660) (#670) +- [6c195dfb](https://github.com/stashed/postgres/commit/6c195dfb) Update repository config (#649) (#657) +- [ecd22af1](https://github.com/stashed/postgres/commit/ecd22af1) Use restic 0.12.0 (#637) (#645) +- [3a1fe354](https://github.com/stashed/postgres/commit/3a1fe354) Update Kubernetes v1.18.9 dependencies (#626) (#634) +- [c82407f8](https://github.com/stashed/postgres/commit/c82407f8) [cherry-pick] Update repository config (#600) (#608) +- [6432d062](https://github.com/stashed/postgres/commit/6432d062) [cherry-pick] Update repository config (#589) (#597) +- [2fe1bdf3](https://github.com/stashed/postgres/commit/2fe1bdf3) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#578) (#586) +- [719fb462](https://github.com/stashed/postgres/commit/719fb462) [cherry-pick] Update repository config (#566) (#574) +- [45871d26](https://github.com/stashed/postgres/commit/45871d26) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#555) (#563) +- [ecd689c8](https://github.com/stashed/postgres/commit/ecd689c8) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#544) (#552) +- [ad7687a2](https://github.com/stashed/postgres/commit/ad7687a2) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#534) (#542) +- [53fdf211](https://github.com/stashed/postgres/commit/53fdf211) [cherry-pick] Update README.md template (#523) (#531) +- [5c5e670c](https://github.com/stashed/postgres/commit/5c5e670c) [cherry-pick] Generate README.md using templates (#512) (#520) +- [a60735d0](https://github.com/stashed/postgres/commit/a60735d0) [cherry-pick] Speed up schema generation process (#501) (#509) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.11.10](https://github.com/stashed/stash/releases/tag/v0.11.10) + +- [cd515d79](https://github.com/stashed/stash/commit/cd515d79) Prepare for release v0.11.10 (#1327) +- [34f6576e](https://github.com/stashed/stash/commit/34f6576e) Delete ClusterRoleBinding when backup/restore invoker is removed (#1326) +- [23c25326](https://github.com/stashed/stash/commit/23c25326) Use addon info from AppBinding for KubeDB managed databases (#1325) +- [99d6e168](https://github.com/stashed/stash/commit/99d6e168) Update repository config (#1323) +- [14a940fb](https://github.com/stashed/stash/commit/14a940fb) Update repository config (#1321) +- [0338a91d](https://github.com/stashed/stash/commit/0338a91d) Update Kubernetes v1.18.9 dependencies (#1319) +- [b9063896](https://github.com/stashed/stash/commit/b9063896) Enable running as a kubedb extension +- [79240c53](https://github.com/stashed/stash/commit/79240c53) Use restic 0.12.0 (#1318) +- [7e0e2105](https://github.com/stashed/stash/commit/7e0e2105) Update Kubernetes v1.18.9 dependencies (#1317) +- [757af516](https://github.com/stashed/stash/commit/757af516) Update Kubernetes v1.18.9 dependencies (#1314) +- [f955eff8](https://github.com/stashed/stash/commit/f955eff8) Update repository config (#1305) +- [e583607f](https://github.com/stashed/stash/commit/e583607f) Update repository config (#1304) +- [ba70668b](https://github.com/stashed/stash/commit/ba70668b) Update Kubernetes v1.18.9 dependencies (#1301) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2021.03.11.md b/content/docs/v2024.12.18/CHANGELOG-v2021.03.11.md new file mode 100644 index 0000000000..5bd9efb079 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2021.03.11.md @@ -0,0 +1,104 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2021.03.11 + name: Changelog-v2021.03.11 + parent: welcome + weight: 20210311 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2021.03.11/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2021.03.11/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2021.03.11 (2021-03-12) + + +## [stashed/catalog](https://github.com/stashed/catalog) + +### [v2021.03.11](https://github.com/stashed/catalog/releases/tag/v2021.03.11) + +- [3544e1b](https://github.com/stashed/catalog/commit/3544e1b) Update semvers library (#63) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v0.11.11](https://github.com/stashed/installer/releases/tag/v0.11.11) + +- [6cb1c71](https://github.com/stashed/installer/commit/6cb1c71) Prepare for release v0.11.11 (#159) +- [3a8941a](https://github.com/stashed/installer/commit/3a8941a) Auto download api repo to update crds (#158) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2021.03.17.md b/content/docs/v2024.12.18/CHANGELOG-v2021.03.17.md new file mode 100644 index 0000000000..8ca3d2475e --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2021.03.17.md @@ -0,0 +1,228 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2021.03.17 + name: Changelog-v2021.03.17 + parent: welcome + weight: 20210317 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2021.03.17/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2021.03.17/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2021.03.17 (2021-03-17) + + +## [appscode/stash-enterprise](https://github.com/appscode/stash-enterprise) + +### [v0.12.0](https://github.com/appscode/stash-enterprise/releases/tag/v0.12.0) + +- [301bd05f](https://github.com/appscode/stash-enterprise/commit/301bd05f) Prepare for release v0.12.0 (#86) + + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.12.0](https://github.com/stashed/apimachinery/releases/tag/v0.12.0) + + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.12.0](https://github.com/stashed/cli/releases/tag/v0.12.0) + +- [f1ca9e2](https://github.com/stashed/cli/commit/f1ca9e2) Prepare for release v0.12.0 (#114) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v0.12.0](https://github.com/stashed/installer/releases/tag/v0.12.0) + +- [adbca35](https://github.com/stashed/installer/commit/adbca35) Prepare for release v0.12.0 (#166) +- [47cc4cf](https://github.com/stashed/installer/commit/47cc4cf) Use perconaxtradb-*-5.7 +- [801f30c](https://github.com/stashed/installer/commit/801f30c) Update dependencies + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [10.14-v5](https://github.com/stashed/postgres/releases/tag/10.14-v5) + +- [57eecdc3](https://github.com/stashed/postgres/commit/57eecdc3) Prepare for release 10.14.0-v5 (#716) +- [9a56adea](https://github.com/stashed/postgres/commit/9a56adea) Fix Makefile (#705) (#706) +- [925bd8e6](https://github.com/stashed/postgres/commit/925bd8e6) TLS support for postgres (#694) (#695) +- [6509c44f](https://github.com/stashed/postgres/commit/6509c44f) [cherry-pick] Update repository config (#683) (#684) +- [31626977](https://github.com/stashed/postgres/commit/31626977) Add auto-backup doc + Restructure docs (#618) (#673) +- [2602a2e5](https://github.com/stashed/postgres/commit/2602a2e5) [cherry-pick] Don't overwrite superuser password of restored database (#660) (#663) +- [3a5c3f93](https://github.com/stashed/postgres/commit/3a5c3f93) Update repository config (#649) (#650) +- [4638354a](https://github.com/stashed/postgres/commit/4638354a) Use restic 0.12.0 (#637) (#638) +- [b81480ec](https://github.com/stashed/postgres/commit/b81480ec) Update Kubernetes v1.18.9 dependencies (#626) (#627) +- [7f7c4eb8](https://github.com/stashed/postgres/commit/7f7c4eb8) [cherry-pick] Check codespan schema (#617) (#619) +- [cab4cb38](https://github.com/stashed/postgres/commit/cab4cb38) [cherry-pick] Update repository config (#600) (#601) +- [fd9fa30f](https://github.com/stashed/postgres/commit/fd9fa30f) [cherry-pick] Update repository config (#589) (#590) +- [29f17df8](https://github.com/stashed/postgres/commit/29f17df8) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#578) (#579) +- [cb6be80f](https://github.com/stashed/postgres/commit/cb6be80f) [cherry-pick] Update repository config (#566) (#567) +- [3033a772](https://github.com/stashed/postgres/commit/3033a772) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#555) (#556) +- [bf03d98d](https://github.com/stashed/postgres/commit/bf03d98d) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#544) (#545) +- [b2fdc143](https://github.com/stashed/postgres/commit/b2fdc143) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#534) (#535) +- [c898ee57](https://github.com/stashed/postgres/commit/c898ee57) [cherry-pick] Update README.md template (#523) (#524) +- [fadedccd](https://github.com/stashed/postgres/commit/fadedccd) [cherry-pick] Generate README.md using templates (#512) (#513) +- [46e2b6dd](https://github.com/stashed/postgres/commit/46e2b6dd) [cherry-pick] Speed up schema generation process (#501) (#502) + + +### [11.9-v5](https://github.com/stashed/postgres/releases/tag/11.9-v5) + +- [45ecd27f](https://github.com/stashed/postgres/commit/45ecd27f) Prepare for release 11.9-v5 (#725) +- [e7c1360f](https://github.com/stashed/postgres/commit/e7c1360f) Move docs into stashed/docs repo + Cleanup (#723) +- [2a7a4f96](https://github.com/stashed/postgres/commit/2a7a4f96) Prepare for release 11.9.0-v5 (#717) +- [e673d3c0](https://github.com/stashed/postgres/commit/e673d3c0) Fix Makefile (#705) (#711) +- [c8e9b998](https://github.com/stashed/postgres/commit/c8e9b998) TLS support for postgres (#694) (#700) +- [ebc0a1f9](https://github.com/stashed/postgres/commit/ebc0a1f9) [cherry-pick] Update repository config (#683) (#689) +- [baa94cf6](https://github.com/stashed/postgres/commit/baa94cf6) Add auto-backup doc + Restructure docs (#618) (#678) +- [06d62688](https://github.com/stashed/postgres/commit/06d62688) [cherry-pick] Don't overwrite superuser password of restored database (#660) (#668) +- [7fa729aa](https://github.com/stashed/postgres/commit/7fa729aa) Update repository config (#649) (#655) +- [637daf85](https://github.com/stashed/postgres/commit/637daf85) Use restic 0.12.0 (#637) (#643) +- [2ec2a638](https://github.com/stashed/postgres/commit/2ec2a638) Update Kubernetes v1.18.9 dependencies (#626) (#632) +- [db0433ed](https://github.com/stashed/postgres/commit/db0433ed) [cherry-pick] Check codespan schema (#617) (#624) +- [bb3d5515](https://github.com/stashed/postgres/commit/bb3d5515) [cherry-pick] Update repository config (#600) (#606) +- [c5b40a97](https://github.com/stashed/postgres/commit/c5b40a97) [cherry-pick] Update repository config (#589) (#595) +- [8ad35d50](https://github.com/stashed/postgres/commit/8ad35d50) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#578) (#584) +- [b5230e5f](https://github.com/stashed/postgres/commit/b5230e5f) [cherry-pick] Update repository config (#566) (#572) +- [593a9b7e](https://github.com/stashed/postgres/commit/593a9b7e) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#555) (#561) +- [ce7aa9d1](https://github.com/stashed/postgres/commit/ce7aa9d1) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#544) (#550) +- [ce8bdb41](https://github.com/stashed/postgres/commit/ce8bdb41) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#534) (#540) +- [da4c7f5b](https://github.com/stashed/postgres/commit/da4c7f5b) [cherry-pick] Update README.md template (#523) (#529) +- [d928f7ac](https://github.com/stashed/postgres/commit/d928f7ac) [cherry-pick] Generate README.md using templates (#512) (#518) +- [8bdef7b5](https://github.com/stashed/postgres/commit/8bdef7b5) [cherry-pick] Speed up schema generation process (#501) (#507) + + +### [12.4-v5](https://github.com/stashed/postgres/releases/tag/12.4-v5) + +- [b1140414](https://github.com/stashed/postgres/commit/b1140414) Prepare for release 12.4.0-v5 (#718) +- [403dfb51](https://github.com/stashed/postgres/commit/403dfb51) Fix Makefile (#705) (#712) +- [0e98e14e](https://github.com/stashed/postgres/commit/0e98e14e) TLS support for postgres (#694) (#701) +- [dfc98b6e](https://github.com/stashed/postgres/commit/dfc98b6e) [cherry-pick] Update repository config (#683) (#690) +- [3a8c1036](https://github.com/stashed/postgres/commit/3a8c1036) Add auto-backup doc + Restructure docs (#618) (#679) +- [a14c26d8](https://github.com/stashed/postgres/commit/a14c26d8) [cherry-pick] Don't overwrite superuser password of restored database (#660) (#669) +- [fc9f2302](https://github.com/stashed/postgres/commit/fc9f2302) Update repository config (#649) (#656) +- [ee83ac04](https://github.com/stashed/postgres/commit/ee83ac04) Use restic 0.12.0 (#637) (#644) +- [9b27b063](https://github.com/stashed/postgres/commit/9b27b063) Update Kubernetes v1.18.9 dependencies (#626) (#633) +- [32d5df70](https://github.com/stashed/postgres/commit/32d5df70) [cherry-pick] Check codespan schema (#617) (#625) +- [54bba3b1](https://github.com/stashed/postgres/commit/54bba3b1) [cherry-pick] Update repository config (#600) (#607) +- [2ac504d2](https://github.com/stashed/postgres/commit/2ac504d2) [cherry-pick] Update repository config (#589) (#596) +- [0b4f7bea](https://github.com/stashed/postgres/commit/0b4f7bea) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#578) (#585) +- [e3e822f3](https://github.com/stashed/postgres/commit/e3e822f3) [cherry-pick] Update repository config (#566) (#573) +- [956653e3](https://github.com/stashed/postgres/commit/956653e3) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#555) (#562) +- [ef5cc730](https://github.com/stashed/postgres/commit/ef5cc730) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#544) (#551) +- [02a8fc1b](https://github.com/stashed/postgres/commit/02a8fc1b) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#534) (#541) +- [8c4e765f](https://github.com/stashed/postgres/commit/8c4e765f) [cherry-pick] Update README.md template (#523) (#530) +- [66da0577](https://github.com/stashed/postgres/commit/66da0577) [cherry-pick] Generate README.md using templates (#512) (#519) +- [a5be3888](https://github.com/stashed/postgres/commit/a5be3888) [cherry-pick] Speed up schema generation process (#501) (#508) + + +### [13.1-v2](https://github.com/stashed/postgres/releases/tag/13.1-v2) + +- [6c59e1eb](https://github.com/stashed/postgres/commit/6c59e1eb) Prepare for release 13.1.0-v2 (#719) +- [be6c043a](https://github.com/stashed/postgres/commit/be6c043a) Fix Makefile (#705) (#713) +- [8805ee06](https://github.com/stashed/postgres/commit/8805ee06) TLS support for postgres (#694) (#702) +- [517a4e20](https://github.com/stashed/postgres/commit/517a4e20) [cherry-pick] Update repository config (#683) (#691) +- [fc935ae7](https://github.com/stashed/postgres/commit/fc935ae7) Add auto-backup doc + Restructure docs (#618) (#680) +- [ac84e6d3](https://github.com/stashed/postgres/commit/ac84e6d3) [cherry-pick] Don't overwrite superuser password of restored database (#660) (#670) +- [6c195dfb](https://github.com/stashed/postgres/commit/6c195dfb) Update repository config (#649) (#657) +- [ecd22af1](https://github.com/stashed/postgres/commit/ecd22af1) Use restic 0.12.0 (#637) (#645) +- [3a1fe354](https://github.com/stashed/postgres/commit/3a1fe354) Update Kubernetes v1.18.9 dependencies (#626) (#634) +- [c82407f8](https://github.com/stashed/postgres/commit/c82407f8) [cherry-pick] Update repository config (#600) (#608) +- [6432d062](https://github.com/stashed/postgres/commit/6432d062) [cherry-pick] Update repository config (#589) (#597) +- [2fe1bdf3](https://github.com/stashed/postgres/commit/2fe1bdf3) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#578) (#586) +- [719fb462](https://github.com/stashed/postgres/commit/719fb462) [cherry-pick] Update repository config (#566) (#574) +- [45871d26](https://github.com/stashed/postgres/commit/45871d26) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#555) (#563) +- [ecd689c8](https://github.com/stashed/postgres/commit/ecd689c8) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#544) (#552) +- [ad7687a2](https://github.com/stashed/postgres/commit/ad7687a2) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#534) (#542) +- [53fdf211](https://github.com/stashed/postgres/commit/53fdf211) [cherry-pick] Update README.md template (#523) (#531) +- [5c5e670c](https://github.com/stashed/postgres/commit/5c5e670c) [cherry-pick] Generate README.md using templates (#512) (#520) +- [a60735d0](https://github.com/stashed/postgres/commit/a60735d0) [cherry-pick] Speed up schema generation process (#501) (#509) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.12.0](https://github.com/stashed/stash/releases/tag/v0.12.0) + +- [b7700c29](https://github.com/stashed/stash/commit/b7700c29) Prepare for release v0.12.0 (#1330) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2021.04.07.md b/content/docs/v2024.12.18/CHANGELOG-v2021.04.07.md new file mode 100644 index 0000000000..762e2887c2 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2021.04.07.md @@ -0,0 +1,140 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2021.04.07 + name: Changelog-v2021.04.07 + parent: welcome + weight: 20210407 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2021.04.07/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2021.04.07/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2021.04.07 (2021-04-08) + + +## [appscode/stash-enterprise](https://github.com/appscode/stash-enterprise) + +### [v0.12.1](https://github.com/appscode/stash-enterprise/releases/tag/v0.12.1) + +- [e684150a](https://github.com/appscode/stash-enterprise/commit/e684150a) Prepare for release v0.12.1 (#89) +- [8c03495c](https://github.com/appscode/stash-enterprise/commit/8c03495c) Don't use global registry for installing operator from Makefile (#88) +- [fdf7b6d3](https://github.com/appscode/stash-enterprise/commit/fdf7b6d3) Use combined chart to install from Makefile (#87) +- [3d1a2193](https://github.com/appscode/stash-enterprise/commit/3d1a2193) Update license verifier to v0.8.0 +- [4be954f0](https://github.com/appscode/stash-enterprise/commit/4be954f0) Update license verifier +- [9a4f98db](https://github.com/appscode/stash-enterprise/commit/9a4f98db) Fix spelling + + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.12.1](https://github.com/stashed/apimachinery/releases/tag/v0.12.1) + +- [2a71cd73](https://github.com/stashed/apimachinery/commit/2a71cd73) Fix spelling + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.12.1](https://github.com/stashed/cli/releases/tag/v0.12.1) + +- [2532f94](https://github.com/stashed/cli/commit/2532f94) Prepare for release v0.12.1 (#115) +- [05bbfb4](https://github.com/stashed/cli/commit/05bbfb4) Fix spelling + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v0.12.1](https://github.com/stashed/installer/releases/tag/v0.12.1) + +- [9ec212c](https://github.com/stashed/installer/commit/9ec212c) Prepare for release v0.12.1 (#171) +- [20a78f1](https://github.com/stashed/installer/commit/20a78f1) Allow passing registry fqdn (#170) +- [f2688f6](https://github.com/stashed/installer/commit/f2688f6) Fix spelling + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.12.1](https://github.com/stashed/stash/releases/tag/v0.12.1) + +- [5c2f6eba](https://github.com/stashed/stash/commit/5c2f6eba) Prepare for release v0.12.1 (#1337) +- [5b8b134f](https://github.com/stashed/stash/commit/5b8b134f) Don't use global resgistry to install operator from Makefile (#1336) +- [32bc9f82](https://github.com/stashed/stash/commit/32bc9f82) Register RestoreBatch CRD + Fix Makefile (#1331) +- [c42b3aee](https://github.com/stashed/stash/commit/c42b3aee) Update license verifier to v0.8.0 +- [083ec543](https://github.com/stashed/stash/commit/083ec543) Update license verifier +- [db1668ba](https://github.com/stashed/stash/commit/db1668ba) Fix spelling + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2021.04.09.md b/content/docs/v2024.12.18/CHANGELOG-v2021.04.09.md new file mode 100644 index 0000000000..b7ecbbaed4 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2021.04.09.md @@ -0,0 +1,375 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2021.04.09 + name: Changelog-v2021.04.09 + parent: welcome + weight: 20210409 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2021.04.09/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2021.04.09/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2021.04.09 (2021-04-09) + + +## [appscode/stash-enterprise](https://github.com/appscode/stash-enterprise) + +### [v0.12.2](https://github.com/appscode/stash-enterprise/releases/tag/v0.12.2) + +- [8692accb](https://github.com/appscode/stash-enterprise/commit/8692accb) Prepare for release v0.12.2 (#90) + + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.12.2](https://github.com/stashed/apimachinery/releases/tag/v0.12.2) + +- [2a0eefc6](https://github.com/stashed/apimachinery/commit/2a0eefc6) Update readme + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.12.2](https://github.com/stashed/cli/releases/tag/v0.12.2) + +- [9c95d5e](https://github.com/stashed/cli/commit/9c95d5e) Prepare for release v0.12.2 (#116) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v8](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v8) + +- [3267fe97](https://github.com/stashed/elasticsearch/commit/3267fe97) Prepare for release 5.6.4-v8 (#735) +- [301c5556](https://github.com/stashed/elasticsearch/commit/301c5556) [cherry-pick] Update license verifier to v0.8.0 (#727) +- [7f7dcc51](https://github.com/stashed/elasticsearch/commit/7f7dcc51) [cherry-pick] Update license verifier (#719) +- [0676a68c](https://github.com/stashed/elasticsearch/commit/0676a68c) Move docs into stashed/docs repo + Cleanup (#718) + + +### [6.2.4-v8](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v8) + +- [3ff81b34](https://github.com/stashed/elasticsearch/commit/3ff81b34) Prepare for release 6.2.4-v8 (#736) +- [49c75ffb](https://github.com/stashed/elasticsearch/commit/49c75ffb) [cherry-pick] Update license verifier to v0.8.0 (#728) +- [abe48a84](https://github.com/stashed/elasticsearch/commit/abe48a84) [cherry-pick] Update license verifier (#720) +- [0912790c](https://github.com/stashed/elasticsearch/commit/0912790c) Move docs into stashed/docs repo + Cleanup (#718) + + +### [6.3.0-v8](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v8) + +- [6018f259](https://github.com/stashed/elasticsearch/commit/6018f259) Prepare for release 6.3.0-v8 (#737) +- [d479c0dd](https://github.com/stashed/elasticsearch/commit/d479c0dd) [cherry-pick] Update license verifier to v0.8.0 (#729) +- [5e96c2ba](https://github.com/stashed/elasticsearch/commit/5e96c2ba) [cherry-pick] Update license verifier (#721) +- [1e6f0d63](https://github.com/stashed/elasticsearch/commit/1e6f0d63) Move docs into stashed/docs repo + Cleanup (#718) + + +### [6.4.0-v8](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v8) + +- [cf4b7e4a](https://github.com/stashed/elasticsearch/commit/cf4b7e4a) Prepare for release 6.4.0-v8 (#738) +- [b84ce80b](https://github.com/stashed/elasticsearch/commit/b84ce80b) [cherry-pick] Update license verifier to v0.8.0 (#730) +- [ddab0380](https://github.com/stashed/elasticsearch/commit/ddab0380) [cherry-pick] Update license verifier (#722) +- [1abd1cb8](https://github.com/stashed/elasticsearch/commit/1abd1cb8) Move docs into stashed/docs repo + Cleanup (#718) + + +### [6.5.3-v8](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v8) + +- [c095b0af](https://github.com/stashed/elasticsearch/commit/c095b0af) Prepare for release 6.5.3-v8 (#739) +- [d5b9fc25](https://github.com/stashed/elasticsearch/commit/d5b9fc25) [cherry-pick] Update license verifier to v0.8.0 (#731) +- [00ee62a7](https://github.com/stashed/elasticsearch/commit/00ee62a7) [cherry-pick] Update license verifier (#723) +- [f12778ec](https://github.com/stashed/elasticsearch/commit/f12778ec) Move docs into stashed/docs repo + Cleanup (#718) + + +### [6.8.0-v8](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v8) + +- [0bce530d](https://github.com/stashed/elasticsearch/commit/0bce530d) Prepare for release 6.8.0-v8 (#740) +- [983efdcf](https://github.com/stashed/elasticsearch/commit/983efdcf) [cherry-pick] Update license verifier to v0.8.0 (#732) +- [b2238d19](https://github.com/stashed/elasticsearch/commit/b2238d19) [cherry-pick] Update license verifier (#724) +- [8099ace3](https://github.com/stashed/elasticsearch/commit/8099ace3) Move docs into stashed/docs repo + Cleanup (#718) + + +### [7.2.0-v8](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v8) + +- [c3777969](https://github.com/stashed/elasticsearch/commit/c3777969) Prepare for release 7.2.0-v8 (#741) +- [efbd66ba](https://github.com/stashed/elasticsearch/commit/efbd66ba) [cherry-pick] Update license verifier to v0.8.0 (#733) +- [120bef54](https://github.com/stashed/elasticsearch/commit/120bef54) [cherry-pick] Update license verifier (#725) +- [142238e6](https://github.com/stashed/elasticsearch/commit/142238e6) Move docs into stashed/docs repo + Cleanup (#718) + + +### [7.3.2-v8](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v8) + +- [0d2ba065](https://github.com/stashed/elasticsearch/commit/0d2ba065) Prepare for release 7.3.2-v8 (#742) +- [7252f84c](https://github.com/stashed/elasticsearch/commit/7252f84c) [cherry-pick] Update license verifier to v0.8.0 (#734) +- [fdaa39d3](https://github.com/stashed/elasticsearch/commit/fdaa39d3) [cherry-pick] Update license verifier (#726) +- [e28fcc97](https://github.com/stashed/elasticsearch/commit/e28fcc97) Move docs into stashed/docs repo + Cleanup (#718) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2021.04.09](https://github.com/stashed/installer/releases/tag/v2021.04.09) + +- [39bdc8e](https://github.com/stashed/installer/commit/39bdc8e) Prepare for release v2021.04.09 (#172) + + + +## [stashed/mariadb](https://github.com/stashed/mariadb) + +### [10.5.8-v2](https://github.com/stashed/mariadb/releases/tag/10.5.8-v2) + +- [cb2457b](https://github.com/stashed/mariadb/commit/cb2457b) Prepare for release 10.5.8-v2 (#92) +- [9ad8d65](https://github.com/stashed/mariadb/commit/9ad8d65) [cherry-pick] Update license verifier to v0.8.0 (#91) +- [32d8eab](https://github.com/stashed/mariadb/commit/32d8eab) [cherry-pick] Update license verifier (#90) +- [99e66bf](https://github.com/stashed/mariadb/commit/99e66bf) Move docs into stashed/docs repo + Cleanup (#89) +- [017f7dc](https://github.com/stashed/mariadb/commit/017f7dc) [cherry-pick] Update MariaDB Image version from 10.5 to 10.5.8 (#85) (#86) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v7](https://github.com/stashed/mongodb/releases/tag/3.4.17-v7) + +- [c330b36d](https://github.com/stashed/mongodb/commit/c330b36d) Prepare for release 3.4.17-v7 (#874) +- [7cc2dc3a](https://github.com/stashed/mongodb/commit/7cc2dc3a) [cherry-pick] Update license verifier to v0.8.0 (#864) +- [819ae84e](https://github.com/stashed/mongodb/commit/819ae84e) [cherry-pick] Update license verifier (#856) +- [04461734](https://github.com/stashed/mongodb/commit/04461734) Move docs into stashed/docs repo + Cleanup (#855) + + +### [3.4.22-v7](https://github.com/stashed/mongodb/releases/tag/3.4.22-v7) + +- [cf3b8d58](https://github.com/stashed/mongodb/commit/cf3b8d58) Prepare for release 3.4.22-v7 (#875) +- [009e15c7](https://github.com/stashed/mongodb/commit/009e15c7) [cherry-pick] Update license verifier to v0.8.0 (#865) +- [a9ac247a](https://github.com/stashed/mongodb/commit/a9ac247a) [cherry-pick] Update license verifier (#857) +- [fcef85e4](https://github.com/stashed/mongodb/commit/fcef85e4) Move docs into stashed/docs repo + Cleanup (#855) + + +### [3.6.8-v7](https://github.com/stashed/mongodb/releases/tag/3.6.8-v7) + +- [b8e59d9f](https://github.com/stashed/mongodb/commit/b8e59d9f) Prepare for release 3.6.8-v7 (#877) +- [5854bdcb](https://github.com/stashed/mongodb/commit/5854bdcb) [cherry-pick] Update license verifier (#859) +- [7c5b032d](https://github.com/stashed/mongodb/commit/7c5b032d) Move docs into stashed/docs repo + Cleanup (#855) + + +### [3.6.13-v7](https://github.com/stashed/mongodb/releases/tag/3.6.13-v7) + +- [bf2677df](https://github.com/stashed/mongodb/commit/bf2677df) Prepare for release 3.6.13-v7 (#876) +- [54301fe1](https://github.com/stashed/mongodb/commit/54301fe1) [cherry-pick] Update license verifier to v0.8.0 (#866) +- [1de5beaf](https://github.com/stashed/mongodb/commit/1de5beaf) [cherry-pick] Update license verifier (#858) +- [25d23e5e](https://github.com/stashed/mongodb/commit/25d23e5e) Move docs into stashed/docs repo + Cleanup (#855) + + +### [4.0.3-v7](https://github.com/stashed/mongodb/releases/tag/4.0.3-v7) + +- [9ec6ccd0](https://github.com/stashed/mongodb/commit/9ec6ccd0) Prepare for release 4.0.3-v7 (#879) +- [cf982cca](https://github.com/stashed/mongodb/commit/cf982cca) [cherry-pick] Update license verifier to v0.8.0 (#868) +- [e8cdd177](https://github.com/stashed/mongodb/commit/e8cdd177) [cherry-pick] Update license verifier (#861) +- [fc2e6da5](https://github.com/stashed/mongodb/commit/fc2e6da5) Move docs into stashed/docs repo + Cleanup (#855) + + +### [4.0.5-v7](https://github.com/stashed/mongodb/releases/tag/4.0.5-v7) + +- [4976afaf](https://github.com/stashed/mongodb/commit/4976afaf) Prepare for release 4.0.5-v7 (#880) +- [091ba134](https://github.com/stashed/mongodb/commit/091ba134) [cherry-pick] Update license verifier to v0.8.0 (#869) +- [f3b618ac](https://github.com/stashed/mongodb/commit/f3b618ac) [cherry-pick] Update license verifier (#862) +- [69d29d04](https://github.com/stashed/mongodb/commit/69d29d04) Move docs into stashed/docs repo + Cleanup (#855) + + +### [4.0.11-v7](https://github.com/stashed/mongodb/releases/tag/4.0.11-v7) + +- [7c9f57cf](https://github.com/stashed/mongodb/commit/7c9f57cf) Prepare for release 4.0.11-v7 (#878) +- [e7346419](https://github.com/stashed/mongodb/commit/e7346419) [cherry-pick] Update license verifier to v0.8.0 (#867) +- [02e4dfb3](https://github.com/stashed/mongodb/commit/02e4dfb3) [cherry-pick] Update license verifier (#860) +- [d0dee643](https://github.com/stashed/mongodb/commit/d0dee643) Move docs into stashed/docs repo + Cleanup (#855) + + +### [4.1.4-v7](https://github.com/stashed/mongodb/releases/tag/4.1.4-v7) + +- [a4961009](https://github.com/stashed/mongodb/commit/a4961009) Prepare for release 4.1.4-v7 (#882) +- [2d167d67](https://github.com/stashed/mongodb/commit/2d167d67) [cherry-pick] Update license verifier to v0.8.0 (#871) +- [27ae4cc2](https://github.com/stashed/mongodb/commit/27ae4cc2) Update license verifier +- [0cd2fb73](https://github.com/stashed/mongodb/commit/0cd2fb73) Move docs into stashed/docs repo + Cleanup (#855) + + +### [4.1.7-v7](https://github.com/stashed/mongodb/releases/tag/4.1.7-v7) + +- [b8323b2f](https://github.com/stashed/mongodb/commit/b8323b2f) Prepare for release 4.1.7-v7 (#883) +- [1ccc8c61](https://github.com/stashed/mongodb/commit/1ccc8c61) [cherry-pick] Update license verifier to v0.8.0 (#872) +- [d03df49b](https://github.com/stashed/mongodb/commit/d03df49b) Update license verifier +- [d1808ec4](https://github.com/stashed/mongodb/commit/d1808ec4) Move docs into stashed/docs repo + Cleanup (#855) + + +### [4.1.13-v7](https://github.com/stashed/mongodb/releases/tag/4.1.13-v7) + +- [53eb5dc1](https://github.com/stashed/mongodb/commit/53eb5dc1) Prepare for release 4.1.13-v7 (#881) +- [3419f461](https://github.com/stashed/mongodb/commit/3419f461) [cherry-pick] Update license verifier to v0.8.0 (#870) +- [16d315f6](https://github.com/stashed/mongodb/commit/16d315f6) [cherry-pick] Update license verifier (#863) +- [118fd042](https://github.com/stashed/mongodb/commit/118fd042) Move docs into stashed/docs repo + Cleanup (#855) + + +### [4.2.3-v7](https://github.com/stashed/mongodb/releases/tag/4.2.3-v7) + +- [4e45e4ca](https://github.com/stashed/mongodb/commit/4e45e4ca) Prepare for release 4.2.3-v7 (#884) +- [7271e889](https://github.com/stashed/mongodb/commit/7271e889) [cherry-pick] Update license verifier to v0.8.0 (#873) +- [ddeff341](https://github.com/stashed/mongodb/commit/ddeff341) Update license verifier +- [2806781c](https://github.com/stashed/mongodb/commit/2806781c) Move docs into stashed/docs repo + Cleanup (#855) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v8](https://github.com/stashed/mysql/releases/tag/5.7.25-v8) + +- [43e5c9f](https://github.com/stashed/mysql/commit/43e5c9f) Prepare for release 5.7.25-v8 (#364) +- [251608d](https://github.com/stashed/mysql/commit/251608d) [cherry-pick] Update license verifier to v0.8.0 (#360) +- [2c41000](https://github.com/stashed/mysql/commit/2c41000) [cherry-pick] Update license verifier (#356) +- [9ee9e47](https://github.com/stashed/mysql/commit/9ee9e47) Move docs into stashed/docs repo + Cleanup (#355) + + +### [8.0.3-v8](https://github.com/stashed/mysql/releases/tag/8.0.3-v8) + +- [363bcab](https://github.com/stashed/mysql/commit/363bcab) Prepare for release 8.0.3-v8 (#367) +- [174f01c](https://github.com/stashed/mysql/commit/174f01c) [cherry-pick] Update license verifier to v0.8.0 (#363) +- [42f6d9d](https://github.com/stashed/mysql/commit/42f6d9d) [cherry-pick] Update license verifier (#359) +- [10c6a6f](https://github.com/stashed/mysql/commit/10c6a6f) Move docs into stashed/docs repo + Cleanup (#355) + + +### [8.0.14-v8](https://github.com/stashed/mysql/releases/tag/8.0.14-v8) + +- [ef07360](https://github.com/stashed/mysql/commit/ef07360) Prepare for release 8.0.14-v8 (#365) +- [4567286](https://github.com/stashed/mysql/commit/4567286) [cherry-pick] Update license verifier to v0.8.0 (#361) +- [12336f3](https://github.com/stashed/mysql/commit/12336f3) [cherry-pick] Update license verifier (#357) +- [3131282](https://github.com/stashed/mysql/commit/3131282) Move docs into stashed/docs repo + Cleanup (#355) + + +### [8.0.21-v2](https://github.com/stashed/mysql/releases/tag/8.0.21-v2) + +- [a1fd10f](https://github.com/stashed/mysql/commit/a1fd10f) Prepare for release 8.0.21-v2 (#366) +- [63f2184](https://github.com/stashed/mysql/commit/63f2184) [cherry-pick] Update license verifier to v0.8.0 (#362) +- [24ebab1](https://github.com/stashed/mysql/commit/24ebab1) [cherry-pick] Update license verifier (#358) +- [47ff7a2](https://github.com/stashed/mysql/commit/47ff7a2) Move docs into stashed/docs repo + Cleanup (#355) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v6](https://github.com/stashed/postgres/releases/tag/9.6.19-v6) + +- [952e50a2](https://github.com/stashed/postgres/commit/952e50a2) Prepare for release 9.6.19-v6 (#744) +- [271c6399](https://github.com/stashed/postgres/commit/271c6399) [cherry-pick] Update license verifier to v0.8.0 (#739) +- [a4f8fdfd](https://github.com/stashed/postgres/commit/a4f8fdfd) [cherry-pick] Update license verifier (#734) +- [7deba428](https://github.com/stashed/postgres/commit/7deba428) Prepare for release 9.6.19-v5 (#728) +- [372ed379](https://github.com/stashed/postgres/commit/372ed379) Move docs into stashed/docs repo + Cleanup (#723) + + +### [10.14-v6](https://github.com/stashed/postgres/releases/tag/10.14-v6) + +- [6e5e02c0](https://github.com/stashed/postgres/commit/6e5e02c0) Prepare for release 10.14-v6 (#740) +- [dc5cea73](https://github.com/stashed/postgres/commit/dc5cea73) [cherry-pick] Update license verifier to v0.8.0 (#735) +- [1578dde5](https://github.com/stashed/postgres/commit/1578dde5) [cherry-pick] Update license verifier (#730) +- [c08f7b46](https://github.com/stashed/postgres/commit/c08f7b46) Prepare for release 10.14-v5 (#724) +- [23e24762](https://github.com/stashed/postgres/commit/23e24762) Move docs into stashed/docs repo + Cleanup (#723) + + +### [11.9-v6](https://github.com/stashed/postgres/releases/tag/11.9-v6) + +- [ccf2b20e](https://github.com/stashed/postgres/commit/ccf2b20e) Prepare for release 11.9-v6 (#741) +- [9f1c4f5e](https://github.com/stashed/postgres/commit/9f1c4f5e) [cherry-pick] Update license verifier to v0.8.0 (#736) +- [59907d93](https://github.com/stashed/postgres/commit/59907d93) [cherry-pick] Update license verifier (#731) +- [45ecd27f](https://github.com/stashed/postgres/commit/45ecd27f) Prepare for release 11.9-v5 (#725) +- [e7c1360f](https://github.com/stashed/postgres/commit/e7c1360f) Move docs into stashed/docs repo + Cleanup (#723) + + +### [12.4-v6](https://github.com/stashed/postgres/releases/tag/12.4-v6) + +- [582fb725](https://github.com/stashed/postgres/commit/582fb725) Prepare for release 12.4-v6 (#742) +- [b21ade58](https://github.com/stashed/postgres/commit/b21ade58) [cherry-pick] Update license verifier to v0.8.0 (#737) +- [4c0126bf](https://github.com/stashed/postgres/commit/4c0126bf) [cherry-pick] Update license verifier (#732) + + +### [13.1-v3](https://github.com/stashed/postgres/releases/tag/13.1-v3) + +- [2d214d15](https://github.com/stashed/postgres/commit/2d214d15) Prepare for release 13.1-v3 (#743) +- [2da7f9fb](https://github.com/stashed/postgres/commit/2da7f9fb) [cherry-pick] Update license verifier to v0.8.0 (#738) +- [842effc0](https://github.com/stashed/postgres/commit/842effc0) [cherry-pick] Update license verifier (#733) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.12.2](https://github.com/stashed/stash/releases/tag/v0.12.2) + +- [50f8a075](https://github.com/stashed/stash/commit/50f8a075) Prepare for release v0.12.2 (#1338) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2021.04.12.md b/content/docs/v2024.12.18/CHANGELOG-v2021.04.12.md new file mode 100644 index 0000000000..e75b43c6fe --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2021.04.12.md @@ -0,0 +1,311 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2021.04.12 + name: Changelog-v2021.04.12 + parent: welcome + weight: 20210412 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2021.04.12/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2021.04.12/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2021.04.12 (2021-04-10) + + +## [appscode/stash-enterprise](https://github.com/appscode/stash-enterprise) + +### [v0.12.3](https://github.com/appscode/stash-enterprise/releases/tag/v0.12.3) + +- [4511a60f](https://github.com/appscode/stash-enterprise/commit/4511a60f) Prepare for release v0.12.3 (#91) +- [d84a4d5b](https://github.com/appscode/stash-enterprise/commit/d84a4d5b) Use license-verifier v0.8.1 + + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.12.3](https://github.com/stashed/apimachinery/releases/tag/v0.12.3) + +- [02428080](https://github.com/stashed/apimachinery/commit/02428080) Update readme + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.12.3](https://github.com/stashed/cli/releases/tag/v0.12.3) + +- [2dfae90](https://github.com/stashed/cli/commit/2dfae90) Prepare for release v0.12.3 (#117) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v9](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v9) + +- [4418b9be](https://github.com/stashed/elasticsearch/commit/4418b9be) Prepare for release 5.6.4-v9 (#749) +- [4472510b](https://github.com/stashed/elasticsearch/commit/4472510b) [cherry-pick] Use license-verifier v0.8.1 (#744) + + +### [6.2.4-v9](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v9) + +- [20b4c3ad](https://github.com/stashed/elasticsearch/commit/20b4c3ad) Prepare for release 6.2.4-v9 (#750) +- [dbd0843d](https://github.com/stashed/elasticsearch/commit/dbd0843d) [cherry-pick] Use license-verifier v0.8.1 (#745) + + +### [6.3.0-v9](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v9) + +- [f2a8bfd1](https://github.com/stashed/elasticsearch/commit/f2a8bfd1) Prepare for release 6.3.0-v9 (#751) +- [13983884](https://github.com/stashed/elasticsearch/commit/13983884) [cherry-pick] Use license-verifier v0.8.1 (#746) + + +### [6.4.0-v9](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v9) + +- [c24d3b01](https://github.com/stashed/elasticsearch/commit/c24d3b01) Prepare for release 6.4.0-v9 (#752) +- [6852abf1](https://github.com/stashed/elasticsearch/commit/6852abf1) [cherry-pick] Use license-verifier v0.8.1 (#747) + + +### [6.5.3-v9](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v9) + +- [7a6fbe57](https://github.com/stashed/elasticsearch/commit/7a6fbe57) Prepare for release 6.5.3-v9 (#753) +- [66955dcb](https://github.com/stashed/elasticsearch/commit/66955dcb) [cherry-pick] Use license-verifier v0.8.1 (#748) + + +### [6.8.0-v9](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v9) + +- [94e32907](https://github.com/stashed/elasticsearch/commit/94e32907) Prepare for release 6.8.0-v9 (#754) + + +### [7.2.0-v9](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v9) + +- [4830e6d2](https://github.com/stashed/elasticsearch/commit/4830e6d2) Prepare for release 7.2.0-v9 (#755) + + +### [7.3.2-v9](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v9) + +- [9dc99760](https://github.com/stashed/elasticsearch/commit/9dc99760) Prepare for release 7.3.2-v9 (#756) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2021.04.12](https://github.com/stashed/installer/releases/tag/v2021.04.12) + +- [2814743](https://github.com/stashed/installer/commit/2814743) Prepare for release v2021.04.12 (#173) + + + +## [stashed/mariadb](https://github.com/stashed/mariadb) + +### [10.5.8-v3](https://github.com/stashed/mariadb/releases/tag/10.5.8-v3) + +- [978701f](https://github.com/stashed/mariadb/commit/978701f) Prepare for release 10.5.8-v3 (#95) +- [365ef64](https://github.com/stashed/mariadb/commit/365ef64) [cherry-pick] Use license-verifier v0.8.1 (#94) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v8](https://github.com/stashed/mongodb/releases/tag/3.4.17-v8) + +- [08dbb5de](https://github.com/stashed/mongodb/commit/08dbb5de) Prepare for release 3.4.17-v8 (#895) +- [4794aac5](https://github.com/stashed/mongodb/commit/4794aac5) [cherry-pick] Use license-verifier v0.8.1 (#887) + + +### [3.4.22-v8](https://github.com/stashed/mongodb/releases/tag/3.4.22-v8) + +- [fd4313cf](https://github.com/stashed/mongodb/commit/fd4313cf) Prepare for release 3.4.22-v8 (#896) +- [cc166dc9](https://github.com/stashed/mongodb/commit/cc166dc9) [cherry-pick] Use license-verifier v0.8.1 (#888) + + +### [3.6.8-v8](https://github.com/stashed/mongodb/releases/tag/3.6.8-v8) + +- [5a1413b3](https://github.com/stashed/mongodb/commit/5a1413b3) Prepare for release 3.6.8-v8 (#898) +- [3188dd06](https://github.com/stashed/mongodb/commit/3188dd06) [cherry-pick] Use license-verifier v0.8.1 (#890) +- [1687801d](https://github.com/stashed/mongodb/commit/1687801d) Update license verifier to v0.8.0 (#885) + + +### [3.6.13-v8](https://github.com/stashed/mongodb/releases/tag/3.6.13-v8) + +- [1ed5ecde](https://github.com/stashed/mongodb/commit/1ed5ecde) Prepare for release 3.6.13-v8 (#897) +- [e41bdcaf](https://github.com/stashed/mongodb/commit/e41bdcaf) [cherry-pick] Use license-verifier v0.8.1 (#889) + + +### [4.0.3-v8](https://github.com/stashed/mongodb/releases/tag/4.0.3-v8) + +- [8df38a7f](https://github.com/stashed/mongodb/commit/8df38a7f) Prepare for release 4.0.3-v8 (#900) +- [8ac8b340](https://github.com/stashed/mongodb/commit/8ac8b340) [cherry-pick] Use license-verifier v0.8.1 (#892) + + +### [4.0.5-v8](https://github.com/stashed/mongodb/releases/tag/4.0.5-v8) + +- [e7ce9e4b](https://github.com/stashed/mongodb/commit/e7ce9e4b) Prepare for release 4.0.5-v8 (#901) +- [90f5bb72](https://github.com/stashed/mongodb/commit/90f5bb72) [cherry-pick] Use license-verifier v0.8.1 (#893) + + +### [4.0.11-v8](https://github.com/stashed/mongodb/releases/tag/4.0.11-v8) + +- [2000f928](https://github.com/stashed/mongodb/commit/2000f928) Prepare for release 4.0.11-v8 (#899) +- [3e95bb83](https://github.com/stashed/mongodb/commit/3e95bb83) [cherry-pick] Use license-verifier v0.8.1 (#891) + + +### [4.1.4-v8](https://github.com/stashed/mongodb/releases/tag/4.1.4-v8) + +- [be030cab](https://github.com/stashed/mongodb/commit/be030cab) Use license-verifier v0.8.1 (#905) +- [0f0c448e](https://github.com/stashed/mongodb/commit/0f0c448e) Prepare for release 4.1.4-v8 (#903) + + +### [4.1.7-v8](https://github.com/stashed/mongodb/releases/tag/4.1.7-v8) + +- [584b22c9](https://github.com/stashed/mongodb/commit/584b22c9) Use license-verifier v0.8.1 (#906) +- [c37c8f8d](https://github.com/stashed/mongodb/commit/c37c8f8d) Prepare for release 4.1.7-v8 (#904) + + +### [4.1.13-v8](https://github.com/stashed/mongodb/releases/tag/4.1.13-v8) + +- [391d1cd5](https://github.com/stashed/mongodb/commit/391d1cd5) Use license-verifier v0.8.1 (#907) +- [f6519aa2](https://github.com/stashed/mongodb/commit/f6519aa2) Prepare for release 4.1.13-v8 (#902) + + +### [4.2.3-v8](https://github.com/stashed/mongodb/releases/tag/4.2.3-v8) + +- [67b1ba2d](https://github.com/stashed/mongodb/commit/67b1ba2d) Prepare for release 4.2.3-v8 (#908) +- [2a2a8e00](https://github.com/stashed/mongodb/commit/2a2a8e00) [cherry-pick] Use license-verifier v0.8.1 (#894) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v9](https://github.com/stashed/mysql/releases/tag/5.7.25-v9) + +- [1a963f9](https://github.com/stashed/mysql/commit/1a963f9) Prepare for release 5.7.25-v9 (#372) +- [da866ee](https://github.com/stashed/mysql/commit/da866ee) [cherry-pick] Use license-verifier v0.8.1 (#369) + + +### [8.0.3-v9](https://github.com/stashed/mysql/releases/tag/8.0.3-v9) + +- [3f2b1b0](https://github.com/stashed/mysql/commit/3f2b1b0) Prepare for release 8.0.3-v9 (#375) + + +### [8.0.14-v9](https://github.com/stashed/mysql/releases/tag/8.0.14-v9) + +- [5af1e60](https://github.com/stashed/mysql/commit/5af1e60) Prepare for release 8.0.14-v9 (#373) +- [0ebdaa8](https://github.com/stashed/mysql/commit/0ebdaa8) [cherry-pick] Use license-verifier v0.8.1 (#370) + + +### [8.0.21-v3](https://github.com/stashed/mysql/releases/tag/8.0.21-v3) + +- [9ca99ac](https://github.com/stashed/mysql/commit/9ca99ac) Prepare for release 8.0.21-v3 (#374) +- [b953faf](https://github.com/stashed/mysql/commit/b953faf) [cherry-pick] Use license-verifier v0.8.1 (#371) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v7](https://github.com/stashed/postgres/releases/tag/9.6.19-v7) + +- [a1704ca0](https://github.com/stashed/postgres/commit/a1704ca0) Prepare for release 9.6.19-v7 (#751) + + +### [10.14-v7](https://github.com/stashed/postgres/releases/tag/10.14-v7) + +- [b55e8661](https://github.com/stashed/postgres/commit/b55e8661) Prepare for release 10.14-v7 (#747) +- [33b87ceb](https://github.com/stashed/postgres/commit/33b87ceb) [cherry-pick] Use license-verifier v0.8.1 (#746) + + +### [11.9-v7](https://github.com/stashed/postgres/releases/tag/11.9-v7) + +- [b93b6c20](https://github.com/stashed/postgres/commit/b93b6c20) Prepare for release 11.9-v7 (#748) + + +### [12.4-v7](https://github.com/stashed/postgres/releases/tag/12.4-v7) + +- [2461f64e](https://github.com/stashed/postgres/commit/2461f64e) Prepare for release 12.4-v7 (#749) + + +### [13.1-v4](https://github.com/stashed/postgres/releases/tag/13.1-v4) + +- [b324dc20](https://github.com/stashed/postgres/commit/b324dc20) Prepare for release 13.1-v4 (#750) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.12.3](https://github.com/stashed/stash/releases/tag/v0.12.3) + +- [28a86cae](https://github.com/stashed/stash/commit/28a86cae) Prepare for release v0.12.3 (#1339) +- [2af7d576](https://github.com/stashed/stash/commit/2af7d576) Use license-verifier v0.8.1 + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2021.06.23.md b/content/docs/v2024.12.18/CHANGELOG-v2021.06.23.md new file mode 100644 index 0000000000..1a2711cbf3 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2021.06.23.md @@ -0,0 +1,368 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2021.06.23 + name: Changelog-v2021.06.23 + parent: welcome + weight: 20210623 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2021.06.23/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2021.06.23/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2021.06.23 (2021-06-18) + + +## [appscode/stash-enterprise](https://github.com/appscode/stash-enterprise) + +### [v0.14.1](https://github.com/appscode/stash-enterprise/releases/tag/v0.14.1) + +- [324ca10e](https://github.com/appscode/stash-enterprise/commit/324ca10e) Prepare for release v0.14.1 (#102) +- [917d2608](https://github.com/appscode/stash-enterprise/commit/917d2608) Update audit event attributes +- [8ecfe211](https://github.com/appscode/stash-enterprise/commit/8ecfe211) Use dynamic resource mapper +- [4e0584d5](https://github.com/appscode/stash-enterprise/commit/4e0584d5) Use Kubernetes 1.21.1 toolchain +- [4a9ace9c](https://github.com/appscode/stash-enterprise/commit/4a9ace9c) Update dependencies +- [960c4dbc](https://github.com/appscode/stash-enterprise/commit/960c4dbc) Create resilient event publisher (#101) + + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.14.1](https://github.com/stashed/apimachinery/releases/tag/v0.14.1) + +- [0cae462d](https://github.com/stashed/apimachinery/commit/0cae462d) Use Kubernetes 1.21.1 toolchain + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.14.1](https://github.com/stashed/cli/releases/tag/v0.14.1) + +- [cd0a22a](https://github.com/stashed/cli/commit/cd0a22a) Prepare for release v0.14.1 (#125) +- [f8937bb](https://github.com/stashed/cli/commit/f8937bb) Use Kubernetes 1.21.1 toolchain + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v11](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v11) + +- [7bc688cc](https://github.com/stashed/elasticsearch/commit/7bc688cc) Prepare for release 5.6.4-v11 (#837) +- [cb7338af](https://github.com/stashed/elasticsearch/commit/cb7338af) [cherry-pick] Use k8s 1.21.1 toolchain (#828) (#829) +- [9dfe4c77](https://github.com/stashed/elasticsearch/commit/9dfe4c77) Update README.md + + +### [6.2.4-v11](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v11) + +- [fda1bafa](https://github.com/stashed/elasticsearch/commit/fda1bafa) Prepare for release 6.2.4-v11 (#838) +- [678023d8](https://github.com/stashed/elasticsearch/commit/678023d8) [cherry-pick] Use k8s 1.21.1 toolchain (#828) (#830) +- [738515d8](https://github.com/stashed/elasticsearch/commit/738515d8) Update README.md + + +### [6.3.0-v11](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v11) + +- [d3ab747e](https://github.com/stashed/elasticsearch/commit/d3ab747e) Prepare for release 6.3.0-v11 (#839) +- [02ed39b4](https://github.com/stashed/elasticsearch/commit/02ed39b4) [cherry-pick] Use k8s 1.21.1 toolchain (#828) (#831) +- [0ec95b34](https://github.com/stashed/elasticsearch/commit/0ec95b34) Update README.md + + +### [6.4.0-v11](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v11) + +- [a2bcfc9e](https://github.com/stashed/elasticsearch/commit/a2bcfc9e) Prepare for release 6.4.0-v11 (#840) +- [d91b7e05](https://github.com/stashed/elasticsearch/commit/d91b7e05) [cherry-pick] Use k8s 1.21.1 toolchain (#828) (#832) +- [8349500c](https://github.com/stashed/elasticsearch/commit/8349500c) Update README.md + + +### [6.5.3-v11](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v11) + +- [651f9a49](https://github.com/stashed/elasticsearch/commit/651f9a49) Prepare for release 6.5.3-v11 (#841) +- [34491027](https://github.com/stashed/elasticsearch/commit/34491027) [cherry-pick] Use k8s 1.21.1 toolchain (#828) (#833) +- [506d776e](https://github.com/stashed/elasticsearch/commit/506d776e) Update README.md + + +### [6.8.0-v11](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v11) + +- [a577ae04](https://github.com/stashed/elasticsearch/commit/a577ae04) Prepare for release 6.8.0-v11 (#842) +- [8c39d538](https://github.com/stashed/elasticsearch/commit/8c39d538) [cherry-pick] Use k8s 1.21.1 toolchain (#828) (#834) +- [d0dddbe5](https://github.com/stashed/elasticsearch/commit/d0dddbe5) Update README.md + + +### [7.2.0-v11](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v11) + +- [6ba76941](https://github.com/stashed/elasticsearch/commit/6ba76941) Prepare for release 7.2.0-v11 (#843) +- [919991cd](https://github.com/stashed/elasticsearch/commit/919991cd) [cherry-pick] Use k8s 1.21.1 toolchain (#828) (#835) +- [dc90a100](https://github.com/stashed/elasticsearch/commit/dc90a100) Update README.md + + +### [7.3.2-v11](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v11) + +- [40e5c14d](https://github.com/stashed/elasticsearch/commit/40e5c14d) Prepare for release 7.3.2-v11 (#844) +- [94c66a0a](https://github.com/stashed/elasticsearch/commit/94c66a0a) [cherry-pick] Use k8s 1.21.1 toolchain (#828) (#836) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2021.06.23](https://github.com/stashed/installer/releases/tag/v2021.06.23) + +- [3667d8a](https://github.com/stashed/installer/commit/3667d8a) Prepare for release v2021.06.23 (#179) + + + +## [stashed/mariadb](https://github.com/stashed/mariadb) + +### [10.5.8-v4](https://github.com/stashed/mariadb/releases/tag/10.5.8-v4) + +- [87947d2](https://github.com/stashed/mariadb/commit/87947d2) Prepare for release 10.5.8-v4 (#110) +- [32b93aa](https://github.com/stashed/mariadb/commit/32b93aa) [cherry-pick] Use k8s 1.21.1 toolchain (#108) (#109) +- [35f57b9](https://github.com/stashed/mariadb/commit/35f57b9) [cherry-pick] Use klog/v2 (#106) (#107) +- [318f49c](https://github.com/stashed/mariadb/commit/318f49c) Use k8s 1.21.0 toolchain + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v10](https://github.com/stashed/mongodb/releases/tag/3.4.17-v10) + +- [d80bee20](https://github.com/stashed/mongodb/commit/d80bee20) Prepare for release 3.4.17-v10 (#1007) +- [97e2e07f](https://github.com/stashed/mongodb/commit/97e2e07f) [cherry-pick] Use k8s 1.21.1 toolchain (#994) (#995) +- [e7a3161a](https://github.com/stashed/mongodb/commit/e7a3161a) Update README.md + + +### [3.4.22-v10](https://github.com/stashed/mongodb/releases/tag/3.4.22-v10) + +- [5b3c7c83](https://github.com/stashed/mongodb/commit/5b3c7c83) Prepare for release 3.4.22-v10 (#1008) +- [b98e6cad](https://github.com/stashed/mongodb/commit/b98e6cad) [cherry-pick] Use k8s 1.21.1 toolchain (#994) (#996) +- [36abd30e](https://github.com/stashed/mongodb/commit/36abd30e) Update README.md + + +### [3.6.8-v10](https://github.com/stashed/mongodb/releases/tag/3.6.8-v10) + +- [9b3182f1](https://github.com/stashed/mongodb/commit/9b3182f1) Prepare for release 3.6.8-v10 (#1010) +- [b07985df](https://github.com/stashed/mongodb/commit/b07985df) [cherry-pick] Use k8s 1.21.1 toolchain (#994) (#998) +- [0455e209](https://github.com/stashed/mongodb/commit/0455e209) Update README.md + + +### [3.6.13-v10](https://github.com/stashed/mongodb/releases/tag/3.6.13-v10) + +- [52b38e73](https://github.com/stashed/mongodb/commit/52b38e73) Prepare for release 3.6.13-v10 (#1009) +- [822cdadb](https://github.com/stashed/mongodb/commit/822cdadb) [cherry-pick] Use k8s 1.21.1 toolchain (#994) (#997) +- [a83b7764](https://github.com/stashed/mongodb/commit/a83b7764) Update README.md + + +### [4.0.3-v10](https://github.com/stashed/mongodb/releases/tag/4.0.3-v10) + +- [b3f4d1d6](https://github.com/stashed/mongodb/commit/b3f4d1d6) Prepare for release 4.0.3-v10 (#1012) +- [adf02d15](https://github.com/stashed/mongodb/commit/adf02d15) [cherry-pick] Use k8s 1.21.1 toolchain (#994) (#1000) +- [4510d54e](https://github.com/stashed/mongodb/commit/4510d54e) Update README.md + + +### [4.0.5-v10](https://github.com/stashed/mongodb/releases/tag/4.0.5-v10) + +- [5f1cc079](https://github.com/stashed/mongodb/commit/5f1cc079) Prepare for release 4.0.5-v10 (#1013) +- [5b05f3a3](https://github.com/stashed/mongodb/commit/5b05f3a3) [cherry-pick] Use k8s 1.21.1 toolchain (#994) (#1001) +- [036fde58](https://github.com/stashed/mongodb/commit/036fde58) Update README.md + + +### [4.0.11-v10](https://github.com/stashed/mongodb/releases/tag/4.0.11-v10) + +- [ca1407ef](https://github.com/stashed/mongodb/commit/ca1407ef) Prepare for release 4.0.11-v10 (#1011) +- [8bda3737](https://github.com/stashed/mongodb/commit/8bda3737) [cherry-pick] Use k8s 1.21.1 toolchain (#994) (#999) +- [3a773347](https://github.com/stashed/mongodb/commit/3a773347) Update README.md + + +### [4.1.4-v10](https://github.com/stashed/mongodb/releases/tag/4.1.4-v10) + +- [77d5a66e](https://github.com/stashed/mongodb/commit/77d5a66e) Prepare for release 4.1.4-v10 (#1015) +- [442197d9](https://github.com/stashed/mongodb/commit/442197d9) [cherry-pick] Use k8s 1.21.1 toolchain (#994) (#1003) +- [3bb97952](https://github.com/stashed/mongodb/commit/3bb97952) Update README.md + + +### [4.1.7-v10](https://github.com/stashed/mongodb/releases/tag/4.1.7-v10) + +- [1a0160a2](https://github.com/stashed/mongodb/commit/1a0160a2) Prepare for release 4.1.7-v10 (#1016) +- [1e47a843](https://github.com/stashed/mongodb/commit/1e47a843) [cherry-pick] Use k8s 1.21.1 toolchain (#994) (#1004) +- [5f1a80f5](https://github.com/stashed/mongodb/commit/5f1a80f5) Update README.md + + +### [4.1.13-v10](https://github.com/stashed/mongodb/releases/tag/4.1.13-v10) + +- [01e88ef5](https://github.com/stashed/mongodb/commit/01e88ef5) Prepare for release 4.1.13-v10 (#1014) +- [56de5495](https://github.com/stashed/mongodb/commit/56de5495) [cherry-pick] Use k8s 1.21.1 toolchain (#994) (#1002) + + +### [4.2.3-v10](https://github.com/stashed/mongodb/releases/tag/4.2.3-v10) + +- [0dbaebb9](https://github.com/stashed/mongodb/commit/0dbaebb9) Prepare for release 4.2.3-v10 (#1017) +- [b2fcf2a0](https://github.com/stashed/mongodb/commit/b2fcf2a0) [cherry-pick] Use k8s 1.21.1 toolchain (#994) (#1005) +- [49254247](https://github.com/stashed/mongodb/commit/49254247) Update README.md + + +### [4.4.6-v1](https://github.com/stashed/mongodb/releases/tag/4.4.6-v1) + +- [13dd847b](https://github.com/stashed/mongodb/commit/13dd847b) Prepare for release 4.4.6-v1 (#1018) +- [fc0f1c1a](https://github.com/stashed/mongodb/commit/fc0f1c1a) [cherry-pick] Use k8s 1.21.1 toolchain (#994) (#1006) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v11](https://github.com/stashed/mysql/releases/tag/5.7.25-v11) + +- [f8e0fdc9](https://github.com/stashed/mysql/commit/f8e0fdc9) Prepare for release 5.7.25-v11 (#433) +- [12edbc10](https://github.com/stashed/mysql/commit/12edbc10) [cherry-pick] Use k8s 1.21.1 toolchain (#428) (#429) + + +### [8.0.3-v11](https://github.com/stashed/mysql/releases/tag/8.0.3-v11) + +- [100bede4](https://github.com/stashed/mysql/commit/100bede4) Prepare for release 8.0.3-v11 (#436) +- [0c38d8b4](https://github.com/stashed/mysql/commit/0c38d8b4) [cherry-pick] Use k8s 1.21.1 toolchain (#428) (#432) + + +### [8.0.14-v11](https://github.com/stashed/mysql/releases/tag/8.0.14-v11) + +- [98b64068](https://github.com/stashed/mysql/commit/98b64068) Prepare for release 8.0.14-v11 (#434) +- [3d73812c](https://github.com/stashed/mysql/commit/3d73812c) [cherry-pick] Use k8s 1.21.1 toolchain (#428) (#430) + + +### [8.0.21-v5](https://github.com/stashed/mysql/releases/tag/8.0.21-v5) + +- [52ee3f21](https://github.com/stashed/mysql/commit/52ee3f21) Prepare for release 8.0.21-v5 (#435) +- [89fc5316](https://github.com/stashed/mysql/commit/89fc5316) [cherry-pick] Use k8s 1.21.1 toolchain (#428) (#431) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-v6](https://github.com/stashed/percona-xtradb/releases/tag/5.7-v6) + +- [33b788d](https://github.com/stashed/percona-xtradb/commit/33b788d) Prepare for release 5.7-v6 (#184) +- [7809f18](https://github.com/stashed/percona-xtradb/commit/7809f18) [cherry-pick] Use k8s 1.21.1 toolchain (#183) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v9](https://github.com/stashed/postgres/releases/tag/9.6.19-v9) + +- [07ed8ee1](https://github.com/stashed/postgres/commit/07ed8ee1) Prepare for release 9.6.19-v9 (#817) +- [45bfe257](https://github.com/stashed/postgres/commit/45bfe257) [cherry-pick] Use k8s 1.21.1 toolchain (#807) (#812) +- [b30cecfe](https://github.com/stashed/postgres/commit/b30cecfe) Update README.md +- [d91ecdbf](https://github.com/stashed/postgres/commit/d91ecdbf) [cherry-pick] Only set "PGSSLMODE" mode env variable when SSL is enabled (#801) (#806) + + +### [10.14-v9](https://github.com/stashed/postgres/releases/tag/10.14-v9) + +- [457e2b3c](https://github.com/stashed/postgres/commit/457e2b3c) Prepare for release 10.14-v9 (#813) +- [75f06514](https://github.com/stashed/postgres/commit/75f06514) [cherry-pick] Use k8s 1.21.1 toolchain (#807) (#808) +- [d7999008](https://github.com/stashed/postgres/commit/d7999008) Update README.md +- [8ae4a408](https://github.com/stashed/postgres/commit/8ae4a408) [cherry-pick] Only set "PGSSLMODE" mode env variable when SSL is enabled (#801) (#802) + + +### [11.9-v9](https://github.com/stashed/postgres/releases/tag/11.9-v9) + +- [de7d67f5](https://github.com/stashed/postgres/commit/de7d67f5) Prepare for release 11.9-v9 (#814) +- [e866dbfd](https://github.com/stashed/postgres/commit/e866dbfd) [cherry-pick] Use k8s 1.21.1 toolchain (#807) (#809) +- [893fad13](https://github.com/stashed/postgres/commit/893fad13) [cherry-pick] Only set "PGSSLMODE" mode env variable when SSL is enabled (#801) (#803) + + +### [12.4-v9](https://github.com/stashed/postgres/releases/tag/12.4-v9) + +- [29bf3c21](https://github.com/stashed/postgres/commit/29bf3c21) Prepare for release 12.4-v9 (#815) +- [1599bb4a](https://github.com/stashed/postgres/commit/1599bb4a) [cherry-pick] Use k8s 1.21.1 toolchain (#807) (#810) +- [3148acf1](https://github.com/stashed/postgres/commit/3148acf1) [cherry-pick] Only set "PGSSLMODE" mode env variable when SSL is enabled (#801) (#804) + + +### [13.1-v6](https://github.com/stashed/postgres/releases/tag/13.1-v6) + +- [473db0aa](https://github.com/stashed/postgres/commit/473db0aa) Prepare for release 13.1-v6 (#816) +- [dd4c2230](https://github.com/stashed/postgres/commit/dd4c2230) [cherry-pick] Use k8s 1.21.1 toolchain (#807) (#811) +- [c9d8f903](https://github.com/stashed/postgres/commit/c9d8f903) Update README.md +- [5b0142cf](https://github.com/stashed/postgres/commit/5b0142cf) [cherry-pick] Only set "PGSSLMODE" mode env variable when SSL is enabled (#801) (#805) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.14.1](https://github.com/stashed/stash/releases/tag/v0.14.1) + +- [03aba1ac](https://github.com/stashed/stash/commit/03aba1ac) Prepare for release v0.14.1 (#1356) +- [78147be0](https://github.com/stashed/stash/commit/78147be0) Make audit event attributes match cloudevents spec +- [f49850d4](https://github.com/stashed/stash/commit/f49850d4) Use dynamic resource mapper +- [147525ef](https://github.com/stashed/stash/commit/147525ef) Use Kubernetes 1.21.1 toolchain +- [f86c22bf](https://github.com/stashed/stash/commit/f86c22bf) Create resilient event publisher (#1355) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2021.08.02.md b/content/docs/v2024.12.18/CHANGELOG-v2021.08.02.md new file mode 100644 index 0000000000..2ac8446437 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2021.08.02.md @@ -0,0 +1,438 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2021.08.02 + name: Changelog-v2021.08.02 + parent: welcome + weight: 20210802 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2021.08.02/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2021.08.02/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2021.08.02 (2021-07-31) + + +## [appscode/stash-enterprise](https://github.com/appscode/stash-enterprise) + +### [v0.15.0](https://github.com/appscode/stash-enterprise/releases/tag/v0.15.0) + +- [40cadc89](https://github.com/appscode/stash-enterprise/commit/40cadc89) Prepare for release v0.15.0 (#110) +- [bd4ca856](https://github.com/appscode/stash-enterprise/commit/bd4ca856) Improve duration format in BackupSession and RestoreSession (#109) +- [1d9cc4dd](https://github.com/appscode/stash-enterprise/commit/1d9cc4dd) Update dependencies (#108) +- [8af6b01b](https://github.com/appscode/stash-enterprise/commit/8af6b01b) Use restic 0.12.0-ac.20210727 (#105) +- [38dea1e2](https://github.com/appscode/stash-enterprise/commit/38dea1e2) Remove repetitive 403 errors from validator and mutators +- [deb96432](https://github.com/appscode/stash-enterprise/commit/deb96432) Pass `region` flag in built-in Functions (#104) +- [d7c5b0ab](https://github.com/appscode/stash-enterprise/commit/d7c5b0ab) Stop using deprecated apis in k8s 1.22 (#103) + + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.15.0](https://github.com/stashed/apimachinery/releases/tag/v0.15.0) + +- [68cf54c0](https://github.com/stashed/apimachinery/commit/68cf54c0) Update dependencies (#108) +- [5405dc7e](https://github.com/stashed/apimachinery/commit/5405dc7e) Use restic v0.12.0-ac.20210727 (#105) +- [9609d465](https://github.com/stashed/apimachinery/commit/9609d465) Test crds (#104) +- [f9affe2f](https://github.com/stashed/apimachinery/commit/f9affe2f) Add `Duration` column in BackupSession and RestoreSession (#103) +- [0229e0bd](https://github.com/stashed/apimachinery/commit/0229e0bd) Update README.md +- [53996371](https://github.com/stashed/apimachinery/commit/53996371) Only generate crd v1 yamls (#102) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.15.0](https://github.com/stashed/cli/releases/tag/v0.15.0) + +- [f5ebe84](https://github.com/stashed/cli/commit/f5ebe84) Prepare for release v0.15.0 (#129) +- [0501282](https://github.com/stashed/cli/commit/0501282) Update dependencies (#128) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v12](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v12) + +- [f6cd9a3f](https://github.com/stashed/elasticsearch/commit/f6cd9a3f) Prepare for release 5.6.4-v12 (#875) +- [6d5daef1](https://github.com/stashed/elasticsearch/commit/6d5daef1) [cherry-pick] Update repository config (#866) (#867) +- [22b224ab](https://github.com/stashed/elasticsearch/commit/22b224ab) [cherry-pick] Update dependencies (#857) (#858) +- [60b47d34](https://github.com/stashed/elasticsearch/commit/60b47d34) [cherry-pick] Use restic v0.12.0-ac.20210727 (#846) (#847) + + +### [6.2.4-v12](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v12) + +- [113226e5](https://github.com/stashed/elasticsearch/commit/113226e5) Prepare for release 6.2.4-v12 (#876) +- [dd90de07](https://github.com/stashed/elasticsearch/commit/dd90de07) [cherry-pick] Update repository config (#866) (#868) +- [c93e9745](https://github.com/stashed/elasticsearch/commit/c93e9745) [cherry-pick] Update dependencies (#857) (#859) +- [22e606ae](https://github.com/stashed/elasticsearch/commit/22e606ae) [cherry-pick] Use restic v0.12.0-ac.20210727 (#846) (#848) + + +### [6.3.0-v12](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v12) + +- [3a249c88](https://github.com/stashed/elasticsearch/commit/3a249c88) Prepare for release 6.3.0-v12 (#877) +- [41bd96ed](https://github.com/stashed/elasticsearch/commit/41bd96ed) [cherry-pick] Update repository config (#866) (#869) +- [c718b116](https://github.com/stashed/elasticsearch/commit/c718b116) [cherry-pick] Update dependencies (#857) (#860) +- [8c4a5c26](https://github.com/stashed/elasticsearch/commit/8c4a5c26) [cherry-pick] Use restic v0.12.0-ac.20210727 (#846) (#849) + + +### [6.4.0-v12](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v12) + +- [34b940ec](https://github.com/stashed/elasticsearch/commit/34b940ec) Prepare for release 6.4.0-v12 (#878) +- [f0b7aa39](https://github.com/stashed/elasticsearch/commit/f0b7aa39) [cherry-pick] Update repository config (#866) (#870) +- [12a3a75d](https://github.com/stashed/elasticsearch/commit/12a3a75d) [cherry-pick] Update dependencies (#857) (#861) +- [01ead31a](https://github.com/stashed/elasticsearch/commit/01ead31a) [cherry-pick] Use restic v0.12.0-ac.20210727 (#846) (#850) + + +### [6.5.3-v12](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v12) + +- [c994843d](https://github.com/stashed/elasticsearch/commit/c994843d) Prepare for release 6.5.3-v12 (#879) +- [5bc88545](https://github.com/stashed/elasticsearch/commit/5bc88545) [cherry-pick] Update repository config (#866) (#871) +- [1e31a002](https://github.com/stashed/elasticsearch/commit/1e31a002) [cherry-pick] Update dependencies (#857) (#862) +- [4d07f828](https://github.com/stashed/elasticsearch/commit/4d07f828) [cherry-pick] Use restic v0.12.0-ac.20210727 (#846) (#851) + + +### [6.8.0-v12](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v12) + +- [f09dd827](https://github.com/stashed/elasticsearch/commit/f09dd827) Prepare for release 6.8.0-v12 (#880) +- [f35f8ca3](https://github.com/stashed/elasticsearch/commit/f35f8ca3) [cherry-pick] Update repository config (#866) (#872) +- [782c1fc4](https://github.com/stashed/elasticsearch/commit/782c1fc4) [cherry-pick] Update dependencies (#857) (#863) +- [6e8b2884](https://github.com/stashed/elasticsearch/commit/6e8b2884) [cherry-pick] Use restic v0.12.0-ac.20210727 (#846) (#852) + + +### [7.2.0-v12](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v12) + +- [b55c27fe](https://github.com/stashed/elasticsearch/commit/b55c27fe) Prepare for release 7.2.0-v12 (#881) +- [c7f76787](https://github.com/stashed/elasticsearch/commit/c7f76787) [cherry-pick] Update repository config (#866) (#873) +- [038294c6](https://github.com/stashed/elasticsearch/commit/038294c6) [cherry-pick] Update dependencies (#857) (#864) +- [5cdc2c37](https://github.com/stashed/elasticsearch/commit/5cdc2c37) [cherry-pick] Use restic v0.12.0-ac.20210727 (#846) (#853) + + +### [7.3.2-v12](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v12) + +- [36bd2685](https://github.com/stashed/elasticsearch/commit/36bd2685) Prepare for release 7.3.2-v12 (#882) +- [c910d845](https://github.com/stashed/elasticsearch/commit/c910d845) [cherry-pick] Update repository config (#866) (#874) +- [3a2c26f4](https://github.com/stashed/elasticsearch/commit/3a2c26f4) [cherry-pick] Update dependencies (#857) (#865) +- [1082c0b4](https://github.com/stashed/elasticsearch/commit/1082c0b4) [cherry-pick] Use restic v0.12.0-ac.20210727 (#846) (#854) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2021.08.02](https://github.com/stashed/installer/releases/tag/v2021.08.02) + +- [a156259](https://github.com/stashed/installer/commit/a156259) Prepare for release v2021.08.02 (#191) +- [236344e](https://github.com/stashed/installer/commit/236344e) removed duplicate yaml key (#185) +- [e4360b9](https://github.com/stashed/installer/commit/e4360b9) Add Redis catalog (#189) +- [8ebc75b](https://github.com/stashed/installer/commit/8ebc75b) Update repository config (#190) +- [08533b1](https://github.com/stashed/installer/commit/08533b1) Update dependencies (#188) +- [1dec446](https://github.com/stashed/installer/commit/1dec446) Update chart docs +- [e538a4a](https://github.com/stashed/installer/commit/e538a4a) Update stash chart dependencies via Makefile (#184) +- [79185b4](https://github.com/stashed/installer/commit/79185b4) Stop using deprecated apis in k8s 1.22 (#183) +- [3cb28a0](https://github.com/stashed/installer/commit/3cb28a0) Sort crd yamls by GK +- [2e1bc42](https://github.com/stashed/installer/commit/2e1bc42) Merge metrics chart into crds chart +- [2f22aee](https://github.com/stashed/installer/commit/2f22aee) Test against Kubernetes 1.21.1 (#182) +- [51b9e39](https://github.com/stashed/installer/commit/51b9e39) Allow overriding image pull secrets from unified chart (#181) +- [bab2a32](https://github.com/stashed/installer/commit/bab2a32) Rename user-roles.yaml to metrics-user-roles.yaml +- [7f59770](https://github.com/stashed/installer/commit/7f59770) Add stash-metrics chart (#180) + + + +## [stashed/mariadb](https://github.com/stashed/mariadb) + +### [10.5.8-v5](https://github.com/stashed/mariadb/releases/tag/10.5.8-v5) + +- [4c5a5a6](https://github.com/stashed/mariadb/commit/4c5a5a6) Prepare for release 10.5.8-v5 (#120) +- [bc22c03](https://github.com/stashed/mariadb/commit/bc22c03) [cherry-pick] Update repository config (#118) (#119) +- [23101f3](https://github.com/stashed/mariadb/commit/23101f3) [cherry-pick] Update dependencies (#116) (#117) +- [989e214](https://github.com/stashed/mariadb/commit/989e214) [cherry-pick] Use restic v0.12.0-ac.20210727 (#112) (#113) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v11](https://github.com/stashed/mongodb/releases/tag/3.4.17-v11) + +- [df1a5ee9](https://github.com/stashed/mongodb/commit/df1a5ee9) Prepare for release 3.4.17-v11 (#1061) +- [f345dade](https://github.com/stashed/mongodb/commit/f345dade) [cherry-pick] Update repository config (#1048) (#1049) +- [66be6780](https://github.com/stashed/mongodb/commit/66be6780) [cherry-pick] Update dependencies (#1035) (#1036) +- [9ceabf04](https://github.com/stashed/mongodb/commit/9ceabf04) [cherry-pick] Use restic v0.12.0-ac.20210727 (#1020) (#1021) + + +### [3.4.22-v11](https://github.com/stashed/mongodb/releases/tag/3.4.22-v11) + +- [a3b281da](https://github.com/stashed/mongodb/commit/a3b281da) Prepare for release 3.4.22-v11 (#1062) +- [dc10d71e](https://github.com/stashed/mongodb/commit/dc10d71e) [cherry-pick] Update repository config (#1048) (#1050) +- [fbfb625d](https://github.com/stashed/mongodb/commit/fbfb625d) [cherry-pick] Update dependencies (#1035) (#1037) +- [2c3233ac](https://github.com/stashed/mongodb/commit/2c3233ac) [cherry-pick] Use restic v0.12.0-ac.20210727 (#1020) (#1022) + + +### [3.6.8-v11](https://github.com/stashed/mongodb/releases/tag/3.6.8-v11) + +- [bc0d14bf](https://github.com/stashed/mongodb/commit/bc0d14bf) Prepare for release 3.6.8-v11 (#1064) +- [011a6f25](https://github.com/stashed/mongodb/commit/011a6f25) [cherry-pick] Update repository config (#1048) (#1052) +- [0d27847f](https://github.com/stashed/mongodb/commit/0d27847f) [cherry-pick] Update dependencies (#1035) (#1039) +- [0f97d428](https://github.com/stashed/mongodb/commit/0f97d428) [cherry-pick] Use restic v0.12.0-ac.20210727 (#1020) (#1024) + + +### [3.6.13-v11](https://github.com/stashed/mongodb/releases/tag/3.6.13-v11) + +- [cc1fc58f](https://github.com/stashed/mongodb/commit/cc1fc58f) Prepare for release 3.6.13-v11 (#1063) +- [5db9d0e8](https://github.com/stashed/mongodb/commit/5db9d0e8) [cherry-pick] Update repository config (#1048) (#1051) +- [65bb29b5](https://github.com/stashed/mongodb/commit/65bb29b5) [cherry-pick] Update dependencies (#1035) (#1038) +- [7da6b51f](https://github.com/stashed/mongodb/commit/7da6b51f) [cherry-pick] Use restic v0.12.0-ac.20210727 (#1020) (#1023) + + +### [4.0.3-v11](https://github.com/stashed/mongodb/releases/tag/4.0.3-v11) + +- [5bb0e7fc](https://github.com/stashed/mongodb/commit/5bb0e7fc) Prepare for release 4.0.3-v11 (#1066) +- [790fe330](https://github.com/stashed/mongodb/commit/790fe330) [cherry-pick] Update repository config (#1048) (#1054) +- [d98a2c49](https://github.com/stashed/mongodb/commit/d98a2c49) [cherry-pick] Update dependencies (#1035) (#1041) +- [5415505d](https://github.com/stashed/mongodb/commit/5415505d) [cherry-pick] Use restic v0.12.0-ac.20210727 (#1020) (#1026) + + +### [4.0.5-v11](https://github.com/stashed/mongodb/releases/tag/4.0.5-v11) + +- [8dcb1644](https://github.com/stashed/mongodb/commit/8dcb1644) Prepare for release 4.0.5-v11 (#1067) +- [47025315](https://github.com/stashed/mongodb/commit/47025315) [cherry-pick] Update repository config (#1048) (#1055) +- [9dfdc8f3](https://github.com/stashed/mongodb/commit/9dfdc8f3) [cherry-pick] Update dependencies (#1035) (#1042) +- [14570445](https://github.com/stashed/mongodb/commit/14570445) [cherry-pick] Use restic v0.12.0-ac.20210727 (#1020) (#1027) + + +### [4.0.11-v11](https://github.com/stashed/mongodb/releases/tag/4.0.11-v11) + +- [77011222](https://github.com/stashed/mongodb/commit/77011222) Prepare for release 4.0.11-v11 (#1065) +- [ff0a8612](https://github.com/stashed/mongodb/commit/ff0a8612) [cherry-pick] Update repository config (#1048) (#1053) +- [e0f0aa94](https://github.com/stashed/mongodb/commit/e0f0aa94) [cherry-pick] Update dependencies (#1035) (#1040) +- [37097340](https://github.com/stashed/mongodb/commit/37097340) [cherry-pick] Use restic v0.12.0-ac.20210727 (#1020) (#1025) + + +### [4.1.4-v11](https://github.com/stashed/mongodb/releases/tag/4.1.4-v11) + +- [124f47e8](https://github.com/stashed/mongodb/commit/124f47e8) Prepare for release 4.1.4-v11 (#1069) +- [6f46f97e](https://github.com/stashed/mongodb/commit/6f46f97e) [cherry-pick] Update repository config (#1048) (#1057) +- [162e6c00](https://github.com/stashed/mongodb/commit/162e6c00) [cherry-pick] Update dependencies (#1035) (#1044) +- [b32b9b9b](https://github.com/stashed/mongodb/commit/b32b9b9b) [cherry-pick] Use restic v0.12.0-ac.20210727 (#1020) (#1029) + + +### [4.1.7-v11](https://github.com/stashed/mongodb/releases/tag/4.1.7-v11) + +- [4f7007a4](https://github.com/stashed/mongodb/commit/4f7007a4) Prepare for release 4.1.7-v11 (#1070) +- [021825ea](https://github.com/stashed/mongodb/commit/021825ea) [cherry-pick] Update repository config (#1048) (#1058) +- [786843bc](https://github.com/stashed/mongodb/commit/786843bc) [cherry-pick] Update dependencies (#1035) (#1045) +- [bb3640a0](https://github.com/stashed/mongodb/commit/bb3640a0) [cherry-pick] Use restic v0.12.0-ac.20210727 (#1020) (#1030) + + +### [4.1.13-v11](https://github.com/stashed/mongodb/releases/tag/4.1.13-v11) + +- [d1e1bb66](https://github.com/stashed/mongodb/commit/d1e1bb66) Prepare for release 4.1.13-v11 (#1068) +- [cf602e44](https://github.com/stashed/mongodb/commit/cf602e44) [cherry-pick] Update repository config (#1048) (#1056) +- [617ff56d](https://github.com/stashed/mongodb/commit/617ff56d) [cherry-pick] Update dependencies (#1035) (#1043) +- [c223aa7b](https://github.com/stashed/mongodb/commit/c223aa7b) [cherry-pick] Use restic v0.12.0-ac.20210727 (#1020) (#1028) + + +### [4.2.3-v11](https://github.com/stashed/mongodb/releases/tag/4.2.3-v11) + +- [0565d9c9](https://github.com/stashed/mongodb/commit/0565d9c9) Prepare for release 4.2.3-v11 (#1071) +- [3d52ffd2](https://github.com/stashed/mongodb/commit/3d52ffd2) [cherry-pick] Update repository config (#1048) (#1059) +- [983dc6b0](https://github.com/stashed/mongodb/commit/983dc6b0) [cherry-pick] Update dependencies (#1035) (#1046) +- [df3c1e5b](https://github.com/stashed/mongodb/commit/df3c1e5b) [cherry-pick] Use restic v0.12.0-ac.20210727 (#1020) (#1031) + + +### [4.4.6-v2](https://github.com/stashed/mongodb/releases/tag/4.4.6-v2) + +- [ccdb092c](https://github.com/stashed/mongodb/commit/ccdb092c) [cherry-pick] Update repository config (#1048) (#1060) +- [e54137e6](https://github.com/stashed/mongodb/commit/e54137e6) [cherry-pick] Update dependencies (#1035) (#1047) +- [8c036539](https://github.com/stashed/mongodb/commit/8c036539) [cherry-pick] Use restic v0.12.0-ac.20210727 (#1020) (#1032) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v12](https://github.com/stashed/mysql/releases/tag/5.7.25-v12) + +- [48b8c389](https://github.com/stashed/mysql/commit/48b8c389) Prepare for release 5.7.25-v12 (#455) +- [2228e027](https://github.com/stashed/mysql/commit/2228e027) [cherry-pick] Update repository config (#450) (#451) +- [da7063a4](https://github.com/stashed/mysql/commit/da7063a4) [cherry-pick] Update dependencies (#445) (#446) +- [6b633d68](https://github.com/stashed/mysql/commit/6b633d68) [cherry-pick] Use restic v0.12.0-ac.20210727 (#438) (#439) + + +### [8.0.3-v12](https://github.com/stashed/mysql/releases/tag/8.0.3-v12) + +- [10f7c4b7](https://github.com/stashed/mysql/commit/10f7c4b7) Prepare for release 8.0.3-v12 (#458) +- [eb0c962a](https://github.com/stashed/mysql/commit/eb0c962a) [cherry-pick] Update repository config (#450) (#454) +- [cb1fa41d](https://github.com/stashed/mysql/commit/cb1fa41d) [cherry-pick] Update dependencies (#445) (#449) +- [705a5eb3](https://github.com/stashed/mysql/commit/705a5eb3) [cherry-pick] Use restic v0.12.0-ac.20210727 (#438) (#442) + + +### [8.0.14-v12](https://github.com/stashed/mysql/releases/tag/8.0.14-v12) + +- [8dcf9109](https://github.com/stashed/mysql/commit/8dcf9109) Prepare for release 8.0.14-v12 (#456) +- [0b899336](https://github.com/stashed/mysql/commit/0b899336) [cherry-pick] Update repository config (#450) (#452) +- [156e4650](https://github.com/stashed/mysql/commit/156e4650) [cherry-pick] Update dependencies (#445) (#447) +- [373511ed](https://github.com/stashed/mysql/commit/373511ed) [cherry-pick] Use restic v0.12.0-ac.20210727 (#438) (#440) + + +### [8.0.21-v6](https://github.com/stashed/mysql/releases/tag/8.0.21-v6) + +- [2a424f32](https://github.com/stashed/mysql/commit/2a424f32) Prepare for release 8.0.21-v6 (#457) +- [545ab090](https://github.com/stashed/mysql/commit/545ab090) [cherry-pick] Update repository config (#450) (#453) +- [01144457](https://github.com/stashed/mysql/commit/01144457) [cherry-pick] Update dependencies (#445) (#448) +- [64ba0a79](https://github.com/stashed/mysql/commit/64ba0a79) [cherry-pick] Use restic v0.12.0-ac.20210727 (#438) (#441) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-v7](https://github.com/stashed/percona-xtradb/releases/tag/5.7-v7) + +- [4b3634a7](https://github.com/stashed/percona-xtradb/commit/4b3634a7) Prepare for release 5.7-v7 (#193) +- [22f2e507](https://github.com/stashed/percona-xtradb/commit/22f2e507) [cherry-pick] Update repository config (#191) (#192) +- [7a67ec51](https://github.com/stashed/percona-xtradb/commit/7a67ec51) [cherry-pick] Use restic v0.12.0-ac.20210727 (#186) (#187) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v10](https://github.com/stashed/postgres/releases/tag/9.6.19-v10) + +- [c87db716](https://github.com/stashed/postgres/commit/c87db716) Prepare for release 9.6.19-v10 (#843) +- [0e241018](https://github.com/stashed/postgres/commit/0e241018) [cherry-pick] Update repository config (#833) (#838) +- [b076f970](https://github.com/stashed/postgres/commit/b076f970) [cherry-pick] Update dependencies (#827) (#832) +- [2e6829c1](https://github.com/stashed/postgres/commit/2e6829c1) [cherry-pick] Use restic v0.12.0-ac.20210727 (#819) (#824) + + +### [10.14-v10](https://github.com/stashed/postgres/releases/tag/10.14-v10) + +- [3687c604](https://github.com/stashed/postgres/commit/3687c604) Prepare for release 10.14-v10 (#839) +- [a48fb0b2](https://github.com/stashed/postgres/commit/a48fb0b2) [cherry-pick] Update repository config (#833) (#834) +- [72793d2a](https://github.com/stashed/postgres/commit/72793d2a) [cherry-pick] Update dependencies (#827) (#828) +- [b0ef05d7](https://github.com/stashed/postgres/commit/b0ef05d7) [cherry-pick] Use restic v0.12.0-ac.20210727 (#819) (#820) + + +### [11.9-v10](https://github.com/stashed/postgres/releases/tag/11.9-v10) + +- [ab70837f](https://github.com/stashed/postgres/commit/ab70837f) Prepare for release 11.9-v10 (#840) +- [496f0c91](https://github.com/stashed/postgres/commit/496f0c91) [cherry-pick] Update repository config (#833) (#835) +- [3f0af053](https://github.com/stashed/postgres/commit/3f0af053) [cherry-pick] Update dependencies (#827) (#829) +- [6f82d7cd](https://github.com/stashed/postgres/commit/6f82d7cd) [cherry-pick] Use restic v0.12.0-ac.20210727 (#819) (#821) + + +### [12.4-v10](https://github.com/stashed/postgres/releases/tag/12.4-v10) + +- [1a911490](https://github.com/stashed/postgres/commit/1a911490) Prepare for release 12.4-v10 (#841) +- [1319792a](https://github.com/stashed/postgres/commit/1319792a) [cherry-pick] Update repository config (#833) (#836) +- [79b20b79](https://github.com/stashed/postgres/commit/79b20b79) [cherry-pick] Update dependencies (#827) (#830) +- [a7cf8a2b](https://github.com/stashed/postgres/commit/a7cf8a2b) [cherry-pick] Use restic v0.12.0-ac.20210727 (#819) (#822) + + +### [13.1-v7](https://github.com/stashed/postgres/releases/tag/13.1-v7) + +- [949be085](https://github.com/stashed/postgres/commit/949be085) Prepare for release 13.1-v7 (#842) +- [2c2642d1](https://github.com/stashed/postgres/commit/2c2642d1) [cherry-pick] Update repository config (#833) (#837) +- [2dc6e0e3](https://github.com/stashed/postgres/commit/2dc6e0e3) [cherry-pick] Update dependencies (#827) (#831) +- [f07a6f91](https://github.com/stashed/postgres/commit/f07a6f91) [cherry-pick] Use restic v0.12.0-ac.20210727 (#819) (#823) + + + +## [stashed/redis](https://github.com/stashed/redis) + +### [5.0.13](https://github.com/stashed/redis/releases/tag/5.0.13) + +- [8aef207](https://github.com/stashed/redis/commit/8aef207) Prepare for release 5.0.13 (#5) +- [eef7933](https://github.com/stashed/redis/commit/eef7933) Update repository config (#2) (#3) +- [628dbb1](https://github.com/stashed/redis/commit/628dbb1) Use redis:5.0.13 as base image +- [7d4bfee](https://github.com/stashed/redis/commit/7d4bfee) Make Redis addon ready to use (#1) + + +### [6.2.5](https://github.com/stashed/redis/releases/tag/6.2.5) + + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.15.0](https://github.com/stashed/stash/releases/tag/v0.15.0) + +- [f1484b5d](https://github.com/stashed/stash/commit/f1484b5d) Prepare for release v0.15.0 (#1372) +- [20291868](https://github.com/stashed/stash/commit/20291868) Improve duration format in BackupSession and RestoreSession (#1370) +- [99e2624b](https://github.com/stashed/stash/commit/99e2624b) Update repository config (#1371) +- [90686853](https://github.com/stashed/stash/commit/90686853) Update dependencies (#1369) +- [3c7b0593](https://github.com/stashed/stash/commit/3c7b0593) Use restic v0.12.0-ac.20210727 (#1366) +- [76715e4c](https://github.com/stashed/stash/commit/76715e4c) Remove repetitive 403 errors from validator and mutators +- [c987ee1a](https://github.com/stashed/stash/commit/c987ee1a) Pass `region` flag in the built-in functions (#1363) +- [fc2e7fb4](https://github.com/stashed/stash/commit/fc2e7fb4) Stop using deprecated apis in k8s 1.22 (#1362) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2021.10.11.md b/content/docs/v2024.12.18/CHANGELOG-v2021.10.11.md new file mode 100644 index 0000000000..4bdd5eae01 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2021.10.11.md @@ -0,0 +1,917 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2021.10.11 + name: Changelog-v2021.10.11 + parent: welcome + weight: 20211011 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2021.10.11/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2021.10.11/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2021.10.11 (2021-10-09) + + +## [appscode/stash-enterprise](https://github.com/appscode/stash-enterprise) + +### [v0.16.0](https://github.com/appscode/stash-enterprise/releases/tag/v0.16.0) + +- [34fe50bb](https://github.com/appscode/stash-enterprise/commit/34fe50bb) Prepare for release v0.16.0 (#126) +- [4807ec4c](https://github.com/appscode/stash-enterprise/commit/4807ec4c) Fix jwt-go security vulnerability (#125) +- [f1160998](https://github.com/appscode/stash-enterprise/commit/f1160998) Merge pull request #123 from appscode/etcd-permission +- [ce3cd3f8](https://github.com/appscode/stash-enterprise/commit/ce3cd3f8) Add support for ETCD restore flow +- [834d8c13](https://github.com/appscode/stash-enterprise/commit/834d8c13) Use nats.go v1.13.0 (#124) +- [446ee320](https://github.com/appscode/stash-enterprise/commit/446ee320) Update dependencies to publish SiteInfo (#122) +- [5d56e0f6](https://github.com/appscode/stash-enterprise/commit/5d56e0f6) Support passing args to restic backup/restore command (#120) +- [f10ab0dc](https://github.com/appscode/stash-enterprise/commit/f10ab0dc) Fix license-reader ClusterRoleBinding not cleaning up properly +- [dffe5c41](https://github.com/appscode/stash-enterprise/commit/dffe5c41) Update go.mod +- [c124a770](https://github.com/appscode/stash-enterprise/commit/c124a770) Undo changes of jobs.go +- [cc7f4827](https://github.com/appscode/stash-enterprise/commit/cc7f4827) fix clusterrolebinding issue +- [13ed9752](https://github.com/appscode/stash-enterprise/commit/13ed9752) Log warning if Community License is used with non-demo namespace (#119) +- [0026511c](https://github.com/appscode/stash-enterprise/commit/0026511c) Merge pull request #117 from appscode/fix-cronjob-name-prefix +- [ba3f466c](https://github.com/appscode/stash-enterprise/commit/ba3f466c) Use `stash-trigger` as backup triggering CronJob name prefix +- [d353c393](https://github.com/appscode/stash-enterprise/commit/d353c393) Use official restic v0.12.1 (#116) +- [e9b1db7e](https://github.com/appscode/stash-enterprise/commit/e9b1db7e) Update repository config (#115) +- [ea1895fc](https://github.com/appscode/stash-enterprise/commit/ea1895fc) Update dependencies (#114) + + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.16.0](https://github.com/stashed/apimachinery/releases/tag/v0.16.0) + +- [e5b1aaea](https://github.com/stashed/apimachinery/commit/e5b1aaea) Fix jwt-go security vulnerability (#129) +- [065a6d36](https://github.com/stashed/apimachinery/commit/065a6d36) Fix jwt-go security vulnerability (#128) +- [561988c6](https://github.com/stashed/apimachinery/commit/561988c6) Add condition for indicating restore completion (#127) +- [3ddabb57](https://github.com/stashed/apimachinery/commit/3ddabb57) Add "Running" phase for the individual restore host (#126) +- [1c75b4ce](https://github.com/stashed/apimachinery/commit/1c75b4ce) Support passing arguments to restic backup/restore command (#121) +- [307b411a](https://github.com/stashed/apimachinery/commit/307b411a) Update dependencies to publish SiteInfo (#125) +- [ce72641a](https://github.com/stashed/apimachinery/commit/ce72641a) Update dependencies to publish SiteInfo (#124) +- [322437d9](https://github.com/stashed/apimachinery/commit/322437d9) Show actual repo size instead of logical size (#123) +- [5e773145](https://github.com/stashed/apimachinery/commit/5e773145) Return new labels by EnsureKubeDBIntegration function (#122) +- [908628b7](https://github.com/stashed/apimachinery/commit/908628b7) Update repository config (#120) +- [a7994a77](https://github.com/stashed/apimachinery/commit/a7994a77) Add `ADDON_IMAGE` variable for Etcd Addons +- [16529919](https://github.com/stashed/apimachinery/commit/16529919) Run `make fmt` +- [78077d32](https://github.com/stashed/apimachinery/commit/78077d32) Merge branch 'master' into etcd-flag +- [163e7863](https://github.com/stashed/apimachinery/commit/163e7863) Set RESTIC_PROGRESS_FPS in restic wrapper shell +- [b0983010](https://github.com/stashed/apimachinery/commit/b0983010) Merge branch 'master' into progress-fps +- [72b73523](https://github.com/stashed/apimachinery/commit/72b73523) Log warning if Community License is used with non-demo namespace (#119) +- [2eecfe50](https://github.com/stashed/apimachinery/commit/2eecfe50) Merge branch 'master' into etcd-flag +- [b0141c12](https://github.com/stashed/apimachinery/commit/b0141c12) Add addon image flag +- [c1e37507](https://github.com/stashed/apimachinery/commit/c1e37507) Set RESTIC_PROGRESS_FPS in restic wrapper shell +- [fda29913](https://github.com/stashed/apimachinery/commit/fda29913) Merge pull request #116 from stashed/fix-cronjob-name-prefix +- [8cbe8b9d](https://github.com/stashed/apimachinery/commit/8cbe8b9d) Add constants for backup triggering CronJob +- [78e6bc8c](https://github.com/stashed/apimachinery/commit/78e6bc8c) Use official restic v0.12.1 (#115) +- [01704d74](https://github.com/stashed/apimachinery/commit/01704d74) Update repository config (#114) +- [d9f1899d](https://github.com/stashed/apimachinery/commit/d9f1899d) Update dependencies (#113) +- [639e36ec](https://github.com/stashed/apimachinery/commit/639e36ec) Update dependencies (#112) +- [ffb5a0c7](https://github.com/stashed/apimachinery/commit/ffb5a0c7) Update dependencies (#111) +- [cdbb8e52](https://github.com/stashed/apimachinery/commit/cdbb8e52) Update repository config (#110) +- [ae94693a](https://github.com/stashed/apimachinery/commit/ae94693a) Update repository config (#109) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.16.0](https://github.com/stashed/cli/releases/tag/v0.16.0) + +- [1fb811f](https://github.com/stashed/cli/commit/1fb811f) Prepare for release v0.16.0 (#142) +- [c1b8251](https://github.com/stashed/cli/commit/c1b8251) Fix jwt-go security vulnerability (#141) +- [23689bb](https://github.com/stashed/cli/commit/23689bb) Fix jwt-go security vulnerability (#140) +- [fc3ffb8](https://github.com/stashed/cli/commit/fc3ffb8) Set restic docker image tag from Makefile during build (#137) +- [56a8b85](https://github.com/stashed/cli/commit/56a8b85) Update dependencies to publish SiteInfo (#139) +- [d8df9e8](https://github.com/stashed/cli/commit/d8df9e8) Update dependencies to publish SiteInfo (#138) +- [c7fb370](https://github.com/stashed/cli/commit/c7fb370) Log warning if Community License is used with non-demo namespace (#136) +- [11397c0](https://github.com/stashed/cli/commit/11397c0) Use official restic v0.12.1 (#135) +- [24ae84f](https://github.com/stashed/cli/commit/24ae84f) Update dependencies (#134) +- [91ab122](https://github.com/stashed/cli/commit/91ab122) Update repository config (#133) +- [47ca564](https://github.com/stashed/cli/commit/47ca564) Update dependencies (#132) +- [3d1a293](https://github.com/stashed/cli/commit/3d1a293) Update dependencies (#131) +- [f9b4bcc](https://github.com/stashed/cli/commit/f9b4bcc) Update dependencies (#130) +- [b2331c7](https://github.com/stashed/cli/commit/b2331c7) Update README.md + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v13](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v13) + +- [a5d62837](https://github.com/stashed/elasticsearch/commit/a5d62837) Prepare for release 5.6.4-v13 (#1008) +- [3ef20d48](https://github.com/stashed/elasticsearch/commit/3ef20d48) [cherry-pick] Fix jwt-go security vulnerability (#999) (#1000) +- [39c89194](https://github.com/stashed/elasticsearch/commit/39c89194) [cherry-pick] Fix jwt-go security vulnerability (#990) (#991) +- [574f3b1e](https://github.com/stashed/elasticsearch/commit/574f3b1e) [cherry-pick] Update dependencies to publish SiteInfo (#981) (#982) +- [ec0d1986](https://github.com/stashed/elasticsearch/commit/ec0d1986) [cherry-pick] Update dependencies to publish SiteInfo (#972) (#973) +- [55047964](https://github.com/stashed/elasticsearch/commit/55047964) [cherry-pick] Log warning if Community License is used with non-demo namespace (#963) (#964) +- [18921116](https://github.com/stashed/elasticsearch/commit/18921116) [cherry-pick] Use official restic v0.12.1 (#954) (#955) +- [2b482d40](https://github.com/stashed/elasticsearch/commit/2b482d40) [cherry-pick] Update repository config (#945) (#946) +- [99db22ab](https://github.com/stashed/elasticsearch/commit/99db22ab) [cherry-pick] Update dependencies (#936) (#937) +- [e7432088](https://github.com/stashed/elasticsearch/commit/e7432088) [cherry-pick] Update dependencies (#927) (#928) +- [d996b55c](https://github.com/stashed/elasticsearch/commit/d996b55c) [cherry-pick] Update dependencies (#918) (#919) +- [6f441147](https://github.com/stashed/elasticsearch/commit/6f441147) [cherry-pick] Use user nobody (#910) +- [82d15a3c](https://github.com/stashed/elasticsearch/commit/82d15a3c) [cherry-pick] Update repository config (#901) (#902) +- [6f9313e9](https://github.com/stashed/elasticsearch/commit/6f9313e9) [cherry-pick] Update repository config (#892) (#893) +- [dce43d88](https://github.com/stashed/elasticsearch/commit/dce43d88) [cherry-pick] Update README.md (#884) + + +### [6.2.4-v13](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v13) + +- [6a8aa63a](https://github.com/stashed/elasticsearch/commit/6a8aa63a) Prepare for release 6.2.4-v13 (#1009) +- [728caef7](https://github.com/stashed/elasticsearch/commit/728caef7) [cherry-pick] Fix jwt-go security vulnerability (#999) (#1001) +- [c3732a8d](https://github.com/stashed/elasticsearch/commit/c3732a8d) [cherry-pick] Fix jwt-go security vulnerability (#990) (#992) +- [4a661d0d](https://github.com/stashed/elasticsearch/commit/4a661d0d) [cherry-pick] Update dependencies to publish SiteInfo (#981) (#983) +- [b25f24a1](https://github.com/stashed/elasticsearch/commit/b25f24a1) [cherry-pick] Update dependencies to publish SiteInfo (#972) (#974) +- [34810993](https://github.com/stashed/elasticsearch/commit/34810993) [cherry-pick] Log warning if Community License is used with non-demo namespace (#963) (#965) +- [e712025c](https://github.com/stashed/elasticsearch/commit/e712025c) [cherry-pick] Use official restic v0.12.1 (#954) (#956) +- [5dc9f263](https://github.com/stashed/elasticsearch/commit/5dc9f263) [cherry-pick] Update repository config (#945) (#947) +- [dfe8fea8](https://github.com/stashed/elasticsearch/commit/dfe8fea8) [cherry-pick] Update dependencies (#936) (#938) +- [80b9a9e1](https://github.com/stashed/elasticsearch/commit/80b9a9e1) [cherry-pick] Update dependencies (#927) (#929) +- [fb0de16f](https://github.com/stashed/elasticsearch/commit/fb0de16f) [cherry-pick] Update dependencies (#918) (#920) +- [5fe518c1](https://github.com/stashed/elasticsearch/commit/5fe518c1) [cherry-pick] Use user nobody (#911) +- [894726f9](https://github.com/stashed/elasticsearch/commit/894726f9) [cherry-pick] Update repository config (#901) (#903) +- [ce7890c4](https://github.com/stashed/elasticsearch/commit/ce7890c4) [cherry-pick] Update repository config (#892) (#894) +- [26be85b5](https://github.com/stashed/elasticsearch/commit/26be85b5) [cherry-pick] Update README.md (#885) + + +### [6.3.0-v13](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v13) + +- [44e2c7ff](https://github.com/stashed/elasticsearch/commit/44e2c7ff) Prepare for release 6.3.0-v13 (#1010) +- [dcddfb30](https://github.com/stashed/elasticsearch/commit/dcddfb30) [cherry-pick] Fix jwt-go security vulnerability (#999) (#1002) +- [c1dc901b](https://github.com/stashed/elasticsearch/commit/c1dc901b) [cherry-pick] Fix jwt-go security vulnerability (#990) (#993) +- [40735b41](https://github.com/stashed/elasticsearch/commit/40735b41) [cherry-pick] Update dependencies to publish SiteInfo (#981) (#984) +- [06771a08](https://github.com/stashed/elasticsearch/commit/06771a08) [cherry-pick] Update dependencies to publish SiteInfo (#972) (#975) +- [391387dd](https://github.com/stashed/elasticsearch/commit/391387dd) [cherry-pick] Log warning if Community License is used with non-demo namespace (#963) (#966) +- [45848135](https://github.com/stashed/elasticsearch/commit/45848135) [cherry-pick] Use official restic v0.12.1 (#954) (#957) +- [06071809](https://github.com/stashed/elasticsearch/commit/06071809) [cherry-pick] Update repository config (#945) (#948) +- [c0126494](https://github.com/stashed/elasticsearch/commit/c0126494) [cherry-pick] Update dependencies (#936) (#939) +- [43c57d7b](https://github.com/stashed/elasticsearch/commit/43c57d7b) [cherry-pick] Update dependencies (#927) (#930) +- [48f21786](https://github.com/stashed/elasticsearch/commit/48f21786) [cherry-pick] Update dependencies (#918) (#921) +- [72ef8aa8](https://github.com/stashed/elasticsearch/commit/72ef8aa8) [cherry-pick] Use user nobody (#912) +- [dd22de7f](https://github.com/stashed/elasticsearch/commit/dd22de7f) [cherry-pick] Update repository config (#901) (#904) +- [24f633df](https://github.com/stashed/elasticsearch/commit/24f633df) [cherry-pick] Update repository config (#892) (#895) +- [5c79be0b](https://github.com/stashed/elasticsearch/commit/5c79be0b) [cherry-pick] Update README.md (#886) + + +### [6.4.0-v13](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v13) + +- [707710bb](https://github.com/stashed/elasticsearch/commit/707710bb) Prepare for release 6.4.0-v13 (#1011) +- [77479b55](https://github.com/stashed/elasticsearch/commit/77479b55) [cherry-pick] Fix jwt-go security vulnerability (#999) (#1003) +- [fc6a5ced](https://github.com/stashed/elasticsearch/commit/fc6a5ced) [cherry-pick] Fix jwt-go security vulnerability (#990) (#994) +- [5969c9f8](https://github.com/stashed/elasticsearch/commit/5969c9f8) [cherry-pick] Update dependencies to publish SiteInfo (#981) (#985) +- [262a6e36](https://github.com/stashed/elasticsearch/commit/262a6e36) [cherry-pick] Update dependencies to publish SiteInfo (#972) (#976) +- [d38bd407](https://github.com/stashed/elasticsearch/commit/d38bd407) [cherry-pick] Log warning if Community License is used with non-demo namespace (#963) (#967) +- [3de0c455](https://github.com/stashed/elasticsearch/commit/3de0c455) [cherry-pick] Use official restic v0.12.1 (#954) (#958) +- [27182793](https://github.com/stashed/elasticsearch/commit/27182793) [cherry-pick] Update repository config (#945) (#949) +- [5d10b2a3](https://github.com/stashed/elasticsearch/commit/5d10b2a3) [cherry-pick] Update dependencies (#936) (#940) +- [e95882f5](https://github.com/stashed/elasticsearch/commit/e95882f5) [cherry-pick] Update dependencies (#927) (#931) +- [772ccfa0](https://github.com/stashed/elasticsearch/commit/772ccfa0) [cherry-pick] Update dependencies (#918) (#922) +- [aa751b23](https://github.com/stashed/elasticsearch/commit/aa751b23) [cherry-pick] Use user nobody (#913) +- [73980641](https://github.com/stashed/elasticsearch/commit/73980641) [cherry-pick] Update repository config (#901) (#905) +- [02407a60](https://github.com/stashed/elasticsearch/commit/02407a60) [cherry-pick] Update repository config (#892) (#896) +- [0265d8de](https://github.com/stashed/elasticsearch/commit/0265d8de) [cherry-pick] Update README.md (#887) + + +### [6.5.3-v13](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v13) + +- [9d2383dd](https://github.com/stashed/elasticsearch/commit/9d2383dd) Prepare for release 6.5.3-v13 (#1012) +- [79fd12e8](https://github.com/stashed/elasticsearch/commit/79fd12e8) [cherry-pick] Fix jwt-go security vulnerability (#999) (#1004) +- [a2e64544](https://github.com/stashed/elasticsearch/commit/a2e64544) [cherry-pick] Fix jwt-go security vulnerability (#990) (#995) +- [abf9549c](https://github.com/stashed/elasticsearch/commit/abf9549c) [cherry-pick] Update dependencies to publish SiteInfo (#981) (#986) +- [b2b0b18e](https://github.com/stashed/elasticsearch/commit/b2b0b18e) [cherry-pick] Update dependencies to publish SiteInfo (#972) (#977) +- [faac9e7d](https://github.com/stashed/elasticsearch/commit/faac9e7d) [cherry-pick] Log warning if Community License is used with non-demo namespace (#963) (#968) +- [09962313](https://github.com/stashed/elasticsearch/commit/09962313) [cherry-pick] Use official restic v0.12.1 (#954) (#959) +- [c71ba67a](https://github.com/stashed/elasticsearch/commit/c71ba67a) [cherry-pick] Update repository config (#945) (#950) +- [58f1375a](https://github.com/stashed/elasticsearch/commit/58f1375a) [cherry-pick] Update dependencies (#936) (#941) +- [b5ed5ab1](https://github.com/stashed/elasticsearch/commit/b5ed5ab1) [cherry-pick] Update dependencies (#927) (#932) +- [ab50d2f2](https://github.com/stashed/elasticsearch/commit/ab50d2f2) [cherry-pick] Update dependencies (#918) (#923) +- [4d19922a](https://github.com/stashed/elasticsearch/commit/4d19922a) [cherry-pick] Use user nobody (#914) +- [dc86a75d](https://github.com/stashed/elasticsearch/commit/dc86a75d) [cherry-pick] Update repository config (#901) (#906) +- [66505f2b](https://github.com/stashed/elasticsearch/commit/66505f2b) [cherry-pick] Update repository config (#892) (#897) +- [637c07d9](https://github.com/stashed/elasticsearch/commit/637c07d9) [cherry-pick] Update README.md (#888) + + +### [6.8.0-v13](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v13) + +- [db01c3b5](https://github.com/stashed/elasticsearch/commit/db01c3b5) Prepare for release 6.8.0-v13 (#1013) +- [5812e424](https://github.com/stashed/elasticsearch/commit/5812e424) [cherry-pick] Fix jwt-go security vulnerability (#999) (#1005) +- [20c76b9f](https://github.com/stashed/elasticsearch/commit/20c76b9f) [cherry-pick] Fix jwt-go security vulnerability (#990) (#996) +- [439837e1](https://github.com/stashed/elasticsearch/commit/439837e1) [cherry-pick] Update dependencies to publish SiteInfo (#981) (#987) +- [1899770a](https://github.com/stashed/elasticsearch/commit/1899770a) [cherry-pick] Update dependencies to publish SiteInfo (#972) (#978) +- [4ca69b25](https://github.com/stashed/elasticsearch/commit/4ca69b25) [cherry-pick] Log warning if Community License is used with non-demo namespace (#963) (#969) +- [0612ea32](https://github.com/stashed/elasticsearch/commit/0612ea32) [cherry-pick] Use official restic v0.12.1 (#954) (#960) +- [b832eeba](https://github.com/stashed/elasticsearch/commit/b832eeba) [cherry-pick] Update repository config (#945) (#951) +- [0438c6cd](https://github.com/stashed/elasticsearch/commit/0438c6cd) [cherry-pick] Update dependencies (#936) (#942) +- [a2f87a3c](https://github.com/stashed/elasticsearch/commit/a2f87a3c) [cherry-pick] Update dependencies (#927) (#933) +- [08c0717e](https://github.com/stashed/elasticsearch/commit/08c0717e) [cherry-pick] Update dependencies (#918) (#924) +- [04cc7905](https://github.com/stashed/elasticsearch/commit/04cc7905) [cherry-pick] Use user nobody (#915) +- [a9f017dc](https://github.com/stashed/elasticsearch/commit/a9f017dc) [cherry-pick] Update repository config (#901) (#907) +- [4f505600](https://github.com/stashed/elasticsearch/commit/4f505600) [cherry-pick] Update repository config (#892) (#898) +- [1a64b3ee](https://github.com/stashed/elasticsearch/commit/1a64b3ee) [cherry-pick] Update README.md (#889) + + +### [7.2.0-v13](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v13) + +- [55abc7a5](https://github.com/stashed/elasticsearch/commit/55abc7a5) Prepare for release 7.2.0-v13 (#1014) +- [aa2b8e05](https://github.com/stashed/elasticsearch/commit/aa2b8e05) [cherry-pick] Fix jwt-go security vulnerability (#999) (#1006) +- [8b4d6db6](https://github.com/stashed/elasticsearch/commit/8b4d6db6) [cherry-pick] Fix jwt-go security vulnerability (#990) (#997) +- [d7fb74a3](https://github.com/stashed/elasticsearch/commit/d7fb74a3) [cherry-pick] Update dependencies to publish SiteInfo (#981) (#988) +- [fc8fd676](https://github.com/stashed/elasticsearch/commit/fc8fd676) Update dependencies to publish SiteInfo (#972) (#979) +- [7a3b314c](https://github.com/stashed/elasticsearch/commit/7a3b314c) [cherry-pick] Log warning if Community License is used with non-demo namespace (#963) (#970) +- [d37ac3ba](https://github.com/stashed/elasticsearch/commit/d37ac3ba) [cherry-pick] Use official restic v0.12.1 (#954) (#961) +- [bf69bd17](https://github.com/stashed/elasticsearch/commit/bf69bd17) [cherry-pick] Update repository config (#945) (#952) +- [7b9d74d0](https://github.com/stashed/elasticsearch/commit/7b9d74d0) [cherry-pick] Update dependencies (#936) (#943) +- [50dd7353](https://github.com/stashed/elasticsearch/commit/50dd7353) [cherry-pick] Update dependencies (#927) (#934) +- [bc45e6a3](https://github.com/stashed/elasticsearch/commit/bc45e6a3) [cherry-pick] Update dependencies (#918) (#925) +- [7ef1c360](https://github.com/stashed/elasticsearch/commit/7ef1c360) [cherry-pick] Use user nobody (#916) +- [1ddfc17c](https://github.com/stashed/elasticsearch/commit/1ddfc17c) [cherry-pick] Update repository config (#901) (#908) +- [87806973](https://github.com/stashed/elasticsearch/commit/87806973) [cherry-pick] Update repository config (#892) (#899) +- [c30a871f](https://github.com/stashed/elasticsearch/commit/c30a871f) [cherry-pick] Update README.md (#890) + + +### [7.3.2-v13](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v13) + +- [f5019d83](https://github.com/stashed/elasticsearch/commit/f5019d83) Prepare for release 7.3.2-v13 (#1015) +- [5e2009c0](https://github.com/stashed/elasticsearch/commit/5e2009c0) [cherry-pick] Fix jwt-go security vulnerability (#999) (#1007) +- [2aa85efa](https://github.com/stashed/elasticsearch/commit/2aa85efa) [cherry-pick] Fix jwt-go security vulnerability (#990) (#998) +- [bd6bd091](https://github.com/stashed/elasticsearch/commit/bd6bd091) [cherry-pick] Update dependencies to publish SiteInfo (#981) (#989) +- [50138325](https://github.com/stashed/elasticsearch/commit/50138325) [cherry-pick] Update dependencies to publish SiteInfo (#972) (#980) +- [a8647cc3](https://github.com/stashed/elasticsearch/commit/a8647cc3) [cherry-pick] Log warning if Community License is used with non-demo namespace (#963) (#971) +- [317f6480](https://github.com/stashed/elasticsearch/commit/317f6480) [cherry-pick] Use official restic v0.12.1 (#954) (#962) +- [c237ef12](https://github.com/stashed/elasticsearch/commit/c237ef12) [cherry-pick] Update repository config (#945) (#953) +- [db0796c2](https://github.com/stashed/elasticsearch/commit/db0796c2) [cherry-pick] Update dependencies (#936) (#944) +- [b35640e9](https://github.com/stashed/elasticsearch/commit/b35640e9) [cherry-pick] Update dependencies (#927) (#935) +- [d7364e5f](https://github.com/stashed/elasticsearch/commit/d7364e5f) [cherry-pick] Update dependencies (#918) (#926) +- [b6bc1e06](https://github.com/stashed/elasticsearch/commit/b6bc1e06) [cherry-pick] Use user nobody (#917) +- [8f275fc7](https://github.com/stashed/elasticsearch/commit/8f275fc7) [cherry-pick] Update repository config (#901) (#909) +- [204da528](https://github.com/stashed/elasticsearch/commit/204da528) [cherry-pick] Update repository config (#892) (#900) +- [17519e39](https://github.com/stashed/elasticsearch/commit/17519e39) [cherry-pick] Update README.md (#891) + + + +## [stashed/etcd](https://github.com/stashed/etcd) + +### [3.5.0](https://github.com/stashed/etcd/releases/tag/3.5.0) + +- [4c83a10](https://github.com/stashed/etcd/commit/4c83a10) Prepare for release 3.5.0 (#9) +- [1dbf3b1](https://github.com/stashed/etcd/commit/1dbf3b1) Fix jwt-go security vulnerability (#7) (#8) +- [fbcc997](https://github.com/stashed/etcd/commit/fbcc997) Fix jwt-go security vulnerability (#5) (#6) +- [e0919f1](https://github.com/stashed/etcd/commit/e0919f1) Use restic 0.12.1 (#4) +- [f7b65eb](https://github.com/stashed/etcd/commit/f7b65eb) Update repository config (#3) +- [a2e9055](https://github.com/stashed/etcd/commit/a2e9055) Add etcd v3.5.0 addon to Stash (#2) +- [517d580](https://github.com/stashed/etcd/commit/517d580) Merge pull request #1 from stashed/global-replace +- [643ff4b](https://github.com/stashed/etcd/commit/643ff4b) Global replace Redis with Etcd +- [6d880e0](https://github.com/stashed/etcd/commit/6d880e0) Use user nobody +- [5252385](https://github.com/stashed/etcd/commit/5252385) Update repository config (#11) +- [f6dc027](https://github.com/stashed/etcd/commit/f6dc027) Update repository config (#8) +- [d68710e](https://github.com/stashed/etcd/commit/d68710e) Prepare for release v2021.08.02 (#7) +- [1772bc7](https://github.com/stashed/etcd/commit/1772bc7) Update repository config (#2) +- [7d4bfee](https://github.com/stashed/etcd/commit/7d4bfee) Make Redis addon ready to use (#1) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2021.10.11](https://github.com/stashed/installer/releases/tag/v2021.10.11) + +- [0f063ad](https://github.com/stashed/installer/commit/0f063ad) Prepare for release v2021.10.11 (#210) +- [0092c7e](https://github.com/stashed/installer/commit/0092c7e) Fix jwt-go security vulnerability (#209) +- [17e1fdc](https://github.com/stashed/installer/commit/17e1fdc) Fix jwt-go security vulnerability (#208) +- [01bf7cf](https://github.com/stashed/installer/commit/01bf7cf) Switch from nats 2.4.0 to 2.6.1 +- [30c5a63](https://github.com/stashed/installer/commit/30c5a63) Add etcd v3.5.0 addon to Stash (#195) +- [a088dcd](https://github.com/stashed/installer/commit/a088dcd) Add permission for SiteInfo publisher +- [a38d2b3](https://github.com/stashed/installer/commit/a38d2b3) Add mongodb `5.0.3` (#207) +- [bb1d956](https://github.com/stashed/installer/commit/bb1d956) Update dependencies to publish SiteInfo (#206) +- [48c528c](https://github.com/stashed/installer/commit/48c528c) Add Backup and Restore support for Postgres v14.0 (#205) +- [9ffc6aa](https://github.com/stashed/installer/commit/9ffc6aa) Add stash-metrics chart (#202) +- [0610818](https://github.com/stashed/installer/commit/0610818) Update repository config (#204) +- [7d3116e](https://github.com/stashed/installer/commit/7d3116e) Log warning if Community License is used with non-demo namespace (#203) +- [f0da2b3](https://github.com/stashed/installer/commit/f0da2b3) Use official restic v0.12.1 (#201) +- [01ecae5](https://github.com/stashed/installer/commit/01ecae5) Add mongodb 5.0.2 backup tasks (#200) +- [37eec67](https://github.com/stashed/installer/commit/37eec67) Add catalogs for NATS addon (#196) +- [9d585cd](https://github.com/stashed/installer/commit/9d585cd) Update repository config (#199) +- [ba6c6e8](https://github.com/stashed/installer/commit/ba6c6e8) Update dependencies (#198) +- [cd8b2d0](https://github.com/stashed/installer/commit/cd8b2d0) Update dependencies (#197) +- [9d47a48](https://github.com/stashed/installer/commit/9d47a48) Update repository config (#194) +- [8775569](https://github.com/stashed/installer/commit/8775569) Update repository config (#193) +- [715ac99](https://github.com/stashed/installer/commit/715ac99) Update README.md + + + +## [stashed/mariadb](https://github.com/stashed/mariadb) + +### [10.5.8-v6](https://github.com/stashed/mariadb/releases/tag/10.5.8-v6) + +- [a4773a3](https://github.com/stashed/mariadb/commit/a4773a3) Prepare for release 10.5.8-v6 (#148) +- [eca6402](https://github.com/stashed/mariadb/commit/eca6402) [cherry-pick] Fix jwt-go security vulnerability (#146) (#147) +- [9570bdf](https://github.com/stashed/mariadb/commit/9570bdf) [cherry-pick] Fix jwt-go security vulnerability (#144) (#145) +- [f18b738](https://github.com/stashed/mariadb/commit/f18b738) Update dependencies to publish SiteInfo (#142) (#143) +- [df6e78c](https://github.com/stashed/mariadb/commit/df6e78c) [cherry-pick] Update dependencies to publish SiteInfo (#140) (#141) +- [3de3692](https://github.com/stashed/mariadb/commit/3de3692) [cherry-pick] Log warning if Community License is used with non-demo namespace (#138) (#139) +- [0f17ca3](https://github.com/stashed/mariadb/commit/0f17ca3) [cherry-pick] Use official restic v0.12.1 (#136) (#137) +- [197f346](https://github.com/stashed/mariadb/commit/197f346) [cherry-pick] Update repository config (#134) (#135) +- [7bc7aed](https://github.com/stashed/mariadb/commit/7bc7aed) [cherry-pick] Update dependencies (#132) (#133) +- [210ba94](https://github.com/stashed/mariadb/commit/210ba94) [cherry-pick] Update dependencies (#130) (#131) +- [1f29ad8](https://github.com/stashed/mariadb/commit/1f29ad8) [cherry-pick] Update dependencies (#128) (#129) +- [7342a45](https://github.com/stashed/mariadb/commit/7342a45) [cherry-pick] Use user nobody (#127) +- [3c1f773](https://github.com/stashed/mariadb/commit/3c1f773) [cherry-pick] Update repository config (#125) (#126) +- [a54da2f](https://github.com/stashed/mariadb/commit/a54da2f) [cherry-pick] Update repository config (#123) (#124) +- [ce30084](https://github.com/stashed/mariadb/commit/ce30084) [cherry-pick] Update README.md (#122) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v12](https://github.com/stashed/mongodb/releases/tag/3.4.17-v12) + +- [69628a86](https://github.com/stashed/mongodb/commit/69628a86) Prepare for release 3.4.17-v12 (#1264) +- [97ba7285](https://github.com/stashed/mongodb/commit/97ba7285) [cherry-pick] Fix jwt-go security vulnerability (#1250) (#1251) +- [325a3bd0](https://github.com/stashed/mongodb/commit/325a3bd0) [cherry-pick] Fix jwt-go security vulnerability (#1236) (#1237) +- [22a5fab9](https://github.com/stashed/mongodb/commit/22a5fab9) [cherry-pick] Update dependencies to publish SiteInfo (#1222) (#1223) +- [8bf670e1](https://github.com/stashed/mongodb/commit/8bf670e1) [cherry-pick] Update dependencies to publish SiteInfo (#1208) (#1209) +- [a431846c](https://github.com/stashed/mongodb/commit/a431846c) [cherry-pick] Log warning if Community License is used with non-demo namespace (#1194) (#1195) +- [c99cad39](https://github.com/stashed/mongodb/commit/c99cad39) [cherry-pick] Use official restic v0.12.1 (#1180) (#1181) +- [b0aefc96](https://github.com/stashed/mongodb/commit/b0aefc96) [cherry-pick] Update repository config (#1166) (#1167) +- [b930d20d](https://github.com/stashed/mongodb/commit/b930d20d) [cherry-pick] Update dependencies (#1152) (#1153) +- [56417b38](https://github.com/stashed/mongodb/commit/56417b38) [cherry-pick] Update dependencies (#1138) (#1139) +- [7bdd0832](https://github.com/stashed/mongodb/commit/7bdd0832) [cherry-pick] Update dependencies (#1124) (#1125) +- [867a70f1](https://github.com/stashed/mongodb/commit/867a70f1) [cherry-pick] Use user nobody (#1112) +- [528e1529](https://github.com/stashed/mongodb/commit/528e1529) [cherry-pick] Update repository config (#1099) (#1100) +- [0606c894](https://github.com/stashed/mongodb/commit/0606c894) [cherry-pick] Update repository config (#1086) (#1087) +- [2a9d8768](https://github.com/stashed/mongodb/commit/2a9d8768) [cherry-pick] Update README.md (#1074) + + +### [3.4.22-v12](https://github.com/stashed/mongodb/releases/tag/3.4.22-v12) + +- [06b5f60f](https://github.com/stashed/mongodb/commit/06b5f60f) Prepare for release 3.4.22-v12 (#1265) +- [7c5cf34a](https://github.com/stashed/mongodb/commit/7c5cf34a) [cherry-pick] Fix jwt-go security vulnerability (#1250) (#1252) +- [ec1b6cd9](https://github.com/stashed/mongodb/commit/ec1b6cd9) [cherry-pick] Fix jwt-go security vulnerability (#1236) (#1238) +- [bfef68dd](https://github.com/stashed/mongodb/commit/bfef68dd) [cherry-pick] Update dependencies to publish SiteInfo (#1222) (#1224) +- [0360c8a4](https://github.com/stashed/mongodb/commit/0360c8a4) [cherry-pick] Update dependencies to publish SiteInfo (#1208) (#1210) +- [b3978742](https://github.com/stashed/mongodb/commit/b3978742) [cherry-pick] Log warning if Community License is used with non-demo namespace (#1194) (#1196) +- [076e1c7f](https://github.com/stashed/mongodb/commit/076e1c7f) [cherry-pick] Use official restic v0.12.1 (#1180) (#1182) +- [5c2a16bc](https://github.com/stashed/mongodb/commit/5c2a16bc) [cherry-pick] Update repository config (#1166) (#1168) +- [ad1058d8](https://github.com/stashed/mongodb/commit/ad1058d8) [cherry-pick] Update dependencies (#1152) (#1154) +- [1d0b2d12](https://github.com/stashed/mongodb/commit/1d0b2d12) [cherry-pick] Update dependencies (#1138) (#1140) +- [9014381f](https://github.com/stashed/mongodb/commit/9014381f) [cherry-pick] Update dependencies (#1124) (#1126) +- [3ce9f548](https://github.com/stashed/mongodb/commit/3ce9f548) [cherry-pick] Use user nobody (#1113) +- [9d1a648b](https://github.com/stashed/mongodb/commit/9d1a648b) [cherry-pick] Update repository config (#1099) (#1101) +- [ebd987d5](https://github.com/stashed/mongodb/commit/ebd987d5) [cherry-pick] Update repository config (#1086) (#1088) +- [58baff2d](https://github.com/stashed/mongodb/commit/58baff2d) [cherry-pick] Update README.md (#1075) + + +### [3.6.8-v12](https://github.com/stashed/mongodb/releases/tag/3.6.8-v12) + +- [37362a0a](https://github.com/stashed/mongodb/commit/37362a0a) Prepare for release 3.6.8-v12 (#1267) +- [3638de4c](https://github.com/stashed/mongodb/commit/3638de4c) [cherry-pick] Fix jwt-go security vulnerability (#1250) (#1254) +- [ffd0e227](https://github.com/stashed/mongodb/commit/ffd0e227) [cherry-pick] Fix jwt-go security vulnerability (#1236) (#1240) +- [f2b1f979](https://github.com/stashed/mongodb/commit/f2b1f979) [cherry-pick] Update dependencies to publish SiteInfo (#1222) (#1226) +- [d4b8f157](https://github.com/stashed/mongodb/commit/d4b8f157) [cherry-pick] Update dependencies to publish SiteInfo (#1208) (#1212) +- [17c91aa8](https://github.com/stashed/mongodb/commit/17c91aa8) [cherry-pick] Log warning if Community License is used with non-demo namespace (#1194) (#1198) +- [4b2717a0](https://github.com/stashed/mongodb/commit/4b2717a0) [cherry-pick] Use official restic v0.12.1 (#1180) (#1184) +- [3f0f514c](https://github.com/stashed/mongodb/commit/3f0f514c) [cherry-pick] Update repository config (#1166) (#1170) +- [faba0d40](https://github.com/stashed/mongodb/commit/faba0d40) [cherry-pick] Update dependencies (#1152) (#1156) +- [62300371](https://github.com/stashed/mongodb/commit/62300371) [cherry-pick] Update dependencies (#1138) (#1142) +- [f4075d20](https://github.com/stashed/mongodb/commit/f4075d20) [cherry-pick] Update dependencies (#1124) (#1128) +- [24e77c90](https://github.com/stashed/mongodb/commit/24e77c90) [cherry-pick] Use user nobody (#1115) +- [386140af](https://github.com/stashed/mongodb/commit/386140af) [cherry-pick] Update repository config (#1099) (#1103) +- [f69c1d0f](https://github.com/stashed/mongodb/commit/f69c1d0f) [cherry-pick] Update repository config (#1086) (#1090) +- [86c0b41b](https://github.com/stashed/mongodb/commit/86c0b41b) [cherry-pick] Update README.md (#1077) + + +### [3.6.13-v12](https://github.com/stashed/mongodb/releases/tag/3.6.13-v12) + +- [532e72c7](https://github.com/stashed/mongodb/commit/532e72c7) Prepare for release 3.6.13-v12 (#1266) +- [b62cf94b](https://github.com/stashed/mongodb/commit/b62cf94b) [cherry-pick] Fix jwt-go security vulnerability (#1250) (#1253) +- [644f22b3](https://github.com/stashed/mongodb/commit/644f22b3) [cherry-pick] Fix jwt-go security vulnerability (#1236) (#1239) +- [dd2424be](https://github.com/stashed/mongodb/commit/dd2424be) [cherry-pick] Update dependencies to publish SiteInfo (#1222) (#1225) +- [c5b0e852](https://github.com/stashed/mongodb/commit/c5b0e852) [cherry-pick] Update dependencies to publish SiteInfo (#1208) (#1211) +- [b9e008b9](https://github.com/stashed/mongodb/commit/b9e008b9) [cherry-pick] Log warning if Community License is used with non-demo namespace (#1194) (#1197) +- [7e832b9d](https://github.com/stashed/mongodb/commit/7e832b9d) [cherry-pick] Use official restic v0.12.1 (#1180) (#1183) +- [9c515527](https://github.com/stashed/mongodb/commit/9c515527) [cherry-pick] Update repository config (#1166) (#1169) +- [6e59e006](https://github.com/stashed/mongodb/commit/6e59e006) [cherry-pick] Update dependencies (#1152) (#1155) +- [f168d3f3](https://github.com/stashed/mongodb/commit/f168d3f3) [cherry-pick] Update dependencies (#1138) (#1141) +- [e758e8e0](https://github.com/stashed/mongodb/commit/e758e8e0) [cherry-pick] Update dependencies (#1124) (#1127) +- [8a8d96e7](https://github.com/stashed/mongodb/commit/8a8d96e7) [cherry-pick] Use user nobody (#1114) +- [45ab9d0c](https://github.com/stashed/mongodb/commit/45ab9d0c) [cherry-pick] Update repository config (#1099) (#1102) +- [22e5dd21](https://github.com/stashed/mongodb/commit/22e5dd21) [cherry-pick] Update repository config (#1086) (#1089) +- [49dab901](https://github.com/stashed/mongodb/commit/49dab901) [cherry-pick] Update README.md (#1076) + + +### [4.0.3-v12](https://github.com/stashed/mongodb/releases/tag/4.0.3-v12) + +- [4f36edfd](https://github.com/stashed/mongodb/commit/4f36edfd) Prepare for release 4.0.3-v12 (#1269) +- [bea5ee27](https://github.com/stashed/mongodb/commit/bea5ee27) [cherry-pick] Fix jwt-go security vulnerability (#1250) (#1256) +- [bb787054](https://github.com/stashed/mongodb/commit/bb787054) [cherry-pick] Fix jwt-go security vulnerability (#1236) (#1242) +- [ac0bfd12](https://github.com/stashed/mongodb/commit/ac0bfd12) [cherry-pick] Update dependencies to publish SiteInfo (#1222) (#1228) +- [31c7d66c](https://github.com/stashed/mongodb/commit/31c7d66c) [cherry-pick] Update dependencies to publish SiteInfo (#1208) (#1214) +- [ce07bdd7](https://github.com/stashed/mongodb/commit/ce07bdd7) [cherry-pick] Log warning if Community License is used with non-demo namespace (#1194) (#1200) +- [102601ee](https://github.com/stashed/mongodb/commit/102601ee) [cherry-pick] Use official restic v0.12.1 (#1180) (#1186) +- [e75754f8](https://github.com/stashed/mongodb/commit/e75754f8) [cherry-pick] Update repository config (#1166) (#1172) +- [a069745a](https://github.com/stashed/mongodb/commit/a069745a) [cherry-pick] Update dependencies (#1152) (#1158) +- [4e7a1e24](https://github.com/stashed/mongodb/commit/4e7a1e24) [cherry-pick] Update dependencies (#1138) (#1144) +- [80a75e9c](https://github.com/stashed/mongodb/commit/80a75e9c) [cherry-pick] Update dependencies (#1124) (#1130) +- [319a4947](https://github.com/stashed/mongodb/commit/319a4947) [cherry-pick] Use user nobody (#1117) +- [bcb3cfd2](https://github.com/stashed/mongodb/commit/bcb3cfd2) [cherry-pick] Update repository config (#1099) (#1105) +- [a05dce30](https://github.com/stashed/mongodb/commit/a05dce30) [cherry-pick] Update repository config (#1086) (#1092) +- [dd5135b5](https://github.com/stashed/mongodb/commit/dd5135b5) [cherry-pick] Update README.md (#1079) + + +### [4.0.5-v12](https://github.com/stashed/mongodb/releases/tag/4.0.5-v12) + +- [6b691d1f](https://github.com/stashed/mongodb/commit/6b691d1f) Prepare for release 4.0.5-v12 (#1270) +- [39f10575](https://github.com/stashed/mongodb/commit/39f10575) [cherry-pick] Fix jwt-go security vulnerability (#1250) (#1257) +- [53beff3b](https://github.com/stashed/mongodb/commit/53beff3b) [cherry-pick] Fix jwt-go security vulnerability (#1236) (#1243) +- [136c6960](https://github.com/stashed/mongodb/commit/136c6960) [cherry-pick] Update dependencies to publish SiteInfo (#1222) (#1229) +- [6207c465](https://github.com/stashed/mongodb/commit/6207c465) [cherry-pick] Update dependencies to publish SiteInfo (#1208) (#1215) +- [e7e139d3](https://github.com/stashed/mongodb/commit/e7e139d3) [cherry-pick] Log warning if Community License is used with non-demo namespace (#1194) (#1201) +- [30a94da7](https://github.com/stashed/mongodb/commit/30a94da7) [cherry-pick] Use official restic v0.12.1 (#1180) (#1187) +- [f59c5a6c](https://github.com/stashed/mongodb/commit/f59c5a6c) [cherry-pick] Update repository config (#1166) (#1173) +- [dd14094c](https://github.com/stashed/mongodb/commit/dd14094c) [cherry-pick] Update dependencies (#1152) (#1159) +- [636296f1](https://github.com/stashed/mongodb/commit/636296f1) [cherry-pick] Update dependencies (#1138) (#1145) +- [0ccc1b8b](https://github.com/stashed/mongodb/commit/0ccc1b8b) [cherry-pick] Update dependencies (#1124) (#1131) +- [43dc654f](https://github.com/stashed/mongodb/commit/43dc654f) [cherry-pick] Use user nobody (#1118) +- [099f6ea5](https://github.com/stashed/mongodb/commit/099f6ea5) [cherry-pick] Update repository config (#1099) (#1106) +- [6595c0cb](https://github.com/stashed/mongodb/commit/6595c0cb) [cherry-pick] Update repository config (#1086) (#1093) +- [b18af069](https://github.com/stashed/mongodb/commit/b18af069) [cherry-pick] Update README.md (#1080) + + +### [4.0.11-v12](https://github.com/stashed/mongodb/releases/tag/4.0.11-v12) + +- [5ae4abe4](https://github.com/stashed/mongodb/commit/5ae4abe4) Prepare for release 4.0.11-v12 (#1268) +- [86255e75](https://github.com/stashed/mongodb/commit/86255e75) [cherry-pick] Fix jwt-go security vulnerability (#1250) (#1255) +- [bd4ed817](https://github.com/stashed/mongodb/commit/bd4ed817) [cherry-pick] Fix jwt-go security vulnerability (#1236) (#1241) +- [079e1c84](https://github.com/stashed/mongodb/commit/079e1c84) [cherry-pick] Update dependencies to publish SiteInfo (#1222) (#1227) +- [872c68cd](https://github.com/stashed/mongodb/commit/872c68cd) [cherry-pick] Update dependencies to publish SiteInfo (#1208) (#1213) +- [8407c055](https://github.com/stashed/mongodb/commit/8407c055) [cherry-pick] Log warning if Community License is used with non-demo namespace (#1194) (#1199) +- [223707c8](https://github.com/stashed/mongodb/commit/223707c8) [cherry-pick] Use official restic v0.12.1 (#1180) (#1185) +- [cc711ac3](https://github.com/stashed/mongodb/commit/cc711ac3) [cherry-pick] Update repository config (#1166) (#1171) +- [2581d408](https://github.com/stashed/mongodb/commit/2581d408) [cherry-pick] Update dependencies (#1152) (#1157) +- [243f28a0](https://github.com/stashed/mongodb/commit/243f28a0) [cherry-pick] Update dependencies (#1138) (#1143) +- [b706066b](https://github.com/stashed/mongodb/commit/b706066b) [cherry-pick] Update dependencies (#1124) (#1129) +- [20423b74](https://github.com/stashed/mongodb/commit/20423b74) [cherry-pick] Use user nobody (#1116) +- [d4b269d8](https://github.com/stashed/mongodb/commit/d4b269d8) [cherry-pick] Update repository config (#1099) (#1104) +- [f795ab01](https://github.com/stashed/mongodb/commit/f795ab01) [cherry-pick] Update repository config (#1086) (#1091) +- [9360ba4e](https://github.com/stashed/mongodb/commit/9360ba4e) [cherry-pick] Update README.md (#1078) + + +### [4.1.4-v12](https://github.com/stashed/mongodb/releases/tag/4.1.4-v12) + +- [fb2cb972](https://github.com/stashed/mongodb/commit/fb2cb972) Prepare for release 4.1.4-v12 (#1272) +- [828c9c33](https://github.com/stashed/mongodb/commit/828c9c33) [cherry-pick] Fix jwt-go security vulnerability (#1250) (#1259) +- [f7421dfe](https://github.com/stashed/mongodb/commit/f7421dfe) [cherry-pick] Fix jwt-go security vulnerability (#1236) (#1245) +- [e7f3389f](https://github.com/stashed/mongodb/commit/e7f3389f) [cherry-pick] Update dependencies to publish SiteInfo (#1222) (#1231) +- [412cac39](https://github.com/stashed/mongodb/commit/412cac39) [cherry-pick] Update dependencies to publish SiteInfo (#1208) (#1217) +- [2885f7b7](https://github.com/stashed/mongodb/commit/2885f7b7) [cherry-pick] Log warning if Community License is used with non-demo namespace (#1194) (#1203) +- [45880326](https://github.com/stashed/mongodb/commit/45880326) [cherry-pick] Use official restic v0.12.1 (#1180) (#1189) +- [4e0e4040](https://github.com/stashed/mongodb/commit/4e0e4040) [cherry-pick] Update repository config (#1166) (#1175) +- [947563a4](https://github.com/stashed/mongodb/commit/947563a4) [cherry-pick] Update dependencies (#1152) (#1161) +- [a386cc6a](https://github.com/stashed/mongodb/commit/a386cc6a) [cherry-pick] Update dependencies (#1138) (#1147) +- [94a94df5](https://github.com/stashed/mongodb/commit/94a94df5) [cherry-pick] Update dependencies (#1124) (#1133) +- [b60fe1d7](https://github.com/stashed/mongodb/commit/b60fe1d7) [cherry-pick] Use user nobody (#1120) +- [90649dd7](https://github.com/stashed/mongodb/commit/90649dd7) [cherry-pick] Update repository config (#1099) (#1108) +- [147d0b08](https://github.com/stashed/mongodb/commit/147d0b08) [cherry-pick] Update repository config (#1086) (#1095) +- [570b7984](https://github.com/stashed/mongodb/commit/570b7984) [cherry-pick] Update README.md (#1082) + + +### [4.1.7-v12](https://github.com/stashed/mongodb/releases/tag/4.1.7-v12) + +- [55d3315e](https://github.com/stashed/mongodb/commit/55d3315e) Prepare for release 4.1.7-v12 (#1273) +- [363724f2](https://github.com/stashed/mongodb/commit/363724f2) [cherry-pick] Fix jwt-go security vulnerability (#1250) (#1260) +- [a2ddb368](https://github.com/stashed/mongodb/commit/a2ddb368) [cherry-pick] Fix jwt-go security vulnerability (#1236) (#1246) +- [cb493707](https://github.com/stashed/mongodb/commit/cb493707) [cherry-pick] Update dependencies to publish SiteInfo (#1222) (#1232) +- [7eaac8e1](https://github.com/stashed/mongodb/commit/7eaac8e1) [cherry-pick] Update dependencies to publish SiteInfo (#1208) (#1218) +- [c93130b6](https://github.com/stashed/mongodb/commit/c93130b6) [cherry-pick] Log warning if Community License is used with non-demo namespace (#1194) (#1204) +- [604501cf](https://github.com/stashed/mongodb/commit/604501cf) [cherry-pick] Use official restic v0.12.1 (#1180) (#1190) +- [63f1385e](https://github.com/stashed/mongodb/commit/63f1385e) [cherry-pick] Update repository config (#1166) (#1176) +- [a530f03f](https://github.com/stashed/mongodb/commit/a530f03f) [cherry-pick] Update dependencies (#1152) (#1162) +- [910a4581](https://github.com/stashed/mongodb/commit/910a4581) [cherry-pick] Update dependencies (#1138) (#1148) +- [0cb4b9e3](https://github.com/stashed/mongodb/commit/0cb4b9e3) [cherry-pick] Update dependencies (#1124) (#1134) +- [aeab96a9](https://github.com/stashed/mongodb/commit/aeab96a9) [cherry-pick] Use user nobody (#1121) +- [8768b338](https://github.com/stashed/mongodb/commit/8768b338) [cherry-pick] Update repository config (#1099) (#1109) +- [c139f365](https://github.com/stashed/mongodb/commit/c139f365) [cherry-pick] Update repository config (#1086) (#1096) +- [3e57b806](https://github.com/stashed/mongodb/commit/3e57b806) [cherry-pick] Update README.md (#1083) + + +### [4.1.13-v12](https://github.com/stashed/mongodb/releases/tag/4.1.13-v12) + +- [fd8c4934](https://github.com/stashed/mongodb/commit/fd8c4934) Prepare for release 4.1.13-v12 (#1271) +- [3aa25931](https://github.com/stashed/mongodb/commit/3aa25931) [cherry-pick] Fix jwt-go security vulnerability (#1250) (#1258) +- [671bb974](https://github.com/stashed/mongodb/commit/671bb974) [cherry-pick] Fix jwt-go security vulnerability (#1236) (#1244) +- [289a843b](https://github.com/stashed/mongodb/commit/289a843b) [cherry-pick] Update dependencies to publish SiteInfo (#1222) (#1230) +- [9efdc589](https://github.com/stashed/mongodb/commit/9efdc589) [cherry-pick] Update dependencies to publish SiteInfo (#1208) (#1216) +- [ae5780bb](https://github.com/stashed/mongodb/commit/ae5780bb) [cherry-pick] Log warning if Community License is used with non-demo namespace (#1194) (#1202) +- [6928de7f](https://github.com/stashed/mongodb/commit/6928de7f) [cherry-pick] Use official restic v0.12.1 (#1180) (#1188) +- [4d82ec2e](https://github.com/stashed/mongodb/commit/4d82ec2e) [cherry-pick] Update repository config (#1166) (#1174) +- [a76a5f8e](https://github.com/stashed/mongodb/commit/a76a5f8e) [cherry-pick] Update dependencies (#1152) (#1160) +- [1462c0c1](https://github.com/stashed/mongodb/commit/1462c0c1) [cherry-pick] Update dependencies (#1138) (#1146) +- [1ce4bb55](https://github.com/stashed/mongodb/commit/1ce4bb55) [cherry-pick] Update dependencies (#1124) (#1132) +- [0d7ee1bb](https://github.com/stashed/mongodb/commit/0d7ee1bb) [cherry-pick] Use user nobody (#1119) +- [60dd402b](https://github.com/stashed/mongodb/commit/60dd402b) [cherry-pick] Update repository config (#1099) (#1107) +- [76e4d9e0](https://github.com/stashed/mongodb/commit/76e4d9e0) [cherry-pick] Update repository config (#1086) (#1094) +- [887de5c0](https://github.com/stashed/mongodb/commit/887de5c0) [cherry-pick] Update README.md (#1081) + + +### [4.2.3-v12](https://github.com/stashed/mongodb/releases/tag/4.2.3-v12) + +- [c584cacc](https://github.com/stashed/mongodb/commit/c584cacc) Prepare for release 4.2.3-v12 (#1274) +- [4fe9a550](https://github.com/stashed/mongodb/commit/4fe9a550) [cherry-pick] Fix jwt-go security vulnerability (#1250) (#1261) +- [a6a4b593](https://github.com/stashed/mongodb/commit/a6a4b593) [cherry-pick] Fix jwt-go security vulnerability (#1236) (#1247) +- [632f8e76](https://github.com/stashed/mongodb/commit/632f8e76) [cherry-pick] Update dependencies to publish SiteInfo (#1222) (#1233) +- [f4cbabdc](https://github.com/stashed/mongodb/commit/f4cbabdc) [cherry-pick] Update dependencies to publish SiteInfo (#1208) (#1219) +- [d8bbe636](https://github.com/stashed/mongodb/commit/d8bbe636) [cherry-pick] Log warning if Community License is used with non-demo namespace (#1194) (#1205) +- [3dffe923](https://github.com/stashed/mongodb/commit/3dffe923) [cherry-pick] Use official restic v0.12.1 (#1180) (#1191) +- [04f73554](https://github.com/stashed/mongodb/commit/04f73554) [cherry-pick] Update repository config (#1166) (#1177) +- [42cc8004](https://github.com/stashed/mongodb/commit/42cc8004) [cherry-pick] Update dependencies (#1152) (#1163) +- [a75b0f27](https://github.com/stashed/mongodb/commit/a75b0f27) [cherry-pick] Update dependencies (#1138) (#1149) +- [1446f267](https://github.com/stashed/mongodb/commit/1446f267) [cherry-pick] Update dependencies (#1124) (#1135) +- [c51ba8d9](https://github.com/stashed/mongodb/commit/c51ba8d9) [cherry-pick] Use user nobody (#1122) +- [ce4e30fd](https://github.com/stashed/mongodb/commit/ce4e30fd) [cherry-pick] Update repository config (#1099) (#1110) +- [4f0a3d52](https://github.com/stashed/mongodb/commit/4f0a3d52) [cherry-pick] Update repository config (#1086) (#1097) +- [5cfa63c2](https://github.com/stashed/mongodb/commit/5cfa63c2) [cherry-pick] Update README.md (#1084) + + +### [4.4.6-v3](https://github.com/stashed/mongodb/releases/tag/4.4.6-v3) + +- [20eadfb9](https://github.com/stashed/mongodb/commit/20eadfb9) [cherry-pick] Fix jwt-go security vulnerability (#1250) (#1262) +- [c8175506](https://github.com/stashed/mongodb/commit/c8175506) [cherry-pick] Fix jwt-go security vulnerability (#1236) (#1248) +- [63e5fb56](https://github.com/stashed/mongodb/commit/63e5fb56) [cherry-pick] Update dependencies to publish SiteInfo (#1222) (#1234) +- [14c357e4](https://github.com/stashed/mongodb/commit/14c357e4) [cherry-pick] Update dependencies to publish SiteInfo (#1208) (#1220) +- [d8b33503](https://github.com/stashed/mongodb/commit/d8b33503) [cherry-pick] Log warning if Community License is used with non-demo namespace (#1194) (#1206) +- [73382bec](https://github.com/stashed/mongodb/commit/73382bec) [cherry-pick] Use official restic v0.12.1 (#1180) (#1192) +- [a48b9a92](https://github.com/stashed/mongodb/commit/a48b9a92) [cherry-pick] Update repository config (#1166) (#1178) +- [84480622](https://github.com/stashed/mongodb/commit/84480622) [cherry-pick] Update dependencies (#1152) (#1164) +- [4be17009](https://github.com/stashed/mongodb/commit/4be17009) [cherry-pick] Update dependencies (#1138) (#1150) +- [995b5d7a](https://github.com/stashed/mongodb/commit/995b5d7a) [cherry-pick] Update dependencies (#1124) (#1136) +- [915c10a3](https://github.com/stashed/mongodb/commit/915c10a3) [cherry-pick] Use user nobody (#1123) +- [aa7416c2](https://github.com/stashed/mongodb/commit/aa7416c2) [cherry-pick] Update repository config (#1099) (#1111) +- [fe1d8892](https://github.com/stashed/mongodb/commit/fe1d8892) [cherry-pick] Update repository config (#1086) (#1098) +- [3955f424](https://github.com/stashed/mongodb/commit/3955f424) [cherry-pick] Update README.md (#1085) +- [2061ae6f](https://github.com/stashed/mongodb/commit/2061ae6f) Prepare for release 4.4.6-v2 (#1072) + + +### [5.0.3](https://github.com/stashed/mongodb/releases/tag/5.0.3) + + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v13](https://github.com/stashed/mysql/releases/tag/5.7.25-v13) + +- [aff6e370](https://github.com/stashed/mysql/commit/aff6e370) Prepare for release 5.7.25-v13 (#528) +- [60ddc272](https://github.com/stashed/mysql/commit/60ddc272) [cherry-pick] Fix jwt-go security vulnerability (#523) (#524) +- [799720cb](https://github.com/stashed/mysql/commit/799720cb) [cherry-pick] Fix jwt-go security vulnerability (#518) (#519) +- [008b2bf5](https://github.com/stashed/mysql/commit/008b2bf5) [cherry-pick] Update dependencies to publish SiteInfo (#513) (#514) +- [fdedb6d1](https://github.com/stashed/mysql/commit/fdedb6d1) [cherry-pick] Update dependencies to publish SiteInfo (#508) (#509) +- [28533a79](https://github.com/stashed/mysql/commit/28533a79) [cherry-pick] Log warning if Community License is used with non-demo namespace (#503) (#504) +- [d905ccbb](https://github.com/stashed/mysql/commit/d905ccbb) [cherry-pick] Use official restic v0.12.1 (#498) (#499) +- [9582cc54](https://github.com/stashed/mysql/commit/9582cc54) [cherry-pick] Update repository config (#493) (#494) +- [0ae1d9a0](https://github.com/stashed/mysql/commit/0ae1d9a0) [cherry-pick] Update dependencies (#488) (#489) +- [07722857](https://github.com/stashed/mysql/commit/07722857) [cherry-pick] Update dependencies (#483) (#484) +- [2a177d7d](https://github.com/stashed/mysql/commit/2a177d7d) [cherry-pick] Update dependencies (#478) (#479) +- [fdf16b05](https://github.com/stashed/mysql/commit/fdf16b05) [cherry-pick] Use user nobody (#474) +- [6b54b57d](https://github.com/stashed/mysql/commit/6b54b57d) [cherry-pick] Update repository config (#469) (#470) +- [5c9a5e36](https://github.com/stashed/mysql/commit/5c9a5e36) [cherry-pick] Update repository config (#464) (#465) +- [7c10a203](https://github.com/stashed/mysql/commit/7c10a203) [cherry-pick] Update README.md (#460) + + +### [8.0.3-v13](https://github.com/stashed/mysql/releases/tag/8.0.3-v13) + +- [eec051ee](https://github.com/stashed/mysql/commit/eec051ee) Prepare for release 8.0.3-v13 (#531) +- [1660e950](https://github.com/stashed/mysql/commit/1660e950) [cherry-pick] Fix jwt-go security vulnerability (#523) (#527) +- [71cf139d](https://github.com/stashed/mysql/commit/71cf139d) [cherry-pick] Fix jwt-go security vulnerability (#518) (#522) +- [0140594b](https://github.com/stashed/mysql/commit/0140594b) [cherry-pick] Update dependencies to publish SiteInfo (#513) (#517) +- [891c4a0c](https://github.com/stashed/mysql/commit/891c4a0c) [cherry-pick] Update dependencies to publish SiteInfo (#508) (#512) +- [5eb9b26f](https://github.com/stashed/mysql/commit/5eb9b26f) [cherry-pick] Log warning if Community License is used with non-demo namespace (#503) (#507) +- [e8f12efd](https://github.com/stashed/mysql/commit/e8f12efd) [cherry-pick] Use official restic v0.12.1 (#498) (#502) +- [0a607cb4](https://github.com/stashed/mysql/commit/0a607cb4) [cherry-pick] Update repository config (#493) (#497) +- [8d7a17ae](https://github.com/stashed/mysql/commit/8d7a17ae) [cherry-pick] Update dependencies (#488) (#492) +- [03c31af6](https://github.com/stashed/mysql/commit/03c31af6) [cherry-pick] Update dependencies (#483) (#487) +- [b4aacc9c](https://github.com/stashed/mysql/commit/b4aacc9c) [cherry-pick] Update dependencies (#478) (#482) +- [d1bcfc4b](https://github.com/stashed/mysql/commit/d1bcfc4b) [cherry-pick] Use user nobody (#477) +- [79ede44f](https://github.com/stashed/mysql/commit/79ede44f) [cherry-pick] Update repository config (#469) (#473) +- [7fad3905](https://github.com/stashed/mysql/commit/7fad3905) [cherry-pick] Update repository config (#464) (#468) +- [06308914](https://github.com/stashed/mysql/commit/06308914) [cherry-pick] Update README.md (#463) + + +### [8.0.14-v13](https://github.com/stashed/mysql/releases/tag/8.0.14-v13) + +- [04d8f7d9](https://github.com/stashed/mysql/commit/04d8f7d9) Prepare for release 8.0.14-v13 (#529) +- [235005d4](https://github.com/stashed/mysql/commit/235005d4) [cherry-pick] Fix jwt-go security vulnerability (#523) (#525) +- [ff9e8eb9](https://github.com/stashed/mysql/commit/ff9e8eb9) [cherry-pick] Fix jwt-go security vulnerability (#518) (#520) +- [b0ad3407](https://github.com/stashed/mysql/commit/b0ad3407) [cherry-pick] Update dependencies to publish SiteInfo (#513) (#515) +- [e5ce9e5a](https://github.com/stashed/mysql/commit/e5ce9e5a) [cherry-pick] Update dependencies to publish SiteInfo (#508) (#510) +- [6879bc7f](https://github.com/stashed/mysql/commit/6879bc7f) [cherry-pick] Log warning if Community License is used with non-demo namespace (#503) (#505) +- [9d021bf3](https://github.com/stashed/mysql/commit/9d021bf3) [cherry-pick] Use official restic v0.12.1 (#498) (#500) +- [23a8405c](https://github.com/stashed/mysql/commit/23a8405c) [cherry-pick] Update repository config (#493) (#495) +- [ef9bd7a3](https://github.com/stashed/mysql/commit/ef9bd7a3) [cherry-pick] Update dependencies (#488) (#490) +- [753cf713](https://github.com/stashed/mysql/commit/753cf713) [cherry-pick] Update dependencies (#483) (#485) +- [fe5dbd4e](https://github.com/stashed/mysql/commit/fe5dbd4e) [cherry-pick] Update dependencies (#478) (#480) +- [c8090a9b](https://github.com/stashed/mysql/commit/c8090a9b) [cherry-pick] Use user nobody (#475) +- [36c9a151](https://github.com/stashed/mysql/commit/36c9a151) [cherry-pick] Update repository config (#469) (#471) +- [9bdfdeeb](https://github.com/stashed/mysql/commit/9bdfdeeb) [cherry-pick] Update repository config (#464) (#466) +- [168469fe](https://github.com/stashed/mysql/commit/168469fe) [cherry-pick] Update README.md (#461) + + +### [8.0.21-v7](https://github.com/stashed/mysql/releases/tag/8.0.21-v7) + +- [e5ea20ba](https://github.com/stashed/mysql/commit/e5ea20ba) Prepare for release 8.0.21-v7 (#530) +- [5db2b531](https://github.com/stashed/mysql/commit/5db2b531) [cherry-pick] Fix jwt-go security vulnerability (#523) (#526) +- [52cd9513](https://github.com/stashed/mysql/commit/52cd9513) [cherry-pick] Fix jwt-go security vulnerability (#518) (#521) +- [7d004545](https://github.com/stashed/mysql/commit/7d004545) [cherry-pick] Update dependencies to publish SiteInfo (#513) (#516) +- [6abc719c](https://github.com/stashed/mysql/commit/6abc719c) [cherry-pick] Update dependencies to publish SiteInfo (#508) (#511) +- [cd79c2de](https://github.com/stashed/mysql/commit/cd79c2de) [cherry-pick] Log warning if Community License is used with non-demo namespace (#503) (#506) +- [d974fafb](https://github.com/stashed/mysql/commit/d974fafb) [cherry-pick] Use official restic v0.12.1 (#498) (#501) +- [3828e7d3](https://github.com/stashed/mysql/commit/3828e7d3) [cherry-pick] Update repository config (#493) (#496) +- [2fd7d488](https://github.com/stashed/mysql/commit/2fd7d488) [cherry-pick] Update dependencies (#488) (#491) +- [2c28a324](https://github.com/stashed/mysql/commit/2c28a324) [cherry-pick] Update dependencies (#483) (#486) +- [b54ef541](https://github.com/stashed/mysql/commit/b54ef541) [cherry-pick] Update dependencies (#478) (#481) +- [249af93e](https://github.com/stashed/mysql/commit/249af93e) [cherry-pick] Use user nobody (#476) +- [b3d0bf71](https://github.com/stashed/mysql/commit/b3d0bf71) [cherry-pick] Update repository config (#469) (#472) +- [1f7e61fd](https://github.com/stashed/mysql/commit/1f7e61fd) [cherry-pick] Update repository config (#464) (#467) +- [436e0ab6](https://github.com/stashed/mysql/commit/436e0ab6) [cherry-pick] Update README.md (#462) + + + +## [stashed/nats](https://github.com/stashed/nats) + +### [2.6.1](https://github.com/stashed/nats/releases/tag/2.6.1) + +- [898dc86](https://github.com/stashed/nats/commit/898dc86) Prepare for release 2.6.1 (#9) +- [b54316d](https://github.com/stashed/nats/commit/b54316d) Fix jwt-go security vulnerability (#7) (#8) +- [dba8685](https://github.com/stashed/nats/commit/dba8685) Use nats.go v1.13.0 (#6) +- [324241b](https://github.com/stashed/nats/commit/324241b) Update TLS constants #5 +- [2077d6f](https://github.com/stashed/nats/commit/2077d6f) Append args (#4) +- [e7dc55d](https://github.com/stashed/nats/commit/e7dc55d) Update repository config (#3) +- [4e97bdc](https://github.com/stashed/nats/commit/4e97bdc) Add nats Stash addon (#2) +- [48941bd](https://github.com/stashed/nats/commit/48941bd) Merge pull request #1 from stashed/global-replace +- [ff46ec0](https://github.com/stashed/nats/commit/ff46ec0) Global replace Redis with NATS +- [6d880e0](https://github.com/stashed/nats/commit/6d880e0) Use user nobody +- [5252385](https://github.com/stashed/nats/commit/5252385) Update repository config (#11) +- [f6dc027](https://github.com/stashed/nats/commit/f6dc027) Update repository config (#8) +- [d68710e](https://github.com/stashed/nats/commit/d68710e) Prepare for release v2021.08.02 (#7) +- [1772bc7](https://github.com/stashed/nats/commit/1772bc7) Update repository config (#2) +- [7d4bfee](https://github.com/stashed/nats/commit/7d4bfee) Make Redis addon ready to use (#1) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-v8](https://github.com/stashed/percona-xtradb/releases/tag/5.7-v8) + +- [42564482](https://github.com/stashed/percona-xtradb/commit/42564482) Prepare for release 5.7-v8 (#221) +- [22f43849](https://github.com/stashed/percona-xtradb/commit/22f43849) [cherry-pick] Fix jwt-go security vulnerability (#219) (#220) +- [26dbbe0d](https://github.com/stashed/percona-xtradb/commit/26dbbe0d) [cherry-pick] Fix jwt-go security vulnerability (#217) (#218) +- [cfa5e989](https://github.com/stashed/percona-xtradb/commit/cfa5e989) [cherry-pick] Update dependencies to publish SiteInfo (#215) (#216) +- [645df7c7](https://github.com/stashed/percona-xtradb/commit/645df7c7) Update dependencies to publish SiteInfo (#213) (#214) +- [327484ce](https://github.com/stashed/percona-xtradb/commit/327484ce) [cherry-pick] Log warning if Community License is used with non-demo namespace (#211) (#212) +- [70e361f6](https://github.com/stashed/percona-xtradb/commit/70e361f6) [cherry-pick] Use official restic v0.12.1 (#209) (#210) +- [0568a599](https://github.com/stashed/percona-xtradb/commit/0568a599) [cherry-pick] Update repository config (#207) (#208) +- [541cafce](https://github.com/stashed/percona-xtradb/commit/541cafce) [cherry-pick] Update dependencies (#205) (#206) +- [42914499](https://github.com/stashed/percona-xtradb/commit/42914499) [cherry-pick] Update dependencies (#203) (#204) +- [f5d39489](https://github.com/stashed/percona-xtradb/commit/f5d39489) [cherry-pick] Update dependencies (#201) (#202) +- [3b0f52a5](https://github.com/stashed/percona-xtradb/commit/3b0f52a5) [cherry-pick] Use user nobody (#200) +- [91a6d048](https://github.com/stashed/percona-xtradb/commit/91a6d048) [cherry-pick] Update repository config (#198) (#199) +- [27ea0703](https://github.com/stashed/percona-xtradb/commit/27ea0703) [cherry-pick] Update repository config (#196) (#197) +- [3a9ec481](https://github.com/stashed/percona-xtradb/commit/3a9ec481) [cherry-pick] Update README.md (#195) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v11](https://github.com/stashed/postgres/releases/tag/9.6.19-v11) + +- [8f1256ef](https://github.com/stashed/postgres/commit/8f1256ef) Prepare for release 9.6.19-v11 (#935) +- [851efd30](https://github.com/stashed/postgres/commit/851efd30) [cherry-pick] Fix jwt-go security vulnerability (#923) (#929) +- [132fad16](https://github.com/stashed/postgres/commit/132fad16) [cherry-pick] Fix jwt-go security vulnerability (#916) (#922) +- [de2c0cd2](https://github.com/stashed/postgres/commit/de2c0cd2) [cherry-pick] Update dependencies to publish SiteInfo (#910) (#915) +- [8529a78e](https://github.com/stashed/postgres/commit/8529a78e) [cherry-pick] Update dependencies to publish SiteInfo (#904) (#909) +- [1ec16ab0](https://github.com/stashed/postgres/commit/1ec16ab0) [cherry-pick] Log warning if Community License is used with non-demo namespace (#897) (#902) +- [a5c59aa8](https://github.com/stashed/postgres/commit/a5c59aa8) [cherry-pick] Use official restic v0.12.1 (#891) (#896) +- [6042476d](https://github.com/stashed/postgres/commit/6042476d) [cherry-pick] Update repository config (#885) (#890) +- [062cf691](https://github.com/stashed/postgres/commit/062cf691) [cherry-pick] Update dependencies (#879) (#884) +- [74f16152](https://github.com/stashed/postgres/commit/74f16152) [cherry-pick] Update dependencies (#873) (#878) +- [665ff907](https://github.com/stashed/postgres/commit/665ff907) [cherry-pick] Update dependencies (#867) (#872) +- [51c55130](https://github.com/stashed/postgres/commit/51c55130) [cherry-pick] Use user nobody (#866) +- [9fd4d8c3](https://github.com/stashed/postgres/commit/9fd4d8c3) [cherry-pick] Update repository config (#856) (#861) + + +### [10.14-v11](https://github.com/stashed/postgres/releases/tag/10.14-v11) + +- [022910d2](https://github.com/stashed/postgres/commit/022910d2) Prepare for release 10.14-v11 (#930) +- [df4ea88e](https://github.com/stashed/postgres/commit/df4ea88e) [cherry-pick] Fix jwt-go security vulnerability (#923) (#924) +- [37492e25](https://github.com/stashed/postgres/commit/37492e25) [cherry-pick] Fix jwt-go security vulnerability (#916) (#917) +- [c36fd40d](https://github.com/stashed/postgres/commit/c36fd40d) [cherry-pick] Update dependencies to publish SiteInfo (#910) (#911) +- [40364b31](https://github.com/stashed/postgres/commit/40364b31) [cherry-pick] Update dependencies to publish SiteInfo (#904) (#905) +- [c7e6e42d](https://github.com/stashed/postgres/commit/c7e6e42d) [cherry-pick] Log warning if Community License is used with non-demo namespace (#897) (#898) +- [a7a14804](https://github.com/stashed/postgres/commit/a7a14804) [cherry-pick] Use official restic v0.12.1 (#891) (#892) +- [62f39a5a](https://github.com/stashed/postgres/commit/62f39a5a) [cherry-pick] Update repository config (#885) (#886) +- [c8c626dd](https://github.com/stashed/postgres/commit/c8c626dd) [cherry-pick] Update dependencies (#879) (#880) +- [8cca6897](https://github.com/stashed/postgres/commit/8cca6897) [cherry-pick] Update dependencies (#873) (#874) +- [2b8823ac](https://github.com/stashed/postgres/commit/2b8823ac) [cherry-pick] Update dependencies (#867) (#868) +- [de1290b4](https://github.com/stashed/postgres/commit/de1290b4) [cherry-pick] Use user nobody (#862) +- [9d8e96ed](https://github.com/stashed/postgres/commit/9d8e96ed) [cherry-pick] Update repository config (#856) (#857) +- [49ab6354](https://github.com/stashed/postgres/commit/49ab6354) [cherry-pick] Update repository config (#850) (#851) +- [ac88e3c1](https://github.com/stashed/postgres/commit/ac88e3c1) [cherry-pick] Update README.md (#845) + + +### [11.9-v11](https://github.com/stashed/postgres/releases/tag/11.9-v11) + +- [809eb881](https://github.com/stashed/postgres/commit/809eb881) Prepare for release 11.9-v11 (#931) +- [f8df2138](https://github.com/stashed/postgres/commit/f8df2138) [cherry-pick] Fix jwt-go security vulnerability (#923) (#925) +- [a5fcf2d7](https://github.com/stashed/postgres/commit/a5fcf2d7) [cherry-pick] Fix jwt-go security vulnerability (#916) (#918) +- [bc9b05a7](https://github.com/stashed/postgres/commit/bc9b05a7) [cherry-pick] Update dependencies to publish SiteInfo (#910) (#912) +- [eba577ca](https://github.com/stashed/postgres/commit/eba577ca) [cherry-pick] Update dependencies to publish SiteInfo (#904) (#906) +- [dd7e5b3c](https://github.com/stashed/postgres/commit/dd7e5b3c) [cherry-pick] Log warning if Community License is used with non-demo namespace (#897) (#899) +- [dbc851fe](https://github.com/stashed/postgres/commit/dbc851fe) [cherry-pick] Use official restic v0.12.1 (#891) (#893) +- [96c10215](https://github.com/stashed/postgres/commit/96c10215) [cherry-pick] Update repository config (#885) (#887) +- [89f96f4f](https://github.com/stashed/postgres/commit/89f96f4f) [cherry-pick] Update dependencies (#879) (#881) +- [540665e0](https://github.com/stashed/postgres/commit/540665e0) [cherry-pick] Update dependencies (#873) (#875) +- [89108c2e](https://github.com/stashed/postgres/commit/89108c2e) [cherry-pick] Update dependencies (#867) (#869) +- [6fb330f8](https://github.com/stashed/postgres/commit/6fb330f8) [cherry-pick] Use user nobody (#863) +- [057473bc](https://github.com/stashed/postgres/commit/057473bc) [cherry-pick] Update repository config (#856) (#858) +- [9387dbe7](https://github.com/stashed/postgres/commit/9387dbe7) [cherry-pick] Update repository config (#850) (#852) +- [0dda31f0](https://github.com/stashed/postgres/commit/0dda31f0) [cherry-pick] Update README.md (#846) + + +### [12.4-v11](https://github.com/stashed/postgres/releases/tag/12.4-v11) + +- [b6980ee7](https://github.com/stashed/postgres/commit/b6980ee7) Prepare for release 12.4-v11 (#932) +- [409eb663](https://github.com/stashed/postgres/commit/409eb663) [cherry-pick] Fix jwt-go security vulnerability (#923) (#926) +- [1f593322](https://github.com/stashed/postgres/commit/1f593322) [cherry-pick] Fix jwt-go security vulnerability (#916) (#919) +- [b19d3f18](https://github.com/stashed/postgres/commit/b19d3f18) [cherry-pick] Update dependencies to publish SiteInfo (#910) (#913) +- [8135d138](https://github.com/stashed/postgres/commit/8135d138) [cherry-pick] Update dependencies to publish SiteInfo (#904) (#907) +- [105bcabe](https://github.com/stashed/postgres/commit/105bcabe) [cherry-pick] Log warning if Community License is used with non-demo namespace (#897) (#900) +- [51a7933d](https://github.com/stashed/postgres/commit/51a7933d) [cherry-pick] Use official restic v0.12.1 (#891) (#894) +- [b49bb69f](https://github.com/stashed/postgres/commit/b49bb69f) [cherry-pick] Update repository config (#885) (#888) +- [bc4490f3](https://github.com/stashed/postgres/commit/bc4490f3) [cherry-pick] Update dependencies (#879) (#882) +- [7ec191fd](https://github.com/stashed/postgres/commit/7ec191fd) [cherry-pick] Update dependencies (#873) (#876) +- [16a2ee1d](https://github.com/stashed/postgres/commit/16a2ee1d) [cherry-pick] Update dependencies (#867) (#870) +- [9d392dfa](https://github.com/stashed/postgres/commit/9d392dfa) [cherry-pick] Use user nobody (#864) +- [c142e39c](https://github.com/stashed/postgres/commit/c142e39c) [cherry-pick] Update repository config (#856) (#859) +- [d8e8c2d2](https://github.com/stashed/postgres/commit/d8e8c2d2) [cherry-pick] Update repository config (#850) (#853) +- [3221e02a](https://github.com/stashed/postgres/commit/3221e02a) [cherry-pick] Update README.md (#847) + + +### [13.1-v8](https://github.com/stashed/postgres/releases/tag/13.1-v8) + +- [9211494b](https://github.com/stashed/postgres/commit/9211494b) Prepare for release 13.1-v8 (#933) +- [199edbf1](https://github.com/stashed/postgres/commit/199edbf1) [cherry-pick] Fix jwt-go security vulnerability (#923) (#927) +- [3efe6ad3](https://github.com/stashed/postgres/commit/3efe6ad3) [cherry-pick] Fix jwt-go security vulnerability (#916) (#920) +- [f6d36c5f](https://github.com/stashed/postgres/commit/f6d36c5f) [cherry-pick] Update dependencies to publish SiteInfo (#910) (#914) +- [9721595a](https://github.com/stashed/postgres/commit/9721595a) [cherry-pick] Update dependencies to publish SiteInfo (#904) (#908) +- [7b9c8fa6](https://github.com/stashed/postgres/commit/7b9c8fa6) [cherry-pick] Log warning if Community License is used with non-demo namespace (#897) (#901) +- [a71c6929](https://github.com/stashed/postgres/commit/a71c6929) [cherry-pick] Use official restic v0.12.1 (#891) (#895) +- [f795f28e](https://github.com/stashed/postgres/commit/f795f28e) [cherry-pick] Update repository config (#885) (#889) +- [927c795c](https://github.com/stashed/postgres/commit/927c795c) [cherry-pick] Update dependencies (#879) (#883) +- [72f86c43](https://github.com/stashed/postgres/commit/72f86c43) [cherry-pick] Update dependencies (#873) (#877) +- [3bc7ed49](https://github.com/stashed/postgres/commit/3bc7ed49) [cherry-pick] Update dependencies (#867) (#871) +- [6cf5b484](https://github.com/stashed/postgres/commit/6cf5b484) [cherry-pick] Use user nobody (#865) +- [f0c36245](https://github.com/stashed/postgres/commit/f0c36245) [cherry-pick] Update repository config (#856) (#860) +- [f73a8fdc](https://github.com/stashed/postgres/commit/f73a8fdc) [cherry-pick] Update repository config (#850) (#854) +- [08392aad](https://github.com/stashed/postgres/commit/08392aad) [cherry-pick] Update README.md (#848) + + +### [14.0](https://github.com/stashed/postgres/releases/tag/14.0) + + + + +## [stashed/redis](https://github.com/stashed/redis) + +### [5.0.13-v1](https://github.com/stashed/redis/releases/tag/5.0.13-v1) + +- [2cf8e50](https://github.com/stashed/redis/commit/2cf8e50) Prepare for release 5.0.13-v1 (#52) +- [19a146f](https://github.com/stashed/redis/commit/19a146f) [cherry-pick] Fix jwt-go security vulnerability (#49) (#50) +- [89a01a1](https://github.com/stashed/redis/commit/89a01a1) [cherry-pick] Fix jwt-go security vulnerability (#46) (#47) +- [71ef640](https://github.com/stashed/redis/commit/71ef640) Update dependencies to publish SiteInfo (#43) (#44) +- [07f2b0a](https://github.com/stashed/redis/commit/07f2b0a) [cherry-pick] Update dependencies to publish SiteInfo (#40) (#41) +- [c4fe884](https://github.com/stashed/redis/commit/c4fe884) [cherry-pick] Use forked redis-dump-go (#37) (#38) +- [c857baf](https://github.com/stashed/redis/commit/c857baf) [cherry-pick] Add Support for TLS enabled Redis client (#31) (#35) +- [fa42bbe](https://github.com/stashed/redis/commit/fa42bbe) [cherry-pick] Log warning if Community License is used with non-demo namespace (#32) (#33) +- [a14feb6](https://github.com/stashed/redis/commit/a14feb6) [cherry-pick] Use official restic v0.12.1 (#28) (#29) +- [800ad77](https://github.com/stashed/redis/commit/800ad77) [cherry-pick] Update repository config (#25) (#26) +- [8472251](https://github.com/stashed/redis/commit/8472251) [cherry-pick] Update dependencies (#22) (#23) +- [e6bbc7e](https://github.com/stashed/redis/commit/e6bbc7e) [cherry-pick] Update dependencies (#19) (#20) +- [d81c5d4](https://github.com/stashed/redis/commit/d81c5d4) [cherry-pick] Update dependencies (#16) (#17) +- [ac57ea0](https://github.com/stashed/redis/commit/ac57ea0) [cherry-pick] Use user nobody (#14) +- [c65e4af](https://github.com/stashed/redis/commit/c65e4af) [cherry-pick] Update repository config (#11) (#12) +- [62782d5](https://github.com/stashed/redis/commit/62782d5) [cherry-pick] Update repository config (#8) (#9) + + +### [6.2.5-v1](https://github.com/stashed/redis/releases/tag/6.2.5-v1) + +- [5882057](https://github.com/stashed/redis/commit/5882057) Prepare for release 6.2.5-v1 (#53) +- [59eeffa](https://github.com/stashed/redis/commit/59eeffa) [cherry-pick] Fix jwt-go security vulnerability (#49) (#51) +- [55237a0](https://github.com/stashed/redis/commit/55237a0) [cherry-pick] Fix jwt-go security vulnerability (#46) (#48) +- [149186e](https://github.com/stashed/redis/commit/149186e) Update dependencies to publish SiteInfo (#43) (#45) +- [1935030](https://github.com/stashed/redis/commit/1935030) [cherry-pick] Update dependencies to publish SiteInfo (#40) (#42) +- [07a1317](https://github.com/stashed/redis/commit/07a1317) [cherry-pick] Use forked redis-dump-go (#37) (#39) +- [ed58c90](https://github.com/stashed/redis/commit/ed58c90) [cherry-pick] Add Support for TLS enabled Redis client (#31) (#36) +- [11a3fb3](https://github.com/stashed/redis/commit/11a3fb3) [cherry-pick] Log warning if Community License is used with non-demo namespace (#32) (#34) +- [71bd761](https://github.com/stashed/redis/commit/71bd761) [cherry-pick] Use official restic v0.12.1 (#28) (#30) +- [281c595](https://github.com/stashed/redis/commit/281c595) [cherry-pick] Update repository config (#25) (#27) +- [7beb611](https://github.com/stashed/redis/commit/7beb611) [cherry-pick] Update dependencies (#22) (#24) +- [39852fa](https://github.com/stashed/redis/commit/39852fa) [cherry-pick] Update dependencies (#19) (#21) +- [ee90e7c](https://github.com/stashed/redis/commit/ee90e7c) [cherry-pick] Update dependencies (#16) (#18) +- [085749d](https://github.com/stashed/redis/commit/085749d) [cherry-pick] Use user nobody (#15) +- [6bd0302](https://github.com/stashed/redis/commit/6bd0302) [cherry-pick] Update repository config (#11) (#13) +- [81550b0](https://github.com/stashed/redis/commit/81550b0) [cherry-pick] Update repository config (#8) (#10) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.16.0](https://github.com/stashed/stash/releases/tag/v0.16.0) + +- [535efca8](https://github.com/stashed/stash/commit/535efca8) Prepare for release v0.16.0 (#1394) +- [7c26c7dd](https://github.com/stashed/stash/commit/7c26c7dd) Fix jwt-go security vulnerability (#1393) +- [8f63f724](https://github.com/stashed/stash/commit/8f63f724) Add support for ETCD restore flow (#1392) +- [5665ea7e](https://github.com/stashed/stash/commit/5665ea7e) Use nats.go v1.13.0 (#1391) +- [cc2da916](https://github.com/stashed/stash/commit/cc2da916) Setup SiteInfo publisher (#1390) +- [8daab52d](https://github.com/stashed/stash/commit/8daab52d) Update dependencies to publish SiteInfo (#1389) +- [50b58218](https://github.com/stashed/stash/commit/50b58218) Support passing args to restic backup/restore command (#1385) +- [28d878ed](https://github.com/stashed/stash/commit/28d878ed) Update dependencies to publish SiteInfo (#1387) +- [c063a536](https://github.com/stashed/stash/commit/c063a536) Fix license-reader ClusterRoleBinding not cleaning up properly (#1386) +- [e09bd7b0](https://github.com/stashed/stash/commit/e09bd7b0) Log warning if Community License is used with non-demo namespace (#1383) +- [3da6094c](https://github.com/stashed/stash/commit/3da6094c) Use stash-trigger as backup triggering CronJob name prefix #1382 +- [e08ce8f6](https://github.com/stashed/stash/commit/e08ce8f6) Use `stash-trigger` as backup triggering CronJob name prefix +- [5027ae41](https://github.com/stashed/stash/commit/5027ae41) Use official restic v0.12.1 (#1381) +- [f23d8f42](https://github.com/stashed/stash/commit/f23d8f42) Update repository config (#1379) +- [0348419d](https://github.com/stashed/stash/commit/0348419d) Update dependencies (#1378) +- [0f6400d5](https://github.com/stashed/stash/commit/0f6400d5) Update repository config (#1375) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2021.11.24.md b/content/docs/v2024.12.18/CHANGELOG-v2021.11.24.md new file mode 100644 index 0000000000..0a084bedb8 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2021.11.24.md @@ -0,0 +1,515 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2021.11.24 + name: Changelog-v2021.11.24 + parent: welcome + weight: 20211124 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2021.11.24/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2021.11.24/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2021.11.24 (2021-11-24) + + +## [appscode/stash-enterprise](https://github.com/appscode/stash-enterprise) + +### [v0.17.0](https://github.com/appscode/stash-enterprise/releases/tag/v0.17.0) + +- [85b094e2](https://github.com/appscode/stash-enterprise/commit/85b094e2) Prepare for release v0.17.0 (#135) +- [d1a1d9ae](https://github.com/appscode/stash-enterprise/commit/d1a1d9ae) Fix SiteInfo publishing (#134) +- [c2a4af81](https://github.com/appscode/stash-enterprise/commit/c2a4af81) Update license verifier (#132) +- [d14efa79](https://github.com/appscode/stash-enterprise/commit/d14efa79) Update license header +- [402386a8](https://github.com/appscode/stash-enterprise/commit/402386a8) Remove Google Analytics (#131) +- [4e9d2787](https://github.com/appscode/stash-enterprise/commit/4e9d2787) Update repository config (#130) +- [0a8bd900](https://github.com/appscode/stash-enterprise/commit/0a8bd900) Update dependencies (#129) +- [ec75311b](https://github.com/appscode/stash-enterprise/commit/ec75311b) Fix satori/go.uuid security vulnerability (#128) +- [66e31a4d](https://github.com/appscode/stash-enterprise/commit/66e31a4d) Apply all the pod level runtime settings to the CronJob +- [ce457efc](https://github.com/appscode/stash-enterprise/commit/ce457efc) Apply all the pod level runtime settings to the CronJob + + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.17.0](https://github.com/stashed/apimachinery/releases/tag/v0.17.0) + +- [dce6be25](https://github.com/stashed/apimachinery/commit/dce6be25) Update dependencies (#133) +- [dcf13de6](https://github.com/stashed/apimachinery/commit/dcf13de6) Update Makefile for controller-tools@v0.7.0 +- [82122921](https://github.com/stashed/apimachinery/commit/82122921) Update repository config (#132) +- [30fa542d](https://github.com/stashed/apimachinery/commit/30fa542d) Update dependencies (#131) +- [026be21a](https://github.com/stashed/apimachinery/commit/026be21a) Fix satori/go.uuid security vulnerability (#130) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.17.0](https://github.com/stashed/cli/releases/tag/v0.17.0) + +- [7060e6f](https://github.com/stashed/cli/commit/7060e6f) Prepare for release v0.17.0 (#147) +- [de80418](https://github.com/stashed/cli/commit/de80418) Update dependencies (#146) +- [ed6657a](https://github.com/stashed/cli/commit/ed6657a) Remove Google Analytics (#145) +- [f2c9aa4](https://github.com/stashed/cli/commit/f2c9aa4) Update dependencies (#144) +- [a1fcc30](https://github.com/stashed/cli/commit/a1fcc30) Fix satori/go.uuid security vulnerability (#143) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v14](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v14) + +- [0e144118](https://github.com/stashed/elasticsearch/commit/0e144118) Prepare for release 5.6.4-v14 (#1059) +- [ab859dbf](https://github.com/stashed/elasticsearch/commit/ab859dbf) [cherry-pick] Fix SiteInfo publishing (#1049) (#1050) +- [9379b2b1](https://github.com/stashed/elasticsearch/commit/9379b2b1) [cherry-pick] Update dependencies (#1040) (#1041) +- [3ee7e34c](https://github.com/stashed/elasticsearch/commit/3ee7e34c) [cherry-pick] Remove Google Analytics (#1031) (#1032) +- [9fc75414](https://github.com/stashed/elasticsearch/commit/9fc75414) [cherry-pick] Update dependencies (#1021) (#1022) +- [6aad03dd](https://github.com/stashed/elasticsearch/commit/6aad03dd) [cherry-pick] Fix satori/go.uuid security vulnerability (#1017) (#1018) + + +### [6.2.4-v14](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v14) + +- [5ba72d61](https://github.com/stashed/elasticsearch/commit/5ba72d61) Prepare for release 6.2.4-v14 (#1060) +- [b9d05541](https://github.com/stashed/elasticsearch/commit/b9d05541) [cherry-pick] Fix SiteInfo publishing (#1049) (#1051) +- [e6d3eae2](https://github.com/stashed/elasticsearch/commit/e6d3eae2) [cherry-pick] Update dependencies (#1040) (#1042) +- [c8a14048](https://github.com/stashed/elasticsearch/commit/c8a14048) [cherry-pick] Remove Google Analytics (#1031) (#1033) +- [3d05b804](https://github.com/stashed/elasticsearch/commit/3d05b804) Update dependencies (#1021) (#1023) +- [e7e8c52a](https://github.com/stashed/elasticsearch/commit/e7e8c52a) [cherry-pick] Fix satori/go.uuid security vulnerability (#1017) (#1019) + + +### [6.3.0-v14](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v14) + +- [d4201b7e](https://github.com/stashed/elasticsearch/commit/d4201b7e) Prepare for release 6.3.0-v14 (#1061) +- [0b729a37](https://github.com/stashed/elasticsearch/commit/0b729a37) [cherry-pick] Fix SiteInfo publishing (#1049) (#1052) +- [5ce16921](https://github.com/stashed/elasticsearch/commit/5ce16921) [cherry-pick] Remove Google Analytics (#1031) (#1034) +- [49a75d1d](https://github.com/stashed/elasticsearch/commit/49a75d1d) Update dependencies (#1021) (#1024) +- [546aa0c5](https://github.com/stashed/elasticsearch/commit/546aa0c5) [cherry-pick] Fix satori/go.uuid security vulnerability (#1017) (#1020) + + +### [6.4.0-v14](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v14) + +- [7d7da202](https://github.com/stashed/elasticsearch/commit/7d7da202) Prepare for release 6.4.0-v14 (#1062) +- [50e2e801](https://github.com/stashed/elasticsearch/commit/50e2e801) [cherry-pick] Fix SiteInfo publishing (#1049) (#1053) +- [48209723](https://github.com/stashed/elasticsearch/commit/48209723) [cherry-pick] Update dependencies (#1040) (#1043) +- [dae6bf84](https://github.com/stashed/elasticsearch/commit/dae6bf84) [cherry-pick] Remove Google Analytics (#1031) (#1035) +- [4aaab48e](https://github.com/stashed/elasticsearch/commit/4aaab48e) Update dependencies (#1021) (#1025) + + +### [6.5.3-v14](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v14) + +- [35ef5d49](https://github.com/stashed/elasticsearch/commit/35ef5d49) Prepare for release 6.5.3-v14 (#1063) +- [d8a4c476](https://github.com/stashed/elasticsearch/commit/d8a4c476) [cherry-pick] Fix SiteInfo publishing (#1049) (#1054) +- [9512b200](https://github.com/stashed/elasticsearch/commit/9512b200) [cherry-pick] Update dependencies (#1040) (#1044) +- [3d3d0783](https://github.com/stashed/elasticsearch/commit/3d3d0783) [cherry-pick] Remove Google Analytics (#1031) (#1036) +- [5d45c1c6](https://github.com/stashed/elasticsearch/commit/5d45c1c6) Update dependencies (#1021) (#1026) + + +### [6.8.0-v14](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v14) + +- [c253b5d2](https://github.com/stashed/elasticsearch/commit/c253b5d2) Prepare for release 6.8.0-v14 (#1064) +- [716e21ec](https://github.com/stashed/elasticsearch/commit/716e21ec) [cherry-pick] Fix SiteInfo publishing (#1049) (#1055) +- [4bc83924](https://github.com/stashed/elasticsearch/commit/4bc83924) [cherry-pick] Update dependencies (#1040) (#1045) +- [97e40f8d](https://github.com/stashed/elasticsearch/commit/97e40f8d) [cherry-pick] Remove Google Analytics (#1031) (#1037) +- [1a764e16](https://github.com/stashed/elasticsearch/commit/1a764e16) [cherry-pick] Update dependencies (#1021) (#1027) + + +### [7.2.0-v14](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v14) + +- [7ddc15df](https://github.com/stashed/elasticsearch/commit/7ddc15df) Prepare for release 7.2.0-v14 (#1066) +- [8b83e76f](https://github.com/stashed/elasticsearch/commit/8b83e76f) Fix SiteInfo publishing (#1049) (#1057) +- [295c2092](https://github.com/stashed/elasticsearch/commit/295c2092) [cherry-pick] Update dependencies (#1040) (#1047) +- [0efd2e29](https://github.com/stashed/elasticsearch/commit/0efd2e29) [cherry-pick] Remove Google Analytics (#1031) (#1038) +- [199bd4da](https://github.com/stashed/elasticsearch/commit/199bd4da) [cherry-pick] Update dependencies (#1021) (#1028) + + +### [7.3.2-v14](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v14) + +- [3e524ee1](https://github.com/stashed/elasticsearch/commit/3e524ee1) [cherry-pick] Fix SiteInfo publishing (#1049) (#1056) +- [b052040a](https://github.com/stashed/elasticsearch/commit/b052040a) [cherry-pick] Update dependencies (#1040) (#1048) +- [42ca2c7a](https://github.com/stashed/elasticsearch/commit/42ca2c7a) [cherry-pick] Remove Google Analytics (#1031) (#1039) +- [efd3d876](https://github.com/stashed/elasticsearch/commit/efd3d876) [cherry-pick] Update dependencies (#1021) (#1029) + + +### [7.14.0](https://github.com/stashed/elasticsearch/releases/tag/7.14.0) + + + + +## [stashed/etcd](https://github.com/stashed/etcd) + +### [3.5.0-v1](https://github.com/stashed/etcd/releases/tag/3.5.0-v1) + +- [b9ce791](https://github.com/stashed/etcd/commit/b9ce791) Prepare for release 3.5.0-v1 (#18) +- [fbaaa64](https://github.com/stashed/etcd/commit/fbaaa64) [cherry-pick] Fix SiteInfo publishing (#16) (#17) +- [38d8c50](https://github.com/stashed/etcd/commit/38d8c50) [cherry-pick] Update dependencies (#14) (#15) +- [450272c](https://github.com/stashed/etcd/commit/450272c) [cherry-pick] Remove Google Analytics (#12) (#13) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2021.11.24](https://github.com/stashed/installer/releases/tag/v2021.11.24) + +- [4dd8553](https://github.com/stashed/installer/commit/4dd8553) Prepare for release v2021.11.24 (#217) +- [e1f85c4](https://github.com/stashed/installer/commit/e1f85c4) Update dependencies (#216) +- [d35bb37](https://github.com/stashed/installer/commit/d35bb37) Remove Google Analytics (#215) +- [bcbb9ea](https://github.com/stashed/installer/commit/bcbb9ea) Add support for Elasticsearch 7.14.0 (#214) +- [f31eaaf](https://github.com/stashed/installer/commit/f31eaaf) Update Makefile for controller-tools@v0.7.0 +- [6f10ba7](https://github.com/stashed/installer/commit/6f10ba7) Update repository config (#213) +- [7d86750](https://github.com/stashed/installer/commit/7d86750) Update dependencies (#212) +- [d957af5](https://github.com/stashed/installer/commit/d957af5) Fix satori/go.uuid security vulnerability (#211) + + + +## [stashed/mariadb](https://github.com/stashed/mariadb) + +### [10.5.8-v7](https://github.com/stashed/mariadb/releases/tag/10.5.8-v7) + +- [c31170b](https://github.com/stashed/mariadb/commit/c31170b) Prepare for release 10.5.8-v7 (#159) +- [c428c5a](https://github.com/stashed/mariadb/commit/c428c5a) [cherry-pick] Fix SiteInfo publishing (#157) (#158) +- [fb9ea57](https://github.com/stashed/mariadb/commit/fb9ea57) [cherry-pick] Update dependencies (#155) (#156) +- [16bb2df](https://github.com/stashed/mariadb/commit/16bb2df) [cherry-pick] Remove Google Analytics (#153) (#154) +- [263083f](https://github.com/stashed/mariadb/commit/263083f) [cherry-pick] Update dependencies (#151) (#152) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v13](https://github.com/stashed/mongodb/releases/tag/3.4.17-v13) + +- [bebf0289](https://github.com/stashed/mongodb/commit/bebf0289) Prepare for release 3.4.17-v13 (#1337) +- [c3be77d2](https://github.com/stashed/mongodb/commit/c3be77d2) [cherry-pick] Fix SiteInfo publishing (#1323) (#1324) +- [2b1d2af8](https://github.com/stashed/mongodb/commit/2b1d2af8) [cherry-pick] Update dependencies (#1310) (#1311) +- [af5f4646](https://github.com/stashed/mongodb/commit/af5f4646) [cherry-pick] Remove Google Analytics (#1296) (#1297) +- [4092dd65](https://github.com/stashed/mongodb/commit/4092dd65) [cherry-pick] Update dependencies (#1282) (#1283) +- [4a607d83](https://github.com/stashed/mongodb/commit/4a607d83) [cherry-pick] Fix satori/go.uuid security vulnerability (#1278) (#1279) + + +### [3.4.22-v13](https://github.com/stashed/mongodb/releases/tag/3.4.22-v13) + +- [57a441dd](https://github.com/stashed/mongodb/commit/57a441dd) Prepare for release 3.4.22-v13 (#1338) +- [f2ecc5b2](https://github.com/stashed/mongodb/commit/f2ecc5b2) [cherry-pick] Fix SiteInfo publishing (#1323) (#1325) +- [e252351d](https://github.com/stashed/mongodb/commit/e252351d) [cherry-pick] Update dependencies (#1310) (#1312) +- [8b24f555](https://github.com/stashed/mongodb/commit/8b24f555) [cherry-pick] Remove Google Analytics (#1296) (#1298) +- [919b8342](https://github.com/stashed/mongodb/commit/919b8342) [cherry-pick] Update dependencies (#1282) (#1284) +- [712b63d5](https://github.com/stashed/mongodb/commit/712b63d5) [cherry-pick] Fix satori/go.uuid security vulnerability (#1278) (#1280) + + +### [3.6.8-v13](https://github.com/stashed/mongodb/releases/tag/3.6.8-v13) + +- [46bb9249](https://github.com/stashed/mongodb/commit/46bb9249) Prepare for release 3.6.8-v13 (#1340) +- [d57604e8](https://github.com/stashed/mongodb/commit/d57604e8) [cherry-pick] Fix SiteInfo publishing (#1323) (#1327) +- [db3a4260](https://github.com/stashed/mongodb/commit/db3a4260) [cherry-pick] Update dependencies (#1310) (#1314) +- [5d46225e](https://github.com/stashed/mongodb/commit/5d46225e) [cherry-pick] Remove Google Analytics (#1296) (#1300) +- [ab7f7d38](https://github.com/stashed/mongodb/commit/ab7f7d38) [cherry-pick] Update dependencies (#1282) (#1286) + + +### [3.6.13-v13](https://github.com/stashed/mongodb/releases/tag/3.6.13-v13) + +- [1b56e134](https://github.com/stashed/mongodb/commit/1b56e134) Prepare for release 3.6.13-v13 (#1339) +- [610c36e4](https://github.com/stashed/mongodb/commit/610c36e4) [cherry-pick] Fix SiteInfo publishing (#1323) (#1326) +- [59231f32](https://github.com/stashed/mongodb/commit/59231f32) [cherry-pick] Update dependencies (#1310) (#1313) +- [b3a2048e](https://github.com/stashed/mongodb/commit/b3a2048e) [cherry-pick] Remove Google Analytics (#1296) (#1299) +- [9b4f53bc](https://github.com/stashed/mongodb/commit/9b4f53bc) [cherry-pick] Update dependencies (#1282) (#1285) +- [76c701a1](https://github.com/stashed/mongodb/commit/76c701a1) [cherry-pick] Fix satori/go.uuid security vulnerability (#1278) (#1281) + + +### [4.0.3-v13](https://github.com/stashed/mongodb/releases/tag/4.0.3-v13) + +- [5c1bde68](https://github.com/stashed/mongodb/commit/5c1bde68) Prepare for release 4.0.3-v13 (#1342) +- [2de0c6c3](https://github.com/stashed/mongodb/commit/2de0c6c3) [cherry-pick] Fix SiteInfo publishing (#1323) (#1328) +- [88ce93c2](https://github.com/stashed/mongodb/commit/88ce93c2) [cherry-pick] Update dependencies (#1310) (#1315) +- [836f5dc0](https://github.com/stashed/mongodb/commit/836f5dc0) [cherry-pick] Remove Google Analytics (#1296) (#1302) +- [721fcf81](https://github.com/stashed/mongodb/commit/721fcf81) [cherry-pick] Update dependencies (#1282) (#1288) + + +### [4.0.5-v13](https://github.com/stashed/mongodb/releases/tag/4.0.5-v13) + +- [db7f658c](https://github.com/stashed/mongodb/commit/db7f658c) Prepare for release 4.0.5-v13 (#1343) +- [403f30c5](https://github.com/stashed/mongodb/commit/403f30c5) [cherry-pick] Fix SiteInfo publishing (#1323) (#1329) +- [2514268e](https://github.com/stashed/mongodb/commit/2514268e) [cherry-pick] Update dependencies (#1310) (#1316) +- [fdeb0ff2](https://github.com/stashed/mongodb/commit/fdeb0ff2) [cherry-pick] Remove Google Analytics (#1296) (#1303) +- [dfc34ecc](https://github.com/stashed/mongodb/commit/dfc34ecc) [cherry-pick] Update dependencies (#1282) (#1289) + + +### [4.0.11-v13](https://github.com/stashed/mongodb/releases/tag/4.0.11-v13) + +- [9e7ba040](https://github.com/stashed/mongodb/commit/9e7ba040) Prepare for release 4.0.11-v13 (#1341) +- [16ca1fa2](https://github.com/stashed/mongodb/commit/16ca1fa2) Fix SiteInfo publishing (#1323) (#1336) +- [f65fdb46](https://github.com/stashed/mongodb/commit/f65fdb46) [cherry-pick] Remove Google Analytics (#1296) (#1301) +- [af34b99f](https://github.com/stashed/mongodb/commit/af34b99f) [cherry-pick] Update dependencies (#1282) (#1287) + + +### [4.1.4-v13](https://github.com/stashed/mongodb/releases/tag/4.1.4-v13) + +- [7ae5a2ad](https://github.com/stashed/mongodb/commit/7ae5a2ad) Prepare for release 4.1.4-v13 (#1345) +- [1fbfdc18](https://github.com/stashed/mongodb/commit/1fbfdc18) [cherry-pick] Fix SiteInfo publishing (#1323) (#1331) +- [3e4c83b4](https://github.com/stashed/mongodb/commit/3e4c83b4) [cherry-pick] Update dependencies (#1310) (#1318) +- [556bfba7](https://github.com/stashed/mongodb/commit/556bfba7) [cherry-pick] Remove Google Analytics (#1296) (#1305) +- [45a4763d](https://github.com/stashed/mongodb/commit/45a4763d) [cherry-pick] Update dependencies (#1282) (#1291) + + +### [4.1.7-v13](https://github.com/stashed/mongodb/releases/tag/4.1.7-v13) + +- [d6a8db2d](https://github.com/stashed/mongodb/commit/d6a8db2d) Prepare for release 4.1.7-v13 (#1346) +- [4778b673](https://github.com/stashed/mongodb/commit/4778b673) [cherry-pick] Fix SiteInfo publishing (#1323) (#1332) +- [309254e4](https://github.com/stashed/mongodb/commit/309254e4) [cherry-pick] Update dependencies (#1310) (#1319) +- [b5023e73](https://github.com/stashed/mongodb/commit/b5023e73) [cherry-pick] Remove Google Analytics (#1296) (#1306) +- [97ae840f](https://github.com/stashed/mongodb/commit/97ae840f) [cherry-pick] Update dependencies (#1282) (#1292) + + +### [4.1.13-v13](https://github.com/stashed/mongodb/releases/tag/4.1.13-v13) + +- [23386af7](https://github.com/stashed/mongodb/commit/23386af7) Prepare for release 4.1.13-v13 (#1344) +- [3d729113](https://github.com/stashed/mongodb/commit/3d729113) [cherry-pick] Fix SiteInfo publishing (#1323) (#1330) +- [64d99f5e](https://github.com/stashed/mongodb/commit/64d99f5e) [cherry-pick] Update dependencies (#1310) (#1317) +- [75f44f15](https://github.com/stashed/mongodb/commit/75f44f15) [cherry-pick] Remove Google Analytics (#1296) (#1304) +- [e0f1430a](https://github.com/stashed/mongodb/commit/e0f1430a) [cherry-pick] Update dependencies (#1282) (#1290) + + +### [4.2.3-v13](https://github.com/stashed/mongodb/releases/tag/4.2.3-v13) + +- [b939c08e](https://github.com/stashed/mongodb/commit/b939c08e) [cherry-pick] Fix SiteInfo publishing (#1323) (#1333) +- [90919d62](https://github.com/stashed/mongodb/commit/90919d62) [cherry-pick] Update dependencies (#1310) (#1320) +- [71bf43c6](https://github.com/stashed/mongodb/commit/71bf43c6) [cherry-pick] Remove Google Analytics (#1296) (#1307) +- [2de25d86](https://github.com/stashed/mongodb/commit/2de25d86) [cherry-pick] Update dependencies (#1282) (#1293) + + +### [4.4.6-v4](https://github.com/stashed/mongodb/releases/tag/4.4.6-v4) + +- [6659f5bc](https://github.com/stashed/mongodb/commit/6659f5bc) [cherry-pick] Fix SiteInfo publishing (#1323) (#1334) +- [b3ad89fd](https://github.com/stashed/mongodb/commit/b3ad89fd) [cherry-pick] Update dependencies (#1310) (#1321) +- [a6744d43](https://github.com/stashed/mongodb/commit/a6744d43) [cherry-pick] Remove Google Analytics (#1296) (#1308) +- [8ef2690c](https://github.com/stashed/mongodb/commit/8ef2690c) [cherry-pick] Update dependencies (#1282) (#1294) +- [a138a55c](https://github.com/stashed/mongodb/commit/a138a55c) Prepare for release 4.4.6-v3 (#1275) + + +### [5.0.3-v1](https://github.com/stashed/mongodb/releases/tag/5.0.3-v1) + +- [362d74c5](https://github.com/stashed/mongodb/commit/362d74c5) [cherry-pick] Fix SiteInfo publishing (#1323) (#1335) +- [7243d8e6](https://github.com/stashed/mongodb/commit/7243d8e6) [cherry-pick] Update dependencies (#1310) (#1322) +- [232ecd8c](https://github.com/stashed/mongodb/commit/232ecd8c) [cherry-pick] Remove Google Analytics (#1296) (#1309) +- [dca0617b](https://github.com/stashed/mongodb/commit/dca0617b) [cherry-pick] Update dependencies (#1282) (#1295) +- [7fb75a3a](https://github.com/stashed/mongodb/commit/7fb75a3a) Prepare for release 5.0.3 (#1276) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v14](https://github.com/stashed/mysql/releases/tag/5.7.25-v14) + +- [264b3f89](https://github.com/stashed/mysql/commit/264b3f89) Prepare for release 5.7.25-v14 (#554) +- [c711f471](https://github.com/stashed/mysql/commit/c711f471) [cherry-pick] Fix SiteInfo publishing (#549) (#550) +- [5a5dca7d](https://github.com/stashed/mysql/commit/5a5dca7d) [cherry-pick] Update dependencies (#544) (#545) +- [3f7d49ec](https://github.com/stashed/mysql/commit/3f7d49ec) [cherry-pick] Remove Google Analytics (#539) (#540) +- [45e25c49](https://github.com/stashed/mysql/commit/45e25c49) [cherry-pick] Update dependencies (#534) (#535) + + +### [8.0.3-v14](https://github.com/stashed/mysql/releases/tag/8.0.3-v14) + +- [3cea90bb](https://github.com/stashed/mysql/commit/3cea90bb) Prepare for release 8.0.3-v14 (#557) +- [680c3392](https://github.com/stashed/mysql/commit/680c3392) Fix SiteInfo publishing (#549) (#553) +- [7c7e3048](https://github.com/stashed/mysql/commit/7c7e3048) [cherry-pick] Update dependencies (#544) (#548) +- [d4de462d](https://github.com/stashed/mysql/commit/d4de462d) [cherry-pick] Remove Google Analytics (#539) (#543) +- [cb20e05d](https://github.com/stashed/mysql/commit/cb20e05d) [cherry-pick] Update dependencies (#534) (#538) + + +### [8.0.14-v14](https://github.com/stashed/mysql/releases/tag/8.0.14-v14) + +- [9364b2bf](https://github.com/stashed/mysql/commit/9364b2bf) Prepare for release 8.0.14-v14 (#555) +- [9c30475f](https://github.com/stashed/mysql/commit/9c30475f) [cherry-pick] Fix SiteInfo publishing (#549) (#551) +- [ca2762a4](https://github.com/stashed/mysql/commit/ca2762a4) [cherry-pick] Update dependencies (#544) (#546) +- [77358f6e](https://github.com/stashed/mysql/commit/77358f6e) [cherry-pick] Remove Google Analytics (#539) (#541) +- [fcc79b69](https://github.com/stashed/mysql/commit/fcc79b69) [cherry-pick] Update dependencies (#534) (#536) + + +### [8.0.21-v8](https://github.com/stashed/mysql/releases/tag/8.0.21-v8) + +- [494bf1ba](https://github.com/stashed/mysql/commit/494bf1ba) Prepare for release 8.0.21-v8 (#556) +- [7cede8cb](https://github.com/stashed/mysql/commit/7cede8cb) [cherry-pick] Fix SiteInfo publishing (#549) (#552) +- [712512d6](https://github.com/stashed/mysql/commit/712512d6) [cherry-pick] Update dependencies (#544) (#547) +- [3b2abd07](https://github.com/stashed/mysql/commit/3b2abd07) [cherry-pick] Remove Google Analytics (#539) (#542) +- [b672201c](https://github.com/stashed/mysql/commit/b672201c) [cherry-pick] Update dependencies (#534) (#537) + + + +## [stashed/nats](https://github.com/stashed/nats) + +### [2.6.1-v1](https://github.com/stashed/nats/releases/tag/2.6.1-v1) + +- [f806fbb](https://github.com/stashed/nats/commit/f806fbb) Prepare for release 2.6.1-v1 (#19) +- [b78d2bb](https://github.com/stashed/nats/commit/b78d2bb) [cherry-pick] Fix SiteInfo publishing (#17) (#18) +- [fe9d006](https://github.com/stashed/nats/commit/fe9d006) [cherry-pick] Update dependencies (#15) (#16) +- [7c794b4](https://github.com/stashed/nats/commit/7c794b4) [cherry-pick] Remove Google Analytics (#13) (#14) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-v9](https://github.com/stashed/percona-xtradb/releases/tag/5.7-v9) + +- [72372b84](https://github.com/stashed/percona-xtradb/commit/72372b84) Prepare for release 5.7-v9 (#230) +- [b70396c7](https://github.com/stashed/percona-xtradb/commit/b70396c7) [cherry-pick] Fix SiteInfo publishing (#228) (#229) +- [ee91a0a4](https://github.com/stashed/percona-xtradb/commit/ee91a0a4) [cherry-pick] Update dependencies (#226) (#227) +- [010bc77e](https://github.com/stashed/percona-xtradb/commit/010bc77e) [cherry-pick] Remove Google Analytics (#224) (#225) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v12](https://github.com/stashed/postgres/releases/tag/9.6.19-v12) + +- [42c89586](https://github.com/stashed/postgres/commit/42c89586) Prepare for release 9.6.19-v12 (#964) +- [b7deaf65](https://github.com/stashed/postgres/commit/b7deaf65) [cherry-pick] Fix SiteInfo publishing (#952) (#956) +- [45fd4b54](https://github.com/stashed/postgres/commit/45fd4b54) [cherry-pick] Update dependencies (#945) (#951) +- [6b0eed64](https://github.com/stashed/postgres/commit/6b0eed64) [cherry-pick] Remove Google Analytics (#938) (#944) + + +### [10.14-v12](https://github.com/stashed/postgres/releases/tag/10.14-v12) + +- [ebdef975](https://github.com/stashed/postgres/commit/ebdef975) Prepare for release 10.14-v12 (#959) +- [3c4118cf](https://github.com/stashed/postgres/commit/3c4118cf) [cherry-pick] Fix SiteInfo publishing (#952) (#953) +- [e0c893c6](https://github.com/stashed/postgres/commit/e0c893c6) [cherry-pick] Update dependencies (#945) (#946) +- [5a773cde](https://github.com/stashed/postgres/commit/5a773cde) [cherry-pick] Remove Google Analytics (#938) (#939) + + +### [11.9-v12](https://github.com/stashed/postgres/releases/tag/11.9-v12) + +- [c98dd3fa](https://github.com/stashed/postgres/commit/c98dd3fa) Prepare for release 11.9-v12 (#960) +- [323002ba](https://github.com/stashed/postgres/commit/323002ba) [cherry-pick] Fix SiteInfo publishing (#952) (#954) +- [07b87ef8](https://github.com/stashed/postgres/commit/07b87ef8) [cherry-pick] Update dependencies (#945) (#947) +- [f7e632c1](https://github.com/stashed/postgres/commit/f7e632c1) [cherry-pick] Remove Google Analytics (#938) (#940) + + +### [12.4-v12](https://github.com/stashed/postgres/releases/tag/12.4-v12) + +- [8bfeb538](https://github.com/stashed/postgres/commit/8bfeb538) Prepare for release 12.4-v12 (#961) +- [7ab310cb](https://github.com/stashed/postgres/commit/7ab310cb) Fix SiteInfo publishing (#952) (#957) +- [dd32b9eb](https://github.com/stashed/postgres/commit/dd32b9eb) [cherry-pick] Update dependencies (#945) (#948) +- [4004b647](https://github.com/stashed/postgres/commit/4004b647) [cherry-pick] Remove Google Analytics (#938) (#941) + + +### [13.1-v9](https://github.com/stashed/postgres/releases/tag/13.1-v9) + +- [b2ab0cec](https://github.com/stashed/postgres/commit/b2ab0cec) Prepare for release 13.1-v9 (#962) +- [a912d10f](https://github.com/stashed/postgres/commit/a912d10f) Fix SiteInfo publishing (#952) (#958) +- [6dbbfce1](https://github.com/stashed/postgres/commit/6dbbfce1) [cherry-pick] Update dependencies (#945) (#949) +- [5f8ea3d8](https://github.com/stashed/postgres/commit/5f8ea3d8) [cherry-pick] Remove Google Analytics (#938) (#942) + + +### [14.0-v1](https://github.com/stashed/postgres/releases/tag/14.0-v1) + +- [94c0d679](https://github.com/stashed/postgres/commit/94c0d679) Prepare for release 14.0-v1 (#963) +- [ced1f471](https://github.com/stashed/postgres/commit/ced1f471) [cherry-pick] Fix SiteInfo publishing (#952) (#955) +- [aba33b34](https://github.com/stashed/postgres/commit/aba33b34) [cherry-pick] Update dependencies (#945) (#950) +- [f5f2db00](https://github.com/stashed/postgres/commit/f5f2db00) [cherry-pick] Remove Google Analytics (#938) (#943) + + + +## [stashed/redis](https://github.com/stashed/redis) + +### [5.0.13-v2](https://github.com/stashed/redis/releases/tag/5.0.13-v2) + +- [9191462](https://github.com/stashed/redis/commit/9191462) Prepare for release 5.0.13-v2 (#67) +- [d1be27a](https://github.com/stashed/redis/commit/d1be27a) [cherry-pick] Fix SiteInfo publishing (#64) (#65) +- [c529e8d](https://github.com/stashed/redis/commit/c529e8d) [cherry-pick] Update dependencies (#61) (#62) +- [759c04e](https://github.com/stashed/redis/commit/759c04e) [cherry-pick] Remove Google Analytics (#58) (#59) +- [e563da6](https://github.com/stashed/redis/commit/e563da6) [cherry-pick] Fix satori/go.uuid security vulnerability (#55) (#56) + + +### [6.2.5-v2](https://github.com/stashed/redis/releases/tag/6.2.5-v2) + +- [a27b1fb](https://github.com/stashed/redis/commit/a27b1fb) Prepare for release 6.2.5-v2 (#68) +- [88133a9](https://github.com/stashed/redis/commit/88133a9) [cherry-pick] Fix SiteInfo publishing (#64) (#66) +- [e346fc8](https://github.com/stashed/redis/commit/e346fc8) [cherry-pick] Update dependencies (#61) (#63) +- [5895da7](https://github.com/stashed/redis/commit/5895da7) [cherry-pick] Remove Google Analytics (#58) (#60) +- [7f3dfff](https://github.com/stashed/redis/commit/7f3dfff) [cherry-pick] Fix satori/go.uuid security vulnerability (#55) (#57) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.17.0](https://github.com/stashed/stash/releases/tag/v0.17.0) + +- [56eeabab](https://github.com/stashed/stash/commit/56eeabab) Prepare for release v0.17.0 (#1403) +- [57fea237](https://github.com/stashed/stash/commit/57fea237) Fix SiteInfo publishing (#1402) +- [a3acd499](https://github.com/stashed/stash/commit/a3acd499) Update dependencies (#1401) +- [f06740a2](https://github.com/stashed/stash/commit/f06740a2) Update license verifier (#1400) +- [ff417d95](https://github.com/stashed/stash/commit/ff417d95) Remove Google Analytics (#1399) +- [4e24ba6a](https://github.com/stashed/stash/commit/4e24ba6a) Update repository config (#1398) +- [514e79b9](https://github.com/stashed/stash/commit/514e79b9) Fix satori/go.uuid security vulnerability (#1397) +- [a5b7398d](https://github.com/stashed/stash/commit/a5b7398d) Apply all pod level runtime settings to CronJob (#1396) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2021.6.18.md b/content/docs/v2024.12.18/CHANGELOG-v2021.6.18.md new file mode 100644 index 0000000000..5bda256fcf --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2021.6.18.md @@ -0,0 +1,456 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2021.6.18 + name: Changelog-v2021.6.18 + parent: welcome + weight: 20210618 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2021.6.18/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2021.6.18/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2021.6.18 (2021-06-16) + + +## [appscode/stash-enterprise](https://github.com/appscode/stash-enterprise) + +### [v0.14.0](https://github.com/appscode/stash-enterprise/releases/tag/v0.14.0) + +- [6d2613e7](https://github.com/appscode/stash-enterprise/commit/6d2613e7) Prepare for release v0.14.0 (#100) +- [f8afa76d](https://github.com/appscode/stash-enterprise/commit/f8afa76d) Send audit events when analytics are enabled (#99) +- [cdb3b3fe](https://github.com/appscode/stash-enterprise/commit/cdb3b3fe) Fix operator crash + E2E tests (#98) +- [4288f0c2](https://github.com/appscode/stash-enterprise/commit/4288f0c2) Use namespace when looking up running BackupSessions for Invoker (#97) +- [64c7d7c9](https://github.com/appscode/stash-enterprise/commit/64c7d7c9) Create auditor if license file is provided (#96) +- [5e193ea9](https://github.com/appscode/stash-enterprise/commit/5e193ea9) Disable api priortiy and fairness feature for webhook server (#95) +- [b4fcc0b6](https://github.com/appscode/stash-enterprise/commit/b4fcc0b6) Publish audit events (#94) +- [d785fec3](https://github.com/appscode/stash-enterprise/commit/d785fec3) Use klog/v2 (#93) +- [324e9aa4](https://github.com/appscode/stash-enterprise/commit/324e9aa4) Use kglog helper +- [8b4c6fd6](https://github.com/appscode/stash-enterprise/commit/8b4c6fd6) Update Kubernetes toolchain to v1.21.0 (#92) + + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.14.0](https://github.com/stashed/apimachinery/releases/tag/v0.14.0) + +- [a382bbe2](https://github.com/stashed/apimachinery/commit/a382bbe2) Fix build +- [0d9f6eec](https://github.com/stashed/apimachinery/commit/0d9f6eec) Update dependencies (#101) +- [6abdb1e2](https://github.com/stashed/apimachinery/commit/6abdb1e2) Replace go-bindata with //go:embed (#100) +- [974fc12c](https://github.com/stashed/apimachinery/commit/974fc12c) Update dependencies +- [ae165464](https://github.com/stashed/apimachinery/commit/ae165464) Fix build +- [15d8c532](https://github.com/stashed/apimachinery/commit/15d8c532) Update dependencies +- [06ac37bd](https://github.com/stashed/apimachinery/commit/06ac37bd) Only depend on klog/v2 +- [79f9a3fe](https://github.com/stashed/apimachinery/commit/79f9a3fe) Use Kubernetes v1.21.0 toolchain (#98) +- [1157edb1](https://github.com/stashed/apimachinery/commit/1157edb1) Cleanup dependencies + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.14.0](https://github.com/stashed/cli/releases/tag/v0.14.0) + +- [ceef781](https://github.com/stashed/cli/commit/ceef781) Prepare for release v0.14.0 (#124) +- [7e1fb45](https://github.com/stashed/cli/commit/7e1fb45) Use klog/v2 (#123) +- [4eee2a0](https://github.com/stashed/cli/commit/4eee2a0) Use kglog helper +- [5de2bb5](https://github.com/stashed/cli/commit/5de2bb5) Use klog/v2 (#122) +- [6a110fc](https://github.com/stashed/cli/commit/6a110fc) Use Kubernetes v1.21.0 toolchain (#121) +- [bea398c](https://github.com/stashed/cli/commit/bea398c) Use Kubernetes v1.21.0 toolchain (#120) +- [8f1a18f](https://github.com/stashed/cli/commit/8f1a18f) Use Kubernetes v1.21.0 toolchain (#119) +- [45b1b13](https://github.com/stashed/cli/commit/45b1b13) Update Kubernetes toolchain to v1.21.0 (#118) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v10](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v10) + +- [00e2fb3b](https://github.com/stashed/elasticsearch/commit/00e2fb3b) Prepare for release 5.6.4-v10 (#819) +- [d3954cad](https://github.com/stashed/elasticsearch/commit/d3954cad) [cherry-pick] Use klog/v2 (#810) (#811) +- [51f5e943](https://github.com/stashed/elasticsearch/commit/51f5e943) [cherry-pick] Use kglog helper (#802) +- [bb125283](https://github.com/stashed/elasticsearch/commit/bb125283) Use k8s 1.21.0 toolchain + + +### [6.2.4-v10](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v10) + +- [6cd15ccb](https://github.com/stashed/elasticsearch/commit/6cd15ccb) Prepare for release 6.2.4-v10 (#820) +- [e6a3e186](https://github.com/stashed/elasticsearch/commit/e6a3e186) [cherry-pick] Use klog/v2 (#810) (#812) +- [d969c43d](https://github.com/stashed/elasticsearch/commit/d969c43d) [cherry-pick] Use kglog helper (#803) +- [b7cc8f39](https://github.com/stashed/elasticsearch/commit/b7cc8f39) Use k8s 1.21.0 toolchain + + +### [6.3.0-v10](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v10) + +- [3368493b](https://github.com/stashed/elasticsearch/commit/3368493b) Prepare for release 6.3.0-v10 (#821) +- [134b13c9](https://github.com/stashed/elasticsearch/commit/134b13c9) [cherry-pick] Use klog/v2 (#810) (#813) +- [0b48f103](https://github.com/stashed/elasticsearch/commit/0b48f103) [cherry-pick] Use kglog helper (#804) +- [ac207bc9](https://github.com/stashed/elasticsearch/commit/ac207bc9) Use k8s 1.21.0 toolchain + + +### [6.4.0-v10](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v10) + +- [fe813d50](https://github.com/stashed/elasticsearch/commit/fe813d50) Prepare for release 6.4.0-v10 (#822) +- [d69452ab](https://github.com/stashed/elasticsearch/commit/d69452ab) [cherry-pick] Use klog/v2 (#810) (#814) +- [74afb891](https://github.com/stashed/elasticsearch/commit/74afb891) [cherry-pick] Use kglog helper (#805) +- [9b94b942](https://github.com/stashed/elasticsearch/commit/9b94b942) Use k8s 1.21.0 toolchain + + +### [6.5.3-v10](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v10) + +- [a101ccaa](https://github.com/stashed/elasticsearch/commit/a101ccaa) Prepare for release 6.5.3-v10 (#823) +- [73230f53](https://github.com/stashed/elasticsearch/commit/73230f53) [cherry-pick] Use klog/v2 (#810) (#815) +- [023a0131](https://github.com/stashed/elasticsearch/commit/023a0131) [cherry-pick] Use kglog helper (#806) +- [a4d28503](https://github.com/stashed/elasticsearch/commit/a4d28503) Use k8s 1.21.0 toolchain + + +### [6.8.0-v10](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v10) + +- [8a683935](https://github.com/stashed/elasticsearch/commit/8a683935) Prepare for release 6.8.0-v10 (#824) +- [db27f0d1](https://github.com/stashed/elasticsearch/commit/db27f0d1) [cherry-pick] Use klog/v2 (#810) (#816) +- [970ef1a1](https://github.com/stashed/elasticsearch/commit/970ef1a1) [cherry-pick] Use kglog helper (#807) +- [e1e24ec7](https://github.com/stashed/elasticsearch/commit/e1e24ec7) Use k8s 1.21.0 toolchain + + +### [7.2.0-v10](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v10) + +- [4eac1ea9](https://github.com/stashed/elasticsearch/commit/4eac1ea9) Prepare for release 7.2.0-v10 (#825) +- [2aa02a10](https://github.com/stashed/elasticsearch/commit/2aa02a10) [cherry-pick] Use klog/v2 (#810) (#817) +- [9dd713c7](https://github.com/stashed/elasticsearch/commit/9dd713c7) [cherry-pick] Use kglog helper (#808) +- [1495f883](https://github.com/stashed/elasticsearch/commit/1495f883) Use k8s 1.21.0 toolchain + + +### [7.3.2-v10](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v10) + +- [2808b0ba](https://github.com/stashed/elasticsearch/commit/2808b0ba) Prepare for release 7.3.2-v10 (#826) +- [478a1f1d](https://github.com/stashed/elasticsearch/commit/478a1f1d) [cherry-pick] Use klog/v2 (#810) (#818) +- [68236dc9](https://github.com/stashed/elasticsearch/commit/68236dc9) [cherry-pick] Use kglog helper (#809) +- [bfab7862](https://github.com/stashed/elasticsearch/commit/bfab7862) Use k8s 1.21.0 toolchain + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2021.6.18](https://github.com/stashed/installer/releases/tag/v2021.6.18) + +- [2082d2d](https://github.com/stashed/installer/commit/2082d2d) Prepare for release v2021.6.18 (#177) +- [1a0fccb](https://github.com/stashed/installer/commit/1a0fccb) Update user-roles for v1beta1 APIs (#176) +- [3334ea0](https://github.com/stashed/installer/commit/3334ea0) Use k8s 1.21.0 toolchain (#175) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v9](https://github.com/stashed/mongodb/releases/tag/3.4.17-v9) + +- [3c439686](https://github.com/stashed/mongodb/commit/3c439686) Prepare for release 3.4.17-v9 (#981) +- [767e3e91](https://github.com/stashed/mongodb/commit/767e3e91) [cherry-pick] Use klog/v2 (#969) (#970) +- [18054cc7](https://github.com/stashed/mongodb/commit/18054cc7) [cherry-pick] Use kglog helper (#958) +- [27c8e858](https://github.com/stashed/mongodb/commit/27c8e858) Use k8s 1.21.0 toolchain + + +### [3.4.22-v9](https://github.com/stashed/mongodb/releases/tag/3.4.22-v9) + +- [d79dd9fa](https://github.com/stashed/mongodb/commit/d79dd9fa) Prepare for release 3.4.22-v9 (#982) +- [5af76acd](https://github.com/stashed/mongodb/commit/5af76acd) [cherry-pick] Use klog/v2 (#969) (#971) +- [07acc184](https://github.com/stashed/mongodb/commit/07acc184) [cherry-pick] Use kglog helper (#959) +- [b1607397](https://github.com/stashed/mongodb/commit/b1607397) Use k8s 1.21.0 toolchain + + +### [3.6.8-v9](https://github.com/stashed/mongodb/releases/tag/3.6.8-v9) + +- [5b8ba177](https://github.com/stashed/mongodb/commit/5b8ba177) Prepare for release 3.6.8-v9 (#984) +- [1c02bbf8](https://github.com/stashed/mongodb/commit/1c02bbf8) [cherry-pick] Use klog/v2 (#969) (#973) +- [c580d161](https://github.com/stashed/mongodb/commit/c580d161) [cherry-pick] Use kglog helper (#961) +- [b13bf55e](https://github.com/stashed/mongodb/commit/b13bf55e) Use k8s 1.21.0 toolchain + + +### [3.6.13-v9](https://github.com/stashed/mongodb/releases/tag/3.6.13-v9) + +- [d947b446](https://github.com/stashed/mongodb/commit/d947b446) Prepare for release 3.6.13-v9 (#983) +- [b2f4a881](https://github.com/stashed/mongodb/commit/b2f4a881) [cherry-pick] Use klog/v2 (#969) (#972) +- [0551d36c](https://github.com/stashed/mongodb/commit/0551d36c) [cherry-pick] Use kglog helper (#960) +- [07d09f0d](https://github.com/stashed/mongodb/commit/07d09f0d) Use k8s 1.21.0 toolchain + + +### [4.0.3-v9](https://github.com/stashed/mongodb/releases/tag/4.0.3-v9) + +- [401bc9aa](https://github.com/stashed/mongodb/commit/401bc9aa) Prepare for release 4.0.3-v9 (#986) +- [fcdd878e](https://github.com/stashed/mongodb/commit/fcdd878e) [cherry-pick] Use klog/v2 (#969) (#975) +- [ab65b810](https://github.com/stashed/mongodb/commit/ab65b810) [cherry-pick] Use kglog helper (#963) +- [184f230e](https://github.com/stashed/mongodb/commit/184f230e) Use k8s 1.21.0 toolchain + + +### [4.0.5-v9](https://github.com/stashed/mongodb/releases/tag/4.0.5-v9) + +- [ae5c3955](https://github.com/stashed/mongodb/commit/ae5c3955) Prepare for release 4.0.5-v9 (#987) +- [09acaf2c](https://github.com/stashed/mongodb/commit/09acaf2c) [cherry-pick] Use klog/v2 (#969) (#976) +- [a9519e31](https://github.com/stashed/mongodb/commit/a9519e31) [cherry-pick] Use kglog helper (#964) +- [e1bf6ac9](https://github.com/stashed/mongodb/commit/e1bf6ac9) Use k8s 1.21.0 toolchain + + +### [4.0.11-v9](https://github.com/stashed/mongodb/releases/tag/4.0.11-v9) + +- [7b685c24](https://github.com/stashed/mongodb/commit/7b685c24) Prepare for release 4.0.11-v9 (#985) +- [7fdf52db](https://github.com/stashed/mongodb/commit/7fdf52db) [cherry-pick] Use klog/v2 (#969) (#974) +- [880ba142](https://github.com/stashed/mongodb/commit/880ba142) [cherry-pick] Use kglog helper (#962) +- [d555bcd5](https://github.com/stashed/mongodb/commit/d555bcd5) Use k8s 1.21.0 toolchain + + +### [4.1.4-v9](https://github.com/stashed/mongodb/releases/tag/4.1.4-v9) + +- [6e674543](https://github.com/stashed/mongodb/commit/6e674543) Prepare for release 4.1.4-v9 (#989) +- [84241d32](https://github.com/stashed/mongodb/commit/84241d32) [cherry-pick] Use klog/v2 (#969) (#978) +- [795b28db](https://github.com/stashed/mongodb/commit/795b28db) [cherry-pick] Use kglog helper (#966) +- [784b8616](https://github.com/stashed/mongodb/commit/784b8616) Use k8s 1.21.0 toolchain + + +### [4.1.7-v9](https://github.com/stashed/mongodb/releases/tag/4.1.7-v9) + +- [42699cc7](https://github.com/stashed/mongodb/commit/42699cc7) Prepare for release 4.1.7-v9 (#990) +- [8e77beec](https://github.com/stashed/mongodb/commit/8e77beec) [cherry-pick] Use klog/v2 (#969) (#979) +- [6e078f0b](https://github.com/stashed/mongodb/commit/6e078f0b) [cherry-pick] Use kglog helper (#967) +- [ff4a14a3](https://github.com/stashed/mongodb/commit/ff4a14a3) Use k8s 1.21.0 toolchain + + +### [4.1.13-v9](https://github.com/stashed/mongodb/releases/tag/4.1.13-v9) + +- [178750b5](https://github.com/stashed/mongodb/commit/178750b5) Prepare for release 4.1.13-v9 (#988) +- [378f5fb7](https://github.com/stashed/mongodb/commit/378f5fb7) [cherry-pick] Use klog/v2 (#969) (#977) +- [0571b8fd](https://github.com/stashed/mongodb/commit/0571b8fd) [cherry-pick] Use kglog helper (#965) +- [af3b544f](https://github.com/stashed/mongodb/commit/af3b544f) Use k8s 1.21.0 toolchain + + +### [4.2.3-v9](https://github.com/stashed/mongodb/releases/tag/4.2.3-v9) + +- [54bf57ea](https://github.com/stashed/mongodb/commit/54bf57ea) Prepare for release 4.2.3-v9 (#991) +- [f6276ddd](https://github.com/stashed/mongodb/commit/f6276ddd) [cherry-pick] Use klog/v2 (#969) (#980) +- [8ead06e7](https://github.com/stashed/mongodb/commit/8ead06e7) [cherry-pick] Use kglog helper (#968) +- [1be76961](https://github.com/stashed/mongodb/commit/1be76961) Use k8s 1.21.0 toolchain + + +### [4.4.6](https://github.com/stashed/mongodb/releases/tag/4.4.6) + +- [cf1ad82d](https://github.com/stashed/mongodb/commit/cf1ad82d) Stash addon for 4.4.6 + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v10](https://github.com/stashed/mysql/releases/tag/5.7.25-v10) + +- [fbbdea8e](https://github.com/stashed/mysql/commit/fbbdea8e) Prepare for release 5.7.25-v10 (#423) +- [9dbc56ef](https://github.com/stashed/mysql/commit/9dbc56ef) [cherry-pick] Bring back the wait loop (#418) (#419) +- [27d3b793](https://github.com/stashed/mysql/commit/27d3b793) Merge pull request #414 from stashed/master-b0db4d5e-5.7.25 +- [363734fc](https://github.com/stashed/mysql/commit/363734fc) Use klog/v2 (#413) +- [84f0a160](https://github.com/stashed/mysql/commit/84f0a160) [cherry-pick] Use kglog helper (#409) +- [c430ec91](https://github.com/stashed/mysql/commit/c430ec91) Use k8s 1.21.0 toolchain + + +### [8.0.3-v10](https://github.com/stashed/mysql/releases/tag/8.0.3-v10) + +- [30d727cb](https://github.com/stashed/mysql/commit/30d727cb) Prepare for release 8.0.3-v10 (#426) +- [641cdaab](https://github.com/stashed/mysql/commit/641cdaab) [cherry-pick] Bring back the wait loop (#418) (#422) +- [abe44d1a](https://github.com/stashed/mysql/commit/abe44d1a) Merge pull request #417 from stashed/master-b0db4d5e-8.0.3 +- [2208a806](https://github.com/stashed/mysql/commit/2208a806) Use klog/v2 (#413) +- [5d71f395](https://github.com/stashed/mysql/commit/5d71f395) [cherry-pick] Use kglog helper (#412) +- [37726d79](https://github.com/stashed/mysql/commit/37726d79) Use k8s 1.21.0 toolchain + + +### [8.0.14-v10](https://github.com/stashed/mysql/releases/tag/8.0.14-v10) + +- [deeb3b99](https://github.com/stashed/mysql/commit/deeb3b99) Prepare for release 8.0.14-v10 (#424) +- [dca508ca](https://github.com/stashed/mysql/commit/dca508ca) [cherry-pick] Bring back the wait loop (#418) (#420) +- [1c547c34](https://github.com/stashed/mysql/commit/1c547c34) Merge pull request #415 from stashed/master-b0db4d5e-8.0.14 +- [62b23b52](https://github.com/stashed/mysql/commit/62b23b52) Use klog/v2 (#413) +- [ce373065](https://github.com/stashed/mysql/commit/ce373065) [cherry-pick] Use kglog helper (#410) +- [274264cc](https://github.com/stashed/mysql/commit/274264cc) Use k8s 1.21.0 toolchain +- [cbfe8255](https://github.com/stashed/mysql/commit/cbfe8255) [cherry-pick] Update Kubernetes toolchain to v1.21.0 (#377) (#379) + + +### [8.0.21-v4](https://github.com/stashed/mysql/releases/tag/8.0.21-v4) + +- [784b9d43](https://github.com/stashed/mysql/commit/784b9d43) Prepare for release 8.0.21-v4 (#425) +- [00cebf5b](https://github.com/stashed/mysql/commit/00cebf5b) [cherry-pick] Bring back the wait loop (#418) (#421) +- [061cb623](https://github.com/stashed/mysql/commit/061cb623) Merge pull request #416 from stashed/master-b0db4d5e-8.0.21 +- [e2b260b6](https://github.com/stashed/mysql/commit/e2b260b6) Use klog/v2 (#413) +- [c56b36ef](https://github.com/stashed/mysql/commit/c56b36ef) [cherry-pick] Use kglog helper (#411) +- [c6999cf0](https://github.com/stashed/mysql/commit/c6999cf0) Use k8s 1.21.0 toolchain + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-v5](https://github.com/stashed/percona-xtradb/releases/tag/5.7-v5) + +- [1e66b08](https://github.com/stashed/percona-xtradb/commit/1e66b08) Prepare for release 5.7-v5 (#181) +- [dedc120](https://github.com/stashed/percona-xtradb/commit/dedc120) [cherry-pick] Use klog/v2 (#179) (#180) +- [95cc309](https://github.com/stashed/percona-xtradb/commit/95cc309) [cherry-pick] Use kglog helper (#178) +- [a8338c8](https://github.com/stashed/percona-xtradb/commit/a8338c8) Use k8s 1.21.0 toolchain +- [a0a9785](https://github.com/stashed/percona-xtradb/commit/a0a9785) [cherry-pick] Use license-verifier v0.8.1 (#168) +- [1f9029a](https://github.com/stashed/percona-xtradb/commit/1f9029a) [cherry-pick] Update license verifier to v0.8.0 (#167) +- [0dd44c3](https://github.com/stashed/percona-xtradb/commit/0dd44c3) [cherry-pick] Update license verifier (#166) +- [20481d6](https://github.com/stashed/percona-xtradb/commit/20481d6) [cherry-pick] Fix spelling (#165) +- [0fd7b26](https://github.com/stashed/percona-xtradb/commit/0fd7b26) Move docs into stashed/docs repo + Cleanup (#164) +- [bc52132](https://github.com/stashed/percona-xtradb/commit/bc52132) Prepare for release 5.7.0-v2 (#161) +- [68eb8b6](https://github.com/stashed/percona-xtradb/commit/68eb8b6) [cherry-pick] Update repository config (#159) (#160) +- [aaecf26](https://github.com/stashed/percona-xtradb/commit/aaecf26) Support multiple commands in backup/restore pipeline (#157) (#158) +- [4c6a086](https://github.com/stashed/percona-xtradb/commit/4c6a086) Update repository config (#153) (#154) +- [22f48d0](https://github.com/stashed/percona-xtradb/commit/22f48d0) Use restic 0.12.0 (#150) (#151) +- [a3645ac](https://github.com/stashed/percona-xtradb/commit/a3645ac) Update Kubernetes v1.18.9 dependencies (#148) (#149) +- [affd376](https://github.com/stashed/percona-xtradb/commit/affd376) [cherry-pick] Check codespan schema (#146) (#147) +- [0c3d3ad](https://github.com/stashed/percona-xtradb/commit/0c3d3ad) [cherry-pick] Update repository config (#141) (#142) +- [937cfc8](https://github.com/stashed/percona-xtradb/commit/937cfc8) [cherry-pick] Update repository config (#139) (#140) +- [8d03640](https://github.com/stashed/percona-xtradb/commit/8d03640) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#137) (#138) +- [d6442e5](https://github.com/stashed/percona-xtradb/commit/d6442e5) [cherry-pick] Update repository config (#134) (#135) +- [301bd0a](https://github.com/stashed/percona-xtradb/commit/301bd0a) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#132) (#133) +- [b9865e8](https://github.com/stashed/percona-xtradb/commit/b9865e8) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#130) (#131) +- [5ab3eaa](https://github.com/stashed/percona-xtradb/commit/5ab3eaa) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#128) (#129) +- [3e48d47](https://github.com/stashed/percona-xtradb/commit/3e48d47) Prepare for release 5.7.0-v1 (#126) +- [42458b3](https://github.com/stashed/percona-xtradb/commit/42458b3) Use port from AppBinding (#120) (#125) +- [70d872d](https://github.com/stashed/percona-xtradb/commit/70d872d) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#123) (#124) +- [2927d77](https://github.com/stashed/percona-xtradb/commit/2927d77) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#121) (#122) +- [fadf2d3](https://github.com/stashed/percona-xtradb/commit/fadf2d3) Prepare for release 5.7.0 (#118) +- [4ea69c8](https://github.com/stashed/percona-xtradb/commit/4ea69c8) [cherry-pick] Update repository config (#116) (#117) +- [a133516](https://github.com/stashed/percona-xtradb/commit/a133516) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#114) (#115) +- [1b7be58](https://github.com/stashed/percona-xtradb/commit/1b7be58) [cherry-pick] Update Kubernetes v1.18.9 dependencies (#112) (#113) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v8](https://github.com/stashed/postgres/releases/tag/9.6.19-v8) + +- [788fde1b](https://github.com/stashed/postgres/commit/788fde1b) Prepare for release 9.6.19-v8 (#799) +- [173bb49a](https://github.com/stashed/postgres/commit/173bb49a) [cherry-pick] Use gomodules.xyz/go-sh (#789) (#794) +- [e1192aa4](https://github.com/stashed/postgres/commit/e1192aa4) [cherry-pick] Use klog/v2 (#783) (#788) +- [d936ce1b](https://github.com/stashed/postgres/commit/d936ce1b) [cherry-pick] Use kglog helper (#782) +- [aef3ed32](https://github.com/stashed/postgres/commit/aef3ed32) Use k8s 1.21.0 toolchain + + +### [10.14-v8](https://github.com/stashed/postgres/releases/tag/10.14-v8) + +- [2032c1f6](https://github.com/stashed/postgres/commit/2032c1f6) Prepare for release 10.14-v8 (#795) +- [ba31a9af](https://github.com/stashed/postgres/commit/ba31a9af) [cherry-pick] Use gomodules.xyz/go-sh (#789) (#790) +- [986207ab](https://github.com/stashed/postgres/commit/986207ab) [cherry-pick] Use klog/v2 (#783) (#784) +- [497c60cb](https://github.com/stashed/postgres/commit/497c60cb) [cherry-pick] Use kglog helper (#778) +- [45c6ea73](https://github.com/stashed/postgres/commit/45c6ea73) Use k8s 1.21.0 toolchain + + +### [11.9-v8](https://github.com/stashed/postgres/releases/tag/11.9-v8) + +- [531246ba](https://github.com/stashed/postgres/commit/531246ba) Prepare for release 11.9-v8 (#796) +- [abebf170](https://github.com/stashed/postgres/commit/abebf170) [cherry-pick] Use gomodules.xyz/go-sh (#789) (#791) +- [7d51c48b](https://github.com/stashed/postgres/commit/7d51c48b) [cherry-pick] Use klog/v2 (#783) (#785) +- [65c3506e](https://github.com/stashed/postgres/commit/65c3506e) [cherry-pick] Use kglog helper (#779) +- [984994b5](https://github.com/stashed/postgres/commit/984994b5) Use k8s 1.21.0 toolchain + + +### [12.4-v8](https://github.com/stashed/postgres/releases/tag/12.4-v8) + +- [f8a784c1](https://github.com/stashed/postgres/commit/f8a784c1) Prepare for release 12.4-v8 (#797) +- [0de72265](https://github.com/stashed/postgres/commit/0de72265) [cherry-pick] Use gomodules.xyz/go-sh (#789) (#792) +- [5d325eb4](https://github.com/stashed/postgres/commit/5d325eb4) [cherry-pick] Use klog/v2 (#783) (#786) +- [74d0b192](https://github.com/stashed/postgres/commit/74d0b192) [cherry-pick] Use kglog helper (#780) +- [4d4a1fb8](https://github.com/stashed/postgres/commit/4d4a1fb8) Use k8s 1.21.0 toolchain + + +### [13.1-v5](https://github.com/stashed/postgres/releases/tag/13.1-v5) + +- [20973db6](https://github.com/stashed/postgres/commit/20973db6) Prepare for release 13.1-v5 (#798) +- [85fac622](https://github.com/stashed/postgres/commit/85fac622) [cherry-pick] Use gomodules.xyz/go-sh (#789) (#793) +- [a903b4df](https://github.com/stashed/postgres/commit/a903b4df) [cherry-pick] Use klog/v2 (#783) (#787) +- [9c91b43d](https://github.com/stashed/postgres/commit/9c91b43d) [cherry-pick] Use kglog helper (#781) +- [dc1f023f](https://github.com/stashed/postgres/commit/dc1f023f) Use k8s 1.21.0 toolchain + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.14.0](https://github.com/stashed/stash/releases/tag/v0.14.0) + +- [028736ed](https://github.com/stashed/stash/commit/028736ed) Prepare for release v0.14.0 (#1354) +- [dc602c0d](https://github.com/stashed/stash/commit/dc602c0d) Prepare for release v0.13.1 (#1353) +- [5d8b403f](https://github.com/stashed/stash/commit/5d8b403f) Send audit events when analytics are enabled (#1352) +- [0d934ce8](https://github.com/stashed/stash/commit/0d934ce8) Use ImagePullPolicy "IfNotPresent" instead of "Always" for addons (#1351) +- [e9f48ec4](https://github.com/stashed/stash/commit/e9f48ec4) Use namespace when looking up running BackupSessions for Invoker (#1343) +- [f79218f1](https://github.com/stashed/stash/commit/f79218f1) Create auditor if license file is provided (#1350) +- [a53710bf](https://github.com/stashed/stash/commit/a53710bf) Disable api priortiy and fairness feature for webhook server (#1349) +- [2780fbc6](https://github.com/stashed/stash/commit/2780fbc6) Publish audit events (#1348) +- [ca26878d](https://github.com/stashed/stash/commit/ca26878d) Use klog/v2 (#1347) +- [f8b0c245](https://github.com/stashed/stash/commit/f8b0c245) Use kglog helpers +- [e9fec332](https://github.com/stashed/stash/commit/e9fec332) Update Kubernetes toolchain to v1.21.0 (#1344) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2022.02.22.md b/content/docs/v2024.12.18/CHANGELOG-v2022.02.22.md new file mode 100644 index 0000000000..ac9b7955b6 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2022.02.22.md @@ -0,0 +1,549 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2022.02.22 + name: Changelog-v2022.02.22 + parent: welcome + weight: 20220222 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2022.02.22/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2022.02.22/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2022.02.22 (2022-02-11) + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.18.0](https://github.com/stashed/apimachinery/releases/tag/v0.18.0) + +- [79d844fb](https://github.com/stashed/apimachinery/commit/79d844fb) Refactor restore invoker status updater logic (#152) +- [49e0fc85](https://github.com/stashed/apimachinery/commit/49e0fc85) Update SiteInfo (#151) +- [7c80de5c](https://github.com/stashed/apimachinery/commit/7c80de5c) Publish GenericResource (#150) +- [0906fab7](https://github.com/stashed/apimachinery/commit/0906fab7) Add stash-crd-installer image to install CRDs on helm pre-install hook (#145) +- [9c528743](https://github.com/stashed/apimachinery/commit/9c528743) Add phase field to backupconfiguration status. (#144) +- [3e17dd8d](https://github.com/stashed/apimachinery/commit/3e17dd8d) Refactor `metrics.go` file + Add `pushgatewayURL` singletone (#149) +- [553a63a8](https://github.com/stashed/apimachinery/commit/553a63a8) Add `GetCaPath()` method (#148) +- [3f6beb6d](https://github.com/stashed/apimachinery/commit/3f6beb6d) Update repository config (#147) +- [d7bf57bf](https://github.com/stashed/apimachinery/commit/d7bf57bf) Refactor invoker package (#146) +- [7da4b19c](https://github.com/stashed/apimachinery/commit/7da4b19c) Add method to create ResticWrapper from existing shell (#143) +- [68c89614](https://github.com/stashed/apimachinery/commit/68c89614) Show Snapshot ID in kubectl list command (#141) +- [8017cd43](https://github.com/stashed/apimachinery/commit/8017cd43) Review ui apis (#142) +- [d19cc472](https://github.com/stashed/apimachinery/commit/d19cc472) Modify BackupOverview API (#140) +- [c60601b5](https://github.com/stashed/apimachinery/commit/c60601b5) Add helper method for UsagePolicy (#139) +- [bc75d16a](https://github.com/stashed/apimachinery/commit/bc75d16a) Add support for cross-namespace repository (#136) +- [e845509f](https://github.com/stashed/apimachinery/commit/e845509f) Add ui types (#137) +- [6402d026](https://github.com/stashed/apimachinery/commit/6402d026) Allow cross namespace referencing for Repository + Cleanup old APIs (#135) +- [e914179d](https://github.com/stashed/apimachinery/commit/e914179d) Update repository config (#134) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.18.0](https://github.com/stashed/cli/releases/tag/v0.18.0) + +- [fdf799c](https://github.com/stashed/cli/commit/fdf799c) Prepare for release v0.18.0 (#155) +- [71d2142](https://github.com/stashed/cli/commit/71d2142) Update SiteInfo (#153) +- [2363171](https://github.com/stashed/cli/commit/2363171) Add `pause` and `resume` command (#152) +- [e6d907b](https://github.com/stashed/cli/commit/e6d907b) Publish GenericResource (#151) +- [c90bfcc](https://github.com/stashed/cli/commit/c90bfcc) Use stashed/restic image for darwin/arm64 support (#150) +- [b42d851](https://github.com/stashed/cli/commit/b42d851) Release cli for darwin/arm64 (#149) +- [34e30bd](https://github.com/stashed/cli/commit/34e30bd) Fix stash broken cli (#148) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v15](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v15) + +- [5eafa076](https://github.com/stashed/elasticsearch/commit/5eafa076) Prepare for release 5.6.4-v15 (#1097) +- [717701f3](https://github.com/stashed/elasticsearch/commit/717701f3) [cherry-pick] Update SiteInfo (#1089) (#1090) +- [2dacaf65](https://github.com/stashed/elasticsearch/commit/2dacaf65) [cherry-pick] Publish GenericResource (#1079) (#1080) +- [3097dc28](https://github.com/stashed/elasticsearch/commit/3097dc28) Add support for backup and restore from different namespace (#1069) (#1070) + + +### [6.2.4-v15](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v15) + +- [7a7c194d](https://github.com/stashed/elasticsearch/commit/7a7c194d) Prepare for release 6.2.4-v15 (#1098) +- [6c41704d](https://github.com/stashed/elasticsearch/commit/6c41704d) [cherry-pick] Update SiteInfo (#1089) (#1091) +- [398d08d4](https://github.com/stashed/elasticsearch/commit/398d08d4) [cherry-pick] Publish GenericResource (#1079) (#1081) +- [5b9a3530](https://github.com/stashed/elasticsearch/commit/5b9a3530) Add support for backup and restore from different namespace (#1069) (#1071) + + +### [6.3.0-v15](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v15) + +- [811094fc](https://github.com/stashed/elasticsearch/commit/811094fc) Prepare for release 6.3.0-v15 (#1099) +- [7bc3cbe5](https://github.com/stashed/elasticsearch/commit/7bc3cbe5) [cherry-pick] Update SiteInfo (#1089) (#1092) +- [6027c9da](https://github.com/stashed/elasticsearch/commit/6027c9da) [cherry-pick] Publish GenericResource (#1079) (#1082) +- [8b486870](https://github.com/stashed/elasticsearch/commit/8b486870) Add support for backup and restore from different namespace (#1069) (#1072) + + +### [6.4.0-v15](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v15) + +- [c351d557](https://github.com/stashed/elasticsearch/commit/c351d557) Prepare for release 6.4.0-v15 (#1100) +- [12cad4fb](https://github.com/stashed/elasticsearch/commit/12cad4fb) [cherry-pick] Publish GenericResource (#1079) (#1083) +- [ce67978c](https://github.com/stashed/elasticsearch/commit/ce67978c) Add support for backup and restore from different namespace (#1069) (#1073) + + +### [6.5.3-v15](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v15) + +- [885a5c59](https://github.com/stashed/elasticsearch/commit/885a5c59) Prepare for release 6.5.3-v15 (#1101) +- [0012c4c5](https://github.com/stashed/elasticsearch/commit/0012c4c5) [cherry-pick] Publish GenericResource (#1079) (#1084) +- [268a0310](https://github.com/stashed/elasticsearch/commit/268a0310) Add support for backup and restore from different namespace (#1069) (#1074) + + +### [6.8.0-v15](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v15) + +- [702ac2f8](https://github.com/stashed/elasticsearch/commit/702ac2f8) Prepare for release 6.8.0-v15 (#1102) +- [8c2a442f](https://github.com/stashed/elasticsearch/commit/8c2a442f) [cherry-pick] Update SiteInfo (#1089) (#1093) +- [9d595583](https://github.com/stashed/elasticsearch/commit/9d595583) [cherry-pick] Publish GenericResource (#1079) (#1085) +- [43fb310d](https://github.com/stashed/elasticsearch/commit/43fb310d) Add support for backup and restore from different namespace (#1069) (#1075) + + +### [7.2.0-v15](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v15) + +- [b78c499d](https://github.com/stashed/elasticsearch/commit/b78c499d) Prepare for release 7.2.0-v15 (#1104) +- [666a162a](https://github.com/stashed/elasticsearch/commit/666a162a) [cherry-pick] Update SiteInfo (#1089) (#1095) +- [7c39ac5c](https://github.com/stashed/elasticsearch/commit/7c39ac5c) [cherry-pick] Publish GenericResource (#1079) (#1087) +- [e813c925](https://github.com/stashed/elasticsearch/commit/e813c925) Add support for backup and restore from different namespace (#1069) (#1077) + + +### [7.3.2-v15](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v15) + +- [ab9c11e5](https://github.com/stashed/elasticsearch/commit/ab9c11e5) Prepare for release 7.3.2-v15 (#1105) +- [d49adbf5](https://github.com/stashed/elasticsearch/commit/d49adbf5) [cherry-pick] Update SiteInfo (#1089) (#1096) +- [41b2b371](https://github.com/stashed/elasticsearch/commit/41b2b371) [cherry-pick] Publish GenericResource (#1079) (#1088) +- [90c57e9b](https://github.com/stashed/elasticsearch/commit/90c57e9b) Add support for backup and restore from different namespace (#1069) (#1078) +- [6ecd2ef3](https://github.com/stashed/elasticsearch/commit/6ecd2ef3) Prepare for release 7.3.2-v14 (#1067) + + +### [7.14.0-v1](https://github.com/stashed/elasticsearch/releases/tag/7.14.0-v1) + +- [c2388a12](https://github.com/stashed/elasticsearch/commit/c2388a12) Prepare for release 7.14.0-v1 (#1103) +- [2b05ab4a](https://github.com/stashed/elasticsearch/commit/2b05ab4a) [cherry-pick] Update SiteInfo (#1089) (#1094) +- [b62eb6a1](https://github.com/stashed/elasticsearch/commit/b62eb6a1) [cherry-pick] Publish GenericResource (#1079) (#1086) +- [e6f4b52d](https://github.com/stashed/elasticsearch/commit/e6f4b52d) [cherry-pick] Add support for backup and restore from different namespace (#1069) (#1076) + + + +## [stashed/enterprise](https://github.com/stashed/enterprise) + +### [v0.18.0](https://github.com/stashed/enterprise/releases/tag/v0.18.0) + +- [fcf0f4f5](https://github.com/stashed/enterprise/commit/fcf0f4f5) Prepare for release v0.18.0 (#147) +- [55a9a92d](https://github.com/stashed/enterprise/commit/55a9a92d) Update UID generation for GenericResource (#146) +- [cb30a32f](https://github.com/stashed/enterprise/commit/cb30a32f) Refactor restore process status handling + add cross namespace tests (#145) +- [3f50cb35](https://github.com/stashed/enterprise/commit/3f50cb35) Update SiteInfo (#144) +- [ac18da55](https://github.com/stashed/enterprise/commit/ac18da55) Publish GenericResource (#143) +- [efcb6727](https://github.com/stashed/enterprise/commit/efcb6727) Expose original UID for audit events +- [301f2a56](https://github.com/stashed/enterprise/commit/301f2a56) Always set type meta for GenericResource +- [ccfc9ccf](https://github.com/stashed/enterprise/commit/ccfc9ccf) Publish GenericResource (#142) +- [477401a6](https://github.com/stashed/enterprise/commit/477401a6) Don't register CRDs from operator + allow passing crd-installer tag (#138) +- [fc98dd68](https://github.com/stashed/enterprise/commit/fc98dd68) Add validation webhooks for double opt-in check (#137) +- [1fb0d151](https://github.com/stashed/enterprise/commit/1fb0d151) Always keep the last completed backup (when `backupHistoryLimit > 0`) even if outside of history limit (#141) +- [db7fdbf3](https://github.com/stashed/enterprise/commit/db7fdbf3) Add support for custom Pushgateway (#140) +- [83940a05](https://github.com/stashed/enterprise/commit/83940a05) Use refactored invoker package (#139) +- [7a2d8610](https://github.com/stashed/enterprise/commit/7a2d8610) Cleanup legacy code + Support cross namespace Repository reference (#136) + + + +## [stashed/etcd](https://github.com/stashed/etcd) + +### [3.5.0-v2](https://github.com/stashed/etcd/releases/tag/3.5.0-v2) + +- [5127c53](https://github.com/stashed/etcd/commit/5127c53) Prepare for release 3.5.0-v2 (#26) +- [f1dd201](https://github.com/stashed/etcd/commit/f1dd201) [cherry-pick] Update SiteInfo (#24) (#25) +- [b6aa1c1](https://github.com/stashed/etcd/commit/b6aa1c1) [cherry-pick] Publish GenericResource (#22) (#23) +- [b14a960](https://github.com/stashed/etcd/commit/b14a960) Add support for backup and restore from different namespace (#20) (#21) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2022.02.22](https://github.com/stashed/installer/releases/tag/v2022.02.22) + +- [29686b4](https://github.com/stashed/installer/commit/29686b4) Prepare for release v2022.02.22 (#234) +- [31da5db](https://github.com/stashed/installer/commit/31da5db) Update chart version is stash-opscenter chart +- [a341dd1](https://github.com/stashed/installer/commit/a341dd1) Update repository config (#233) +- [c417a24](https://github.com/stashed/installer/commit/c417a24) Update stash-ui-server image tag using makefile +- [0b5b92a](https://github.com/stashed/installer/commit/0b5b92a) Make operator ready for arm64 nodes (#232) +- [fc96a55](https://github.com/stashed/installer/commit/fc96a55) Publish GenericResource (#231) +- [ea1d95f](https://github.com/stashed/installer/commit/ea1d95f) Add crd-installer job (#227) +- [e9b9c1f](https://github.com/stashed/installer/commit/e9b9c1f) Add validating webhook for BackupConfiguration in community chart (#230) +- [c0e15c6](https://github.com/stashed/installer/commit/c0e15c6) Add support for custom Pushgateway (#229) +- [4ad1c1f](https://github.com/stashed/installer/commit/4ad1c1f) Update repository config (#228) +- [5334b19](https://github.com/stashed/installer/commit/5334b19) Update catalogs chart to support backup and restore from different namespace (#226) +- [419b7c3](https://github.com/stashed/installer/commit/419b7c3) Add permission for nonResourceURLs +- [3a5f578](https://github.com/stashed/installer/commit/3a5f578) Updated charts after adding some validator webhook. (#222) +- [774a76b](https://github.com/stashed/installer/commit/774a76b) Correctly generate grafana dashboard name (#225) +- [73fde3c](https://github.com/stashed/installer/commit/73fde3c) Always pull ui-server (#224) +- [f3d6a22](https://github.com/stashed/installer/commit/f3d6a22) Add permission for AppBinding & KubeDB resources in ui server chart (#223) +- [cdeac58](https://github.com/stashed/installer/commit/cdeac58) Add stash-ui-server chart (#220) +- [bfddb33](https://github.com/stashed/installer/commit/bfddb33) Update repository config (#219) +- [dbce5b5](https://github.com/stashed/installer/commit/dbce5b5) Add k8s.io/group label to grafana dashboards +- [3f07f11](https://github.com/stashed/installer/commit/3f07f11) Add Grafana Dashboards (#218) + + + +## [stashed/mariadb](https://github.com/stashed/mariadb) + +### [10.5.8-v8](https://github.com/stashed/mariadb/releases/tag/10.5.8-v8) + +- [3241977](https://github.com/stashed/mariadb/commit/3241977) Prepare for release 10.5.8-v8 (#167) +- [2c34c07](https://github.com/stashed/mariadb/commit/2c34c07) [cherry-pick] Update SiteInfo (#165) (#166) +- [39d3273](https://github.com/stashed/mariadb/commit/39d3273) [cherry-pick] Publish GenericResource (#163) (#164) +- [4ad02b8](https://github.com/stashed/mariadb/commit/4ad02b8) Add support for backup and restore from different namespace (#161) (#162) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v14](https://github.com/stashed/mongodb/releases/tag/3.4.17-v14) + +- [7fdea5ac](https://github.com/stashed/mongodb/commit/7fdea5ac) Prepare for release 3.4.17-v14 (#1410) +- [5770d137](https://github.com/stashed/mongodb/commit/5770d137) [cherry-pick] Update SiteInfo (#1397) (#1398) +- [c97fb271](https://github.com/stashed/mongodb/commit/c97fb271) [cherry-pick] Publish GenericResource (#1383) (#1384) +- [0869cd91](https://github.com/stashed/mongodb/commit/0869cd91) Replace rs.secondaryOk() with rs.slaveOk() (#1370) +- [50073b07](https://github.com/stashed/mongodb/commit/50073b07) Add support for backup and restore from different namespace (#1354) (#1355) + + +### [3.4.22-v14](https://github.com/stashed/mongodb/releases/tag/3.4.22-v14) + +- [256947cb](https://github.com/stashed/mongodb/commit/256947cb) Prepare for release 3.4.22-v14 (#1411) +- [f37eb065](https://github.com/stashed/mongodb/commit/f37eb065) [cherry-pick] Update SiteInfo (#1397) (#1399) +- [2878238c](https://github.com/stashed/mongodb/commit/2878238c) [cherry-pick] Publish GenericResource (#1383) (#1385) +- [234668b6](https://github.com/stashed/mongodb/commit/234668b6) Replace rs.secondaryOk() with rs.slaveOk() (#1371) +- [7548c1ce](https://github.com/stashed/mongodb/commit/7548c1ce) Add support for backup and restore from different namespace (#1354) (#1356) + + +### [3.6.8-v14](https://github.com/stashed/mongodb/releases/tag/3.6.8-v14) + +- [8014a998](https://github.com/stashed/mongodb/commit/8014a998) Prepare for release 3.6.8-v14 (#1413) +- [889e8919](https://github.com/stashed/mongodb/commit/889e8919) [cherry-pick] Update SiteInfo (#1397) (#1401) +- [bc49f316](https://github.com/stashed/mongodb/commit/bc49f316) [cherry-pick] Publish GenericResource (#1383) (#1387) +- [0e83032b](https://github.com/stashed/mongodb/commit/0e83032b) Replace rs.secondaryOk() with rs.slaveOk() (#1372) +- [2a315847](https://github.com/stashed/mongodb/commit/2a315847) Add support for backup and restore from different namespace (#1354) (#1358) + + +### [3.6.13-v14](https://github.com/stashed/mongodb/releases/tag/3.6.13-v14) + +- [9bb40904](https://github.com/stashed/mongodb/commit/9bb40904) Prepare for release 3.6.13-v14 (#1412) +- [f684aea1](https://github.com/stashed/mongodb/commit/f684aea1) [cherry-pick] Update SiteInfo (#1397) (#1400) +- [1fe57cba](https://github.com/stashed/mongodb/commit/1fe57cba) [cherry-pick] Publish GenericResource (#1383) (#1386) +- [2ba645e5](https://github.com/stashed/mongodb/commit/2ba645e5) Replace rs.secondaryOk() with rs.slaveOk() (#1373) +- [9b3eab86](https://github.com/stashed/mongodb/commit/9b3eab86) Add support for backup and restore from different namespace (#1354) (#1357) + + +### [4.0.3-v14](https://github.com/stashed/mongodb/releases/tag/4.0.3-v14) + +- [257c6783](https://github.com/stashed/mongodb/commit/257c6783) Prepare for release 4.0.3-v14 (#1415) +- [7c40ea09](https://github.com/stashed/mongodb/commit/7c40ea09) [cherry-pick] Update SiteInfo (#1397) (#1403) +- [17fae849](https://github.com/stashed/mongodb/commit/17fae849) [cherry-pick] Publish GenericResource (#1383) (#1389) +- [a0f8b46f](https://github.com/stashed/mongodb/commit/a0f8b46f) Replace rs.secondaryOk() with rs.slaveOk() (#1374) +- [12958a7d](https://github.com/stashed/mongodb/commit/12958a7d) Add support for backup and restore from different namespace (#1354) (#1360) + + +### [4.0.5-v14](https://github.com/stashed/mongodb/releases/tag/4.0.5-v14) + +- [d081d8c2](https://github.com/stashed/mongodb/commit/d081d8c2) Prepare for release 4.0.5-v14 (#1416) +- [e8cf5007](https://github.com/stashed/mongodb/commit/e8cf5007) [cherry-pick] Update SiteInfo (#1397) (#1404) +- [8e3796dc](https://github.com/stashed/mongodb/commit/8e3796dc) [cherry-pick] Publish GenericResource (#1383) (#1390) +- [64379f10](https://github.com/stashed/mongodb/commit/64379f10) Replace rs.secondaryOk() with rs.slaveOk() (#1375) +- [5f0670c7](https://github.com/stashed/mongodb/commit/5f0670c7) Add support for backup and restore from different namespace (#1354) (#1361) + + +### [4.0.11-v14](https://github.com/stashed/mongodb/releases/tag/4.0.11-v14) + +- [9a366c96](https://github.com/stashed/mongodb/commit/9a366c96) Prepare for release 4.0.11-v14 (#1414) +- [7666db40](https://github.com/stashed/mongodb/commit/7666db40) [cherry-pick] Update SiteInfo (#1397) (#1402) +- [17e7281a](https://github.com/stashed/mongodb/commit/17e7281a) [cherry-pick] Publish GenericResource (#1383) (#1388) +- [f4535fa3](https://github.com/stashed/mongodb/commit/f4535fa3) Replace rs.secondaryOk() with rs.slaveOk() (#1376) +- [06bd1077](https://github.com/stashed/mongodb/commit/06bd1077) Add support for backup and restore from different namespace (#1354) (#1359) + + +### [4.1.4-v14](https://github.com/stashed/mongodb/releases/tag/4.1.4-v14) + +- [e2fc99c1](https://github.com/stashed/mongodb/commit/e2fc99c1) Prepare for release 4.1.4-v14 (#1418) +- [b81412b3](https://github.com/stashed/mongodb/commit/b81412b3) [cherry-pick] Update SiteInfo (#1397) (#1405) +- [d0e8bc14](https://github.com/stashed/mongodb/commit/d0e8bc14) [cherry-pick] Publish GenericResource (#1383) (#1392) +- [dc2da4b8](https://github.com/stashed/mongodb/commit/dc2da4b8) Replace rs.secondaryOk() with rs.slaveOk() (#1377) +- [9a4d21a2](https://github.com/stashed/mongodb/commit/9a4d21a2) Add support for backup and restore from different namespace (#1354) (#1363) + + +### [4.1.7-v14](https://github.com/stashed/mongodb/releases/tag/4.1.7-v14) + +- [ce6044eb](https://github.com/stashed/mongodb/commit/ce6044eb) Prepare for release 4.1.7-v14 (#1419) +- [21fff000](https://github.com/stashed/mongodb/commit/21fff000) [cherry-pick] Update SiteInfo (#1397) (#1406) +- [e9036951](https://github.com/stashed/mongodb/commit/e9036951) [cherry-pick] Publish GenericResource (#1383) (#1393) +- [f1a5a8db](https://github.com/stashed/mongodb/commit/f1a5a8db) Replace rs.secondaryOk() with rs.slaveOk() (#1378) +- [8a495673](https://github.com/stashed/mongodb/commit/8a495673) Add support for backup and restore from different namespace (#1354) (#1364) + + +### [4.1.13-v14](https://github.com/stashed/mongodb/releases/tag/4.1.13-v14) + +- [cb3eb5ce](https://github.com/stashed/mongodb/commit/cb3eb5ce) Prepare for release 4.1.13-v14 (#1417) +- [55690daa](https://github.com/stashed/mongodb/commit/55690daa) [cherry-pick] Publish GenericResource (#1383) (#1391) +- [2743c644](https://github.com/stashed/mongodb/commit/2743c644) Replace rs.secondaryOk() with rs.slaveOk() (#1379) +- [c5646467](https://github.com/stashed/mongodb/commit/c5646467) Add support for backup and restore from different namespace (#1354) (#1362) + + +### [4.2.3-v14](https://github.com/stashed/mongodb/releases/tag/4.2.3-v14) + +- [fe2ff6dc](https://github.com/stashed/mongodb/commit/fe2ff6dc) Prepare for release 4.2.3-v14 (#1420) +- [680e2e09](https://github.com/stashed/mongodb/commit/680e2e09) [cherry-pick] Update SiteInfo (#1397) (#1407) +- [561836a6](https://github.com/stashed/mongodb/commit/561836a6) [cherry-pick] Publish GenericResource (#1383) (#1394) +- [9bbe8802](https://github.com/stashed/mongodb/commit/9bbe8802) Replace rs.secondaryOk() with rs.slaveOk() (#1380) +- [37d09b42](https://github.com/stashed/mongodb/commit/37d09b42) Add support for backup and restore from different namespace (#1354) (#1365) +- [51c4a8dc](https://github.com/stashed/mongodb/commit/51c4a8dc) Prepare for release 4.2.3-v13 (#1350) + + +### [4.4.6-v5](https://github.com/stashed/mongodb/releases/tag/4.4.6-v5) + +- [b7533ecb](https://github.com/stashed/mongodb/commit/b7533ecb) Prepare for release 4.4.6-v5 (#1421) +- [1de5ff46](https://github.com/stashed/mongodb/commit/1de5ff46) [cherry-pick] Update SiteInfo (#1397) (#1408) +- [ed94bdd8](https://github.com/stashed/mongodb/commit/ed94bdd8) [cherry-pick] Publish GenericResource (#1383) (#1395) +- [1b2e4091](https://github.com/stashed/mongodb/commit/1b2e4091) Replace `adminCreds` with `mongoCreds` (#1381) +- [be037ead](https://github.com/stashed/mongodb/commit/be037ead) Add support for backup and restore from different namespace (#1354) (#1366) +- [e79762be](https://github.com/stashed/mongodb/commit/e79762be) Prepare for release 4.4.6-v4 (#1351) + + +### [5.0.3-v2](https://github.com/stashed/mongodb/releases/tag/5.0.3-v2) + +- [dd8649d1](https://github.com/stashed/mongodb/commit/dd8649d1) Prepare for release 5.0.3-v2 (#1422) +- [db232f1c](https://github.com/stashed/mongodb/commit/db232f1c) [cherry-pick] Update SiteInfo (#1397) (#1409) +- [b157e44d](https://github.com/stashed/mongodb/commit/b157e44d) [cherry-pick] Publish GenericResource (#1383) (#1396) +- [b45c3ad7](https://github.com/stashed/mongodb/commit/b45c3ad7) Replace `adminCreds` with `mongoCreds` (#1382) +- [caf4c255](https://github.com/stashed/mongodb/commit/caf4c255) Add support for backup and restore from different namespace (#1354) (#1367) +- [52d5104b](https://github.com/stashed/mongodb/commit/52d5104b) Prepare for release 5.0.3-v1 (#1352) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v15](https://github.com/stashed/mysql/releases/tag/5.7.25-v15) + +- [5d1d85ce](https://github.com/stashed/mysql/commit/5d1d85ce) Prepare for release 5.7.25-v15 (#574) +- [3e19e8b5](https://github.com/stashed/mysql/commit/3e19e8b5) [cherry-pick] Update SiteInfo (#569) (#570) +- [ea59f1e9](https://github.com/stashed/mysql/commit/ea59f1e9) Publish GenericResource (#564) (#568) +- [0975295b](https://github.com/stashed/mysql/commit/0975295b) Add support for backup and restore from different namespace (#559) (#560) + + +### [8.0.3-v15](https://github.com/stashed/mysql/releases/tag/8.0.3-v15) + +- [ea377e4e](https://github.com/stashed/mysql/commit/ea377e4e) Prepare for release 8.0.3-v15 (#577) +- [78289a40](https://github.com/stashed/mysql/commit/78289a40) [cherry-pick] Update SiteInfo (#569) (#573) +- [c41d4c88](https://github.com/stashed/mysql/commit/c41d4c88) Publish GenericResource (#564) (#565) +- [810af637](https://github.com/stashed/mysql/commit/810af637) Add support for backup and restore from different namespace (#559) (#563) + + +### [8.0.14-v15](https://github.com/stashed/mysql/releases/tag/8.0.14-v15) + +- [1fefc3d4](https://github.com/stashed/mysql/commit/1fefc3d4) Prepare for release 8.0.14-v15 (#575) +- [1bc03e61](https://github.com/stashed/mysql/commit/1bc03e61) [cherry-pick] Update SiteInfo (#569) (#571) +- [d2400622](https://github.com/stashed/mysql/commit/d2400622) Publish GenericResource (#564) (#567) +- [e29d03ef](https://github.com/stashed/mysql/commit/e29d03ef) Add support for backup and restore from different namespace (#559) (#561) + + +### [8.0.21-v9](https://github.com/stashed/mysql/releases/tag/8.0.21-v9) + +- [52988134](https://github.com/stashed/mysql/commit/52988134) Prepare for release 8.0.21-v9 (#576) +- [1b8be622](https://github.com/stashed/mysql/commit/1b8be622) [cherry-pick] Update SiteInfo (#569) (#572) +- [b6ad6e0a](https://github.com/stashed/mysql/commit/b6ad6e0a) Publish GenericResource (#564) (#566) +- [96d2927f](https://github.com/stashed/mysql/commit/96d2927f) Add support for backup and restore from different namespace (#559) (#562) + + + +## [stashed/nats](https://github.com/stashed/nats) + +### [2.6.1-v2](https://github.com/stashed/nats/releases/tag/2.6.1-v2) + +- [0a8c599](https://github.com/stashed/nats/commit/0a8c599) Prepare for release 2.6.1-v2 (#28) +- [101a0b2](https://github.com/stashed/nats/commit/101a0b2) [cherry-pick] Update SiteInfo (#26) (#27) +- [5eecf9c](https://github.com/stashed/nats/commit/5eecf9c) [cherry-pick] Publish GenericResource (#24) (#25) +- [032b9da](https://github.com/stashed/nats/commit/032b9da) Refactor code by adding new methods (#23) +- [3a59f1f](https://github.com/stashed/nats/commit/3a59f1f) Support backup & restore from different namespace and external NATS Server (#21) (#22) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-v10](https://github.com/stashed/percona-xtradb/releases/tag/5.7-v10) + +- [25cd0958](https://github.com/stashed/percona-xtradb/commit/25cd0958) Prepare for release 5.7-v10 (#238) +- [685feb7d](https://github.com/stashed/percona-xtradb/commit/685feb7d) [cherry-pick] Update SiteInfo (#236) (#237) +- [d265928b](https://github.com/stashed/percona-xtradb/commit/d265928b) [cherry-pick] Publish GenericResource (#234) (#235) +- [45cc6e62](https://github.com/stashed/percona-xtradb/commit/45cc6e62) Add support for backup and restore from different namespace (#232) (#233) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v13](https://github.com/stashed/postgres/releases/tag/9.6.19-v13) + +- [2e928b1b](https://github.com/stashed/postgres/commit/2e928b1b) Prepare for release 9.6.19-v13 (#991) +- [7bd10a34](https://github.com/stashed/postgres/commit/7bd10a34) [cherry-pick] Update SiteInfo (#980) (#985) +- [23a9982b](https://github.com/stashed/postgres/commit/23a9982b) [cherry-pick] Publish GenericResource (#973) (#979) +- [0db5519e](https://github.com/stashed/postgres/commit/0db5519e) Add support for backup and restore from different namespace (#966) (#972) + + +### [10.14-v13](https://github.com/stashed/postgres/releases/tag/10.14-v13) + +- [2813a98a](https://github.com/stashed/postgres/commit/2813a98a) Prepare for release 10.14-v13 (#986) +- [50dba7d7](https://github.com/stashed/postgres/commit/50dba7d7) [cherry-pick] Update SiteInfo (#980) (#981) +- [616fd1e5](https://github.com/stashed/postgres/commit/616fd1e5) [cherry-pick] Publish GenericResource (#973) (#974) +- [2e46777c](https://github.com/stashed/postgres/commit/2e46777c) Add support for backup and restore from different namespace (#966) (#967) + + +### [11.9-v13](https://github.com/stashed/postgres/releases/tag/11.9-v13) + +- [91c7414d](https://github.com/stashed/postgres/commit/91c7414d) Prepare for release 11.9-v13 (#987) +- [32e60021](https://github.com/stashed/postgres/commit/32e60021) [cherry-pick] Update SiteInfo (#980) (#982) +- [4e3b5204](https://github.com/stashed/postgres/commit/4e3b5204) [cherry-pick] Publish GenericResource (#973) (#975) +- [c87ee334](https://github.com/stashed/postgres/commit/c87ee334) Add support for backup and restore from different namespace (#966) (#968) + + +### [12.4-v13](https://github.com/stashed/postgres/releases/tag/12.4-v13) + +- [938c3f3a](https://github.com/stashed/postgres/commit/938c3f3a) Prepare for release 12.4-v13 (#988) +- [57b64ffa](https://github.com/stashed/postgres/commit/57b64ffa) [cherry-pick] Update SiteInfo (#980) (#983) +- [4a123cdf](https://github.com/stashed/postgres/commit/4a123cdf) [cherry-pick] Publish GenericResource (#973) (#976) +- [d375d3e6](https://github.com/stashed/postgres/commit/d375d3e6) Add support for backup and restore from different namespace (#966) (#969) + + +### [13.1-v10](https://github.com/stashed/postgres/releases/tag/13.1-v10) + +- [0e9f274d](https://github.com/stashed/postgres/commit/0e9f274d) Prepare for release 13.1-v10 (#989) +- [933223ea](https://github.com/stashed/postgres/commit/933223ea) [cherry-pick] Publish GenericResource (#973) (#977) +- [6491c2c7](https://github.com/stashed/postgres/commit/6491c2c7) Add support for backup and restore from different namespace (#966) (#970) + + +### [14.0-v2](https://github.com/stashed/postgres/releases/tag/14.0-v2) + +- [6335e10e](https://github.com/stashed/postgres/commit/6335e10e) Prepare for release 14.0-v2 (#990) +- [fe4c5c2d](https://github.com/stashed/postgres/commit/fe4c5c2d) [cherry-pick] Update SiteInfo (#980) (#984) +- [a69989d5](https://github.com/stashed/postgres/commit/a69989d5) [cherry-pick] Publish GenericResource (#973) (#978) +- [bd847a6e](https://github.com/stashed/postgres/commit/bd847a6e) Add support for backup and restore from different namespace (#966) (#971) + + + +## [stashed/redis](https://github.com/stashed/redis) + +### [5.0.13-v3](https://github.com/stashed/redis/releases/tag/5.0.13-v3) + +- [191fc96](https://github.com/stashed/redis/commit/191fc96) Prepare for release 5.0.13-v3 (#78) +- [38599a8](https://github.com/stashed/redis/commit/38599a8) [cherry-pick] Publish GenericResource (#73) (#74) +- [732fae8](https://github.com/stashed/redis/commit/732fae8) Add support for backup and restore from different namespace (#70) (#71) + + +### [6.2.5-v3](https://github.com/stashed/redis/releases/tag/6.2.5-v3) + +- [ba2bd19](https://github.com/stashed/redis/commit/ba2bd19) Prepare for release 6.2.5-v3 (#79) +- [6e5f3d2](https://github.com/stashed/redis/commit/6e5f3d2) [cherry-pick] Publish GenericResource (#73) (#75) +- [d837a32](https://github.com/stashed/redis/commit/d837a32) Add support for backup and restore from different namespace (#70) (#72) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.18.0](https://github.com/stashed/stash/releases/tag/v0.18.0) + +- [9536bc1b](https://github.com/stashed/stash/commit/9536bc1b) Prepare for release v0.18.0 (#1421) +- [0c84840e](https://github.com/stashed/stash/commit/0c84840e) Update UID generation for GenericResource (#1420) +- [2162c125](https://github.com/stashed/stash/commit/2162c125) Refactor restore process status handling + add cross namespace tests (#1419) +- [080ebfcf](https://github.com/stashed/stash/commit/080ebfcf) Update SiteInfo (#1418) +- [2727c071](https://github.com/stashed/stash/commit/2727c071) Publish GenericResource (#1416) +- [dd6b10f0](https://github.com/stashed/stash/commit/dd6b10f0) Expose original UID for generic resource +- [a121b8c3](https://github.com/stashed/stash/commit/a121b8c3) Always set type meta for GenericResource +- [9300292a](https://github.com/stashed/stash/commit/9300292a) Publish GenericResource (#1415) +- [ffe0d847](https://github.com/stashed/stash/commit/ffe0d847) Don't register CRDs from operator + allow passing crd-installer tag (#1409) +- [eb69ad4e](https://github.com/stashed/stash/commit/eb69ad4e) Port UsagePolicy validation related changes from Enterprise operator (#1414) +- [06988c00](https://github.com/stashed/stash/commit/06988c00) Always keep the last completed BackupSession (when `backupHistoryLimit > 0`) even if outside of history limit (#1413) +- [c81cf41b](https://github.com/stashed/stash/commit/c81cf41b) Add support for custom Pusgateway (#1412) +- [127017c9](https://github.com/stashed/stash/commit/127017c9) Update repository config (#1411) +- [1e41192e](https://github.com/stashed/stash/commit/1e41192e) Cleanup legacy code + Port changes from enterprise operator (#1410) +- [1ca2129b](https://github.com/stashed/stash/commit/1ca2129b) Update repository config (#1407) +- [849c782a](https://github.com/stashed/stash/commit/849c782a) Fix invalid task name in restore task resolver (#1406) + + + +## [stashed/ui-server](https://github.com/stashed/ui-server) + +### [v0.1.0](https://github.com/stashed/ui-server/releases/tag/v0.1.0) + +- [e2ce681](https://github.com/stashed/ui-server/commit/e2ce681) Prepare for release v0.1.0 (#8) +- [264756c](https://github.com/stashed/ui-server/commit/264756c) Update dependencies (#7) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2022.03.29.md b/content/docs/v2024.12.18/CHANGELOG-v2022.03.29.md new file mode 100644 index 0000000000..9ff1ae787e --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2022.03.29.md @@ -0,0 +1,531 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2022.03.29 + name: Changelog-v2022.03.29 + parent: welcome + weight: 20220329 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2022.03.29/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2022.03.29/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2022.03.29 (2022-03-29) + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.19.0](https://github.com/stashed/apimachinery/releases/tag/v0.19.0) + +- [6508ad7e](https://github.com/stashed/apimachinery/commit/6508ad7e) Make calculateBackupInvokerPhase() public (#163) +- [9db91ba2](https://github.com/stashed/apimachinery/commit/9db91ba2) Update Modules (#161) +- [31979993](https://github.com/stashed/apimachinery/commit/31979993) Use restic 0.13.0 (#162) +- [94de58f7](https://github.com/stashed/apimachinery/commit/94de58f7) Add cross-namespace support to Auto-Backup. (#159) +- [64b22c52](https://github.com/stashed/apimachinery/commit/64b22c52) Make Secret Key Optional for GCS, S3 Provider, and Azure (#160) +- [84656cc2](https://github.com/stashed/apimachinery/commit/84656cc2) Use Go 1.18 (#157) +- [c5658a77](https://github.com/stashed/apimachinery/commit/c5658a77) Update UID generation for GenericResource (#158) +- [7df8eca4](https://github.com/stashed/apimachinery/commit/7df8eca4) Fix Pending phase calculation (#155) +- [dc76c985](https://github.com/stashed/apimachinery/commit/dc76c985) Add hook executor helper package (#153) +- [d3d5fb01](https://github.com/stashed/apimachinery/commit/d3d5fb01) make fmt (#154) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.19.0](https://github.com/stashed/cli/releases/tag/v0.19.0) + +- [896c6cb1](https://github.com/stashed/cli/commit/896c6cb1) Prepare for release v0.19.0 (#160) +- [72fa7812](https://github.com/stashed/cli/commit/72fa7812) Use restic 0.13.0 (#159) +- [aa89dd42](https://github.com/stashed/cli/commit/aa89dd42) Use Go 1.18 (#158) +- [bd6a3a15](https://github.com/stashed/cli/commit/bd6a3a15) Use Go 1.18 (#157) +- [8399b7e5](https://github.com/stashed/cli/commit/8399b7e5) Add debug helper commands (#154) +- [ea950f22](https://github.com/stashed/cli/commit/ea950f22) make fmt (#156) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v16](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v16) + +- [d4d7b28c](https://github.com/stashed/elasticsearch/commit/d4d7b28c) Prepare for release 5.6.4-v16 (#1141) +- [ef1aed18](https://github.com/stashed/elasticsearch/commit/ef1aed18) [cherry-pick] Use restic 0.13.0 (#1131) (#1132) +- [8c3054dd](https://github.com/stashed/elasticsearch/commit/8c3054dd) [cherry-pick] Use Go 1.18 (#1127) (#1128) +- [67b1f638](https://github.com/stashed/elasticsearch/commit/67b1f638) [cherry-pick] Use Go 1.18 (#1117) (#1118) +- [2e9690c4](https://github.com/stashed/elasticsearch/commit/2e9690c4) [cherry-pick] make fmt (#1107) (#1108) + + +### [6.2.4-v16](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v16) + +- [fdaf59d4](https://github.com/stashed/elasticsearch/commit/fdaf59d4) Prepare for release 6.2.4-v16 (#1142) +- [aece6da5](https://github.com/stashed/elasticsearch/commit/aece6da5) [cherry-pick] Use restic 0.13.0 (#1131) (#1133) +- [cdfc0e3a](https://github.com/stashed/elasticsearch/commit/cdfc0e3a) [cherry-pick] Use Go 1.18 (#1127) (#1129) +- [5aba3d4c](https://github.com/stashed/elasticsearch/commit/5aba3d4c) [cherry-pick] Use Go 1.18 (#1117) (#1119) +- [3f746ef0](https://github.com/stashed/elasticsearch/commit/3f746ef0) [cherry-pick] make fmt (#1107) (#1109) + + +### [6.3.0-v16](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v16) + +- [2c01868f](https://github.com/stashed/elasticsearch/commit/2c01868f) Prepare for release 6.3.0-v16 (#1143) +- [ddc552fc](https://github.com/stashed/elasticsearch/commit/ddc552fc) [cherry-pick] Use restic 0.13.0 (#1131) (#1134) +- [44b784bf](https://github.com/stashed/elasticsearch/commit/44b784bf) [cherry-pick] Use Go 1.18 (#1127) (#1130) +- [04256ecb](https://github.com/stashed/elasticsearch/commit/04256ecb) [cherry-pick] Use Go 1.18 (#1117) (#1120) +- [c517829a](https://github.com/stashed/elasticsearch/commit/c517829a) [cherry-pick] make fmt (#1107) (#1110) + + +### [6.4.0-v16](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v16) + +- [d19b0163](https://github.com/stashed/elasticsearch/commit/d19b0163) Prepare for release 6.4.0-v16 (#1144) +- [d405ec80](https://github.com/stashed/elasticsearch/commit/d405ec80) [cherry-pick] Use restic 0.13.0 (#1131) (#1135) +- [dd94d90a](https://github.com/stashed/elasticsearch/commit/dd94d90a) [cherry-pick] Use Go 1.18 (#1117) (#1121) +- [0f03b0bf](https://github.com/stashed/elasticsearch/commit/0f03b0bf) [cherry-pick] make fmt (#1107) (#1111) + + +### [6.5.3-v16](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v16) + +- [96a2ea8b](https://github.com/stashed/elasticsearch/commit/96a2ea8b) Prepare for release 6.5.3-v16 (#1145) +- [f8e3c7a7](https://github.com/stashed/elasticsearch/commit/f8e3c7a7) [cherry-pick] Use restic 0.13.0 (#1131) (#1136) +- [c2a9fdd4](https://github.com/stashed/elasticsearch/commit/c2a9fdd4) [cherry-pick] Use Go 1.18 (#1117) (#1122) +- [a9141526](https://github.com/stashed/elasticsearch/commit/a9141526) [cherry-pick] make fmt (#1107) (#1112) + + +### [6.8.0-v16](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v16) + +- [76a7ecaf](https://github.com/stashed/elasticsearch/commit/76a7ecaf) Prepare for release 6.8.0-v16 (#1146) +- [9b65350a](https://github.com/stashed/elasticsearch/commit/9b65350a) [cherry-pick] Use restic 0.13.0 (#1131) (#1137) +- [c114bd14](https://github.com/stashed/elasticsearch/commit/c114bd14) [cherry-pick] Use Go 1.18 (#1117) (#1123) +- [7388c816](https://github.com/stashed/elasticsearch/commit/7388c816) [cherry-pick] make fmt (#1107) (#1113) + + +### [7.2.0-v16](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v16) + +- [60d30030](https://github.com/stashed/elasticsearch/commit/60d30030) Prepare for release 7.2.0-v16 (#1148) +- [3c123803](https://github.com/stashed/elasticsearch/commit/3c123803) [cherry-pick] Use restic 0.13.0 (#1131) (#1139) +- [c5c34027](https://github.com/stashed/elasticsearch/commit/c5c34027) [cherry-pick] Use Go 1.18 (#1117) (#1125) +- [3c25de99](https://github.com/stashed/elasticsearch/commit/3c25de99) [cherry-pick] make fmt (#1107) (#1115) + + +### [7.3.2-v16](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v16) + +- [68552cbf](https://github.com/stashed/elasticsearch/commit/68552cbf) Prepare for release 7.3.2-v16 (#1149) +- [9ddbdfef](https://github.com/stashed/elasticsearch/commit/9ddbdfef) [cherry-pick] Use restic 0.13.0 (#1131) (#1140) +- [f8a7044c](https://github.com/stashed/elasticsearch/commit/f8a7044c) [cherry-pick] Use Go 1.18 (#1117) (#1126) +- [d1707c75](https://github.com/stashed/elasticsearch/commit/d1707c75) [cherry-pick] make fmt (#1107) (#1116) + + +### [7.14.0-v2](https://github.com/stashed/elasticsearch/releases/tag/7.14.0-v2) + +- [79de930f](https://github.com/stashed/elasticsearch/commit/79de930f) Prepare for release 7.14.0-v2 (#1147) +- [88c0f2d4](https://github.com/stashed/elasticsearch/commit/88c0f2d4) [cherry-pick] Use restic 0.13.0 (#1131) (#1138) +- [75bcb45b](https://github.com/stashed/elasticsearch/commit/75bcb45b) [cherry-pick] Use Go 1.18 (#1117) (#1124) +- [bb5196e5](https://github.com/stashed/elasticsearch/commit/bb5196e5) [cherry-pick] make fmt (#1107) (#1114) + + + +## [stashed/enterprise](https://github.com/stashed/enterprise) + +### [v0.19.0](https://github.com/stashed/enterprise/releases/tag/v0.19.0) + + + + +## [stashed/etcd](https://github.com/stashed/etcd) + +### [3.5.0-v3](https://github.com/stashed/etcd/releases/tag/3.5.0-v3) + +- [319fece](https://github.com/stashed/etcd/commit/319fece) Prepare for release 3.5.0-v3 (#35) +- [5e44314](https://github.com/stashed/etcd/commit/5e44314) [cherry-pick] Use restic 0.13.0 (#33) (#34) +- [cbbeedc](https://github.com/stashed/etcd/commit/cbbeedc) [cherry-pick] Use Go 1.18 (#30) (#31) +- [39ee0f6](https://github.com/stashed/etcd/commit/39ee0f6) [cherry-pick] make fmt (#28) (#29) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2022.03.29](https://github.com/stashed/installer/releases/tag/v2022.03.29) + +- [a13b1fa7](https://github.com/stashed/installer/commit/a13b1fa7) Prepare for release v2022.03.29 (#243) +- [15dfb31d](https://github.com/stashed/installer/commit/15dfb31d) Add validation webhook to BackBlueprint. (#242) +- [6e1e9461](https://github.com/stashed/installer/commit/6e1e9461) Fix schema-checker api type (#237) +- [48aed579](https://github.com/stashed/installer/commit/48aed579) Use restic 0.13.0 (#241) +- [a4ad251a](https://github.com/stashed/installer/commit/a4ad251a) Make dashboards compatible to Grafana 7.3.5 to 8.x (#240) +- [f30dda49](https://github.com/stashed/installer/commit/f30dda49) Use Go 1.18 (#239) +- [b6584e55](https://github.com/stashed/installer/commit/b6584e55) Use Go 1.18 (#238) +- [d021d8c0](https://github.com/stashed/installer/commit/d021d8c0) Update crds +- [5c527d2b](https://github.com/stashed/installer/commit/5c527d2b) Use stash namespace by default (#236) +- [93936767](https://github.com/stashed/installer/commit/93936767) make fmt (#235) + + + +## [stashed/mariadb](https://github.com/stashed/mariadb) + +### [10.5.8-v9](https://github.com/stashed/mariadb/releases/tag/10.5.8-v9) + +- [04c1b78](https://github.com/stashed/mariadb/commit/04c1b78) Prepare for release 10.5.8-v9 (#177) +- [407e8f5](https://github.com/stashed/mariadb/commit/407e8f5) [cherry-pick] Use restic 0.13.0 (#175) (#176) +- [603f917](https://github.com/stashed/mariadb/commit/603f917) Use Go 1.18 (#173) (#174) +- [0f74c1d](https://github.com/stashed/mariadb/commit/0f74c1d) [cherry-pick] Use Go 1.18 (#171) (#172) +- [5d08051](https://github.com/stashed/mariadb/commit/5d08051) [cherry-pick] make fmt (#169) (#170) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v15](https://github.com/stashed/mongodb/releases/tag/3.4.17-v15) + +- [755b8c3d](https://github.com/stashed/mongodb/commit/755b8c3d) Prepare for release 3.4.17-v15 (#1482) +- [0f01ca5a](https://github.com/stashed/mongodb/commit/0f01ca5a) Use restic 0.13.0 (#1480) (#1481) +- [b962d329](https://github.com/stashed/mongodb/commit/b962d329) Use Go 1.18 (#1466) (#1467) +- [81abf07e](https://github.com/stashed/mongodb/commit/81abf07e) [cherry-pick] Use Go 1.18 (#1452) (#1453) +- [77c64325](https://github.com/stashed/mongodb/commit/77c64325) [cherry-pick] make fmt (#1438) (#1439) +- [47ecc163](https://github.com/stashed/mongodb/commit/47ecc163) [cherry-pick] Update flags: `--username`, `--password` to `--username=`, `--password=` (#1425) + + +### [3.4.22-v15](https://github.com/stashed/mongodb/releases/tag/3.4.22-v15) + +- [31b752ed](https://github.com/stashed/mongodb/commit/31b752ed) Prepare for release 3.4.22-v15 (#1483) +- [fc27bd6c](https://github.com/stashed/mongodb/commit/fc27bd6c) Use restic 0.13.0 (#1480) +- [8f441de2](https://github.com/stashed/mongodb/commit/8f441de2) Use Go 1.18 (#1466) (#1468) +- [f96ecfc3](https://github.com/stashed/mongodb/commit/f96ecfc3) [cherry-pick] Use Go 1.18 (#1452) (#1454) +- [3746814a](https://github.com/stashed/mongodb/commit/3746814a) [cherry-pick] make fmt (#1438) (#1440) +- [8d1a140a](https://github.com/stashed/mongodb/commit/8d1a140a) [cherry-pick] Update flags: `--username`, `--password` to `--username=`, `--password=` (#1426) + + +### [3.6.8-v15](https://github.com/stashed/mongodb/releases/tag/3.6.8-v15) + +- [1931c4f5](https://github.com/stashed/mongodb/commit/1931c4f5) Prepare for release 3.6.8-v15 (#1485) +- [1a92d450](https://github.com/stashed/mongodb/commit/1a92d450) Use restic 0.13.0 (#1480) +- [bdd7b1cc](https://github.com/stashed/mongodb/commit/bdd7b1cc) Use Go 1.18 (#1466) (#1470) +- [1e54c5da](https://github.com/stashed/mongodb/commit/1e54c5da) [cherry-pick] Use Go 1.18 (#1452) (#1456) +- [fa12f5a3](https://github.com/stashed/mongodb/commit/fa12f5a3) [cherry-pick] make fmt (#1438) (#1442) +- [8caec9f3](https://github.com/stashed/mongodb/commit/8caec9f3) [cherry-pick] Update flags: `--username`, `--password` to `--username=`, `--password=` (#1428) + + +### [3.6.13-v15](https://github.com/stashed/mongodb/releases/tag/3.6.13-v15) + +- [3207c3d8](https://github.com/stashed/mongodb/commit/3207c3d8) Prepare for release 3.6.13-v15 (#1484) +- [6b81e8c6](https://github.com/stashed/mongodb/commit/6b81e8c6) Use restic 0.13.0 (#1480) +- [ab4e31b1](https://github.com/stashed/mongodb/commit/ab4e31b1) Use Go 1.18 (#1466) (#1469) +- [c71b1318](https://github.com/stashed/mongodb/commit/c71b1318) [cherry-pick] Use Go 1.18 (#1452) (#1455) +- [2f1dbdba](https://github.com/stashed/mongodb/commit/2f1dbdba) [cherry-pick] make fmt (#1438) (#1441) +- [f229bc18](https://github.com/stashed/mongodb/commit/f229bc18) [cherry-pick] Update flags: `--username`, `--password` to `--username=`, `--password=` (#1427) + + +### [4.0.3-v15](https://github.com/stashed/mongodb/releases/tag/4.0.3-v15) + +- [7214e8fa](https://github.com/stashed/mongodb/commit/7214e8fa) Prepare for release 4.0.3-v15 (#1487) +- [15e09cd3](https://github.com/stashed/mongodb/commit/15e09cd3) Use restic 0.13.0 (#1480) +- [c9d70039](https://github.com/stashed/mongodb/commit/c9d70039) Use Go 1.18 (#1466) (#1472) +- [53b80297](https://github.com/stashed/mongodb/commit/53b80297) [cherry-pick] Use Go 1.18 (#1452) (#1458) +- [8046cba4](https://github.com/stashed/mongodb/commit/8046cba4) [cherry-pick] make fmt (#1438) (#1444) +- [582f10d4](https://github.com/stashed/mongodb/commit/582f10d4) [cherry-pick] Update flags: `--username`, `--password` to `--username=`, `--password=` (#1430) + + +### [4.0.5-v15](https://github.com/stashed/mongodb/releases/tag/4.0.5-v15) + +- [b4a5a87c](https://github.com/stashed/mongodb/commit/b4a5a87c) Prepare for release 4.0.5-v15 (#1488) +- [de293f86](https://github.com/stashed/mongodb/commit/de293f86) Use restic 0.13.0 (#1480) +- [179b2fdc](https://github.com/stashed/mongodb/commit/179b2fdc) Use Go 1.18 (#1466) (#1473) +- [22a17498](https://github.com/stashed/mongodb/commit/22a17498) [cherry-pick] Use Go 1.18 (#1452) (#1459) +- [e128a299](https://github.com/stashed/mongodb/commit/e128a299) [cherry-pick] make fmt (#1438) (#1445) +- [fc5f6506](https://github.com/stashed/mongodb/commit/fc5f6506) [cherry-pick] Update flags: `--username`, `--password` to `--username=`, `--password=` (#1431) + + +### [4.0.11-v15](https://github.com/stashed/mongodb/releases/tag/4.0.11-v15) + +- [1d7a3de0](https://github.com/stashed/mongodb/commit/1d7a3de0) Prepare for release 4.0.11-v15 (#1486) +- [0cccc482](https://github.com/stashed/mongodb/commit/0cccc482) Use restic 0.13.0 (#1480) +- [52ee2894](https://github.com/stashed/mongodb/commit/52ee2894) Use Go 1.18 (#1466) (#1471) +- [8ef1c550](https://github.com/stashed/mongodb/commit/8ef1c550) [cherry-pick] Use Go 1.18 (#1452) (#1457) +- [847a3505](https://github.com/stashed/mongodb/commit/847a3505) [cherry-pick] make fmt (#1438) (#1443) +- [c61280d0](https://github.com/stashed/mongodb/commit/c61280d0) [cherry-pick] Update flags: `--username`, `--password` to `--username=`, `--password=` (#1429) + + +### [4.1.4-v15](https://github.com/stashed/mongodb/releases/tag/4.1.4-v15) + +- [619d4081](https://github.com/stashed/mongodb/commit/619d4081) Prepare for release 4.1.4-v15 (#1490) +- [92453bef](https://github.com/stashed/mongodb/commit/92453bef) Use restic 0.13.0 (#1480) +- [7346833f](https://github.com/stashed/mongodb/commit/7346833f) [cherry-pick] Use Go 1.18 (#1466) (#1475) +- [4908b80a](https://github.com/stashed/mongodb/commit/4908b80a) [cherry-pick] Use Go 1.18 (#1452) (#1461) +- [367d80e1](https://github.com/stashed/mongodb/commit/367d80e1) [cherry-pick] make fmt (#1438) (#1447) +- [13d8ad14](https://github.com/stashed/mongodb/commit/13d8ad14) [cherry-pick] Update flags: `--username`, `--password` to `--username=`, `--password=` (#1433) + + +### [4.1.7-v15](https://github.com/stashed/mongodb/releases/tag/4.1.7-v15) + +- [eb26eb18](https://github.com/stashed/mongodb/commit/eb26eb18) Prepare for release 4.1.7-v15 (#1491) +- [2481e91d](https://github.com/stashed/mongodb/commit/2481e91d) Use restic 0.13.0 (#1480) +- [9530b9f8](https://github.com/stashed/mongodb/commit/9530b9f8) [cherry-pick] Use Go 1.18 (#1466) (#1476) +- [c5aab733](https://github.com/stashed/mongodb/commit/c5aab733) [cherry-pick] Use Go 1.18 (#1452) (#1462) +- [05adf1b1](https://github.com/stashed/mongodb/commit/05adf1b1) [cherry-pick] make fmt (#1438) (#1448) +- [ccbd1152](https://github.com/stashed/mongodb/commit/ccbd1152) [cherry-pick] Update flags: `--username`, `--password` to `--username=`, `--password=` (#1434) + + +### [4.1.13-v15](https://github.com/stashed/mongodb/releases/tag/4.1.13-v15) + +- [2c3283e9](https://github.com/stashed/mongodb/commit/2c3283e9) Prepare for release 4.1.13-v15 (#1489) +- [3a8b3866](https://github.com/stashed/mongodb/commit/3a8b3866) Use restic 0.13.0 (#1480) +- [24836e66](https://github.com/stashed/mongodb/commit/24836e66) Use Go 1.18 (#1466) (#1474) +- [11b3b09c](https://github.com/stashed/mongodb/commit/11b3b09c) [cherry-pick] Use Go 1.18 (#1452) (#1460) +- [3bfab9f1](https://github.com/stashed/mongodb/commit/3bfab9f1) [cherry-pick] make fmt (#1438) (#1446) +- [6d2aa5fc](https://github.com/stashed/mongodb/commit/6d2aa5fc) [cherry-pick] Update flags: `--username`, `--password` to `--username=`, `--password=` (#1432) + + +### [4.2.3-v15](https://github.com/stashed/mongodb/releases/tag/4.2.3-v15) + +- [652a9602](https://github.com/stashed/mongodb/commit/652a9602) Prepare for release 4.2.3-v15 (#1492) +- [120e3822](https://github.com/stashed/mongodb/commit/120e3822) Use restic 0.13.0 (#1480) +- [552c5217](https://github.com/stashed/mongodb/commit/552c5217) [cherry-pick] Use Go 1.18 (#1466) (#1477) +- [cbf442eb](https://github.com/stashed/mongodb/commit/cbf442eb) [cherry-pick] Use Go 1.18 (#1452) (#1463) +- [4d39da7a](https://github.com/stashed/mongodb/commit/4d39da7a) [cherry-pick] make fmt (#1438) (#1449) +- [b60b11fd](https://github.com/stashed/mongodb/commit/b60b11fd) [cherry-pick] Update flags: `--username`, `--password` to `--username=`, `--password=` (#1435) + + +### [4.4.6-v6](https://github.com/stashed/mongodb/releases/tag/4.4.6-v6) + +- [a7043538](https://github.com/stashed/mongodb/commit/a7043538) Prepare for release 4.4.6-v6 (#1493) +- [6f30e9ef](https://github.com/stashed/mongodb/commit/6f30e9ef) Use restic 0.13.0 (#1480) +- [55ca4046](https://github.com/stashed/mongodb/commit/55ca4046) [cherry-pick] Use Go 1.18 (#1466) (#1478) +- [5b7846c4](https://github.com/stashed/mongodb/commit/5b7846c4) [cherry-pick] Use Go 1.18 (#1452) (#1464) +- [e16bcac4](https://github.com/stashed/mongodb/commit/e16bcac4) [cherry-pick] make fmt (#1438) (#1450) +- [8d939ff6](https://github.com/stashed/mongodb/commit/8d939ff6) [cherry-pick] Update flags: `--username`, `--password` to `--username=`, `--password=` (#1436) + + +### [5.0.3-v3](https://github.com/stashed/mongodb/releases/tag/5.0.3-v3) + +- [0fc4d4f9](https://github.com/stashed/mongodb/commit/0fc4d4f9) Use restic 0.13.0 (#1480) +- [15939f28](https://github.com/stashed/mongodb/commit/15939f28) [cherry-pick] Use Go 1.18 (#1466) (#1479) +- [e0ae2279](https://github.com/stashed/mongodb/commit/e0ae2279) [cherry-pick] Use Go 1.18 (#1452) (#1465) +- [1cdc0ae5](https://github.com/stashed/mongodb/commit/1cdc0ae5) [cherry-pick] make fmt (#1438) (#1451) +- [1aacdd1f](https://github.com/stashed/mongodb/commit/1aacdd1f) [cherry-pick] Update flags: `--username`, `--password` to `--username=`, `--password=` (#1437) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v16](https://github.com/stashed/mysql/releases/tag/5.7.25-v16) + +- [bb07cd05](https://github.com/stashed/mysql/commit/bb07cd05) Prepare for release 5.7.25-v16 (#599) +- [d481d606](https://github.com/stashed/mysql/commit/d481d606) [cherry-pick] Use restic 0.13.0 (#594) (#595) +- [518948e0](https://github.com/stashed/mysql/commit/518948e0) [cherry-pick] Use Go 1.18 (#589) (#590) +- [77a5f78c](https://github.com/stashed/mysql/commit/77a5f78c) [cherry-pick] Use Go 1.18 (#584) (#585) +- [595a7669](https://github.com/stashed/mysql/commit/595a7669) [cherry-pick] make fmt (#579) (#580) + + +### [8.0.3-v16](https://github.com/stashed/mysql/releases/tag/8.0.3-v16) + +- [2a1de95f](https://github.com/stashed/mysql/commit/2a1de95f) Prepare for release 8.0.3-v16 (#602) +- [7d4c8598](https://github.com/stashed/mysql/commit/7d4c8598) [cherry-pick] Use restic 0.13.0 (#594) (#598) +- [690c5e57](https://github.com/stashed/mysql/commit/690c5e57) [cherry-pick] Use Go 1.18 (#589) (#593) +- [d74f25c0](https://github.com/stashed/mysql/commit/d74f25c0) [cherry-pick] Use Go 1.18 (#584) (#588) +- [8d564007](https://github.com/stashed/mysql/commit/8d564007) [cherry-pick] make fmt (#579) (#583) + + +### [8.0.14-v16](https://github.com/stashed/mysql/releases/tag/8.0.14-v16) + +- [4ddb1407](https://github.com/stashed/mysql/commit/4ddb1407) Prepare for release 8.0.14-v16 (#600) +- [3dac3d8e](https://github.com/stashed/mysql/commit/3dac3d8e) [cherry-pick] Use restic 0.13.0 (#594) (#596) +- [243c3032](https://github.com/stashed/mysql/commit/243c3032) [cherry-pick] Use Go 1.18 (#589) (#591) +- [32dc6eb9](https://github.com/stashed/mysql/commit/32dc6eb9) [cherry-pick] Use Go 1.18 (#584) (#586) +- [a549ebdf](https://github.com/stashed/mysql/commit/a549ebdf) [cherry-pick] make fmt (#579) (#581) + + +### [8.0.21-v10](https://github.com/stashed/mysql/releases/tag/8.0.21-v10) + +- [179a84fb](https://github.com/stashed/mysql/commit/179a84fb) Prepare for release 8.0.21-v10 (#601) +- [8a441e4e](https://github.com/stashed/mysql/commit/8a441e4e) [cherry-pick] Use restic 0.13.0 (#594) (#597) +- [0804b601](https://github.com/stashed/mysql/commit/0804b601) [cherry-pick] Use Go 1.18 (#589) (#592) +- [0064f95c](https://github.com/stashed/mysql/commit/0064f95c) [cherry-pick] Use Go 1.18 (#584) (#587) +- [b6b7c653](https://github.com/stashed/mysql/commit/b6b7c653) [cherry-pick] make fmt (#579) (#582) + + + +## [stashed/nats](https://github.com/stashed/nats) + +### [2.6.1-v3](https://github.com/stashed/nats/releases/tag/2.6.1-v3) + +- [cfe6a27](https://github.com/stashed/nats/commit/cfe6a27) Prepare for release 2.6.1-v3 (#38) +- [d7d5f7c](https://github.com/stashed/nats/commit/d7d5f7c) [cherry-pick] Use restic 0.13.0 (#36) (#37) +- [234dc73](https://github.com/stashed/nats/commit/234dc73) [cherry-pick] Use Go 1.18 (#34) (#35) +- [ed5c4a7](https://github.com/stashed/nats/commit/ed5c4a7) [cherry-pick] Use Go 1.18 (#32) (#33) +- [17de3e7](https://github.com/stashed/nats/commit/17de3e7) [cherry-pick] make fmt (#30) (#31) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-v11](https://github.com/stashed/percona-xtradb/releases/tag/5.7-v11) + +- [be059737](https://github.com/stashed/percona-xtradb/commit/be059737) Prepare for release 5.7-v11 (#248) +- [b5fafc54](https://github.com/stashed/percona-xtradb/commit/b5fafc54) [cherry-pick] Use restic 0.13.0 (#246) (#247) +- [cd6b848e](https://github.com/stashed/percona-xtradb/commit/cd6b848e) [cherry-pick] Use Go 1.18 (#244) (#245) +- [5e9c732d](https://github.com/stashed/percona-xtradb/commit/5e9c732d) [cherry-pick] Use Go 1.18 (#242) (#243) +- [8e2fda28](https://github.com/stashed/percona-xtradb/commit/8e2fda28) [cherry-pick] make fmt (#240) (#241) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v14](https://github.com/stashed/postgres/releases/tag/9.6.19-v14) + +- [daefabc0](https://github.com/stashed/postgres/commit/daefabc0) Prepare for release 9.6.19-v14 (#1025) +- [cb432033](https://github.com/stashed/postgres/commit/cb432033) [cherry-pick] Use restic 0.13.0 (#1014) (#1019) +- [cdc98691](https://github.com/stashed/postgres/commit/cdc98691) [cherry-pick] Use Go 1.18 (#1007) (#1013) +- [f41d2233](https://github.com/stashed/postgres/commit/f41d2233) [cherry-pick] Use Go 1.18 (#1000) (#1006) +- [ef93027e](https://github.com/stashed/postgres/commit/ef93027e) [cherry-pick] make fmt (#993) (#999) + + +### [10.14-v14](https://github.com/stashed/postgres/releases/tag/10.14-v14) + +- [44834ce7](https://github.com/stashed/postgres/commit/44834ce7) Prepare for release 10.14-v14 (#1020) +- [49e26c7b](https://github.com/stashed/postgres/commit/49e26c7b) [cherry-pick] Use restic 0.13.0 (#1014) (#1015) +- [671ede8a](https://github.com/stashed/postgres/commit/671ede8a) [cherry-pick] Use Go 1.18 (#1007) (#1008) +- [9aff959d](https://github.com/stashed/postgres/commit/9aff959d) [cherry-pick] Use Go 1.18 (#1000) (#1001) +- [eed7e597](https://github.com/stashed/postgres/commit/eed7e597) [cherry-pick] make fmt (#993) (#994) + + +### [11.9-v14](https://github.com/stashed/postgres/releases/tag/11.9-v14) + +- [9cf76131](https://github.com/stashed/postgres/commit/9cf76131) Prepare for release 11.9-v14 (#1021) +- [86a00eab](https://github.com/stashed/postgres/commit/86a00eab) [cherry-pick] Use restic 0.13.0 (#1014) (#1016) +- [c09b4c75](https://github.com/stashed/postgres/commit/c09b4c75) [cherry-pick] Use Go 1.18 (#1007) (#1009) +- [61b21ca5](https://github.com/stashed/postgres/commit/61b21ca5) [cherry-pick] Use Go 1.18 (#1000) (#1002) +- [767095f5](https://github.com/stashed/postgres/commit/767095f5) [cherry-pick] make fmt (#993) (#995) + + +### [12.4-v14](https://github.com/stashed/postgres/releases/tag/12.4-v14) + +- [67174902](https://github.com/stashed/postgres/commit/67174902) Prepare for release 12.4-v14 (#1022) +- [3f86c8e0](https://github.com/stashed/postgres/commit/3f86c8e0) [cherry-pick] Use restic 0.13.0 (#1014) (#1017) +- [e3c51f56](https://github.com/stashed/postgres/commit/e3c51f56) [cherry-pick] Use Go 1.18 (#1007) (#1010) +- [24676be8](https://github.com/stashed/postgres/commit/24676be8) [cherry-pick] Use Go 1.18 (#1000) (#1003) +- [d214302e](https://github.com/stashed/postgres/commit/d214302e) [cherry-pick] make fmt (#993) (#996) + + +### [13.1-v11](https://github.com/stashed/postgres/releases/tag/13.1-v11) + +- [0f7020a2](https://github.com/stashed/postgres/commit/0f7020a2) Prepare for release 13.1-v11 (#1023) +- [8f919d23](https://github.com/stashed/postgres/commit/8f919d23) [cherry-pick] Use restic 0.13.0 (#1014) (#1018) +- [fe60ccc3](https://github.com/stashed/postgres/commit/fe60ccc3) [cherry-pick] Use Go 1.18 (#1007) (#1011) +- [723475ed](https://github.com/stashed/postgres/commit/723475ed) [cherry-pick] Use Go 1.18 (#1000) (#1004) +- [b7a719bb](https://github.com/stashed/postgres/commit/b7a719bb) [cherry-pick] make fmt (#993) (#997) + + +### [14.0-v3](https://github.com/stashed/postgres/releases/tag/14.0-v3) + +- [2bdbb796](https://github.com/stashed/postgres/commit/2bdbb796) Prepare for release 14.0-v3 (#1024) +- [3c73aaeb](https://github.com/stashed/postgres/commit/3c73aaeb) [cherry-pick] Use Go 1.18 (#1007) (#1012) +- [851372a5](https://github.com/stashed/postgres/commit/851372a5) [cherry-pick] Use Go 1.18 (#1000) (#1005) +- [a65687e4](https://github.com/stashed/postgres/commit/a65687e4) [cherry-pick] make fmt (#993) (#998) + + + +## [stashed/redis](https://github.com/stashed/redis) + +### [5.0.13-v4](https://github.com/stashed/redis/releases/tag/5.0.13-v4) + +- [fb8fc3d](https://github.com/stashed/redis/commit/fb8fc3d) Prepare for release 5.0.13-v4 (#93) +- [eaf9b82](https://github.com/stashed/redis/commit/eaf9b82) [cherry-pick] Use restic 0.13.0 (#90) (#91) +- [5cb5e1f](https://github.com/stashed/redis/commit/5cb5e1f) [cherry-pick] Use Go 1.18 (#87) (#88) +- [d0bc853](https://github.com/stashed/redis/commit/d0bc853) [cherry-pick] Use Go 1.18 (#84) (#85) +- [b8d96af](https://github.com/stashed/redis/commit/b8d96af) [cherry-pick] make fmt (#81) (#82) + + +### [6.2.5-v4](https://github.com/stashed/redis/releases/tag/6.2.5-v4) + +- [58a1b2f](https://github.com/stashed/redis/commit/58a1b2f) Prepare for release 6.2.5-v4 (#94) +- [bb461a4](https://github.com/stashed/redis/commit/bb461a4) [cherry-pick] Use restic 0.13.0 (#90) (#92) +- [eec38ca](https://github.com/stashed/redis/commit/eec38ca) [cherry-pick] Use Go 1.18 (#87) (#89) +- [08a04ad](https://github.com/stashed/redis/commit/08a04ad) [cherry-pick] Use Go 1.18 (#84) (#86) +- [9ae8bc3](https://github.com/stashed/redis/commit/9ae8bc3) [cherry-pick] make fmt (#81) (#83) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.19.0](https://github.com/stashed/stash/releases/tag/v0.19.0) + + + + +## [stashed/ui-server](https://github.com/stashed/ui-server) + +### [v0.2.0](https://github.com/stashed/ui-server/releases/tag/v0.2.0) + +- [652ae72](https://github.com/stashed/ui-server/commit/652ae72) Prepare for release v0.2.0 (#13) +- [3270566](https://github.com/stashed/ui-server/commit/3270566) Use Go 1.18 (#12) +- [9963c7b](https://github.com/stashed/ui-server/commit/9963c7b) Use Go 1.18 (#11) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2022.05.12.md b/content/docs/v2024.12.18/CHANGELOG-v2022.05.12.md new file mode 100644 index 0000000000..2b7555f198 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2022.05.12.md @@ -0,0 +1,512 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2022.05.12 + name: Changelog-v2022.05.12 + parent: welcome + weight: 20220512 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2022.05.12/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2022.05.12/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2022.05.12 (2022-05-09) + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.20.0](https://github.com/stashed/apimachinery/releases/tag/v0.20.0) + +- [59662acc](https://github.com/stashed/apimachinery/commit/59662acc) Update nats client to v1.15.0 (#168) +- [c840c081](https://github.com/stashed/apimachinery/commit/c840c081) Use EmptyTarget when target is not specified (#156) +- [73208310](https://github.com/stashed/apimachinery/commit/73208310) Utilize target count during calculating invoker phase + Add `backupNamespace` in BackupBlueprint (#167) +- [61c413e1](https://github.com/stashed/apimachinery/commit/61c413e1) Add topologySpreadConstraints to RuntimeSettings (#166) +- [dbb9ce30](https://github.com/stashed/apimachinery/commit/dbb9ce30) Add Cross-namespace target support. (#164) +- [8d0e2056](https://github.com/stashed/apimachinery/commit/8d0e2056) Use restic 0.13.1 (#165) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.20.0](https://github.com/stashed/cli/releases/tag/v0.20.0) + +- [9c3e9a57](https://github.com/stashed/cli/commit/9c3e9a57) Prepare for release v0.20.0 (#163) +- [a267d818](https://github.com/stashed/cli/commit/a267d818) Update nats client to v1.15.0 (#162) +- [a66abe45](https://github.com/stashed/cli/commit/a66abe45) Use restic 0.13.1 (#161) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v17](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v17) + +- [dd7bbf09](https://github.com/stashed/elasticsearch/commit/dd7bbf09) Prepare for release 5.6.4-v17 (#1180) +- [88bf5065](https://github.com/stashed/elasticsearch/commit/88bf5065) [cherry-pick] Update nats client to v1.15.0 (#1170) (#1171) +- [0a7e37fb](https://github.com/stashed/elasticsearch/commit/0a7e37fb) Add support for cross-namespace target (#1160) (#1161) +- [c28cbac3](https://github.com/stashed/elasticsearch/commit/c28cbac3) [cherry-pick] Use restic 0.13.1 (#1151) (#1152) + + +### [6.2.4-v17](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v17) + +- [54721c76](https://github.com/stashed/elasticsearch/commit/54721c76) Prepare for release 6.2.4-v17 (#1181) +- [726d1ff6](https://github.com/stashed/elasticsearch/commit/726d1ff6) [cherry-pick] Update nats client to v1.15.0 (#1170) (#1172) +- [7e4fc91a](https://github.com/stashed/elasticsearch/commit/7e4fc91a) Add support for cross-namespace target (#1160) (#1162) +- [5ece0776](https://github.com/stashed/elasticsearch/commit/5ece0776) [cherry-pick] Use restic 0.13.1 (#1151) (#1153) + + +### [6.3.0-v17](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v17) + +- [c65ea376](https://github.com/stashed/elasticsearch/commit/c65ea376) Prepare for release 6.3.0-v17 (#1182) +- [65650751](https://github.com/stashed/elasticsearch/commit/65650751) [cherry-pick] Update nats client to v1.15.0 (#1170) (#1173) +- [9b38d077](https://github.com/stashed/elasticsearch/commit/9b38d077) Add support for cross-namespace target (#1160) (#1163) +- [bed66f42](https://github.com/stashed/elasticsearch/commit/bed66f42) [cherry-pick] Use restic 0.13.1 (#1151) (#1154) + + +### [6.4.0-v17](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v17) + +- [4d4072c3](https://github.com/stashed/elasticsearch/commit/4d4072c3) Prepare for release 6.4.0-v17 (#1183) +- [6def816f](https://github.com/stashed/elasticsearch/commit/6def816f) [cherry-pick] Update nats client to v1.15.0 (#1170) (#1174) +- [13362334](https://github.com/stashed/elasticsearch/commit/13362334) Add support for cross-namespace target (#1160) (#1164) +- [109f5a4a](https://github.com/stashed/elasticsearch/commit/109f5a4a) [cherry-pick] Use restic 0.13.1 (#1151) (#1155) + + +### [6.5.3-v17](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v17) + +- [e422361c](https://github.com/stashed/elasticsearch/commit/e422361c) Prepare for release 6.5.3-v17 (#1184) +- [c3bc2044](https://github.com/stashed/elasticsearch/commit/c3bc2044) [cherry-pick] Update nats client to v1.15.0 (#1170) (#1175) +- [ad39246d](https://github.com/stashed/elasticsearch/commit/ad39246d) Add support for cross-namespace target (#1160) (#1165) +- [94c472f3](https://github.com/stashed/elasticsearch/commit/94c472f3) [cherry-pick] Use restic 0.13.1 (#1151) (#1156) + + +### [6.8.0-v17](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v17) + +- [2a2eccd8](https://github.com/stashed/elasticsearch/commit/2a2eccd8) Prepare for release 6.8.0-v17 (#1185) +- [133e8dfd](https://github.com/stashed/elasticsearch/commit/133e8dfd) [cherry-pick] Update nats client to v1.15.0 (#1170) (#1176) +- [0ddc79b2](https://github.com/stashed/elasticsearch/commit/0ddc79b2) Add support for cross-namespace target (#1160) (#1166) +- [0cc4d57c](https://github.com/stashed/elasticsearch/commit/0cc4d57c) [cherry-pick] Use restic 0.13.1 (#1151) (#1157) + + +### [7.2.0-v17](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v17) + +- [7c388a05](https://github.com/stashed/elasticsearch/commit/7c388a05) Prepare for release 7.2.0-v17 (#1187) +- [f344f507](https://github.com/stashed/elasticsearch/commit/f344f507) [cherry-pick] Update nats client to v1.15.0 (#1170) (#1178) +- [0d8256bf](https://github.com/stashed/elasticsearch/commit/0d8256bf) [cherry-pick] Add support for cross-namespace target (#1160) (#1168) + + +### [7.3.2-v17](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v17) + +- [4f45b187](https://github.com/stashed/elasticsearch/commit/4f45b187) Prepare for release 7.3.2-v17 (#1188) +- [fc8920a7](https://github.com/stashed/elasticsearch/commit/fc8920a7) [cherry-pick] Update nats client to v1.15.0 (#1170) (#1179) +- [fd63fd18](https://github.com/stashed/elasticsearch/commit/fd63fd18) Add support for cross-namespace target (#1160) (#1169) +- [7389d64d](https://github.com/stashed/elasticsearch/commit/7389d64d) [cherry-pick] Use restic 0.13.1 (#1151) (#1159) + + +### [7.14.0-v3](https://github.com/stashed/elasticsearch/releases/tag/7.14.0-v3) + +- [f67cef25](https://github.com/stashed/elasticsearch/commit/f67cef25) Prepare for release 7.14.0-v3 (#1186) +- [3e98ed36](https://github.com/stashed/elasticsearch/commit/3e98ed36) [cherry-pick] Update nats client to v1.15.0 (#1170) (#1177) +- [6b7522e3](https://github.com/stashed/elasticsearch/commit/6b7522e3) Add support for cross-namespace target (#1160) (#1167) +- [8cf47e9f](https://github.com/stashed/elasticsearch/commit/8cf47e9f) [cherry-pick] Use restic 0.13.1 (#1151) (#1158) + + + +## [stashed/enterprise](https://github.com/stashed/enterprise) + +### [v0.20.0](https://github.com/stashed/enterprise/releases/tag/v0.20.0) + +- [b6f3fac2](https://github.com/stashed/enterprise/commit/b6f3fac2) Prepare for release v0.20.0 (#170) +- [180a6360](https://github.com/stashed/enterprise/commit/180a6360) Update nats client to v1.15.0 (#169) +- [a315a1f6](https://github.com/stashed/enterprise/commit/a315a1f6) Support empty target ref (#151) +- [75e07270](https://github.com/stashed/enterprise/commit/75e07270) Fix errors caught in the e2e tests. (#168) +- [c8a574d5](https://github.com/stashed/enterprise/commit/c8a574d5) Add support for cross-namespace target. (#164) +- [94d51f57](https://github.com/stashed/enterprise/commit/94d51f57) Pass TopologySpreadConstraints in ApplyPodRuntimeSettings() +- [f3b333ae](https://github.com/stashed/enterprise/commit/f3b333ae) Update requirements for VolumeSnapshotter (#167) +- [fb63db1d](https://github.com/stashed/enterprise/commit/fb63db1d) Use restic 0.13.1 (#166) +- [97d5e06d](https://github.com/stashed/enterprise/commit/97d5e06d) Update `RoleBinding` name (#165) + + + +## [stashed/etcd](https://github.com/stashed/etcd) + +### [3.5.0-v4](https://github.com/stashed/etcd/releases/tag/3.5.0-v4) + +- [f48c690](https://github.com/stashed/etcd/commit/f48c690) Prepare for release 3.5.0-v4 (#43) +- [119ce00](https://github.com/stashed/etcd/commit/119ce00) [cherry-pick] Update nats client to v1.15.0 (#41) (#42) +- [d17c3e8](https://github.com/stashed/etcd/commit/d17c3e8) Add support for cross-namespace target (#39) (#40) +- [8300c3a](https://github.com/stashed/etcd/commit/8300c3a) [cherry-pick] Use restic 0.13.1 (#37) (#38) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2022.05.12](https://github.com/stashed/installer/releases/tag/v2022.05.12) + +- [5cbe698c](https://github.com/stashed/installer/commit/5cbe698c) Prepare for release v2022.05.12 (#251) +- [046a8f2d](https://github.com/stashed/installer/commit/046a8f2d) Update nats client to v1.15.0 (#250) +- [55b9a5d5](https://github.com/stashed/installer/commit/55b9a5d5) Add catalogs for manifest-backup addon (#248) +- [e07115b2](https://github.com/stashed/installer/commit/e07115b2) Update grafana dashboard to use updated panopticon metrics format (#249) +- [3e7a25f8](https://github.com/stashed/installer/commit/3e7a25f8) Update MetricsConfiguration (#247) +- [13cefa64](https://github.com/stashed/installer/commit/13cefa64) Add `appbbinding-namespace` flag to backup and restore functions (#246) +- [e2900e0f](https://github.com/stashed/installer/commit/e2900e0f) Use restic 0.13.1 (#245) +- [015b099e](https://github.com/stashed/installer/commit/015b099e) Fix ui-server schema (#244) + + + +## [stashed/kubedump](https://github.com/stashed/kubedump) + +### [0.1.0](https://github.com/stashed/kubedump/releases/tag/0.1.0) + +- [7db2e3e](https://github.com/stashed/kubedump/commit/7db2e3e) Prepare for release 0.1.0 (#4) +- [3914bbe](https://github.com/stashed/kubedump/commit/3914bbe) Remove .idea folder +- [08ae97c](https://github.com/stashed/kubedump/commit/08ae97c) Update nats client to v1.15.0 (#3) +- [b742e9b](https://github.com/stashed/kubedump/commit/b742e9b) Use Go 1.18 (#2) +- [0368858](https://github.com/stashed/kubedump/commit/0368858) Merge pull request #1 from stashed/implement-plugin +- [b5b1ae0](https://github.com/stashed/kubedump/commit/b5b1ae0) Fix CI +- [80eb90e](https://github.com/stashed/kubedump/commit/80eb90e) test ci +- [103a512](https://github.com/stashed/kubedump/commit/103a512) test ci +- [5c84f7c](https://github.com/stashed/kubedump/commit/5c84f7c) test ci +- [c00c5d9](https://github.com/stashed/kubedump/commit/c00c5d9) test ci +- [82d7168](https://github.com/stashed/kubedump/commit/82d7168) test ci +- [d550477](https://github.com/stashed/kubedump/commit/d550477) Debug CI failure Signed-off-by: Emruz Hossain +- [143f06b](https://github.com/stashed/kubedump/commit/143f06b) Create kind cluster in ci +- [ce7cdd7](https://github.com/stashed/kubedump/commit/ce7cdd7) Rename components from manifest-backup to kubedump +- [d2a417e](https://github.com/stashed/kubedump/commit/d2a417e) Fix target matcher +- [8c33614](https://github.com/stashed/kubedump/commit/8c33614) Update flags +- [9dbfd9f](https://github.com/stashed/kubedump/commit/9dbfd9f) Finish implementing the plugin +- [103434d](https://github.com/stashed/kubedump/commit/103434d) Refactor code +- [ad144f2](https://github.com/stashed/kubedump/commit/ad144f2) Add appication backup logic +- [8baf9f7](https://github.com/stashed/kubedump/commit/8baf9f7) Implement namespace level backup +- [57a4c48](https://github.com/stashed/kubedump/commit/57a4c48) WIP: Add namespace level backup Signed-off-by: Emruz Hossain +- [a0a61a7](https://github.com/stashed/kubedump/commit/a0a61a7) Implement cluster backup interface +- [18612c3](https://github.com/stashed/kubedump/commit/18612c3) Added all +- [eadc54a](https://github.com/stashed/kubedump/commit/eadc54a) added all +- [c700514](https://github.com/stashed/kubedump/commit/c700514) Implement manifest backup plugin + + + +## [stashed/mariadb](https://github.com/stashed/mariadb) + +### [10.5.8-v10](https://github.com/stashed/mariadb/releases/tag/10.5.8-v10) + +- [38e5f0b](https://github.com/stashed/mariadb/commit/38e5f0b) Prepare for release 10.5.8-v10 (#185) +- [786a415](https://github.com/stashed/mariadb/commit/786a415) [cherry-pick] Update nats client to v1.15.0 (#183) (#184) +- [35c8298](https://github.com/stashed/mariadb/commit/35c8298) Add support for cross-namespace target (#181) (#182) +- [cdd168d](https://github.com/stashed/mariadb/commit/cdd168d) [cherry-pick] Use restic 0.13.1 (#179) (#180) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v16](https://github.com/stashed/mongodb/releases/tag/3.4.17-v16) + +- [0e639f61](https://github.com/stashed/mongodb/commit/0e639f61) Prepare for release 3.4.17-v16 (#1540) +- [fb90dbf0](https://github.com/stashed/mongodb/commit/fb90dbf0) [cherry-pick] Update nats client to v1.15.0 (#1526) (#1527) +- [02f8442b](https://github.com/stashed/mongodb/commit/02f8442b) Add support for cross-namespace target (#1512) (#1513) +- [27aa698b](https://github.com/stashed/mongodb/commit/27aa698b) [cherry-pick] Use restic 0.13.1 (#1499) (#1500) + + +### [3.4.22-v16](https://github.com/stashed/mongodb/releases/tag/3.4.22-v16) + +- [bd347f29](https://github.com/stashed/mongodb/commit/bd347f29) Prepare for release 3.4.22-v16 (#1541) +- [eadd2e6c](https://github.com/stashed/mongodb/commit/eadd2e6c) [cherry-pick] Update nats client to v1.15.0 (#1526) (#1528) +- [039c7147](https://github.com/stashed/mongodb/commit/039c7147) Add support for cross-namespace target (#1512) (#1514) +- [a1f3d87e](https://github.com/stashed/mongodb/commit/a1f3d87e) [cherry-pick] Use restic 0.13.1 (#1499) (#1501) + + +### [3.6.8-v16](https://github.com/stashed/mongodb/releases/tag/3.6.8-v16) + +- [f0fadf84](https://github.com/stashed/mongodb/commit/f0fadf84) Prepare for release 3.6.8-v16 (#1543) +- [786684e1](https://github.com/stashed/mongodb/commit/786684e1) [cherry-pick] Update nats client to v1.15.0 (#1526) (#1530) +- [c662ea7c](https://github.com/stashed/mongodb/commit/c662ea7c) Add support for cross-namespace target (#1512) (#1516) +- [0085bc6b](https://github.com/stashed/mongodb/commit/0085bc6b) [cherry-pick] Use restic 0.13.1 (#1499) (#1503) + + +### [3.6.13-v16](https://github.com/stashed/mongodb/releases/tag/3.6.13-v16) + +- [4113f8e6](https://github.com/stashed/mongodb/commit/4113f8e6) Prepare for release 3.6.13-v16 (#1542) +- [df373044](https://github.com/stashed/mongodb/commit/df373044) [cherry-pick] Update nats client to v1.15.0 (#1526) (#1529) +- [9e453aa4](https://github.com/stashed/mongodb/commit/9e453aa4) Add support for cross-namespace target (#1512) (#1515) +- [2f3c7cdc](https://github.com/stashed/mongodb/commit/2f3c7cdc) [cherry-pick] Use restic 0.13.1 (#1499) (#1502) + + +### [4.0.3-v16](https://github.com/stashed/mongodb/releases/tag/4.0.3-v16) + +- [155311ce](https://github.com/stashed/mongodb/commit/155311ce) Prepare for release 4.0.3-v16 (#1545) +- [b577ae9b](https://github.com/stashed/mongodb/commit/b577ae9b) [cherry-pick] Update nats client to v1.15.0 (#1526) (#1532) +- [9fa69e76](https://github.com/stashed/mongodb/commit/9fa69e76) [cherry-pick] Add support for cross-namespace target (#1512) (#1518) + + +### [4.0.5-v16](https://github.com/stashed/mongodb/releases/tag/4.0.5-v16) + +- [8734aca2](https://github.com/stashed/mongodb/commit/8734aca2) Prepare for release 4.0.5-v16 (#1546) +- [a16532df](https://github.com/stashed/mongodb/commit/a16532df) [cherry-pick] Update nats client to v1.15.0 (#1526) (#1533) +- [db963072](https://github.com/stashed/mongodb/commit/db963072) Add support for cross-namespace target (#1512) (#1519) +- [8efe9034](https://github.com/stashed/mongodb/commit/8efe9034) [cherry-pick] Use restic 0.13.1 (#1499) (#1505) + + +### [4.0.11-v16](https://github.com/stashed/mongodb/releases/tag/4.0.11-v16) + +- [62a11848](https://github.com/stashed/mongodb/commit/62a11848) Prepare for release 4.0.11-v16 (#1544) +- [4c7ce065](https://github.com/stashed/mongodb/commit/4c7ce065) [cherry-pick] Update nats client to v1.15.0 (#1526) (#1531) +- [731a900f](https://github.com/stashed/mongodb/commit/731a900f) Add support for cross-namespace target (#1512) (#1517) +- [d4e7f6df](https://github.com/stashed/mongodb/commit/d4e7f6df) [cherry-pick] Use restic 0.13.1 (#1499) (#1504) + + +### [4.1.4-v16](https://github.com/stashed/mongodb/releases/tag/4.1.4-v16) + +- [e849db61](https://github.com/stashed/mongodb/commit/e849db61) Prepare for release 4.1.4-v16 (#1548) +- [32576241](https://github.com/stashed/mongodb/commit/32576241) [cherry-pick] Update nats client to v1.15.0 (#1526) (#1535) +- [16601091](https://github.com/stashed/mongodb/commit/16601091) Add support for cross-namespace target (#1512) (#1521) +- [c7c78813](https://github.com/stashed/mongodb/commit/c7c78813) [cherry-pick] Use restic 0.13.1 (#1499) (#1507) + + +### [4.1.7-v16](https://github.com/stashed/mongodb/releases/tag/4.1.7-v16) + +- [a4697d1b](https://github.com/stashed/mongodb/commit/a4697d1b) Prepare for release 4.1.7-v16 (#1549) +- [3effe3ec](https://github.com/stashed/mongodb/commit/3effe3ec) [cherry-pick] Update nats client to v1.15.0 (#1526) (#1536) +- [07ea7e1a](https://github.com/stashed/mongodb/commit/07ea7e1a) Add support for cross-namespace target (#1512) (#1522) +- [2495ebb1](https://github.com/stashed/mongodb/commit/2495ebb1) [cherry-pick] Use restic 0.13.1 (#1499) (#1508) + + +### [4.1.13-v16](https://github.com/stashed/mongodb/releases/tag/4.1.13-v16) + +- [b7a7701b](https://github.com/stashed/mongodb/commit/b7a7701b) Prepare for release 4.1.13-v16 (#1547) +- [39a5c0ea](https://github.com/stashed/mongodb/commit/39a5c0ea) [cherry-pick] Update nats client to v1.15.0 (#1526) (#1534) +- [eca54d4d](https://github.com/stashed/mongodb/commit/eca54d4d) Add support for cross-namespace target (#1512) (#1520) +- [7e77a7d1](https://github.com/stashed/mongodb/commit/7e77a7d1) [cherry-pick] Use restic 0.13.1 (#1499) (#1506) + + +### [4.2.3-v16](https://github.com/stashed/mongodb/releases/tag/4.2.3-v16) + +- [8661ee65](https://github.com/stashed/mongodb/commit/8661ee65) Prepare for release 4.2.3-v16 (#1550) +- [612d78ec](https://github.com/stashed/mongodb/commit/612d78ec) [cherry-pick] Update nats client to v1.15.0 (#1526) (#1537) +- [ae60a061](https://github.com/stashed/mongodb/commit/ae60a061) Add support for cross-namespace target (#1512) (#1523) +- [ad4b202b](https://github.com/stashed/mongodb/commit/ad4b202b) [cherry-pick] Use restic 0.13.1 (#1499) (#1509) + + +### [4.4.6-v7](https://github.com/stashed/mongodb/releases/tag/4.4.6-v7) + +- [12d5d20f](https://github.com/stashed/mongodb/commit/12d5d20f) [cherry-pick] Update nats client to v1.15.0 (#1526) (#1538) +- [1d007579](https://github.com/stashed/mongodb/commit/1d007579) Add support for cross-namespace target (#1512) (#1524) +- [d1660f7f](https://github.com/stashed/mongodb/commit/d1660f7f) [cherry-pick] Use restic 0.13.1 (#1499) (#1510) + + +### [5.0.3-v4](https://github.com/stashed/mongodb/releases/tag/5.0.3-v4) + +- [4cf40adb](https://github.com/stashed/mongodb/commit/4cf40adb) [cherry-pick] Update nats client to v1.15.0 (#1526) (#1539) +- [1c739adb](https://github.com/stashed/mongodb/commit/1c739adb) Add support for cross-namespace target (#1512) (#1525) +- [8a6f7fb1](https://github.com/stashed/mongodb/commit/8a6f7fb1) [cherry-pick] Use restic 0.13.1 (#1499) (#1511) +- [5bc21111](https://github.com/stashed/mongodb/commit/5bc21111) Prepare for release 5.0.3-v3 (#1497) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v17](https://github.com/stashed/mysql/releases/tag/5.7.25-v17) + +- [6818869f](https://github.com/stashed/mysql/commit/6818869f) Prepare for release 5.7.25-v17 (#617) +- [73139959](https://github.com/stashed/mysql/commit/73139959) [cherry-pick] Update nats client to v1.15.0 (#612) (#613) +- [f0a6b8e0](https://github.com/stashed/mysql/commit/f0a6b8e0) Add support for cross-namespace target. (#607) (#608) +- [060f151a](https://github.com/stashed/mysql/commit/060f151a) [cherry-pick] Use restic 0.13.1 (#604) (#605) + + +### [8.0.3-v17](https://github.com/stashed/mysql/releases/tag/8.0.3-v17) + +- [9e7d3a11](https://github.com/stashed/mysql/commit/9e7d3a11) Prepare for release 8.0.3-v17 (#620) +- [42ba01a5](https://github.com/stashed/mysql/commit/42ba01a5) [cherry-pick] Update nats client to v1.15.0 (#612) (#616) +- [d8a0eb4e](https://github.com/stashed/mysql/commit/d8a0eb4e) [cherry-pick] Add support for cross-namespace target. (#607) (#611) + + +### [8.0.14-v17](https://github.com/stashed/mysql/releases/tag/8.0.14-v17) + +- [408bad82](https://github.com/stashed/mysql/commit/408bad82) Prepare for release 8.0.14-v17 (#618) +- [27fc0d17](https://github.com/stashed/mysql/commit/27fc0d17) [cherry-pick] Update nats client to v1.15.0 (#612) (#614) +- [3106710c](https://github.com/stashed/mysql/commit/3106710c) Add support for cross-namespace target. (#607) (#609) +- [ea8c60ec](https://github.com/stashed/mysql/commit/ea8c60ec) [cherry-pick] Use restic 0.13.1 (#604) (#606) + + +### [8.0.21-v11](https://github.com/stashed/mysql/releases/tag/8.0.21-v11) + +- [39f458ec](https://github.com/stashed/mysql/commit/39f458ec) Prepare for release 8.0.21-v11 (#619) +- [92ce6a21](https://github.com/stashed/mysql/commit/92ce6a21) [cherry-pick] Update nats client to v1.15.0 (#612) (#615) +- [6ad9564f](https://github.com/stashed/mysql/commit/6ad9564f) [cherry-pick] Add support for cross-namespace target. (#607) (#610) + + + +## [stashed/nats](https://github.com/stashed/nats) + +### [2.6.1-v4](https://github.com/stashed/nats/releases/tag/2.6.1-v4) + +- [6539d98](https://github.com/stashed/nats/commit/6539d98) Prepare for release 2.6.1-v4 (#46) +- [596b907](https://github.com/stashed/nats/commit/596b907) [cherry-pick] Update nats client to v1.15.0 (#44) (#45) +- [2ab3cb0](https://github.com/stashed/nats/commit/2ab3cb0) Add support for cross-namespace target (#42) (#43) +- [e8cc6a4](https://github.com/stashed/nats/commit/e8cc6a4) [cherry-pick] Use restic 0.13.1 (#40) (#41) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-v12](https://github.com/stashed/percona-xtradb/releases/tag/5.7-v12) + +- [fca0f716](https://github.com/stashed/percona-xtradb/commit/fca0f716) Prepare for release 5.7-v12 (#256) +- [3c6c291e](https://github.com/stashed/percona-xtradb/commit/3c6c291e) [cherry-pick] Update nats client to v1.15.0 (#254) (#255) +- [71212215](https://github.com/stashed/percona-xtradb/commit/71212215) Add support for cross-namespace target (#252) (#253) +- [e7a31aea](https://github.com/stashed/percona-xtradb/commit/e7a31aea) [cherry-pick] Use restic 0.13.1 (#250) (#251) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v15](https://github.com/stashed/postgres/releases/tag/9.6.19-v15) + +- [827b4e06](https://github.com/stashed/postgres/commit/827b4e06) Prepare for release 9.6.19-v15 (#1051) +- [b89c3611](https://github.com/stashed/postgres/commit/b89c3611) [cherry-pick] Update nats client to v1.15.0 (#1039) (#1045) +- [59f69a03](https://github.com/stashed/postgres/commit/59f69a03) Add support for cross-namespace target (#1032) (#1038) +- [8b064613](https://github.com/stashed/postgres/commit/8b064613) [cherry-pick] Use restic 0.13.1 (#1027) (#1031) + + +### [10.14-v15](https://github.com/stashed/postgres/releases/tag/10.14-v15) + +- [97bbc626](https://github.com/stashed/postgres/commit/97bbc626) Prepare for release 10.14-v15 (#1046) +- [b8a36039](https://github.com/stashed/postgres/commit/b8a36039) [cherry-pick] Update nats client to v1.15.0 (#1039) (#1040) +- [730ce380](https://github.com/stashed/postgres/commit/730ce380) Add support for cross-namespace target (#1032) (#1033) +- [df8339af](https://github.com/stashed/postgres/commit/df8339af) [cherry-pick] Use restic 0.13.1 (#1027) (#1028) + + +### [11.9-v15](https://github.com/stashed/postgres/releases/tag/11.9-v15) + +- [61dbe6ef](https://github.com/stashed/postgres/commit/61dbe6ef) Prepare for release 11.9-v15 (#1047) +- [20bb0dce](https://github.com/stashed/postgres/commit/20bb0dce) [cherry-pick] Update nats client to v1.15.0 (#1039) (#1041) +- [b450f154](https://github.com/stashed/postgres/commit/b450f154) Add support for cross-namespace target (#1032) (#1034) +- [eef99803](https://github.com/stashed/postgres/commit/eef99803) [cherry-pick] Use restic 0.13.1 (#1027) (#1029) + + +### [12.4-v15](https://github.com/stashed/postgres/releases/tag/12.4-v15) + +- [4055f1b2](https://github.com/stashed/postgres/commit/4055f1b2) Prepare for release 12.4-v15 (#1048) +- [cccf210e](https://github.com/stashed/postgres/commit/cccf210e) [cherry-pick] Update nats client to v1.15.0 (#1039) (#1042) +- [6b106d50](https://github.com/stashed/postgres/commit/6b106d50) Add support for cross-namespace target (#1032) (#1035) +- [26099d08](https://github.com/stashed/postgres/commit/26099d08) [cherry-pick] Use restic 0.13.1 (#1027) (#1030) + + +### [13.1-v12](https://github.com/stashed/postgres/releases/tag/13.1-v12) + +- [6a452173](https://github.com/stashed/postgres/commit/6a452173) Prepare for release 13.1-v12 (#1049) +- [140a00e8](https://github.com/stashed/postgres/commit/140a00e8) [cherry-pick] Update nats client to v1.15.0 (#1039) (#1043) +- [1a7f5854](https://github.com/stashed/postgres/commit/1a7f5854) [cherry-pick] Add support for cross-namespace target (#1032) (#1036) + + +### [14.0-v4](https://github.com/stashed/postgres/releases/tag/14.0-v4) + +- [9b91f298](https://github.com/stashed/postgres/commit/9b91f298) Prepare for release 14.0-v4 (#1050) +- [2afdd9e7](https://github.com/stashed/postgres/commit/2afdd9e7) [cherry-pick] Update nats client to v1.15.0 (#1039) (#1044) +- [196fd0fd](https://github.com/stashed/postgres/commit/196fd0fd) [cherry-pick] Add support for cross-namespace target (#1032) (#1037) + + + +## [stashed/redis](https://github.com/stashed/redis) + +### [5.0.13-v5](https://github.com/stashed/redis/releases/tag/5.0.13-v5) + +- [b3f3395](https://github.com/stashed/redis/commit/b3f3395) Prepare for release 5.0.13-v5 (#103) +- [6d37e9c](https://github.com/stashed/redis/commit/6d37e9c) [cherry-pick] Update nats client to v1.15.0 (#100) (#101) +- [429b312](https://github.com/stashed/redis/commit/429b312) Add support for cross-namespace target (#99) +- [b2af9aa](https://github.com/stashed/redis/commit/b2af9aa) [cherry-pick] Use restic 0.13.1 (#96) (#97) + + +### [6.2.5-v5](https://github.com/stashed/redis/releases/tag/6.2.5-v5) + +- [73c4af8](https://github.com/stashed/redis/commit/73c4af8) Prepare for release 6.2.5-v5 (#104) +- [165f4a3](https://github.com/stashed/redis/commit/165f4a3) [cherry-pick] Update nats client to v1.15.0 (#100) (#102) +- [757f2a7](https://github.com/stashed/redis/commit/757f2a7) Add support for cross-namespace target (#99) +- [b4bfe91](https://github.com/stashed/redis/commit/b4bfe91) [cherry-pick] Use restic 0.13.1 (#96) (#98) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.20.0](https://github.com/stashed/stash/releases/tag/v0.20.0) + +- [6a3680ec](https://github.com/stashed/stash/commit/6a3680ec) Prepare for release v0.20.0 (#1443) +- [a56bfc73](https://github.com/stashed/stash/commit/a56bfc73) Update nats client to v1.15.0 (#1442) +- [2d0b4e97](https://github.com/stashed/stash/commit/2d0b4e97) Port Cross-namespace target support related change from enterprise repo (#1441) +- [4927bcef](https://github.com/stashed/stash/commit/4927bcef) Pass `TopologySpreadConstraints` in `ApplyPodRuntimeSettings()` (#1440) +- [ca8ef3be](https://github.com/stashed/stash/commit/ca8ef3be) Update requirements for `VolumeSnapshotter` +- [93b93361](https://github.com/stashed/stash/commit/93b93361) Update requirements for VolumeSnapshotter +- [82de61a2](https://github.com/stashed/stash/commit/82de61a2) Update RoleBinding name (#1437) +- [2e328b9e](https://github.com/stashed/stash/commit/2e328b9e) Use restic 0.13.1 (#1438) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2022.05.18.md b/content/docs/v2024.12.18/CHANGELOG-v2022.05.18.md new file mode 100644 index 0000000000..01197a8547 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2022.05.18.md @@ -0,0 +1,138 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2022.05.18 + name: Changelog-v2022.05.18 + parent: welcome + weight: 20220518 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2022.05.18/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2022.05.18/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2022.05.18 (2022-05-18) + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.20.1](https://github.com/stashed/apimachinery/releases/tag/v0.20.1) + +- [9d802e3a](https://github.com/stashed/apimachinery/commit/9d802e3a) Make commit + + + +## [stashed/enterprise](https://github.com/stashed/enterprise) + +### [v0.20.1](https://github.com/stashed/enterprise/releases/tag/v0.20.1) + +- [948438a9](https://github.com/stashed/enterprise/commit/948438a9) Prepare for release v0.20.1 (#174) +- [e2fde1aa](https://github.com/stashed/enterprise/commit/e2fde1aa) Fix ImagePullSecrets not passing to the backup job properly (#172) +- [6f871d57](https://github.com/stashed/enterprise/commit/6f871d57) Update BackupConfiguration webhook to make the target immutable (#171) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2022.05.18](https://github.com/stashed/installer/releases/tag/v2022.05.18) + +- [3b45a21b](https://github.com/stashed/installer/commit/3b45a21b) Prepare for release v2022.05.18 (#255) +- [fc961396](https://github.com/stashed/installer/commit/fc961396) Add support for Elasticsearch 8.2.0 (#254) +- [41561f81](https://github.com/stashed/installer/commit/41561f81) Update registry templates to support custom default registry (ghcr.io) + + + +## [stashed/nats](https://github.com/stashed/nats) + +### [2.6.1-v5](https://github.com/stashed/nats/releases/tag/2.6.1-v5) + +- [3fe0e88](https://github.com/stashed/nats/commit/3fe0e88) Prepare for release 2.6.1-v4 (#49) + + +### [2.8.2](https://github.com/stashed/nats/releases/tag/2.8.2) + + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.20.1](https://github.com/stashed/stash/releases/tag/v0.20.1) + +- [9771f5db](https://github.com/stashed/stash/commit/9771f5db) Prepare for release v0.20.1 (#1446) +- [58168343](https://github.com/stashed/stash/commit/58168343) Merge pull request #1445 from stashed/fix-imagepull-secrets +- [d6290dd7](https://github.com/stashed/stash/commit/d6290dd7) Fix ImagePullSecrets not passing to the backup job properly +- [86342a7e](https://github.com/stashed/stash/commit/86342a7e) Update BackupConfiguration webhook to make the target immutable (#1444) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2022.06.21.md b/content/docs/v2024.12.18/CHANGELOG-v2022.06.21.md new file mode 100644 index 0000000000..4d3f2d41a6 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2022.06.21.md @@ -0,0 +1,482 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2022.06.21 + name: Changelog-v2022.06.21 + parent: welcome + weight: 20220621 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2022.06.21/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2022.06.21/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2022.06.21 (2022-06-17) + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.21.0](https://github.com/stashed/apimachinery/releases/tag/v0.21.0) + +- [e19298fd](https://github.com/stashed/apimachinery/commit/e19298fd) Add Hook and TimeOut support in auto-backup (#174) +- [b90c85f4](https://github.com/stashed/apimachinery/commit/b90c85f4) Update to k8s 1.24 toolchain (#172) +- [5d2e9a06](https://github.com/stashed/apimachinery/commit/5d2e9a06) Add timeout for backup and restore (#169) +- [1c812e70](https://github.com/stashed/apimachinery/commit/1c812e70) Update metrics labels to sync with Panopticon. (#170) +- [6891e99a](https://github.com/stashed/apimachinery/commit/6891e99a) Test against Kubernetes 1.24.0 (#171) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.21.0](https://github.com/stashed/cli/releases/tag/v0.21.0) + +- [4942f3ec](https://github.com/stashed/cli/commit/4942f3ec) Prepare for release v0.21.0 (#164) +- [fdd47d95](https://github.com/stashed/cli/commit/fdd47d95) Update to k8s 1.24 toolchain +- [fabefbdd](https://github.com/stashed/cli/commit/fabefbdd) Cancel concurrent in pogress CI runs + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v18](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v18) + +- [f71cc84e](https://github.com/stashed/elasticsearch/commit/f71cc84e) Prepare for release 5.6.4-v18 (#1213) +- [d13474d2](https://github.com/stashed/elasticsearch/commit/d13474d2) Use Go 1.18 (#1203) +- [f942b902](https://github.com/stashed/elasticsearch/commit/f942b902) [cherry-pick] Make sure to fail the backup/restore sessions if license check fails. (#1192) (#1193) + + +### [6.2.4-v18](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v18) + +- [60daf578](https://github.com/stashed/elasticsearch/commit/60daf578) Prepare for release 6.2.4-v18 (#1214) +- [7e107d0d](https://github.com/stashed/elasticsearch/commit/7e107d0d) Use Go 1.18 (#1204) +- [e097a0f7](https://github.com/stashed/elasticsearch/commit/e097a0f7) [cherry-pick] Make sure to fail the backup/restore sessions if license check fails. (#1192) (#1194) + + +### [6.3.0-v18](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v18) + +- [2ab1c09a](https://github.com/stashed/elasticsearch/commit/2ab1c09a) Prepare for release 6.3.0-v18 (#1215) +- [902833b5](https://github.com/stashed/elasticsearch/commit/902833b5) Use Go 1.18 (#1205) +- [9b81f591](https://github.com/stashed/elasticsearch/commit/9b81f591) [cherry-pick] Make sure to fail the backup/restore sessions if license check fails. (#1192) (#1195) + + +### [6.4.0-v18](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v18) + +- [a7c65048](https://github.com/stashed/elasticsearch/commit/a7c65048) Prepare for release 6.4.0-v18 (#1216) +- [95e1e146](https://github.com/stashed/elasticsearch/commit/95e1e146) Use Go 1.18 (#1206) +- [c2127005](https://github.com/stashed/elasticsearch/commit/c2127005) [cherry-pick] Make sure to fail the backup/restore sessions if license check fails. (#1192) (#1196) + + +### [6.5.3-v18](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v18) + +- [08aa5cd0](https://github.com/stashed/elasticsearch/commit/08aa5cd0) Prepare for release 6.5.3-v18 (#1217) +- [39022b9c](https://github.com/stashed/elasticsearch/commit/39022b9c) Use Go 1.18 (#1207) +- [ea839cea](https://github.com/stashed/elasticsearch/commit/ea839cea) [cherry-pick] Make sure to fail the backup/restore sessions if license check fails. (#1192) (#1197) + + +### [6.8.0-v18](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v18) + +- [917089a9](https://github.com/stashed/elasticsearch/commit/917089a9) Prepare for release 6.8.0-v18 (#1218) +- [6cddcce7](https://github.com/stashed/elasticsearch/commit/6cddcce7) Use Go 1.18 (#1208) +- [0b23666b](https://github.com/stashed/elasticsearch/commit/0b23666b) [cherry-pick] Make sure to fail the backup/restore sessions if license check fails. (#1192) (#1198) + + +### [7.2.0-v18](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v18) + +- [9b84e4c5](https://github.com/stashed/elasticsearch/commit/9b84e4c5) Use Go 1.18 (#1210) +- [4bae3459](https://github.com/stashed/elasticsearch/commit/4bae3459) [cherry-pick] Make sure to fail the backup/restore sessions if license check fails. (#1192) (#1200) + + +### [7.3.2-v18](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v18) + +- [6f2b4ece](https://github.com/stashed/elasticsearch/commit/6f2b4ece) Use Go 1.18 (#1212) +- [fb895a65](https://github.com/stashed/elasticsearch/commit/fb895a65) [cherry-pick] Make sure to fail the backup/restore sessions if license check fails. (#1192) (#1201) + + +### [7.14.0-v4](https://github.com/stashed/elasticsearch/releases/tag/7.14.0-v4) + +- [ccd4b478](https://github.com/stashed/elasticsearch/commit/ccd4b478) Stop sending Google analytics events +- [9aaec379](https://github.com/stashed/elasticsearch/commit/9aaec379) Use Go 1.18 (#1209) +- [24eb7559](https://github.com/stashed/elasticsearch/commit/24eb7559) Make sure to fail the backup/restore sessions if license check fails. (#1192) (#1199) + + +### [8.2.0-v1](https://github.com/stashed/elasticsearch/releases/tag/8.2.0-v1) + +- [055cf095](https://github.com/stashed/elasticsearch/commit/055cf095) Use Go 1.18 (#1211) +- [0da3aec9](https://github.com/stashed/elasticsearch/commit/0da3aec9) Make sure to fail the backup/restore sessions if license check fails. (#1192) (#1202) + + + +## [stashed/enterprise](https://github.com/stashed/enterprise) + +### [v0.21.0](https://github.com/stashed/enterprise/releases/tag/v0.21.0) + +- [a6f2dc48](https://github.com/stashed/enterprise/commit/a6f2dc48) Prepare for release v0.21.0 (#179) +- [1da47ae2](https://github.com/stashed/enterprise/commit/1da47ae2) Add support for Hook and TimeOut in auto-backup (#178) +- [92d46877](https://github.com/stashed/enterprise/commit/92d46877) Cleanup dependencies (#177) +- [7124c7f3](https://github.com/stashed/enterprise/commit/7124c7f3) Update to k8s 1.24 toolchain (#176) +- [ba59e128](https://github.com/stashed/enterprise/commit/ba59e128) Add timeout for backup and restore (#173) +- [a51a3725](https://github.com/stashed/enterprise/commit/a51a3725) Check restore output before updating restore status (#175) + + + +## [stashed/etcd](https://github.com/stashed/etcd) + +### [3.5.0-v5](https://github.com/stashed/etcd/releases/tag/3.5.0-v5) + +- [7d96b9b](https://github.com/stashed/etcd/commit/7d96b9b) Prepare for release 3.5.0-v5 (#49) +- [a59967d](https://github.com/stashed/etcd/commit/a59967d) Use Go 1.18 (#48) +- [3d20c8f](https://github.com/stashed/etcd/commit/3d20c8f) Use Go 1.18 (#32) (#47) +- [8705d44](https://github.com/stashed/etcd/commit/8705d44) Make sure to fail the backup/restore sessions if license check fails. (#45) (#46) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2022.06.21](https://github.com/stashed/installer/releases/tag/v2022.06.21) + +- [38ca633b](https://github.com/stashed/installer/commit/38ca633b) Prepare for release v2022.06.21 (#263) +- [6a6c4726](https://github.com/stashed/installer/commit/6a6c4726) Remove stash-metrics from stash chart (#262) +- [32e21c6f](https://github.com/stashed/installer/commit/32e21c6f) Update crds (#261) +- [dd3340dd](https://github.com/stashed/installer/commit/dd3340dd) Don't set tag in values files +- [803d36db](https://github.com/stashed/installer/commit/803d36db) Add RBAC permissions for `coordination.k8s.io/leases` (#260) +- [c0bf346e](https://github.com/stashed/installer/commit/c0bf346e) Rename percona-xtradb to perconaxtradb in catalog.json (#259) +- [5b581a8b](https://github.com/stashed/installer/commit/5b581a8b) Update to k8s 1.24 toolchain +- [0dd58f75](https://github.com/stashed/installer/commit/0dd58f75) Update Grafana dashboard's labels. (#257) +- [b92b8989](https://github.com/stashed/installer/commit/b92b8989) Get operator tag from .Chart.AppVersion (#258) +- [72537db0](https://github.com/stashed/installer/commit/72537db0) Test against Kubernetes 1.24.0 (#256) + + + +## [stashed/kubedump](https://github.com/stashed/kubedump) + +### [0.1.0-v1](https://github.com/stashed/kubedump/releases/tag/0.1.0-v1) + +- [8b71a18](https://github.com/stashed/kubedump/commit/8b71a18) Prepare for release 0.1.0-v1 (#9) +- [d976331](https://github.com/stashed/kubedump/commit/d976331) Go 1.18 (#8) +- [3b2d4f8](https://github.com/stashed/kubedump/commit/3b2d4f8) Make sure to fail the backup/restore sessions if license check fails. (#7) + + + +## [stashed/mariadb](https://github.com/stashed/mariadb) + +### [10.5.8-v11](https://github.com/stashed/mariadb/releases/tag/10.5.8-v11) + +- [75a46ec](https://github.com/stashed/mariadb/commit/75a46ec) Prepare for release 10.5.8-v11 (#190) +- [f105e19](https://github.com/stashed/mariadb/commit/f105e19) Go 1.18 (#189) +- [b825468](https://github.com/stashed/mariadb/commit/b825468) Make sure to fail the backup/restore sessions if license check fails. (#187) (#188) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v17](https://github.com/stashed/mongodb/releases/tag/3.4.17-v17) + +- [da8cc237](https://github.com/stashed/mongodb/commit/da8cc237) Prepare for release 3.4.17-v17 (#1579) +- [7180c291](https://github.com/stashed/mongodb/commit/7180c291) Go 1.18 (#1568) +- [1ca50bd5](https://github.com/stashed/mongodb/commit/1ca50bd5) Make sure to fail the backup/restore sessions if license check fails. (#1554) (#1555) + + +### [3.4.22-v17](https://github.com/stashed/mongodb/releases/tag/3.4.22-v17) + +- [3d2739cf](https://github.com/stashed/mongodb/commit/3d2739cf) Prepare for release 3.4.22-v17 (#1580) +- [2be6391c](https://github.com/stashed/mongodb/commit/2be6391c) Go 1.18 (#1578) +- [fc17eb80](https://github.com/stashed/mongodb/commit/fc17eb80) Make sure to fail the backup/restore sessions if license check fails. (#1554) (#1556) + + +### [3.6.8-v17](https://github.com/stashed/mongodb/releases/tag/3.6.8-v17) + +- [b41ddb46](https://github.com/stashed/mongodb/commit/b41ddb46) Prepare for release 3.6.8-v17 (#1582) +- [0b147350](https://github.com/stashed/mongodb/commit/0b147350) Go 1.18 (#1576) +- [f27ba96e](https://github.com/stashed/mongodb/commit/f27ba96e) Make sure to fail the backup/restore sessions if license check fails. (#1554) (#1558) + + +### [3.6.13-v17](https://github.com/stashed/mongodb/releases/tag/3.6.13-v17) + +- [687f7d8f](https://github.com/stashed/mongodb/commit/687f7d8f) Prepare for release 3.6.13-v17 (#1581) +- [c672503e](https://github.com/stashed/mongodb/commit/c672503e) Go 1.18 (#1577) +- [896889f1](https://github.com/stashed/mongodb/commit/896889f1) Make sure to fail the backup/restore sessions if license check fails. (#1554) (#1557) + + +### [4.0.3-v17](https://github.com/stashed/mongodb/releases/tag/4.0.3-v17) + +- [c0cb607a](https://github.com/stashed/mongodb/commit/c0cb607a) Prepare for release 4.0.3-v17 (#1584) +- [fdabcd75](https://github.com/stashed/mongodb/commit/fdabcd75) Go 1.18 (#1574) +- [c309e641](https://github.com/stashed/mongodb/commit/c309e641) Make sure to fail the backup/restore sessions if license check fails. (#1554) (#1560) + + +### [4.0.5-v17](https://github.com/stashed/mongodb/releases/tag/4.0.5-v17) + +- [f30c6a13](https://github.com/stashed/mongodb/commit/f30c6a13) Prepare for release 4.0.5-v17 (#1585) +- [2ab11e66](https://github.com/stashed/mongodb/commit/2ab11e66) Go 1.18 (#1573) +- [41529a1b](https://github.com/stashed/mongodb/commit/41529a1b) Make sure to fail the backup/restore sessions if license check fails. (#1554) (#1561) + + +### [4.0.11-v17](https://github.com/stashed/mongodb/releases/tag/4.0.11-v17) + +- [b9ea05bd](https://github.com/stashed/mongodb/commit/b9ea05bd) Prepare for release 4.0.11-v17 (#1583) +- [f4984613](https://github.com/stashed/mongodb/commit/f4984613) Go 1.18 (#1575) +- [66fc2e57](https://github.com/stashed/mongodb/commit/66fc2e57) Make sure to fail the backup/restore sessions if license check fails. (#1554) (#1559) + + +### [4.1.4-v17](https://github.com/stashed/mongodb/releases/tag/4.1.4-v17) + +- [4c92d8a3](https://github.com/stashed/mongodb/commit/4c92d8a3) Prepare for release 4.1.4-v17 (#1587) +- [236d7475](https://github.com/stashed/mongodb/commit/236d7475) Go 1.18 (#1571) +- [7ab9f03d](https://github.com/stashed/mongodb/commit/7ab9f03d) Make sure to fail the backup/restore sessions if license check fails. (#1554) (#1563) + + +### [4.1.7-v17](https://github.com/stashed/mongodb/releases/tag/4.1.7-v17) + +- [104d28bd](https://github.com/stashed/mongodb/commit/104d28bd) Prepare for release 4.1.7-v17 (#1588) +- [0a8dbae0](https://github.com/stashed/mongodb/commit/0a8dbae0) Go 1.18 (#1570) +- [6f3d4da7](https://github.com/stashed/mongodb/commit/6f3d4da7) Make sure to fail the backup/restore sessions if license check fails. (#1554) (#1564) + + +### [4.1.13-v17](https://github.com/stashed/mongodb/releases/tag/4.1.13-v17) + +- [252b5708](https://github.com/stashed/mongodb/commit/252b5708) Prepare for release 4.1.13-v17 (#1586) +- [6ffef02c](https://github.com/stashed/mongodb/commit/6ffef02c) Go 1.18 (#1572) +- [a1de60e6](https://github.com/stashed/mongodb/commit/a1de60e6) Make sure to fail the backup/restore sessions if license check fails. (#1554) (#1562) + + +### [4.2.3-v17](https://github.com/stashed/mongodb/releases/tag/4.2.3-v17) + +- [fb5eb455](https://github.com/stashed/mongodb/commit/fb5eb455) Prepare for release 4.2.3-v17 (#1589) +- [730ff66a](https://github.com/stashed/mongodb/commit/730ff66a) Go 1.18 (#1569) +- [820fffd0](https://github.com/stashed/mongodb/commit/820fffd0) Make sure to fail the backup/restore sessions if license check fails. (#1554) (#1565) + + +### [4.4.6-v8](https://github.com/stashed/mongodb/releases/tag/4.4.6-v8) + +- [ba6f8429](https://github.com/stashed/mongodb/commit/ba6f8429) Prepare for release 4.4.6-v8 (#1590) +- [768a40c1](https://github.com/stashed/mongodb/commit/768a40c1) Make sure to fail the backup/restore sessions if license check fails. (#1554) (#1566) + + +### [5.0.3-v5](https://github.com/stashed/mongodb/releases/tag/5.0.3-v5) + +- [40168c44](https://github.com/stashed/mongodb/commit/40168c44) Prepare for release 5.0.3-v5 (#1591) +- [78999c9e](https://github.com/stashed/mongodb/commit/78999c9e) Make sure to fail the backup/restore sessions if license check fails. (#1554) (#1567) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v18](https://github.com/stashed/mysql/releases/tag/5.7.25-v18) + +- [6788bc23](https://github.com/stashed/mysql/commit/6788bc23) Prepare for release 5.7.25-v18 (#633) +- [bf7bb0bc](https://github.com/stashed/mysql/commit/bf7bb0bc) [cherry-pick] Use Go 1.18 (#629) +- [6fca045a](https://github.com/stashed/mysql/commit/6fca045a) Make sure to fail the backup/restore sessions if license check fails. (#622) (#623) + + +### [8.0.3-v18](https://github.com/stashed/mysql/releases/tag/8.0.3-v18) + +- [00a92f31](https://github.com/stashed/mysql/commit/00a92f31) Prepare for release 8.0.3-v18 (#636) +- [071a7d3f](https://github.com/stashed/mysql/commit/071a7d3f) [cherry-pick] Use Go 1.18 (#632) +- [d5b5a0b3](https://github.com/stashed/mysql/commit/d5b5a0b3) Use restic 0.13.1 (#604) (#627) +- [881b2a0e](https://github.com/stashed/mysql/commit/881b2a0e) Make sure to fail the backup/restore sessions if license check fails. (#622) (#626) + + +### [8.0.14-v18](https://github.com/stashed/mysql/releases/tag/8.0.14-v18) + +- [0b2d6ec7](https://github.com/stashed/mysql/commit/0b2d6ec7) Prepare for release 8.0.14-v18 (#634) +- [e0034276](https://github.com/stashed/mysql/commit/e0034276) [cherry-pick] Use Go 1.18 (#630) +- [afae11d3](https://github.com/stashed/mysql/commit/afae11d3) Make sure to fail the backup/restore sessions if license check fails. (#622) (#624) + + +### [8.0.21-v12](https://github.com/stashed/mysql/releases/tag/8.0.21-v12) + +- [c2d3d592](https://github.com/stashed/mysql/commit/c2d3d592) Prepare for release 8.0.21-v12 (#635) +- [4f532409](https://github.com/stashed/mysql/commit/4f532409) [cherry-pick] Use Go 1.18 (#631) +- [b8a3b870](https://github.com/stashed/mysql/commit/b8a3b870) Use restic 0.13.1 (#604) (#628) +- [b045519d](https://github.com/stashed/mysql/commit/b045519d) Make sure to fail the backup/restore sessions if license check fails. (#622) (#625) + + + +## [stashed/nats](https://github.com/stashed/nats) + +### [2.6.1-v6](https://github.com/stashed/nats/releases/tag/2.6.1-v6) + +- [45e3eb5](https://github.com/stashed/nats/commit/45e3eb5) Prepare for release 2.6.1-v5 (#57) +- [918fba8](https://github.com/stashed/nats/commit/918fba8) [cherry-pick] Use Go 1.18 (#55) +- [d895e5b](https://github.com/stashed/nats/commit/d895e5b) Make sure to fail the backup/restore sessions if license check fails. (#52) (#53) + + +### [2.8.2-v1](https://github.com/stashed/nats/releases/tag/2.8.2-v1) + +- [b2540f1](https://github.com/stashed/nats/commit/b2540f1) Prepare for release 2.8.2-v1 (#58) +- [f462469](https://github.com/stashed/nats/commit/f462469) [cherry-pick] Use Go 1.18 (#56) +- [bb05983](https://github.com/stashed/nats/commit/bb05983) Make sure to fail the backup/restore sessions if license check fails. (#52) (#54) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-v13](https://github.com/stashed/percona-xtradb/releases/tag/5.7-v13) + +- [e02373e5](https://github.com/stashed/percona-xtradb/commit/e02373e5) Prepare for release 5.7-v13 (#261) +- [fc1a4395](https://github.com/stashed/percona-xtradb/commit/fc1a4395) [cherry-pick] Use Go 1.18 (#260) +- [e33797e5](https://github.com/stashed/percona-xtradb/commit/e33797e5) Make sure to fail the backup/restore sessions if license check fails. (#258) (#259) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v16](https://github.com/stashed/postgres/releases/tag/9.6.19-v16) + +- [1db055d0](https://github.com/stashed/postgres/commit/1db055d0) Prepare for release 9.6.19-v16 (#1074) +- [f245c188](https://github.com/stashed/postgres/commit/f245c188) [cherry-pick] Use Go 1.18 (#1068) +- [df3de5f4](https://github.com/stashed/postgres/commit/df3de5f4) Make sure to fail the backup/restore sessions if license check fails. (#1053) (#1059) + + +### [10.14-v16](https://github.com/stashed/postgres/releases/tag/10.14-v16) + +- [7a6cca43](https://github.com/stashed/postgres/commit/7a6cca43) Prepare for release 10.14-v16 (#1069) +- [5e1d6ba6](https://github.com/stashed/postgres/commit/5e1d6ba6) [cherry-pick] Use Go 1.18 (#1063) +- [a8548d33](https://github.com/stashed/postgres/commit/a8548d33) Make sure to fail the backup/restore sessions if license check fails. (#1053) (#1054) + + +### [11.9-v16](https://github.com/stashed/postgres/releases/tag/11.9-v16) + +- [ade2cb88](https://github.com/stashed/postgres/commit/ade2cb88) Prepare for release 11.9-v16 (#1070) +- [f02ceab3](https://github.com/stashed/postgres/commit/f02ceab3) [cherry-pick] Use Go 1.18 (#1064) +- [47293bab](https://github.com/stashed/postgres/commit/47293bab) Make sure to fail the backup/restore sessions if license check fails. (#1053) (#1055) + + +### [12.4-v16](https://github.com/stashed/postgres/releases/tag/12.4-v16) + +- [a632d377](https://github.com/stashed/postgres/commit/a632d377) Prepare for release 12.4-v16 (#1071) +- [bcca56e6](https://github.com/stashed/postgres/commit/bcca56e6) [cherry-pick] Use Go 1.18 (#1065) +- [ba595303](https://github.com/stashed/postgres/commit/ba595303) Make sure to fail the backup/restore sessions if license check fails. (#1053) (#1056) + + +### [13.1-v13](https://github.com/stashed/postgres/releases/tag/13.1-v13) + +- [61861efc](https://github.com/stashed/postgres/commit/61861efc) Prepare for release 13.1-v13 (#1072) +- [b3bba6a9](https://github.com/stashed/postgres/commit/b3bba6a9) [cherry-pick] Use Go 1.18 (#1066) +- [051ce90c](https://github.com/stashed/postgres/commit/051ce90c) Use restic 0.13.1 (#1027) (#1061) +- [b7fc16da](https://github.com/stashed/postgres/commit/b7fc16da) Make sure to fail the backup/restore sessions if license check fails. (#1053) (#1057) + + +### [14.0-v5](https://github.com/stashed/postgres/releases/tag/14.0-v5) + +- [1fba7100](https://github.com/stashed/postgres/commit/1fba7100) Prepare for release 14.0-v5 (#1073) +- [a4d857ef](https://github.com/stashed/postgres/commit/a4d857ef) [cherry-pick] Use Go 1.18 (#1067) +- [b90b5890](https://github.com/stashed/postgres/commit/b90b5890) Use restic 0.13.1 (#1027) (#1060) +- [4638c6e1](https://github.com/stashed/postgres/commit/4638c6e1) Make sure to fail the backup/restore sessions if license check fails. (#1053) (#1058) + + + +## [stashed/redis](https://github.com/stashed/redis) + +### [5.0.13-v6](https://github.com/stashed/redis/releases/tag/5.0.13-v6) + +- [2d26534](https://github.com/stashed/redis/commit/2d26534) Prepare for release 5.0.13-v6 (#113) +- [1ca8f25](https://github.com/stashed/redis/commit/1ca8f25) [cherry-pick] Use Go 1.18 (#111) +- [51ff930](https://github.com/stashed/redis/commit/51ff930) Make sure to fail the backup/restore sessions if license check fails. (#106) (#107) + + +### [6.2.5-v6](https://github.com/stashed/redis/releases/tag/6.2.5-v6) + +- [e9528e1](https://github.com/stashed/redis/commit/e9528e1) Prepare for release 6.2.5-v6 (#114) +- [d565078](https://github.com/stashed/redis/commit/d565078) [cherry-pick] Use Go 1.18 (#112) +- [e7bb8c9](https://github.com/stashed/redis/commit/e7bb8c9) Make sure to fail the backup/restore sessions if license check fails. (#106) (#108) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.21.0](https://github.com/stashed/stash/releases/tag/v0.21.0) + +- [76df41cc](https://github.com/stashed/stash/commit/76df41cc) Prepare for release v0.21.0 (#1453) +- [e1bae66f](https://github.com/stashed/stash/commit/e1bae66f) Add RBAC permissions for `coordination.k8s.io/leases` +- [df9553d0](https://github.com/stashed/stash/commit/df9553d0) Add RBAC permissions for `coordination.k8s.io/leases` +- [846d952f](https://github.com/stashed/stash/commit/846d952f) Fix linter warning +- [6e5fd706](https://github.com/stashed/stash/commit/6e5fd706) Clean up dependencies (#1451) +- [4b6dd4eb](https://github.com/stashed/stash/commit/4b6dd4eb) Use github.com/imdario/mergo@v0.3.5 +- [f2109b78](https://github.com/stashed/stash/commit/f2109b78) Update to k8s 1.24 toolchain (#1450) +- [33073c9b](https://github.com/stashed/stash/commit/33073c9b) Add timeout for backup and restore (#1449) +- [49926ef1](https://github.com/stashed/stash/commit/49926ef1) Check if restore output is nil before updating restore status (#1448) +- [a9ce58ed](https://github.com/stashed/stash/commit/a9ce58ed) Test against Kubernetes 1.24.0 (#1447) + + + +## [stashed/ui-server](https://github.com/stashed/ui-server) + +### [v0.3.0](https://github.com/stashed/ui-server/releases/tag/v0.3.0) + +- [dbe1690](https://github.com/stashed/ui-server/commit/dbe1690) Prepare for release v0.3.0 (#14) +- [ccb5f80](https://github.com/stashed/ui-server/commit/ccb5f80) Use k8s 1.24 tool chain + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2022.06.27.md b/content/docs/v2024.12.18/CHANGELOG-v2022.06.27.md new file mode 100644 index 0000000000..d73b47cce6 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2022.06.27.md @@ -0,0 +1,196 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2022.06.27 + name: Changelog-v2022.06.27 + parent: welcome + weight: 20220627 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2022.06.27/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2022.06.27/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2022.06.27 (2022-06-27) + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2022.06.27](https://github.com/stashed/installer/releases/tag/v2022.06.27) + +- [e8a6472b](https://github.com/stashed/installer/commit/e8a6472b) Prepare for release v2022.06.27 (#265) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v18](https://github.com/stashed/mongodb/releases/tag/3.4.17-v18) + +- [aff82bdd](https://github.com/stashed/mongodb/commit/aff82bdd) [cherry-pick] Fix license checking error. (#1593) (#1594) + + +### [3.4.22-v18](https://github.com/stashed/mongodb/releases/tag/3.4.22-v18) + +- [789d9b33](https://github.com/stashed/mongodb/commit/789d9b33) [cherry-pick] Fix license checking error. (#1593) (#1595) + + +### [3.6.8-v18](https://github.com/stashed/mongodb/releases/tag/3.6.8-v18) + +- [97a59fcf](https://github.com/stashed/mongodb/commit/97a59fcf) [cherry-pick] Fix license checking error. (#1593) (#1597) + + +### [3.6.13-v18](https://github.com/stashed/mongodb/releases/tag/3.6.13-v18) + +- [9a5ffacb](https://github.com/stashed/mongodb/commit/9a5ffacb) [cherry-pick] Fix license checking error. (#1593) (#1596) + + +### [4.0.3-v18](https://github.com/stashed/mongodb/releases/tag/4.0.3-v18) + +- [c8873280](https://github.com/stashed/mongodb/commit/c8873280) [cherry-pick] Fix license checking error. (#1593) (#1599) + + +### [4.0.5-v18](https://github.com/stashed/mongodb/releases/tag/4.0.5-v18) + +- [49ed6399](https://github.com/stashed/mongodb/commit/49ed6399) [cherry-pick] Fix license checking error. (#1593) (#1600) + + +### [4.0.11-v18](https://github.com/stashed/mongodb/releases/tag/4.0.11-v18) + +- [368ef71b](https://github.com/stashed/mongodb/commit/368ef71b) [cherry-pick] Fix license checking error. (#1593) (#1598) + + +### [4.1.4-v18](https://github.com/stashed/mongodb/releases/tag/4.1.4-v18) + +- [f8b92ad8](https://github.com/stashed/mongodb/commit/f8b92ad8) [cherry-pick] Fix license checking error. (#1593) (#1602) + + +### [4.1.7-v18](https://github.com/stashed/mongodb/releases/tag/4.1.7-v18) + +- [199e37cd](https://github.com/stashed/mongodb/commit/199e37cd) [cherry-pick] Fix license checking error. (#1593) (#1603) + + +### [4.1.13-v18](https://github.com/stashed/mongodb/releases/tag/4.1.13-v18) + +- [f3eacd9f](https://github.com/stashed/mongodb/commit/f3eacd9f) [cherry-pick] Fix license checking error. (#1593) (#1601) + + +### [4.2.3-v18](https://github.com/stashed/mongodb/releases/tag/4.2.3-v18) + +- [15bc3f6b](https://github.com/stashed/mongodb/commit/15bc3f6b) [cherry-pick] Fix license checking error. (#1593) (#1604) + + +### [4.4.6-v9](https://github.com/stashed/mongodb/releases/tag/4.4.6-v9) + +- [710a47ca](https://github.com/stashed/mongodb/commit/710a47ca) [cherry-pick] Fix license checking error. (#1593) (#1605) + + +### [5.0.3-v6](https://github.com/stashed/mongodb/releases/tag/5.0.3-v6) + +- [fa9cb3cb](https://github.com/stashed/mongodb/commit/fa9cb3cb) [cherry-pick] Fix license checking error. (#1593) (#1606) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v17](https://github.com/stashed/postgres/releases/tag/9.6.19-v17) + +- [9ec2f296](https://github.com/stashed/postgres/commit/9ec2f296) [cherry-pick] Fix license checking error. (#1077) (#1083) + + +### [10.14-v17](https://github.com/stashed/postgres/releases/tag/10.14-v17) + +- [dc2b85ce](https://github.com/stashed/postgres/commit/dc2b85ce) [cherry-pick] Fix license checking error. (#1077) (#1078) + + +### [11.9-v17](https://github.com/stashed/postgres/releases/tag/11.9-v17) + +- [ab3747db](https://github.com/stashed/postgres/commit/ab3747db) [cherry-pick] Fix license checking error. (#1077) (#1079) + + +### [12.4-v17](https://github.com/stashed/postgres/releases/tag/12.4-v17) + +- [9d5645cd](https://github.com/stashed/postgres/commit/9d5645cd) [cherry-pick] Fix license checking error. (#1077) (#1080) + + +### [13.1-v14](https://github.com/stashed/postgres/releases/tag/13.1-v14) + +- [9cafed82](https://github.com/stashed/postgres/commit/9cafed82) [cherry-pick] Fix license checking error. (#1077) (#1081) + + +### [14.0-v6](https://github.com/stashed/postgres/releases/tag/14.0-v6) + +- [093044d7](https://github.com/stashed/postgres/commit/093044d7) [cherry-pick] Fix license checking error. (#1077) (#1082) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2022.07.09.md b/content/docs/v2024.12.18/CHANGELOG-v2022.07.09.md new file mode 100644 index 0000000000..8be942bd65 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2022.07.09.md @@ -0,0 +1,141 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2022.07.09 + name: Changelog-v2022.07.09 + parent: welcome + weight: 20220709 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2022.07.09/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2022.07.09/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2022.07.09 (2022-07-09) + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.22.0](https://github.com/stashed/apimachinery/releases/tag/v0.22.0) + +- [0d8b4a6b](https://github.com/stashed/apimachinery/commit/0d8b4a6b) Don't mark session phase completed until all step executes (#176) +- [eda5d7b6](https://github.com/stashed/apimachinery/commit/eda5d7b6) Add `executionPolicy` for controlling Hook execution (#175) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.22.0](https://github.com/stashed/cli/releases/tag/v0.22.0) + +- [48205e7b](https://github.com/stashed/cli/commit/48205e7b) Prepare for release v0.22.0 (#165) + + + +## [stashed/enterprise](https://github.com/stashed/enterprise) + +### [v0.22.0](https://github.com/stashed/enterprise/releases/tag/v0.22.0) + +- [22673dec](https://github.com/stashed/enterprise/commit/22673dec) Prepare for release v0.22.0 (#183) +- [d0c08788](https://github.com/stashed/enterprise/commit/d0c08788) Add support for hook executionPolicy (#181) +- [d183ca59](https://github.com/stashed/enterprise/commit/d183ca59) Add RBAC permissions for finalizers (#182) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2022.07.09](https://github.com/stashed/installer/releases/tag/v2022.07.09) + +- [6516d4a2](https://github.com/stashed/installer/commit/6516d4a2) Prepare for release v2022.07.09 (#268) +- [72439121](https://github.com/stashed/installer/commit/72439121) Add RBAC permissions for finalizers (#267) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.22.0](https://github.com/stashed/stash/releases/tag/v0.22.0) + +- [b7f17c08](https://github.com/stashed/stash/commit/b7f17c08) Prepare for release v0.22.0 (#1459) +- [98d35685](https://github.com/stashed/stash/commit/98d35685) Add support for hook executionPolicy (#1457) +- [85d6c506](https://github.com/stashed/stash/commit/85d6c506) Add RBAC permissions for finalizers (#1458) + + + +## [stashed/ui-server](https://github.com/stashed/ui-server) + +### [v0.4.0](https://github.com/stashed/ui-server/releases/tag/v0.4.0) + +- [fe19a0f](https://github.com/stashed/ui-server/commit/fe19a0f) Prepare for release v0.4.0 (#15) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2022.09.29.md b/content/docs/v2024.12.18/CHANGELOG-v2022.09.29.md new file mode 100644 index 0000000000..a6d33e325a --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2022.09.29.md @@ -0,0 +1,609 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2022.09.29 + name: Changelog-v2022.09.29 + parent: welcome + weight: 20220929 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2022.09.29/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2022.09.29/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2022.09.29 (2022-09-26) + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.23.0](https://github.com/stashed/apimachinery/releases/tag/v0.23.0) + +- [92b9a652](https://github.com/stashed/apimachinery/commit/92b9a652) Add backup retry helpers + use `metav1.Duration` for `TimeOut` (#188) +- [a5ba7404](https://github.com/stashed/apimachinery/commit/a5ba7404) Revert to restic 0.13.1 (#190) +- [8821fa34](https://github.com/stashed/apimachinery/commit/8821fa34) Test against Kubernetes 1.25.0 (#189) +- [6b79486c](https://github.com/stashed/apimachinery/commit/6b79486c) Fix RestoreSession phase calculation (#187) +- [cb39527c](https://github.com/stashed/apimachinery/commit/cb39527c) Add re-try logic for failed backup session (#182) +- [b8925184](https://github.com/stashed/apimachinery/commit/b8925184) Check for CronJob/VolumeSnapshot version only once (#186) +- [a3b5eb90](https://github.com/stashed/apimachinery/commit/a3b5eb90) Remove slack link +- [40ce6cb2](https://github.com/stashed/apimachinery/commit/40ce6cb2) Handle status conversion for CronJob/VolumeSnapshot (#185) +- [55dff331](https://github.com/stashed/apimachinery/commit/55dff331) Use restic 0.14.0 (#184) +- [522f4e18](https://github.com/stashed/apimachinery/commit/522f4e18) Use k8s 1.25.1 libs (#183) +- [a68816b4](https://github.com/stashed/apimachinery/commit/a68816b4) Acquire license from license-proxyserver if available (#181) +- [f76f80b6](https://github.com/stashed/apimachinery/commit/f76f80b6) Fix namespace defaulting in restore target ref (#180) +- [ffd3a856](https://github.com/stashed/apimachinery/commit/ffd3a856) Make PostBackupHook and PostRestoreHook pointer to avoid defaulting (#179) +- [2e6ad371](https://github.com/stashed/apimachinery/commit/2e6ad371) Add target related constants + re-organize constants (#177) +- [c8f94328](https://github.com/stashed/apimachinery/commit/c8f94328) Fix issue in sending backupsession and restoresession success metrics. (#178) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.23.0](https://github.com/stashed/cli/releases/tag/v0.23.0) + +- [55cd97a6](https://github.com/stashed/cli/commit/55cd97a6) Prepare for release v0.23.0 (#171) +- [c6df635c](https://github.com/stashed/cli/commit/c6df635c) Revert to restic 0.13.1 (#170) +- [b522f73f](https://github.com/stashed/cli/commit/b522f73f) Use restic 0.14.0 (#169) +- [b03af4b2](https://github.com/stashed/cli/commit/b03af4b2) Use k8s 1.25.1 libs (#168) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v19](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v19) + +- [966a449b](https://github.com/stashed/elasticsearch/commit/966a449b) Prepare for release 5.6.4-v19 (#1268) +- [69530abc](https://github.com/stashed/elasticsearch/commit/69530abc) [cherry-pick] Revert to restic 0.13.1 (#1257) (#1258) +- [5202ddcf](https://github.com/stashed/elasticsearch/commit/5202ddcf) [cherry-pick] Use restic 0.14.0 (#1246) (#1247) +- [831f0550](https://github.com/stashed/elasticsearch/commit/831f0550) [cherry-pick] Use k8s 1.25.1 libs (#1235) (#1236) +- [c310969d](https://github.com/stashed/elasticsearch/commit/c310969d) [cherry-pick] Acquire license from license-proxyserver if available (#1224) (#1225) + + +### [6.2.4-v19](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v19) + +- [6ba65875](https://github.com/stashed/elasticsearch/commit/6ba65875) Prepare for release 6.2.4-v19 (#1269) +- [de0252b1](https://github.com/stashed/elasticsearch/commit/de0252b1) [cherry-pick] Revert to restic 0.13.1 (#1257) (#1259) +- [4ca1fe5d](https://github.com/stashed/elasticsearch/commit/4ca1fe5d) [cherry-pick] Use restic 0.14.0 (#1246) (#1248) +- [3cb020f6](https://github.com/stashed/elasticsearch/commit/3cb020f6) [cherry-pick] Use k8s 1.25.1 libs (#1235) (#1237) +- [e6a3931e](https://github.com/stashed/elasticsearch/commit/e6a3931e) [cherry-pick] Acquire license from license-proxyserver if available (#1224) (#1226) + + +### [6.3.0-v19](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v19) + +- [35be503d](https://github.com/stashed/elasticsearch/commit/35be503d) Prepare for release 6.3.0-v19 (#1270) +- [a83a0f92](https://github.com/stashed/elasticsearch/commit/a83a0f92) [cherry-pick] Revert to restic 0.13.1 (#1257) (#1260) +- [4fc1c5ea](https://github.com/stashed/elasticsearch/commit/4fc1c5ea) [cherry-pick] Use restic 0.14.0 (#1246) (#1249) +- [f5f6bd25](https://github.com/stashed/elasticsearch/commit/f5f6bd25) [cherry-pick] Use k8s 1.25.1 libs (#1235) (#1238) +- [3fb18e38](https://github.com/stashed/elasticsearch/commit/3fb18e38) [cherry-pick] Acquire license from license-proxyserver if available (#1224) (#1227) + + +### [6.4.0-v19](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v19) + +- [bb078f5b](https://github.com/stashed/elasticsearch/commit/bb078f5b) Prepare for release 6.4.0-v19 (#1271) +- [3326965e](https://github.com/stashed/elasticsearch/commit/3326965e) [cherry-pick] Revert to restic 0.13.1 (#1257) (#1261) +- [7a38f82a](https://github.com/stashed/elasticsearch/commit/7a38f82a) [cherry-pick] Use restic 0.14.0 (#1246) (#1250) +- [4c080247](https://github.com/stashed/elasticsearch/commit/4c080247) [cherry-pick] Use k8s 1.25.1 libs (#1235) (#1239) +- [a0a65026](https://github.com/stashed/elasticsearch/commit/a0a65026) [cherry-pick] Acquire license from license-proxyserver if available (#1224) (#1228) + + +### [6.5.3-v19](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v19) + +- [7a026075](https://github.com/stashed/elasticsearch/commit/7a026075) Prepare for release 6.5.3-v19 (#1272) +- [75e486af](https://github.com/stashed/elasticsearch/commit/75e486af) [cherry-pick] Revert to restic 0.13.1 (#1257) (#1262) +- [cb9bd0fa](https://github.com/stashed/elasticsearch/commit/cb9bd0fa) [cherry-pick] Use restic 0.14.0 (#1246) (#1251) +- [150cf448](https://github.com/stashed/elasticsearch/commit/150cf448) [cherry-pick] Use k8s 1.25.1 libs (#1235) (#1240) +- [60dbba03](https://github.com/stashed/elasticsearch/commit/60dbba03) [cherry-pick] Acquire license from license-proxyserver if available (#1224) (#1229) + + +### [6.8.0-v19](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v19) + +- [d158623c](https://github.com/stashed/elasticsearch/commit/d158623c) Prepare for release 6.8.0-v19 (#1273) +- [918b5f8f](https://github.com/stashed/elasticsearch/commit/918b5f8f) [cherry-pick] Revert to restic 0.13.1 (#1257) (#1263) +- [350384af](https://github.com/stashed/elasticsearch/commit/350384af) [cherry-pick] Use restic 0.14.0 (#1246) (#1252) +- [61d07df4](https://github.com/stashed/elasticsearch/commit/61d07df4) [cherry-pick] Use k8s 1.25.1 libs (#1235) (#1241) +- [dab04aa8](https://github.com/stashed/elasticsearch/commit/dab04aa8) [cherry-pick] Acquire license from license-proxyserver if available (#1224) (#1230) + + +### [7.2.0-v19](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v19) + +- [b5b166a1](https://github.com/stashed/elasticsearch/commit/b5b166a1) Prepare for release 7.2.0-v19 (#1275) +- [ac13c36b](https://github.com/stashed/elasticsearch/commit/ac13c36b) [cherry-pick] Revert to restic 0.13.1 (#1257) (#1265) +- [7aa291c7](https://github.com/stashed/elasticsearch/commit/7aa291c7) [cherry-pick] Use restic 0.14.0 (#1246) (#1254) +- [4240c297](https://github.com/stashed/elasticsearch/commit/4240c297) [cherry-pick] Use k8s 1.25.1 libs (#1235) (#1243) +- [e32f9641](https://github.com/stashed/elasticsearch/commit/e32f9641) [cherry-pick] Acquire license from license-proxyserver if available (#1224) (#1232) +- [9ed8203d](https://github.com/stashed/elasticsearch/commit/9ed8203d) Prepare for release 7.2.0-v18 (#1220) + + +### [7.3.2-v19](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v19) + +- [27366a89](https://github.com/stashed/elasticsearch/commit/27366a89) Prepare for release 7.3.2-v19 (#1276) +- [20f7d0c0](https://github.com/stashed/elasticsearch/commit/20f7d0c0) [cherry-pick] Revert to restic 0.13.1 (#1257) (#1266) +- [9051b5e8](https://github.com/stashed/elasticsearch/commit/9051b5e8) [cherry-pick] Use restic 0.14.0 (#1246) (#1255) +- [3af9b3c9](https://github.com/stashed/elasticsearch/commit/3af9b3c9) [cherry-pick] Use k8s 1.25.1 libs (#1235) (#1244) +- [b866149e](https://github.com/stashed/elasticsearch/commit/b866149e) [cherry-pick] Acquire license from license-proxyserver if available (#1224) (#1233) +- [6d92e35f](https://github.com/stashed/elasticsearch/commit/6d92e35f) Prepare for release 7.3.2-v18 (#1221) + + +### [7.14.0-v5](https://github.com/stashed/elasticsearch/releases/tag/7.14.0-v5) + +- [c0f3296c](https://github.com/stashed/elasticsearch/commit/c0f3296c) Prepare for release 7.14.0-v5 (#1274) +- [fe1ba0d3](https://github.com/stashed/elasticsearch/commit/fe1ba0d3) [cherry-pick] Revert to restic 0.13.1 (#1257) (#1264) +- [d1735e73](https://github.com/stashed/elasticsearch/commit/d1735e73) [cherry-pick] Use restic 0.14.0 (#1246) (#1253) +- [19670067](https://github.com/stashed/elasticsearch/commit/19670067) [cherry-pick] Use k8s 1.25.1 libs (#1235) (#1242) +- [2759db09](https://github.com/stashed/elasticsearch/commit/2759db09) [cherry-pick] Acquire license from license-proxyserver if available (#1224) (#1231) +- [49ba85f7](https://github.com/stashed/elasticsearch/commit/49ba85f7) Prepare for release 7.14.0-v4 (#1219) + + +### [8.2.0-v2](https://github.com/stashed/elasticsearch/releases/tag/8.2.0-v2) + +- [0c1ae9ff](https://github.com/stashed/elasticsearch/commit/0c1ae9ff) Prepare for release 8.2.0-v2 (#1277) +- [1c020913](https://github.com/stashed/elasticsearch/commit/1c020913) [cherry-pick] Revert to restic 0.13.1 (#1257) (#1267) +- [fc81884f](https://github.com/stashed/elasticsearch/commit/fc81884f) [cherry-pick] Use restic 0.14.0 (#1246) (#1256) +- [7689cccc](https://github.com/stashed/elasticsearch/commit/7689cccc) [cherry-pick] Use k8s 1.25.1 libs (#1235) (#1245) +- [5d5cbcd3](https://github.com/stashed/elasticsearch/commit/5d5cbcd3) [cherry-pick] Acquire license from license-proxyserver if available (#1224) (#1234) +- [e3026385](https://github.com/stashed/elasticsearch/commit/e3026385) Prepare for release 8.2.0-v1 (#1222) + + + +## [stashed/enterprise](https://github.com/stashed/enterprise) + +### [v0.23.0](https://github.com/stashed/enterprise/releases/tag/v0.23.0) + +- [4cb35fb1](https://github.com/stashed/enterprise/commit/4cb35fb1) Prepare for release v0.23.0 (#205) +- [88cf38fc](https://github.com/stashed/enterprise/commit/88cf38fc) Implement retry logic for failed backup + use `metav1.Duration` for `TimeOut` (#204) +- [3951fa2c](https://github.com/stashed/enterprise/commit/3951fa2c) Revert to restic 0.13.1 (#203) +- [81ec3c07](https://github.com/stashed/enterprise/commit/81ec3c07) Refactor codebase (#195) +- [ca228c24](https://github.com/stashed/enterprise/commit/ca228c24) Validate `TimeOut` field in Backup and Restore (#202) +- [657982b5](https://github.com/stashed/enterprise/commit/657982b5) Fix unit tests +- [a348041f](https://github.com/stashed/enterprise/commit/a348041f) Check for CronJob/VolumeSnapshot version only once (#201) +- [a5550bb0](https://github.com/stashed/enterprise/commit/a5550bb0) Handle CronJob api type dynamically (#200) +- [79ba1c50](https://github.com/stashed/enterprise/commit/79ba1c50) Handle status conversion for CronJob/VolumeSnapshot (#199) +- [521b7e4e](https://github.com/stashed/enterprise/commit/521b7e4e) Use restic 0.14.0 (#198) +- [60b48411](https://github.com/stashed/enterprise/commit/60b48411) Use VolumeSnapshot api dynamically (#197) +- [cf034b8b](https://github.com/stashed/enterprise/commit/cf034b8b) Use k8s 1.25.1 libs (#196) +- [f2c419a7](https://github.com/stashed/enterprise/commit/f2c419a7) Acquire license from license-proxyserver if available (#194) +- [316cd592](https://github.com/stashed/enterprise/commit/316cd592) Fix total host calculation for VolumeSnapshot (#189) +- [7fdce67e](https://github.com/stashed/enterprise/commit/7fdce67e) Fix label passing to restore job (#193) +- [0052217d](https://github.com/stashed/enterprise/commit/0052217d) Fix hook defaulting issue (#192) +- [d78cfc50](https://github.com/stashed/enterprise/commit/d78cfc50) Add support for multiple blueprint name in target annotations (#190) +- [07327ac2](https://github.com/stashed/enterprise/commit/07327ac2) Set BackupSession Duration before sending metrics. (#191) +- [52ceac2b](https://github.com/stashed/enterprise/commit/52ceac2b) Cancel concurrent CI runs + + + +## [stashed/etcd](https://github.com/stashed/etcd) + +### [3.5.0-v6](https://github.com/stashed/etcd/releases/tag/3.5.0-v6) + +- [3bbcbfb](https://github.com/stashed/etcd/commit/3bbcbfb) Prepare for release 3.5.0-v6 (#59) +- [fad156c](https://github.com/stashed/etcd/commit/fad156c) [cherry-pick] Revert to restic 0.13.1 (#57) (#58) +- [7836d45](https://github.com/stashed/etcd/commit/7836d45) [cherry-pick] Use restic 0.14.0 (#55) (#56) +- [c1989f5](https://github.com/stashed/etcd/commit/c1989f5) [cherry-pick] Use k8s 1.25.1 libs (#53) (#54) +- [12b1d0e](https://github.com/stashed/etcd/commit/12b1d0e) [cherry-pick] Acquire license from license-proxyserver if available (#51) (#52) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2022.09.29](https://github.com/stashed/installer/releases/tag/v2022.09.29) + +- [29710ffb](https://github.com/stashed/installer/commit/29710ffb) Prepare for release v2022.09.29 (#282) +- [2d65e197](https://github.com/stashed/installer/commit/2d65e197) Redis 7.0.5 (#281) +- [38eb2de1](https://github.com/stashed/installer/commit/38eb2de1) Update crds +- [8916a69d](https://github.com/stashed/installer/commit/8916a69d) Remove ReplicaSet and ReplicationController support from community edition (#280) +- [4e11f0d6](https://github.com/stashed/installer/commit/4e11f0d6) Test against Kubernetes 1.25.0 (#279) +- [744d7c6a](https://github.com/stashed/installer/commit/744d7c6a) Don't add PSP permissions in Kubernetes version v1.25.0+ (#278) +- [2542d4af](https://github.com/stashed/installer/commit/2542d4af) Remove support ReplicaSet and ReplicationController (#276) +- [30779daa](https://github.com/stashed/installer/commit/30779daa) Use k8s 1.25.1 libs (#277) +- [e7dc289e](https://github.com/stashed/installer/commit/e7dc289e) Acquire license from license-proxyserver if available (#275) +- [3d8c9552](https://github.com/stashed/installer/commit/3d8c9552) Add permission for license-proxyserver (#274) +- [fcb4bdbe](https://github.com/stashed/installer/commit/fcb4bdbe) Add catalog for Redis 7.0.4 (#273) + + + +## [stashed/kubedump](https://github.com/stashed/kubedump) + +### [0.1.0-v2](https://github.com/stashed/kubedump/releases/tag/0.1.0-v2) + +- [d949ed6](https://github.com/stashed/kubedump/commit/d949ed6) Prepare for release 0.1.0-v2 (#19) +- [b2c51fb](https://github.com/stashed/kubedump/commit/b2c51fb) Revert to restic 0.13.1 (#17) (#18) +- [540670b](https://github.com/stashed/kubedump/commit/540670b) [cherry-pick] Use restic 0.14.0 (#15) (#16) +- [ca8bdc6](https://github.com/stashed/kubedump/commit/ca8bdc6) [cherry-pick] Use k8s 1.25.1 libs (#13) (#14) +- [7d1fc6f](https://github.com/stashed/kubedump/commit/7d1fc6f) [cherry-pick] Acquire license from license-proxyserver if available (#11) (#12) + + + +## [stashed/mariadb](https://github.com/stashed/mariadb) + +### [10.5.8-v12](https://github.com/stashed/mariadb/releases/tag/10.5.8-v12) + +- [38c4724](https://github.com/stashed/mariadb/commit/38c4724) Prepare for release 10.5.8-v12 (#200) +- [b861b65](https://github.com/stashed/mariadb/commit/b861b65) [cherry-pick] Revert to restic 0.13.1 (#198) (#199) +- [7e6751a](https://github.com/stashed/mariadb/commit/7e6751a) [cherry-pick] Use restic 0.14.0 (#196) (#197) +- [610ea64](https://github.com/stashed/mariadb/commit/610ea64) [cherry-pick] Use k8s 1.25.1 libs (#194) (#195) +- [e476217](https://github.com/stashed/mariadb/commit/e476217) [cherry-pick] Acquire license from license-proxyserver if available (#192) (#193) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v19](https://github.com/stashed/mongodb/releases/tag/3.4.17-v19) + +- [3a90213c](https://github.com/stashed/mongodb/commit/3a90213c) Prepare for release 3.4.17-v19 (#1663) +- [dcc89b05](https://github.com/stashed/mongodb/commit/dcc89b05) [cherry-pick] Revert to restic 0.13.1 (#1649) (#1650) +- [d9d43b0b](https://github.com/stashed/mongodb/commit/d9d43b0b) [cherry-pick] Use restic 0.14.0 (#1635) (#1636) +- [c838b452](https://github.com/stashed/mongodb/commit/c838b452) [cherry-pick] Use k8s 1.25.1 libs (#1621) (#1622) +- [78fb76b1](https://github.com/stashed/mongodb/commit/78fb76b1) [cherry-pick] Acquire license from license-proxyserver if available (#1607) (#1608) + + +### [3.4.22-v19](https://github.com/stashed/mongodb/releases/tag/3.4.22-v19) + +- [bd473140](https://github.com/stashed/mongodb/commit/bd473140) Prepare for release 3.4.22-v19 (#1664) +- [ee17bd96](https://github.com/stashed/mongodb/commit/ee17bd96) Revert to restic 0.13.1 (#1649) (#1651) +- [5a3562ae](https://github.com/stashed/mongodb/commit/5a3562ae) [cherry-pick] Use restic 0.14.0 (#1635) (#1637) +- [d660184a](https://github.com/stashed/mongodb/commit/d660184a) [cherry-pick] Use k8s 1.25.1 libs (#1621) (#1623) +- [3d73c7f8](https://github.com/stashed/mongodb/commit/3d73c7f8) [cherry-pick] Acquire license from license-proxyserver if available (#1607) (#1609) + + +### [3.6.8-v19](https://github.com/stashed/mongodb/releases/tag/3.6.8-v19) + +- [2a5d0729](https://github.com/stashed/mongodb/commit/2a5d0729) Prepare for release 3.6.8-v19 (#1666) +- [98abf305](https://github.com/stashed/mongodb/commit/98abf305) [cherry-pick] Revert to restic 0.13.1 (#1649) (#1653) +- [52614ce5](https://github.com/stashed/mongodb/commit/52614ce5) [cherry-pick] Use restic 0.14.0 (#1635) (#1639) +- [a3c6cdb0](https://github.com/stashed/mongodb/commit/a3c6cdb0) [cherry-pick] Use k8s 1.25.1 libs (#1621) (#1625) +- [09da5ad7](https://github.com/stashed/mongodb/commit/09da5ad7) [cherry-pick] Acquire license from license-proxyserver if available (#1607) (#1611) + + +### [3.6.13-v19](https://github.com/stashed/mongodb/releases/tag/3.6.13-v19) + +- [36b22e54](https://github.com/stashed/mongodb/commit/36b22e54) Prepare for release 3.6.13-v19 (#1665) +- [0b579101](https://github.com/stashed/mongodb/commit/0b579101) Revert to restic 0.13.1 (#1649) (#1652) +- [f335db0d](https://github.com/stashed/mongodb/commit/f335db0d) [cherry-pick] Use restic 0.14.0 (#1635) (#1638) +- [a194f438](https://github.com/stashed/mongodb/commit/a194f438) [cherry-pick] Use k8s 1.25.1 libs (#1621) (#1624) +- [a389cd0c](https://github.com/stashed/mongodb/commit/a389cd0c) [cherry-pick] Acquire license from license-proxyserver if available (#1607) (#1610) + + +### [4.0.3-v19](https://github.com/stashed/mongodb/releases/tag/4.0.3-v19) + +- [1ba18787](https://github.com/stashed/mongodb/commit/1ba18787) Prepare for release 4.0.3-v19 (#1668) +- [20c26852](https://github.com/stashed/mongodb/commit/20c26852) Revert to restic 0.13.1 (#1649) (#1655) +- [3cd8cbe0](https://github.com/stashed/mongodb/commit/3cd8cbe0) [cherry-pick] Use restic 0.14.0 (#1635) (#1641) +- [8d7a12a8](https://github.com/stashed/mongodb/commit/8d7a12a8) [cherry-pick] Use k8s 1.25.1 libs (#1621) (#1627) +- [dec6b1b5](https://github.com/stashed/mongodb/commit/dec6b1b5) [cherry-pick] Acquire license from license-proxyserver if available (#1607) (#1613) + + +### [4.0.5-v19](https://github.com/stashed/mongodb/releases/tag/4.0.5-v19) + +- [7fa68368](https://github.com/stashed/mongodb/commit/7fa68368) Prepare for release 4.0.5-v19 (#1669) +- [ae8bc602](https://github.com/stashed/mongodb/commit/ae8bc602) Revert to restic 0.13.1 (#1649) (#1656) +- [cf032c32](https://github.com/stashed/mongodb/commit/cf032c32) [cherry-pick] Use restic 0.14.0 (#1635) (#1642) +- [05f691f6](https://github.com/stashed/mongodb/commit/05f691f6) [cherry-pick] Use k8s 1.25.1 libs (#1621) (#1628) +- [425887a0](https://github.com/stashed/mongodb/commit/425887a0) [cherry-pick] Acquire license from license-proxyserver if available (#1607) (#1614) + + +### [4.0.11-v19](https://github.com/stashed/mongodb/releases/tag/4.0.11-v19) + +- [f519a6b1](https://github.com/stashed/mongodb/commit/f519a6b1) Prepare for release 4.0.11-v19 (#1667) +- [f1977fd5](https://github.com/stashed/mongodb/commit/f1977fd5) [cherry-pick] Revert to restic 0.13.1 (#1649) (#1654) +- [1c0e894f](https://github.com/stashed/mongodb/commit/1c0e894f) [cherry-pick] Use restic 0.14.0 (#1635) (#1640) +- [269719a6](https://github.com/stashed/mongodb/commit/269719a6) [cherry-pick] Use k8s 1.25.1 libs (#1621) (#1626) +- [fcbc9b82](https://github.com/stashed/mongodb/commit/fcbc9b82) [cherry-pick] Acquire license from license-proxyserver if available (#1607) (#1612) + + +### [4.1.4-v19](https://github.com/stashed/mongodb/releases/tag/4.1.4-v19) + +- [1bc0d9c6](https://github.com/stashed/mongodb/commit/1bc0d9c6) Prepare for release 4.1.4-v19 (#1671) +- [eb3b71a0](https://github.com/stashed/mongodb/commit/eb3b71a0) [cherry-pick] Revert to restic 0.13.1 (#1649) (#1658) +- [1e53dfeb](https://github.com/stashed/mongodb/commit/1e53dfeb) [cherry-pick] Use restic 0.14.0 (#1635) (#1644) +- [0ea9f2ee](https://github.com/stashed/mongodb/commit/0ea9f2ee) [cherry-pick] Use k8s 1.25.1 libs (#1621) (#1630) +- [2e27e199](https://github.com/stashed/mongodb/commit/2e27e199) [cherry-pick] Acquire license from license-proxyserver if available (#1607) (#1616) + + +### [4.1.7-v19](https://github.com/stashed/mongodb/releases/tag/4.1.7-v19) + +- [7029f3cb](https://github.com/stashed/mongodb/commit/7029f3cb) Prepare for release 4.1.7-v19 (#1672) +- [5a7188dc](https://github.com/stashed/mongodb/commit/5a7188dc) [cherry-pick] Revert to restic 0.13.1 (#1649) (#1659) +- [b068d1cb](https://github.com/stashed/mongodb/commit/b068d1cb) [cherry-pick] Use restic 0.14.0 (#1635) (#1645) +- [7b413b54](https://github.com/stashed/mongodb/commit/7b413b54) [cherry-pick] Use k8s 1.25.1 libs (#1621) (#1631) +- [cd1f4626](https://github.com/stashed/mongodb/commit/cd1f4626) [cherry-pick] Acquire license from license-proxyserver if available (#1607) (#1617) + + +### [4.1.13-v19](https://github.com/stashed/mongodb/releases/tag/4.1.13-v19) + +- [0fb41942](https://github.com/stashed/mongodb/commit/0fb41942) Prepare for release 4.1.13-v19 (#1670) +- [48fe3980](https://github.com/stashed/mongodb/commit/48fe3980) Revert to restic 0.13.1 (#1649) (#1657) +- [a09f450c](https://github.com/stashed/mongodb/commit/a09f450c) [cherry-pick] Use restic 0.14.0 (#1635) (#1643) +- [a56f9680](https://github.com/stashed/mongodb/commit/a56f9680) [cherry-pick] Use k8s 1.25.1 libs (#1621) (#1629) +- [0f64d312](https://github.com/stashed/mongodb/commit/0f64d312) [cherry-pick] Acquire license from license-proxyserver if available (#1607) (#1615) + + +### [4.2.3-v19](https://github.com/stashed/mongodb/releases/tag/4.2.3-v19) + +- [faebeabf](https://github.com/stashed/mongodb/commit/faebeabf) Prepare for release 4.2.3-v19 (#1673) +- [630081c4](https://github.com/stashed/mongodb/commit/630081c4) Revert to restic 0.13.1 (#1649) (#1660) +- [db2b2154](https://github.com/stashed/mongodb/commit/db2b2154) [cherry-pick] Use restic 0.14.0 (#1635) (#1646) +- [465c0f96](https://github.com/stashed/mongodb/commit/465c0f96) [cherry-pick] Use k8s 1.25.1 libs (#1621) (#1632) +- [07b25e67](https://github.com/stashed/mongodb/commit/07b25e67) [cherry-pick] Acquire license from license-proxyserver if available (#1607) (#1618) + + +### [4.4.6-v10](https://github.com/stashed/mongodb/releases/tag/4.4.6-v10) + +- [3f080a1a](https://github.com/stashed/mongodb/commit/3f080a1a) Revert to restic 0.13.1 (#1649) (#1661) +- [61c5a63a](https://github.com/stashed/mongodb/commit/61c5a63a) [cherry-pick] Use restic 0.14.0 (#1635) (#1647) +- [945b11ff](https://github.com/stashed/mongodb/commit/945b11ff) [cherry-pick] Use k8s 1.25.1 libs (#1621) (#1633) +- [8d5c1da5](https://github.com/stashed/mongodb/commit/8d5c1da5) [cherry-pick] Acquire license from license-proxyserver if available (#1607) (#1619) + + +### [5.0.3-v7](https://github.com/stashed/mongodb/releases/tag/5.0.3-v7) + +- [b794121f](https://github.com/stashed/mongodb/commit/b794121f) Revert to restic 0.13.1 (#1649) (#1662) +- [048c224d](https://github.com/stashed/mongodb/commit/048c224d) [cherry-pick] Use restic 0.14.0 (#1635) (#1648) +- [ae70b357](https://github.com/stashed/mongodb/commit/ae70b357) [cherry-pick] Use k8s 1.25.1 libs (#1621) (#1634) +- [23063a3b](https://github.com/stashed/mongodb/commit/23063a3b) [cherry-pick] Acquire license from license-proxyserver if available (#1607) (#1620) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v19](https://github.com/stashed/mysql/releases/tag/5.7.25-v19) + +- [2e7b1ded](https://github.com/stashed/mysql/commit/2e7b1ded) Prepare for release 5.7.25-v19 (#656) +- [1502553e](https://github.com/stashed/mysql/commit/1502553e) [cherry-pick] Revert to restic 0.13.1 (#652) (#653) +- [fb6b7842](https://github.com/stashed/mysql/commit/fb6b7842) [cherry-pick] Use restic 0.14.0 (#648) (#649) +- [517967e9](https://github.com/stashed/mysql/commit/517967e9) [cherry-pick] Use k8s 1.25.1 libs (#643) (#644) +- [8b8d50c0](https://github.com/stashed/mysql/commit/8b8d50c0) [cherry-pick] Acquire license from license-proxyserver if available (#638) (#639) + + +### [8.0.3-v19](https://github.com/stashed/mysql/releases/tag/8.0.3-v19) + +- [a776fc40](https://github.com/stashed/mysql/commit/a776fc40) Prepare for release 8.0.3-v19 (#659) +- [513cf746](https://github.com/stashed/mysql/commit/513cf746) [cherry-pick] Use k8s 1.25.1 libs (#643) (#647) +- [f23808a4](https://github.com/stashed/mysql/commit/f23808a4) [cherry-pick] Acquire license from license-proxyserver if available (#638) (#642) + + +### [8.0.14-v19](https://github.com/stashed/mysql/releases/tag/8.0.14-v19) + +- [28076a91](https://github.com/stashed/mysql/commit/28076a91) Prepare for release 8.0.14-v19 (#657) +- [a3232b0c](https://github.com/stashed/mysql/commit/a3232b0c) [cherry-pick] Revert to restic 0.13.1 (#652) (#654) +- [7dd4e9be](https://github.com/stashed/mysql/commit/7dd4e9be) [cherry-pick] Use restic 0.14.0 (#648) (#650) +- [6c47a15a](https://github.com/stashed/mysql/commit/6c47a15a) [cherry-pick] Use k8s 1.25.1 libs (#643) (#645) +- [17110198](https://github.com/stashed/mysql/commit/17110198) [cherry-pick] Acquire license from license-proxyserver if available (#638) (#640) + + +### [8.0.21-v13](https://github.com/stashed/mysql/releases/tag/8.0.21-v13) + +- [10631bcb](https://github.com/stashed/mysql/commit/10631bcb) Prepare for release 8.0.21-v13 (#658) +- [3ebde7be](https://github.com/stashed/mysql/commit/3ebde7be) [cherry-pick] Revert to restic 0.13.1 (#652) (#655) +- [5d5dfe4f](https://github.com/stashed/mysql/commit/5d5dfe4f) [cherry-pick] Use restic 0.14.0 (#648) (#651) +- [2d32097f](https://github.com/stashed/mysql/commit/2d32097f) [cherry-pick] Use k8s 1.25.1 libs (#643) (#646) +- [fd685f29](https://github.com/stashed/mysql/commit/fd685f29) [cherry-pick] Acquire license from license-proxyserver if available (#638) (#641) + + + +## [stashed/nats](https://github.com/stashed/nats) + +### [2.6.1-v7](https://github.com/stashed/nats/releases/tag/2.6.1-v7) + +- [ff84cf8](https://github.com/stashed/nats/commit/ff84cf8) Prepare for release 2.6.1-v6 (#72) +- [27915ef](https://github.com/stashed/nats/commit/27915ef) [cherry-pick] Revert to restic 0.13.1 (#69) (#70) +- [4e4f933](https://github.com/stashed/nats/commit/4e4f933) Fix Dockerfile +- [f984718](https://github.com/stashed/nats/commit/f984718) [cherry-pick] Use restic 0.14.0 (#66) (#67) +- [45ba241](https://github.com/stashed/nats/commit/45ba241) [cherry-pick] Use k8s 1.25.1 libs (#63) (#64) +- [1bfa57c](https://github.com/stashed/nats/commit/1bfa57c) [cherry-pick] Acquire license from license-proxyserver if available (#60) (#61) + + +### [2.8.2-v2](https://github.com/stashed/nats/releases/tag/2.8.2-v2) + +- [185b43b](https://github.com/stashed/nats/commit/185b43b) Prepare for release 2.8.2-v2 (#73) +- [92a0d85](https://github.com/stashed/nats/commit/92a0d85) [cherry-pick] Revert to restic 0.13.1 (#69) (#71) +- [a20f667](https://github.com/stashed/nats/commit/a20f667) [cherry-pick] Use restic 0.14.0 (#66) (#68) +- [6e70b66](https://github.com/stashed/nats/commit/6e70b66) [cherry-pick] Use k8s 1.25.1 libs (#63) (#65) +- [3d1ed5a](https://github.com/stashed/nats/commit/3d1ed5a) [cherry-pick] Acquire license from license-proxyserver if available (#60) (#62) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-v14](https://github.com/stashed/percona-xtradb/releases/tag/5.7-v14) + +- [60dcbc42](https://github.com/stashed/percona-xtradb/commit/60dcbc42) Prepare for release 5.7-v14 (#272) +- [4910525d](https://github.com/stashed/percona-xtradb/commit/4910525d) [cherry-pick] Revert to restic 0.13.1 (#270) (#271) +- [f36ec767](https://github.com/stashed/percona-xtradb/commit/f36ec767) [cherry-pick] Use restic 0.14.0 (#268) (#269) +- [3bc0f8b1](https://github.com/stashed/percona-xtradb/commit/3bc0f8b1) [cherry-pick] Use k8s 1.25.1 libs (#266) (#267) +- [3176f6c4](https://github.com/stashed/percona-xtradb/commit/3176f6c4) [cherry-pick] Acquire license from license-proxyserver if available (#264) (#265) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v18](https://github.com/stashed/postgres/releases/tag/9.6.19-v18) + +- [82f3ce67](https://github.com/stashed/postgres/commit/82f3ce67) Prepare for release 9.6.19-v18 (#1117) +- [2010667b](https://github.com/stashed/postgres/commit/2010667b) [cherry-pick] Revert to restic 0.13.1 (#1105) (#1111) +- [ebbbcbac](https://github.com/stashed/postgres/commit/ebbbcbac) [cherry-pick] Use restic 0.14.0 (#1098) (#1104) +- [c010f284](https://github.com/stashed/postgres/commit/c010f284) [cherry-pick] Use k8s 1.25.1 libs (#1091) (#1097) +- [3f12e462](https://github.com/stashed/postgres/commit/3f12e462) [cherry-pick] Acquire license from license-proxyserver if available (#1084) (#1090) + + +### [10.14-v18](https://github.com/stashed/postgres/releases/tag/10.14-v18) + +- [21c2297c](https://github.com/stashed/postgres/commit/21c2297c) Prepare for release 10.14-v18 (#1112) +- [f88623ae](https://github.com/stashed/postgres/commit/f88623ae) [cherry-pick] Revert to restic 0.13.1 (#1105) (#1106) +- [2095d664](https://github.com/stashed/postgres/commit/2095d664) [cherry-pick] Use restic 0.14.0 (#1098) (#1099) +- [05343728](https://github.com/stashed/postgres/commit/05343728) [cherry-pick] Use k8s 1.25.1 libs (#1091) (#1092) +- [b47ffe3a](https://github.com/stashed/postgres/commit/b47ffe3a) [cherry-pick] Acquire license from license-proxyserver if available (#1084) (#1085) + + +### [11.9-v18](https://github.com/stashed/postgres/releases/tag/11.9-v18) + +- [d94521f0](https://github.com/stashed/postgres/commit/d94521f0) Prepare for release 11.9-v18 (#1113) +- [80d58dcf](https://github.com/stashed/postgres/commit/80d58dcf) [cherry-pick] Revert to restic 0.13.1 (#1105) (#1107) +- [0f80a028](https://github.com/stashed/postgres/commit/0f80a028) [cherry-pick] Use restic 0.14.0 (#1098) (#1100) +- [1dc3d12a](https://github.com/stashed/postgres/commit/1dc3d12a) [cherry-pick] Use k8s 1.25.1 libs (#1091) (#1093) +- [8bb7face](https://github.com/stashed/postgres/commit/8bb7face) [cherry-pick] Acquire license from license-proxyserver if available (#1084) (#1086) + + +### [12.4-v18](https://github.com/stashed/postgres/releases/tag/12.4-v18) + +- [9aeadf3d](https://github.com/stashed/postgres/commit/9aeadf3d) Prepare for release 12.4-v18 (#1114) +- [dc133e24](https://github.com/stashed/postgres/commit/dc133e24) [cherry-pick] Revert to restic 0.13.1 (#1105) (#1108) +- [b076014d](https://github.com/stashed/postgres/commit/b076014d) [cherry-pick] Use restic 0.14.0 (#1098) (#1101) +- [0d9bb51a](https://github.com/stashed/postgres/commit/0d9bb51a) [cherry-pick] Use k8s 1.25.1 libs (#1091) (#1094) +- [4c40d495](https://github.com/stashed/postgres/commit/4c40d495) [cherry-pick] Acquire license from license-proxyserver if available (#1084) (#1087) + + +### [13.1-v15](https://github.com/stashed/postgres/releases/tag/13.1-v15) + +- [d5514c07](https://github.com/stashed/postgres/commit/d5514c07) Prepare for release 13.1-v15 (#1115) +- [6ae5c873](https://github.com/stashed/postgres/commit/6ae5c873) [cherry-pick] Revert to restic 0.13.1 (#1105) (#1109) +- [a99069cf](https://github.com/stashed/postgres/commit/a99069cf) [cherry-pick] Use restic 0.14.0 (#1098) (#1102) +- [085f7ae0](https://github.com/stashed/postgres/commit/085f7ae0) [cherry-pick] Use k8s 1.25.1 libs (#1091) (#1095) +- [ee7e4c40](https://github.com/stashed/postgres/commit/ee7e4c40) [cherry-pick] Acquire license from license-proxyserver if available (#1084) (#1088) + + +### [14.0-v7](https://github.com/stashed/postgres/releases/tag/14.0-v7) + +- [334d54bb](https://github.com/stashed/postgres/commit/334d54bb) Prepare for release 14.0-v7 (#1116) +- [84426fe5](https://github.com/stashed/postgres/commit/84426fe5) [cherry-pick] Revert to restic 0.13.1 (#1105) (#1110) +- [d5225dd7](https://github.com/stashed/postgres/commit/d5225dd7) [cherry-pick] Use restic 0.14.0 (#1098) (#1103) +- [b382b035](https://github.com/stashed/postgres/commit/b382b035) [cherry-pick] Use k8s 1.25.1 libs (#1091) (#1096) +- [bf7ebaec](https://github.com/stashed/postgres/commit/bf7ebaec) [cherry-pick] Acquire license from license-proxyserver if available (#1084) (#1089) + + + +## [stashed/redis](https://github.com/stashed/redis) + +### [5.0.13-v7](https://github.com/stashed/redis/releases/tag/5.0.13-v7) + +- [23db3eb](https://github.com/stashed/redis/commit/23db3eb) Prepare for release 5.0.13-v7 (#129) +- [09696ff](https://github.com/stashed/redis/commit/09696ff) [cherry-pick] Revert to restic 0.13.1 (#126) (#127) +- [218357a](https://github.com/stashed/redis/commit/218357a) [cherry-pick] Use restic 0.14.0 (#123) (#124) +- [ef82eb8](https://github.com/stashed/redis/commit/ef82eb8) [cherry-pick] Use k8s 1.25.1 libs (#120) (#121) +- [083affe](https://github.com/stashed/redis/commit/083affe) [cherry-pick] Acquire license from license-proxyserver if available (#117) (#118) + + +### [6.2.5-v7](https://github.com/stashed/redis/releases/tag/6.2.5-v7) + +- [8448d92](https://github.com/stashed/redis/commit/8448d92) Prepare for release 6.2.5-v7 (#130) +- [6e14704](https://github.com/stashed/redis/commit/6e14704) [cherry-pick] Revert to restic 0.13.1 (#126) (#128) +- [418d73f](https://github.com/stashed/redis/commit/418d73f) Fix pointer +- [b30d3a7](https://github.com/stashed/redis/commit/b30d3a7) [cherry-pick] Use restic 0.14.0 (#123) (#125) +- [4711712](https://github.com/stashed/redis/commit/4711712) [cherry-pick] Use k8s 1.25.1 libs (#120) (#122) +- [0d4cfbd](https://github.com/stashed/redis/commit/0d4cfbd) [cherry-pick] Acquire license from license-proxyserver if available (#117) (#119) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.23.0](https://github.com/stashed/stash/releases/tag/v0.23.0) + +- [2df11f82](https://github.com/stashed/stash/commit/2df11f82) Prepare for release v0.23.0 (#1486) +- [ee8134e5](https://github.com/stashed/stash/commit/ee8134e5) Port changes from Stash Enterprise edition +- [f209179c](https://github.com/stashed/stash/commit/f209179c) Fix snapshot test failure +- [583a8f56](https://github.com/stashed/stash/commit/583a8f56) Port changes from Stash Enterprise edition +- [d8e8f4c9](https://github.com/stashed/stash/commit/d8e8f4c9) Revert to restic 0.13.1 (#1483) +- [57de24c7](https://github.com/stashed/stash/commit/57de24c7) Test against Kubernetes 1.25.0 (#1482) +- [bf1826c8](https://github.com/stashed/stash/commit/bf1826c8) Validate `TimeOut` in backup and restore (#1481) +- [1ae696dd](https://github.com/stashed/stash/commit/1ae696dd) Fix unit tests +- [41064183](https://github.com/stashed/stash/commit/41064183) Check for CronJob/VolumeSnapshot version only once (#1479) +- [fc4e2602](https://github.com/stashed/stash/commit/fc4e2602) Handle CronJob api type dynamically (#1478) +- [7c055aec](https://github.com/stashed/stash/commit/7c055aec) Handle status conversion for CronJob/VolumeSnapshot (#1477) +- [fb80667d](https://github.com/stashed/stash/commit/fb80667d) Use restic 0.14.0 (#1476) +- [4ce5e18d](https://github.com/stashed/stash/commit/4ce5e18d) Use VolumeSnapshot api dynamically (#1475) +- [b0519c85](https://github.com/stashed/stash/commit/b0519c85) Fix linter warnings +- [779297d4](https://github.com/stashed/stash/commit/779297d4) Use k8s 1.25.1 libs (#1474) +- [8c87f9fc](https://github.com/stashed/stash/commit/8c87f9fc) Acquire license from license-proxyserver if available (#1472) +- [63cac4e9](https://github.com/stashed/stash/commit/63cac4e9) Fix total host calculation for VolumeSnapshot +- [aca8fde0](https://github.com/stashed/stash/commit/aca8fde0) Remove unused variable +- [6bbd94ba](https://github.com/stashed/stash/commit/6bbd94ba) Remove unnecessary else +- [d28750a3](https://github.com/stashed/stash/commit/d28750a3) Fix total host calculation for VolumeSnapshot +- [42f39b5b](https://github.com/stashed/stash/commit/42f39b5b) Fix label passing to backup/restore jobs (#1470) +- [2b445ce1](https://github.com/stashed/stash/commit/2b445ce1) Fix hook defaulting issue +- [12436ad2](https://github.com/stashed/stash/commit/12436ad2) Fix hook defaulting issue +- [e2f44131](https://github.com/stashed/stash/commit/e2f44131) Support multiple backup invoker against a target +- [7fafed89](https://github.com/stashed/stash/commit/7fafed89) Support multiple backup invoker against a target +- [e4e7b69e](https://github.com/stashed/stash/commit/e4e7b69e) Set BackupSession duration before sending metrics. (#1466) +- [cd9bcecc](https://github.com/stashed/stash/commit/cd9bcecc) Cancel concurrent ci runs + + + +## [stashed/ui-server](https://github.com/stashed/ui-server) + +### [v0.5.0](https://github.com/stashed/ui-server/releases/tag/v0.5.0) + +- [13db95c](https://github.com/stashed/ui-server/commit/13db95c) Prepare for release v0.5.0 (#17) +- [2382c83](https://github.com/stashed/ui-server/commit/2382c83) Use k8s 1.25.1 libs (#16) +- [7fabd18](https://github.com/stashed/ui-server/commit/7fabd18) Cancel concurrent CI runs + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2022.12.11.md b/content/docs/v2024.12.18/CHANGELOG-v2022.12.11.md new file mode 100644 index 0000000000..6d6adcc573 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2022.12.11.md @@ -0,0 +1,436 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2022.12.11 + name: Changelog-v2022.12.11 + parent: welcome + weight: 20221211 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2022.12.11/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2022.12.11/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2022.12.11 (2022-12-11) + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.24.0](https://github.com/stashed/apimachinery/releases/tag/v0.24.0) + +- [8be49b48](https://github.com/stashed/apimachinery/commit/8be49b48) Update vulnerable deps (#195) +- [a7a5533d](https://github.com/stashed/apimachinery/commit/a7a5533d) Run GH actions on ubuntu-20.04 (#194) +- [dfd6e64f](https://github.com/stashed/apimachinery/commit/dfd6e64f) Add `--no-lock` flag for read operations (#192) +- [d6d88798](https://github.com/stashed/apimachinery/commit/d6d88798) Indicate repository required backend fields (#191) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.24.0](https://github.com/stashed/cli/releases/tag/v0.24.0) + +- [827ee17a](https://github.com/stashed/cli/commit/827ee17a) Prepare for release v0.24.0 (#173) +- [b481ee3b](https://github.com/stashed/cli/commit/b481ee3b) Update vulnerable deps +- [7b3e18a0](https://github.com/stashed/cli/commit/7b3e18a0) Run GH actions on ubuntu-20.04 (#172) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v20](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v20) + +- [65a2d53e](https://github.com/stashed/elasticsearch/commit/65a2d53e) Prepare for release 5.6.4-v20 (#1289) +- [291684ce](https://github.com/stashed/elasticsearch/commit/291684ce) [cherry-pick] Run GH actions on ubuntu-20.04 (#1278) (#1279) + + +### [6.2.4-v20](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v20) + +- [1b9be669](https://github.com/stashed/elasticsearch/commit/1b9be669) Prepare for release 6.2.4-v20 (#1290) +- [5aa4a261](https://github.com/stashed/elasticsearch/commit/5aa4a261) [cherry-pick] Run GH actions on ubuntu-20.04 (#1278) (#1280) + + +### [6.3.0-v20](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v20) + +- [f0c50dc5](https://github.com/stashed/elasticsearch/commit/f0c50dc5) Prepare for release 6.3.0-v20 (#1291) +- [13521327](https://github.com/stashed/elasticsearch/commit/13521327) [cherry-pick] Run GH actions on ubuntu-20.04 (#1278) (#1281) + + +### [6.4.0-v20](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v20) + +- [f7f7f8ba](https://github.com/stashed/elasticsearch/commit/f7f7f8ba) Prepare for release 6.4.0-v20 (#1292) +- [0058df29](https://github.com/stashed/elasticsearch/commit/0058df29) [cherry-pick] Run GH actions on ubuntu-20.04 (#1278) (#1282) + + +### [6.5.3-v20](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v20) + +- [95916905](https://github.com/stashed/elasticsearch/commit/95916905) Prepare for release 6.5.3-v20 (#1293) +- [6d372fd5](https://github.com/stashed/elasticsearch/commit/6d372fd5) [cherry-pick] Run GH actions on ubuntu-20.04 (#1278) (#1283) + + +### [6.8.0-v20](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v20) + +- [265999ff](https://github.com/stashed/elasticsearch/commit/265999ff) Prepare for release 6.8.0-v20 (#1294) +- [fbd522f9](https://github.com/stashed/elasticsearch/commit/fbd522f9) [cherry-pick] Run GH actions on ubuntu-20.04 (#1278) (#1284) + + +### [7.2.0-v20](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v20) + +- [e5fac39f](https://github.com/stashed/elasticsearch/commit/e5fac39f) Prepare for release 7.2.0-v20 (#1296) +- [562e07c2](https://github.com/stashed/elasticsearch/commit/562e07c2) [cherry-pick] Run GH actions on ubuntu-20.04 (#1278) (#1286) + + +### [7.3.2-v20](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v20) + +- [a142cc89](https://github.com/stashed/elasticsearch/commit/a142cc89) Prepare for release 7.3.2-v20 (#1297) +- [82d44ebd](https://github.com/stashed/elasticsearch/commit/82d44ebd) [cherry-pick] Run GH actions on ubuntu-20.04 (#1278) (#1287) + + +### [7.14.0-v6](https://github.com/stashed/elasticsearch/releases/tag/7.14.0-v6) + +- [73bd77a1](https://github.com/stashed/elasticsearch/commit/73bd77a1) Prepare for release 7.14.0-v6 (#1295) +- [bd3f7b0a](https://github.com/stashed/elasticsearch/commit/bd3f7b0a) [cherry-pick] Run GH actions on ubuntu-20.04 (#1278) (#1285) + + +### [8.2.0-v3](https://github.com/stashed/elasticsearch/releases/tag/8.2.0-v3) + +- [fbe1a6b4](https://github.com/stashed/elasticsearch/commit/fbe1a6b4) Prepare for release 8.2.0-v3 (#1298) +- [9148d4ee](https://github.com/stashed/elasticsearch/commit/9148d4ee) [cherry-pick] Run GH actions on ubuntu-20.04 (#1278) (#1288) + + + +## [stashed/enterprise](https://github.com/stashed/enterprise) + +### [v0.24.0](https://github.com/stashed/enterprise/releases/tag/v0.24.0) + +- [362a77ca](https://github.com/stashed/enterprise/commit/362a77ca) Prepare for release v0.24.0 (#213) +- [c477c2f4](https://github.com/stashed/enterprise/commit/c477c2f4) Update vulnerable deps (#212) +- [6ccc066f](https://github.com/stashed/enterprise/commit/6ccc066f) Run GH actions on ubuntu-20.04 (#211) +- [890948b2](https://github.com/stashed/enterprise/commit/890948b2) Update RBAC for VaultServer Backup & Restore (#208) +- [7ffc5ecd](https://github.com/stashed/enterprise/commit/7ffc5ecd) Acquire license from proxyserver (#209) + + + +## [stashed/etcd](https://github.com/stashed/etcd) + +### [3.5.0-v7](https://github.com/stashed/etcd/releases/tag/3.5.0-v7) + +- [056c220](https://github.com/stashed/etcd/commit/056c220) Prepare for release 3.5.0-v7 (#63) +- [bec459d](https://github.com/stashed/etcd/commit/bec459d) [cherry-pick] Run GH actions on ubuntu-20.04 (#61) (#62) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2022.12.11](https://github.com/stashed/installer/releases/tag/v2022.12.11) + +- [5162994b](https://github.com/stashed/installer/commit/5162994b) Prepare for release v2022.12.11 (#288) +- [8d43a822](https://github.com/stashed/installer/commit/8d43a822) Run GH actions on ubuntu-20.04 (#287) +- [b68bcaa2](https://github.com/stashed/installer/commit/b68bcaa2) Update ClusterRole for Vault Backup & Restore (#285) +- [8a6bbf45](https://github.com/stashed/installer/commit/8a6bbf45) Add Plugin for Postgres 15 (#286) + + + +## [stashed/kubedump](https://github.com/stashed/kubedump) + +### [0.1.0-v3](https://github.com/stashed/kubedump/releases/tag/0.1.0-v3) + +- [f8ce289](https://github.com/stashed/kubedump/commit/f8ce289) Prepare for release 0.1.0-v3 (#23) +- [5da34c4](https://github.com/stashed/kubedump/commit/5da34c4) Run GH actions on ubuntu-20.04 (#22) + + + +## [stashed/mariadb](https://github.com/stashed/mariadb) + +### [10.5.8-v13](https://github.com/stashed/mariadb/releases/tag/10.5.8-v13) + +- [8147cc1](https://github.com/stashed/mariadb/commit/8147cc1) Prepare for release 10.5.8-v13 (#206) +- [4fca73b](https://github.com/stashed/mariadb/commit/4fca73b) Run GH actions on ubuntu-20.04 (#204) (#205) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v20](https://github.com/stashed/mongodb/releases/tag/3.4.17-v20) + +- [286d6ec2](https://github.com/stashed/mongodb/commit/286d6ec2) Prepare for release 3.4.17-v20 (#1690) +- [eb1e21ca](https://github.com/stashed/mongodb/commit/eb1e21ca) Run GH actions on ubuntu-20.04 (#1677) (#1689) + + +### [3.4.22-v20](https://github.com/stashed/mongodb/releases/tag/3.4.22-v20) + +- [2b6a2925](https://github.com/stashed/mongodb/commit/2b6a2925) Prepare for release 3.4.22-v20 (#1691) +- [11386500](https://github.com/stashed/mongodb/commit/11386500) Run GH actions on ubuntu-20.04 (#1677) (#1688) + + +### [3.6.8-v20](https://github.com/stashed/mongodb/releases/tag/3.6.8-v20) + +- [38d327b3](https://github.com/stashed/mongodb/commit/38d327b3) Prepare for release 3.6.8-v20 (#1693) +- [d814c266](https://github.com/stashed/mongodb/commit/d814c266) Run GH actions on ubuntu-20.04 (#1677) (#1686) + + +### [3.6.13-v20](https://github.com/stashed/mongodb/releases/tag/3.6.13-v20) + +- [c0212417](https://github.com/stashed/mongodb/commit/c0212417) Prepare for release 3.6.13-v20 (#1692) +- [ac655744](https://github.com/stashed/mongodb/commit/ac655744) Run GH actions on ubuntu-20.04 (#1677) (#1687) + + +### [4.0.3-v20](https://github.com/stashed/mongodb/releases/tag/4.0.3-v20) + +- [c197e5a3](https://github.com/stashed/mongodb/commit/c197e5a3) Prepare for release 4.0.3-v20 (#1695) +- [a1b5a29e](https://github.com/stashed/mongodb/commit/a1b5a29e) Run GH actions on ubuntu-20.04 (#1677) (#1684) + + +### [4.0.5-v20](https://github.com/stashed/mongodb/releases/tag/4.0.5-v20) + +- [2e3e02c0](https://github.com/stashed/mongodb/commit/2e3e02c0) Prepare for release 4.0.5-v20 (#1696) +- [74ba8bb0](https://github.com/stashed/mongodb/commit/74ba8bb0) Run GH actions on ubuntu-20.04 (#1677) (#1683) + + +### [4.0.11-v20](https://github.com/stashed/mongodb/releases/tag/4.0.11-v20) + +- [2a196426](https://github.com/stashed/mongodb/commit/2a196426) Prepare for release 4.0.11-v20 (#1694) +- [df8566b4](https://github.com/stashed/mongodb/commit/df8566b4) Run GH actions on ubuntu-20.04 (#1677) (#1685) + + +### [4.1.4-v20](https://github.com/stashed/mongodb/releases/tag/4.1.4-v20) + +- [482cbb9f](https://github.com/stashed/mongodb/commit/482cbb9f) Prepare for release 4.1.4-v20 (#1698) +- [19d35fa3](https://github.com/stashed/mongodb/commit/19d35fa3) Run GH actions on ubuntu-20.04 (#1677) (#1682) + + +### [4.1.7-v20](https://github.com/stashed/mongodb/releases/tag/4.1.7-v20) + +- [daeea0d2](https://github.com/stashed/mongodb/commit/daeea0d2) Prepare for release 4.1.7-v20 (#1699) +- [935f0b54](https://github.com/stashed/mongodb/commit/935f0b54) Run GH actions on ubuntu-20.04 (#1677) (#1678) + + +### [4.1.13-v20](https://github.com/stashed/mongodb/releases/tag/4.1.13-v20) + +- [3dc0dba9](https://github.com/stashed/mongodb/commit/3dc0dba9) Prepare for release 4.1.13-v20 (#1697) +- [15979e9f](https://github.com/stashed/mongodb/commit/15979e9f) Run GH actions on ubuntu-20.04 + + +### [4.2.3-v20](https://github.com/stashed/mongodb/releases/tag/4.2.3-v20) + +- [88d01c6e](https://github.com/stashed/mongodb/commit/88d01c6e) Prepare for release 4.2.3-v20 (#1701) +- [5132c6c2](https://github.com/stashed/mongodb/commit/5132c6c2) Run GH actions on ubuntu-20.04 (#1677) (#1681) + + +### [4.4.6-v11](https://github.com/stashed/mongodb/releases/tag/4.4.6-v11) + +- [d7ef7330](https://github.com/stashed/mongodb/commit/d7ef7330) Run GH actions on ubuntu-20.04 (#1677) (#1680) + + +### [5.0.3-v8](https://github.com/stashed/mongodb/releases/tag/5.0.3-v8) + +- [230ddc83](https://github.com/stashed/mongodb/commit/230ddc83) Run GH actions on ubuntu-20.04 (#1677) (#1679) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v20](https://github.com/stashed/mysql/releases/tag/5.7.25-v20) + +- [6e909b5c](https://github.com/stashed/mysql/commit/6e909b5c) Prepare for release 5.7.25-v20 (#666) +- [c0444876](https://github.com/stashed/mysql/commit/c0444876) [cherry-pick] Run GH actions on ubuntu-20.04 (#661) (#662) + + +### [8.0.3-v20](https://github.com/stashed/mysql/releases/tag/8.0.3-v20) + +- [2df6a148](https://github.com/stashed/mysql/commit/2df6a148) Prepare for release 8.0.3-v20 (#669) +- [5def6186](https://github.com/stashed/mysql/commit/5def6186) [cherry-pick] Run GH actions on ubuntu-20.04 (#661) (#665) + + +### [8.0.14-v20](https://github.com/stashed/mysql/releases/tag/8.0.14-v20) + +- [7c73243d](https://github.com/stashed/mysql/commit/7c73243d) Prepare for release 8.0.14-v20 (#667) +- [6b745e21](https://github.com/stashed/mysql/commit/6b745e21) [cherry-pick] Run GH actions on ubuntu-20.04 (#661) (#663) + + +### [8.0.21-v14](https://github.com/stashed/mysql/releases/tag/8.0.21-v14) + +- [e145e190](https://github.com/stashed/mysql/commit/e145e190) Prepare for release 8.0.21-v14 (#668) +- [50af3373](https://github.com/stashed/mysql/commit/50af3373) [cherry-pick] Run GH actions on ubuntu-20.04 (#661) (#664) + + + +## [stashed/nats](https://github.com/stashed/nats) + +### [2.6.1-v8](https://github.com/stashed/nats/releases/tag/2.6.1-v8) + +- [148b347](https://github.com/stashed/nats/commit/148b347) Prepare for release 2.6.1-v8 (#78) +- [f13cacd](https://github.com/stashed/nats/commit/f13cacd) [cherry-pick] Run GH actions on ubuntu-20.04 (#75) (#76) + + +### [2.8.2-v3](https://github.com/stashed/nats/releases/tag/2.8.2-v3) + +- [8565844](https://github.com/stashed/nats/commit/8565844) Prepare for release 2.8.2-v3 (#79) +- [860bda2](https://github.com/stashed/nats/commit/860bda2) [cherry-pick] Run GH actions on ubuntu-20.04 (#75) (#77) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-v15](https://github.com/stashed/percona-xtradb/releases/tag/5.7-v15) + +- [b7a3bb56](https://github.com/stashed/percona-xtradb/commit/b7a3bb56) Prepare for release 5.7-v15 (#276) +- [751522d9](https://github.com/stashed/percona-xtradb/commit/751522d9) [cherry-pick] Run GH actions on ubuntu-20.04 (#274) (#275) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v19](https://github.com/stashed/postgres/releases/tag/9.6.19-v19) + +- [faee608a](https://github.com/stashed/postgres/commit/faee608a) Prepare for release 9.6.19-v19 (#1134) +- [5d466cf8](https://github.com/stashed/postgres/commit/5d466cf8) [cherry-pick] Run GH actions on ubuntu-20.04 (#1120) (#1127) + + +### [10.14-v19](https://github.com/stashed/postgres/releases/tag/10.14-v19) + +- [1d0cdfb7](https://github.com/stashed/postgres/commit/1d0cdfb7) Prepare for release 10.14-v19 (#1128) +- [23308405](https://github.com/stashed/postgres/commit/23308405) [cherry-pick] Run GH actions on ubuntu-20.04 (#1120) (#1121) + + +### [11.9-v19](https://github.com/stashed/postgres/releases/tag/11.9-v19) + +- [458a24a6](https://github.com/stashed/postgres/commit/458a24a6) Prepare for release 11.9-v19 (#1129) +- [f13f0d8b](https://github.com/stashed/postgres/commit/f13f0d8b) [cherry-pick] Run GH actions on ubuntu-20.04 (#1120) (#1122) + + +### [12.4-v19](https://github.com/stashed/postgres/releases/tag/12.4-v19) + +- [5ac61672](https://github.com/stashed/postgres/commit/5ac61672) Prepare for release 12.4-v19 (#1130) +- [0b32f4e3](https://github.com/stashed/postgres/commit/0b32f4e3) [cherry-pick] Run GH actions on ubuntu-20.04 (#1120) (#1123) + + +### [13.1-v16](https://github.com/stashed/postgres/releases/tag/13.1-v16) + +- [33c9a9a4](https://github.com/stashed/postgres/commit/33c9a9a4) Prepare for release 13.1-v16 (#1131) +- [fdd75a0d](https://github.com/stashed/postgres/commit/fdd75a0d) [cherry-pick] Run GH actions on ubuntu-20.04 (#1120) (#1124) + + +### [14.0-v8](https://github.com/stashed/postgres/releases/tag/14.0-v8) + +- [a94f2d59](https://github.com/stashed/postgres/commit/a94f2d59) Prepare for release 14.0-v8 (#1132) +- [dfd4aea9](https://github.com/stashed/postgres/commit/dfd4aea9) [cherry-pick] Run GH actions on ubuntu-20.04 (#1120) (#1125) + + +### [15.1](https://github.com/stashed/postgres/releases/tag/15.1) + + + + +## [stashed/redis](https://github.com/stashed/redis) + +### [5.0.13-v8](https://github.com/stashed/redis/releases/tag/5.0.13-v8) + +- [2f3ecde](https://github.com/stashed/redis/commit/2f3ecde) Prepare for release 5.0.13-v8 (#136) +- [76a64b2](https://github.com/stashed/redis/commit/76a64b2) Run GH actions on ubuntu-20.04 (#132) (#135) + + +### [6.2.5-v8](https://github.com/stashed/redis/releases/tag/6.2.5-v8) + +- [e09e2c7](https://github.com/stashed/redis/commit/e09e2c7) Prepare for release 6.2.5-v8 (#137) +- [3f84ac4](https://github.com/stashed/redis/commit/3f84ac4) Run GH actions on ubuntu-20.04 (#132) (#134) + + +### [7.0.5-v1](https://github.com/stashed/redis/releases/tag/7.0.5-v1) + +- [de8306f](https://github.com/stashed/redis/commit/de8306f) Prepare for release 7.0.5-v1 (#138) +- [46304f4](https://github.com/stashed/redis/commit/46304f4) Run GH actions on ubuntu-20.04 (#132) (#133) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.24.0](https://github.com/stashed/stash/releases/tag/v0.24.0) + +- [000aceb4](https://github.com/stashed/stash/commit/000aceb4f) Prepare for release v0.24.0 (#1496) +- [c1288849](https://github.com/stashed/stash/commit/c12888498) Update vulnerable deps (#1495) +- [f64ec230](https://github.com/stashed/stash/commit/f64ec2309) Run GH actions on ubuntu-20.04 (#1494) +- [82baf7fb](https://github.com/stashed/stash/commit/82baf7fb3) Acquire license from proxyserver (#1491) + + + +## [stashed/ui-server](https://github.com/stashed/ui-server) + +### [v0.6.0](https://github.com/stashed/ui-server/releases/tag/v0.6.0) + +- [5fef8c3](https://github.com/stashed/ui-server/commit/5fef8c3) Prepare for release v0.6.0 (#19) +- [2fa4b08](https://github.com/stashed/ui-server/commit/2fa4b08) Update vulnerable deps +- [2c846f5](https://github.com/stashed/ui-server/commit/2c846f5) Run GH actions on ubuntu-20.04 (#18) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2023.01.05.md b/content/docs/v2024.12.18/CHANGELOG-v2023.01.05.md new file mode 100644 index 0000000000..8c31a7410a --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2023.01.05.md @@ -0,0 +1,397 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2023.01.05 + name: Changelog-v2023.01.05 + parent: welcome + weight: 20230105 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2023.01.05/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2023.01.05/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2023.01.05 (2023-01-03) + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.25.0](https://github.com/stashed/apimachinery/releases/tag/v0.25.0) + +- [3f20f5fe](https://github.com/stashed/apimachinery/commit/3f20f5fe) Add stash prefix for temp directory (#196) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.25.0](https://github.com/stashed/cli/releases/tag/v0.25.0) + +- [c8dabb77](https://github.com/stashed/cli/commit/c8dabb77) Prepare for release v0.25.0 (#174) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v21](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v21) + +- [b121b807](https://github.com/stashed/elasticsearch/commit/b121b807) Prepare for release 5.6.4-v21 (#1300) + + +### [6.2.4-v21](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v21) + +- [a94d6ef3](https://github.com/stashed/elasticsearch/commit/a94d6ef3) Prepare for release 6.2.4-v21 (#1301) + + +### [6.3.0-v21](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v21) + +- [73bb53f0](https://github.com/stashed/elasticsearch/commit/73bb53f0) Prepare for release 6.3.0-v21 (#1302) + + +### [6.4.0-v21](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v21) + +- [583f64fe](https://github.com/stashed/elasticsearch/commit/583f64fe) Prepare for release 6.4.0-v21 (#1303) + + +### [6.5.3-v21](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v21) + +- [c49eec09](https://github.com/stashed/elasticsearch/commit/c49eec09) Prepare for release 6.5.3-v21 (#1304) + + +### [6.8.0-v21](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v21) + +- [29b29eb6](https://github.com/stashed/elasticsearch/commit/29b29eb6) Prepare for release 6.8.0-v21 (#1305) + + +### [7.2.0-v21](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v21) + +- [c50a0904](https://github.com/stashed/elasticsearch/commit/c50a0904) Prepare for release 7.2.0-v21 (#1307) + + +### [7.3.2-v21](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v21) + +- [9288c6fb](https://github.com/stashed/elasticsearch/commit/9288c6fb) Prepare for release 7.3.2-v21 (#1308) + + +### [7.14.0-v7](https://github.com/stashed/elasticsearch/releases/tag/7.14.0-v7) + +- [5130f2a4](https://github.com/stashed/elasticsearch/commit/5130f2a4) Prepare for release 7.14.0-v7 (#1306) + + +### [8.2.0-v4](https://github.com/stashed/elasticsearch/releases/tag/8.2.0-v4) + +- [4807ee49](https://github.com/stashed/elasticsearch/commit/4807ee49) Prepare for release 8.2.0-v4 (#1309) + + + +## [stashed/enterprise](https://github.com/stashed/enterprise) + +### [v0.25.0](https://github.com/stashed/enterprise/releases/tag/v0.25.0) + +- [762ebb4e](https://github.com/stashed/enterprise/commit/762ebb4eb) Prepare for release v0.25.0 (#216) +- [8cb82074](https://github.com/stashed/enterprise/commit/8cb82074a) Fix upserting temporary volume (#215) +- [57d0906c](https://github.com/stashed/enterprise/commit/57d0906c8) Fix NPE using license-proxyserver (#214) + + + +## [stashed/etcd](https://github.com/stashed/etcd) + +### [3.5.0-v8](https://github.com/stashed/etcd/releases/tag/3.5.0-v8) + +- [523fc8f](https://github.com/stashed/etcd/commit/523fc8f) Prepare for release 3.5.0-v8 (#65) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2023.01.05](https://github.com/stashed/installer/releases/tag/v2023.01.05) + +- [33a11ef1](https://github.com/stashed/installer/commit/33a11ef1) Prepare for release v2023.01.05 (#290) +- [358d9bf9](https://github.com/stashed/installer/commit/358d9bf9) Add `stash` prefix in temporary directory (#289) +- [8c09e3f5](https://github.com/stashed/installer/commit/8c09e3f5) Update publish-oci.yml +- [38568dfc](https://github.com/stashed/installer/commit/38568dfc) Publish helm charts as OCI artifacts + + + +## [stashed/kubedump](https://github.com/stashed/kubedump) + +### [0.1.0-v4](https://github.com/stashed/kubedump/releases/tag/0.1.0-v4) + +- [77c648c](https://github.com/stashed/kubedump/commit/77c648c) Prepare for release 0.1.0-v4 (#25) + + + +## [stashed/mariadb](https://github.com/stashed/mariadb) + +### [10.5.8-v14](https://github.com/stashed/mariadb/releases/tag/10.5.8-v14) + +- [c86d3d8](https://github.com/stashed/mariadb/commit/c86d3d8) Prepare for release 10.5.8-v14 (#208) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v21](https://github.com/stashed/mongodb/releases/tag/3.4.17-v21) + +- [05ebbe8c](https://github.com/stashed/mongodb/commit/05ebbe8c) Prepare for release 3.4.17-v21 (#1705) + + +### [3.4.22-v21](https://github.com/stashed/mongodb/releases/tag/3.4.22-v21) + +- [cd8f3b79](https://github.com/stashed/mongodb/commit/cd8f3b79) Prepare for release 3.4.22-v21 (#1706) + + +### [3.6.8-v21](https://github.com/stashed/mongodb/releases/tag/3.6.8-v21) + +- [78218444](https://github.com/stashed/mongodb/commit/78218444) Prepare for release 3.6.8-v21 (#1708) + + +### [3.6.13-v21](https://github.com/stashed/mongodb/releases/tag/3.6.13-v21) + +- [8b5e5f26](https://github.com/stashed/mongodb/commit/8b5e5f26) Prepare for release 3.6.13-v21 (#1707) + + +### [4.0.3-v21](https://github.com/stashed/mongodb/releases/tag/4.0.3-v21) + +- [ede5e29c](https://github.com/stashed/mongodb/commit/ede5e29c) Prepare for release 4.0.3-v21 (#1710) + + +### [4.0.5-v21](https://github.com/stashed/mongodb/releases/tag/4.0.5-v21) + +- [5caeaeda](https://github.com/stashed/mongodb/commit/5caeaeda) Prepare for release 4.0.5-v21 (#1711) + + +### [4.0.11-v21](https://github.com/stashed/mongodb/releases/tag/4.0.11-v21) + +- [deba26e1](https://github.com/stashed/mongodb/commit/deba26e1) Prepare for release 4.0.11-v21 (#1709) + + +### [4.1.4-v21](https://github.com/stashed/mongodb/releases/tag/4.1.4-v21) + +- [4b2ad2ab](https://github.com/stashed/mongodb/commit/4b2ad2ab) Prepare for release 4.1.4-v21 (#1713) + + +### [4.1.7-v21](https://github.com/stashed/mongodb/releases/tag/4.1.7-v21) + +- [a7b8fe3b](https://github.com/stashed/mongodb/commit/a7b8fe3b) Prepare for release 4.1.7-v21 (#1714) + + +### [4.1.13-v21](https://github.com/stashed/mongodb/releases/tag/4.1.13-v21) + +- [dc6ef634](https://github.com/stashed/mongodb/commit/dc6ef634) Prepare for release 4.1.13-v21 (#1712) + + +### [4.2.3-v21](https://github.com/stashed/mongodb/releases/tag/4.2.3-v21) + +- [358bfa5c](https://github.com/stashed/mongodb/commit/358bfa5c) Prepare for release 4.2.3-v21 (#1715) + + +### [4.4.6-v12](https://github.com/stashed/mongodb/releases/tag/4.4.6-v12) + +- [7b684f62](https://github.com/stashed/mongodb/commit/7b684f62) Prepare for release 4.4.6-v12 (#1716) +- [e7414415](https://github.com/stashed/mongodb/commit/e7414415) Prepare for release 4.4.6-v11 (#1702) + + +### [5.0.3-v9](https://github.com/stashed/mongodb/releases/tag/5.0.3-v9) + +- [b63fcd29](https://github.com/stashed/mongodb/commit/b63fcd29) Prepare for release 5.0.3-v9 (#1717) +- [963cb8ef](https://github.com/stashed/mongodb/commit/963cb8ef) Prepare for release 5.0.3-v8 (#1703) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v21](https://github.com/stashed/mysql/releases/tag/5.7.25-v21) + +- [cdd2b0f9](https://github.com/stashed/mysql/commit/cdd2b0f9) Prepare for release 5.7.25-v21 (#671) + + +### [8.0.3-v21](https://github.com/stashed/mysql/releases/tag/8.0.3-v21) + +- [74efb1f1](https://github.com/stashed/mysql/commit/74efb1f1) Prepare for release 8.0.3-v21 (#674) + + +### [8.0.14-v21](https://github.com/stashed/mysql/releases/tag/8.0.14-v21) + +- [6c643791](https://github.com/stashed/mysql/commit/6c643791) Prepare for release 8.0.14-v21 (#672) + + +### [8.0.21-v15](https://github.com/stashed/mysql/releases/tag/8.0.21-v15) + +- [63f6fdc1](https://github.com/stashed/mysql/commit/63f6fdc1) Prepare for release 8.0.21-v15 (#673) + + + +## [stashed/nats](https://github.com/stashed/nats) + +### [2.6.1-v9](https://github.com/stashed/nats/releases/tag/2.6.1-v9) + +- [b07278f](https://github.com/stashed/nats/commit/b07278f) Prepare for release 2.6.1-v9 (#81) + + +### [2.8.2-v4](https://github.com/stashed/nats/releases/tag/2.8.2-v4) + +- [d374ae2](https://github.com/stashed/nats/commit/d374ae2) Prepare for release 2.8.2-v4 (#82) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-v16](https://github.com/stashed/percona-xtradb/releases/tag/5.7-v16) + +- [dceb6fd5](https://github.com/stashed/percona-xtradb/commit/dceb6fd5) Prepare for release 5.7-v16 (#278) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v20](https://github.com/stashed/postgres/releases/tag/9.6.19-v20) + +- [c5a91002](https://github.com/stashed/postgres/commit/c5a91002) Prepare for release 9.6.19-v20 (#1142) + + +### [10.14-v20](https://github.com/stashed/postgres/releases/tag/10.14-v20) + +- [6a71a45a](https://github.com/stashed/postgres/commit/6a71a45a) Prepare for release 10.14-v20 (#1136) + + +### [11.9-v20](https://github.com/stashed/postgres/releases/tag/11.9-v20) + +- [a52a1e1e](https://github.com/stashed/postgres/commit/a52a1e1e) Prepare for release 11.9-v20 (#1137) + + +### [12.4-v20](https://github.com/stashed/postgres/releases/tag/12.4-v20) + +- [012c0bc1](https://github.com/stashed/postgres/commit/012c0bc1) Prepare for release 12.4-v20 (#1138) + + +### [13.1-v17](https://github.com/stashed/postgres/releases/tag/13.1-v17) + +- [929f348e](https://github.com/stashed/postgres/commit/929f348e) Prepare for release 13.1-v17 (#1139) + + +### [14.0-v9](https://github.com/stashed/postgres/releases/tag/14.0-v9) + +- [bbd9e54c](https://github.com/stashed/postgres/commit/bbd9e54c) Prepare for release 14.0-v9 (#1140) + + +### [15.1-v1](https://github.com/stashed/postgres/releases/tag/15.1-v1) + +- [c1411460](https://github.com/stashed/postgres/commit/c1411460) Prepare for release 15.1-v1 (#1141) + + + +## [stashed/redis](https://github.com/stashed/redis) + +### [5.0.13-v9](https://github.com/stashed/redis/releases/tag/5.0.13-v9) + +- [307f9a7](https://github.com/stashed/redis/commit/307f9a7) Prepare for release 5.0.13-v9 (#140) + + +### [6.2.5-v9](https://github.com/stashed/redis/releases/tag/6.2.5-v9) + +- [fea59b5](https://github.com/stashed/redis/commit/fea59b5) Prepare for release 6.2.5-v9 (#141) + + +### [7.0.5-v2](https://github.com/stashed/redis/releases/tag/7.0.5-v2) + +- [92ab44b](https://github.com/stashed/redis/commit/92ab44b) Prepare for release 7.0.5-v2 (#142) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.25.0](https://github.com/stashed/stash/releases/tag/v0.25.0) + +- [06faa1fa](https://github.com/stashed/stash/commit/06faa1fae) Prepare for release v0.25.0 (#1499) +- [b7ed85bf](https://github.com/stashed/stash/commit/b7ed85bfe) Fix Upserting temporary volume (#1498) +- [371fefee](https://github.com/stashed/stash/commit/371fefeee) Fix NPE using license-proxyserver (#1497) + + + +## [stashed/ui-server](https://github.com/stashed/ui-server) + +### [v0.7.0](https://github.com/stashed/ui-server/releases/tag/v0.7.0) + +- [40819d4](https://github.com/stashed/ui-server/commit/40819d4) Prepare for release v0.7.0 (#20) + + + +## [stashed/vault](https://github.com/stashed/vault) + +### [1.10.3-v1](https://github.com/stashed/vault/releases/tag/1.10.3-v1) + +- [39030875](https://github.com/stashed/vault/commit/39030875) Prepare for release 1.10.3-v1 (#3) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2023.02.28.md b/content/docs/v2024.12.18/CHANGELOG-v2023.02.28.md new file mode 100644 index 0000000000..5ff7f09544 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2023.02.28.md @@ -0,0 +1,392 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2023.02.28 + name: Changelog-v2023.02.28 + parent: welcome + weight: 20230228 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2023.02.28/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2023.02.28/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2023.02.28 (2023-03-01) + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.26.0](https://github.com/stashed/apimachinery/releases/tag/v0.26.0) + +- [38cb356b](https://github.com/stashed/apimachinery/commit/38cb356b) Update deps + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.26.0](https://github.com/stashed/cli/releases/tag/v0.26.0) + +- [39be7edf](https://github.com/stashed/cli/commit/39be7edf) Prepare for release v0.26.0 (#175) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v22](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v22) + +- [9b77bc33](https://github.com/stashed/elasticsearch/commit/9b77bc33) Prepare for release 5.6.4-v22 (#1310) + + +### [6.2.4-v22](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v22) + +- [ac06258d](https://github.com/stashed/elasticsearch/commit/ac06258d) Prepare for release 6.2.4-v22 (#1311) + + +### [6.3.0-v22](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v22) + +- [bcd376ec](https://github.com/stashed/elasticsearch/commit/bcd376ec) Prepare for release 6.3.0-v22 (#1312) + + +### [6.4.0-v22](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v22) + +- [b2799053](https://github.com/stashed/elasticsearch/commit/b2799053) Prepare for release 6.4.0-v22 (#1313) + + +### [6.5.3-v22](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v22) + +- [9a25cb57](https://github.com/stashed/elasticsearch/commit/9a25cb57) Prepare for release 6.5.3-v22 (#1314) + + +### [6.8.0-v22](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v22) + +- [b5d9aeca](https://github.com/stashed/elasticsearch/commit/b5d9aeca) Prepare for release 6.8.0-v22 (#1315) + + +### [7.2.0-v22](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v22) + +- [01144db2](https://github.com/stashed/elasticsearch/commit/01144db2) Prepare for release 7.2.0-v22 (#1317) + + +### [7.3.2-v22](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v22) + +- [011b8b4d](https://github.com/stashed/elasticsearch/commit/011b8b4d) Prepare for release 7.3.2-v22 (#1318) + + +### [7.14.0-v8](https://github.com/stashed/elasticsearch/releases/tag/7.14.0-v8) + +- [0fe02f51](https://github.com/stashed/elasticsearch/commit/0fe02f51) Prepare for release 7.14.0-v8 (#1316) + + +### [8.2.0-v5](https://github.com/stashed/elasticsearch/releases/tag/8.2.0-v5) + +- [5e2c1f2b](https://github.com/stashed/elasticsearch/commit/5e2c1f2b) Prepare for release 8.2.0-v5 (#1319) + + + +## [stashed/enterprise](https://github.com/stashed/enterprise) + +### [v0.26.0](https://github.com/stashed/enterprise/releases/tag/v0.26.0) + +- [df406b77](https://github.com/stashed/enterprise/commit/df406b770) Prepare for release v0.26.0 (#219) +- [86f5d92c](https://github.com/stashed/enterprise/commit/86f5d92cb) Fix BackupBlueprint resolver (#218) +- [4e539c88](https://github.com/stashed/enterprise/commit/4e539c881) Update Backup Target Conditions for VolumeSnapshotter (#217) + + + +## [stashed/etcd](https://github.com/stashed/etcd) + +### [3.5.0-v9](https://github.com/stashed/etcd/releases/tag/3.5.0-v9) + +- [1d33849](https://github.com/stashed/etcd/commit/1d33849) Prepare for release 3.5.0-v9 (#67) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2023.02.28](https://github.com/stashed/installer/releases/tag/v2023.02.28) + +- [20e21083](https://github.com/stashed/installer/commit/20e21083) Prepare for release v2023.02.28 (#294) +- [ebf193a8](https://github.com/stashed/installer/commit/ebf193a8) Run GH actions on ubuntu-20.04 (#291) + + + +## [stashed/kubedump](https://github.com/stashed/kubedump) + +### [0.1.0-v5](https://github.com/stashed/kubedump/releases/tag/0.1.0-v5) + +- [472c892](https://github.com/stashed/kubedump/commit/472c892) Prepare for release 0.1.0-v5 (#27) + + + +## [stashed/mariadb](https://github.com/stashed/mariadb) + +### [10.5.8-v15](https://github.com/stashed/mariadb/releases/tag/10.5.8-v15) + +- [4591bd5](https://github.com/stashed/mariadb/commit/4591bd5) Prepare for release 10.5.8-v15 (#210) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v22](https://github.com/stashed/mongodb/releases/tag/3.4.17-v22) + +- [830dcd31](https://github.com/stashed/mongodb/commit/830dcd31) Prepare for release 3.4.17-v22 (#1718) + + +### [3.4.22-v22](https://github.com/stashed/mongodb/releases/tag/3.4.22-v22) + +- [1bd76847](https://github.com/stashed/mongodb/commit/1bd76847) Prepare for release 3.4.22-v22 (#1719) + + +### [3.6.8-v22](https://github.com/stashed/mongodb/releases/tag/3.6.8-v22) + +- [e52ccd58](https://github.com/stashed/mongodb/commit/e52ccd58) Prepare for release 3.6.8-v22 (#1721) + + +### [3.6.13-v22](https://github.com/stashed/mongodb/releases/tag/3.6.13-v22) + +- [2d8fa2aa](https://github.com/stashed/mongodb/commit/2d8fa2aa) Prepare for release 3.6.13-v22 (#1720) + + +### [4.0.3-v22](https://github.com/stashed/mongodb/releases/tag/4.0.3-v22) + +- [ef458a74](https://github.com/stashed/mongodb/commit/ef458a74) Prepare for release 4.0.3-v22 (#1723) + + +### [4.0.5-v22](https://github.com/stashed/mongodb/releases/tag/4.0.5-v22) + +- [497da3b7](https://github.com/stashed/mongodb/commit/497da3b7) Prepare for release 4.0.5-v22 (#1724) + + +### [4.0.11-v22](https://github.com/stashed/mongodb/releases/tag/4.0.11-v22) + +- [aa9c6f32](https://github.com/stashed/mongodb/commit/aa9c6f32) Prepare for release 4.0.11-v22 (#1722) + + +### [4.1.4-v22](https://github.com/stashed/mongodb/releases/tag/4.1.4-v22) + +- [a2fff17c](https://github.com/stashed/mongodb/commit/a2fff17c) Prepare for release 4.1.4-v22 (#1726) + + +### [4.1.7-v22](https://github.com/stashed/mongodb/releases/tag/4.1.7-v22) + +- [16dd4a13](https://github.com/stashed/mongodb/commit/16dd4a13) Prepare for release 4.1.7-v22 (#1727) + + +### [4.1.13-v22](https://github.com/stashed/mongodb/releases/tag/4.1.13-v22) + +- [118255a9](https://github.com/stashed/mongodb/commit/118255a9) Prepare for release 4.1.13-v22 (#1725) + + +### [4.2.3-v22](https://github.com/stashed/mongodb/releases/tag/4.2.3-v22) + +- [1a6305af](https://github.com/stashed/mongodb/commit/1a6305af) Prepare for release 4.2.3-v22 (#1728) + + +### [4.4.6-v13](https://github.com/stashed/mongodb/releases/tag/4.4.6-v13) + +- [a6d88593](https://github.com/stashed/mongodb/commit/a6d88593) Prepare for release 4.4.6-v13 (#1729) + + +### [5.0.3-v10](https://github.com/stashed/mongodb/releases/tag/5.0.3-v10) + +- [d896df47](https://github.com/stashed/mongodb/commit/d896df47) Prepare for release 5.0.3-v10 (#1731) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v22](https://github.com/stashed/mysql/releases/tag/5.7.25-v22) + +- [9da4bdcb](https://github.com/stashed/mysql/commit/9da4bdcb) Prepare for release 5.7.25-v22 (#676) + + +### [8.0.3-v22](https://github.com/stashed/mysql/releases/tag/8.0.3-v22) + +- [5becd133](https://github.com/stashed/mysql/commit/5becd133) Prepare for release 8.0.3-v22 (#679) + + +### [8.0.14-v22](https://github.com/stashed/mysql/releases/tag/8.0.14-v22) + +- [55634236](https://github.com/stashed/mysql/commit/55634236) Prepare for release 8.0.14-v22 (#677) + + +### [8.0.21-v16](https://github.com/stashed/mysql/releases/tag/8.0.21-v16) + +- [853ef87c](https://github.com/stashed/mysql/commit/853ef87c) Prepare for release 8.0.21-v16 (#678) + + + +## [stashed/nats](https://github.com/stashed/nats) + +### [2.6.1-v10](https://github.com/stashed/nats/releases/tag/2.6.1-v10) + +- [e0ba713](https://github.com/stashed/nats/commit/e0ba713) Prepare for release 2.6.1-v10 (#84) + + +### [2.8.2-v5](https://github.com/stashed/nats/releases/tag/2.8.2-v5) + +- [668989d](https://github.com/stashed/nats/commit/668989d) Prepare for release 2.8.2-v5 (#85) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-v17](https://github.com/stashed/percona-xtradb/releases/tag/5.7-v17) + +- [f6d1b63b](https://github.com/stashed/percona-xtradb/commit/f6d1b63b) Prepare for release 5.7-v17 (#280) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v21](https://github.com/stashed/postgres/releases/tag/9.6.19-v21) + +- [5a34673c](https://github.com/stashed/postgres/commit/5a34673c) Prepare for release 9.6.19-v21 (#1150) + + +### [10.14-v21](https://github.com/stashed/postgres/releases/tag/10.14-v21) + +- [9fd0b5a3](https://github.com/stashed/postgres/commit/9fd0b5a3) Prepare for release 10.14-v21 (#1144) + + +### [11.9-v21](https://github.com/stashed/postgres/releases/tag/11.9-v21) + +- [1d8c983e](https://github.com/stashed/postgres/commit/1d8c983e) Prepare for release 11.9-v21 (#1145) + + +### [12.4-v21](https://github.com/stashed/postgres/releases/tag/12.4-v21) + +- [3c2d69cd](https://github.com/stashed/postgres/commit/3c2d69cd) Prepare for release 12.4-v21 (#1146) + + +### [13.1-v18](https://github.com/stashed/postgres/releases/tag/13.1-v18) + +- [18e00555](https://github.com/stashed/postgres/commit/18e00555) Prepare for release 13.1-v18 (#1147) + + +### [14.0-v10](https://github.com/stashed/postgres/releases/tag/14.0-v10) + +- [9c7d6efa](https://github.com/stashed/postgres/commit/9c7d6efa) Prepare for release 14.0-v10 (#1148) + + +### [15.1-v2](https://github.com/stashed/postgres/releases/tag/15.1-v2) + +- [9ec57c96](https://github.com/stashed/postgres/commit/9ec57c96) Prepare for release 15.1-v2 (#1149) + + + +## [stashed/redis](https://github.com/stashed/redis) + +### [5.0.13-v10](https://github.com/stashed/redis/releases/tag/5.0.13-v10) + +- [602099c](https://github.com/stashed/redis/commit/602099c) Prepare for release 5.0.13-v10 (#144) + + +### [6.2.5-v10](https://github.com/stashed/redis/releases/tag/6.2.5-v10) + +- [8fb361c](https://github.com/stashed/redis/commit/8fb361c) Prepare for release 6.2.5-v10 (#145) + + +### [7.0.5-v3](https://github.com/stashed/redis/releases/tag/7.0.5-v3) + +- [2c2e6f1](https://github.com/stashed/redis/commit/2c2e6f1) Prepare for release 7.0.5-v3 (#146) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.26.0](https://github.com/stashed/stash/releases/tag/v0.26.0) + +- [0ee682b5](https://github.com/stashed/stash/commit/0ee682b59) Prepare for release v0.26.0 (#1501) +- [23bc702a](https://github.com/stashed/stash/commit/23bc702ae) Fix status updating of volumesnapshotter command. (#1500) + + + +## [stashed/ui-server](https://github.com/stashed/ui-server) + +### [v0.8.0](https://github.com/stashed/ui-server/releases/tag/v0.8.0) + +- [d3b13ce](https://github.com/stashed/ui-server/commit/d3b13ce) Prepare for release v0.8.0 (#21) + + + +## [stashed/vault](https://github.com/stashed/vault) + +### [1.10.3-v2](https://github.com/stashed/vault/releases/tag/1.10.3-v2) + +- [e47e82e9](https://github.com/stashed/vault/commit/e47e82e9) Prepare for release 1.10.3-v2 (#5) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2023.03.13.md b/content/docs/v2024.12.18/CHANGELOG-v2023.03.13.md new file mode 100644 index 0000000000..c222b23eb7 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2023.03.13.md @@ -0,0 +1,442 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2023.03.13 + name: Changelog-v2023.03.13 + parent: welcome + weight: 20230313 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2023.03.13/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2023.03.13/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2023.03.13 (2023-03-13) + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.27.0](https://github.com/stashed/apimachinery/releases/tag/v0.27.0) + +- [4fef7bc2](https://github.com/stashed/apimachinery/commit/4fef7bc2) Allow ci and update-crds workflows cocurrently +- [83908c99](https://github.com/stashed/apimachinery/commit/83908c99) Fix unlock error message in prune command +- [f47c89ef](https://github.com/stashed/apimachinery/commit/f47c89ef) Unlock if prune fails for locked repo (#198) +- [1f431032](https://github.com/stashed/apimachinery/commit/1f431032) Update workflows (Go 1.20, k8s 1.26) (#197) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.27.0](https://github.com/stashed/cli/releases/tag/v0.27.0) + +- [db608b5f](https://github.com/stashed/cli/commit/db608b5f) Prepare for release v0.27.0 (#178) +- [ee66407a](https://github.com/stashed/cli/commit/ee66407a) Fix unlock command for local repository (#177) +- [ba3e3b07](https://github.com/stashed/cli/commit/ba3e3b07) Update workflows (Go 1.20, k8s 1.26) (#176) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v23](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v23) + +- [25cf7cac](https://github.com/stashed/elasticsearch/commit/25cf7cac) Prepare for release 5.6.4-v23 (#1332) +- [e2549ec7](https://github.com/stashed/elasticsearch/commit/e2549ec7) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1321) (#1322) + + +### [6.2.4-v23](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v23) + +- [965fdba5](https://github.com/stashed/elasticsearch/commit/965fdba5) Prepare for release 6.2.4-v23 (#1333) +- [027714c6](https://github.com/stashed/elasticsearch/commit/027714c6) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1321) (#1323) + + +### [6.3.0-v23](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v23) + +- [ef7ffd30](https://github.com/stashed/elasticsearch/commit/ef7ffd30) Prepare for release 6.3.0-v23 (#1334) +- [e3f63e8e](https://github.com/stashed/elasticsearch/commit/e3f63e8e) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1321) (#1324) + + +### [6.4.0-v23](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v23) + +- [6580b4a3](https://github.com/stashed/elasticsearch/commit/6580b4a3) Prepare for release 6.4.0-v23 (#1335) +- [2f5d2491](https://github.com/stashed/elasticsearch/commit/2f5d2491) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1321) (#1325) + + +### [6.5.3-v23](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v23) + +- [408e0c76](https://github.com/stashed/elasticsearch/commit/408e0c76) Prepare for release 6.5.3-v23 (#1336) +- [0d231f63](https://github.com/stashed/elasticsearch/commit/0d231f63) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1321) (#1326) + + +### [6.8.0-v23](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v23) + +- [2de1fd44](https://github.com/stashed/elasticsearch/commit/2de1fd44) Prepare for release 6.8.0-v23 (#1337) +- [7d004667](https://github.com/stashed/elasticsearch/commit/7d004667) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1321) (#1327) + + +### [7.2.0-v23](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v23) + +- [97143e82](https://github.com/stashed/elasticsearch/commit/97143e82) Prepare for release 7.2.0-v23 (#1339) +- [3d172262](https://github.com/stashed/elasticsearch/commit/3d172262) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1321) (#1329) + + +### [7.3.2-v23](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v23) + +- [fdadc2fc](https://github.com/stashed/elasticsearch/commit/fdadc2fc) Prepare for release 7.3.2-v23 (#1340) +- [0a26217c](https://github.com/stashed/elasticsearch/commit/0a26217c) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1321) (#1330) + + +### [7.14.0-v9](https://github.com/stashed/elasticsearch/releases/tag/7.14.0-v9) + +- [f707e6a9](https://github.com/stashed/elasticsearch/commit/f707e6a9) Prepare for release 7.14.0-v9 (#1338) +- [c3017395](https://github.com/stashed/elasticsearch/commit/c3017395) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1321) (#1328) + + +### [8.2.0-v6](https://github.com/stashed/elasticsearch/releases/tag/8.2.0-v6) + +- [a06cd438](https://github.com/stashed/elasticsearch/commit/a06cd438) Prepare for release 8.2.0-v6 (#1341) +- [a31a3fc4](https://github.com/stashed/elasticsearch/commit/a31a3fc4) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1321) (#1331) + + + +## [stashed/enterprise](https://github.com/stashed/enterprise) + +### [v0.27.0](https://github.com/stashed/enterprise/releases/tag/v0.27.0) + +- [089b0070](https://github.com/stashed/enterprise/commit/089b00703) Prepare for release v0.27.0 (#223) +- [4bfef40b](https://github.com/stashed/enterprise/commit/4bfef40bf) Use valid labels for AutoBackup resources (#221) +- [053392e9](https://github.com/stashed/enterprise/commit/053392e98) Update workflows (Go 1.20, k8s 1.26) (#220) + + + +## [stashed/etcd](https://github.com/stashed/etcd) + +### [3.5.0-v10](https://github.com/stashed/etcd/releases/tag/3.5.0-v10) + +- [ba337f8](https://github.com/stashed/etcd/commit/ba337f8) Prepare for release 3.5.0-v10 (#71) +- [9491906](https://github.com/stashed/etcd/commit/9491906) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#69) (#70) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2023.03.13](https://github.com/stashed/installer/releases/tag/v2023.03.13) + +- [63853c7a](https://github.com/stashed/installer/commit/63853c7a) Prepare for release v2023.03.13 (#296) +- [ab96161a](https://github.com/stashed/installer/commit/ab96161a) Update workflows (Go 1.20, k8s 1.26) (#295) + + + +## [stashed/kubedump](https://github.com/stashed/kubedump) + +### [0.1.0-v6](https://github.com/stashed/kubedump/releases/tag/0.1.0-v6) + +- [71e0a72](https://github.com/stashed/kubedump/commit/71e0a72) Prepare for release 0.1.0-v6 (#31) +- [f3597b9](https://github.com/stashed/kubedump/commit/f3597b9) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#29) (#30) + + + +## [stashed/mariadb](https://github.com/stashed/mariadb) + +### [10.5.8-v16](https://github.com/stashed/mariadb/releases/tag/10.5.8-v16) + +- [cd88cee](https://github.com/stashed/mariadb/commit/cd88cee) Prepare for release 10.5.8-v16 (#214) +- [e6b9f6a](https://github.com/stashed/mariadb/commit/e6b9f6a) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#212) (#213) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v23](https://github.com/stashed/mongodb/releases/tag/3.4.17-v23) + +- [5cd80f95](https://github.com/stashed/mongodb/commit/5cd80f95) Prepare for release 3.4.17-v23 (#1746) +- [5efeda9a](https://github.com/stashed/mongodb/commit/5efeda9a) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1732) (#1733) + + +### [3.4.22-v23](https://github.com/stashed/mongodb/releases/tag/3.4.22-v23) + +- [e6a93a3b](https://github.com/stashed/mongodb/commit/e6a93a3b) Prepare for release 3.4.22-v23 (#1747) +- [4b0272c7](https://github.com/stashed/mongodb/commit/4b0272c7) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1732) (#1734) + + +### [3.6.8-v23](https://github.com/stashed/mongodb/releases/tag/3.6.8-v23) + +- [ab9e3843](https://github.com/stashed/mongodb/commit/ab9e3843) Prepare for release 3.6.8-v23 (#1749) +- [892ece69](https://github.com/stashed/mongodb/commit/892ece69) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1732) (#1736) + + +### [3.6.13-v23](https://github.com/stashed/mongodb/releases/tag/3.6.13-v23) + +- [ba9f6e18](https://github.com/stashed/mongodb/commit/ba9f6e18) Prepare for release 3.6.13-v23 (#1748) +- [2f597645](https://github.com/stashed/mongodb/commit/2f597645) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1732) (#1735) + + +### [4.0.3-v23](https://github.com/stashed/mongodb/releases/tag/4.0.3-v23) + +- [6cade14c](https://github.com/stashed/mongodb/commit/6cade14c) Prepare for release 4.0.3-v23 (#1751) +- [07f9216c](https://github.com/stashed/mongodb/commit/07f9216c) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1732) (#1738) + + +### [4.0.5-v23](https://github.com/stashed/mongodb/releases/tag/4.0.5-v23) + +- [aa33c9f0](https://github.com/stashed/mongodb/commit/aa33c9f0) Prepare for release 4.0.5-v23 (#1752) +- [30373c9c](https://github.com/stashed/mongodb/commit/30373c9c) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1732) (#1739) + + +### [4.0.11-v23](https://github.com/stashed/mongodb/releases/tag/4.0.11-v23) + +- [f4ed5644](https://github.com/stashed/mongodb/commit/f4ed5644) Prepare for release 4.0.11-v23 (#1750) +- [7df3c35f](https://github.com/stashed/mongodb/commit/7df3c35f) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1732) (#1737) + + +### [4.1.4-v23](https://github.com/stashed/mongodb/releases/tag/4.1.4-v23) + +- [68561b23](https://github.com/stashed/mongodb/commit/68561b23) Prepare for release 4.1.4-v23 (#1754) +- [2ec01364](https://github.com/stashed/mongodb/commit/2ec01364) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1732) (#1741) + + +### [4.1.7-v23](https://github.com/stashed/mongodb/releases/tag/4.1.7-v23) + +- [a2faed5c](https://github.com/stashed/mongodb/commit/a2faed5c) Prepare for release 4.1.7-v23 (#1755) +- [2ff4480e](https://github.com/stashed/mongodb/commit/2ff4480e) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1732) (#1742) + + +### [4.1.13-v23](https://github.com/stashed/mongodb/releases/tag/4.1.13-v23) + +- [5c3afe06](https://github.com/stashed/mongodb/commit/5c3afe06) Prepare for release 4.1.13-v23 (#1753) +- [15b0cb45](https://github.com/stashed/mongodb/commit/15b0cb45) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1732) (#1740) + + +### [4.2.3-v23](https://github.com/stashed/mongodb/releases/tag/4.2.3-v23) + +- [8fc50278](https://github.com/stashed/mongodb/commit/8fc50278) Prepare for release 4.2.3-v23 (#1756) +- [9751cb56](https://github.com/stashed/mongodb/commit/9751cb56) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1732) (#1743) + + +### [4.4.6-v14](https://github.com/stashed/mongodb/releases/tag/4.4.6-v14) + +- [5277b7fa](https://github.com/stashed/mongodb/commit/5277b7fa) Prepare for release 4.4.6-v14 (#1757) +- [4942cba5](https://github.com/stashed/mongodb/commit/4942cba5) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1732) (#1744) + + +### [5.0.3-v11](https://github.com/stashed/mongodb/releases/tag/5.0.3-v11) + +- [e7262879](https://github.com/stashed/mongodb/commit/e7262879) Prepare for release 5.0.3-v11 (#1758) +- [71903562](https://github.com/stashed/mongodb/commit/71903562) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1732) (#1745) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v23](https://github.com/stashed/mysql/releases/tag/5.7.25-v23) + +- [4d73c4c7](https://github.com/stashed/mysql/commit/4d73c4c7) Prepare for release 5.7.25-v23 (#686) +- [2a260942](https://github.com/stashed/mysql/commit/2a260942) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#681) (#682) + + +### [8.0.3-v23](https://github.com/stashed/mysql/releases/tag/8.0.3-v23) + +- [820c4b34](https://github.com/stashed/mysql/commit/820c4b34) Prepare for release 8.0.3-v23 (#689) +- [fd404c15](https://github.com/stashed/mysql/commit/fd404c15) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#681) (#685) + + +### [8.0.14-v23](https://github.com/stashed/mysql/releases/tag/8.0.14-v23) + +- [2a043152](https://github.com/stashed/mysql/commit/2a043152) Prepare for release 8.0.14-v23 (#687) +- [93517b8d](https://github.com/stashed/mysql/commit/93517b8d) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#681) (#683) + + +### [8.0.21-v17](https://github.com/stashed/mysql/releases/tag/8.0.21-v17) + +- [e1d2a3fd](https://github.com/stashed/mysql/commit/e1d2a3fd) Prepare for release 8.0.21-v17 (#688) +- [5587ec19](https://github.com/stashed/mysql/commit/5587ec19) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#681) (#684) + + + +## [stashed/nats](https://github.com/stashed/nats) + +### [2.6.1-v11](https://github.com/stashed/nats/releases/tag/2.6.1-v11) + +- [29202da](https://github.com/stashed/nats/commit/29202da) Prepare for release 2.6.1-v11 (#90) +- [78b4136](https://github.com/stashed/nats/commit/78b4136) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#87) (#88) + + +### [2.8.2-v6](https://github.com/stashed/nats/releases/tag/2.8.2-v6) + +- [1d3b90e](https://github.com/stashed/nats/commit/1d3b90e) Prepare for release 2.8.2-v6 (#91) +- [92a4648](https://github.com/stashed/nats/commit/92a4648) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#87) (#89) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-v18](https://github.com/stashed/percona-xtradb/releases/tag/5.7-v18) + +- [efc95cd8](https://github.com/stashed/percona-xtradb/commit/efc95cd8) Prepare for release 5.7-v18 (#284) +- [bb2fd734](https://github.com/stashed/percona-xtradb/commit/bb2fd734) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#282) (#283) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v22](https://github.com/stashed/postgres/releases/tag/9.6.19-v22) + +- [776eae29](https://github.com/stashed/postgres/commit/776eae29) Prepare for release 9.6.19-v22 (#1166) +- [4b01ad51](https://github.com/stashed/postgres/commit/4b01ad51) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1152) (#1159) + + +### [10.14-v22](https://github.com/stashed/postgres/releases/tag/10.14-v22) + +- [74283c70](https://github.com/stashed/postgres/commit/74283c70) Prepare for release 10.14-v22 (#1160) +- [7d65c166](https://github.com/stashed/postgres/commit/7d65c166) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1152) (#1153) + + +### [11.9-v22](https://github.com/stashed/postgres/releases/tag/11.9-v22) + +- [9f1de1c6](https://github.com/stashed/postgres/commit/9f1de1c6) Prepare for release 11.9-v22 (#1161) +- [605163a2](https://github.com/stashed/postgres/commit/605163a2) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1152) (#1154) + + +### [12.4-v22](https://github.com/stashed/postgres/releases/tag/12.4-v22) + +- [788806a2](https://github.com/stashed/postgres/commit/788806a2) Prepare for release 12.4-v22 (#1162) +- [db464ab0](https://github.com/stashed/postgres/commit/db464ab0) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1152) (#1155) + + +### [13.1-v19](https://github.com/stashed/postgres/releases/tag/13.1-v19) + +- [7fb61d96](https://github.com/stashed/postgres/commit/7fb61d96) Prepare for release 13.1-v19 (#1163) +- [8c935e00](https://github.com/stashed/postgres/commit/8c935e00) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1152) (#1156) + + +### [14.0-v11](https://github.com/stashed/postgres/releases/tag/14.0-v11) + +- [93212ea6](https://github.com/stashed/postgres/commit/93212ea6) Prepare for release 14.0-v11 (#1164) +- [1ac9edd5](https://github.com/stashed/postgres/commit/1ac9edd5) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1152) (#1157) + + +### [15.1-v3](https://github.com/stashed/postgres/releases/tag/15.1-v3) + +- [31f3dd33](https://github.com/stashed/postgres/commit/31f3dd33) Prepare for release 15.1-v3 (#1165) +- [9c6d9590](https://github.com/stashed/postgres/commit/9c6d9590) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#1152) (#1158) + + + +## [stashed/redis](https://github.com/stashed/redis) + +### [5.0.13-v11](https://github.com/stashed/redis/releases/tag/5.0.13-v11) + +- [73da1c1](https://github.com/stashed/redis/commit/73da1c1) Prepare for release 5.0.13-v11 (#152) +- [9f7e222](https://github.com/stashed/redis/commit/9f7e222) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#148) (#149) + + +### [6.2.5-v11](https://github.com/stashed/redis/releases/tag/6.2.5-v11) + +- [dc8e853](https://github.com/stashed/redis/commit/dc8e853) Prepare for release 6.2.5-v11 (#153) +- [e865167](https://github.com/stashed/redis/commit/e865167) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#148) (#150) + + +### [7.0.5-v4](https://github.com/stashed/redis/releases/tag/7.0.5-v4) + +- [dd4da56](https://github.com/stashed/redis/commit/dd4da56) Prepare for release 7.0.5-v4 (#154) +- [ae71390](https://github.com/stashed/redis/commit/ae71390) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#148) (#151) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.27.0](https://github.com/stashed/stash/releases/tag/v0.27.0) + +- [d3428094](https://github.com/stashed/stash/commit/d3428094a) Prepare for release v0.27.0 (#1508) +- [87bf7e8e](https://github.com/stashed/stash/commit/87bf7e8e5) Update workflows (Go 1.20, k8s 1.26) (#1502) + + + +## [stashed/ui-server](https://github.com/stashed/ui-server) + +### [v0.9.0](https://github.com/stashed/ui-server/releases/tag/v0.9.0) + +- [0c31efb](https://github.com/stashed/ui-server/commit/0c31efb) Prepare for release v0.9.0 (#23) +- [01975fa](https://github.com/stashed/ui-server/commit/01975fa) Update workflows (Go 1.20, k8s 1.26) (#22) + + + +## [stashed/vault](https://github.com/stashed/vault) + +### [1.10.3-v3](https://github.com/stashed/vault/releases/tag/1.10.3-v3) + +- [52bbbf05](https://github.com/stashed/vault/commit/52bbbf05) Prepare for release 1.10.3-v3 (#9) +- [4dac4a85](https://github.com/stashed/vault/commit/4dac4a85) [cherry-pick] Update workflows (Go 1.20, k8s 1.26) (#7) (#8) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2023.03.20.md b/content/docs/v2024.12.18/CHANGELOG-v2023.03.20.md new file mode 100644 index 0000000000..85f5f09918 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2023.03.20.md @@ -0,0 +1,393 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2023.03.20 + name: Changelog-v2023.03.20 + parent: welcome + weight: 20230320 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2023.03.20/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2023.03.20/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2023.03.20 (2023-03-19) + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.28.0](https://github.com/stashed/apimachinery/releases/tag/v0.28.0) + +- [292f37f4](https://github.com/stashed/apimachinery/commit/292f37f4) Update dependencies +- [1c5d99c3](https://github.com/stashed/apimachinery/commit/1c5d99c3) Create directory for local repository for restic init (#199) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.28.0](https://github.com/stashed/cli/releases/tag/v0.28.0) + +- [fc785021](https://github.com/stashed/cli/commit/fc785021) Prepare for release v0.28.0 (#180) +- [9cadafcb](https://github.com/stashed/cli/commit/9cadafcb) Enable unlocking of local repository on NFS volume (#179) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v24](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v24) + +- [6cd18de9](https://github.com/stashed/elasticsearch/commit/6cd18de9) Prepare for release 5.6.4-v24 (#1344) + + +### [6.2.4-v24](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v24) + +- [11f17468](https://github.com/stashed/elasticsearch/commit/11f17468) Prepare for release 6.2.4-v24 (#1345) + + +### [6.3.0-v24](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v24) + +- [72441b73](https://github.com/stashed/elasticsearch/commit/72441b73) Prepare for release 6.3.0-v24 (#1346) + + +### [6.4.0-v24](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v24) + +- [ebb9119a](https://github.com/stashed/elasticsearch/commit/ebb9119a) Prepare for release 6.4.0-v24 (#1347) + + +### [6.5.3-v24](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v24) + +- [2bfe6379](https://github.com/stashed/elasticsearch/commit/2bfe6379) Prepare for release 6.5.3-v24 (#1348) + + +### [6.8.0-v24](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v24) + +- [7f221239](https://github.com/stashed/elasticsearch/commit/7f221239) Prepare for release 6.8.0-v24 (#1349) + + +### [7.2.0-v24](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v24) + +- [cf23989f](https://github.com/stashed/elasticsearch/commit/cf23989f) Prepare for release 7.2.0-v24 (#1351) + + +### [7.3.2-v24](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v24) + +- [eb185e09](https://github.com/stashed/elasticsearch/commit/eb185e09) Prepare for release 7.3.2-v24 (#1352) + + +### [7.14.0-v10](https://github.com/stashed/elasticsearch/releases/tag/7.14.0-v10) + +- [2fc98a7b](https://github.com/stashed/elasticsearch/commit/2fc98a7b) Prepare for release 7.14.0-v10 (#1350) + + +### [8.2.0-v7](https://github.com/stashed/elasticsearch/releases/tag/8.2.0-v7) + +- [3c4d977e](https://github.com/stashed/elasticsearch/commit/3c4d977e) Prepare for release 8.2.0-v7 (#1353) + + + +## [stashed/enterprise](https://github.com/stashed/enterprise) + +### [v0.28.0](https://github.com/stashed/enterprise/releases/tag/v0.28.0) + +- [69cc9409](https://github.com/stashed/enterprise/commit/69cc9409f) Prepare for release v0.28.0 (#226) +- [d882beb1](https://github.com/stashed/enterprise/commit/d882beb1a) Add unlock command for CLI (#224) +- [25b4ff16](https://github.com/stashed/enterprise/commit/25b4ff160) Append image pull secrets instead of replace (#225) + + + +## [stashed/etcd](https://github.com/stashed/etcd) + +### [3.5.0-v11](https://github.com/stashed/etcd/releases/tag/3.5.0-v11) + +- [67526a5](https://github.com/stashed/etcd/commit/67526a5) Prepare for release 3.5.0-v11 (#73) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2023.03.20](https://github.com/stashed/installer/releases/tag/v2023.03.20) + +- [1ec11e29](https://github.com/stashed/installer/commit/1ec11e29) Prepare for release v2023.03.20 (#297) + + + +## [stashed/kubedump](https://github.com/stashed/kubedump) + +### [0.1.0-v7](https://github.com/stashed/kubedump/releases/tag/0.1.0-v7) + +- [f6961d5](https://github.com/stashed/kubedump/commit/f6961d5) Prepare for release 0.1.0-v7 (#33) + + + +## [stashed/mariadb](https://github.com/stashed/mariadb) + +### [10.5.8-v17](https://github.com/stashed/mariadb/releases/tag/10.5.8-v17) + +- [18974b1](https://github.com/stashed/mariadb/commit/18974b1) Prepare for release 10.5.8-v17 (#216) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v24](https://github.com/stashed/mongodb/releases/tag/3.4.17-v24) + +- [a35ca221](https://github.com/stashed/mongodb/commit/a35ca221) Prepare for release 3.4.17-v24 (#1760) + + +### [3.4.22-v24](https://github.com/stashed/mongodb/releases/tag/3.4.22-v24) + +- [0acd0614](https://github.com/stashed/mongodb/commit/0acd0614) Prepare for release 3.4.22-v24 (#1761) + + +### [3.6.8-v24](https://github.com/stashed/mongodb/releases/tag/3.6.8-v24) + +- [90e1ee6f](https://github.com/stashed/mongodb/commit/90e1ee6f) Prepare for release 3.6.8-v24 (#1763) + + +### [3.6.13-v24](https://github.com/stashed/mongodb/releases/tag/3.6.13-v24) + +- [3b6758d1](https://github.com/stashed/mongodb/commit/3b6758d1) Prepare for release 3.6.13-v24 (#1762) + + +### [4.0.3-v24](https://github.com/stashed/mongodb/releases/tag/4.0.3-v24) + +- [e102289e](https://github.com/stashed/mongodb/commit/e102289e) Prepare for release 4.0.3-v24 (#1765) + + +### [4.0.5-v24](https://github.com/stashed/mongodb/releases/tag/4.0.5-v24) + +- [65473863](https://github.com/stashed/mongodb/commit/65473863) Prepare for release 4.0.5-v24 (#1766) + + +### [4.0.11-v24](https://github.com/stashed/mongodb/releases/tag/4.0.11-v24) + +- [2d985943](https://github.com/stashed/mongodb/commit/2d985943) Prepare for release 4.0.11-v24 (#1764) + + +### [4.1.4-v24](https://github.com/stashed/mongodb/releases/tag/4.1.4-v24) + +- [539a0db1](https://github.com/stashed/mongodb/commit/539a0db1) Prepare for release 4.1.4-v24 (#1768) + + +### [4.1.7-v24](https://github.com/stashed/mongodb/releases/tag/4.1.7-v24) + +- [3e8c030d](https://github.com/stashed/mongodb/commit/3e8c030d) Prepare for release 4.1.7-v24 (#1769) + + +### [4.1.13-v24](https://github.com/stashed/mongodb/releases/tag/4.1.13-v24) + +- [b501f60f](https://github.com/stashed/mongodb/commit/b501f60f) Prepare for release 4.1.13-v24 (#1767) + + +### [4.2.3-v24](https://github.com/stashed/mongodb/releases/tag/4.2.3-v24) + +- [c526024e](https://github.com/stashed/mongodb/commit/c526024e) Prepare for release 4.2.3-v24 (#1770) + + +### [4.4.6-v15](https://github.com/stashed/mongodb/releases/tag/4.4.6-v15) + +- [61902b46](https://github.com/stashed/mongodb/commit/61902b46) Prepare for release 4.4.6-v15 (#1771) + + +### [5.0.3-v12](https://github.com/stashed/mongodb/releases/tag/5.0.3-v12) + +- [38ad041e](https://github.com/stashed/mongodb/commit/38ad041e) Prepare for release 5.0.3-v12 (#1772) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v24](https://github.com/stashed/mysql/releases/tag/5.7.25-v24) + +- [a8dcdc62](https://github.com/stashed/mysql/commit/a8dcdc62) Prepare for release 5.7.25-v24 (#691) + + +### [8.0.3-v24](https://github.com/stashed/mysql/releases/tag/8.0.3-v24) + +- [15020258](https://github.com/stashed/mysql/commit/15020258) Prepare for release 8.0.3-v24 (#694) + + +### [8.0.14-v24](https://github.com/stashed/mysql/releases/tag/8.0.14-v24) + +- [80fe4fb8](https://github.com/stashed/mysql/commit/80fe4fb8) Prepare for release 8.0.14-v24 (#692) + + +### [8.0.21-v18](https://github.com/stashed/mysql/releases/tag/8.0.21-v18) + +- [5fed08e3](https://github.com/stashed/mysql/commit/5fed08e3) Prepare for release 8.0.21-v18 (#693) + + + +## [stashed/nats](https://github.com/stashed/nats) + +### [2.6.1-v12](https://github.com/stashed/nats/releases/tag/2.6.1-v12) + +- [0a385ca](https://github.com/stashed/nats/commit/0a385ca) Prepare for release 2.6.1-v12 (#93) + + +### [2.8.2-v7](https://github.com/stashed/nats/releases/tag/2.8.2-v7) + +- [e050da5](https://github.com/stashed/nats/commit/e050da5) Prepare for release 2.8.2-v7 (#94) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-v19](https://github.com/stashed/percona-xtradb/releases/tag/5.7-v19) + +- [4c93ae53](https://github.com/stashed/percona-xtradb/commit/4c93ae53) Prepare for release 5.7-v19 (#286) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v23](https://github.com/stashed/postgres/releases/tag/9.6.19-v23) + +- [ca9ce6bd](https://github.com/stashed/postgres/commit/ca9ce6bd) Prepare for release 9.6.19-v23 (#1174) + + +### [10.14-v23](https://github.com/stashed/postgres/releases/tag/10.14-v23) + +- [47b1062f](https://github.com/stashed/postgres/commit/47b1062f) Prepare for release 10.14-v23 (#1168) + + +### [11.9-v23](https://github.com/stashed/postgres/releases/tag/11.9-v23) + +- [398f746e](https://github.com/stashed/postgres/commit/398f746e) Prepare for release 11.9-v23 (#1169) + + +### [12.4-v23](https://github.com/stashed/postgres/releases/tag/12.4-v23) + +- [0f2c4aa1](https://github.com/stashed/postgres/commit/0f2c4aa1) Prepare for release 12.4-v23 (#1170) + + +### [13.1-v20](https://github.com/stashed/postgres/releases/tag/13.1-v20) + +- [646372a2](https://github.com/stashed/postgres/commit/646372a2) Prepare for release 13.1-v20 (#1171) + + +### [14.0-v12](https://github.com/stashed/postgres/releases/tag/14.0-v12) + +- [9a83d73b](https://github.com/stashed/postgres/commit/9a83d73b) Prepare for release 14.0-v12 (#1172) + + +### [15.1-v4](https://github.com/stashed/postgres/releases/tag/15.1-v4) + +- [4be14a52](https://github.com/stashed/postgres/commit/4be14a52) Prepare for release 15.1-v4 (#1173) + + + +## [stashed/redis](https://github.com/stashed/redis) + +### [5.0.13-v12](https://github.com/stashed/redis/releases/tag/5.0.13-v12) + +- [9b351df](https://github.com/stashed/redis/commit/9b351df) Prepare for release 5.0.13-v12 (#156) + + +### [6.2.5-v12](https://github.com/stashed/redis/releases/tag/6.2.5-v12) + +- [1d7e7cf](https://github.com/stashed/redis/commit/1d7e7cf) Prepare for release 6.2.5-v12 (#157) + + +### [7.0.5-v5](https://github.com/stashed/redis/releases/tag/7.0.5-v5) + +- [46bddd9](https://github.com/stashed/redis/commit/46bddd9) Prepare for release 7.0.5-v5 (#158) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.28.0](https://github.com/stashed/stash/releases/tag/v0.28.0) + +- [7e74e401](https://github.com/stashed/stash/commit/7e74e4014) Prepare for release v0.28.0 (#1510) +- [5fb5bda3](https://github.com/stashed/stash/commit/5fb5bda34) Append image pull secrets instead of replace (#1509) + + + +## [stashed/ui-server](https://github.com/stashed/ui-server) + +### [v0.10.0](https://github.com/stashed/ui-server/releases/tag/v0.10.0) + +- [6b61475](https://github.com/stashed/ui-server/commit/6b61475) Prepare for release v0.10.0 (#24) + + + +## [stashed/vault](https://github.com/stashed/vault) + +### [1.10.3-v4](https://github.com/stashed/vault/releases/tag/1.10.3-v4) + +- [d70c128f](https://github.com/stashed/vault/commit/d70c128f) Prepare for release 1.10.3-v4 (#11) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2023.04.30.md b/content/docs/v2024.12.18/CHANGELOG-v2023.04.30.md new file mode 100644 index 0000000000..d16c99cef4 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2023.04.30.md @@ -0,0 +1,454 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2023.04.30 + name: Changelog-v2023.04.30 + parent: welcome + weight: 20230430 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2023.04.30/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2023.04.30/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2023.04.30 (2023-05-01) + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.29.0](https://github.com/stashed/apimachinery/releases/tag/v0.29.0) + +- [cf255d28](https://github.com/stashed/apimachinery/commit/cf255d28) Make dump public as DumpOnce (#201) +- [d75b9663](https://github.com/stashed/apimachinery/commit/d75b9663) Use ghcr.io (#200) +- [8a1c90af](https://github.com/stashed/apimachinery/commit/8a1c90af) make gen fmt + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.29.0](https://github.com/stashed/cli/releases/tag/v0.29.0) + +- [58ff504f](https://github.com/stashed/cli/commit/58ff504f) Prepare for release v0.29.0 (#181) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v25](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v25) + +- [0ee516bf](https://github.com/stashed/elasticsearch/commit/0ee516bf) Prepare for release 5.6.4-v25 (#1368) +- [e9f9b93c](https://github.com/stashed/elasticsearch/commit/e9f9b93c) [cherry-pick] Use numeric uid in Dockerfile (#1357) (#1358) + + +### [6.2.4-v25](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v25) + +- [9d7318d0](https://github.com/stashed/elasticsearch/commit/9d7318d0) Prepare for release 6.2.4-v25 (#1369) +- [0aef89d3](https://github.com/stashed/elasticsearch/commit/0aef89d3) [cherry-pick] Use numeric uid in Dockerfile (#1357) (#1359) + + +### [6.3.0-v25](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v25) + +- [74d20240](https://github.com/stashed/elasticsearch/commit/74d20240) Prepare for release 6.3.0-v25 (#1370) +- [c0f6ec9b](https://github.com/stashed/elasticsearch/commit/c0f6ec9b) [cherry-pick] Use numeric uid in Dockerfile (#1357) (#1360) + + +### [6.4.0-v25](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v25) + +- [d54966fa](https://github.com/stashed/elasticsearch/commit/d54966fa) Prepare for release 6.4.0-v25 (#1371) +- [55e8573a](https://github.com/stashed/elasticsearch/commit/55e8573a) [cherry-pick] Use numeric uid in Dockerfile (#1357) (#1361) + + +### [6.5.3-v25](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v25) + +- [15d08d71](https://github.com/stashed/elasticsearch/commit/15d08d71) Prepare for release 6.5.3-v25 (#1372) +- [5b4c2eac](https://github.com/stashed/elasticsearch/commit/5b4c2eac) [cherry-pick] Use numeric uid in Dockerfile (#1357) (#1362) + + +### [6.8.0-v25](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v25) + +- [1a05c3a8](https://github.com/stashed/elasticsearch/commit/1a05c3a8) Prepare for release 6.8.0-v25 (#1373) +- [84dcd7f3](https://github.com/stashed/elasticsearch/commit/84dcd7f3) [cherry-pick] Use numeric uid in Dockerfile (#1357) (#1363) + + +### [7.2.0-v25](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v25) + +- [1c547594](https://github.com/stashed/elasticsearch/commit/1c547594) Prepare for release 7.2.0-v25 (#1375) +- [fbf47b6b](https://github.com/stashed/elasticsearch/commit/fbf47b6b) [cherry-pick] Use numeric uid in Dockerfile (#1357) (#1365) + + +### [7.3.2-v25](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v25) + +- [a27dbe82](https://github.com/stashed/elasticsearch/commit/a27dbe82) Prepare for release 7.3.2-v25 (#1376) +- [d4ae0196](https://github.com/stashed/elasticsearch/commit/d4ae0196) [cherry-pick] Use numeric uid in Dockerfile (#1357) (#1366) + + +### [7.14.0-v11](https://github.com/stashed/elasticsearch/releases/tag/7.14.0-v11) + +- [94794608](https://github.com/stashed/elasticsearch/commit/94794608) Prepare for release 7.14.0-v11 (#1374) +- [7c70adf7](https://github.com/stashed/elasticsearch/commit/7c70adf7) [cherry-pick] Use numeric uid in Dockerfile (#1357) (#1364) + + +### [8.2.0-v8](https://github.com/stashed/elasticsearch/releases/tag/8.2.0-v8) + +- [6e557492](https://github.com/stashed/elasticsearch/commit/6e557492) Prepare for release 8.2.0-v8 (#1377) +- [4bac3d22](https://github.com/stashed/elasticsearch/commit/4bac3d22) [cherry-pick] Use numeric uid in Dockerfile (#1357) (#1367) + + + +## [stashed/enterprise](https://github.com/stashed/enterprise) + +### [v0.29.0](https://github.com/stashed/enterprise/releases/tag/v0.29.0) + +- [1a51e875](https://github.com/stashed/enterprise/commit/1a51e875f) Prepare for release v0.29.0 (#229) +- [a67955d0](https://github.com/stashed/enterprise/commit/a67955d0a) Use numeric uid in Dockerfile (#228) + + + +## [stashed/etcd](https://github.com/stashed/etcd) + +### [3.5.0-v12](https://github.com/stashed/etcd/releases/tag/3.5.0-v12) + +- [ef26a24](https://github.com/stashed/etcd/commit/ef26a24) Prepare for release 3.5.0-v12 (#77) +- [07c7c30](https://github.com/stashed/etcd/commit/07c7c30) [cherry-pick] Use numeric uid in Dockerfile (#75) (#76) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2023.04.30](https://github.com/stashed/installer/releases/tag/v2023.04.30) + +- [f69ead12](https://github.com/stashed/installer/commit/f69ead12) Prepare for release v2023.04.30 (#302) +- [729afc21](https://github.com/stashed/installer/commit/729afc21) Test against k8s 1.27.1 (#301) +- [8ecafa65](https://github.com/stashed/installer/commit/8ecafa65) Use ghcr.io (#300) + + + +## [stashed/kubedump](https://github.com/stashed/kubedump) + +### [0.1.0-v8](https://github.com/stashed/kubedump/releases/tag/0.1.0-v8) + +- [b454d58](https://github.com/stashed/kubedump/commit/b454d58) Prepare for release 0.1.0-v8 (#37) +- [70f0d3c](https://github.com/stashed/kubedump/commit/70f0d3c) [cherry-pick] Use numeric uid in Dockerfile (#35) (#36) + + + +## [stashed/mariadb](https://github.com/stashed/mariadb) + +### [10.5.8-v18](https://github.com/stashed/mariadb/releases/tag/10.5.8-v18) + +- [40471eb](https://github.com/stashed/mariadb/commit/40471eb) Prepare for release 10.5.8-v18 (#220) +- [7e8d8d1](https://github.com/stashed/mariadb/commit/7e8d8d1) [cherry-pick] Use numeric uid in Dockerfile (#218) (#219) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v25](https://github.com/stashed/mongodb/releases/tag/3.4.17-v25) + +- [ee474ffb](https://github.com/stashed/mongodb/commit/ee474ffb) Prepare for release 3.4.17-v25 (#1789) +- [6aa4d7be](https://github.com/stashed/mongodb/commit/6aa4d7be) [cherry-pick] Use numeric uid in Dockerfile (#1774) (#1775) + + +### [3.4.22-v25](https://github.com/stashed/mongodb/releases/tag/3.4.22-v25) + +- [58db6548](https://github.com/stashed/mongodb/commit/58db6548) Prepare for release 3.4.22-v25 (#1790) +- [cf380322](https://github.com/stashed/mongodb/commit/cf380322) [cherry-pick] Use numeric uid in Dockerfile (#1774) (#1776) + + +### [3.6.8-v25](https://github.com/stashed/mongodb/releases/tag/3.6.8-v25) + +- [05f2b457](https://github.com/stashed/mongodb/commit/05f2b457) Prepare for release 3.6.8-v25 (#1792) +- [8a973cc7](https://github.com/stashed/mongodb/commit/8a973cc7) [cherry-pick] Use numeric uid in Dockerfile (#1774) (#1778) + + +### [3.6.13-v25](https://github.com/stashed/mongodb/releases/tag/3.6.13-v25) + +- [4c76961f](https://github.com/stashed/mongodb/commit/4c76961f) Prepare for release 3.6.13-v25 (#1791) +- [7b4f5756](https://github.com/stashed/mongodb/commit/7b4f5756) [cherry-pick] Use numeric uid in Dockerfile (#1774) (#1777) + + +### [4.0.3-v25](https://github.com/stashed/mongodb/releases/tag/4.0.3-v25) + +- [55f20859](https://github.com/stashed/mongodb/commit/55f20859) Prepare for release 4.0.3-v25 (#1794) +- [9c56288a](https://github.com/stashed/mongodb/commit/9c56288a) [cherry-pick] Use numeric uid in Dockerfile (#1774) (#1780) + + +### [4.0.5-v25](https://github.com/stashed/mongodb/releases/tag/4.0.5-v25) + +- [14ed2e50](https://github.com/stashed/mongodb/commit/14ed2e50) Prepare for release 4.0.5-v25 (#1795) +- [7a92e2d8](https://github.com/stashed/mongodb/commit/7a92e2d8) [cherry-pick] Use numeric uid in Dockerfile (#1774) (#1781) + + +### [4.0.11-v25](https://github.com/stashed/mongodb/releases/tag/4.0.11-v25) + +- [f27bea0a](https://github.com/stashed/mongodb/commit/f27bea0a) Prepare for release 4.0.11-v25 (#1793) +- [e421ed2f](https://github.com/stashed/mongodb/commit/e421ed2f) [cherry-pick] Use numeric uid in Dockerfile (#1774) (#1779) + + +### [4.1.4-v25](https://github.com/stashed/mongodb/releases/tag/4.1.4-v25) + +- [73c9bc38](https://github.com/stashed/mongodb/commit/73c9bc38) Prepare for release 4.1.4-v25 (#1797) +- [aabe17c4](https://github.com/stashed/mongodb/commit/aabe17c4) [cherry-pick] Use numeric uid in Dockerfile (#1774) (#1783) + + +### [4.1.7-v25](https://github.com/stashed/mongodb/releases/tag/4.1.7-v25) + +- [d39c4f50](https://github.com/stashed/mongodb/commit/d39c4f50) Prepare for release 4.1.7-v25 (#1798) +- [28c67f0c](https://github.com/stashed/mongodb/commit/28c67f0c) [cherry-pick] Use numeric uid in Dockerfile (#1774) (#1784) + + +### [4.1.13-v25](https://github.com/stashed/mongodb/releases/tag/4.1.13-v25) + +- [ba045e54](https://github.com/stashed/mongodb/commit/ba045e54) Prepare for release 4.1.13-v25 (#1796) +- [f81ee4da](https://github.com/stashed/mongodb/commit/f81ee4da) [cherry-pick] Use numeric uid in Dockerfile (#1774) (#1782) + + +### [4.2.3-v25](https://github.com/stashed/mongodb/releases/tag/4.2.3-v25) + +- [9bf064bb](https://github.com/stashed/mongodb/commit/9bf064bb) Prepare for release 4.2.3-v25 (#1799) +- [b1a08dba](https://github.com/stashed/mongodb/commit/b1a08dba) [cherry-pick] Use numeric uid in Dockerfile (#1774) (#1785) + + +### [4.4.6-v16](https://github.com/stashed/mongodb/releases/tag/4.4.6-v16) + +- [14e1d296](https://github.com/stashed/mongodb/commit/14e1d296) Prepare for release 4.4.6-v16 (#1800) +- [640b1544](https://github.com/stashed/mongodb/commit/640b1544) [cherry-pick] Use numeric uid in Dockerfile (#1774) (#1786) + + +### [5.0.3-v13](https://github.com/stashed/mongodb/releases/tag/5.0.3-v13) + +- [3affc0f9](https://github.com/stashed/mongodb/commit/3affc0f9) Prepare for release 5.0.3-v13 (#1801) +- [3c32151a](https://github.com/stashed/mongodb/commit/3c32151a) [cherry-pick] Use numeric uid in Dockerfile (#1774) (#1787) + + +### [6.0.5-v1](https://github.com/stashed/mongodb/releases/tag/6.0.5-v1) + +- [9960c95c](https://github.com/stashed/mongodb/commit/9960c95c) Prepare for release 6.0.5-v1 (#1802) +- [983b59c6](https://github.com/stashed/mongodb/commit/983b59c6) [cherry-pick] Use numeric uid in Dockerfile (#1774) (#1788) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v25](https://github.com/stashed/mysql/releases/tag/5.7.25-v25) + +- [5eae9b8b](https://github.com/stashed/mysql/commit/5eae9b8b) Prepare for release 5.7.25-v25 (#701) +- [dbfc2143](https://github.com/stashed/mysql/commit/dbfc2143) Use numeric uid in Dockerfile (#696) (#697) + + +### [8.0.3-v25](https://github.com/stashed/mysql/releases/tag/8.0.3-v25) + +- [c2a30c87](https://github.com/stashed/mysql/commit/c2a30c87) Prepare for release 8.0.3-v25 (#704) +- [bd69d6ad](https://github.com/stashed/mysql/commit/bd69d6ad) Use numeric uid in Dockerfile (#696) (#700) + + +### [8.0.14-v25](https://github.com/stashed/mysql/releases/tag/8.0.14-v25) + +- [a9385be7](https://github.com/stashed/mysql/commit/a9385be7) Prepare for release 8.0.14-v25 (#702) +- [05a04a56](https://github.com/stashed/mysql/commit/05a04a56) Use numeric uid in Dockerfile (#696) (#698) + + +### [8.0.21-v19](https://github.com/stashed/mysql/releases/tag/8.0.21-v19) + +- [7f68cb08](https://github.com/stashed/mysql/commit/7f68cb08) Prepare for release 8.0.21-v19 (#703) +- [6beb1eed](https://github.com/stashed/mysql/commit/6beb1eed) [cherry-pick] Use numeric uid in Dockerfile (#696) (#699) + + + +## [stashed/nats](https://github.com/stashed/nats) + +### [2.6.1-v13](https://github.com/stashed/nats/releases/tag/2.6.1-v13) + +- [2cfd5b8](https://github.com/stashed/nats/commit/2cfd5b8) Prepare for release 2.6.1-v13 (#100) +- [02f2e3c](https://github.com/stashed/nats/commit/02f2e3c) [cherry-pick] Use numeric uid in Dockerfile (#97) (#98) + + +### [2.8.2-v8](https://github.com/stashed/nats/releases/tag/2.8.2-v8) + +- [bd1c3b9](https://github.com/stashed/nats/commit/bd1c3b9) Prepare for release 2.8.2-v8 (#101) +- [9977ac2](https://github.com/stashed/nats/commit/9977ac2) [cherry-pick] Use numeric uid in Dockerfile (#97) (#99) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-v20](https://github.com/stashed/percona-xtradb/releases/tag/5.7-v20) + +- [9e5a1789](https://github.com/stashed/percona-xtradb/commit/9e5a1789) Prepare for release 5.7-v20 (#290) +- [dce46839](https://github.com/stashed/percona-xtradb/commit/dce46839) [cherry-pick] Use numeric uid in Dockerfile (#288) (#289) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v24](https://github.com/stashed/postgres/releases/tag/9.6.19-v24) + +- [5fd149a6](https://github.com/stashed/postgres/commit/5fd149a6) Prepare for release 9.6.19-v24 (#1190) +- [e09a4972](https://github.com/stashed/postgres/commit/e09a4972) Use numeric uid in Dockerfile (#1176) (#1183) + + +### [10.14-v24](https://github.com/stashed/postgres/releases/tag/10.14-v24) + +- [77fb4d62](https://github.com/stashed/postgres/commit/77fb4d62) Prepare for release 10.14-v24 (#1184) +- [e229b03c](https://github.com/stashed/postgres/commit/e229b03c) Use numeric uid in Dockerfile (#1176) (#1177) + + +### [11.9-v24](https://github.com/stashed/postgres/releases/tag/11.9-v24) + +- [f4e574c9](https://github.com/stashed/postgres/commit/f4e574c9) Prepare for release 11.9-v24 (#1185) +- [435c1e58](https://github.com/stashed/postgres/commit/435c1e58) Use numeric uid in Dockerfile (#1176) (#1178) + + +### [12.4-v24](https://github.com/stashed/postgres/releases/tag/12.4-v24) + +- [f2854938](https://github.com/stashed/postgres/commit/f2854938) Prepare for release 12.4-v24 (#1186) +- [15249a55](https://github.com/stashed/postgres/commit/15249a55) [cherry-pick] Use numeric uid in Dockerfile (#1176) (#1179) + + +### [13.1-v21](https://github.com/stashed/postgres/releases/tag/13.1-v21) + +- [677de51c](https://github.com/stashed/postgres/commit/677de51c) Prepare for release 13.1-v21 (#1187) +- [0a2426e2](https://github.com/stashed/postgres/commit/0a2426e2) [cherry-pick] Use numeric uid in Dockerfile (#1176) (#1180) + + +### [14.0-v13](https://github.com/stashed/postgres/releases/tag/14.0-v13) + +- [1a97a10c](https://github.com/stashed/postgres/commit/1a97a10c) Prepare for release 14.0-v13 (#1188) +- [06b6ad43](https://github.com/stashed/postgres/commit/06b6ad43) [cherry-pick] Use numeric uid in Dockerfile (#1176) (#1181) + + +### [15.1-v5](https://github.com/stashed/postgres/releases/tag/15.1-v5) + +- [aa21b8e8](https://github.com/stashed/postgres/commit/aa21b8e8) Prepare for release 15.1-v5 (#1189) +- [4fddfae3](https://github.com/stashed/postgres/commit/4fddfae3) [cherry-pick] Use numeric uid in Dockerfile (#1176) (#1182) + + + +## [stashed/redis](https://github.com/stashed/redis) + +### [5.0.13-v13](https://github.com/stashed/redis/releases/tag/5.0.13-v13) + +- [f5cfc4b](https://github.com/stashed/redis/commit/f5cfc4b) Prepare for release 5.0.13-v13 (#168) +- [35b6cd5](https://github.com/stashed/redis/commit/35b6cd5) [cherry-pick] Support backup and restore for redis clusters (#164) (#165) +- [5dbc12b](https://github.com/stashed/redis/commit/5dbc12b) Use ghcr.io for appscode/golang-dev +- [b67eb58](https://github.com/stashed/redis/commit/b67eb58) Add Support for Redis when Auth is Disabled in Kubedb (#77) +- [8372b08](https://github.com/stashed/redis/commit/8372b08) [cherry-pick] Use numeric uid in Dockerfile (#160) (#161) + + +### [6.2.5-v13](https://github.com/stashed/redis/releases/tag/6.2.5-v13) + +- [468c1bd](https://github.com/stashed/redis/commit/468c1bd) Prepare for release 6.2.5-v13 (#169) +- [d549e24](https://github.com/stashed/redis/commit/d549e24) [cherry-pick] Support backup and restore for redis clusters (#164) (#166) +- [7803cc9](https://github.com/stashed/redis/commit/7803cc9) Use ghcr.io for appscode/golang-dev +- [eb9af10](https://github.com/stashed/redis/commit/eb9af10) Add Support for Redis when Auth is Disabled in Kubedb (#77) +- [bec48a2](https://github.com/stashed/redis/commit/bec48a2) [cherry-pick] Use numeric uid in Dockerfile (#160) (#162) + + +### [7.0.5-v6](https://github.com/stashed/redis/releases/tag/7.0.5-v6) + +- [a2088a4](https://github.com/stashed/redis/commit/a2088a4) Prepare for release 7.0.5-v6 (#170) +- [b7b327a](https://github.com/stashed/redis/commit/b7b327a) [cherry-pick] Support backup and restore for redis clusters (#164) (#167) +- [be87eed](https://github.com/stashed/redis/commit/be87eed) Use ghcr.io for appscode/golang-dev +- [7c48c51](https://github.com/stashed/redis/commit/7c48c51) Add Support for Redis when Auth is Disabled in Kubedb (#77) +- [7d8d9b4](https://github.com/stashed/redis/commit/7d8d9b4) [cherry-pick] Use numeric uid in Dockerfile (#160) (#163) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.29.0](https://github.com/stashed/stash/releases/tag/v0.29.0) + +- [a80cbf90](https://github.com/stashed/stash/commit/a80cbf905) Prepare for release v0.29.0 (#1514) +- [3625b857](https://github.com/stashed/stash/commit/3625b8579) Use numeric uid in Dockerfile (#1513) + + + +## [stashed/ui-server](https://github.com/stashed/ui-server) + +### [v0.11.0](https://github.com/stashed/ui-server/releases/tag/v0.11.0) + +- [633cf86](https://github.com/stashed/ui-server/commit/633cf86) Prepare for release v0.11.0 (#26) +- [0a6ce3a](https://github.com/stashed/ui-server/commit/0a6ce3a) Use numeric uid in Dockerfile (#25) + + + +## [stashed/vault](https://github.com/stashed/vault) + +### [1.10.3-v5](https://github.com/stashed/vault/releases/tag/1.10.3-v5) + +- [6b7fd704](https://github.com/stashed/vault/commit/6b7fd704) Prepare for release 1.10.3-v5 (#15) +- [389cd328](https://github.com/stashed/vault/commit/389cd328) [cherry-pick] Use numeric uid in Dockerfile (#13) (#14) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2023.05.31.md b/content/docs/v2024.12.18/CHANGELOG-v2023.05.31.md new file mode 100644 index 0000000000..b6262ceb07 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2023.05.31.md @@ -0,0 +1,446 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2023.05.31 + name: Changelog-v2023.05.31 + parent: welcome + weight: 20230531 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2023.05.31/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2023.05.31/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2023.05.31 (2023-05-30) + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.30.0](https://github.com/stashed/apimachinery/releases/tag/v0.30.0) + +- [45c1d9e0](https://github.com/stashed/apimachinery/commit/45c1d9e0) Update deps (#205) +- [1e979c48](https://github.com/stashed/apimachinery/commit/1e979c48) Store error in restic stats for parallel backup and dump (#204) +- [ba0e4342](https://github.com/stashed/apimachinery/commit/ba0e4342) Fix backup initiation check + Add constants for ES restoration (#203) +- [f06d7a0e](https://github.com/stashed/apimachinery/commit/f06d7a0e) Fix build (#202) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.30.0](https://github.com/stashed/cli/releases/tag/v0.30.0) + +- [21f75035](https://github.com/stashed/cli/commit/21f75035) Prepare for release v0.30.0 (#183) +- [2e0ea3ce](https://github.com/stashed/cli/commit/2e0ea3ce) Add repository name as prefix to mount path of NFS volume accessor (#182) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v26](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v26) + +- [f09bc4d8](https://github.com/stashed/elasticsearch/commit/f09bc4d8) Prepare for release 5.6.4-v26 (#1390) +- [80dad168](https://github.com/stashed/elasticsearch/commit/80dad168) [cherry-pick] Dump PVC storage information (#1379) (#1380) + + +### [6.2.4-v26](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v26) + +- [225c35b6](https://github.com/stashed/elasticsearch/commit/225c35b6) Prepare for release 6.2.4-v26 (#1391) +- [162692bf](https://github.com/stashed/elasticsearch/commit/162692bf) [cherry-pick] Dump PVC storage information (#1379) (#1381) + + +### [6.3.0-v26](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v26) + +- [cc95e4e8](https://github.com/stashed/elasticsearch/commit/cc95e4e8) Prepare for release 6.3.0-v26 (#1392) +- [1e1d0f67](https://github.com/stashed/elasticsearch/commit/1e1d0f67) [cherry-pick] Dump PVC storage information (#1379) (#1382) + + +### [6.4.0-v26](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v26) + +- [2a0e72ea](https://github.com/stashed/elasticsearch/commit/2a0e72ea) Prepare for release 6.4.0-v26 (#1393) +- [5ee51cb1](https://github.com/stashed/elasticsearch/commit/5ee51cb1) [cherry-pick] Dump PVC storage information (#1379) (#1383) + + +### [6.5.3-v26](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v26) + +- [ffeafd96](https://github.com/stashed/elasticsearch/commit/ffeafd96) Prepare for release 6.5.3-v26 (#1394) +- [193ef15f](https://github.com/stashed/elasticsearch/commit/193ef15f) [cherry-pick] Dump PVC storage information (#1379) (#1384) + + +### [6.8.0-v26](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v26) + +- [a90506a8](https://github.com/stashed/elasticsearch/commit/a90506a8) Prepare for release 6.8.0-v26 (#1395) +- [54525e6d](https://github.com/stashed/elasticsearch/commit/54525e6d) [cherry-pick] Dump PVC storage information (#1379) (#1385) + + +### [7.2.0-v26](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v26) + +- [0d6226f6](https://github.com/stashed/elasticsearch/commit/0d6226f6) Prepare for release 7.2.0-v26 (#1397) +- [5b25a987](https://github.com/stashed/elasticsearch/commit/5b25a987) [cherry-pick] Dump PVC storage information (#1379) (#1387) + + +### [7.3.2-v26](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v26) + +- [00f4531c](https://github.com/stashed/elasticsearch/commit/00f4531c) Prepare for release 7.3.2-v26 (#1398) +- [0fe78ca7](https://github.com/stashed/elasticsearch/commit/0fe78ca7) [cherry-pick] Dump PVC storage information (#1379) (#1388) + + +### [7.14.0-v12](https://github.com/stashed/elasticsearch/releases/tag/7.14.0-v12) + +- [ef0141a2](https://github.com/stashed/elasticsearch/commit/ef0141a2) Prepare for release 7.14.0-v12 (#1396) +- [690cda8e](https://github.com/stashed/elasticsearch/commit/690cda8e) [cherry-pick] Dump PVC storage information (#1379) (#1386) + + +### [8.2.0-v9](https://github.com/stashed/elasticsearch/releases/tag/8.2.0-v9) + +- [7a3ae1ac](https://github.com/stashed/elasticsearch/commit/7a3ae1ac) Prepare for release 8.2.0-v9 (#1399) +- [0d2956d2](https://github.com/stashed/elasticsearch/commit/0d2956d2) [cherry-pick] Dump PVC storage information (#1379) (#1389) + + + +## [stashed/enterprise](https://github.com/stashed/enterprise) + +### [v0.30.0](https://github.com/stashed/enterprise/releases/tag/v0.30.0) + +- [6cd51d79](https://github.com/stashed/enterprise/commit/6cd51d79d) Prepare for release v0.30.0 (#234) +- [8f260c6e](https://github.com/stashed/enterprise/commit/8f260c6ea) Add InterimVolume storage request calculator for Elasticsearch Backup (#230) +- [e5e2d9a2](https://github.com/stashed/enterprise/commit/e5e2d9a2e) Add repository name as prefix to mount path of NFS volume accessor (#232) +- [4ec5bc18](https://github.com/stashed/enterprise/commit/4ec5bc18d) Fix Cronjob name generation + Cleanup skipped BackupSessions (#233) + + + +## [stashed/etcd](https://github.com/stashed/etcd) + +### [3.5.0-v13](https://github.com/stashed/etcd/releases/tag/3.5.0-v13) + +- [568299a](https://github.com/stashed/etcd/commit/568299a) Prepare for release 3.5.0-v13 (#79) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2023.05.31](https://github.com/stashed/installer/releases/tag/v2023.05.31) + +- [09d9471d](https://github.com/stashed/installer/commit/09d9471d) Prepare for release v2023.05.31 (#304) +- [9c733919](https://github.com/stashed/installer/commit/9c733919) Add Cluster role permissions for elasticsearch (#303) + + + +## [stashed/kubedump](https://github.com/stashed/kubedump) + +### [0.1.0-v9](https://github.com/stashed/kubedump/releases/tag/0.1.0-v9) + +- [ef8f697](https://github.com/stashed/kubedump/commit/ef8f697) Prepare for release 0.1.0-v9 (#39) + + + +## [stashed/mariadb](https://github.com/stashed/mariadb) + +### [10.5.8-v19](https://github.com/stashed/mariadb/releases/tag/10.5.8-v19) + +- [2fcc724](https://github.com/stashed/mariadb/commit/2fcc724) Prepare for release 10.5.8-v19 (#222) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v26](https://github.com/stashed/mongodb/releases/tag/3.4.17-v26) + +- [77efc24c](https://github.com/stashed/mongodb/commit/77efc24c) Prepare for release 3.4.17-v26 (#1835) +- [335f1787](https://github.com/stashed/mongodb/commit/335f1787) [cherry-pick] Fix component status updating for shard backup and restore (#1806) (#1821) +- [e0ea3df6](https://github.com/stashed/mongodb/commit/e0ea3df6) [cherry-pick] Fix Backup and Restore for TLS enabled mongo (#1805) (#1807) + + +### [3.4.22-v26](https://github.com/stashed/mongodb/releases/tag/3.4.22-v26) + +- [0ee2f542](https://github.com/stashed/mongodb/commit/0ee2f542) Prepare for release 3.4.22-v26 (#1836) +- [5a1b61b7](https://github.com/stashed/mongodb/commit/5a1b61b7) [cherry-pick] Fix component status updating for shard backup and restore (#1806) (#1822) +- [47b66a8b](https://github.com/stashed/mongodb/commit/47b66a8b) [cherry-pick] Fix Backup and Restore for TLS enabled mongo (#1805) (#1808) + + +### [3.6.8-v26](https://github.com/stashed/mongodb/releases/tag/3.6.8-v26) + +- [93b25a8a](https://github.com/stashed/mongodb/commit/93b25a8a) Prepare for release 3.6.8-v26 (#1838) +- [f4cc733b](https://github.com/stashed/mongodb/commit/f4cc733b) [cherry-pick] Fix component status updating for shard backup and restore (#1806) (#1824) +- [7ac0f9e6](https://github.com/stashed/mongodb/commit/7ac0f9e6) [cherry-pick] Fix Backup and Restore for TLS enabled mongo (#1805) (#1810) + + +### [3.6.13-v26](https://github.com/stashed/mongodb/releases/tag/3.6.13-v26) + +- [865035f5](https://github.com/stashed/mongodb/commit/865035f5) Prepare for release 3.6.13-v26 (#1837) +- [cfd53930](https://github.com/stashed/mongodb/commit/cfd53930) [cherry-pick] Fix component status updating for shard backup and restore (#1806) (#1823) +- [4fba330b](https://github.com/stashed/mongodb/commit/4fba330b) [cherry-pick] Fix Backup and Restore for TLS enabled mongo (#1805) (#1809) + + +### [4.0.3-v26](https://github.com/stashed/mongodb/releases/tag/4.0.3-v26) + +- [0b50a887](https://github.com/stashed/mongodb/commit/0b50a887) Prepare for release 4.0.3-v26 (#1840) +- [ce72f08f](https://github.com/stashed/mongodb/commit/ce72f08f) [cherry-pick] Fix component status updating for shard backup and restore (#1806) (#1826) +- [33e82e40](https://github.com/stashed/mongodb/commit/33e82e40) [cherry-pick] Fix Backup and Restore for TLS enabled mongo (#1805) (#1812) + + +### [4.0.5-v26](https://github.com/stashed/mongodb/releases/tag/4.0.5-v26) + +- [72beb293](https://github.com/stashed/mongodb/commit/72beb293) Prepare for release 4.0.5-v26 (#1841) +- [a5d36c8b](https://github.com/stashed/mongodb/commit/a5d36c8b) [cherry-pick] Fix component status updating for shard backup and restore (#1806) (#1827) +- [71a355d8](https://github.com/stashed/mongodb/commit/71a355d8) [cherry-pick] Fix Backup and Restore for TLS enabled mongo (#1805) (#1813) + + +### [4.0.11-v26](https://github.com/stashed/mongodb/releases/tag/4.0.11-v26) + +- [0e2d6ab8](https://github.com/stashed/mongodb/commit/0e2d6ab8) Prepare for release 4.0.11-v26 (#1839) +- [865f8e31](https://github.com/stashed/mongodb/commit/865f8e31) [cherry-pick] Fix component status updating for shard backup and restore (#1806) (#1825) +- [d2b19dc9](https://github.com/stashed/mongodb/commit/d2b19dc9) [cherry-pick] Fix Backup and Restore for TLS enabled mongo (#1805) (#1811) + + +### [4.1.4-v26](https://github.com/stashed/mongodb/releases/tag/4.1.4-v26) + +- [c9214b93](https://github.com/stashed/mongodb/commit/c9214b93) Prepare for release 4.1.4-v26 (#1843) +- [9122435f](https://github.com/stashed/mongodb/commit/9122435f) [cherry-pick] Fix component status updating for shard backup and restore (#1806) (#1829) +- [8a9b3dc1](https://github.com/stashed/mongodb/commit/8a9b3dc1) [cherry-pick] Fix Backup and Restore for TLS enabled mongo (#1805) (#1815) +- [6d1afa77](https://github.com/stashed/mongodb/commit/6d1afa77) Prepare for release 4.1.4-v25 (#1804) + + +### [4.1.7-v26](https://github.com/stashed/mongodb/releases/tag/4.1.7-v26) + +- [d123975b](https://github.com/stashed/mongodb/commit/d123975b) Prepare for release 4.1.7-v26 (#1844) +- [e5ac3e0d](https://github.com/stashed/mongodb/commit/e5ac3e0d) [cherry-pick] Fix component status updating for shard backup and restore (#1806) (#1830) +- [bc5c567f](https://github.com/stashed/mongodb/commit/bc5c567f) [cherry-pick] Fix Backup and Restore for TLS enabled mongo (#1805) (#1816) + + +### [4.1.13-v26](https://github.com/stashed/mongodb/releases/tag/4.1.13-v26) + +- [26420e41](https://github.com/stashed/mongodb/commit/26420e41) Prepare for release 4.1.13-v26 (#1842) +- [230e572d](https://github.com/stashed/mongodb/commit/230e572d) [cherry-pick] Fix component status updating for shard backup and restore (#1806) (#1828) +- [b9ca59ca](https://github.com/stashed/mongodb/commit/b9ca59ca) [cherry-pick] Fix Backup and Restore for TLS enabled mongo (#1805) (#1814) + + +### [4.2.3-v26](https://github.com/stashed/mongodb/releases/tag/4.2.3-v26) + +- [df7ae46f](https://github.com/stashed/mongodb/commit/df7ae46f) Prepare for release 4.2.3-v26 (#1845) +- [fe6d98d3](https://github.com/stashed/mongodb/commit/fe6d98d3) [cherry-pick] Fix component status updating for shard backup and restore (#1806) (#1831) +- [eb2bf583](https://github.com/stashed/mongodb/commit/eb2bf583) [cherry-pick] Fix Backup and Restore for TLS enabled mongo (#1805) (#1817) + + +### [4.4.6-v17](https://github.com/stashed/mongodb/releases/tag/4.4.6-v17) + +- [3c0aa2fe](https://github.com/stashed/mongodb/commit/3c0aa2fe) Prepare for release 4.4.6-v17 (#1846) +- [c58fa36e](https://github.com/stashed/mongodb/commit/c58fa36e) [cherry-pick] Fix component status updating for shard backup and restore (#1806) (#1832) +- [a2c61f59](https://github.com/stashed/mongodb/commit/a2c61f59) [cherry-pick] Fix Backup and Restore for TLS enabled mongo (#1805) (#1818) + + +### [5.0.3-v14](https://github.com/stashed/mongodb/releases/tag/5.0.3-v14) + +- [d4c4a484](https://github.com/stashed/mongodb/commit/d4c4a484) Prepare for release 5.0.3-v14 (#1847) +- [525adda1](https://github.com/stashed/mongodb/commit/525adda1) [cherry-pick] Fix component status updating for shard backup and restore (#1806) (#1833) +- [ec116a61](https://github.com/stashed/mongodb/commit/ec116a61) [cherry-pick] Fix Backup and Restore for TLS enabled mongo (#1805) (#1819) +- [6e6859ad](https://github.com/stashed/mongodb/commit/6e6859ad) Fix backup for mongodb 5.0.x + + +### [6.0.5-v2](https://github.com/stashed/mongodb/releases/tag/6.0.5-v2) + +- [8286bbb8](https://github.com/stashed/mongodb/commit/8286bbb8) Prepare for release 6.0.5-v2 (#1848) +- [fc9befad](https://github.com/stashed/mongodb/commit/fc9befad) [cherry-pick] Fix component status updating for shard backup and restore (#1806) (#1834) +- [82e162a7](https://github.com/stashed/mongodb/commit/82e162a7) [cherry-pick] Fix Backup and Restore for TLS enabled mongo (#1805) (#1820) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v26](https://github.com/stashed/mysql/releases/tag/5.7.25-v26) + +- [f4e24f08](https://github.com/stashed/mysql/commit/f4e24f08) Prepare for release 5.7.25-v26 (#706) + + +### [8.0.3-v26](https://github.com/stashed/mysql/releases/tag/8.0.3-v26) + +- [c57db948](https://github.com/stashed/mysql/commit/c57db948) Prepare for release 8.0.3-v26 (#709) + + +### [8.0.14-v26](https://github.com/stashed/mysql/releases/tag/8.0.14-v26) + +- [713feadb](https://github.com/stashed/mysql/commit/713feadb) Prepare for release 8.0.14-v26 (#707) + + +### [8.0.21-v20](https://github.com/stashed/mysql/releases/tag/8.0.21-v20) + +- [23c7c8b8](https://github.com/stashed/mysql/commit/23c7c8b8) Prepare for release 8.0.21-v20 (#708) + + + +## [stashed/nats](https://github.com/stashed/nats) + +### [2.6.1-v14](https://github.com/stashed/nats/releases/tag/2.6.1-v14) + +- [1c05a39](https://github.com/stashed/nats/commit/1c05a39) Prepare for release 2.6.1-v14 (#103) + + +### [2.8.2-v9](https://github.com/stashed/nats/releases/tag/2.8.2-v9) + +- [167a172](https://github.com/stashed/nats/commit/167a172) Prepare for release 2.8.2-v9 (#104) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-v21](https://github.com/stashed/percona-xtradb/releases/tag/5.7-v21) + +- [c3b32c76](https://github.com/stashed/percona-xtradb/commit/c3b32c76) Prepare for release 5.7-v21 (#292) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v25](https://github.com/stashed/postgres/releases/tag/9.6.19-v25) + +- [95fbec26](https://github.com/stashed/postgres/commit/95fbec26) Prepare for release 9.6.19-v25 (#1198) + + +### [10.14-v25](https://github.com/stashed/postgres/releases/tag/10.14-v25) + +- [0c104a8b](https://github.com/stashed/postgres/commit/0c104a8b) Prepare for release 10.14-v25 (#1192) + + +### [11.9-v25](https://github.com/stashed/postgres/releases/tag/11.9-v25) + +- [dc1ea0d4](https://github.com/stashed/postgres/commit/dc1ea0d4) Prepare for release 11.9-v25 (#1193) + + +### [12.4-v25](https://github.com/stashed/postgres/releases/tag/12.4-v25) + +- [b45471ce](https://github.com/stashed/postgres/commit/b45471ce) Prepare for release 12.4-v25 (#1194) + + +### [13.1-v22](https://github.com/stashed/postgres/releases/tag/13.1-v22) + +- [b89e2d73](https://github.com/stashed/postgres/commit/b89e2d73) Prepare for release 13.1-v22 (#1195) + + +### [14.0-v14](https://github.com/stashed/postgres/releases/tag/14.0-v14) + +- [57782aec](https://github.com/stashed/postgres/commit/57782aec) Prepare for release 14.0-v14 (#1196) + + +### [15.1-v6](https://github.com/stashed/postgres/releases/tag/15.1-v6) + +- [4f3ecc41](https://github.com/stashed/postgres/commit/4f3ecc41) Prepare for release 15.1-v6 (#1197) + + + +## [stashed/redis](https://github.com/stashed/redis) + +### [5.0.13-v14](https://github.com/stashed/redis/releases/tag/5.0.13-v14) + +- [0a38067](https://github.com/stashed/redis/commit/0a38067) Prepare for release 5.0.13-v14 (#176) +- [f40f32c](https://github.com/stashed/redis/commit/f40f32c) [cherry-pick] Add Insecure TLS verify (#172) (#173) + + +### [6.2.5-v14](https://github.com/stashed/redis/releases/tag/6.2.5-v14) + +- [704e687](https://github.com/stashed/redis/commit/704e687) Prepare for release 6.2.5-v14 (#177) +- [f708927](https://github.com/stashed/redis/commit/f708927) [cherry-pick] Add Insecure TLS verify (#172) (#174) + + +### [7.0.5-v7](https://github.com/stashed/redis/releases/tag/7.0.5-v7) + +- [20c3604](https://github.com/stashed/redis/commit/20c3604) Prepare for release 7.0.5-v7 (#178) +- [b4f6d5f](https://github.com/stashed/redis/commit/b4f6d5f) [cherry-pick] Add Insecure TLS verify (#172) (#175) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.30.0](https://github.com/stashed/stash/releases/tag/v0.30.0) + +- [e465af2f](https://github.com/stashed/stash/commit/e465af2fc) Prepare for release v0.30.0 (#1527) +- [3aa466cb](https://github.com/stashed/stash/commit/3aa466cb7) Update deps +- [929d1f53](https://github.com/stashed/stash/commit/929d1f535) Fix Cronjob name generation + Cleanup skipped BackupSession (#1525) + + + +## [stashed/ui-server](https://github.com/stashed/ui-server) + +### [v0.12.0](https://github.com/stashed/ui-server/releases/tag/v0.12.0) + +- [785f737](https://github.com/stashed/ui-server/commit/785f737) Prepare for release v0.12.0 (#27) + + + +## [stashed/vault](https://github.com/stashed/vault) + +### [1.10.3-v6](https://github.com/stashed/vault/releases/tag/1.10.3-v6) + +- [336f14a2](https://github.com/stashed/vault/commit/336f14a2) Prepare for release 1.10.3-v6 (#17) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2023.08.18.md b/content/docs/v2024.12.18/CHANGELOG-v2023.08.18.md new file mode 100644 index 0000000000..406a6ce9f6 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2023.08.18.md @@ -0,0 +1,504 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2023.08.18 + name: Changelog-v2023.08.18 + parent: welcome + weight: 20230818 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2023.08.18/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2023.08.18/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2023.08.18 (2023-08-15) + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.31.0](https://github.com/stashed/apimachinery/releases/tag/v0.31.0) + +- [fcb8a910](https://github.com/stashed/apimachinery/commit/fcb8a910) Update deps +- [2893b111](https://github.com/stashed/apimachinery/commit/2893b111) Update deps +- [56274c74](https://github.com/stashed/apimachinery/commit/56274c74) Use updated kmapi Conditions (#208) +- [194d615e](https://github.com/stashed/apimachinery/commit/194d615e) Update license verifier (#206) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.31.0](https://github.com/stashed/cli/releases/tag/v0.31.0) + +- [bb941061](https://github.com/stashed/cli/commit/bb941061) Prepare for release v0.31.0 (#186) +- [30b10340](https://github.com/stashed/cli/commit/30b10340) Update deps (#185) +- [9a24aeb3](https://github.com/stashed/cli/commit/9a24aeb3) Update license verifier (#184) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v27](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v27) + +- [1f5e8c0b](https://github.com/stashed/elasticsearch/commit/1f5e8c0b) Prepare for release 5.6.4-v27 (#1423) +- [a7603e0e](https://github.com/stashed/elasticsearch/commit/a7603e0e) [cherry-pick] Update deps (#1412) (#1413) +- [0e7db083](https://github.com/stashed/elasticsearch/commit/0e7db083) [cherry-pick] Update license verifier (#1401) (#1402) + + +### [6.2.4-v27](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v27) + +- [6c58e223](https://github.com/stashed/elasticsearch/commit/6c58e223) Prepare for release 6.2.4-v27 (#1424) +- [53bb559f](https://github.com/stashed/elasticsearch/commit/53bb559f) [cherry-pick] Update deps (#1412) (#1414) +- [ab875802](https://github.com/stashed/elasticsearch/commit/ab875802) [cherry-pick] Update license verifier (#1401) (#1403) + + +### [6.3.0-v27](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v27) + +- [34b75935](https://github.com/stashed/elasticsearch/commit/34b75935) Prepare for release 6.3.0-v27 (#1425) +- [c949ffae](https://github.com/stashed/elasticsearch/commit/c949ffae) [cherry-pick] Update deps (#1412) (#1415) +- [c834647a](https://github.com/stashed/elasticsearch/commit/c834647a) [cherry-pick] Update license verifier (#1401) (#1404) + + +### [6.4.0-v27](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v27) + +- [fa3238de](https://github.com/stashed/elasticsearch/commit/fa3238de) Prepare for release 6.4.0-v27 (#1426) +- [4e309c43](https://github.com/stashed/elasticsearch/commit/4e309c43) [cherry-pick] Update deps (#1412) (#1416) +- [535cd3a7](https://github.com/stashed/elasticsearch/commit/535cd3a7) [cherry-pick] Update license verifier (#1401) (#1405) + + +### [6.5.3-v27](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v27) + +- [3083ad90](https://github.com/stashed/elasticsearch/commit/3083ad90) Prepare for release 6.5.3-v27 (#1427) +- [bd989773](https://github.com/stashed/elasticsearch/commit/bd989773) [cherry-pick] Update deps (#1412) (#1417) +- [89721491](https://github.com/stashed/elasticsearch/commit/89721491) [cherry-pick] Update license verifier (#1401) (#1406) + + +### [6.8.0-v27](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v27) + +- [46152912](https://github.com/stashed/elasticsearch/commit/46152912) Prepare for release 6.8.0-v27 (#1428) +- [75418b1b](https://github.com/stashed/elasticsearch/commit/75418b1b) [cherry-pick] Update deps (#1412) (#1418) +- [a52d876c](https://github.com/stashed/elasticsearch/commit/a52d876c) [cherry-pick] Update license verifier (#1401) (#1407) + + +### [7.2.0-v27](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v27) + +- [d51640f7](https://github.com/stashed/elasticsearch/commit/d51640f7) Prepare for release 7.2.0-v27 (#1430) +- [092e99fa](https://github.com/stashed/elasticsearch/commit/092e99fa) [cherry-pick] Update deps (#1412) (#1420) +- [939ea566](https://github.com/stashed/elasticsearch/commit/939ea566) [cherry-pick] Update license verifier (#1401) (#1409) + + +### [7.3.2-v27](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v27) + +- [f2629fc5](https://github.com/stashed/elasticsearch/commit/f2629fc5) Prepare for release 7.3.2-v27 (#1431) +- [a180f5c7](https://github.com/stashed/elasticsearch/commit/a180f5c7) [cherry-pick] Update deps (#1412) (#1421) +- [c1da7015](https://github.com/stashed/elasticsearch/commit/c1da7015) [cherry-pick] Update license verifier (#1401) (#1410) + + +### [7.14.0-v13](https://github.com/stashed/elasticsearch/releases/tag/7.14.0-v13) + +- [bf4e73e5](https://github.com/stashed/elasticsearch/commit/bf4e73e5) Prepare for release 7.14.0-v13 (#1429) +- [6c475fd0](https://github.com/stashed/elasticsearch/commit/6c475fd0) [cherry-pick] Update deps (#1412) (#1419) +- [2633267d](https://github.com/stashed/elasticsearch/commit/2633267d) [cherry-pick] Update license verifier (#1401) (#1408) + + +### [8.2.0-v10](https://github.com/stashed/elasticsearch/releases/tag/8.2.0-v10) + +- [5e52c7b3](https://github.com/stashed/elasticsearch/commit/5e52c7b3) Prepare for release 8.2.0-v10 (#1432) +- [ed82d9e4](https://github.com/stashed/elasticsearch/commit/ed82d9e4) [cherry-pick] Update deps (#1412) (#1422) +- [6cace96f](https://github.com/stashed/elasticsearch/commit/6cace96f) [cherry-pick] Update license verifier (#1401) (#1411) + + + +## [stashed/enterprise](https://github.com/stashed/enterprise) + +### [v0.31.0](https://github.com/stashed/enterprise/releases/tag/v0.31.0) + +- [a704d1f0](https://github.com/stashed/enterprise/commit/a704d1f02) Prepare for release v0.31.0 (#237) +- [4aaf8825](https://github.com/stashed/enterprise/commit/4aaf88252) Update deps (#236) + + + +## [stashed/etcd](https://github.com/stashed/etcd) + +### [3.5.0-v14](https://github.com/stashed/etcd/releases/tag/3.5.0-v14) + +- [9d550b8](https://github.com/stashed/etcd/commit/9d550b8) Prepare for release 3.5.0-v14 (#81) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2023.08.14](https://github.com/stashed/installer/releases/tag/v2023.08.14) + +- [a641610a](https://github.com/stashed/installer/commit/a641610a) Prepare for release v2023.08.14 (#314) +- [b514321f](https://github.com/stashed/installer/commit/b514321f) Update deps (#313) +- [b3d902bb](https://github.com/stashed/installer/commit/b3d902bb) Add support for mongodb 5.0.15 backup-restore addon (#311) +- [7bd860ce](https://github.com/stashed/installer/commit/7bd860ce) Don't mount license vol when both license and licenseSecretName is empty (#312) +- [6396e2d6](https://github.com/stashed/installer/commit/6396e2d6) Add licenseSecretName values (#310) +- [05218a8d](https://github.com/stashed/installer/commit/05218a8d) Switch to failurePolicy: Ignore by default for webhooks (#309) + + + +## [stashed/kubedump](https://github.com/stashed/kubedump) + +### [0.1.0-v10](https://github.com/stashed/kubedump/releases/tag/0.1.0-v10) + +- [7022e46](https://github.com/stashed/kubedump/commit/7022e46) Prepare for release 0.1.0-v10 (#45) +- [4ba8582](https://github.com/stashed/kubedump/commit/4ba8582) [cherry-pick] Update deps (#43) (#44) +- [126a77a](https://github.com/stashed/kubedump/commit/126a77a) Update license verifier (#41) (#42) + + + +## [stashed/mariadb](https://github.com/stashed/mariadb) + +### [10.5.8-v20](https://github.com/stashed/mariadb/releases/tag/10.5.8-v20) + +- [6b90e17](https://github.com/stashed/mariadb/commit/6b90e17) Prepare for release 10.5.8-v20 (#228) +- [ae007fc](https://github.com/stashed/mariadb/commit/ae007fc) [cherry-pick] Update deps (#226) (#227) +- [e7e066d](https://github.com/stashed/mariadb/commit/e7e066d) [cherry-pick] Update license verifier (#224) (#225) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v27](https://github.com/stashed/mongodb/releases/tag/3.4.17-v27) + +- [31635810](https://github.com/stashed/mongodb/commit/31635810) Prepare for release 3.4.17-v27 (#1909) +- [6ec316e2](https://github.com/stashed/mongodb/commit/6ec316e2) [cherry-pick] Update deps (#1892) (#1893) +- [ebe9dcdf](https://github.com/stashed/mongodb/commit/ebe9dcdf) Use rs.slaveOk to fix mongo 3.4.17 backup (#1884) + + +### [3.4.22-v27](https://github.com/stashed/mongodb/releases/tag/3.4.22-v27) + +- [fcb3e7ea](https://github.com/stashed/mongodb/commit/fcb3e7ea) Prepare for release 3.4.22-v27 (#1910) +- [7116c874](https://github.com/stashed/mongodb/commit/7116c874) [cherry-pick] Update deps (#1892) (#1894) +- [6583d90b](https://github.com/stashed/mongodb/commit/6583d90b) Use rs.slaveOk to fix mongo 3.4.22 backup (#1885) + + +### [3.6.8-v27](https://github.com/stashed/mongodb/releases/tag/3.6.8-v27) + +- [40e8bd4d](https://github.com/stashed/mongodb/commit/40e8bd4d) Prepare for release 3.6.8-v27 (#1912) +- [41e660e2](https://github.com/stashed/mongodb/commit/41e660e2) [cherry-pick] Update deps (#1892) (#1896) +- [a3884165](https://github.com/stashed/mongodb/commit/a3884165) Use rs.slaveOk to fix mongo 3.6.8 backup (#1886) + + +### [3.6.13-v27](https://github.com/stashed/mongodb/releases/tag/3.6.13-v27) + +- [8d78c8bb](https://github.com/stashed/mongodb/commit/8d78c8bb) Prepare for release 3.6.13-v27 (#1911) +- [d88c7b7f](https://github.com/stashed/mongodb/commit/d88c7b7f) [cherry-pick] Update deps (#1892) (#1895) +- [6732af8c](https://github.com/stashed/mongodb/commit/6732af8c) Use rs.slaveOk to fix mongo 3.6.13 backup (#1883) + + +### [4.0.3-v27](https://github.com/stashed/mongodb/releases/tag/4.0.3-v27) + +- [d089c4d9](https://github.com/stashed/mongodb/commit/d089c4d9) Prepare for release 4.0.3-v27 (#1914) +- [398bf1a8](https://github.com/stashed/mongodb/commit/398bf1a8) [cherry-pick] Update deps (#1892) (#1898) +- [8e6e78d3](https://github.com/stashed/mongodb/commit/8e6e78d3) Use rs.slaveOk to fix mongo 4.0.3 backup (#1887) + + +### [4.0.5-v27](https://github.com/stashed/mongodb/releases/tag/4.0.5-v27) + +- [71661352](https://github.com/stashed/mongodb/commit/71661352) Prepare for release 4.0.5-v27 (#1915) +- [0a5b911a](https://github.com/stashed/mongodb/commit/0a5b911a) [cherry-pick] Update deps (#1892) (#1899) +- [21950874](https://github.com/stashed/mongodb/commit/21950874) Use rs.slaveOk to fix mongo 4.0.5 backup (#1882) + + +### [4.0.11-v27](https://github.com/stashed/mongodb/releases/tag/4.0.11-v27) + +- [67963872](https://github.com/stashed/mongodb/commit/67963872) Prepare for release 4.0.11-v27 (#1913) +- [072abb64](https://github.com/stashed/mongodb/commit/072abb64) [cherry-pick] Update deps (#1892) (#1897) +- [0ee67462](https://github.com/stashed/mongodb/commit/0ee67462) Use rs.slaveOk to fix mongo 4.0.11 backup (#1888) + + +### [4.1.4-v27](https://github.com/stashed/mongodb/releases/tag/4.1.4-v27) + +- [4fe47624](https://github.com/stashed/mongodb/commit/4fe47624) Prepare for release 4.1.4-v27 (#1917) +- [ab5889bb](https://github.com/stashed/mongodb/commit/ab5889bb) [cherry-pick] Update deps (#1892) (#1901) +- [d1c21e4f](https://github.com/stashed/mongodb/commit/d1c21e4f) Use rs.slaveOk to fix mongo 4.1.4 backup (#1889) + + +### [4.1.7-v27](https://github.com/stashed/mongodb/releases/tag/4.1.7-v27) + +- [254b78c9](https://github.com/stashed/mongodb/commit/254b78c9) Prepare for release 4.1.7-v27 (#1918) +- [94d2a8f5](https://github.com/stashed/mongodb/commit/94d2a8f5) [cherry-pick] Update deps (#1892) (#1902) +- [3b14cf33](https://github.com/stashed/mongodb/commit/3b14cf33) Use rs.slaveOk to fix mongo 4.1.7 backup (#1890) + + +### [4.1.13-v27](https://github.com/stashed/mongodb/releases/tag/4.1.13-v27) + +- [9bb4e999](https://github.com/stashed/mongodb/commit/9bb4e999) Prepare for release 4.1.13-v27 (#1916) +- [3aef0db6](https://github.com/stashed/mongodb/commit/3aef0db6) [cherry-pick] Update deps (#1892) (#1900) +- [90bfad36](https://github.com/stashed/mongodb/commit/90bfad36) Use rs.slaveOk to fix mongo 4.1.13 backup (#1891) + + +### [4.2.3-v27](https://github.com/stashed/mongodb/releases/tag/4.2.3-v27) + +- [48c97d77](https://github.com/stashed/mongodb/commit/48c97d77) Prepare for release 4.2.3-v27 (#1919) +- [604b34e2](https://github.com/stashed/mongodb/commit/604b34e2) [cherry-pick] Update deps (#1892) (#1903) +- [29896b2c](https://github.com/stashed/mongodb/commit/29896b2c) Use rs.slaveOk to fix mongo 4.2.3 backup (#1881) + + +### [4.4.6-v18](https://github.com/stashed/mongodb/releases/tag/4.4.6-v18) + +- [4eaddcf7](https://github.com/stashed/mongodb/commit/4eaddcf7) Prepare for release 4.4.6-v18 (#1920) +- [349e8939](https://github.com/stashed/mongodb/commit/349e8939) [cherry-pick] Update deps (#1892) (#1904) + + +### [5.0.3-v15](https://github.com/stashed/mongodb/releases/tag/5.0.3-v15) + +- [bfa14b3c](https://github.com/stashed/mongodb/commit/bfa14b3c) Prepare for release 5.0.3-v15 (#1922) +- [fc14b59b](https://github.com/stashed/mongodb/commit/fc14b59b) [cherry-pick] Update deps (#1892) (#1906) +- [0ae911f5](https://github.com/stashed/mongodb/commit/0ae911f5) Fix 5.0 early patch version restore issue (#1880) + + +### [5.0.15](https://github.com/stashed/mongodb/releases/tag/5.0.15) + +- [d9ea0f83](https://github.com/stashed/mongodb/commit/d9ea0f83) Prepare for release 5.0.15 (#1921) +- [3c32faf0](https://github.com/stashed/mongodb/commit/3c32faf0) [cherry-pick] Update deps (#1892) (#1905) + + +### [6.0.5-v3](https://github.com/stashed/mongodb/releases/tag/6.0.5-v3) + +- [fc388b3b](https://github.com/stashed/mongodb/commit/fc388b3b) Prepare for release 6.0.5-v3 (#1924) +- [d54d6af2](https://github.com/stashed/mongodb/commit/d54d6af2) Fix mg 6.0.5 backup-restore (#1908) +- [2687edeb](https://github.com/stashed/mongodb/commit/2687edeb) [cherry-pick] Update deps (#1892) (#1907) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v27](https://github.com/stashed/mysql/releases/tag/5.7.25-v27) + +- [690a6a1f](https://github.com/stashed/mysql/commit/690a6a1f) Fix gmodules.xyz/logs issue +- [8c164ff2](https://github.com/stashed/mysql/commit/8c164ff2) Prepare for release 5.7.25-v27 (#722) +- [cf9b1708](https://github.com/stashed/mysql/commit/cf9b1708) Exclude system databases during backup (#716) +- [d972d8e7](https://github.com/stashed/mysql/commit/d972d8e7) [cherry-pick] Update license verifier (#711) (#712) + + +### [8.0.3-v27](https://github.com/stashed/mysql/releases/tag/8.0.3-v27) + +- [4a2e46f1](https://github.com/stashed/mysql/commit/4a2e46f1) Prepare for release 8.0.3-v27 (#725) +- [a1b790d5](https://github.com/stashed/mysql/commit/a1b790d5) [cherry-pick] Update deps (#717) (#721) +- [52f58b34](https://github.com/stashed/mysql/commit/52f58b34) [cherry-pick] Update license verifier (#711) (#715) + + +### [8.0.14-v27](https://github.com/stashed/mysql/releases/tag/8.0.14-v27) + +- [823af2aa](https://github.com/stashed/mysql/commit/823af2aa) Prepare for release 8.0.14-v27 (#723) +- [8a4d09d0](https://github.com/stashed/mysql/commit/8a4d09d0) [cherry-pick] Update license verifier (#711) (#713) + + +### [8.0.21-v21](https://github.com/stashed/mysql/releases/tag/8.0.21-v21) + +- [c2c15078](https://github.com/stashed/mysql/commit/c2c15078) Prepare for release 8.0.21-v21 (#724) +- [ddf262f2](https://github.com/stashed/mysql/commit/ddf262f2) [cherry-pick] Update deps (#717) (#720) +- [77f327b7](https://github.com/stashed/mysql/commit/77f327b7) [cherry-pick] Update license verifier (#711) (#714) + + + +## [stashed/nats](https://github.com/stashed/nats) + +### [2.6.1-v15](https://github.com/stashed/nats/releases/tag/2.6.1-v15) + +- [9c47e0f](https://github.com/stashed/nats/commit/9c47e0f) Prepare for release 2.6.1-v15 (#114) +- [a18e2c6](https://github.com/stashed/nats/commit/a18e2c6) [cherry-pick] Update deps (#111) (#112) +- [a93d038](https://github.com/stashed/nats/commit/a93d038) [cherry-pick] Update license verifier (#108) (#109) +- [365c806](https://github.com/stashed/nats/commit/365c806) [cherry-pick] Fix Cleanup log (#96) (#106) + + +### [2.8.2-v10](https://github.com/stashed/nats/releases/tag/2.8.2-v10) + +- [2717429](https://github.com/stashed/nats/commit/2717429) Prepare for release 2.8.2-v10 (#115) +- [77a7bc5](https://github.com/stashed/nats/commit/77a7bc5) [cherry-pick] Update deps (#111) (#113) +- [5eda0f0](https://github.com/stashed/nats/commit/5eda0f0) [cherry-pick] Update license verifier (#108) (#110) +- [f32fe64](https://github.com/stashed/nats/commit/f32fe64) [cherry-pick] Fix Cleanup log (#96) (#107) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-v22](https://github.com/stashed/percona-xtradb/releases/tag/5.7-v22) + +- [44195a4b](https://github.com/stashed/percona-xtradb/commit/44195a4b) Prepare for release 5.7-v22 (#298) +- [5618947a](https://github.com/stashed/percona-xtradb/commit/5618947a) [cherry-pick] Update deps (#296) (#297) +- [bf715ef2](https://github.com/stashed/percona-xtradb/commit/bf715ef2) [cherry-pick] Update license verifier (#294) (#295) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v26](https://github.com/stashed/postgres/releases/tag/9.6.19-v26) + +- [216b6b37](https://github.com/stashed/postgres/commit/216b6b37) Prepare for release 9.6.19-v26 (#1222) +- [d2e7f4fb](https://github.com/stashed/postgres/commit/d2e7f4fb) [cherry-pick] Update deps (#1208) (#1215) +- [029164b4](https://github.com/stashed/postgres/commit/029164b4) [cherry-pick] Update license verifier (#1200) (#1207) + + +### [10.14-v26](https://github.com/stashed/postgres/releases/tag/10.14-v26) + +- [a54f7fc5](https://github.com/stashed/postgres/commit/a54f7fc5) Prepare for release 10.14-v26 (#1216) +- [ed324cf1](https://github.com/stashed/postgres/commit/ed324cf1) [cherry-pick] Update deps (#1208) (#1209) +- [746f73ec](https://github.com/stashed/postgres/commit/746f73ec) [cherry-pick] Update license verifier (#1200) (#1201) + + +### [11.9-v26](https://github.com/stashed/postgres/releases/tag/11.9-v26) + +- [936bcc3f](https://github.com/stashed/postgres/commit/936bcc3f) Prepare for release 11.9-v26 (#1217) +- [795fb54c](https://github.com/stashed/postgres/commit/795fb54c) [cherry-pick] Update deps (#1208) (#1210) +- [62f15553](https://github.com/stashed/postgres/commit/62f15553) [cherry-pick] Update license verifier (#1200) (#1202) + + +### [12.4-v26](https://github.com/stashed/postgres/releases/tag/12.4-v26) + +- [6fa36063](https://github.com/stashed/postgres/commit/6fa36063) Prepare for release 12.4-v26 (#1218) +- [63446f68](https://github.com/stashed/postgres/commit/63446f68) [cherry-pick] Update deps (#1208) (#1211) +- [bd1cfbfd](https://github.com/stashed/postgres/commit/bd1cfbfd) [cherry-pick] Update license verifier (#1200) (#1203) + + +### [13.1-v23](https://github.com/stashed/postgres/releases/tag/13.1-v23) + +- [6bd114ee](https://github.com/stashed/postgres/commit/6bd114ee) Prepare for release 13.1-v23 (#1219) +- [78e1b266](https://github.com/stashed/postgres/commit/78e1b266) [cherry-pick] Update deps (#1208) (#1212) +- [0c7606c6](https://github.com/stashed/postgres/commit/0c7606c6) [cherry-pick] Update license verifier (#1200) (#1204) + + +### [14.0-v15](https://github.com/stashed/postgres/releases/tag/14.0-v15) + +- [990a5dff](https://github.com/stashed/postgres/commit/990a5dff) Prepare for release 14.0-v15 (#1220) +- [1263620a](https://github.com/stashed/postgres/commit/1263620a) [cherry-pick] Update deps (#1208) (#1213) +- [c9672862](https://github.com/stashed/postgres/commit/c9672862) [cherry-pick] Update license verifier (#1200) (#1205) + + +### [15.1-v7](https://github.com/stashed/postgres/releases/tag/15.1-v7) + +- [efc38fee](https://github.com/stashed/postgres/commit/efc38fee) Prepare for release 15.1-v7 (#1221) +- [37bea2c4](https://github.com/stashed/postgres/commit/37bea2c4) [cherry-pick] Update deps (#1208) (#1214) +- [79262385](https://github.com/stashed/postgres/commit/79262385) [cherry-pick] Update license verifier (#1200) (#1206) + + + +## [stashed/redis](https://github.com/stashed/redis) + +### [5.0.13-v15](https://github.com/stashed/redis/releases/tag/5.0.13-v15) + +- [355b4c8](https://github.com/stashed/redis/commit/355b4c8) Prepare for release 5.0.13-v15 (#188) +- [9bf188a](https://github.com/stashed/redis/commit/9bf188a) [cherry-pick] Update deps (#184) (#185) +- [af8b8f2](https://github.com/stashed/redis/commit/af8b8f2) [cherry-pick] Update license verifier (#180) (#181) + + +### [6.2.5-v15](https://github.com/stashed/redis/releases/tag/6.2.5-v15) + +- [628e69c](https://github.com/stashed/redis/commit/628e69c) Prepare for release 6.2.5-v15 (#189) +- [ccac2f6](https://github.com/stashed/redis/commit/ccac2f6) [cherry-pick] Update deps (#184) (#186) +- [e6350ca](https://github.com/stashed/redis/commit/e6350ca) [cherry-pick] Update license verifier (#180) (#182) + + +### [7.0.5-v8](https://github.com/stashed/redis/releases/tag/7.0.5-v8) + +- [a92be34](https://github.com/stashed/redis/commit/a92be34) Prepare for release 7.0.5-v8 (#190) +- [0839664](https://github.com/stashed/redis/commit/0839664) [cherry-pick] Update deps (#184) (#187) +- [0d92953](https://github.com/stashed/redis/commit/0d92953) [cherry-pick] Update license verifier (#180) (#183) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.31.0](https://github.com/stashed/stash/releases/tag/v0.31.0) + +- [f9619308](https://github.com/stashed/stash/commit/f96193085) Prepare for release v0.31.0 (#1535) +- [06bacfdd](https://github.com/stashed/stash/commit/06bacfddb) Update deps (#1534) +- [93a4b4cd](https://github.com/stashed/stash/commit/93a4b4cd4) Update license verifier (#1529) + + + +## [stashed/ui-server](https://github.com/stashed/ui-server) + +### [v0.13.0](https://github.com/stashed/ui-server/releases/tag/v0.13.0) + +- [76be456](https://github.com/stashed/ui-server/commit/76be456) Prepare for release v0.13.0 (#31) +- [e36e542](https://github.com/stashed/ui-server/commit/e36e542) Update deps (#30) +- [404390e](https://github.com/stashed/ui-server/commit/404390e) Update deps (#29) +- [cc4c1f0](https://github.com/stashed/ui-server/commit/cc4c1f0) Update license verifier (#28) + + + +## [stashed/vault](https://github.com/stashed/vault) + +### [1.10.3-v7](https://github.com/stashed/vault/releases/tag/1.10.3-v7) + +- [108e96c3](https://github.com/stashed/vault/commit/108e96c3) Prepare for release 1.10.3-v7 (#23) +- [b5d77977](https://github.com/stashed/vault/commit/b5d77977) [cherry-pick] Update deps (#21) (#22) +- [3e339de5](https://github.com/stashed/vault/commit/3e339de5) [cherry-pick] Update license verifier (#19) (#20) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2023.10.9.md b/content/docs/v2024.12.18/CHANGELOG-v2023.10.9.md new file mode 100644 index 0000000000..f88b279257 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2023.10.9.md @@ -0,0 +1,440 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2023.10.9 + name: Changelog-v2023.10.9 + parent: welcome + weight: 20231009 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2023.10.9/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2023.10.9/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2023.10.9 (2023-10-04) + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.32.0](https://github.com/stashed/apimachinery/releases/tag/v0.32.0) + +- [47e563c6](https://github.com/stashed/apimachinery/commit/47e563c6) Update deps +- [741d0149](https://github.com/stashed/apimachinery/commit/741d0149) Add restic methods for managing restic keys (#211) +- [3eb3dc0d](https://github.com/stashed/apimachinery/commit/3eb3dc0d) Add new hookExecutionPolicy `OnFinalRetryFailure` (#210) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.32.0](https://github.com/stashed/cli/releases/tag/v0.32.0) + +- [575a83da](https://github.com/stashed/cli/commit/575a83da) Prepare for release v0.32.0 (#190) +- [a5706148](https://github.com/stashed/cli/commit/a5706148) Add commands for generating restore rules and managing restic keys (#189) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v28](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v28) + +- [a8d57072](https://github.com/stashed/elasticsearch/commit/a8d57072) Prepare for release 5.6.4-v28 (#1434) + + +### [6.2.4-v28](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v28) + +- [7dbca84a](https://github.com/stashed/elasticsearch/commit/7dbca84a) Prepare for release 6.2.4-v28 (#1435) + + +### [6.3.0-v28](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v28) + +- [a9ece1ec](https://github.com/stashed/elasticsearch/commit/a9ece1ec) Prepare for release 6.3.0-v28 (#1436) + + +### [6.4.0-v28](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v28) + +- [8b4ab388](https://github.com/stashed/elasticsearch/commit/8b4ab388) Prepare for release 6.4.0-v28 (#1437) + + +### [6.5.3-v28](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v28) + +- [082ca286](https://github.com/stashed/elasticsearch/commit/082ca286) Prepare for release 6.5.3-v28 (#1438) + + +### [6.8.0-v28](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v28) + +- [84e1ee57](https://github.com/stashed/elasticsearch/commit/84e1ee57) Prepare for release 6.8.0-v28 (#1439) + + +### [7.2.0-v28](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v28) + +- [3e6a708f](https://github.com/stashed/elasticsearch/commit/3e6a708f) Prepare for release 7.2.0-v28 (#1441) + + +### [7.3.2-v28](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v28) + +- [9249eefe](https://github.com/stashed/elasticsearch/commit/9249eefe) Prepare for release 7.3.2-v28 (#1442) + + +### [7.14.0-v14](https://github.com/stashed/elasticsearch/releases/tag/7.14.0-v14) + +- [91ad7fe5](https://github.com/stashed/elasticsearch/commit/91ad7fe5) Prepare for release 7.14.0-v14 (#1440) + + +### [8.2.0-v11](https://github.com/stashed/elasticsearch/releases/tag/8.2.0-v11) + +- [8142ea6d](https://github.com/stashed/elasticsearch/commit/8142ea6d) Prepare for release 8.2.0-v11 (#1443) + + + +## [stashed/enterprise](https://github.com/stashed/enterprise) + +### [v0.32.0](https://github.com/stashed/enterprise/releases/tag/v0.32.0) + +- [433789a4](https://github.com/stashed/enterprise/commit/433789a4c) Prepare for release v0.32.0 (#240) +- [149f81cc](https://github.com/stashed/enterprise/commit/149f81cc2) Add commands for managing restic passwords + Update snapshot download directory (#239) + + + +## [stashed/etcd](https://github.com/stashed/etcd) + +### [3.5.0-v15](https://github.com/stashed/etcd/releases/tag/3.5.0-v15) + +- [47078d2](https://github.com/stashed/etcd/commit/47078d2) Prepare for release 3.5.0-v15 (#83) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2023.10.9](https://github.com/stashed/installer/releases/tag/v2023.10.9) + +- [7bd4fbf5](https://github.com/stashed/installer/commit/7bd4fbf5) Prepare for release v2023.10.9 (#321) + + + +## [stashed/kubedump](https://github.com/stashed/kubedump) + +### [0.1.0-v11](https://github.com/stashed/kubedump/releases/tag/0.1.0-v11) + +- [f4af197](https://github.com/stashed/kubedump/commit/f4af197) Prepare for release 0.1.0-v11 (#47) + + + +## [stashed/mariadb](https://github.com/stashed/mariadb) + +### [10.5.8-v21](https://github.com/stashed/mariadb/releases/tag/10.5.8-v21) + +- [8a94399](https://github.com/stashed/mariadb/commit/8a94399) Prepare for release 10.5.8-v21 (#230) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v28](https://github.com/stashed/mongodb/releases/tag/3.4.17-v28) + +- [bcf4a647](https://github.com/stashed/mongodb/commit/bcf4a647) Prepare for release 3.4.17-v28 (#1976) +- [66d02849](https://github.com/stashed/mongodb/commit/66d02849) Unlock and sync secondary (#1973) +- [8d14efa5](https://github.com/stashed/mongodb/commit/8d14efa5) Add support for restoring specific snapshot (#1927) (#1947) +- [cb8f9ff8](https://github.com/stashed/mongodb/commit/cb8f9ff8) [cherry-pick] Add stopBalancer timeout; Retry setBalancerState; Improve logging (#1929) (#1930) + + +### [3.4.22-v28](https://github.com/stashed/mongodb/releases/tag/3.4.22-v28) + +- [65bf1bd4](https://github.com/stashed/mongodb/commit/65bf1bd4) Prepare for release 3.4.22-v28 (#1977) +- [7f588f23](https://github.com/stashed/mongodb/commit/7f588f23) Unlock and sync secondary (#1972) +- [704053fb](https://github.com/stashed/mongodb/commit/704053fb) Add support for restoring specific snapshot (#1927) (#1948) +- [fad11e0b](https://github.com/stashed/mongodb/commit/fad11e0b) [cherry-pick] Add stopBalancer timeout; Retry setBalancerState; Improve logging (#1929) (#1931) + + +### [3.6.8-v28](https://github.com/stashed/mongodb/releases/tag/3.6.8-v28) + +- [64352461](https://github.com/stashed/mongodb/commit/64352461) Prepare for release 3.6.8-v28 (#1979) +- [f28e5990](https://github.com/stashed/mongodb/commit/f28e5990) Unlock and sync secondary (#1969) +- [58e82130](https://github.com/stashed/mongodb/commit/58e82130) Add support for restoring specific snapshot (#1927) (#1950) +- [e594e6ef](https://github.com/stashed/mongodb/commit/e594e6ef) [cherry-pick] Add stopBalancer timeout; Retry setBalancerState; Improve logging (#1929) (#1933) + + +### [3.6.13-v28](https://github.com/stashed/mongodb/releases/tag/3.6.13-v28) + +- [3da732da](https://github.com/stashed/mongodb/commit/3da732da) Prepare for release 3.6.13-v28 (#1978) +- [3e032a81](https://github.com/stashed/mongodb/commit/3e032a81) Unlock and sync secondary (#1970) +- [4cca80c3](https://github.com/stashed/mongodb/commit/4cca80c3) Add support for restoring specific snapshot (#1927) (#1949) +- [18c43f7e](https://github.com/stashed/mongodb/commit/18c43f7e) [cherry-pick] Add stopBalancer timeout; Retry setBalancerState; Improve logging (#1929) (#1932) + + +### [4.0.3-v28](https://github.com/stashed/mongodb/releases/tag/4.0.3-v28) + +- [ed7e2a5f](https://github.com/stashed/mongodb/commit/ed7e2a5f) Prepare for release 4.0.3-v28 (#1981) +- [3340ae34](https://github.com/stashed/mongodb/commit/3340ae34) Unlock and sync secondary (#1971) +- [26f42032](https://github.com/stashed/mongodb/commit/26f42032) Add support for restoring specific snapshot (#1927) (#1952) +- [f16cbfba](https://github.com/stashed/mongodb/commit/f16cbfba) [cherry-pick] Add stopBalancer timeout; Retry setBalancerState; Improve logging (#1929) (#1935) + + +### [4.0.5-v28](https://github.com/stashed/mongodb/releases/tag/4.0.5-v28) + +- [7d29cfa8](https://github.com/stashed/mongodb/commit/7d29cfa8) Prepare for release 4.0.5-v28 (#1982) +- [d0461920](https://github.com/stashed/mongodb/commit/d0461920) Unlock and sync secondary (#1974) +- [2eeec3ba](https://github.com/stashed/mongodb/commit/2eeec3ba) Add support for restoring specific snapshot (#1927) (#1953) +- [4efc8bff](https://github.com/stashed/mongodb/commit/4efc8bff) [cherry-pick] Add stopBalancer timeout; Retry setBalancerState; Improve logging (#1929) (#1936) + + +### [4.0.11-v28](https://github.com/stashed/mongodb/releases/tag/4.0.11-v28) + +- [9891070f](https://github.com/stashed/mongodb/commit/9891070f) Prepare for release 4.0.11-v28 (#1980) +- [37bfb091](https://github.com/stashed/mongodb/commit/37bfb091) unlock and sync secondary (#1975) +- [53244213](https://github.com/stashed/mongodb/commit/53244213) Add support for restoring specific snapshot (#1927) (#1951) +- [c61568dd](https://github.com/stashed/mongodb/commit/c61568dd) [cherry-pick] Add stopBalancer timeout; Retry setBalancerState; Improve logging (#1929) (#1934) + + +### [4.1.4-v28](https://github.com/stashed/mongodb/releases/tag/4.1.4-v28) + +- [90543078](https://github.com/stashed/mongodb/commit/90543078) Prepare for release 4.1.4-v28 (#1984) +- [62d36ac9](https://github.com/stashed/mongodb/commit/62d36ac9) Unlock and sync secondary (#1965) +- [11c75f06](https://github.com/stashed/mongodb/commit/11c75f06) Add support for restoring specific snapshot (#1927) (#1955) +- [16475896](https://github.com/stashed/mongodb/commit/16475896) [cherry-pick] Add stopBalancer timeout; Retry setBalancerState; Improve logging (#1929) (#1938) + + +### [4.1.7-v28](https://github.com/stashed/mongodb/releases/tag/4.1.7-v28) + +- [ad96467e](https://github.com/stashed/mongodb/commit/ad96467e) Prepare for release 4.1.7-v28 (#1985) +- [fe5de7da](https://github.com/stashed/mongodb/commit/fe5de7da) Unlock and sync secondary (#1966) +- [d2810a49](https://github.com/stashed/mongodb/commit/d2810a49) Add support for restoring specific snapshot (#1927) (#1956) +- [209aaa40](https://github.com/stashed/mongodb/commit/209aaa40) [cherry-pick] Add stopBalancer timeout; Retry setBalancerState; Improve logging (#1929) (#1939) + + +### [4.1.13-v28](https://github.com/stashed/mongodb/releases/tag/4.1.13-v28) + +- [26289363](https://github.com/stashed/mongodb/commit/26289363) Prepare for release 4.1.13-v28 (#1983) +- [a529618c](https://github.com/stashed/mongodb/commit/a529618c) Unlock and sync secondary (#1967) +- [c2de7995](https://github.com/stashed/mongodb/commit/c2de7995) Add support for restoring specific snapshot (#1927) (#1954) +- [c3118596](https://github.com/stashed/mongodb/commit/c3118596) [cherry-pick] Add stopBalancer timeout; Retry setBalancerState; Improve logging (#1929) (#1937) + + +### [4.2.3-v28](https://github.com/stashed/mongodb/releases/tag/4.2.3-v28) + +- [d716d870](https://github.com/stashed/mongodb/commit/d716d870) Prepare for release 4.2.3-v28 (#1987) +- [5b708249](https://github.com/stashed/mongodb/commit/5b708249) Unlock and sync secondary (#1968) +- [89798c12](https://github.com/stashed/mongodb/commit/89798c12) Add support for restoring specific snapshot (#1927) (#1957) +- [3e23f106](https://github.com/stashed/mongodb/commit/3e23f106) [cherry-pick] Add stopBalancer timeout; Retry setBalancerState; Improve logging (#1929) (#1940) + + +### [4.4.6-v19](https://github.com/stashed/mongodb/releases/tag/4.4.6-v19) + +- [aba61b85](https://github.com/stashed/mongodb/commit/aba61b85) Prepare for release 4.4.6-v19 (#1988) +- [34ab90b8](https://github.com/stashed/mongodb/commit/34ab90b8) Unlock and sync secondary hosts (#1945) +- [68c8b8c8](https://github.com/stashed/mongodb/commit/68c8b8c8) Add support for restoring specific snapshot (#1927) (#1958) +- [476c6063](https://github.com/stashed/mongodb/commit/476c6063) Add stopBalancer timeout; Retry setBalancerState; Improve logging (#1929) (#1941) +- [a8474619](https://github.com/stashed/mongodb/commit/a8474619) Add stopBalancer timeout; Retry setBalancerState; Improve logging (#1928) + + +### [5.0.3-v16](https://github.com/stashed/mongodb/releases/tag/5.0.3-v16) + +- [8f480622](https://github.com/stashed/mongodb/commit/8f480622) Prepare for release 5.0.3-v16 (#1990) +- [70f9d538](https://github.com/stashed/mongodb/commit/70f9d538) Unlock and sync secondary (#1964) +- [be10f0b2](https://github.com/stashed/mongodb/commit/be10f0b2) Add support for restoring specific snapshot (#1927) (#1960) +- [147be12d](https://github.com/stashed/mongodb/commit/147be12d) Add stopBalancer timeout; Retry setBalancerState; Improve logging (#1929) (#1943) + + +### [5.0.15-v1](https://github.com/stashed/mongodb/releases/tag/5.0.15-v1) + +- [070dc6c6](https://github.com/stashed/mongodb/commit/070dc6c6) Prepare for release 5.0.15-v1 (#1989) +- [95f520db](https://github.com/stashed/mongodb/commit/95f520db) Unlock and sync secondary (#1963) +- [ff442bc0](https://github.com/stashed/mongodb/commit/ff442bc0) Add support for restoring specific snapshot (#1927) (#1959) +- [f4bed984](https://github.com/stashed/mongodb/commit/f4bed984) Add stopBalancer timeout; Retry setBalancerState; Improve logging (#1929) (#1942) + + +### [6.0.5-v4](https://github.com/stashed/mongodb/releases/tag/6.0.5-v4) + +- [093dcce3](https://github.com/stashed/mongodb/commit/093dcce3) Prepare for release 6.0.5-v4 (#1991) +- [b20054bc](https://github.com/stashed/mongodb/commit/b20054bc) Unlock and sync secondary (#1962) +- [f9357173](https://github.com/stashed/mongodb/commit/f9357173) Add support for restoring specific snapshot (#1927) (#1961) +- [5f2f88ea](https://github.com/stashed/mongodb/commit/5f2f88ea) Add stopBalancer timeout; Retry setBalancerState; Improve logging (#1929) (#1944) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v28](https://github.com/stashed/mysql/releases/tag/5.7.25-v28) + +- [e8925996](https://github.com/stashed/mysql/commit/e8925996) Prepare for release 5.7.25-v28 (#727) + + +### [8.0.3-v28](https://github.com/stashed/mysql/releases/tag/8.0.3-v28) + +- [00672e31](https://github.com/stashed/mysql/commit/00672e31) Prepare for release 8.0.3-v28 (#730) + + +### [8.0.14-v28](https://github.com/stashed/mysql/releases/tag/8.0.14-v28) + +- [a7c4579f](https://github.com/stashed/mysql/commit/a7c4579f) Prepare for release 8.0.14-v28 (#728) + + +### [8.0.21-v22](https://github.com/stashed/mysql/releases/tag/8.0.21-v22) + +- [2c21d225](https://github.com/stashed/mysql/commit/2c21d225) Prepare for release 8.0.21-v22 (#729) + + + +## [stashed/nats](https://github.com/stashed/nats) + +### [2.6.1-v16](https://github.com/stashed/nats/releases/tag/2.6.1-v16) + +- [fb04742](https://github.com/stashed/nats/commit/fb04742) Prepare for release 2.6.1-v16 (#117) + + +### [2.8.2-v11](https://github.com/stashed/nats/releases/tag/2.8.2-v11) + +- [535e051](https://github.com/stashed/nats/commit/535e051) Prepare for release 2.8.2-v11 (#118) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-v23](https://github.com/stashed/percona-xtradb/releases/tag/5.7-v23) + +- [54009c23](https://github.com/stashed/percona-xtradb/commit/54009c23) Prepare for release 5.7-v23 (#300) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v27](https://github.com/stashed/postgres/releases/tag/9.6.19-v27) + +- [c8aa8598](https://github.com/stashed/postgres/commit/c8aa8598) Prepare for release 9.6.19-v27 (#1230) + + +### [10.14-v27](https://github.com/stashed/postgres/releases/tag/10.14-v27) + +- [3a7ba3fa](https://github.com/stashed/postgres/commit/3a7ba3fa) Prepare for release 10.14-v27 (#1224) + + +### [11.9-v27](https://github.com/stashed/postgres/releases/tag/11.9-v27) + +- [b8bb39e3](https://github.com/stashed/postgres/commit/b8bb39e3) Prepare for release 11.9-v27 (#1225) + + +### [12.4-v27](https://github.com/stashed/postgres/releases/tag/12.4-v27) + +- [fb6b2835](https://github.com/stashed/postgres/commit/fb6b2835) Prepare for release 12.4-v27 (#1226) + + +### [13.1-v24](https://github.com/stashed/postgres/releases/tag/13.1-v24) + +- [3e815eba](https://github.com/stashed/postgres/commit/3e815eba) Prepare for release 13.1-v24 (#1227) + + +### [14.0-v16](https://github.com/stashed/postgres/releases/tag/14.0-v16) + +- [7183205b](https://github.com/stashed/postgres/commit/7183205b) Prepare for release 14.0-v16 (#1228) + + +### [15.1-v8](https://github.com/stashed/postgres/releases/tag/15.1-v8) + +- [00deb5be](https://github.com/stashed/postgres/commit/00deb5be) Prepare for release 15.1-v8 (#1229) + + + +## [stashed/redis](https://github.com/stashed/redis) + +### [5.0.13-v16](https://github.com/stashed/redis/releases/tag/5.0.13-v16) + +- [e267408](https://github.com/stashed/redis/commit/e267408) Prepare for release 5.0.13-v16 (#192) + + +### [6.2.5-v16](https://github.com/stashed/redis/releases/tag/6.2.5-v16) + +- [f1e5414](https://github.com/stashed/redis/commit/f1e5414) Prepare for release 6.2.5-v16 (#193) + + +### [7.0.5-v9](https://github.com/stashed/redis/releases/tag/7.0.5-v9) + +- [4e11289](https://github.com/stashed/redis/commit/4e11289) Prepare for release 7.0.5-v9 (#194) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.32.0](https://github.com/stashed/stash/releases/tag/v0.32.0) + +- [993671e7](https://github.com/stashed/stash/commit/993671e74) Prepare for release v0.32.0 (#1539) + + + +## [stashed/vault](https://github.com/stashed/vault) + +### [1.10.3-v8](https://github.com/stashed/vault/releases/tag/1.10.3-v8) + +- [4b96de6a](https://github.com/stashed/vault/commit/4b96de6a) Prepare for release 1.10.3-v8 (#25) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2024.12.18.md b/content/docs/v2024.12.18/CHANGELOG-v2024.12.18.md new file mode 100644 index 0000000000..e0b012b3f2 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2024.12.18.md @@ -0,0 +1,513 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2024.12.18 + name: Changelog-v2024.12.18 + parent: welcome + weight: 20241218 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2024.12.18/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2024.12.18/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2024.12.18 (2024-12-18) + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.37.0](https://github.com/stashed/apimachinery/releases/tag/v0.37.0) + +- [8f07b3c5](https://github.com/stashed/apimachinery/commit/8f07b3c5) Update deps +- [0cab85aa](https://github.com/stashed/apimachinery/commit/0cab85aa) Run dump command in bash shell (#228) +- [fb4061fd](https://github.com/stashed/apimachinery/commit/fb4061fd) Add support for templating for exec hook command (#229) +- [2e1520fd](https://github.com/stashed/apimachinery/commit/2e1520fd) Use kind v0.25.0 (#227) +- [785bc7ee](https://github.com/stashed/apimachinery/commit/785bc7ee) Use debian:12 base image (#226) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.37.0](https://github.com/stashed/cli/releases/tag/v0.37.0) + +- [9e673748](https://github.com/stashed/cli/commit/9e673748) Prepare for release v0.37.0 (#206) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v33](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v33) + +- [fa5b7b2f](https://github.com/stashed/elasticsearch/commit/fa5b7b2f) Prepare for release 5.6.4-v33 (#1579) +- [3b38c8bd](https://github.com/stashed/elasticsearch/commit/3b38c8bd) Use debian:12 base image (#1568) (#1569) +- [505c24be](https://github.com/stashed/elasticsearch/commit/505c24be) Remove docker registry support (#1558) + + +### [6.2.4-v33](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v33) + +- [a88234a3](https://github.com/stashed/elasticsearch/commit/a88234a3) Prepare for release 6.2.4-v33 (#1580) +- [c2bf0ea4](https://github.com/stashed/elasticsearch/commit/c2bf0ea4) [cherry-pick] Use debian:12 base image (#1568) (#1570) +- [9fe5b292](https://github.com/stashed/elasticsearch/commit/9fe5b292) Remove docker registry support (#1559) + + +### [6.3.0-v33](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v33) + +- [a56523b9](https://github.com/stashed/elasticsearch/commit/a56523b9) Prepare for release 6.3.0-v33 (#1581) +- [023637f6](https://github.com/stashed/elasticsearch/commit/023637f6) Use debian:12 base image (#1568) (#1571) +- [01e177ca](https://github.com/stashed/elasticsearch/commit/01e177ca) Remove docker registry support (#1560) + + +### [6.4.0-v33](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v33) + +- [542f3af6](https://github.com/stashed/elasticsearch/commit/542f3af6) Prepare for release 6.4.0-v33 (#1582) +- [9cb0f847](https://github.com/stashed/elasticsearch/commit/9cb0f847) Use debian:12 base image (#1568) (#1572) +- [fe39fce0](https://github.com/stashed/elasticsearch/commit/fe39fce0) Remove docker registry support (#1561) + + +### [6.5.3-v33](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v33) + +- [8432af1e](https://github.com/stashed/elasticsearch/commit/8432af1e) Prepare for release 6.5.3-v33 (#1583) +- [06c360e0](https://github.com/stashed/elasticsearch/commit/06c360e0) Use debian:12 base image (#1568) (#1573) +- [d1e0a4cc](https://github.com/stashed/elasticsearch/commit/d1e0a4cc) Remove docker registry support (#1562) + + +### [6.8.0-v33](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v33) + +- [65ee63c2](https://github.com/stashed/elasticsearch/commit/65ee63c2) Prepare for release 6.8.0-v33 (#1584) +- [fcf09b2f](https://github.com/stashed/elasticsearch/commit/fcf09b2f) Use debian:12 base image (#1568) (#1574) +- [0d6061c6](https://github.com/stashed/elasticsearch/commit/0d6061c6) Remove docker registry support (#1563) + + +### [7.2.0-v33](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v33) + +- [f6fc183c](https://github.com/stashed/elasticsearch/commit/f6fc183c) Prepare for release 7.2.0-v33 (#1586) +- [2c36fd90](https://github.com/stashed/elasticsearch/commit/2c36fd90) Use debian:12 base image (#1568) (#1576) +- [67539698](https://github.com/stashed/elasticsearch/commit/67539698) Remove docker registry support (#1565) + + +### [7.3.2-v33](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v33) + +- [20d1e671](https://github.com/stashed/elasticsearch/commit/20d1e671) Prepare for release 7.3.2-v33 (#1587) +- [cd431ad2](https://github.com/stashed/elasticsearch/commit/cd431ad2) Use debian:12 base image (#1568) (#1577) +- [f7f4f242](https://github.com/stashed/elasticsearch/commit/f7f4f242) Remove docker registry support (#1566) + + +### [7.14.0-v19](https://github.com/stashed/elasticsearch/releases/tag/7.14.0-v19) + +- [123a2ac8](https://github.com/stashed/elasticsearch/commit/123a2ac8) Prepare for release 7.14.0-v19 (#1585) +- [348a3cbf](https://github.com/stashed/elasticsearch/commit/348a3cbf) Use debian:12 base image (#1568) (#1575) +- [3275d2b7](https://github.com/stashed/elasticsearch/commit/3275d2b7) Remove docker registry support (#1564) + + +### [8.2.0-v16](https://github.com/stashed/elasticsearch/releases/tag/8.2.0-v16) + +- [22c08e5e](https://github.com/stashed/elasticsearch/commit/22c08e5e) Prepare for release 8.2.0-v16 (#1588) +- [a1fa89fb](https://github.com/stashed/elasticsearch/commit/a1fa89fb) Use debian:12 base image (#1568) (#1578) +- [3953e658](https://github.com/stashed/elasticsearch/commit/3953e658) Remove docker registry support (#1567) + + + +## [stashed/enterprise](https://github.com/stashed/enterprise) + +### [v0.37.0](https://github.com/stashed/enterprise/releases/tag/v0.37.0) + +- [bd5b4582](https://github.com/stashed/enterprise/commit/bd5b45826) Prepare for release v0.37.0 (#260) +- [ce7dcec5](https://github.com/stashed/enterprise/commit/ce7dcec59) Use debian:12 base image (#259) +- [2cc2b868](https://github.com/stashed/enterprise/commit/2cc2b8689) Use debian:12 base image (#258) + + + +## [stashed/etcd](https://github.com/stashed/etcd) + +### [3.5.0-v20](https://github.com/stashed/etcd/releases/tag/3.5.0-v20) + +- [5e4749a](https://github.com/stashed/etcd/commit/5e4749a) Prepare for release 3.5.0-v20 (#106) +- [75abfaa](https://github.com/stashed/etcd/commit/75abfaa) [cherry-pick] Use debian:12 base image (#104) (#105) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2024.12.18](https://github.com/stashed/installer/releases/tag/v2024.12.18) + +- [848c27da](https://github.com/stashed/installer/commit/848c27da) Prepare for release v2024.12.18 (#381) +- [f3a6becb](https://github.com/stashed/installer/commit/f3a6becb) Check image arch (#377) +- [96d42726](https://github.com/stashed/installer/commit/96d42726) Add `multi-dump-args` in backup arguments section (#373) +- [c69f9823](https://github.com/stashed/installer/commit/c69f9823) Update cve report (#379) +- [3acacc8f](https://github.com/stashed/installer/commit/3acacc8f) Update cve report (#378) +- [00187530](https://github.com/stashed/installer/commit/00187530) Update cve report (#376) +- [0ffdef58](https://github.com/stashed/installer/commit/0ffdef58) Update cve report (#375) +- [1049873b](https://github.com/stashed/installer/commit/1049873b) Update cve report (#374) +- [cc0e41e3](https://github.com/stashed/installer/commit/cc0e41e3) Update cve report (#372) +- [fc059f8d](https://github.com/stashed/installer/commit/fc059f8d) Update cve report (#371) +- [bed81bf8](https://github.com/stashed/installer/commit/bed81bf8) Use kind v0.25.0 (#370) +- [79852fb8](https://github.com/stashed/installer/commit/79852fb8) Update cve report (#369) +- [5b58fc1e](https://github.com/stashed/installer/commit/5b58fc1e) Update cve report (#368) + + + +## [stashed/kubedump](https://github.com/stashed/kubedump) + +### [0.1.0-v16](https://github.com/stashed/kubedump/releases/tag/0.1.0-v16) + +- [7b4ed69](https://github.com/stashed/kubedump/commit/7b4ed69) Prepare for release 0.1.0-v16 (#74) +- [0e56b50](https://github.com/stashed/kubedump/commit/0e56b50) Use debian:12 base image (#72) (#73) +- [77f8072](https://github.com/stashed/kubedump/commit/77f8072) [cherry-pick] Use debian:12 base image (#70) (#71) + + + +## [stashed/mariadb](https://github.com/stashed/mariadb) + +### [10.5.8-v27](https://github.com/stashed/mariadb/releases/tag/10.5.8-v27) + +- [dbc3a4e6](https://github.com/stashed/mariadb/commit/dbc3a4e6) Prepare for release 10.5.8-v27 (#254) +- [725695de](https://github.com/stashed/mariadb/commit/725695de) [cherry-pick] Use debian:12 base image (#252) (#253) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v34](https://github.com/stashed/mongodb/releases/tag/3.4.17-v34) + +- [b99e6dd1](https://github.com/stashed/mongodb/commit/b99e6dd1) Prepare for release 3.4.17-v34 (#2221) +- [9554ccd0](https://github.com/stashed/mongodb/commit/9554ccd0) Use debian:12 base image (#2205) (#2206) + + +### [3.4.22-v34](https://github.com/stashed/mongodb/releases/tag/3.4.22-v34) + +- [5697da70](https://github.com/stashed/mongodb/commit/5697da70) Prepare for release 3.4.22-v34 (#2222) +- [070a6a8c](https://github.com/stashed/mongodb/commit/070a6a8c) Use debian:12 base image (#2205) (#2207) + + +### [3.6.8-v34](https://github.com/stashed/mongodb/releases/tag/3.6.8-v34) + +- [6337c127](https://github.com/stashed/mongodb/commit/6337c127) Prepare for release 3.6.8-v34 (#2224) +- [7174720b](https://github.com/stashed/mongodb/commit/7174720b) Use debian:12 base image (#2205) (#2209) + + +### [3.6.13-v34](https://github.com/stashed/mongodb/releases/tag/3.6.13-v34) + +- [39b9cd24](https://github.com/stashed/mongodb/commit/39b9cd24) Prepare for release 3.6.13-v34 (#2223) +- [714113ca](https://github.com/stashed/mongodb/commit/714113ca) Use debian:12 base image (#2205) (#2208) + + +### [4.0.3-v34](https://github.com/stashed/mongodb/releases/tag/4.0.3-v34) + +- [3eb3037d](https://github.com/stashed/mongodb/commit/3eb3037d) Prepare for release 4.0.3-v34 (#2226) +- [2df3bd50](https://github.com/stashed/mongodb/commit/2df3bd50) Use debian:12 base image (#2205) (#2211) + + +### [4.0.5-v34](https://github.com/stashed/mongodb/releases/tag/4.0.5-v34) + +- [ecfd742c](https://github.com/stashed/mongodb/commit/ecfd742c) Prepare for release 4.0.5-v34 (#2227) +- [84e91774](https://github.com/stashed/mongodb/commit/84e91774) Use debian:12 base image (#2205) (#2212) + + +### [4.0.11-v34](https://github.com/stashed/mongodb/releases/tag/4.0.11-v34) + +- [152dd128](https://github.com/stashed/mongodb/commit/152dd128) Prepare for release 4.0.11-v34 (#2225) +- [c717178e](https://github.com/stashed/mongodb/commit/c717178e) Use debian:12 base image (#2205) (#2210) + + +### [4.1.4-v34](https://github.com/stashed/mongodb/releases/tag/4.1.4-v34) + +- [415a1cad](https://github.com/stashed/mongodb/commit/415a1cad) Prepare for release 4.1.4-v34 (#2229) +- [b2862276](https://github.com/stashed/mongodb/commit/b2862276) Use debian:12 base image (#2205) (#2214) + + +### [4.1.7-v34](https://github.com/stashed/mongodb/releases/tag/4.1.7-v34) + +- [34588eaa](https://github.com/stashed/mongodb/commit/34588eaa) Prepare for release 4.1.7-v34 (#2230) +- [0c0e202f](https://github.com/stashed/mongodb/commit/0c0e202f) Use debian:12 base image (#2205) (#2215) + + +### [4.1.13-v34](https://github.com/stashed/mongodb/releases/tag/4.1.13-v34) + +- [1f742d4b](https://github.com/stashed/mongodb/commit/1f742d4b) Prepare for release 4.1.13-v34 (#2228) +- [19c6d407](https://github.com/stashed/mongodb/commit/19c6d407) Use debian:12 base image (#2205) (#2213) + + +### [4.2.3-v34](https://github.com/stashed/mongodb/releases/tag/4.2.3-v34) + +- [21242246](https://github.com/stashed/mongodb/commit/21242246) Prepare for release 4.2.3-v34 (#2231) +- [153a446f](https://github.com/stashed/mongodb/commit/153a446f) Use debian:12 base image (#2205) (#2216) + + +### [4.4.6-v25](https://github.com/stashed/mongodb/releases/tag/4.4.6-v25) + +- [5e514650](https://github.com/stashed/mongodb/commit/5e514650) Prepare for release 4.4.6-v25 (#2232) +- [b37818d5](https://github.com/stashed/mongodb/commit/b37818d5) Use debian:12 base image (#2205) (#2217) + + +### [5.0.3-v22](https://github.com/stashed/mongodb/releases/tag/5.0.3-v22) + +- [537a6863](https://github.com/stashed/mongodb/commit/537a6863) Prepare for release 5.0.3-v22 (#2234) +- [26f41d15](https://github.com/stashed/mongodb/commit/26f41d15) Use debian:12 base image (#2205) (#2219) + + +### [5.0.15-v7](https://github.com/stashed/mongodb/releases/tag/5.0.15-v7) + +- [d80984a1](https://github.com/stashed/mongodb/commit/d80984a1) Prepare for release 5.0.15-v7 (#2233) +- [476f673d](https://github.com/stashed/mongodb/commit/476f673d) Use debian:12 base image (#2205) (#2218) + + +### [6.0.5-v10](https://github.com/stashed/mongodb/releases/tag/6.0.5-v10) + +- [bb7a2e10](https://github.com/stashed/mongodb/commit/bb7a2e10) Prepare for release 6.0.5-v10 (#2235) +- [85edc0ff](https://github.com/stashed/mongodb/commit/85edc0ff) Use debian:12 base image (#2205) (#2220) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v34](https://github.com/stashed/mysql/releases/tag/5.7.25-v34) + +- [58817a8a](https://github.com/stashed/mysql/commit/58817a8a) Prepare for release 5.7.25-v33 (#807) +- [d66c5633](https://github.com/stashed/mysql/commit/d66c5633) [cherry-pick] Add support for providing multiple dump args (#802) (#803) + + +### [8.0.3-v33](https://github.com/stashed/mysql/releases/tag/8.0.3-v33) + +- [683a19f1](https://github.com/stashed/mysql/commit/683a19f1) Prepare for release 8.0.3-v33 (#810) +- [07d774a0](https://github.com/stashed/mysql/commit/07d774a0) [cherry-pick] Add support for providing multiple dump args (#802) (#806) +- [cc9420a7](https://github.com/stashed/mysql/commit/cc9420a7) [cherry-pick] Use debian:12 base image (#796) (#800) +- [7533b851](https://github.com/stashed/mysql/commit/7533b851) Remove docker registry support (#795) + + +### [8.0.14-v33](https://github.com/stashed/mysql/releases/tag/8.0.14-v33) + +- [c600101a](https://github.com/stashed/mysql/commit/c600101a) Prepare for release 8.0.14-v33 (#808) +- [6ad5f067](https://github.com/stashed/mysql/commit/6ad5f067) [cherry-pick] Add support for providing multiple dump args (#802) (#804) +- [4519bfaa](https://github.com/stashed/mysql/commit/4519bfaa) [cherry-pick] Use debian:12 base image (#796) (#798) +- [240674b5](https://github.com/stashed/mysql/commit/240674b5) Remove docker registry support (#793) + + +### [8.0.21-v27](https://github.com/stashed/mysql/releases/tag/8.0.21-v27) + +- [d86ac5d7](https://github.com/stashed/mysql/commit/d86ac5d7) Prepare for release 8.0.21-v27 (#809) +- [5bbf3746](https://github.com/stashed/mysql/commit/5bbf3746) [cherry-pick] Add support for providing multiple dump args (#802) (#805) +- [321d4b46](https://github.com/stashed/mysql/commit/321d4b46) [cherry-pick] Use debian:12 base image (#796) (#799) +- [a1c214b1](https://github.com/stashed/mysql/commit/a1c214b1) Remove docker registry support (#794) + + + +## [stashed/nats](https://github.com/stashed/nats) + +### [2.6.1-v21](https://github.com/stashed/nats/releases/tag/2.6.1-v21) + +- [434cc9a](https://github.com/stashed/nats/commit/434cc9a) Prepare for release 2.6.1-v21 (#160) +- [c905550](https://github.com/stashed/nats/commit/c905550) Use debian:12 base image (#157) (#158) +- [157dde7](https://github.com/stashed/nats/commit/157dde7) Use debian:12 base image (#154) (#155) + + +### [2.8.2-v16](https://github.com/stashed/nats/releases/tag/2.8.2-v16) + +- [dae9f36](https://github.com/stashed/nats/commit/dae9f36) Prepare for release 2.8.2-v16 (#161) +- [0cbaec7](https://github.com/stashed/nats/commit/0cbaec7) [cherry-pick] Use debian:12 base image (#157) (#159) +- [0530b04](https://github.com/stashed/nats/commit/0530b04) [cherry-pick] Use debian:12 base image (#154) (#156) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-v28](https://github.com/stashed/percona-xtradb/releases/tag/5.7-v28) + +- [a27e9057](https://github.com/stashed/percona-xtradb/commit/a27e9057) Prepare for release 5.7-v28 (#329) +- [b1ed0e79](https://github.com/stashed/percona-xtradb/commit/b1ed0e79) Use debian:12 base image (#327) (#328) +- [f09b7459](https://github.com/stashed/percona-xtradb/commit/f09b7459) [cherry-pick] Use debian:12 base image (#325) (#326) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v32](https://github.com/stashed/postgres/releases/tag/9.6.19-v32) + +- [3bae251e](https://github.com/stashed/postgres/commit/3bae251e) Prepare for release 9.6.19-v32 (#1373) +- [c555e6b8](https://github.com/stashed/postgres/commit/c555e6b8) Use debian:12 base image (#1356) (#1364) +- [5605ba9c](https://github.com/stashed/postgres/commit/5605ba9c) Fix ci (#1355) +- [4bb344d5](https://github.com/stashed/postgres/commit/4bb344d5) Remove docker registry (#1347) + + +### [10.14-v32](https://github.com/stashed/postgres/releases/tag/10.14-v32) + +- [aa4657a6](https://github.com/stashed/postgres/commit/aa4657a6) Prepare for release 10.14-v32 (#1366) +- [9bbd920b](https://github.com/stashed/postgres/commit/9bbd920b) Use debian:12 base image (#1356) (#1357) +- [3b30ab34](https://github.com/stashed/postgres/commit/3b30ab34) Fix ci (#1348) +- [7f5e6613](https://github.com/stashed/postgres/commit/7f5e6613) Remove docker registry (#1340) + + +### [11.9-v32](https://github.com/stashed/postgres/releases/tag/11.9-v32) + +- [431f2f10](https://github.com/stashed/postgres/commit/431f2f10) Prepare for release 11.9-v32 (#1367) +- [8af85dc1](https://github.com/stashed/postgres/commit/8af85dc1) Use debian:12 base image (#1356) (#1358) +- [0d2a64fd](https://github.com/stashed/postgres/commit/0d2a64fd) Fix ci (#1349) +- [1c5830ee](https://github.com/stashed/postgres/commit/1c5830ee) Remove docker registry (#1341) + + +### [12.4-v32](https://github.com/stashed/postgres/releases/tag/12.4-v32) + +- [529981a3](https://github.com/stashed/postgres/commit/529981a3) Prepare for release 12.4-v32 (#1368) +- [f7e4e660](https://github.com/stashed/postgres/commit/f7e4e660) Use debian:12 base image (#1356) (#1359) +- [557c5946](https://github.com/stashed/postgres/commit/557c5946) Fix ci (#1350) +- [90f32a1f](https://github.com/stashed/postgres/commit/90f32a1f) Remove docker registry (#1342) + + +### [13.1-v29](https://github.com/stashed/postgres/releases/tag/13.1-v29) + +- [998cba50](https://github.com/stashed/postgres/commit/998cba50) Prepare for release 13.1-v29 (#1369) +- [1a52d04b](https://github.com/stashed/postgres/commit/1a52d04b) Use debian:12 base image (#1356) (#1360) +- [f32c0a37](https://github.com/stashed/postgres/commit/f32c0a37) Fix ci (#1351) +- [5fa262a2](https://github.com/stashed/postgres/commit/5fa262a2) Remove docker registry (#1343) + + +### [14.0-v21](https://github.com/stashed/postgres/releases/tag/14.0-v21) + +- [aaaebf71](https://github.com/stashed/postgres/commit/aaaebf71) Prepare for release 14.0-v21 (#1370) +- [98335c4a](https://github.com/stashed/postgres/commit/98335c4a) Use debian:12 base image (#1356) (#1361) +- [105f7907](https://github.com/stashed/postgres/commit/105f7907) Fix ci (#1352) +- [a765c0d9](https://github.com/stashed/postgres/commit/a765c0d9) Remove docker registry (#1344) + + +### [15.1-v13](https://github.com/stashed/postgres/releases/tag/15.1-v13) + +- [c28f4b49](https://github.com/stashed/postgres/commit/c28f4b49) Prepare for release 15.1-v13 (#1371) +- [3cc8aef2](https://github.com/stashed/postgres/commit/3cc8aef2) Use debian:12 base image (#1356) (#1362) +- [246e3a4c](https://github.com/stashed/postgres/commit/246e3a4c) Fix ci (#1353) +- [dda4a557](https://github.com/stashed/postgres/commit/dda4a557) Remove docker registry (#1345) + + +### [16.1-v2](https://github.com/stashed/postgres/releases/tag/16.1-v2) + +- [b78b6322](https://github.com/stashed/postgres/commit/b78b6322) Prepare for release 16.1-v2 (#1372) +- [8352a9b3](https://github.com/stashed/postgres/commit/8352a9b3) Use debian:12 base image (#1356) (#1363) +- [b07338b7](https://github.com/stashed/postgres/commit/b07338b7) Fix ci (#1354) +- [3b2ec15c](https://github.com/stashed/postgres/commit/3b2ec15c) Remove docker registry (#1346) + + +### [17.2](https://github.com/stashed/postgres/releases/tag/17.2) + + + + +## [stashed/redis](https://github.com/stashed/redis) + +### [5.0.13-v21](https://github.com/stashed/redis/releases/tag/5.0.13-v21) + +- [0eb9fce](https://github.com/stashed/redis/commit/0eb9fce) Prepare for release 5.0.13-v21 (#243) +- [5a8f4c0](https://github.com/stashed/redis/commit/5a8f4c0) Use debian:12 base image (#239) (#240) +- [b35422d](https://github.com/stashed/redis/commit/b35422d) Remove docker registry (#236) + + +### [6.2.5-v21](https://github.com/stashed/redis/releases/tag/6.2.5-v21) + +- [8cadd6c](https://github.com/stashed/redis/commit/8cadd6c) Prepare for release 6.2.5-v21 (#244) +- [e4c7393](https://github.com/stashed/redis/commit/e4c7393) Use debian:12 base image (#239) (#241) +- [b4aa39f](https://github.com/stashed/redis/commit/b4aa39f) Remove docker registry (#237) + + +### [7.0.5-v14](https://github.com/stashed/redis/releases/tag/7.0.5-v14) + +- [e3ac0a9](https://github.com/stashed/redis/commit/e3ac0a9) Prepare for release 7.0.5-v14 (#246) +- [09d4fbd](https://github.com/stashed/redis/commit/09d4fbd) Use debian:12 base image (#239) (#242) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.37.0](https://github.com/stashed/stash/releases/tag/v0.37.0) + +- [a4703c42](https://github.com/stashed/stash/commit/a4703c429) Prepare for release v0.37.0 (#1587) +- [771f9c2a](https://github.com/stashed/stash/commit/771f9c2a0) Use kind v0.25.0 (#1585) +- [6692288a](https://github.com/stashed/stash/commit/6692288a3) Use debian:12 base image (#1584) +- [018ff2f7](https://github.com/stashed/stash/commit/018ff2f7f) Use debian:12 base image (#1582) + + + +## [stashed/ui-server](https://github.com/stashed/ui-server) + +### [v0.18.0](https://github.com/stashed/ui-server/releases/tag/v0.18.0) + +- [c9376e31](https://github.com/stashed/ui-server/commit/c9376e31) Prepare for release v0.18.0 (#44) +- [7f38e876](https://github.com/stashed/ui-server/commit/7f38e876) Use debian:12 base image (#43) + + + +## [stashed/vault](https://github.com/stashed/vault) + +### [1.10.3-v13](https://github.com/stashed/vault/releases/tag/1.10.3-v13) + +- [49099011](https://github.com/stashed/vault/commit/49099011) Prepare for release 1.10.3-v13 (#47) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2024.2.13.md b/content/docs/v2024.12.18/CHANGELOG-v2024.2.13.md new file mode 100644 index 0000000000..58bd4cebf5 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2024.2.13.md @@ -0,0 +1,442 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2024.2.13 + name: Changelog-v2024.2.13 + parent: welcome + weight: 20240213 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2024.2.13/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2024.2.13/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2024.2.13 (2024-02-14) + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.33.0](https://github.com/stashed/apimachinery/releases/tag/v0.33.0) + +- [8624cbcb](https://github.com/stashed/apimachinery/commit/8624cbcb) Update deps +- [999853f0](https://github.com/stashed/apimachinery/commit/999853f0) Fix flags +- [a7373104](https://github.com/stashed/apimachinery/commit/a7373104) Update deps +- [152e1d41](https://github.com/stashed/apimachinery/commit/152e1d41) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#219) +- [c604da62](https://github.com/stashed/apimachinery/commit/c604da62) Upsert task params (#218) +- [a91ab94b](https://github.com/stashed/apimachinery/commit/a91ab94b) Update lint command (#217) +- [ef308633](https://github.com/stashed/apimachinery/commit/ef308633) Fix linter +- [6f5a8df2](https://github.com/stashed/apimachinery/commit/6f5a8df2) Use k8s 1.29 client libs (#215) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.33.0](https://github.com/stashed/cli/releases/tag/v0.33.0) + +- [2330558e](https://github.com/stashed/cli/commit/2330558e) Prepare for release v0.33.0 (#195) +- [e9ef1060](https://github.com/stashed/cli/commit/e9ef1060) Prepare for release v0.33.0-rc.0 (#194) +- [6bfaa69b](https://github.com/stashed/cli/commit/6bfaa69b) Update deps (#193) +- [2fa9872b](https://github.com/stashed/cli/commit/2fa9872b) Use k8s 1.29 client libs (#192) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v30](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v30) + +- [0f3a558d](https://github.com/stashed/elasticsearch/commit/0f3a558d) Prepare for release 5.6.4-v30 (#1498) + + +### [6.2.4-v30](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v30) + +- [0380f47c](https://github.com/stashed/elasticsearch/commit/0380f47c) Prepare for release 6.2.4-v30 (#1499) + + +### [6.3.0-v30](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v30) + +- [92104224](https://github.com/stashed/elasticsearch/commit/92104224) Prepare for release 6.3.0-v30 (#1500) + + +### [6.4.0-v30](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v30) + +- [6d8db1c3](https://github.com/stashed/elasticsearch/commit/6d8db1c3) Prepare for release 6.4.0-v30 (#1501) + + +### [6.5.3-v30](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v30) + +- [967b0d5d](https://github.com/stashed/elasticsearch/commit/967b0d5d) Prepare for release 6.5.3-v30 (#1502) + + +### [6.8.0-v30](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v30) + +- [b888ee9a](https://github.com/stashed/elasticsearch/commit/b888ee9a) Prepare for release 6.8.0-v30 (#1503) + + +### [7.2.0-v30](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v30) + +- [b341edf1](https://github.com/stashed/elasticsearch/commit/b341edf1) Prepare for release 7.2.0-v30 (#1505) + + +### [7.3.2-v30](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v30) + +- [fe59875e](https://github.com/stashed/elasticsearch/commit/fe59875e) Prepare for release 7.3.2-v30 (#1506) + + +### [7.14.0-v16](https://github.com/stashed/elasticsearch/releases/tag/7.14.0-v16) + +- [f1b23a52](https://github.com/stashed/elasticsearch/commit/f1b23a52) Prepare for release 7.14.0-v16 (#1504) + + +### [8.2.0-v13](https://github.com/stashed/elasticsearch/releases/tag/8.2.0-v13) + +- [99781148](https://github.com/stashed/elasticsearch/commit/99781148) Prepare for release 8.2.0-v13 (#1507) + + + +## [stashed/enterprise](https://github.com/stashed/enterprise) + +### [v0.33.0](https://github.com/stashed/enterprise/releases/tag/v0.33.0) + +- [056fe40e](https://github.com/stashed/enterprise/commit/056fe40ea) Prepare for release v0.33.0 (#249) +- [d00e48c4](https://github.com/stashed/enterprise/commit/d00e48c4c) Resolve Empty String Bug Across Different Storage Providers Excluding S3 (#248) +- [926b5487](https://github.com/stashed/enterprise/commit/926b54873) Prepare for release v0.33.0-rc.0 (#247) +- [728318a7](https://github.com/stashed/enterprise/commit/728318a76) Use external-snapshotter v7 +- [e187755d](https://github.com/stashed/enterprise/commit/e187755d7) Update deps (#246) +- [b0ca48ec](https://github.com/stashed/enterprise/commit/b0ca48ecc) Add disabling TLS Certificate Verification support for Secure `S3` Storage (#245) +- [8a257274](https://github.com/stashed/enterprise/commit/8a2572742) Add kibana dashboard backup and restore support (#244) +- [0d77a340](https://github.com/stashed/enterprise/commit/0d77a3401) Fix eas +- [af352f7e](https://github.com/stashed/enterprise/commit/af352f7e2) Update gendocs script +- [cc95c59e](https://github.com/stashed/enterprise/commit/cc95c59ed) Configure openapi v3 +- [4fbde18f](https://github.com/stashed/enterprise/commit/4fbde18f1) Use k8s 1.29 client libs (#242) +- [cd3342c0](https://github.com/stashed/enterprise/commit/cd3342c04) Send audit events hourly +- [272590c6](https://github.com/stashed/enterprise/commit/272590c64) Update InterimVolume storage request calculator function name (#241) + + + +## [stashed/etcd](https://github.com/stashed/etcd) + +### [3.5.0-v17](https://github.com/stashed/etcd/releases/tag/3.5.0-v17) + +- [e1609a4](https://github.com/stashed/etcd/commit/e1609a4) Prepare for release 3.5.0-v17 (#89) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2024.2.13](https://github.com/stashed/installer/releases/tag/v2024.2.13) + +- [2b363d9f](https://github.com/stashed/installer/commit/2b363d9f) Prepare for release v2024.2.13 (#329) +- [56bd5380](https://github.com/stashed/installer/commit/56bd5380) Prepare for release v2024.2.9-rc.0 (#328) +- [20c7b9a2](https://github.com/stashed/installer/commit/20c7b9a2) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#326) +- [c66f9803](https://github.com/stashed/installer/commit/c66f9803) Add dashboard backup and restore support (#325) +- [f6f31321](https://github.com/stashed/installer/commit/f6f31321) Use k8s 1.29 client libs (#324) +- [722af4d3](https://github.com/stashed/installer/commit/722af4d3) Check for image existence (#323) +- [4ed53d44](https://github.com/stashed/installer/commit/4ed53d44) Update deps + + + +## [stashed/kubedump](https://github.com/stashed/kubedump) + +### [0.1.0-v13](https://github.com/stashed/kubedump/releases/tag/0.1.0-v13) + +- [f60b817](https://github.com/stashed/kubedump/commit/f60b817) Prepare for release 0.1.0-v13 (#57) + + + +## [stashed/mariadb](https://github.com/stashed/mariadb) + +### [10.5.8-v24](https://github.com/stashed/mariadb/releases/tag/10.5.8-v24) + +- [caae4d31](https://github.com/stashed/mariadb/commit/caae4d31) Prepare for release 10.5.8-v24 (#240) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v30](https://github.com/stashed/mongodb/releases/tag/3.4.17-v30) + +- [5081c341](https://github.com/stashed/mongodb/commit/5081c341) Prepare for release 3.4.17-v30 (#2080) + + +### [3.4.22-v30](https://github.com/stashed/mongodb/releases/tag/3.4.22-v30) + +- [f6207dac](https://github.com/stashed/mongodb/commit/f6207dac) Prepare for release 3.4.22-v30 (#2081) + + +### [3.6.8-v30](https://github.com/stashed/mongodb/releases/tag/3.6.8-v30) + +- [2387f378](https://github.com/stashed/mongodb/commit/2387f378) Prepare for release 3.6.8-v30 (#2083) + + +### [3.6.13-v30](https://github.com/stashed/mongodb/releases/tag/3.6.13-v30) + +- [61271bff](https://github.com/stashed/mongodb/commit/61271bff) Prepare for release 3.6.13-v30 (#2082) + + +### [4.0.3-v30](https://github.com/stashed/mongodb/releases/tag/4.0.3-v30) + +- [f326d30a](https://github.com/stashed/mongodb/commit/f326d30a) Prepare for release 4.0.3-v30 (#2085) + + +### [4.0.5-v30](https://github.com/stashed/mongodb/releases/tag/4.0.5-v30) + +- [7e96bbf7](https://github.com/stashed/mongodb/commit/7e96bbf7) Prepare for release 4.0.5-v30 (#2086) + + +### [4.0.11-v30](https://github.com/stashed/mongodb/releases/tag/4.0.11-v30) + +- [44da1d6f](https://github.com/stashed/mongodb/commit/44da1d6f) Prepare for release 4.0.11-v30 (#2084) + + +### [4.1.4-v30](https://github.com/stashed/mongodb/releases/tag/4.1.4-v30) + +- [2356a00a](https://github.com/stashed/mongodb/commit/2356a00a) Prepare for release 4.1.4-v30 (#2088) + + +### [4.1.7-v30](https://github.com/stashed/mongodb/releases/tag/4.1.7-v30) + +- [bdaaef1d](https://github.com/stashed/mongodb/commit/bdaaef1d) Prepare for release 4.1.7-v30 (#2089) + + +### [4.1.13-v30](https://github.com/stashed/mongodb/releases/tag/4.1.13-v30) + +- [5469bb49](https://github.com/stashed/mongodb/commit/5469bb49) Prepare for release 4.1.13-v30 (#2087) + + +### [4.2.3-v30](https://github.com/stashed/mongodb/releases/tag/4.2.3-v30) + +- [2bc8be8a](https://github.com/stashed/mongodb/commit/2bc8be8a) Prepare for release 4.2.3-v30 (#2090) + + +### [4.4.6-v21](https://github.com/stashed/mongodb/releases/tag/4.4.6-v21) + +- [809c73d8](https://github.com/stashed/mongodb/commit/809c73d8) Prepare for release 4.4.6-v21 (#2091) + + +### [5.0.3-v18](https://github.com/stashed/mongodb/releases/tag/5.0.3-v18) + +- [8de25714](https://github.com/stashed/mongodb/commit/8de25714) Prepare for release 5.0.3-v18 (#2093) + + +### [5.0.15-v3](https://github.com/stashed/mongodb/releases/tag/5.0.15-v3) + +- [bee01d90](https://github.com/stashed/mongodb/commit/bee01d90) Prepare for release 5.0.15-v3 (#2092) + + +### [6.0.5-v6](https://github.com/stashed/mongodb/releases/tag/6.0.5-v6) + +- [fae938ce](https://github.com/stashed/mongodb/commit/fae938ce) Prepare for release 6.0.5-v6 (#2094) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v30](https://github.com/stashed/mysql/releases/tag/5.7.25-v30) + +- [b3aa034b](https://github.com/stashed/mysql/commit/b3aa034b) Prepare for release 5.7.25-v30 (#756) + + +### [8.0.3-v30](https://github.com/stashed/mysql/releases/tag/8.0.3-v30) + +- [81c6d225](https://github.com/stashed/mysql/commit/81c6d225) Prepare for release 8.0.3-v30 (#759) + + +### [8.0.14-v30](https://github.com/stashed/mysql/releases/tag/8.0.14-v30) + +- [d63e3687](https://github.com/stashed/mysql/commit/d63e3687) Prepare for release 8.0.14-v30 (#757) + + +### [8.0.21-v24](https://github.com/stashed/mysql/releases/tag/8.0.21-v24) + +- [e3cf2123](https://github.com/stashed/mysql/commit/e3cf2123) Prepare for release 8.0.21-v24 (#758) + + + +## [stashed/nats](https://github.com/stashed/nats) + +### [2.6.1-v18](https://github.com/stashed/nats/releases/tag/2.6.1-v18) + +- [f0bc785](https://github.com/stashed/nats/commit/f0bc785) Prepare for release 2.6.1-v18 (#132) + + +### [2.8.2-v13](https://github.com/stashed/nats/releases/tag/2.8.2-v13) + +- [9e86ae7](https://github.com/stashed/nats/commit/9e86ae7) Prepare for release 2.8.2-v13 (#133) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-v25](https://github.com/stashed/percona-xtradb/releases/tag/5.7-v25) + +- [2890ead5](https://github.com/stashed/percona-xtradb/commit/2890ead5) Prepare for release 5.7-v25 (#312) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v29](https://github.com/stashed/postgres/releases/tag/9.6.19-v29) + +- [c52291e5](https://github.com/stashed/postgres/commit/c52291e5) Prepare for release 9.6.19-v29 (#1272) + + +### [10.14-v29](https://github.com/stashed/postgres/releases/tag/10.14-v29) + +- [80a3c18f](https://github.com/stashed/postgres/commit/80a3c18f) Prepare for release 10.14-v29 (#1266) + + +### [11.9-v29](https://github.com/stashed/postgres/releases/tag/11.9-v29) + +- [8df3672a](https://github.com/stashed/postgres/commit/8df3672a) Prepare for release 11.9-v29 (#1267) + + +### [12.4-v29](https://github.com/stashed/postgres/releases/tag/12.4-v29) + +- [67373668](https://github.com/stashed/postgres/commit/67373668) Prepare for release 12.4-v29 (#1268) + + +### [13.1-v26](https://github.com/stashed/postgres/releases/tag/13.1-v26) + +- [b058e4fc](https://github.com/stashed/postgres/commit/b058e4fc) Prepare for release 13.1-v26 (#1269) + + +### [14.0-v18](https://github.com/stashed/postgres/releases/tag/14.0-v18) + +- [e4d8de36](https://github.com/stashed/postgres/commit/e4d8de36) Prepare for release 14.0-v18 (#1270) + + +### [15.1-v10](https://github.com/stashed/postgres/releases/tag/15.1-v10) + +- [e1f30a46](https://github.com/stashed/postgres/commit/e1f30a46) Prepare for release 15.1-v10 (#1271) + + + +## [stashed/redis](https://github.com/stashed/redis) + +### [5.0.13-v18](https://github.com/stashed/redis/releases/tag/5.0.13-v18) + +- [aa46891](https://github.com/stashed/redis/commit/aa46891) Prepare for release 5.0.13-v18 (#212) + + +### [6.2.5-v18](https://github.com/stashed/redis/releases/tag/6.2.5-v18) + +- [96a6d0f](https://github.com/stashed/redis/commit/96a6d0f) Prepare for release 6.2.5-v18 (#213) + + +### [7.0.5-v11](https://github.com/stashed/redis/releases/tag/7.0.5-v11) + +- [9902062](https://github.com/stashed/redis/commit/9902062) Prepare for release 7.0.5-v11 (#214) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.33.0](https://github.com/stashed/stash/releases/tag/v0.33.0) + +- [8f76d737](https://github.com/stashed/stash/commit/8f76d7376) Prepare for release v0.33.0 (#1558) +- [b0ecb486](https://github.com/stashed/stash/commit/b0ecb486c) Resolve Empty String Bug Across Different Storage Providers Excluding `S3` (#1557) +- [8cb8f6f6](https://github.com/stashed/stash/commit/8cb8f6f6d) Fix webhook server +- [4bd38bd4](https://github.com/stashed/stash/commit/4bd38bd45) Prepare for release v0.33.0-rc.0 (#1556) +- [2d785965](https://github.com/stashed/stash/commit/2d7859658) Use external-snapshotter/v7 +- [c221c378](https://github.com/stashed/stash/commit/c221c3789) Update deps (#1555) +- [8fa0835d](https://github.com/stashed/stash/commit/8fa0835de) Add disabling TLS Certificate Verification support for Secure S3 Storage (#1554) +- [6d5ad36a](https://github.com/stashed/stash/commit/6d5ad36a8) Fix eas +- [dc70cedd](https://github.com/stashed/stash/commit/dc70cedd9) Update gendocs script +- [86fb04f8](https://github.com/stashed/stash/commit/86fb04f87) Configure openapi v3 (#1551) +- [2b252fac](https://github.com/stashed/stash/commit/2b252fac5) Use k8s 1.29 client libs (#1550) +- [620a6236](https://github.com/stashed/stash/commit/620a6236b) Use k8s 1.29 client libs (#1547) +- [01bdb47d](https://github.com/stashed/stash/commit/01bdb47d4) Send audit events hourly + + + +## [stashed/ui-server](https://github.com/stashed/ui-server) + +### [v0.14.0](https://github.com/stashed/ui-server/releases/tag/v0.14.0) + +- [9e9d2512](https://github.com/stashed/ui-server/commit/9e9d2512) Prepare for release v0.14.0 (#36) +- [2473d4b9](https://github.com/stashed/ui-server/commit/2473d4b9) Configure openapi v3 (#35) +- [4622b7bd](https://github.com/stashed/ui-server/commit/4622b7bd) Prepare for release v0.14.0-rc.0 (#34) +- [0ad06c75](https://github.com/stashed/ui-server/commit/0ad06c75) Update deps (#33) +- [e44a14af](https://github.com/stashed/ui-server/commit/e44a14af) Use k8s 1.29 client libs (#32) + + + +## [stashed/vault](https://github.com/stashed/vault) + +### [1.10.3-v10](https://github.com/stashed/vault/releases/tag/1.10.3-v10) + +- [53f85d89](https://github.com/stashed/vault/commit/53f85d89) Prepare for release 1.10.3-v10 (#33) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2024.2.9-rc.0.md b/content/docs/v2024.12.18/CHANGELOG-v2024.2.9-rc.0.md new file mode 100644 index 0000000000..b94eaac3ce --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2024.2.9-rc.0.md @@ -0,0 +1,576 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2024.2.9-rc.0 + name: Changelog-v2024.2.9-rc.0 + parent: welcome + weight: 20240209 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2024.2.9-rc.0/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2024.2.9-rc.0/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2024.2.9-rc.0 (2024-02-10) + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.33.0-rc.0](https://github.com/stashed/apimachinery/releases/tag/v0.33.0-rc.0) + +- [a7373104](https://github.com/stashed/apimachinery/commit/a7373104) Update deps +- [152e1d41](https://github.com/stashed/apimachinery/commit/152e1d41) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#219) +- [c604da62](https://github.com/stashed/apimachinery/commit/c604da62) Upsert task params (#218) +- [a91ab94b](https://github.com/stashed/apimachinery/commit/a91ab94b) Update lint command (#217) +- [ef308633](https://github.com/stashed/apimachinery/commit/ef308633) Fix linter +- [6f5a8df2](https://github.com/stashed/apimachinery/commit/6f5a8df2) Use k8s 1.29 client libs (#215) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.33.0-rc.0](https://github.com/stashed/cli/releases/tag/v0.33.0-rc.0) + +- [e9ef1060](https://github.com/stashed/cli/commit/e9ef1060) Prepare for release v0.33.0-rc.0 (#194) +- [6bfaa69b](https://github.com/stashed/cli/commit/6bfaa69b) Update deps (#193) +- [2fa9872b](https://github.com/stashed/cli/commit/2fa9872b) Use k8s 1.29 client libs (#192) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v29](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v29) + +- [ff4072db](https://github.com/stashed/elasticsearch/commit/ff4072db) Prepare for release 5.6.4-v29 (#1487) +- [401a46bd](https://github.com/stashed/elasticsearch/commit/401a46bd) [cherry-pick] Update deps (#1476) (#1477) +- [df5b3426](https://github.com/stashed/elasticsearch/commit/df5b3426) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#1462) (#1466) +- [ac3e9b95](https://github.com/stashed/elasticsearch/commit/ac3e9b95) [cherry-pick] Use k8s 1.29 client libs (#1447) (#1448) + + +### [6.2.4-v29](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v29) + +- [29e0e68b](https://github.com/stashed/elasticsearch/commit/29e0e68b) Prepare for release 6.2.4-v29 (#1488) +- [3cac9319](https://github.com/stashed/elasticsearch/commit/3cac9319) [cherry-pick] Update deps (#1476) (#1478) +- [0ca14e64](https://github.com/stashed/elasticsearch/commit/0ca14e64) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#1462) (#1467) +- [c625ef36](https://github.com/stashed/elasticsearch/commit/c625ef36) [cherry-pick] Use k8s 1.29 client libs (#1447) (#1449) + + +### [6.3.0-v29](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v29) + +- [3030fac0](https://github.com/stashed/elasticsearch/commit/3030fac0) Prepare for release 6.3.0-v29 (#1489) +- [7ab46bb8](https://github.com/stashed/elasticsearch/commit/7ab46bb8) [cherry-pick] Update deps (#1476) (#1479) +- [e6837aaf](https://github.com/stashed/elasticsearch/commit/e6837aaf) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#1462) (#1468) +- [f8b13f4e](https://github.com/stashed/elasticsearch/commit/f8b13f4e) [cherry-pick] Use k8s 1.29 client libs (#1447) (#1450) + + +### [6.4.0-v29](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v29) + +- [b4ecccae](https://github.com/stashed/elasticsearch/commit/b4ecccae) Prepare for release 6.4.0-v29 (#1490) +- [ded2a668](https://github.com/stashed/elasticsearch/commit/ded2a668) [cherry-pick] Update deps (#1476) (#1480) +- [3a25ece0](https://github.com/stashed/elasticsearch/commit/3a25ece0) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#1462) (#1469) +- [9bc0fadf](https://github.com/stashed/elasticsearch/commit/9bc0fadf) [cherry-pick] Use k8s 1.29 client libs (#1447) (#1451) + + +### [6.5.3-v29](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v29) + +- [bdcaa0e7](https://github.com/stashed/elasticsearch/commit/bdcaa0e7) Prepare for release 6.5.3-v29 (#1491) +- [e699231e](https://github.com/stashed/elasticsearch/commit/e699231e) [cherry-pick] Update deps (#1476) (#1481) +- [9cf2d65c](https://github.com/stashed/elasticsearch/commit/9cf2d65c) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#1462) (#1470) +- [f69899fd](https://github.com/stashed/elasticsearch/commit/f69899fd) [cherry-pick] Use k8s 1.29 client libs (#1447) (#1452) + + +### [6.8.0-v29](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v29) + +- [44c54065](https://github.com/stashed/elasticsearch/commit/44c54065) Prepare for release 6.8.0-v29 (#1492) +- [b9a96d34](https://github.com/stashed/elasticsearch/commit/b9a96d34) [cherry-pick] Update deps (#1476) (#1482) +- [a2b29367](https://github.com/stashed/elasticsearch/commit/a2b29367) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#1462) (#1471) +- [39aa61a8](https://github.com/stashed/elasticsearch/commit/39aa61a8) [cherry-pick] Use k8s 1.29 client libs (#1447) (#1453) + + +### [7.2.0-v29](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v29) + +- [9c1db06d](https://github.com/stashed/elasticsearch/commit/9c1db06d) Prepare for release 7.2.0-v29 (#1494) +- [bffe38f9](https://github.com/stashed/elasticsearch/commit/bffe38f9) [cherry-pick] Update deps (#1476) (#1484) +- [99242034](https://github.com/stashed/elasticsearch/commit/99242034) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#1462) (#1473) +- [e55ccd73](https://github.com/stashed/elasticsearch/commit/e55ccd73) [cherry-pick] Use k8s 1.29 client libs (#1447) (#1455) + + +### [7.3.2-v29](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v29) + +- [b5ba17b3](https://github.com/stashed/elasticsearch/commit/b5ba17b3) Prepare for release 7.3.2-v29 (#1495) +- [2be8c1c2](https://github.com/stashed/elasticsearch/commit/2be8c1c2) [cherry-pick] Add support Disabling TLS Certificate Verification for Secure S3 Storage (#1462) (#1474) +- [b6b8d77f](https://github.com/stashed/elasticsearch/commit/b6b8d77f) Add support for kibana dashboard spaces (#1464) +- [54e83f21](https://github.com/stashed/elasticsearch/commit/54e83f21) Add Support for ES v7.3.2 dashboard backup and restore (#1461) +- [7a7a90b8](https://github.com/stashed/elasticsearch/commit/7a7a90b8) [cherry-pick] Use k8s 1.29 client libs (#1447) (#1456) + + +### [7.14.0-v15](https://github.com/stashed/elasticsearch/releases/tag/7.14.0-v15) + +- [b1e40261](https://github.com/stashed/elasticsearch/commit/b1e40261) Prepare for release 7.14.0-v15 (#1493) +- [9731068a](https://github.com/stashed/elasticsearch/commit/9731068a) [cherry-pick] Add support Disabling TLS Certificate Verification for Secure S3 Storage (#1462) (#1472) +- [edd0d306](https://github.com/stashed/elasticsearch/commit/edd0d306) Add support for kibana dashboard spaces (#1463) +- [c64c7f07](https://github.com/stashed/elasticsearch/commit/c64c7f07) Add Support for ES v7.14.0 dashboard backup and restore (#1460) +- [635f1ad0](https://github.com/stashed/elasticsearch/commit/635f1ad0) [cherry-pick] Use k8s 1.29 client libs (#1447) (#1454) + + +### [8.2.0-v12](https://github.com/stashed/elasticsearch/releases/tag/8.2.0-v12) + +- [12360a2e](https://github.com/stashed/elasticsearch/commit/12360a2e) Prepare for release 8.2.0-v12 (#1496) +- [ffdfddad](https://github.com/stashed/elasticsearch/commit/ffdfddad) [cherry-pick] Add support Disabling TLS Certificate Verification for Secure S3 Storage (#1462) (#1475) +- [d1d5985d](https://github.com/stashed/elasticsearch/commit/d1d5985d) Add support for kibana dashboard spaces (#1465) +- [24ecc281](https://github.com/stashed/elasticsearch/commit/24ecc281) Add Support for ES v8.2.0 dashboard backup and restore (#1459) +- [feb7c4ad](https://github.com/stashed/elasticsearch/commit/feb7c4ad) [cherry-pick] Use k8s 1.29 client libs (#1447) (#1457) + + + +## [stashed/enterprise](https://github.com/stashed/enterprise) + +### [v0.33.0-rc.0](https://github.com/stashed/enterprise/releases/tag/v0.33.0-rc.0) + +- [926b5487](https://github.com/stashed/enterprise/commit/926b54873) Prepare for release v0.33.0-rc.0 (#247) +- [728318a7](https://github.com/stashed/enterprise/commit/728318a76) Use external-snapshotter v7 +- [e187755d](https://github.com/stashed/enterprise/commit/e187755d7) Update deps (#246) +- [b0ca48ec](https://github.com/stashed/enterprise/commit/b0ca48ecc) Add disabling TLS Certificate Verification support for Secure `S3` Storage (#245) +- [8a257274](https://github.com/stashed/enterprise/commit/8a2572742) Add kibana dashboard backup and restore support (#244) +- [0d77a340](https://github.com/stashed/enterprise/commit/0d77a3401) Fix eas +- [af352f7e](https://github.com/stashed/enterprise/commit/af352f7e2) Update gendocs script +- [cc95c59e](https://github.com/stashed/enterprise/commit/cc95c59ed) Configure openapi v3 +- [4fbde18f](https://github.com/stashed/enterprise/commit/4fbde18f1) Use k8s 1.29 client libs (#242) +- [cd3342c0](https://github.com/stashed/enterprise/commit/cd3342c04) Send audit events hourly +- [272590c6](https://github.com/stashed/enterprise/commit/272590c64) Update InterimVolume storage request calculator function name (#241) + + + +## [stashed/etcd](https://github.com/stashed/etcd) + +### [3.5.0-v16](https://github.com/stashed/etcd/releases/tag/3.5.0-v16) + +- [8915468](https://github.com/stashed/etcd/commit/8915468) Prepare for release 3.5.0-v16 (#87) +- [c55295f](https://github.com/stashed/etcd/commit/c55295f) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#85) (#86) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2024.2.9-rc.0](https://github.com/stashed/installer/releases/tag/v2024.2.9-rc.0) + +- [56bd5380](https://github.com/stashed/installer/commit/56bd5380) Prepare for release v2024.2.9-rc.0 (#328) +- [20c7b9a2](https://github.com/stashed/installer/commit/20c7b9a2) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#326) +- [c66f9803](https://github.com/stashed/installer/commit/c66f9803) Add dashboard backup and restore support (#325) +- [f6f31321](https://github.com/stashed/installer/commit/f6f31321) Use k8s 1.29 client libs (#324) +- [722af4d3](https://github.com/stashed/installer/commit/722af4d3) Check for image existence (#323) +- [4ed53d44](https://github.com/stashed/installer/commit/4ed53d44) Update deps + + + +## [stashed/kubedump](https://github.com/stashed/kubedump) + +### [0.1.0-v12](https://github.com/stashed/kubedump/releases/tag/0.1.0-v12) + +- [c8ea88c](https://github.com/stashed/kubedump/commit/c8ea88c) Prepare for release 0.1.0-v12 (#55) +- [b64c87b](https://github.com/stashed/kubedump/commit/b64c87b) [cherry-pick] Update deps (#53) (#54) +- [7a54044](https://github.com/stashed/kubedump/commit/7a54044) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#51) (#52) +- [527d154](https://github.com/stashed/kubedump/commit/527d154) [cherry-pick] Use k8s 1.29 client libs (#49) (#50) + + + +## [stashed/mariadb](https://github.com/stashed/mariadb) + +### [10.5.8-v23](https://github.com/stashed/mariadb/releases/tag/10.5.8-v23) + +- [92adb079](https://github.com/stashed/mariadb/commit/92adb079) Prepare for release 10.5.8-v23 (#238) +- [146a661b](https://github.com/stashed/mariadb/commit/146a661b) [cherry-pick] Update deps (#236) (#237) +- [6dd82d4e](https://github.com/stashed/mariadb/commit/6dd82d4e) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#234) (#235) +- [805b7e72](https://github.com/stashed/mariadb/commit/805b7e72) [cherry-pick] Use k8s 1.29 client libs (#232) (#233) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v29](https://github.com/stashed/mongodb/releases/tag/3.4.17-v29) + +- [c13af7f2](https://github.com/stashed/mongodb/commit/c13af7f2) Prepare for release 3.4.17-v29 (#2064) +- [212f6698](https://github.com/stashed/mongodb/commit/212f6698) [cherry-pick] Update deps (#2039) (#2049) +- [749f4849](https://github.com/stashed/mongodb/commit/749f4849) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#2017) (#2024) +- [8425019e](https://github.com/stashed/mongodb/commit/8425019e) [cherry-pick] Use k8s 1.29 client libs (#1998) (#2002) + + +### [3.4.22-v29](https://github.com/stashed/mongodb/releases/tag/3.4.22-v29) + +- [9e8f639f](https://github.com/stashed/mongodb/commit/9e8f639f) Prepare for release 3.4.22-v29 (#2065) +- [82403e18](https://github.com/stashed/mongodb/commit/82403e18) [cherry-pick] Update deps (#2039) (#2050) +- [2388cd5c](https://github.com/stashed/mongodb/commit/2388cd5c) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#2017) (#2025) +- [e9aaf4a0](https://github.com/stashed/mongodb/commit/e9aaf4a0) [cherry-pick] Use k8s 1.29 client libs (#1998) (#2003) + + +### [3.6.8-v29](https://github.com/stashed/mongodb/releases/tag/3.6.8-v29) + +- [83bd3ca6](https://github.com/stashed/mongodb/commit/83bd3ca6) Prepare for release 3.6.8-v29 (#2067) +- [a4ac2495](https://github.com/stashed/mongodb/commit/a4ac2495) [cherry-pick] Update deps (#2039) (#2052) +- [b0fcceb6](https://github.com/stashed/mongodb/commit/b0fcceb6) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#2017) (#2027) +- [4183dce4](https://github.com/stashed/mongodb/commit/4183dce4) [cherry-pick] Use k8s 1.29 client libs (#1998) (#2005) + + +### [3.6.13-v29](https://github.com/stashed/mongodb/releases/tag/3.6.13-v29) + +- [d436bac9](https://github.com/stashed/mongodb/commit/d436bac9) Prepare for release 3.6.13-v29 (#2066) +- [0c784ae5](https://github.com/stashed/mongodb/commit/0c784ae5) [cherry-pick] Update deps (#2039) (#2051) +- [b166ba18](https://github.com/stashed/mongodb/commit/b166ba18) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#2017) (#2026) +- [89bf4a8b](https://github.com/stashed/mongodb/commit/89bf4a8b) [cherry-pick] Use k8s 1.29 client libs (#1998) (#2004) + + +### [4.0.3-v29](https://github.com/stashed/mongodb/releases/tag/4.0.3-v29) + +- [1d55691c](https://github.com/stashed/mongodb/commit/1d55691c) Prepare for release 4.0.3-v29 (#2069) +- [3fcfa629](https://github.com/stashed/mongodb/commit/3fcfa629) [cherry-pick] Update deps (#2039) (#2054) +- [a5471f8f](https://github.com/stashed/mongodb/commit/a5471f8f) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#2017) (#2029) +- [e26590ae](https://github.com/stashed/mongodb/commit/e26590ae) [cherry-pick] Use k8s 1.29 client libs (#1998) (#2007) + + +### [4.0.5-v29](https://github.com/stashed/mongodb/releases/tag/4.0.5-v29) + +- [4d047823](https://github.com/stashed/mongodb/commit/4d047823) Prepare for release 4.0.5-v29 (#2070) +- [bd30b43a](https://github.com/stashed/mongodb/commit/bd30b43a) [cherry-pick] Update deps (#2039) (#2055) +- [e6d4e4c8](https://github.com/stashed/mongodb/commit/e6d4e4c8) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#2017) (#2030) +- [b5a80d5e](https://github.com/stashed/mongodb/commit/b5a80d5e) [cherry-pick] Use k8s 1.29 client libs (#1998) (#2008) + + +### [4.0.11-v29](https://github.com/stashed/mongodb/releases/tag/4.0.11-v29) + +- [970d7a65](https://github.com/stashed/mongodb/commit/970d7a65) Prepare for release 4.0.11-v29 (#2068) +- [aa662509](https://github.com/stashed/mongodb/commit/aa662509) [cherry-pick] Update deps (#2039) (#2053) +- [2f79e431](https://github.com/stashed/mongodb/commit/2f79e431) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#2017) (#2028) +- [fc915fda](https://github.com/stashed/mongodb/commit/fc915fda) [cherry-pick] Use k8s 1.29 client libs (#1998) (#2006) + + +### [4.1.4-v29](https://github.com/stashed/mongodb/releases/tag/4.1.4-v29) + +- [84fa06fa](https://github.com/stashed/mongodb/commit/84fa06fa) Prepare for release 4.1.4-v29 (#2072) +- [2941b00e](https://github.com/stashed/mongodb/commit/2941b00e) [cherry-pick] Update deps (#2039) (#2057) +- [c777ebda](https://github.com/stashed/mongodb/commit/c777ebda) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#2017) (#2032) +- [0d95db7f](https://github.com/stashed/mongodb/commit/0d95db7f) [cherry-pick] Use k8s 1.29 client libs (#1998) (#2010) + + +### [4.1.7-v29](https://github.com/stashed/mongodb/releases/tag/4.1.7-v29) + +- [3487b26b](https://github.com/stashed/mongodb/commit/3487b26b) Prepare for release 4.1.7-v29 (#2073) +- [edb5c6fc](https://github.com/stashed/mongodb/commit/edb5c6fc) [cherry-pick] Update deps (#2039) (#2058) +- [48a7bddb](https://github.com/stashed/mongodb/commit/48a7bddb) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#2017) (#2033) +- [88b717dc](https://github.com/stashed/mongodb/commit/88b717dc) [cherry-pick] Use k8s 1.29 client libs (#1998) (#2011) + + +### [4.1.13-v29](https://github.com/stashed/mongodb/releases/tag/4.1.13-v29) + +- [a378670e](https://github.com/stashed/mongodb/commit/a378670e) Prepare for release 4.1.13-v29 (#2071) +- [3322389c](https://github.com/stashed/mongodb/commit/3322389c) [cherry-pick] Update deps (#2039) (#2056) +- [cb6a03ad](https://github.com/stashed/mongodb/commit/cb6a03ad) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#2017) (#2031) +- [f35e6d45](https://github.com/stashed/mongodb/commit/f35e6d45) [cherry-pick] Use k8s 1.29 client libs (#1998) (#2009) + + +### [4.2.3-v29](https://github.com/stashed/mongodb/releases/tag/4.2.3-v29) + +- [b442c846](https://github.com/stashed/mongodb/commit/b442c846) Prepare for release 4.2.3-v29 (#2074) +- [987f365c](https://github.com/stashed/mongodb/commit/987f365c) [cherry-pick] Update deps (#2039) (#2059) +- [c3489059](https://github.com/stashed/mongodb/commit/c3489059) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#2017) (#2034) +- [c22e4250](https://github.com/stashed/mongodb/commit/c22e4250) [cherry-pick] Use k8s 1.29 client libs (#1998) (#2012) + + +### [4.4.6-v20](https://github.com/stashed/mongodb/releases/tag/4.4.6-v20) + +- [dcbd4cba](https://github.com/stashed/mongodb/commit/dcbd4cba) Prepare for release 4.4.6-v20 (#2075) +- [7e68a707](https://github.com/stashed/mongodb/commit/7e68a707) [cherry-pick] Update deps (#2039) (#2060) +- [f4361716](https://github.com/stashed/mongodb/commit/f4361716) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#2017) (#2035) +- [9844fd23](https://github.com/stashed/mongodb/commit/9844fd23) [cherry-pick] Use k8s 1.29 client libs (#1998) (#2013) + + +### [5.0.3-v17](https://github.com/stashed/mongodb/releases/tag/5.0.3-v17) + +- [eed701a8](https://github.com/stashed/mongodb/commit/eed701a8) Prepare for release 5.0.3-v17 (#2077) +- [63e6f8b8](https://github.com/stashed/mongodb/commit/63e6f8b8) [cherry-pick] Update deps (#2039) (#2062) +- [817a5a24](https://github.com/stashed/mongodb/commit/817a5a24) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#2017) (#2037) +- [7c1a1b56](https://github.com/stashed/mongodb/commit/7c1a1b56) [cherry-pick] Use k8s 1.29 client libs (#1998) (#2001) +- [3b98fbfb](https://github.com/stashed/mongodb/commit/3b98fbfb) currentOp command update (#1995) +- [03259fa1](https://github.com/stashed/mongodb/commit/03259fa1) [cherry-pick] Use k8s 1.29 client libs (#1998) (#2015) + + +### [5.0.15-v2](https://github.com/stashed/mongodb/releases/tag/5.0.15-v2) + +- [f9129172](https://github.com/stashed/mongodb/commit/f9129172) Prepare for release 5.0.15-v2 (#2076) +- [51380ede](https://github.com/stashed/mongodb/commit/51380ede) [cherry-pick] Update deps (#2039) (#2061) +- [f371d67f](https://github.com/stashed/mongodb/commit/f371d67f) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#2017) (#2036) +- [14512d91](https://github.com/stashed/mongodb/commit/14512d91) [cherry-pick] Use k8s 1.29 client libs (#1998) (#2000) +- [53a8791c](https://github.com/stashed/mongodb/commit/53a8791c) currentOp command update (#1994) +- [607a859f](https://github.com/stashed/mongodb/commit/607a859f) [cherry-pick] Use k8s 1.29 client libs (#1998) (#2014) + + +### [6.0.5-v5](https://github.com/stashed/mongodb/releases/tag/6.0.5-v5) + +- [959a6454](https://github.com/stashed/mongodb/commit/959a6454) Prepare for release 6.0.5-v5 (#2078) +- [2481466c](https://github.com/stashed/mongodb/commit/2481466c) [cherry-pick] Update deps (#2039) (#2063) +- [603acda9](https://github.com/stashed/mongodb/commit/603acda9) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#2017) (#2038) +- [03362717](https://github.com/stashed/mongodb/commit/03362717) [cherry-pick] Use k8s 1.29 client libs (#1998) (#1999) +- [3c35e5fc](https://github.com/stashed/mongodb/commit/3c35e5fc) Command and tickers updated (#1993) +- [f43fb564](https://github.com/stashed/mongodb/commit/f43fb564) [cherry-pick] Use k8s 1.29 client libs (#1998) (#2016) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v29](https://github.com/stashed/mysql/releases/tag/5.7.25-v29) + +- [281bf6b3](https://github.com/stashed/mysql/commit/281bf6b3) Prepare for release 5.7.25-v29 (#751) +- [72e566db](https://github.com/stashed/mysql/commit/72e566db) [cherry-pick] Update deps (#746) (#747) +- [b531d9ef](https://github.com/stashed/mysql/commit/b531d9ef) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#741) (#742) +- [da312878](https://github.com/stashed/mysql/commit/da312878) [cherry-pick] Use k8s 1.29 client libs (#735) (#737) +- [44c6fe0a](https://github.com/stashed/mysql/commit/44c6fe0a) Don't set all-databases as default for args (#733) + + +### [8.0.3-v29](https://github.com/stashed/mysql/releases/tag/8.0.3-v29) + +- [4379d0d1](https://github.com/stashed/mysql/commit/4379d0d1) Prepare for release 8.0.3-v29 (#754) +- [55b685c1](https://github.com/stashed/mysql/commit/55b685c1) [cherry-pick] Update deps (#746) (#750) +- [8c8860f6](https://github.com/stashed/mysql/commit/8c8860f6) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#741) (#745) +- [ba633e81](https://github.com/stashed/mysql/commit/ba633e81) [cherry-pick] Use k8s 1.29 client libs (#735) (#740) + + +### [8.0.14-v29](https://github.com/stashed/mysql/releases/tag/8.0.14-v29) + +- [b5ec7da8](https://github.com/stashed/mysql/commit/b5ec7da8) Prepare for release 8.0.14-v29 (#752) +- [c7584d82](https://github.com/stashed/mysql/commit/c7584d82) Update deps (#746) (#748) +- [8be31363](https://github.com/stashed/mysql/commit/8be31363) [cherry-pick] Add support Disabling TLS Certificate Verification for Secure S3 Storage (#741) (#743) +- [b976105c](https://github.com/stashed/mysql/commit/b976105c) [cherry-pick] Use k8s 1.29 client libs (#735) (#738) + + +### [8.0.21-v23](https://github.com/stashed/mysql/releases/tag/8.0.21-v23) + +- [81b49dae](https://github.com/stashed/mysql/commit/81b49dae) Prepare for release 8.0.21-v23 (#753) +- [1e6948b0](https://github.com/stashed/mysql/commit/1e6948b0) [cherry-pick] Update deps (#746) (#749) +- [66c5d072](https://github.com/stashed/mysql/commit/66c5d072) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#741) (#744) +- [61c02de7](https://github.com/stashed/mysql/commit/61c02de7) [cherry-pick] Use k8s 1.29 client libs (#735) (#739) + + + +## [stashed/nats](https://github.com/stashed/nats) + +### [2.6.1-v17](https://github.com/stashed/nats/releases/tag/2.6.1-v17) + +- [87fd44c](https://github.com/stashed/nats/commit/87fd44c) Prepare for release 2.6.1-v17 (#129) +- [774bc06](https://github.com/stashed/nats/commit/774bc06) [cherry-pick] Update deps (#126) (#127) +- [8986edb](https://github.com/stashed/nats/commit/8986edb) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#123) (#124) +- [f50f0dc](https://github.com/stashed/nats/commit/f50f0dc) [cherry-pick] Use k8s 1.29 client libs (#120) (#121) + + +### [2.8.2-v12](https://github.com/stashed/nats/releases/tag/2.8.2-v12) + +- [76ae834](https://github.com/stashed/nats/commit/76ae834) Prepare for release 2.8.2-v12 (#130) +- [6428446](https://github.com/stashed/nats/commit/6428446) [cherry-pick] Update deps (#126) (#128) +- [701911e](https://github.com/stashed/nats/commit/701911e) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#123) (#125) +- [39b638b](https://github.com/stashed/nats/commit/39b638b) [cherry-pick] Use k8s 1.29 client libs (#120) (#122) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-v24](https://github.com/stashed/percona-xtradb/releases/tag/5.7-v24) + +- [3b132129](https://github.com/stashed/percona-xtradb/commit/3b132129) Prepare for release 5.7-v24 (#310) +- [162d38f0](https://github.com/stashed/percona-xtradb/commit/162d38f0) [cherry-pick] Update deps (#308) (#309) +- [7df261de](https://github.com/stashed/percona-xtradb/commit/7df261de) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#306) (#307) +- [16812768](https://github.com/stashed/percona-xtradb/commit/16812768) [cherry-pick] Use k8s 1.29 client libs (#304) (#305) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v28](https://github.com/stashed/postgres/releases/tag/9.6.19-v28) + +- [1298dbbe](https://github.com/stashed/postgres/commit/1298dbbe) Prepare for release 9.6.19-v28 (#1264) +- [083bee7c](https://github.com/stashed/postgres/commit/083bee7c) [cherry-pick] Update deps (#1250) (#1257) +- [ee274af0](https://github.com/stashed/postgres/commit/ee274af0) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#1242) (#1249) +- [f9c2bb70](https://github.com/stashed/postgres/commit/f9c2bb70) [cherry-pick] Use k8s 1.29 client libs (#1234) (#1241) + + +### [10.14-v28](https://github.com/stashed/postgres/releases/tag/10.14-v28) + +- [c027e2a2](https://github.com/stashed/postgres/commit/c027e2a2) Prepare for release 10.14-v28 (#1258) +- [d1d89159](https://github.com/stashed/postgres/commit/d1d89159) [cherry-pick] Update deps (#1250) (#1251) +- [55379bf9](https://github.com/stashed/postgres/commit/55379bf9) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#1242) (#1243) +- [5f027026](https://github.com/stashed/postgres/commit/5f027026) [cherry-pick] Use k8s 1.29 client libs (#1234) (#1235) + + +### [11.9-v28](https://github.com/stashed/postgres/releases/tag/11.9-v28) + +- [29d470cc](https://github.com/stashed/postgres/commit/29d470cc) Prepare for release 11.9-v28 (#1259) +- [04aaf44c](https://github.com/stashed/postgres/commit/04aaf44c) [cherry-pick] Update deps (#1250) (#1252) +- [210165b4](https://github.com/stashed/postgres/commit/210165b4) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#1242) (#1244) +- [b232264d](https://github.com/stashed/postgres/commit/b232264d) [cherry-pick] Use k8s 1.29 client libs (#1234) (#1236) + + +### [12.4-v28](https://github.com/stashed/postgres/releases/tag/12.4-v28) + +- [c0667397](https://github.com/stashed/postgres/commit/c0667397) Prepare for release 12.4-v28 (#1260) +- [a3a6b107](https://github.com/stashed/postgres/commit/a3a6b107) [cherry-pick] Update deps (#1250) (#1253) +- [9a35e5d8](https://github.com/stashed/postgres/commit/9a35e5d8) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#1242) (#1245) +- [e12724e1](https://github.com/stashed/postgres/commit/e12724e1) [cherry-pick] Use k8s 1.29 client libs (#1234) (#1237) + + +### [13.1-v25](https://github.com/stashed/postgres/releases/tag/13.1-v25) + +- [e8caeb88](https://github.com/stashed/postgres/commit/e8caeb88) Prepare for release 13.1-v25 (#1261) +- [b5f19962](https://github.com/stashed/postgres/commit/b5f19962) [cherry-pick] Update deps (#1250) (#1254) +- [d0d8f879](https://github.com/stashed/postgres/commit/d0d8f879) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#1242) (#1246) +- [a7ee90fe](https://github.com/stashed/postgres/commit/a7ee90fe) [cherry-pick] Use k8s 1.29 client libs (#1234) (#1238) + + +### [14.0-v17](https://github.com/stashed/postgres/releases/tag/14.0-v17) + +- [d2d8e1e6](https://github.com/stashed/postgres/commit/d2d8e1e6) Prepare for release 14.0-v17 (#1262) +- [a4a2f372](https://github.com/stashed/postgres/commit/a4a2f372) [cherry-pick] Update deps (#1250) (#1255) +- [37bef4c2](https://github.com/stashed/postgres/commit/37bef4c2) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#1242) (#1247) +- [a1e5b9e0](https://github.com/stashed/postgres/commit/a1e5b9e0) [cherry-pick] Use k8s 1.29 client libs (#1234) (#1239) + + +### [15.1-v9](https://github.com/stashed/postgres/releases/tag/15.1-v9) + +- [d7d48fe0](https://github.com/stashed/postgres/commit/d7d48fe0) Prepare for release 15.1-v9 (#1263) +- [a6efcbbc](https://github.com/stashed/postgres/commit/a6efcbbc) [cherry-pick] Update deps (#1250) (#1256) +- [fc400a3b](https://github.com/stashed/postgres/commit/fc400a3b) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#1242) (#1248) +- [449876a7](https://github.com/stashed/postgres/commit/449876a7) [cherry-pick] Use k8s 1.29 client libs (#1234) (#1240) + + + +## [stashed/redis](https://github.com/stashed/redis) + +### [5.0.13-v17](https://github.com/stashed/redis/releases/tag/5.0.13-v17) + +- [ea1ecca](https://github.com/stashed/redis/commit/ea1ecca) Prepare for release 5.0.13-v17 (#208) +- [938a96a](https://github.com/stashed/redis/commit/938a96a) [cherry-pick] Update deps (#204) (#205) +- [4a80c23](https://github.com/stashed/redis/commit/4a80c23) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#200) (#201) +- [33440aa](https://github.com/stashed/redis/commit/33440aa) [cherry-pick] Use k8s 1.29 client libs (#196) (#197) + + +### [6.2.5-v17](https://github.com/stashed/redis/releases/tag/6.2.5-v17) + +- [2770727](https://github.com/stashed/redis/commit/2770727) Prepare for release 6.2.5-v17 (#209) +- [eea6853](https://github.com/stashed/redis/commit/eea6853) [cherry-pick] Update deps (#204) (#206) +- [4ceecb7](https://github.com/stashed/redis/commit/4ceecb7) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#200) (#202) +- [f0d103a](https://github.com/stashed/redis/commit/f0d103a) [cherry-pick] Use k8s 1.29 client libs (#196) (#198) + + +### [7.0.5-v10](https://github.com/stashed/redis/releases/tag/7.0.5-v10) + +- [16a721d](https://github.com/stashed/redis/commit/16a721d) Prepare for release 7.0.5-v10 (#210) +- [bc586b3](https://github.com/stashed/redis/commit/bc586b3) [cherry-pick] Update deps (#204) (#207) +- [ab433e4](https://github.com/stashed/redis/commit/ab433e4) Add support Disabling TLS Certificate Verification for Secure S3 Storage (#200) (#203) +- [596efd3](https://github.com/stashed/redis/commit/596efd3) [cherry-pick] Use k8s 1.29 client libs (#196) (#199) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.33.0-rc.0](https://github.com/stashed/stash/releases/tag/v0.33.0-rc.0) + +- [4bd38bd4](https://github.com/stashed/stash/commit/4bd38bd45) Prepare for release v0.33.0-rc.0 (#1556) +- [2d785965](https://github.com/stashed/stash/commit/2d7859658) Use external-snapshotter/v7 +- [c221c378](https://github.com/stashed/stash/commit/c221c3789) Update deps (#1555) +- [8fa0835d](https://github.com/stashed/stash/commit/8fa0835de) Add disabling TLS Certificate Verification support for Secure S3 Storage (#1554) +- [6d5ad36a](https://github.com/stashed/stash/commit/6d5ad36a8) Fix eas +- [dc70cedd](https://github.com/stashed/stash/commit/dc70cedd9) Update gendocs script +- [86fb04f8](https://github.com/stashed/stash/commit/86fb04f87) Configure openapi v3 (#1551) +- [2b252fac](https://github.com/stashed/stash/commit/2b252fac5) Use k8s 1.29 client libs (#1550) +- [620a6236](https://github.com/stashed/stash/commit/620a6236b) Use k8s 1.29 client libs (#1547) +- [01bdb47d](https://github.com/stashed/stash/commit/01bdb47d4) Send audit events hourly + + + +## [stashed/ui-server](https://github.com/stashed/ui-server) + +### [v0.14.0-rc.0](https://github.com/stashed/ui-server/releases/tag/v0.14.0-rc.0) + +- [4622b7bd](https://github.com/stashed/ui-server/commit/4622b7bd) Prepare for release v0.14.0-rc.0 (#34) +- [0ad06c75](https://github.com/stashed/ui-server/commit/0ad06c75) Update deps (#33) +- [e44a14af](https://github.com/stashed/ui-server/commit/e44a14af) Use k8s 1.29 client libs (#32) + + + +## [stashed/vault](https://github.com/stashed/vault) + +### [1.10.3-v9](https://github.com/stashed/vault/releases/tag/1.10.3-v9) + +- [613e95d1](https://github.com/stashed/vault/commit/613e95d1) Prepare for release 1.10.3-v9 (#31) +- [1a5f95d0](https://github.com/stashed/vault/commit/1a5f95d0) [cherry-pick] Update deps (#29) (#30) +- [a706d835](https://github.com/stashed/vault/commit/a706d835) [cherry-pick] Use k8s 1.29 client libs (#27) (#28) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2024.4.8.md b/content/docs/v2024.12.18/CHANGELOG-v2024.4.8.md new file mode 100644 index 0000000000..da4bbe7ae4 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2024.4.8.md @@ -0,0 +1,500 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2024.4.8 + name: Changelog-v2024.4.8 + parent: welcome + weight: 20240408 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2024.4.8/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2024.4.8/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2024.4.8 (2024-04-09) + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.34.0](https://github.com/stashed/apimachinery/releases/tag/v0.34.0) + +- [be710277](https://github.com/stashed/apimachinery/commit/be710277) Use Go 1.22 (#221) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.34.0](https://github.com/stashed/cli/releases/tag/v0.34.0) + +- [3a2104b6](https://github.com/stashed/cli/commit/3a2104b6) Prepare for release v0.34.0 (#200) +- [97c3c9dc](https://github.com/stashed/cli/commit/97c3c9dc) Use Go 1.22 (#199) +- [57359de6](https://github.com/stashed/cli/commit/57359de6) Use Go 1.22 (#198) +- [cc9996a7](https://github.com/stashed/cli/commit/cc9996a7) Update external snapshotter deps v4 to v7 (#197) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v31](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v31) + +- [9b4eb820](https://github.com/stashed/elasticsearch/commit/9b4eb820) Prepare for release 5.6.4-v31 (#1532) +- [64d18cf3](https://github.com/stashed/elasticsearch/commit/64d18cf3) [cherry-pick] Use Go 1.22 (#1521) (#1522) +- [d1ea4dc7](https://github.com/stashed/elasticsearch/commit/d1ea4dc7) [cherry-pick] Use Go 1.22 (#1510) (#1511) + + +### [6.2.4-v31](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v31) + +- [7c84bbc1](https://github.com/stashed/elasticsearch/commit/7c84bbc1) Prepare for release 6.2.4-v31 (#1533) +- [fed5d9e2](https://github.com/stashed/elasticsearch/commit/fed5d9e2) [cherry-pick] Use Go 1.22 (#1521) (#1523) +- [1f63d8ec](https://github.com/stashed/elasticsearch/commit/1f63d8ec) [cherry-pick] Use Go 1.22 (#1510) (#1512) + + +### [6.3.0-v31](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v31) + +- [c9cdfcd6](https://github.com/stashed/elasticsearch/commit/c9cdfcd6) Prepare for release 6.3.0-v31 (#1534) +- [735faaf2](https://github.com/stashed/elasticsearch/commit/735faaf2) [cherry-pick] Use Go 1.22 (#1521) (#1524) +- [1f3097e6](https://github.com/stashed/elasticsearch/commit/1f3097e6) [cherry-pick] Use Go 1.22 (#1510) (#1513) + + +### [6.4.0-v31](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v31) + +- [6fdc0ea7](https://github.com/stashed/elasticsearch/commit/6fdc0ea7) Prepare for release 6.4.0-v31 (#1535) +- [d4c96d76](https://github.com/stashed/elasticsearch/commit/d4c96d76) [cherry-pick] Use Go 1.22 (#1521) (#1525) +- [2314563b](https://github.com/stashed/elasticsearch/commit/2314563b) [cherry-pick] Use Go 1.22 (#1510) (#1514) + + +### [6.5.3-v31](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v31) + +- [0dc8cd3d](https://github.com/stashed/elasticsearch/commit/0dc8cd3d) Prepare for release 6.5.3-v31 (#1536) +- [9dd6338f](https://github.com/stashed/elasticsearch/commit/9dd6338f) [cherry-pick] Use Go 1.22 (#1521) (#1526) +- [3f9bce22](https://github.com/stashed/elasticsearch/commit/3f9bce22) [cherry-pick] Use Go 1.22 (#1510) (#1515) + + +### [6.8.0-v31](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v31) + +- [1f7abda9](https://github.com/stashed/elasticsearch/commit/1f7abda9) Prepare for release 6.8.0-v31 (#1537) +- [237ace67](https://github.com/stashed/elasticsearch/commit/237ace67) [cherry-pick] Use Go 1.22 (#1521) (#1527) +- [670a073a](https://github.com/stashed/elasticsearch/commit/670a073a) [cherry-pick] Use Go 1.22 (#1510) (#1516) + + +### [7.2.0-v31](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v31) + +- [7a4aeeaa](https://github.com/stashed/elasticsearch/commit/7a4aeeaa) Prepare for release 7.2.0-v31 (#1539) +- [2bcea750](https://github.com/stashed/elasticsearch/commit/2bcea750) [cherry-pick] Use Go 1.22 (#1521) (#1529) +- [ad6db703](https://github.com/stashed/elasticsearch/commit/ad6db703) [cherry-pick] Use Go 1.22 (#1510) (#1518) + + +### [7.3.2-v31](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v31) + +- [e79d7c36](https://github.com/stashed/elasticsearch/commit/e79d7c36) Prepare for release 7.3.2-v31 (#1540) +- [19a2baee](https://github.com/stashed/elasticsearch/commit/19a2baee) Use Go 1.22 (#1510) (#1519) +- [fccdd7ae](https://github.com/stashed/elasticsearch/commit/fccdd7ae) Use Go 1.22 (#1521) (#1530) + + +### [7.14.0-v17](https://github.com/stashed/elasticsearch/releases/tag/7.14.0-v17) + +- [07732198](https://github.com/stashed/elasticsearch/commit/07732198) Prepare for release 7.14.0-v17 (#1538) +- [84560940](https://github.com/stashed/elasticsearch/commit/84560940) Use Go 1.22 (#1510) (#1517) +- [a7e835e0](https://github.com/stashed/elasticsearch/commit/a7e835e0) Use Go 1.22 (#1521) (#1528) + + +### [8.2.0-v14](https://github.com/stashed/elasticsearch/releases/tag/8.2.0-v14) + +- [5c652e9b](https://github.com/stashed/elasticsearch/commit/5c652e9b) Prepare for release 8.2.0-v14 (#1541) +- [5816087b](https://github.com/stashed/elasticsearch/commit/5816087b) Use Go 1.22 (#1510) (#1520) +- [6fda5520](https://github.com/stashed/elasticsearch/commit/6fda5520) Use Go 1.22 (#1521) (#1531) + + + +## [stashed/enterprise](https://github.com/stashed/enterprise) + +### [v0.34.0](https://github.com/stashed/enterprise/releases/tag/v0.34.0) + +- [abdda99c](https://github.com/stashed/enterprise/commit/abdda99c1) Prepare for release v0.34.0 (#252) +- [ac0a94b1](https://github.com/stashed/enterprise/commit/ac0a94b12) Use Go 1.22 (#251) +- [21941602](https://github.com/stashed/enterprise/commit/219416023) Use Go 1.22 (#250) + + + +## [stashed/etcd](https://github.com/stashed/etcd) + +### [3.5.0-v18](https://github.com/stashed/etcd/releases/tag/3.5.0-v18) + +- [7831686](https://github.com/stashed/etcd/commit/7831686) Prepare for release 3.5.0-v18 (#95) +- [1615a10](https://github.com/stashed/etcd/commit/1615a10) [cherry-pick] Use Go 1.22 (#93) (#94) +- [4a6c248](https://github.com/stashed/etcd/commit/4a6c248) [cherry-pick] Use Go 1.22 (#91) (#92) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2024.4.8](https://github.com/stashed/installer/releases/tag/v2024.4.8) + +- [a5779c26](https://github.com/stashed/installer/commit/a5779c26) Prepare for release v2024.4.8 (#336) +- [85724696](https://github.com/stashed/installer/commit/85724696) Use Go 1.22 (#335) +- [78d05dfa](https://github.com/stashed/installer/commit/78d05dfa) Use Go 1.22 (#334) +- [462dae9e](https://github.com/stashed/installer/commit/462dae9e) Add pg version 16 support (#331) +- [14ca5b0a](https://github.com/stashed/installer/commit/14ca5b0a) Add node selector, toleration and affinity rules for jobs (#333) +- [6675e10f](https://github.com/stashed/installer/commit/6675e10f) Add `--ignore-groupkinds` flag in kubedump function (#332) + + + +## [stashed/kubedump](https://github.com/stashed/kubedump) + +### [0.1.0-v14](https://github.com/stashed/kubedump/releases/tag/0.1.0-v14) + +- [6774b71](https://github.com/stashed/kubedump/commit/6774b71) Prepare for release 0.1.0-v14 (#64) +- [756520f](https://github.com/stashed/kubedump/commit/756520f) Use Go 1.22 (#60) (#61) +- [30bb01b](https://github.com/stashed/kubedump/commit/30bb01b) Use Go 1.22 (#62) (#63) + + + +## [stashed/mariadb](https://github.com/stashed/mariadb) + +### [10.5.8-v25](https://github.com/stashed/mariadb/releases/tag/10.5.8-v25) + +- [77c27b4d](https://github.com/stashed/mariadb/commit/77c27b4d) Prepare for release 10.5.8-v25 (#246) +- [b8cfb2c2](https://github.com/stashed/mariadb/commit/b8cfb2c2) [cherry-pick] Use Go 1.22 (#244) (#245) +- [9c86fee6](https://github.com/stashed/mariadb/commit/9c86fee6) [cherry-pick] Use Go 1.22 (#242) (#243) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v31](https://github.com/stashed/mongodb/releases/tag/3.4.17-v31) + +- [58b55d55](https://github.com/stashed/mongodb/commit/58b55d55) Prepare for release 3.4.17-v31 (#2119) +- [15f8513c](https://github.com/stashed/mongodb/commit/15f8513c) Use Go 1.22 (#2098) (#2104) + + +### [3.4.22-v31](https://github.com/stashed/mongodb/releases/tag/3.4.22-v31) + +- [15bc4a8e](https://github.com/stashed/mongodb/commit/15bc4a8e) Prepare for release 3.4.22-v31 (#2120) +- [a70cbdfc](https://github.com/stashed/mongodb/commit/a70cbdfc) Use Go 1.22 (#2098) (#2105) + + +### [3.6.8-v31](https://github.com/stashed/mongodb/releases/tag/3.6.8-v31) + +- [1d63b61c](https://github.com/stashed/mongodb/commit/1d63b61c) Prepare for release 3.6.8-v31 (#2122) +- [27c70e3e](https://github.com/stashed/mongodb/commit/27c70e3e) Use Go 1.22 (#2098) (#2107) + + +### [3.6.13-v31](https://github.com/stashed/mongodb/releases/tag/3.6.13-v31) + +- [f5a988bd](https://github.com/stashed/mongodb/commit/f5a988bd) Prepare for release 3.6.13-v31 (#2121) +- [e4fbdca1](https://github.com/stashed/mongodb/commit/e4fbdca1) Use Go 1.22 (#2098) (#2106) + + +### [4.0.3-v31](https://github.com/stashed/mongodb/releases/tag/4.0.3-v31) + +- [c8a40f84](https://github.com/stashed/mongodb/commit/c8a40f84) Prepare for release 4.0.3-v31 (#2124) +- [c320e2e3](https://github.com/stashed/mongodb/commit/c320e2e3) Use Go 1.22 (#2098) (#2109) + + +### [4.0.5-v31](https://github.com/stashed/mongodb/releases/tag/4.0.5-v31) + +- [4f1dd2ea](https://github.com/stashed/mongodb/commit/4f1dd2ea) Prepare for release 4.0.5-v31 (#2125) +- [8dbf0b26](https://github.com/stashed/mongodb/commit/8dbf0b26) Use Go 1.22 (#2098) (#2110) + + +### [4.0.11-v31](https://github.com/stashed/mongodb/releases/tag/4.0.11-v31) + +- [4a1ca435](https://github.com/stashed/mongodb/commit/4a1ca435) Prepare for release 4.0.11-v31 (#2123) +- [71013236](https://github.com/stashed/mongodb/commit/71013236) Use Go 1.22 (#2098) (#2108) + + +### [4.1.4-v31](https://github.com/stashed/mongodb/releases/tag/4.1.4-v31) + +- [0987370a](https://github.com/stashed/mongodb/commit/0987370a) Prepare for release 4.1.4-v31 (#2127) +- [d611f612](https://github.com/stashed/mongodb/commit/d611f612) Use Go 1.22 (#2098) (#2112) + + +### [4.1.7-v31](https://github.com/stashed/mongodb/releases/tag/4.1.7-v31) + +- [4bc37444](https://github.com/stashed/mongodb/commit/4bc37444) Prepare for release 4.1.7-v31 (#2128) +- [f1b8cbbb](https://github.com/stashed/mongodb/commit/f1b8cbbb) Use Go 1.22 (#2098) (#2113) + + +### [4.1.13-v31](https://github.com/stashed/mongodb/releases/tag/4.1.13-v31) + +- [0a3b3fcd](https://github.com/stashed/mongodb/commit/0a3b3fcd) Prepare for release 4.1.13-v31 (#2126) +- [114ffe42](https://github.com/stashed/mongodb/commit/114ffe42) Use Go 1.22 (#2098) (#2111) + + +### [4.2.3-v31](https://github.com/stashed/mongodb/releases/tag/4.2.3-v31) + +- [a4399e27](https://github.com/stashed/mongodb/commit/a4399e27) Prepare for release 4.2.3-v31 (#2129) +- [0d7bc575](https://github.com/stashed/mongodb/commit/0d7bc575) Use Go 1.22 (#2098) (#2114) + + +### [4.4.6-v22](https://github.com/stashed/mongodb/releases/tag/4.4.6-v22) + +- [c0a13d5a](https://github.com/stashed/mongodb/commit/c0a13d5a) Prepare for release 4.4.6-v22 (#2130) +- [e89fb707](https://github.com/stashed/mongodb/commit/e89fb707) Use Go 1.22 (#2098) (#2115) + + +### [5.0.3-v19](https://github.com/stashed/mongodb/releases/tag/5.0.3-v19) + +- [e3f0395d](https://github.com/stashed/mongodb/commit/e3f0395d) Prepare for release 5.0.3-v19 (#2132) +- [af619bb9](https://github.com/stashed/mongodb/commit/af619bb9) Use Go 1.22 (#2098) (#2117) + + +### [5.0.15-v4](https://github.com/stashed/mongodb/releases/tag/5.0.15-v4) + +- [cd1774de](https://github.com/stashed/mongodb/commit/cd1774de) Prepare for release 5.0.15-v4 (#2131) +- [b97c1fd6](https://github.com/stashed/mongodb/commit/b97c1fd6) Use Go 1.22 (#2098) (#2116) + + +### [6.0.5-v7](https://github.com/stashed/mongodb/releases/tag/6.0.5-v7) + +- [f54a09de](https://github.com/stashed/mongodb/commit/f54a09de) Prepare for release 6.0.5-v7 (#2133) +- [65963e0b](https://github.com/stashed/mongodb/commit/65963e0b) Use Go 1.22 (#2098) (#2118) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v31](https://github.com/stashed/mysql/releases/tag/5.7.25-v31) + +- [b05bf372](https://github.com/stashed/mysql/commit/b05bf372) Prepare for release 5.7.25-v31 (#772) +- [9bc2d64b](https://github.com/stashed/mysql/commit/9bc2d64b) [cherry-pick] Use Go 1.22 (#767) (#768) +- [d12b9957](https://github.com/stashed/mysql/commit/d12b9957) [cherry-pick] Use Go 1.22 (#762) (#763) + + +### [8.0.3-v31](https://github.com/stashed/mysql/releases/tag/8.0.3-v31) + +- [12351196](https://github.com/stashed/mysql/commit/12351196) Prepare for release 8.0.3-v31 (#775) +- [572d4433](https://github.com/stashed/mysql/commit/572d4433) [cherry-pick] Use Go 1.22 (#767) (#771) +- [003dd782](https://github.com/stashed/mysql/commit/003dd782) [cherry-pick] Use Go 1.22 (#762) (#766) + + +### [8.0.14-v31](https://github.com/stashed/mysql/releases/tag/8.0.14-v31) + +- [bddcbc5e](https://github.com/stashed/mysql/commit/bddcbc5e) Prepare for release 8.0.14-v31 (#773) +- [fb6655db](https://github.com/stashed/mysql/commit/fb6655db) [cherry-pick] Use Go 1.22 (#767) (#769) +- [9168a96f](https://github.com/stashed/mysql/commit/9168a96f) [cherry-pick] Use Go 1.22 (#762) (#764) + + +### [8.0.21-v25](https://github.com/stashed/mysql/releases/tag/8.0.21-v25) + +- [7ccbafa0](https://github.com/stashed/mysql/commit/7ccbafa0) Prepare for release 8.0.21-v25 (#774) +- [65d51861](https://github.com/stashed/mysql/commit/65d51861) [cherry-pick] Use Go 1.22 (#767) (#770) +- [fa68ec10](https://github.com/stashed/mysql/commit/fa68ec10) [cherry-pick] Use Go 1.22 (#762) (#765) + + + +## [stashed/nats](https://github.com/stashed/nats) + +### [2.6.1-v19](https://github.com/stashed/nats/releases/tag/2.6.1-v19) + +- [3b03387](https://github.com/stashed/nats/commit/3b03387) Prepare for release 2.6.1-v19 (#141) +- [b82f62f](https://github.com/stashed/nats/commit/b82f62f) [cherry-pick] Use Go 1.22 (#138) (#139) +- [a1daf1a](https://github.com/stashed/nats/commit/a1daf1a) [cherry-pick] Use Go 1.22 (#135) (#136) + + +### [2.8.2-v14](https://github.com/stashed/nats/releases/tag/2.8.2-v14) + +- [dd6c32c](https://github.com/stashed/nats/commit/dd6c32c) Prepare for release 2.8.2-v14 (#142) +- [f3f64d8](https://github.com/stashed/nats/commit/f3f64d8) [cherry-pick] Use Go 1.22 (#138) (#140) +- [4bf6909](https://github.com/stashed/nats/commit/4bf6909) [cherry-pick] Use Go 1.22 (#135) (#137) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-v26](https://github.com/stashed/percona-xtradb/releases/tag/5.7-v26) + +- [3e476cf1](https://github.com/stashed/percona-xtradb/commit/3e476cf1) Prepare for release 5.7-v26 (#319) +- [4792bc77](https://github.com/stashed/percona-xtradb/commit/4792bc77) [cherry-pick] Use Go 1.22 (#317) (#318) +- [4092d00f](https://github.com/stashed/percona-xtradb/commit/4092d00f) [cherry-pick] Use Go 1.22 (#315) (#316) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v30](https://github.com/stashed/postgres/releases/tag/9.6.19-v30) + +- [fbd16044](https://github.com/stashed/postgres/commit/fbd16044) Prepare for release 9.6.19-v30 (#1310) +- [ccc209f2](https://github.com/stashed/postgres/commit/ccc209f2) [cherry-pick] Use Go 1.22 (#1294) (#1302) +- [6e158932](https://github.com/stashed/postgres/commit/6e158932) [cherry-pick] Use Go 1.22 (#1285) (#1293) +- [8ad02897](https://github.com/stashed/postgres/commit/8ad02897) TLS fix for Postgres (#1276) (#1284) + + +### [10.14-v30](https://github.com/stashed/postgres/releases/tag/10.14-v30) + +- [96117cdb](https://github.com/stashed/postgres/commit/96117cdb) Prepare for release 10.14-v30 (#1303) +- [14485d33](https://github.com/stashed/postgres/commit/14485d33) [cherry-pick] Use Go 1.22 (#1294) (#1295) +- [50933257](https://github.com/stashed/postgres/commit/50933257) [cherry-pick] Use Go 1.22 (#1285) (#1286) +- [6a572310](https://github.com/stashed/postgres/commit/6a572310) TLS fix for Postgres (#1276) (#1277) + + +### [11.9-v30](https://github.com/stashed/postgres/releases/tag/11.9-v30) + +- [f0dce3ab](https://github.com/stashed/postgres/commit/f0dce3ab) Prepare for release 11.9-v30 (#1304) +- [ae71d48f](https://github.com/stashed/postgres/commit/ae71d48f) [cherry-pick] Use Go 1.22 (#1294) (#1296) +- [42d88fa3](https://github.com/stashed/postgres/commit/42d88fa3) [cherry-pick] Use Go 1.22 (#1285) (#1287) +- [71b29f42](https://github.com/stashed/postgres/commit/71b29f42) TLS fix for Postgres (#1276) (#1278) + + +### [12.4-v30](https://github.com/stashed/postgres/releases/tag/12.4-v30) + +- [0fbdd5ca](https://github.com/stashed/postgres/commit/0fbdd5ca) Prepare for release 12.4-v30 (#1305) +- [60928e72](https://github.com/stashed/postgres/commit/60928e72) [cherry-pick] Use Go 1.22 (#1294) (#1297) +- [bba3655d](https://github.com/stashed/postgres/commit/bba3655d) [cherry-pick] Use Go 1.22 (#1285) (#1288) +- [29abe734](https://github.com/stashed/postgres/commit/29abe734) TLS fix for Postgres (#1276) (#1279) + + +### [13.1-v27](https://github.com/stashed/postgres/releases/tag/13.1-v27) + +- [5a0180f3](https://github.com/stashed/postgres/commit/5a0180f3) Prepare for release 13.1-v27 (#1306) +- [9bd70f79](https://github.com/stashed/postgres/commit/9bd70f79) [cherry-pick] Use Go 1.22 (#1294) (#1298) +- [c5f3f4e7](https://github.com/stashed/postgres/commit/c5f3f4e7) [cherry-pick] Use Go 1.22 (#1285) (#1289) +- [574e5101](https://github.com/stashed/postgres/commit/574e5101) TLS fix for Postgres (#1276) (#1280) + + +### [14.0-v19](https://github.com/stashed/postgres/releases/tag/14.0-v19) + +- [fb410c7d](https://github.com/stashed/postgres/commit/fb410c7d) Prepare for release 14.0-v19 (#1307) +- [f0ec4a9b](https://github.com/stashed/postgres/commit/f0ec4a9b) [cherry-pick] Use Go 1.22 (#1294) (#1299) +- [a0d2cb4e](https://github.com/stashed/postgres/commit/a0d2cb4e) [cherry-pick] Use Go 1.22 (#1285) (#1290) +- [a713b5ce](https://github.com/stashed/postgres/commit/a713b5ce) TLS fix for Postgres (#1276) (#1281) + + +### [15.1-v11](https://github.com/stashed/postgres/releases/tag/15.1-v11) + +- [d1f558b5](https://github.com/stashed/postgres/commit/d1f558b5) Prepare for release 15.1-v11 (#1308) +- [5e31b5e3](https://github.com/stashed/postgres/commit/5e31b5e3) [cherry-pick] Use Go 1.22 (#1294) (#1300) +- [1ef33931](https://github.com/stashed/postgres/commit/1ef33931) [cherry-pick] Use Go 1.22 (#1285) (#1291) +- [38de64a2](https://github.com/stashed/postgres/commit/38de64a2) TLS fix for Postgres (#1276) (#1282) + + +### [16.1](https://github.com/stashed/postgres/releases/tag/16.1) + + + + +## [stashed/redis](https://github.com/stashed/redis) + +### [5.0.13-v19](https://github.com/stashed/redis/releases/tag/5.0.13-v19) + +- [454812a](https://github.com/stashed/redis/commit/454812a) Prepare for release 5.0.13-v19 (#224) +- [b0d2bc8](https://github.com/stashed/redis/commit/b0d2bc8) [cherry-pick] Use Go 1.22 (#220) (#221) +- [91e6c34](https://github.com/stashed/redis/commit/91e6c34) [cherry-pick] Use Go 1.22 (#216) (#217) + + +### [6.2.5-v19](https://github.com/stashed/redis/releases/tag/6.2.5-v19) + +- [82df5aa](https://github.com/stashed/redis/commit/82df5aa) Prepare for release 6.2.5-v19 (#225) +- [c92bc97](https://github.com/stashed/redis/commit/c92bc97) [cherry-pick] Use Go 1.22 (#220) (#222) +- [7132972](https://github.com/stashed/redis/commit/7132972) [cherry-pick] Use Go 1.22 (#216) (#218) + + +### [7.0.5-v12](https://github.com/stashed/redis/releases/tag/7.0.5-v12) + +- [c3d5394](https://github.com/stashed/redis/commit/c3d5394) Prepare for release 7.0.5-v12 (#226) +- [2a9d78d](https://github.com/stashed/redis/commit/2a9d78d) [cherry-pick] Use Go 1.22 (#220) (#223) +- [ca351a1](https://github.com/stashed/redis/commit/ca351a1) [cherry-pick] Use Go 1.22 (#216) (#219) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.34.0](https://github.com/stashed/stash/releases/tag/v0.34.0) + +- [c0166b9a](https://github.com/stashed/stash/commit/c0166b9ab) Prepare for release v0.34.0 (#1567) +- [99e49802](https://github.com/stashed/stash/commit/99e49802f) Use Go 1.22 (#1566) +- [a3177914](https://github.com/stashed/stash/commit/a31779145) Use Go 1.22 (#1564) + + + +## [stashed/ui-server](https://github.com/stashed/ui-server) + +### [v0.15.0](https://github.com/stashed/ui-server/releases/tag/v0.15.0) + +- [53dadbe9](https://github.com/stashed/ui-server/commit/53dadbe9) Prepare for release v0.15.0 (#39) +- [c708bdd2](https://github.com/stashed/ui-server/commit/c708bdd2) Use Go 1.22 (#38) +- [e0c26d2a](https://github.com/stashed/ui-server/commit/e0c26d2a) Use Go 1.22 (#37) + + + +## [stashed/vault](https://github.com/stashed/vault) + +### [1.10.3-v11](https://github.com/stashed/vault/releases/tag/1.10.3-v11) + +- [cc9393ba](https://github.com/stashed/vault/commit/cc9393ba) Prepare for release 1.10.3-v11 (#39) +- [7f427970](https://github.com/stashed/vault/commit/7f427970) [cherry-pick] Use Go 1.22 (#37) (#38) +- [bb505746](https://github.com/stashed/vault/commit/bb505746) [cherry-pick] Use Go 1.22 (#35) (#36) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2024.8.27.md b/content/docs/v2024.12.18/CHANGELOG-v2024.8.27.md new file mode 100644 index 0000000000..8f1a11c7d2 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2024.8.27.md @@ -0,0 +1,457 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2024.8.27 + name: Changelog-v2024.8.27 + parent: welcome + weight: 20240827 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2024.8.27/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2024.8.27/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2024.8.27 (2024-08-28) + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.35.0](https://github.com/stashed/apimachinery/releases/tag/v0.35.0) + +- [865b404c](https://github.com/stashed/apimachinery/commit/865b404c) Update deps +- [9f543113](https://github.com/stashed/apimachinery/commit/9f543113) Add condition for backup disruption (#223) +- [36516c28](https://github.com/stashed/apimachinery/commit/36516c28) Use Go 1.23 (#222) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.35.0](https://github.com/stashed/cli/releases/tag/v0.35.0) + +- [a4dd874e](https://github.com/stashed/cli/commit/a4dd874e) Prepare for release v0.35.0 (#204) +- [7fac7e02](https://github.com/stashed/cli/commit/7fac7e02) Add restic `check` and `rebuild-index` cmd for better repository debugging (#203) +- [6b48bb80](https://github.com/stashed/cli/commit/6b48bb80) Print output for download cmd (#201) +- [cf294209](https://github.com/stashed/cli/commit/cf294209) Use Go 1.23 (#202) + + + +## [stashed/elasticsearch](https://github.com/stashed/elasticsearch) + +### [5.6.4-v32](https://github.com/stashed/elasticsearch/releases/tag/5.6.4-v32) + +- [022bfe28](https://github.com/stashed/elasticsearch/commit/022bfe28) Prepare for release 5.6.4-v32 (#1547) + + +### [6.2.4-v32](https://github.com/stashed/elasticsearch/releases/tag/6.2.4-v32) + +- [a1e71bca](https://github.com/stashed/elasticsearch/commit/a1e71bca) Prepare for release 6.2.4-v32 (#1548) + + +### [6.3.0-v32](https://github.com/stashed/elasticsearch/releases/tag/6.3.0-v32) + +- [590c4411](https://github.com/stashed/elasticsearch/commit/590c4411) Prepare for release 6.3.0-v32 (#1549) + + +### [6.4.0-v32](https://github.com/stashed/elasticsearch/releases/tag/6.4.0-v32) + +- [7da7110e](https://github.com/stashed/elasticsearch/commit/7da7110e) Prepare for release 6.4.0-v32 (#1550) + + +### [6.5.3-v32](https://github.com/stashed/elasticsearch/releases/tag/6.5.3-v32) + +- [0e879140](https://github.com/stashed/elasticsearch/commit/0e879140) Prepare for release 6.5.3-v32 (#1551) + + +### [6.8.0-v32](https://github.com/stashed/elasticsearch/releases/tag/6.8.0-v32) + +- [65c68556](https://github.com/stashed/elasticsearch/commit/65c68556) Prepare for release 6.8.0-v32 (#1552) + + +### [7.2.0-v32](https://github.com/stashed/elasticsearch/releases/tag/7.2.0-v32) + +- [83fbb80a](https://github.com/stashed/elasticsearch/commit/83fbb80a) Prepare for release 7.2.0-v32 (#1554) + + +### [7.3.2-v32](https://github.com/stashed/elasticsearch/releases/tag/7.3.2-v32) + +- [5659abd7](https://github.com/stashed/elasticsearch/commit/5659abd7) Prepare for release 7.3.2-v32 (#1555) +- [ac4829c5](https://github.com/stashed/elasticsearch/commit/ac4829c5) Add support for creating space during dashboard restore (#1544) + + +### [7.14.0-v18](https://github.com/stashed/elasticsearch/releases/tag/7.14.0-v18) + +- [43d959e5](https://github.com/stashed/elasticsearch/commit/43d959e5) Prepare for release 7.14.0-v18 (#1553) +- [45964df8](https://github.com/stashed/elasticsearch/commit/45964df8) Add support for creating space during dashboard restore (#1545) + + +### [8.2.0-v15](https://github.com/stashed/elasticsearch/releases/tag/8.2.0-v15) + +- [def1a44b](https://github.com/stashed/elasticsearch/commit/def1a44b) Prepare for release 8.2.0-v15 (#1556) +- [f565882f](https://github.com/stashed/elasticsearch/commit/f565882f) Add support for creating space during dashboard restore (#1543) + + + +## [stashed/enterprise](https://github.com/stashed/enterprise) + +### [v0.35.0](https://github.com/stashed/enterprise/releases/tag/v0.35.0) + +- [4f64305b](https://github.com/stashed/enterprise/commit/4f64305b6) Prepare for release v0.35.0 (#255) +- [52835160](https://github.com/stashed/enterprise/commit/52835160d) Fix backupsession running issue after deadline exceed (#253) +- [fa5833a7](https://github.com/stashed/enterprise/commit/fa5833a75) Use Go 1.23 (#254) + + + +## [stashed/etcd](https://github.com/stashed/etcd) + +### [3.5.0-v19](https://github.com/stashed/etcd/releases/tag/3.5.0-v19) + +- [901d0a4](https://github.com/stashed/etcd/commit/901d0a4) Prepare for release 3.5.0-v19 (#98) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2024.8.27](https://github.com/stashed/installer/releases/tag/v2024.8.27) + +- [7f7b18f1](https://github.com/stashed/installer/commit/7f7b18f1) Prepare for release v2024.8.27 (#343) +- [ae2d4f99](https://github.com/stashed/installer/commit/ae2d4f99) Use Go 1.23 (#342) +- [604ef4f3](https://github.com/stashed/installer/commit/604ef4f3) Test against k8s 1.31 (#341) + + + +## [stashed/kubedump](https://github.com/stashed/kubedump) + +### [0.1.0-v15](https://github.com/stashed/kubedump/releases/tag/0.1.0-v15) + +- [f2c07a3](https://github.com/stashed/kubedump/commit/f2c07a3) Prepare for release 0.1.0-v15 (#67) +- [92e5c91](https://github.com/stashed/kubedump/commit/92e5c91) Use Go 1.23 (#66) (#69) + + + +## [stashed/mariadb](https://github.com/stashed/mariadb) + +### [10.5.8-v26](https://github.com/stashed/mariadb/releases/tag/10.5.8-v26) + +- [b674f8ec](https://github.com/stashed/mariadb/commit/b674f8ec) Prepare for release 10.5.8-v26 (#249) +- [a020b223](https://github.com/stashed/mariadb/commit/a020b223) Use Go 1.23 (#248) (#251) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v32](https://github.com/stashed/mongodb/releases/tag/3.4.17-v32) + +- [855e9eb6](https://github.com/stashed/mongodb/commit/855e9eb6) Prepare for release 3.4.17-v32 (#2154) +- [671e6536](https://github.com/stashed/mongodb/commit/671e6536) [cherry-pick] Fix MongoDB url connection str for external databases (#2138) (#2139) + + +### [3.4.22-v32](https://github.com/stashed/mongodb/releases/tag/3.4.22-v32) + +- [852d1338](https://github.com/stashed/mongodb/commit/852d1338) Prepare for release 3.4.22-v32 (#2155) +- [e3a34ce3](https://github.com/stashed/mongodb/commit/e3a34ce3) Fix MongoDB url connection str for external databases (#2138) (#2140) + + +### [3.6.8-v32](https://github.com/stashed/mongodb/releases/tag/3.6.8-v32) + +- [de6e934e](https://github.com/stashed/mongodb/commit/de6e934e) Prepare for release 3.6.8-v32 (#2157) +- [d440be0d](https://github.com/stashed/mongodb/commit/d440be0d) Fix MongoDB url connection str for external databases (#2138) (#2142) + + +### [3.6.13-v32](https://github.com/stashed/mongodb/releases/tag/3.6.13-v32) + +- [8098d72f](https://github.com/stashed/mongodb/commit/8098d72f) Prepare for release 3.6.13-v32 (#2156) +- [90b99bb7](https://github.com/stashed/mongodb/commit/90b99bb7) Fix MongoDB url connection str for external databases (#2138) (#2141) + + +### [4.0.3-v32](https://github.com/stashed/mongodb/releases/tag/4.0.3-v32) + +- [864e0893](https://github.com/stashed/mongodb/commit/864e0893) Prepare for release 4.0.3-v32 (#2159) +- [25de1602](https://github.com/stashed/mongodb/commit/25de1602) Fix MongoDB url connection str for external databases (#2138) (#2144) + + +### [4.0.5-v32](https://github.com/stashed/mongodb/releases/tag/4.0.5-v32) + +- [ca4a260f](https://github.com/stashed/mongodb/commit/ca4a260f) Prepare for release 4.0.5-v32 (#2160) +- [f056b393](https://github.com/stashed/mongodb/commit/f056b393) Fix MongoDB url connection str for external databases (#2138) (#2145) + + +### [4.0.11-v32](https://github.com/stashed/mongodb/releases/tag/4.0.11-v32) + +- [cefa6f1f](https://github.com/stashed/mongodb/commit/cefa6f1f) Prepare for release 4.0.11-v32 (#2158) +- [71014a6a](https://github.com/stashed/mongodb/commit/71014a6a) Fix MongoDB url connection str for external databases (#2138) (#2143) + + +### [4.1.4-v32](https://github.com/stashed/mongodb/releases/tag/4.1.4-v32) + +- [02f6b9fe](https://github.com/stashed/mongodb/commit/02f6b9fe) Prepare for release 4.1.4-v32 (#2162) +- [03dc6c0b](https://github.com/stashed/mongodb/commit/03dc6c0b) Fix MongoDB url connection str for external databases (#2138) (#2147) + + +### [4.1.7-v32](https://github.com/stashed/mongodb/releases/tag/4.1.7-v32) + +- [04b231f7](https://github.com/stashed/mongodb/commit/04b231f7) Prepare for release 4.1.7-v32 (#2163) +- [4fba2286](https://github.com/stashed/mongodb/commit/4fba2286) Fix MongoDB url connection str for external databases (#2138) (#2148) + + +### [4.1.13-v32](https://github.com/stashed/mongodb/releases/tag/4.1.13-v32) + +- [e872ccab](https://github.com/stashed/mongodb/commit/e872ccab) Prepare for release 4.1.13-v32 (#2161) +- [db585560](https://github.com/stashed/mongodb/commit/db585560) Fix MongoDB url connection str for external databases (#2138) (#2146) + + +### [4.2.3-v32](https://github.com/stashed/mongodb/releases/tag/4.2.3-v32) + +- [5ce8589a](https://github.com/stashed/mongodb/commit/5ce8589a) Prepare for release 4.2.3-v32 (#2164) +- [b1cba825](https://github.com/stashed/mongodb/commit/b1cba825) Fix MongoDB url connection str for external databases (#2138) (#2149) + + +### [4.4.6-v23](https://github.com/stashed/mongodb/releases/tag/4.4.6-v23) + +- [4e0a833c](https://github.com/stashed/mongodb/commit/4e0a833c) Prepare for release 4.4.6-v23 (#2165) +- [58665885](https://github.com/stashed/mongodb/commit/58665885) [cherry-pick] Fix MongoDB url connection str for external databases (#2138) (#2150) + + +### [5.0.3-v20](https://github.com/stashed/mongodb/releases/tag/5.0.3-v20) + +- [d3add779](https://github.com/stashed/mongodb/commit/d3add779) Prepare for release 5.0.3-v20 (#2167) +- [1cd5902d](https://github.com/stashed/mongodb/commit/1cd5902d) [cherry-pick] Fix MongoDB url connection str for external databases (#2138) (#2152) + + +### [5.0.15-v5](https://github.com/stashed/mongodb/releases/tag/5.0.15-v5) + +- [e075d41a](https://github.com/stashed/mongodb/commit/e075d41a) Prepare for release 5.0.15-v5 (#2166) +- [f604ef85](https://github.com/stashed/mongodb/commit/f604ef85) [cherry-pick] Fix MongoDB url connection str for external databases (#2138) (#2151) + + +### [6.0.5-v8](https://github.com/stashed/mongodb/releases/tag/6.0.5-v8) + +- [c5810d8d](https://github.com/stashed/mongodb/commit/c5810d8d) Prepare for release 6.0.5-v8 (#2168) +- [10476599](https://github.com/stashed/mongodb/commit/10476599) [cherry-pick] Fix MongoDB url connection str for external databases (#2138) (#2153) + + + +## [stashed/mysql](https://github.com/stashed/mysql) + +### [5.7.25-v32](https://github.com/stashed/mysql/releases/tag/5.7.25-v32) + +- [dc20d8fa](https://github.com/stashed/mysql/commit/dc20d8fa) Prepare for release 5.7.25-v32 (#783) +- [bb4b75c0](https://github.com/stashed/mysql/commit/bb4b75c0) Use Go 1.23 (#782) (#791) + + +### [8.0.3-v32](https://github.com/stashed/mysql/releases/tag/8.0.3-v32) + +- [3e2f7a10](https://github.com/stashed/mysql/commit/3e2f7a10) Prepare for release 8.0.3-v32 (#786) +- [f5b4e4ad](https://github.com/stashed/mysql/commit/f5b4e4ad) Use Go 1.23 (#782) (#788) + + +### [8.0.14-v32](https://github.com/stashed/mysql/releases/tag/8.0.14-v32) + +- [9af04bf3](https://github.com/stashed/mysql/commit/9af04bf3) Prepare for release 8.0.14-v32 (#784) +- [a669d830](https://github.com/stashed/mysql/commit/a669d830) Use Go 1.23 (#782) (#790) + + +### [8.0.21-v26](https://github.com/stashed/mysql/releases/tag/8.0.21-v26) + +- [05d3f4a3](https://github.com/stashed/mysql/commit/05d3f4a3) Prepare for release 8.0.21-v26 (#785) +- [47d1209f](https://github.com/stashed/mysql/commit/47d1209f) Use Go 1.23 (#782) (#789) + + + +## [stashed/nats](https://github.com/stashed/nats) + +### [2.6.1-v20](https://github.com/stashed/nats/releases/tag/2.6.1-v20) + +- [58b60c8](https://github.com/stashed/nats/commit/58b60c8) Prepare for release 2.6.1-v20 (#145) +- [2dcb9d1](https://github.com/stashed/nats/commit/2dcb9d1) Remove docker registry support (#150) +- [94005b3](https://github.com/stashed/nats/commit/94005b3) Use Go 1.23 (#144) (#149) + + +### [2.8.2-v15](https://github.com/stashed/nats/releases/tag/2.8.2-v15) + +- [a903d63](https://github.com/stashed/nats/commit/a903d63) Prepare for release 2.8.2-v15 (#146) +- [d6444b9](https://github.com/stashed/nats/commit/d6444b9) Remove docker registry support (#151) +- [5742b06](https://github.com/stashed/nats/commit/5742b06) Use Go 1.23 (#144) (#148) + + + +## [stashed/percona-xtradb](https://github.com/stashed/percona-xtradb) + +### [5.7-v27](https://github.com/stashed/percona-xtradb/releases/tag/5.7-v27) + +- [fd5e2104](https://github.com/stashed/percona-xtradb/commit/fd5e2104) Prepare for release 5.7-v27 (#322) +- [4dedfa78](https://github.com/stashed/percona-xtradb/commit/4dedfa78) Use Go 1.23 (#321) (#324) + + + +## [stashed/postgres](https://github.com/stashed/postgres) + +### [9.6.19-v31](https://github.com/stashed/postgres/releases/tag/9.6.19-v31) + +- [8ef9f3d5](https://github.com/stashed/postgres/commit/8ef9f3d5) Prepare for release 9.6.19-v31 (#1338) +- [c4ace0d3](https://github.com/stashed/postgres/commit/c4ace0d3) Get postgresw sslmode from appbinding clientconfig url (#1322) (#1330) + + +### [10.14-v31](https://github.com/stashed/postgres/releases/tag/10.14-v31) + +- [48a9b619](https://github.com/stashed/postgres/commit/48a9b619) Prepare for release 10.14-v31 (#1331) +- [55607a3e](https://github.com/stashed/postgres/commit/55607a3e) Get postgresw sslmode from appbinding clientconfig url (#1322) (#1323) + + +### [11.9-v31](https://github.com/stashed/postgres/releases/tag/11.9-v31) + +- [61302a08](https://github.com/stashed/postgres/commit/61302a08) Prepare for release 11.9-v31 (#1332) +- [1ffec1f8](https://github.com/stashed/postgres/commit/1ffec1f8) Get postgresw sslmode from appbinding clientconfig url (#1322) (#1324) + + +### [12.4-v31](https://github.com/stashed/postgres/releases/tag/12.4-v31) + +- [e159aa8e](https://github.com/stashed/postgres/commit/e159aa8e) Prepare for release 12.4-v31 (#1333) +- [3af46c2d](https://github.com/stashed/postgres/commit/3af46c2d) Get postgresw sslmode from appbinding clientconfig url (#1322) (#1325) + + +### [13.1-v28](https://github.com/stashed/postgres/releases/tag/13.1-v28) + +- [468a1f45](https://github.com/stashed/postgres/commit/468a1f45) Prepare for release 13.1-v28 (#1334) +- [87232642](https://github.com/stashed/postgres/commit/87232642) Get postgresw sslmode from appbinding clientconfig url (#1322) (#1326) + + +### [14.0-v20](https://github.com/stashed/postgres/releases/tag/14.0-v20) + +- [f6202ce4](https://github.com/stashed/postgres/commit/f6202ce4) Prepare for release 14.0-v20 (#1335) +- [1d419325](https://github.com/stashed/postgres/commit/1d419325) Get postgresw sslmode from appbinding clientconfig url (#1322) (#1327) + + +### [15.1-v12](https://github.com/stashed/postgres/releases/tag/15.1-v12) + +- [0937f528](https://github.com/stashed/postgres/commit/0937f528) Prepare for release 15.1-v12 (#1336) +- [00d54c52](https://github.com/stashed/postgres/commit/00d54c52) Get postgresw sslmode from appbinding clientconfig url (#1322) (#1328) + + +### [16.1-v1](https://github.com/stashed/postgres/releases/tag/16.1-v1) + +- [b936987e](https://github.com/stashed/postgres/commit/b936987e) Prepare for release 16.1-v1 (#1337) +- [7a9f6f98](https://github.com/stashed/postgres/commit/7a9f6f98) Get postgresw sslmode from appbinding clientconfig url (#1322) (#1329) + + + +## [stashed/redis](https://github.com/stashed/redis) + +### [5.0.13-v20](https://github.com/stashed/redis/releases/tag/5.0.13-v20) + +- [8a1d962](https://github.com/stashed/redis/commit/8a1d962) Prepare for release 5.0.13-v20 (#229) +- [2af01a1](https://github.com/stashed/redis/commit/2af01a1) Use Go 1.23 (#228) (#235) + + +### [6.2.5-v20](https://github.com/stashed/redis/releases/tag/6.2.5-v20) + +- [5b9b074](https://github.com/stashed/redis/commit/5b9b074) Prepare for release 6.2.5-v20 (#230) +- [00a261f](https://github.com/stashed/redis/commit/00a261f) Use Go 1.23 (#228) (#234) + + +### [7.0.5-v13](https://github.com/stashed/redis/releases/tag/7.0.5-v13) + +- [e690a70](https://github.com/stashed/redis/commit/e690a70) Prepare for release 7.0.5-v13 (#231) +- [10f53a9](https://github.com/stashed/redis/commit/10f53a9) Use Go 1.23 (#228) (#233) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.35.0](https://github.com/stashed/stash/releases/tag/v0.35.0) + +- [74a2c770](https://github.com/stashed/stash/commit/74a2c770d) Prepare for release v0.35.0 (#1577) +- [c1f2acfd](https://github.com/stashed/stash/commit/c1f2acfd9) Use Go 1.23 (#1574) +- [6747863e](https://github.com/stashed/stash/commit/6747863e8) Test against k8s 1.31 (#1573) + + + +## [stashed/ui-server](https://github.com/stashed/ui-server) + +### [v0.16.0](https://github.com/stashed/ui-server/releases/tag/v0.16.0) + +- [12b8cc87](https://github.com/stashed/ui-server/commit/12b8cc87) Prepare for release v0.16.0 (#41) +- [a3c2e27b](https://github.com/stashed/ui-server/commit/a3c2e27b) Use Go 1.23 (#40) + + + +## [stashed/vault](https://github.com/stashed/vault) + +### [1.10.3-v12](https://github.com/stashed/vault/releases/tag/1.10.3-v12) + +- [21d5420a](https://github.com/stashed/vault/commit/21d5420a) Prepare for release 1.10.3-v12 (#42) +- [f16ae4a0](https://github.com/stashed/vault/commit/f16ae4a0) Use Go 1.23 (#41) (#46) +- [9247d6bb](https://github.com/stashed/vault/commit/9247d6bb) Remove docker registry support (#44) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG-v2024.9.30.md b/content/docs/v2024.12.18/CHANGELOG-v2024.9.30.md new file mode 100644 index 0000000000..867f99afe8 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG-v2024.9.30.md @@ -0,0 +1,229 @@ +--- +title: Changelog | Stash +description: Changelog +menu: + docs_v2024.12.18: + identifier: changelog-stash-v2024.9.30 + name: Changelog-v2024.9.30 + parent: welcome + weight: 20240930 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog-v2024.9.30/ +aliases: +- /docs/v2024.12.18/CHANGELOG-v2024.9.30/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash v2024.9.30 (2024-09-27) + + +## [stashed/apimachinery](https://github.com/stashed/apimachinery) + +### [v0.36.0](https://github.com/stashed/apimachinery/releases/tag/v0.36.0) + +- [c6c78d52](https://github.com/stashed/apimachinery/commit/c6c78d52) Update deps +- [46e84c06](https://github.com/stashed/apimachinery/commit/46e84c06) Use KIND v0.24.0 (#225) + + + +## [stashed/cli](https://github.com/stashed/cli) + +### [v0.36.0](https://github.com/stashed/cli/releases/tag/v0.36.0) + +- [2eb6b48d](https://github.com/stashed/cli/commit/2eb6b48d) Prepare for release v0.36.0 (#205) + + + +## [stashed/enterprise](https://github.com/stashed/enterprise) + +### [v0.36.0](https://github.com/stashed/enterprise/releases/tag/v0.36.0) + +- [6f330f41](https://github.com/stashed/enterprise/commit/6f330f412) Prepare for release v0.36.0 (#257) + + + +## [stashed/installer](https://github.com/stashed/installer) + +### [v2024.9.30](https://github.com/stashed/installer/releases/tag/v2024.9.30) + +- [189f9cf5](https://github.com/stashed/installer/commit/189f9cf5) Prepare for release v2024.9.30 (#347) +- [a793309d](https://github.com/stashed/installer/commit/a793309d) Use seccompProfile RuntimeDefault (#346) +- [8356df1e](https://github.com/stashed/installer/commit/8356df1e) Add imagelist +- [2e0fec68](https://github.com/stashed/installer/commit/2e0fec68) Revise metrics config user roles +- [a8b4f092](https://github.com/stashed/installer/commit/a8b4f092) Revise appcatalog permissions +- [07e82e3d](https://github.com/stashed/installer/commit/07e82e3d) Revise user roles (#345) +- [145494b9](https://github.com/stashed/installer/commit/145494b9) Use KIND v0.24.0 (#344) + + + +## [stashed/mongodb](https://github.com/stashed/mongodb) + +### [3.4.17-v33](https://github.com/stashed/mongodb/releases/tag/3.4.17-v33) + +- [72315b9a](https://github.com/stashed/mongodb/commit/72315b9a) Prepare for release 3.4.17-v33 (#2189) +- [55f83331](https://github.com/stashed/mongodb/commit/55f83331) Fix --oplog and --db arguments error (#2173) (#2174) + + +### [3.4.22-v33](https://github.com/stashed/mongodb/releases/tag/3.4.22-v33) + +- [4f7f60a4](https://github.com/stashed/mongodb/commit/4f7f60a4) Prepare for release 3.4.22-v33 (#2190) +- [2e9cd2c7](https://github.com/stashed/mongodb/commit/2e9cd2c7) Fix --oplog and --db arguments error (#2173) (#2175) + + +### [3.6.8-v33](https://github.com/stashed/mongodb/releases/tag/3.6.8-v33) + +- [bec1d5db](https://github.com/stashed/mongodb/commit/bec1d5db) Prepare for release 3.6.8-v33 (#2192) +- [91ef428b](https://github.com/stashed/mongodb/commit/91ef428b) Fix --oplog and --db arguments error (#2173) (#2177) + + +### [3.6.13-v33](https://github.com/stashed/mongodb/releases/tag/3.6.13-v33) + +- [dd822eaa](https://github.com/stashed/mongodb/commit/dd822eaa) Prepare for release 3.6.13-v33 (#2191) +- [b0f73ddf](https://github.com/stashed/mongodb/commit/b0f73ddf) Fix --oplog and --db arguments error (#2173) (#2176) + + +### [4.0.3-v33](https://github.com/stashed/mongodb/releases/tag/4.0.3-v33) + +- [b4921b6f](https://github.com/stashed/mongodb/commit/b4921b6f) Prepare for release 4.0.3-v33 (#2194) +- [99eee161](https://github.com/stashed/mongodb/commit/99eee161) Fix --oplog and --db arguments error (#2173) (#2179) + + +### [4.0.5-v33](https://github.com/stashed/mongodb/releases/tag/4.0.5-v33) + +- [20b4ac2c](https://github.com/stashed/mongodb/commit/20b4ac2c) Prepare for release 4.0.5-v33 (#2195) +- [a6d22a7a](https://github.com/stashed/mongodb/commit/a6d22a7a) Fix --oplog and --db arguments error (#2173) (#2180) + + +### [4.0.11-v33](https://github.com/stashed/mongodb/releases/tag/4.0.11-v33) + +- [7731b0f5](https://github.com/stashed/mongodb/commit/7731b0f5) Prepare for release 4.0.11-v33 (#2193) + + +### [4.1.4-v33](https://github.com/stashed/mongodb/releases/tag/4.1.4-v33) + +- [169c4084](https://github.com/stashed/mongodb/commit/169c4084) Prepare for release 4.1.4-v33 (#2197) +- [3c4d0f4c](https://github.com/stashed/mongodb/commit/3c4d0f4c) Fix --oplog and --db arguments error (#2173) (#2182) + + +### [4.1.7-v33](https://github.com/stashed/mongodb/releases/tag/4.1.7-v33) + +- [fa94de5b](https://github.com/stashed/mongodb/commit/fa94de5b) Prepare for release 4.1.7-v33 (#2198) +- [ffe23f8a](https://github.com/stashed/mongodb/commit/ffe23f8a) Fix --oplog and --db arguments error (#2173) (#2183) + + +### [4.1.13-v33](https://github.com/stashed/mongodb/releases/tag/4.1.13-v33) + +- [09f15435](https://github.com/stashed/mongodb/commit/09f15435) Prepare for release 4.1.13-v33 (#2196) + + +### [4.2.3-v33](https://github.com/stashed/mongodb/releases/tag/4.2.3-v33) + +- [686da5f7](https://github.com/stashed/mongodb/commit/686da5f7) Prepare for release 4.2.3-v33 (#2199) + + +### [4.4.6-v24](https://github.com/stashed/mongodb/releases/tag/4.4.6-v24) + +- [cc246f5f](https://github.com/stashed/mongodb/commit/cc246f5f) Prepare for release 4.4.6-v24 (#2200) + + +### [5.0.3-v21](https://github.com/stashed/mongodb/releases/tag/5.0.3-v21) + +- [8fd1e40c](https://github.com/stashed/mongodb/commit/8fd1e40c) Prepare for release 5.0.3-v21 (#2202) + + +### [5.0.15-v6](https://github.com/stashed/mongodb/releases/tag/5.0.15-v6) + +- [7b65267a](https://github.com/stashed/mongodb/commit/7b65267a) Prepare for release 5.0.15-v6 (#2201) + + +### [6.0.5-v9](https://github.com/stashed/mongodb/releases/tag/6.0.5-v9) + +- [69244680](https://github.com/stashed/mongodb/commit/69244680) Prepare for release 6.0.5-v9 (#2203) + + + +## [stashed/stash](https://github.com/stashed/stash) + +### [v0.36.0](https://github.com/stashed/stash/releases/tag/v0.36.0) + +- [ef7a17bb](https://github.com/stashed/stash/commit/ef7a17bb4) Prepare for release v0.36.0 (#1581) +- [f9966814](https://github.com/stashed/stash/commit/f99668149) Use KIND v0.24.0 (#1580) + + + +## [stashed/ui-server](https://github.com/stashed/ui-server) + +### [v0.17.0](https://github.com/stashed/ui-server/releases/tag/v0.17.0) + +- [04e5e6b2](https://github.com/stashed/ui-server/commit/04e5e6b2) Prepare for release v0.17.0 (#42) + + + + diff --git a/content/docs/v2024.12.18/CHANGELOG.md b/content/docs/v2024.12.18/CHANGELOG.md new file mode 100644 index 0000000000..602aabf728 --- /dev/null +++ b/content/docs/v2024.12.18/CHANGELOG.md @@ -0,0 +1,97 @@ +--- +title: Changelog | Stash +description: Release History +menu: + docs_v2024.12.18: + identifier: release-history + name: Changelog + parent: welcome + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/changelog/ +aliases: +- /docs/v2024.12.18/CHANGELOG/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## Current Release + +- [CHANGELOG-0.9.md](/docs/v2024.12.18/CHANGELOG-0.9) + +## Older Releases + +- [CHANGELOG-0.8.md](/docs/v2024.12.18/CHANGELOG-0.8) +- [CHANGELOG-0.7.md](/docs/v2024.12.18/CHANGELOG-0.7) +- [CHANGELOG-0.6.md](/docs/v2024.12.18/CHANGELOG-0.6) +- [CHANGELOG-0.5.md](/docs/v2024.12.18/CHANGELOG-0.5) +- [CHANGELOG-0.4.md](/docs/v2024.12.18/CHANGELOG-0.4) +- [CHANGELOG-0.3.md](/docs/v2024.12.18/CHANGELOG-0.3) +- [CHANGELOG-0.2.md](/docs/v2024.12.18/CHANGELOG-0.2) +- [CHANGELOG-0.1.md](/docs/v2024.12.18/CHANGELOG-0.1) diff --git a/content/docs/v2024.12.18/CONTRIBUTING.md b/content/docs/v2024.12.18/CONTRIBUTING.md new file mode 100644 index 0000000000..a6f9691fcf --- /dev/null +++ b/content/docs/v2024.12.18/CONTRIBUTING.md @@ -0,0 +1,98 @@ +--- +title: Contributing | Stash +description: Contributing +menu: + docs_v2024.12.18: + identifier: contributing-stash + name: Contributing + parent: welcome + weight: 1000 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/contributing/ +aliases: +- /docs/v2024.12.18/CONTRIBUTING/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Contribution Guidelines + +Want to contribute to Stash? + +## Getting Help + +To speak with us, please leave a message on [our website](https://appscode.com/contact/). To receive product announcements, follow us on [Twitter](https://twitter.com/KubeStash). + +## Bugs/Feature request + +If you have found a bug with Stash or want to request for new features, please [file an issue](https://github.com/stashed/project/issues/new). + +## Spread the word + +If you have written blog post or tutorial on Stash, please share it with us on [Twitter](https://twitter.com/KubeStash). diff --git a/content/docs/v2024.12.18/FAQ/README.md b/content/docs/v2024.12.18/FAQ/README.md new file mode 100644 index 0000000000..e49176ebb7 --- /dev/null +++ b/content/docs/v2024.12.18/FAQ/README.md @@ -0,0 +1,125 @@ +--- +title: FAQ | Stash +menu: + docs_v2024.12.18: + identifier: faq-readme + name: README + parent: faq + weight: -1 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: faq +url: /docs/v2024.12.18/faq/ +aliases: +- /docs/v2024.12.18/faq/README/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Frequently Asked Questions + +## How to temporarily pause a backup? + +### Pause Backup + +Run the following commands to pasue a backup temporarily, + +```bash +# pause backup by patching BackupConfiguration +❯ kubectl patch backupconfiguration -n --type="merge" --patch='{"spec": {"paused": true}}' + +# pause backup using Stash `kubectl` plugin +❯ kubectl stash pause backup -n demo --backupconfig= +``` + +### Resume Backup + +Similarly you can also resume a paused backup. Run the following commands to resume a backup, + +```bash +# resume backup by patching BackupConfiguration +kubectl patch backupconfiguration -n --type="merge" --patch='{"spec": {"paused": false}}' + +# resume backup using Stash `kubectl` plugin +❯ kubectl stash resume backup -n demo --backupconfig= +``` + +## When `retentionPolicy` is applied? + +`retentionPolicy` specifies the policy to follow for cleaning old snapshots. Stash removes any snapshot from backend that falls outside the scope of the policy. When a `BackupSession` is completed, Stash checks for outdated snapshots according to the `retentionPolicy` and remove them. If you use the policy `keep-last-5`, Stash will remove any snapshot that is older than the most recent 5 snapshots. + +## Do I need to delete the init containers after recovery? + +You don't need to delete the init containers after recovery. If your workload restarts with the `stash-init` init-container for any reason, the init-container will skip running restore process if there is no pending RestoreSession for this workload. If you delete the RestoreSession, Stash will remove the `init-container` automatically. Beware that it will cause your workload to restart. + +## I am experiencing problem X. How do I fix this? + +Please check our troubleshooting guide [here](/docs/v2024.12.18/guides/troubleshooting/how-to-troubleshoot/). + +## Need More Help? + +To speak with us, please leave a message on [our website](https://appscode.com/contact/). To receive product announcements, follow us on [Twitter](https://twitter.com/KubeStash). diff --git a/content/docs/v2024.12.18/FAQ/_index.md b/content/docs/v2024.12.18/FAQ/_index.md new file mode 100644 index 0000000000..38e4eb1886 --- /dev/null +++ b/content/docs/v2024.12.18/FAQ/_index.md @@ -0,0 +1,77 @@ +--- +title: FAQ +description: FAQ | Stash +menu: + docs_v2024.12.18: + identifier: faq + name: FAQ + weight: 1250 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/README.md b/content/docs/v2024.12.18/README.md new file mode 100644 index 0000000000..49ccbe65cd --- /dev/null +++ b/content/docs/v2024.12.18/README.md @@ -0,0 +1,146 @@ +--- +title: Welcome | Stash +description: Welcome to Stash +menu: + docs_v2024.12.18: + identifier: readme-stash + name: Readme + parent: welcome + weight: -1 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/ +aliases: +- /docs/v2024.12.18/ +- /docs/v2024.12.18/README/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash + +[Stash](https://stash.run) by AppsCode is a cloud native data backup and recovery solution for Kubernetes workloads. If you are running production workloads in Kubernetes, you might want to take backup of your disks, databases etc. Traditional tools are too complex to set up and maintain in a dynamic compute environment like Kubernetes. Stash is a Kubernetes operator that uses [restic](https://github.com/restic/restic) or Kubernetes CSI Driver VolumeSnapshotter functionality to address these issues. Using Stash, you can backup Kubernetes volumes mounted in workloads, stand-alone volumes and databases. Users may even extend Stash via [addons](https://stash.run/docs/{{< param "info.version" >}}/guides/addons/overview/) for any custom workload. + +Here, we are going to give you an overview of Stash documentation structure. + +## [Concepts](/docs/v2024.12.18/concepts/) + +Concept explains some significant aspect of Stash. This is where you can learn about what Stash does and how it does it. + +- [Stash Overview](/docs/v2024.12.18/concepts/what-is-stash/overview/) Provides an introduction to Stash and gives an overview of the features it provides. +- [Stash Architecture](/docs/v2024.12.18/concepts/what-is-stash/architecture/) Provides an overview of Stash architecture and it's core components. +- [Stash API](/docs/v2024.12.18/concepts/crds/repository/) Introduces Stash CRDs. + +## [Setup](/docs/v2024.12.18/setup/) + +Setup contains instruction for installing, uninstalling, and upgrading Stash. + +- **Install Stash:** Provides installation instructions for Stash and its various components. + - [Stash](/docs/v2024.12.18/setup/install/stash/): Provides installation instructions for Stash. + - [Stash kubectl Plugin](/docs/v2024.12.18/setup/install/kubectl-plugin/): Provides installation instructions for Stash `kubectl` plugin. + - [Troubleshooting](/docs/v2024.12.18/setup/install/troubleshooting/): Provides troubleshooting guide for various installation problems. +- **Uninstall Stash:** Provides uninstallation instructions for Stash and its various components. + - [Stash](/docs/v2024.12.18/setup/uninstall/stash/): Provides uninstallation instructions for Stash. + - [Stash kubectl Plugin](/docs/v2024.12.18/setup/uninstall/kubectl-plugin/): Provides uninstallation instructions for Stash `kubectl` plugin. +- [Upgrade Stash](/docs/v2024.12.18/setup/upgrade/): Provides instruction for updating Stash license and upgrading between various Stash versions. + +## [Guides](/docs/v2024.12.18/guides/) + +Guides show how to perform different operations with Stash. + +- [Supported Backends](/docs/v2024.12.18/guides/backends/overview/): Describes how to configure different storage for storing backed up data. +- [Workload Volume Backup](/docs/v2024.12.18/guides/workloads/overview/): Shows how to use Stash to backup and restore volumes of a workload (i.e. `Deployment`, `StatefulSet`, `DaemonSet`, etc). +- [Stand-alone Volume Backup](/docs/v2024.12.18/guides/volumes/overview/): Shows how to use Stash to backup and restore stand-alone volumes(i.e. `PersistentVolumeClaim`). +- [Batch Backup](/docs/v2024.12.18/guides/batch-backup/overview/): Shows how to backup multiple co-related components using a single configuration known as `BackupBatch`. +- [Auto Backup](/docs/v2024.12.18/guides/auto-backup/overview/): Shows how to configure automatic backup of any stateful workload in your cluster. +- [Volume Snapshot](/docs/v2024.12.18/guides/volumesnapshot/overview/): Shows how Stash takes snapshot of `PersistentVolumeClaim`s and restore them from snapshot using Kubernetes `VolumeSnapshot` API. + +- **Different Use Cases:** +Shows different uses cases of Stash like instant backup, pause backup, cross-namespace backup and restore etc. + + - [Instant Backup](/docs/v2024.12.18/guides/use-cases/instant-backup/): Shows you how to take an instant backup in Stash. + - [Exclude/Include Files](/docs/v2024.12.18/guides/use-cases/exclude-include-files/): Shows how to exclude/include subset of files during backup/restore process. + - [Pause Backup](/docs/v2024.12.18/guides/use-cases/pause-backup/): Shows how to pause a backup temporarily. + - [Clone Data Volumes](/docs/v2024.12.18/guides/use-cases/clone-pvc/): Shows how to clone data volumes of a workload into a different namespace in a cluster using Stash. + - [File Ownership](/docs/v2024.12.18/guides/use-cases/ownership/): Explains when and how ownership of the restored files can be changed. + - [Cross-Cluster Backup and Restore](/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/): Shows how to take backup and restore across clusters using Stash. + - [Customize Backup and Restore](/docs/v2024.12.18/guides/use-cases/customize-backup-restore/): Shows how to customize backup and restore processes in Stash according to your needs. + +- **Managed Backup** +Shows how backup and restore can be managed in some specific scenerios. + - [Dedicated Backup Namespace](/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace/): Shows you how to manage backup and restore from a dedicated namespace for targets of different namespaces using Stash. + - [Dedicated Storage Namespace](/docs/v2024.12.18/guides/managed-backup/dedicated-storage-namespace/): Shows you how to take backup and restore by keeping the storage resources (Repository and backend Secret) in a dedicated namespace using Stash. + +- [Platforms](/docs/v2024.12.18/guides/platforms/eks-irsa/): Shows how to use Stash to backup and restore volumes of a Kubernetes workload running in different platforms. +- [Monitoring](/docs/v2024.12.18/guides/monitoring/overview/): Shows how Prometheus monitoring works with Stash, what metrics Stash exports, and how to enable monitoring. +- [Hooks](/docs/v2024.12.18/guides/hooks/overview/): Shows how to execute different actions before/after the backup/restore process. +- [CLI](/docs/v2024.12.18/guides/cli/kubectl-plugin/): Shows how to manage Stash objects quickly and easily using Stash `kubectl` plugin. +- [Troubleshooting](/docs/v2024.12.18/guides/troubleshooting/how-to-troubleshoot/): Gives an overview of how you can gather the necessary information to identify the issue that causes the backup/restore failure. +- [Security](/docs/v2024.12.18/guides/security/rbac/): Describes different built-in cluster security support by Stash. + +We're always looking for help improving our documentation, so please don't hesitate to [file an issue](https://github.com/stashed/project/issues/new) if you see some problem. diff --git a/content/docs/v2024.12.18/_index.md b/content/docs/v2024.12.18/_index.md new file mode 100644 index 0000000000..4737991f2c --- /dev/null +++ b/content/docs/v2024.12.18/_index.md @@ -0,0 +1,77 @@ +--- +title: Docs | Stash +description: Stash Docs +menu: + docs_v2024.12.18: + identifier: welcome + name: Welcome + weight: 10 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/acknowledgement.md b/content/docs/v2024.12.18/acknowledgement.md new file mode 100644 index 0000000000..b507d37ed7 --- /dev/null +++ b/content/docs/v2024.12.18/acknowledgement.md @@ -0,0 +1,85 @@ +--- +title: Acknowledgement | Stash +description: Acknowledgement +menu: + docs_v2024.12.18: + identifier: acknowledgement-stash + name: Acknowledgement + parent: welcome + weight: 1010 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/acknowledgement/ +aliases: +- /docs/v2024.12.18/acknowledgement/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Acknowledgement + - Many thanks to [Alexander Neumann](https://github.com/fd0) for [Restic](https://restic.net) project. diff --git a/content/docs/v2024.12.18/addons/_index.md b/content/docs/v2024.12.18/addons/_index.md new file mode 100644 index 0000000000..c9b55172ac --- /dev/null +++ b/content/docs/v2024.12.18/addons/_index.md @@ -0,0 +1,77 @@ +--- +title: Addons | Stash +menu: + docs_v2024.12.18: + identifier: stash-addons + name: Addons + weight: 60 + pre: dropdown +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/addons/elasticsearch/README.md b/content/docs/v2024.12.18/addons/elasticsearch/README.md new file mode 100644 index 0000000000..2260bba65b --- /dev/null +++ b/content/docs/v2024.12.18/addons/elasticsearch/README.md @@ -0,0 +1,109 @@ +--- +title: Elasticsearch Addon Overview | Stash +description: Elasticsearch Addon Overview | Stash +menu: + docs_v2024.12.18: + identifier: stash-elasticsearch-readme + name: Readme + parent: stash-elasticsearch + weight: -1 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +url: /docs/v2024.12.18/addons/elasticsearch/ +aliases: +- /docs/v2024.12.18/addons/elasticsearch/README/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash Elasticsearch Addon + +Stash 0.9.0+ supports extending its functionality through addons. Stash Elasticsearch addon enables Stash to backup and restore Elasticsearch databases. + +This guide will give you an overview of which Elasticsearch versions are supported and how the docs are organized. + +## Available Elasticsearch Addon Versions + +Stash has the following addon versions for Elasticsearch: + +{{< versionlist "elasticsearch">}} + +Here, the addon follows `M.M.P` versioning scheme where `M.M.P` (Major.Minor.Patch) represents the respective database version. + +## Addon Version Compatibility + +Any addon with matching major version with the database version should be able to take backup of that database. For example, Elasticsearch addon with version `7.x.x` should be able take backup of any Elasticsearch of `7.x.x` series. However, this might not be true for some versions. In that case, we will have separate addon for that version. + +## Documentation Overview + +Stash Elasticsearch documentations are organized as below: + +- [How does it work?](/docs/v2024.12.18/addons/elasticsearch/overview/) gives an overview of how backup and restore process for Elasticsearch database works in Stash. +- [KubeDB managed Elasticsearch](/docs/v2024.12.18/addons/elasticsearch/kubedb/) shows how to backup and restore a KubeDB managed Elasticsearch database. +- [Auto-Backup](/docs/v2024.12.18/addons/elasticsearch/auto-backup/) shows how to configure a generic backup template for all the Elasticsearch databases of a cluster. +- [Customizing Backup & Restore Process](/docs/v2024.12.18/addons/elasticsearch/customization/) shows how to customize the backup & restore process. diff --git a/content/docs/v2024.12.18/addons/elasticsearch/_index.md b/content/docs/v2024.12.18/addons/elasticsearch/_index.md new file mode 100644 index 0000000000..cec70e11c7 --- /dev/null +++ b/content/docs/v2024.12.18/addons/elasticsearch/_index.md @@ -0,0 +1,77 @@ +--- +title: Stash Elasticsearch Addon +menu: + docs_v2024.12.18: + identifier: stash-elasticsearch + name: Elasticsearch + parent: stash-addons + weight: 20 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/addons/elasticsearch/auto-backup/examples/backupblueprint.yaml b/content/docs/v2024.12.18/addons/elasticsearch/auto-backup/examples/backupblueprint.yaml new file mode 100644 index 0000000000..9877ccb0bf --- /dev/null +++ b/content/docs/v2024.12.18/addons/elasticsearch/auto-backup/examples/backupblueprint.yaml @@ -0,0 +1,28 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupBlueprint +metadata: + name: elasticsearch-backup-template +spec: + # ============== Blueprint for Repository ========================== + backend: + gcs: + bucket: stash-testing + prefix: stash-backup/${TARGET_NAMESPACE}/${TARGET_APP_RESOURCE}/${TARGET_NAME} + storageSecretName: gcs-secret + # ============== Blueprint for BackupConfiguration ================= + task: + name: elasticsearch-backup-7.3.2 + schedule: "*/5 * * * *" + interimVolumeTemplate: + metadata: + name: ${TARGET_APP_RESOURCE}-${TARGET_NAME} # To ensure that the PVC names are unique for different database + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/elasticsearch/auto-backup/examples/es-demo-2.yaml b/content/docs/v2024.12.18/addons/elasticsearch/auto-backup/examples/es-demo-2.yaml new file mode 100644 index 0000000000..f7a7a0668d --- /dev/null +++ b/content/docs/v2024.12.18/addons/elasticsearch/auto-backup/examples/es-demo-2.yaml @@ -0,0 +1,18 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Elasticsearch +metadata: + name: es-demo-2 + namespace: demo-2 + annotations: + stash.appscode.com/backup-blueprint: elasticsearch-backup-template + stash.appscode.com/schedule: "*/3 * * * *" +spec: + version: xpack-7.9.1-v1 + replicas: 1 + storageType: Durable + storage: + resources: + requests: + storage: 1Gi + storageClassName: standard + terminationPolicy: WipeOut diff --git a/content/docs/v2024.12.18/addons/elasticsearch/auto-backup/examples/es-demo-3.yaml b/content/docs/v2024.12.18/addons/elasticsearch/auto-backup/examples/es-demo-3.yaml new file mode 100644 index 0000000000..4779725642 --- /dev/null +++ b/content/docs/v2024.12.18/addons/elasticsearch/auto-backup/examples/es-demo-3.yaml @@ -0,0 +1,18 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Elasticsearch +metadata: + name: es-demo-3 + namespace: demo-3 + annotations: + stash.appscode.com/backup-blueprint: elasticsearch-backup-template + params.stash.appscode.com/args: --ignoreType=settings,template +spec: + version: xpack-7.9.1-v1 + replicas: 1 + storageType: Durable + storage: + resources: + requests: + storage: 1Gi + storageClassName: standard + terminationPolicy: WipeOut diff --git a/content/docs/v2024.12.18/addons/elasticsearch/auto-backup/examples/es-demo.yaml b/content/docs/v2024.12.18/addons/elasticsearch/auto-backup/examples/es-demo.yaml new file mode 100644 index 0000000000..61bc84d5b6 --- /dev/null +++ b/content/docs/v2024.12.18/addons/elasticsearch/auto-backup/examples/es-demo.yaml @@ -0,0 +1,17 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Elasticsearch +metadata: + name: es-demo + namespace: demo + annotations: + stash.appscode.com/backup-blueprint: elasticsearch-backup-template +spec: + version: xpack-7.9.1-v1 + replicas: 1 + storageType: Durable + storage: + resources: + requests: + storage: 1Gi + storageClassName: standard + terminationPolicy: WipeOut diff --git a/content/docs/v2024.12.18/addons/elasticsearch/auto-backup/images/es-demo-2.png b/content/docs/v2024.12.18/addons/elasticsearch/auto-backup/images/es-demo-2.png new file mode 100644 index 0000000000..b4d3b419a6 Binary files /dev/null and b/content/docs/v2024.12.18/addons/elasticsearch/auto-backup/images/es-demo-2.png differ diff --git a/content/docs/v2024.12.18/addons/elasticsearch/auto-backup/images/es-demo-3.png b/content/docs/v2024.12.18/addons/elasticsearch/auto-backup/images/es-demo-3.png new file mode 100644 index 0000000000..53b7200d5d Binary files /dev/null and b/content/docs/v2024.12.18/addons/elasticsearch/auto-backup/images/es-demo-3.png differ diff --git a/content/docs/v2024.12.18/addons/elasticsearch/auto-backup/images/es-demo.png b/content/docs/v2024.12.18/addons/elasticsearch/auto-backup/images/es-demo.png new file mode 100644 index 0000000000..86d770d37c Binary files /dev/null and b/content/docs/v2024.12.18/addons/elasticsearch/auto-backup/images/es-demo.png differ diff --git a/content/docs/v2024.12.18/addons/elasticsearch/auto-backup/index.md b/content/docs/v2024.12.18/addons/elasticsearch/auto-backup/index.md new file mode 100644 index 0000000000..6f6cc98b6a --- /dev/null +++ b/content/docs/v2024.12.18/addons/elasticsearch/auto-backup/index.md @@ -0,0 +1,760 @@ +--- +title: Elasticsearch Auto-Backup | Stash +description: Backup Elasticsearch using Stash Auto-Backup +menu: + docs_v2024.12.18: + identifier: stash-elasticsearch-auto-backup + name: Auto-Backup + parent: stash-elasticsearch + weight: 30 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup Elasticsearch using Stash Auto-Backup + +Stash can be configured to automatically backup any Elasticsearch database in your cluster. Stash enables cluster administrators to deploy backup blueprints ahead of time so that the database owners can easily backup their database with just a few annotations. + +In this tutorial, we are going to show how you can configure a backup blueprint for Elasticsearch databases in your cluster and backup them with few annotations. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. +- Install Stash in your cluster following the steps [here](/docs/v2024.12.18/setup/install/stash/). +- Install [KubeDB](https://kubedb.com) in your cluster following the steps [here](https://kubedb.com/docs/latest/setup/). This step is optional. You can deploy your database using any method you want. +- If you are not familiar with how Stash backup and restore Elasticsearch databases, please check the following guide [here](/docs/v2024.12.18/addons/elasticsearch/overview/). +- If you are not familiar with how auto-backup works in Stash, please check the following guide [here](/docs/v2024.12.18/guides/auto-backup/overview/). +- If you are not familiar with the available auto-backup options for databases in Stash, please check the following guide [here](/docs/v2024.12.18/guides/auto-backup/database/). + +You should be familiar with the following `Stash` concepts: + +- [BackupBlueprint](/docs/v2024.12.18/concepts/crds/backupblueprint/) +- [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) +- [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) +- [Repository](/docs/v2024.12.18/concepts/crds/repository/) +- [Function](/docs/v2024.12.18/concepts/crds/function/) +- [Task](/docs/v2024.12.18/concepts/crds/task/) + +In this tutorial, we are going to show backup of three different Elasticsearch databases on three different namespaces named `demo`, `demo-2`, and `demo-3`. Create the namespaces as below if you haven't done it already. + +```bash +❯ kubectl create ns demo +namespace/demo created + +❯ kubectl create ns demo-2 +namespace/demo-2 created + +❯ kubectl create ns demo-3 +namespace/demo-3 created +``` + +When you install Stash, it will automatically install the necessary addon to backup databases. Make sure you have installed the Elasticsearch addon for Stash. + +```bash +❯ kubectl get tasks.stash.appscode.com | grep elasticsearch +elasticsearch-backup-5.6.4 4d4h +elasticsearch-backup-6.2.4 4d4h +elasticsearch-backup-6.3.0 4d4h +elasticsearch-backup-6.4.0 4d4h +elasticsearch-backup-6.5.3 4d4h +elasticsearch-backup-6.8.0 4d4h +elasticsearch-backup-7.2.0 4d4h +elasticsearch-backup-7.3.2 4d4h +elasticsearch-restore-5.6.4 4d4h +elasticsearch-restore-6.2.4 4d4h +elasticsearch-restore-6.3.0 4d4h +elasticsearch-restore-6.4.0 4d4h +elasticsearch-restore-6.5.3 4d4h +elasticsearch-restore-6.8.0 4d4h +elasticsearch-restore-7.2.0 4d4h +elasticsearch-restore-7.3.2 4d4h +``` + +## Prepare Backup Blueprint + +To backup an Elasticsearch database using Stash, you have to create a `Secret` containing the backend credentials, a `Repository` containing the backend information, and a `BackupConfiguration` containing the schedule and target information. A `BackupBlueprint` allows you to specify a template for the `Repository` and the `BackupConfiguration`. + +The `BackupBlueprint` is a non-namespaced CRD. So, once you have created a `BackupBlueprint`, you can use it to backup any Elasticsearch database of any namespace just by creating the storage `Secret` in that namespace and adding few annotations to your Elasticsearch CRO. Then, Stash will automatically create a `Repository` and a `BackupConfiguration` according to the template to backup the database. + +Below is the `BackupBlueprint` object that we are going to use in this tutorial, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupBlueprint +metadata: + name: elasticsearch-backup-template +spec: + # ============== Blueprint for Repository ========================== + backend: + gcs: + bucket: stash-testing + prefix: stash-backup/${TARGET_NAMESPACE}/${TARGET_APP_RESOURCE}/${TARGET_NAME} + storageSecretName: gcs-secret + # ============== Blueprint for BackupConfiguration ================= + task: + name: elasticsearch-backup-7.3.2 + schedule: "*/5 * * * *" + interimVolumeTemplate: + metadata: + name: ${TARGET_APP_RESOURCE}-${TARGET_NAME} # To ensure that the PVC names are unique for different database + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Here, we are using a GCS bucket as our backend. We are providing `gcs-secret` at the `storageSecretName` field. Hence, we have to create a secret named `gcs-secret` with the access credentials of our bucket in every namespace where we want to enable backup through this blueprint. + +Notice the `prefix` field of `backend` section. We have used some variables in form of `${VARIABLE_NAME}`. Stash will automatically resolve those variables from the database information to make the backend prefix unique for each database instance. + +We have also used some variables in `name` field of the `interimVolumeTemplate` section. This is to ensure that the generated PVC name becomes unique for the database instances. + +Let's create the `BackupBlueprint` we have shown above, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/elasticsearch/auto-backup/examples/backupblueprint.yaml +backupblueprint.stash.appscode.com/elasticsearch-backup-template created +``` + +Now, we are ready to backup our Elasticsearch databases using few annotations. You can check available auto-backup annotations for a databases from [here](/docs/v2024.12.18/guides/auto-backup/database/#available-auto-backup-annotations-for-database). + +## Auto-backup with default configurations + +In this section, we are going to backup an Elasticsearch database of `demo` namespace. We are going to use the default configurations specified in the `BackupBlueprint`. + +### Create Storage Secret + +At first, let's create the `gcs-secret` in `demo` namespace with the access credentials to our GCS bucket. + +```bash +❯ echo -n 'changeit' > RESTIC_PASSWORD +❯ echo -n '' > GOOGLE_PROJECT_ID +❯ cat downloaded-sa-key.json > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +❯ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +### Create Database + +Now, we are going to create an Elasticsearch CRO in `demo` namespace. Below is the YAML of the Elasticsearch object that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Elasticsearch +metadata: + name: es-demo + namespace: demo + annotations: + stash.appscode.com/backup-blueprint: elasticsearch-backup-template +spec: + version: xpack-7.9.1-v1 + replicas: 1 + storageType: Durable + storage: + resources: + requests: + storage: 1Gi + storageClassName: standard + terminationPolicy: WipeOut +``` + +Notice the `annotations` section. We are pointing to the `BackupBlueprint` that we have created earlier though `stash.appscode.com/backup-blueprint` annotation. Stash will watch this annotation and create a `Repository` and a `BackupConfiguration` according to the `BackupBlueprint`. + +Let's create the above Elasticsearch CRO, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/elasticsearch/auto-backup/examples/es-demo.yaml +elasticsearch.kubedb.com/sample-elasticsearch created +``` + +### Verify Auto-backup configured + +In this section, we are going to verify whether Stash has created the respective `Repository` and `BackupConfiguration` for our Elasticsearch database we have just deployed or not. + +#### Verify Repository + +At first, let's verify whether Stash has created a `Repository` for our Elasticsearch or not. + +```bash +❯ kubectl get repository -n demo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +app-es-demo 5s +``` + +Now, let's check the YAML of the `Repository`. + +```yaml +❯ kubectl get repository -n demo app-es-demo -o yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: +... + name: app-es-demo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: stash-backup/demo/elasticsearch/es-demo + storageSecretName: gcs-secret +``` + +Here, you can see that Stash has resolved the variables in `prefix` field and substituted them with the equivalent information from this database. + +#### Verify BackupConfiguration + +If everything goes well, Stash should create a `BackupConfiguration` for our ElasticSearch in `demo` namespace and the phase of that `BackupConfiguration` should be `Ready`. Verify the `BackupConfiguration` crd by the following command, + +```bash +❯ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +app-es-demo elasticsearch-backup-7.3.2 */5 * * * * Ready 12s +``` + +Now, let's check the YAML of the `BackupConfiguration`. + +```yaml +❯ kubectl get backupconfiguration -n demo app-es-demo -o yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: app-es-demo + namespace: demo + ... +spec: + driver: Restic + interimVolumeTemplate: + metadata: + name: elasticsearch-es-demo + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + storageClassName: standard + status: {} + repository: + name: app-es-demo + retentionPolicy: + keepLast: 5 + name: keep-last-5 + prune: true + runtimeSettings: {} + schedule: '*/5 * * * *' + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: es-demo + task: + name: elasticsearch-backup-7.3.2 + tempDir: {} +status: + conditions: + - lastTransitionTime: "2021-02-12T11:46:53Z" + message: Repository demo/app-es-demo exist. + reason: RepositoryAvailable + status: "True" + type: RepositoryFound + - lastTransitionTime: "2021-02-12T11:46:53Z" + message: Backend Secret demo/gcs-secret exist. + reason: BackendSecretAvailable + status: "True" + type: BackendSecretFound + - lastTransitionTime: "2021-02-12T11:46:53Z" + message: Backup target appcatalog.appscode.com/v1alpha1 appbinding/es-demo found. + reason: TargetAvailable + status: "True" + type: BackupTargetFound + - lastTransitionTime: "2021-02-12T11:46:53Z" + message: Successfully created backup triggering CronJob. + reason: CronJobCreationSucceeded + status: "True" + type: CronJobCreated + observedGeneration: 1 +``` + +Notice the `interimVolumeTemplate` section. The variables of `name` field have been substituted by the equivalent information from the database. + +Also, notice the `target` section. Stash has automatically added the Elasticsearch as the target of this `BackupConfiguration`. + +#### Verify Backup + +Now, let's wait for a backup run to complete. You can watch for `BackupSession` as below, + +```bash +❯ kubectl get backupsession -n demo -w +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +app-es-demo-1613130605 BackupConfiguration app-es-demo 0s +app-es-demo-1613130605 BackupConfiguration app-es-demo Running 10s +app-es-demo-1613130605 BackupConfiguration app-es-demo Succeeded 46s +``` + +Once the backup has been completed successfully, you should see the backed up data has been stored in the bucket at the directory pointed by the `prefix` field of the `Repository`. + +
+ Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +## Auto-backup with a custom schedule + +In this section, we are going to backup an Elasticsearch database of `demo-2` namespace. This time, we are going to overwrite the default schedule used in the `BackupBlueprint`. + +### Create Storage Secret + +At first, let's create the `gcs-secret` in `demo-2` namespace with the access credentials to our GCS bucket. + +```bash +❯ kubectl create secret generic -n demo-2 gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +### Create Database + +Now, we are going to create an Elasticsearch CRO in `demo-2` namespace. Below is the YAML of the Elasticsearch object that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Elasticsearch +metadata: + name: es-demo-2 + namespace: demo-2 + annotations: + stash.appscode.com/backup-blueprint: elasticsearch-backup-template + stash.appscode.com/schedule: "*/3 * * * *" +spec: + version: xpack-7.9.1-v1 + replicas: 1 + storageType: Durable + storage: + resources: + requests: + storage: 1Gi + storageClassName: standard + terminationPolicy: WipeOut +``` + +Notice the `annotations` section. This time, we have passed a schedule via `stash.appscode.com/schedule` annotation along with the `stash.appscode.com/backup-blueprint` annotation. + +Let's create the above Elasticsearch CRO, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/elasticsearch/auto-backup/examples/es-demo-2.yaml +elasticsearch.kubedb.com/es-demo-2 created +``` + +### Verify Auto-backup configured + +Now, let's verify whether the auto-backup has been configured properly or not. + +#### Verify Repository + +At first, let's verify whether Stash has created a `Repository` for our Elasticsearch or not. + +```bash +❯ kubectl get repository -n demo-2 +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +app-es-demo-2 25s +``` + +Now, let's check the YAML of the `Repository`. + +```yaml +❯ kubectl get repository -n demo-2 app-es-demo-2 -o yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: app-es-demo-2 + namespace: demo-2 + ... +spec: + backend: + gcs: + bucket: stash-testing + prefix: stash-backup/demo-2/elasticsearch/es-demo-2 + storageSecretName: gcs-secret +``` + +Here, you can see that Stash has resolved the variables in `prefix` field and substituted them with the equivalent information from this new database. + +#### Verify BackupConfiguration + +If everything goes well, Stash should create a `BackupConfiguration` for our ElasticSearch in `demo-2` namespace and the phase of that `BackupConfiguration` should be `Ready`. Verify the `BackupConfiguration` crd by the following command, + + +```bash +❯ kubectl get backupconfiguration -n demo-2 +NAME TASK SCHEDULE PAUSED PHASE AGE +app-es-demo-2 elasticsearch-backup-7.3.2 */3 * * * * Ready 77s +``` + +Now, let's check the YAML of the `BackupConfiguration`. + +```yaml +❯ kubectl get backupconfiguration -n demo-2 app-es-demo-2 -o yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: app-es-demo-2 + namespace: demo-2 + ... +spec: + driver: Restic + interimVolumeTemplate: + metadata: + name: elasticsearch-es-demo-2 + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + storageClassName: standard + status: {} + repository: + name: app-es-demo-2 + retentionPolicy: + keepLast: 5 + name: keep-last-5 + prune: true + runtimeSettings: {} + schedule: '*/3 * * * *' + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: es-demo-2 + task: + name: elasticsearch-backup-7.3.2 + tempDir: {} +status: + conditions: + - lastTransitionTime: "2021-02-12T12:24:07Z" + message: Repository demo-2/app-es-demo-2 exist. + reason: RepositoryAvailable + status: "True" + type: RepositoryFound + - lastTransitionTime: "2021-02-12T12:24:07Z" + message: Backend Secret demo-2/gcs-secret exist. + reason: BackendSecretAvailable + status: "True" + type: BackendSecretFound + - lastTransitionTime: "2021-02-12T12:24:07Z" + message: Backup target appcatalog.appscode.com/v1alpha1 appbinding/es-demo-2 found. + reason: TargetAvailable + status: "True" + type: BackupTargetFound + - lastTransitionTime: "2021-02-12T12:24:07Z" + message: Successfully created backup triggering CronJob. + reason: CronJobCreationSucceeded + status: "True" + type: CronJobCreated + observedGeneration: 1 +``` + +Notice the `schedule` section. This time the `BackupConfiguration` has been created with the schedule we have provided via annotation. + +Also, notice the `target` section. Stash has automatically added the new Elasticsearch as the target of this `BackupConfiguration`. + +#### Verify Backup + +Now, let's wait for a backup run to complete. You can watch for `BackupSession` as below, + +```bash +❯ kubectl get backupsession -n demo-2 -w +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +app-es-demo-2-1613132831 BackupConfiguration app-es-demo-2 0s +app-es-demo-2-1613132831 BackupConfiguration app-es-demo-2 Running 17s +app-es-demo-2-1613132831 BackupConfiguration app-es-demo-2 Succeeded 41s +``` + +Once the backup has been completed successfully, you should see that Stash has created a new directory as pointed by the `prefix` field of the new `Repository` and stored the backed up data there. + +
+ Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +## Auto-backup with custom parameters + +In this section, we are going to backup an Elasticsearch database of `demo-3` namespace. This time, we are going to pass some parameters for the Task through the annotations. + +### Create Storage Secret + +At first, let's create the `gcs-secret` in `demo-3` namespace with the access credentials to our GCS bucket. + +```bash +❯ kubectl create secret generic -n demo-3 gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +### Create Database + +Now, we are going to create an Elasticsearch CRO in `demo-3` namespace. Below is the YAML of the Elasticsearch object that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Elasticsearch +metadata: + name: es-demo-3 + namespace: demo-3 + annotations: + stash.appscode.com/backup-blueprint: elasticsearch-backup-template + params.stash.appscode.com/args: --ignoreType=settings,template +spec: + version: xpack-7.9.1-v1 + replicas: 1 + storageType: Durable + storage: + resources: + requests: + storage: 1Gi + storageClassName: standard + terminationPolicy: WipeOut +``` + +Notice the `annotations` section. This time, we have passed an argument via `params.stash.appscode.com/args` annotation along with the `stash.appscode.com/backup-blueprint` annotation. + +Let's create the above Elasticsearch CRO, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/elasticsearch/auto-backup/examples/es-demo-3.yaml +elasticsearch.kubedb.com/es-demo-3 created +``` + +### Verify Auto-backup configured + +Now, let's verify whether the auto-backup resources has been created or not. + +#### Verify Repository + +At first, let's verify whether Stash has created a `Repository` for our Elasticsearch or not. + +```bash +❯ kubectl get repository -n demo-3 +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +app-es-demo-3 23s +``` + +Now, let's check the YAML of the `Repository`. + +```yaml +❯ kubectl get repository -n demo-3 app-es-demo-3 -o yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: app-es-demo-3 + namespace: demo-3 + ... +spec: + backend: + gcs: + bucket: stash-testing + prefix: stash-backup/demo-3/elasticsearch/es-demo-3 + storageSecretName: gcs-secret +``` + +Here, you can see that Stash has resolved the variables in `prefix` field and substituted them with the equivalent information from this new database. + +#### Verify BackupConfiguration + +If everything goes well, Stash should create a `BackupConfiguration` for our ElasticSearch in `demo-3` namespace and the phase of that `BackupConfiguration` should be `Ready`. Verify the `BackupConfiguration` crd by the following command, + +```bash +❯ kubectl get backupconfiguration -n demo-3 +NAME TASK SCHEDULE PAUSED PHASE AGE +app-es-demo-3 elasticsearch-backup-7.3.2 */5 * * * * Ready 84s +``` + +Now, let's check the YAML of the `BackupConfiguration`. + +```yaml +❯ kubectl get backupconfiguration -n demo-3 app-es-demo-3 -o yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: app-es-demo-3 + namespace: demo-3 + ... +spec: + driver: Restic + interimVolumeTemplate: + metadata: + name: elasticsearch-es-demo-3 + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + storageClassName: standard + status: {} + repository: + name: app-es-demo-3 + retentionPolicy: + keepLast: 5 + name: keep-last-5 + prune: true + runtimeSettings: {} + schedule: '*/5 * * * *' + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: es-demo-3 + task: + name: elasticsearch-backup-7.3.2 + params: + - name: args + value: --ignoreType=settings,template + tempDir: {} +status: + conditions: + - lastTransitionTime: "2021-02-12T12:39:14Z" + message: Repository demo-3/app-es-demo-3 exist. + reason: RepositoryAvailable + status: "True" + type: RepositoryFound + - lastTransitionTime: "2021-02-12T12:39:14Z" + message: Backend Secret demo-3/gcs-secret exist. + reason: BackendSecretAvailable + status: "True" + type: BackendSecretFound + - lastTransitionTime: "2021-02-12T12:39:14Z" + message: Backup target appcatalog.appscode.com/v1alpha1 appbinding/es-demo-3 found. + reason: TargetAvailable + status: "True" + type: BackupTargetFound + - lastTransitionTime: "2021-02-12T12:39:14Z" + message: Successfully created backup triggering CronJob. + reason: CronJobCreationSucceeded + status: "True" + type: CronJobCreated + observedGeneration: 1 +``` + +Notice the `task` section. The `args` parameter that we had passed via annotations has been added to the `params` section. + +Also, notice the `target` section. Stash has automatically added the new Elasticsearch as the target of this `BackupConfiguration`. + +#### Verify Backup + +Now, let's wait for a backup run to complete. You can watch for `BackupSession` as below, + +```bash +❯ kubectl get backupsession -n demo-3 -w +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +app-es-demo-3-1613133604 BackupConfiguration app-es-demo-3 0s +app-es-demo-3-1613133604 BackupConfiguration app-es-demo-3 Running 5s +app-es-demo-3-1613133604 BackupConfiguration app-es-demo-3 Succeeded 48s +``` + +Once the backup has been completed successfully, you should see that Stash has created a new directory as pointed by the `prefix` field of the new `Repository` and stored the backed up data there. + +
+ Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +## Cleanup + +To cleanup the resources crated by this tutorial, run the following commands, + +```bash +❯ kubectl delete -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/elasticsearch/auto-backup/examples/ +backupblueprint.stash.appscode.com "elasticsearch-backup-template" deleted +elasticsearch.kubedb.com "es-demo-2" deleted +elasticsearch.kubedb.com "es-demo-3" deleted +elasticsearch.kubedb.com "es-demo" deleted + +❯ kubectl delete repository -n demo --all +repository.stash.appscode.com "app-es-demo" deleted +❯ kubectl delete repository -n demo-2 --all +repository.stash.appscode.com "app-es-demo-2" deleted +❯ kubectl delete repository -n demo-3 --all +repository.stash.appscode.com "app-es-demo-3" deleted +``` diff --git a/content/docs/v2024.12.18/addons/elasticsearch/customization/examples/backup/ignore-sg-index.yaml b/content/docs/v2024.12.18/addons/elasticsearch/customization/examples/backup/ignore-sg-index.yaml new file mode 100644 index 0000000000..3bba4547e5 --- /dev/null +++ b/content/docs/v2024.12.18/addons/elasticsearch/customization/examples/backup/ignore-sg-index.yaml @@ -0,0 +1,32 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-elasticsearch-backup + namespace: demo +spec: + schedule: "*/2 * * * *" + task: + name: elasticsearch-backup-7.3.2 + params: + - name: args + value: --match=^(?![.])(?!searchguard).+ --ignoreType=template + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-elasticsearch + interimVolumeTemplate: + metadata: + name: stash-tmp-backup-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/elasticsearch/customization/examples/backup/multi-retention-policy.yaml b/content/docs/v2024.12.18/addons/elasticsearch/customization/examples/backup/multi-retention-policy.yaml new file mode 100644 index 0000000000..77b2a958f6 --- /dev/null +++ b/content/docs/v2024.12.18/addons/elasticsearch/customization/examples/backup/multi-retention-policy.yaml @@ -0,0 +1,33 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-elasticsearch-backup + namespace: demo +spec: + schedule: "*/2 * * * *" + task: + name: elasticsearch-backup-7.3.2 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-elasticsearch + interimVolumeTemplate: + metadata: + name: stash-tmp-backup-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + retentionPolicy: + name: sample-es-retention + keepLast: 5 + keepDaily: 10 + keepWeekly: 20 + keepMonthly: 50 + keepYearly: 100 + prune: true diff --git a/content/docs/v2024.12.18/addons/elasticsearch/customization/examples/backup/passing-args.yaml b/content/docs/v2024.12.18/addons/elasticsearch/customization/examples/backup/passing-args.yaml new file mode 100644 index 0000000000..f20f381afc --- /dev/null +++ b/content/docs/v2024.12.18/addons/elasticsearch/customization/examples/backup/passing-args.yaml @@ -0,0 +1,32 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-elasticsearch-backup + namespace: demo +spec: + schedule: "*/2 * * * *" + task: + name: elasticsearch-backup-7.3.2 + params: + - name: args + value: --ignoreType=template,settings + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-elasticsearch + interimVolumeTemplate: + metadata: + name: stash-tmp-backup-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/elasticsearch/customization/examples/backup/resource-limit.yaml b/content/docs/v2024.12.18/addons/elasticsearch/customization/examples/backup/resource-limit.yaml new file mode 100644 index 0000000000..897917ee1c --- /dev/null +++ b/content/docs/v2024.12.18/addons/elasticsearch/customization/examples/backup/resource-limit.yaml @@ -0,0 +1,38 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-elasticsearch-backup + namespace: demo +spec: + schedule: "*/2 * * * *" + task: + name: elasticsearch-backup-7.3.2 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-elasticsearch + interimVolumeTemplate: + metadata: + name: stash-tmp-backup-storage + spec: + accessModes: ["ReadWriteOnce"] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + runtimeSettings: + container: + resources: + requests: + cpu: "200m" + memory: "1Gi" + limits: + cpu: "200m" + memory: "1Gi" + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/elasticsearch/customization/examples/backup/specific-user.yaml b/content/docs/v2024.12.18/addons/elasticsearch/customization/examples/backup/specific-user.yaml new file mode 100644 index 0000000000..3591c744c3 --- /dev/null +++ b/content/docs/v2024.12.18/addons/elasticsearch/customization/examples/backup/specific-user.yaml @@ -0,0 +1,34 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-elasticsearch-backup + namespace: demo +spec: + schedule: "*/2 * * * *" + task: + name: elasticsearch-backup-7.3.2 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-elasticsearch + interimVolumeTemplate: + metadata: + name: stash-tmp-backup-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + runtimeSettings: + pod: + securityContext: + runAsUser: 0 + runAsGroup: 0 + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/elasticsearch/customization/examples/restore/passing-args.yaml b/content/docs/v2024.12.18/addons/elasticsearch/customization/examples/restore/passing-args.yaml new file mode 100644 index 0000000000..412599ccfb --- /dev/null +++ b/content/docs/v2024.12.18/addons/elasticsearch/customization/examples/restore/passing-args.yaml @@ -0,0 +1,29 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-elasticsearch-restore + namespace: demo # this label is mandatory if you are using KubeDB to deploy the database. Otherwise, Elasticsearch crd will be stuck in `Provisioning` phase. +spec: + task: + name: elasticsearch-restore-7.3.2 + params: + - name: args + value: --ignoreType=template,settings + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-elasticsearch + interimVolumeTemplate: + metadata: + name: stash-tmp-restore-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/addons/elasticsearch/customization/examples/restore/resource-limit.yaml b/content/docs/v2024.12.18/addons/elasticsearch/customization/examples/restore/resource-limit.yaml new file mode 100644 index 0000000000..4361a9c942 --- /dev/null +++ b/content/docs/v2024.12.18/addons/elasticsearch/customization/examples/restore/resource-limit.yaml @@ -0,0 +1,35 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-elasticsearch-restore + namespace: demo +spec: + task: + name: elasticsearch-restore-7.3.2 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-elasticsearch + interimVolumeTemplate: + metadata: + name: stash-tmp-restore-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + runtimeSettings: + container: + resources: + requests: + cpu: "200m" + memory: "1Gi" + limits: + cpu: "200m" + memory: "1Gi" + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/addons/elasticsearch/customization/examples/restore/specific-snapshot.yaml b/content/docs/v2024.12.18/addons/elasticsearch/customization/examples/restore/specific-snapshot.yaml new file mode 100644 index 0000000000..9557382c35 --- /dev/null +++ b/content/docs/v2024.12.18/addons/elasticsearch/customization/examples/restore/specific-snapshot.yaml @@ -0,0 +1,26 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-elasticsearch-restore + namespace: demo +spec: + task: + name: elasticsearch-restore-7.3.2 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-elasticsearch + interimVolumeTemplate: + metadata: + name: stash-tmp-restore-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + rules: + - snapshots: [4bc21d6f] diff --git a/content/docs/v2024.12.18/addons/elasticsearch/customization/examples/restore/specific-user.yaml b/content/docs/v2024.12.18/addons/elasticsearch/customization/examples/restore/specific-user.yaml new file mode 100644 index 0000000000..8e30318117 --- /dev/null +++ b/content/docs/v2024.12.18/addons/elasticsearch/customization/examples/restore/specific-user.yaml @@ -0,0 +1,31 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-elasticsearch-restore + namespace: demo +spec: + task: + name: elasticsearch-restore-7.3.2 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-elasticsearch + interimVolumeTemplate: + metadata: + name: stash-tmp-restore-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + runtimeSettings: + pod: + securityContext: + runAsUser: 0 + runAsGroup: 0 + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/addons/elasticsearch/customization/index.md b/content/docs/v2024.12.18/addons/elasticsearch/customization/index.md new file mode 100644 index 0000000000..2842839ce6 --- /dev/null +++ b/content/docs/v2024.12.18/addons/elasticsearch/customization/index.md @@ -0,0 +1,465 @@ +--- +title: Elasticsearch Backup Customization | Stash +description: Customizing Elasticsearch Backup and Restore process with Stash +menu: + docs_v2024.12.18: + identifier: stash-elasticsearch-customization + name: Customizing Backup & Restore Process + parent: stash-elasticsearch + weight: 40 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Customizing Backup and Restore Process + +Stash provides rich customization supports for the backup and restore process to meet the requirements of various cluster configurations. This guide will show you some examples of these customizations. + +## Customizing Backup Process + +In this section, we are going to show you how to customize the backup process. Here, we are going to show some examples of providing arguments to the backup process, running the backup process as a specific user, ignoring some indexes during the backup process, etc. + +### Passing arguments to the backup process + +Stash Elasticsearch addon uses [multielasticdump](https://github.com/elasticsearch-dump/elasticsearch-dump#multielasticdump) for backup. You can pass arguments to the `multielasticdump` through `args` param under `task.params` section. + +The below example shows how you can pass the `--ignoreType` argument to ignore `template` and `settings` during backup. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-elasticsearch-backup + namespace: demo +spec: + schedule: "*/2 * * * *" + task: + name: elasticsearch-backup-7.3.2 + params: + - name: args + value: --ignoreType=template,settings + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-elasticsearch + interimVolumeTemplate: + metadata: + name: stash-tmp-backup-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +### Ignoring Search Guard Indexes + +If you are using the Search Guard variant for your Elasticsearch, you can pass a regex through the `--match` argument to ignore the Search Guard specific indexes during backup. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-elasticsearch-backup + namespace: demo +spec: + schedule: "*/2 * * * *" + task: + name: elasticsearch-backup-7.3.2 + params: + - name: args + value: --match=^(?![.])(?!searchguard).+ --ignoreType=template + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-elasticsearch + interimVolumeTemplate: + metadata: + name: stash-tmp-backup-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +### Running backup job as a specific user + +If your cluster requires running the backup job as a specific user, you can provide `securityContext` under `runtimeSettings.pod` section. The below example shows how you can run the backup job as the root user. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-elasticsearch-backup + namespace: demo +spec: + schedule: "*/2 * * * *" + task: + name: elasticsearch-backup-7.3.2 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-elasticsearch + interimVolumeTemplate: + metadata: + name: stash-tmp-backup-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + runtimeSettings: + pod: + securityContext: + runAsUser: 0 + runAsGroup: 0 + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +### Specifying Memory/CPU limit/request for the backup job + +If you want to specify the Memory/CPU limit/request for your backup job, you can specify `resources` field under `runtimeSettings.container` section. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-elasticsearch-backup + namespace: demo +spec: + schedule: "*/2 * * * *" + task: + name: elasticsearch-backup-7.3.2 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-elasticsearch + interimVolumeTemplate: + metadata: + name: stash-tmp-backup-storage + spec: + accessModes: ["ReadWriteOnce"] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + runtimeSettings: + container: + resources: + requests: + cpu: "200m" + memory: "1Gi" + limits: + cpu: "200m" + memory: "1Gi" + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +### Using multiple retention policies + +You can also specify multiple retention policies for your backed up data. For example, you may want to keep few daily snapshots, few weekly snapshots, and few monthly snapshots, etc. You just need to pass the desired number with the respective key under the `retentionPolicy` section. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-elasticsearch-backup + namespace: demo +spec: + schedule: "*/2 * * * *" + task: + name: elasticsearch-backup-7.3.2 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-elasticsearch + interimVolumeTemplate: + metadata: + name: stash-tmp-backup-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + retentionPolicy: + name: sample-es-retention + keepLast: 5 + keepDaily: 10 + keepWeekly: 20 + keepMonthly: 50 + keepYearly: 100 + prune: true +``` + +To know more about the available options for retention policies, please visit [here](/docs/v2024.12.18/concepts/crds/backupconfiguration/#specretentionpolicy). + +## Customizing Restore Process + +Stash also uses `multielasticdump` during the restore process. In this section, we are going to show how you can pass arguments to the restore process, restore a specific snapshot, run restore job as a specific user, etc. + +### Passing arguments to the restore process + +Similar to the backup process, you can pass arguments to the restore process through the `args` params under `task.params` section. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-elasticsearch-restore + namespace: demo +spec: + task: + name: elasticsearch-restore-7.3.2 + params: + - name: args + value: --ignoreType=template,settings + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-elasticsearch + interimVolumeTemplate: + metadata: + name: stash-tmp-restore-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + rules: + - snapshots: [latest] +``` + +### Restore specific snapshot + +You can also restore a specific snapshot. At first, list the available snapshots as below, + +```bash +❯ kubectl get snapshots -n demo +NAME ID REPOSITORY HOSTNAME CREATED AT +gcs-repo-4bc21d6f 4bc21d6f gcs-repo host-0 2022-01-12T14:54:27Z +gcs-repo-f0ac7cbd f0ac7cbd gcs-repo host-0 2022-01-12T14:56:26Z +gcs-repo-9210ebb6 9210ebb6 gcs-repo host-0 2022-01-12T14:58:27Z +gcs-repo-0aff8890 0aff8890 gcs-repo host-0 2022-01-12T15:00:28Z +``` + +>You can also filter the snapshots as shown in the guide [here](https://stash.run/docs/{{< param "info.version" >}}/concepts/crds/snapshot/#working-with-snapshot). + +You can use the respective ID of the snapshot to restore a specific snapshot. + +The below example shows how you can pass a specific snapshot ID through the `snapshots` field of `rules` section. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-elasticsearch-restore + namespace: demo +spec: + task: + name: elasticsearch-restore-7.3.2 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-elasticsearch + interimVolumeTemplate: + metadata: + name: stash-tmp-restore-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + rules: + - snapshots: [4bc21d6f] +``` + +>Please, do not specify multiple snapshots here. Each snapshot represents a complete backup of your database. Multiple snapshots are only usable during file/directory restore. + +### Running restore job as a specific user + +You can provide `securityContext` under `runtimeSettings.pod` section to run the restore job as a specific user. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-elasticsearch-restore + namespace: demo +spec: + task: + name: elasticsearch-restore-7.3.2 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-elasticsearch + interimVolumeTemplate: + metadata: + name: stash-tmp-restore-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + runtimeSettings: + pod: + securityContext: + runAsUser: 0 + runAsGroup: 0 + rules: + - snapshots: [latest] +``` + +### Specifying Memory/CPU limit/request for the restore job + +Similar to the backup process, you can also provide `resources` field under the `runtimeSettings.container` section to limit the Memory/CPU for your restore job. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-elasticsearch-restore + namespace: demo +spec: + task: + name: elasticsearch-restore-7.3.2 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-elasticsearch + interimVolumeTemplate: + metadata: + name: stash-tmp-restore-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + runtimeSettings: + container: + resources: + requests: + cpu: "200m" + memory: "1Gi" + limits: + cpu: "200m" + memory: "1Gi" + rules: + - snapshots: [latest] +``` diff --git a/content/docs/v2024.12.18/addons/elasticsearch/kubedb/examples/backup/backupconfiguration.yaml b/content/docs/v2024.12.18/addons/elasticsearch/kubedb/examples/backup/backupconfiguration.yaml new file mode 100644 index 0000000000..e98bd012df --- /dev/null +++ b/content/docs/v2024.12.18/addons/elasticsearch/kubedb/examples/backup/backupconfiguration.yaml @@ -0,0 +1,33 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-es-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: elasticsearch-backup-7.3.2 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-es + interimVolumeTemplate: + metadata: + name: sample-es-backup-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + runtimeSettings: + pod: + securityContext: + fsGroup: 65534 + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/elasticsearch/kubedb/examples/backup/repository.yaml b/content/docs/v2024.12.18/addons/elasticsearch/kubedb/examples/backup/repository.yaml new file mode 100644 index 0000000000..73bc3914a8 --- /dev/null +++ b/content/docs/v2024.12.18/addons/elasticsearch/kubedb/examples/backup/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /demo/sample-es + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/addons/elasticsearch/kubedb/examples/elasticsearch/init_sample.yaml b/content/docs/v2024.12.18/addons/elasticsearch/kubedb/examples/elasticsearch/init_sample.yaml new file mode 100644 index 0000000000..1337e9b099 --- /dev/null +++ b/content/docs/v2024.12.18/addons/elasticsearch/kubedb/examples/elasticsearch/init_sample.yaml @@ -0,0 +1,41 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Elasticsearch +metadata: + name: init-sample + namespace: restored +spec: + version: opendistro-1.9.0-v1 + storageType: Durable + init: + waitForInitialRestore: true + topology: + master: + suffix: master + replicas: 1 + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + data: + suffix: data + replicas: 2 + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + ingest: + suffix: client + replicas: 2 + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi diff --git a/content/docs/v2024.12.18/addons/elasticsearch/kubedb/examples/elasticsearch/sample_es.yaml b/content/docs/v2024.12.18/addons/elasticsearch/kubedb/examples/elasticsearch/sample_es.yaml new file mode 100644 index 0000000000..253bafcec9 --- /dev/null +++ b/content/docs/v2024.12.18/addons/elasticsearch/kubedb/examples/elasticsearch/sample_es.yaml @@ -0,0 +1,39 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Elasticsearch +metadata: + name: sample-es + namespace: demo +spec: + version: xpack-7.9.1-v1 + storageType: Durable + topology: + master: + suffix: master + replicas: 1 + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + data: + suffix: data + replicas: 2 + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + ingest: + suffix: client + replicas: 2 + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi diff --git a/content/docs/v2024.12.18/addons/elasticsearch/kubedb/examples/restore/init_sample_restore.yaml b/content/docs/v2024.12.18/addons/elasticsearch/kubedb/examples/restore/init_sample_restore.yaml new file mode 100644 index 0000000000..7ec161d19e --- /dev/null +++ b/content/docs/v2024.12.18/addons/elasticsearch/kubedb/examples/restore/init_sample_restore.yaml @@ -0,0 +1,29 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: init-sample-restore + namespace: restored +spec: + task: + name: elasticsearch-restore-7.3.2 + params: + - name: args + value: --ignoreType=settings,template + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: init-sample + interimVolumeTemplate: + metadata: + name: init-sample-restore-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/addons/elasticsearch/kubedb/examples/restore/restoresession.yaml b/content/docs/v2024.12.18/addons/elasticsearch/kubedb/examples/restore/restoresession.yaml new file mode 100644 index 0000000000..66f783f215 --- /dev/null +++ b/content/docs/v2024.12.18/addons/elasticsearch/kubedb/examples/restore/restoresession.yaml @@ -0,0 +1,30 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-es-restore + namespace: demo +spec: + task: + name: elasticsearch-restore-7.3.2 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-es + interimVolumeTemplate: + metadata: + name: sample-es-restore-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + runtimeSettings: + pod: + securityContext: + fsGroup: 65534 + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/addons/elasticsearch/kubedb/images/sample-es-backup.png b/content/docs/v2024.12.18/addons/elasticsearch/kubedb/images/sample-es-backup.png new file mode 100644 index 0000000000..f902c53009 Binary files /dev/null and b/content/docs/v2024.12.18/addons/elasticsearch/kubedb/images/sample-es-backup.png differ diff --git a/content/docs/v2024.12.18/addons/elasticsearch/kubedb/index.md b/content/docs/v2024.12.18/addons/elasticsearch/kubedb/index.md new file mode 100644 index 0000000000..83e76764db --- /dev/null +++ b/content/docs/v2024.12.18/addons/elasticsearch/kubedb/index.md @@ -0,0 +1,1236 @@ +--- +title: Elasticsearch | Stash +description: Backup and restore Elasticsearch deployed with KubeDB +menu: + docs_v2024.12.18: + identifier: stash-elasticsearch-kubedb + name: KubeDB managed Elasticsearch + parent: stash-elasticsearch + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup and restore Elasticsearch database deployed with KubeDB + +Stash 0.9.0+ supports backup and restoration of Elasticsearch clusters. This guide will show you how you can backup and restore your KubeDB deployed Elasticsearch database using Stash. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. +- Install Stash in your cluster following the steps [here](/docs/v2024.12.18/setup/install/stash/). +- Install [KubeDB](https://kubedb.com) in your cluster following the steps [here](https://kubedb.com/docs/latest/setup/). +- If you are not familiar with how Stash backup and restore Elasticsearch databases, please check the following guide [here](/docs/v2024.12.18/addons/elasticsearch/overview/). + +You have to be familiar with following custom resources: + +- [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) +- [Function](/docs/v2024.12.18/concepts/crds/function/) +- [Task](/docs/v2024.12.18/concepts/crds/task/) +- [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) +- [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) +- [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + +To keep things isolated, we are going to use a separate namespace called `demo` throughout this tutorial. Create `demo` namespace if you haven't created it yet. + +```console +$ kubectl create ns demo +namespace/demo created +``` + +>Note: YAML files used in this tutorial are stored [here](https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/elasticsearch/kubedb/examples). + +## Prepare Elasticsearch + +In this section, we are going to deploy an Elasticsearch database using KubeDB. Then, we are going to insert some sample data into it. + +### Deploy Elasticsearch + +At first, let's deploy a sample Elasticsearch database. Below is the YAML of a sample Elasticsearch crd that we are going to create for this tutorial: + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Elasticsearch +metadata: + name: sample-es + namespace: demo +spec: + version: xpack-7.9.1-v1 + storageType: Durable + topology: + master: + suffix: master + replicas: 1 + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + data: + suffix: data + replicas: 2 + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + ingest: + suffix: client + replicas: 2 + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi +``` + +Let's create the above `Elasticsearch` object, + +```console +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/elasticsearch/kubedb/examples/elasticsearch/sample_es.yaml +elasticsearch.kubedb.com/sample-es created +``` + +KubeDB will create the necessary resources to deploy the Elasticsearch database according to the above specification. Let's wait until the database to be ready to use, + +```console +❯ kubectl get elasticsearch -n demo -w +NAME VERSION STATUS AGE +sample-es xpack-7.9.1-v1 Provisioning 89s +sample-es xpack-7.9.1-v1 Ready 5m26s +``` + +The database is in `Ready` state. It means the database is ready to accept connections. + +### Insert Sample Data + +In this section, we are going to create few indexes in the deployed Elasticsearch. At first, we are going to port-forward the respective Service so that we can connect with the database from our local machine. Then, we are going to insert some data into the Elasticsearch. + +#### Port-forward the Service + +KubeDB will create few Services to connect with the database. Let's see the Services created by KubeDB for our Elasticsearch, + +```bash +❯ kubectl get service -n demo +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +sample-es ClusterIP 10.108.129.195 9200/TCP 10m +sample-es-master ClusterIP None 9300/TCP 10m +sample-es-pods ClusterIP None 9200/TCP 10m +``` + +Here, we are going to use the `sample-es` Service to connect with the database. Now, let's port-forward the `sample-es` Service. Run the following command into a separate terminal. + +```bash +❯ kubectl port-forward -n demo service/sample-es 9200 +Forwarding from 127.0.0.1:9200 -> 9200 +Forwarding from [::1]:9200 -> 9200 +``` + +#### Export the Credentials + +KubeDB will create some Secrets for the database. Let's check which Secrets have been created by KubeDB for our `sample-es` Elasticsearch. + +```bash +❯ kubectl get secret -n demo | grep sample-es +sample-es-ca-cert kubernetes.io/tls 2 21m +sample-es-config Opaque 1 21m +sample-es-elastic-cred kubernetes.io/basic-auth 2 21m +sample-es-token-ctzn5 kubernetes.io/service-account-token 3 21m +sample-es-transport-cert kubernetes.io/tls 3 21m +``` + +Here, `sample-es-elastic-cred` contains the credentials require to connect with the database. Let's export the credentials as environment variable to our current shell so that we can easily environment variables to connect with the database. + +```bash +❯ export USER=$(kubectl get secrets -n demo sample-es-elastic-cred -o jsonpath='{.data.\username}' | base64 -d) +❯ export PASSWORD=$(kubectl get secrets -n demo sample-es-elastic-cred -o jsonpath='{.data.\password}' | base64 -d) +``` + +#### Insert data + +Now, let's create an index called `products` and insert some data into it. + +```bash +# Elasticsearch will automatically create the index if it does not exist already. +❯ curl -XPOST --user "$USER:$PASSWORD" "http://localhost:9200/products/_doc?pretty" -H 'Content-Type: application/json' -d' +{ + "name": "KubeDB", + "vendor": "AppsCode Inc.", + "description": "Database Operator for Kubernetes" +} +' + +# Let's insert another data into the "products" index. +❯ curl -XPOST --user "$USER:$PASSWORD" "http://localhost:9200/products/_doc?pretty" -H 'Content-Type: application/json' -d' +{ + "name": "Stash", + "vendor": "AppsCode Inc.", + "description": "Backup tool for Kubernetes workloads" +} +' +``` + +Let's create another index called `companies` and insert some data into it. + +```bash +❯ curl -XPOST --user "$USER:$PASSWORD" "http://localhost:9200/companies/_doc?pretty" -H 'Content-Type: application/json' -d' +{ + "name": "AppsCode Inc.", + "mission": "Accelerate the transition to Containers by building a Kubernetes-native Data Platform", + "products": ["KubeDB", "Stash", "KubeVault", "Kubeform", "ByteBuilders"] +} +' +``` + +Now, let's verify that the indexes have been created successfully. + +```bash +❯ curl -XGET --user "$USER:$PASSWORD" "http://localhost:9200/_cat/indices?v&s=index&pretty" +health status index uuid pri rep docs.count docs.deleted store.size pri.store.size +green open companies qs52L4xrShay14NPUExDNw 1 1 1 0 11.5kb 5.7kb +green open products 6aCd7y_kQf26sYG3QdY0ow 1 1 2 0 20.7kb 10.3kb +``` + +Also, let's verify the data in the indexes: + +```bash +# Verify the data in the "product" index. +❯ curl -XGET --user "$USER:$PASSWORD" "http://localhost:9200/products/_search?pretty" +{ + "took" : 354, + "timed_out" : false, + "_shards" : { + "total" : 1, + "successful" : 1, + "skipped" : 0, + "failed" : 0 + }, + "hits" : { + "total" : { + "value" : 2, + "relation" : "eq" + }, + "max_score" : 1.0, + "hits" : [ + { + "_index" : "products", + "_type" : "_doc", + "_id" : "3GyXa3cB55U52E6TvL8f", + "_score" : 1.0, + "_source" : { + "name" : "KubeDB", + "vendor" : "AppsCode Inc.", + "description" : "Database Operator for Kubernetes" + } + }, + { + "_index" : "products", + "_type" : "_doc", + "_id" : "3WyYa3cB55U52E6Tc7_G", + "_score" : 1.0, + "_source" : { + "name" : "Stash", + "vendor" : "AppsCode Inc.", + "description" : "Backup tool for Kubernetes workloads" + } + } + ] + } +} + +# Verify data in the "companies" index. +❯ curl -XGET --user "$USER:$PASSWORD" "http://localhost:9200/companies/_search?pretty" +{ + "took" : 172, + "timed_out" : false, + "_shards" : { + "total" : 1, + "successful" : 1, + "skipped" : 0, + "failed" : 0 + }, + "hits" : { + "total" : { + "value" : 1, + "relation" : "eq" + }, + "max_score" : 1.0, + "hits" : [ + { + "_index" : "companies", + "_type" : "_doc", + "_id" : "3myya3cB55U52E6TE78a", + "_score" : 1.0, + "_source" : { + "name" : "AppsCode Inc.", + "mission" : "Accelerate the transition to Containers by building a Kubernetes-native Data Platform", + "products" : [ + "KubeDB", + "Stash", + "KubeVault", + "Kubeform", + "ByteBuilders" + ] + } + } + ] + } +} +``` + +We now have sample data in our database. In the next section, we are going to prepare the necessary resources to backup these sample data. + +## Prepare for Backup + +In this section, we are going to prepare our cluster for backup. + +### Ensure Elasticsearch Addons + +When you install Stash, it will automatically install the pre-build database addons. Make sure the addons for Elasticsearch has been installed using the following command. + +```bash +❯ kubectl get tasks.stash.appscode.com | grep elasticsearch +elasticsearch-backup-5.6.4 3d2h +elasticsearch-backup-6.2.4 3d2h +elasticsearch-backup-6.3.0 3d2h +elasticsearch-backup-6.4.0 3d2h +elasticsearch-backup-6.5.3 3d2h +elasticsearch-backup-6.8.0 3d2h +elasticsearch-backup-7.2.0 3d2h +elasticsearch-backup-7.3.2 3d2h +elasticsearch-restore-5.6.4 3d2h +elasticsearch-restore-6.2.4 3d2h +elasticsearch-restore-6.3.0 3d2h +elasticsearch-restore-6.4.0 3d2h +elasticsearch-restore-6.5.3 3d2h +elasticsearch-restore-6.8.0 3d2h +elasticsearch-restore-7.2.0 3d2h +elasticsearch-restore-7.3.2 3d2h +``` + +Any of these addon versions should be able to take backup of the databases with matching major versions as discussed in [Addon Version Compatibility](/docs/v2024.12.18/addons/elasticsearch/README#addon-version-compatibility). + +### Verify AppBinding + +KubeDB will create an `AppBinding` object with the same name as the database object which contains the necessary information requires to connect with the database. + +Let's verify that the `AppBinding` object has been created for our `sample-es` Elasticsearch, + +```bash +❯ kubectl get appbindings.appcatalog.appscode.com -n demo sample-es +NAME TYPE VERSION AGE +sample-es kubedb.com/elasticsearch 7.9.1 2d +``` + +Now, if you check the YAML of the `AppBinding`, you will see that it contains the service and secret information that are necessary to connect with the database. + +```yaml +❯ kubectl get appbindings.appcatalog.appscode.com -n demo sample-es -o yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: sample-es + namespace: demo + ... +spec: + clientConfig: + service: + name: sample-es + port: 9200 + scheme: http + secret: + name: sample-es-elastic-cred + type: kubedb.com/elasticsearch + version: 7.9.1 +``` + +### Prepare Backend + +We are going to store our backed up data into a GCS bucket. So, we need to create a `Secret` with GCS credentials and a `Repository` object with the bucket information. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +#### Create Storage Secret + +At first, let's create a `Secret` called `gcs-secret` with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat downloaded-sa-key.json > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +#### Create Repository + +Now, crete a `Repository` object with the information of your desired bucket. Below is the YAML of `Repository` object we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /demo/sample-es + storageSecretName: gcs-secret +``` + +Let's create the `Repository` we have shown above, + +```bash +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/elasticsearch/kubedb/examples/backup/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our database into our desired backend. + +## Backup + +To schedule a backup, we have to create a `BackupConfiguration` object targeting the respective `AppBinding` of our desired database. Then, Stash will create a CronJob to periodically trigger a backup of the database. + +### Create BackupConfiguration + +Below is the YAML for `BackupConfiguration` object we care going to use to backup the `sample-es` database we have deployed earlier, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-es-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: elasticsearch-backup-7.3.2 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-es + interimVolumeTemplate: + metadata: + name: sample-es-backup-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + runtimeSettings: + pod: + securityContext: + fsGroup: 65534 + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +Here, + +- `.spec.schedule` specifies that we want to backup the database every 5th minutes. +- `.spec.task.name` specifies the name of the `Task` object that specifies the necessary `Functions` and their execution order to backup an Elasticsearch database. +- `.spec.target.ref` refers to the `AppBinding` object that holds the connection information of our targeted database. +- `spec.interimVolumeTemplate` specifies a PVC template that will be used by Stash to hold the dumped data temporarily before uploading it into the cloud bucket. +- `spec.runtimeSettings.pod` specifies the runtime environment for the backup job at the pod level. + +> Note: When running a backup with Stash, it defaults to using the `nobody` user, which can cause permission issues when trying to access the interim volume directory. To avoid this problem, you can include the `fsGroup` of the Stash default user (which is `65534`) in the `runtimeSettings.pod.securityContext` section. + +Let's create the `BackupConfiguration` object we have shown above, + +```bash +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/elasticsearch/kubedb/examples/backup/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/sample-es-backup created +``` + +### Verify Backup Setup Successful + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. Let's verify the `Phase` of the BackupConfiguration, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-es-backup elasticsearch-backup-7.3.2 */5 * * * * Ready 11s +``` + +### Verify CronJob + +Stash will create a CronJob with the schedule specified in the `spec.schedule` field of `BackupConfiguration` object. + +Verify that the CronJob has been created using the following command, + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-es-backup */5 * * * * False 0 9s +``` + +### Wait for BackupSession + +The `stash-backup-sample-es-backup` CronJob will trigger a backup on each scheduled slot by creating a `BackupSession` object. + +Now, wait for a schedule to appear. Run the following command to watch for a `BackupSession` object, + +```bash +❯ kubectl get backupsessions.stash.appscode.com -n demo -w +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +sample-es-backup-1612440003 BackupConfiguration sample-es-backup 0s +sample-es-backup-1612440003 BackupConfiguration sample-es-backup Running 0s +sample-es-backup-1612440003 BackupConfiguration sample-es-backup Succeeded 54s +``` + +Here, the phase `Succeeded` means that the backup process has been completed successfully. + +### Verify Backup + +Now, we are going to verify whether the backed up data is present in the backend or not. Once a backup is completed, Stash will update the respective `Repository` object to reflect the backup completion. Check that the repository `gcs-repo` has been updated by the following command, + +```bash +❯ kubectl get repository -n demo gcs-repo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo true 3.801 KiB 1 64s 3m46s +``` + +Now, if we navigate to the GCS bucket, we will see the backed up data has been stored in `demo/sample-es` directory as specified by the `.spec.backend.gcs.prefix` field of the `Repository` object. + +
+ Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +> Note: Stash keeps all the backed up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Restore + +If you have followed the previous sections properly, you should have a successful backup of your Elasticsearch database. Now, we are going to show how you can restore the database from the backed up data. + +### Restore into the same Elasticsearch + +You can restore your data into the same database you have backed up from or into a different database in the same cluster or a different cluster. In this section, we are going to show you how to restore in the same database which may be necessary when you have accidentally deleted any data from the running database. + +#### Temporarily pause backup + + +At first, let's stop taking any further backup of the database so that no backup runs after we delete the sample data. We are going to pause the `BackupConfiguration` object. Stash will stop taking any further backup when the `BackupConfiguration` is paused. + +Let's pause the `sample-es-backup` BackupConfiguration, + +```bash +❯ kubectl patch backupconfiguration -n demo sample-es-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/sample-es-backup patched +``` + +Verify that the `BackupConfiguration` has been paused, + +```bash +❯ kubectl get backupconfiguration -n demo sample-es-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-es-backup elasticsearch-backup-7.3.2 */5 * * * * true Ready 12m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the `BackupConfiguration` has been paused. + +Stash will also suspend the respective CronJob. + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-es-backup */5 * * * * True 0 5m19s 12m +``` + +#### Simulate Disaster + +Now, let's simulate an accidental deletion scenario. Here, we are going to delete the `products` and `companies` indexes that we had created earlier. + +```bash +# Delete "products" index +❯ curl -XDELETE --user "$USER:$PASSWORD" "http://localhost:9200/products?pretty" +{ + "acknowledged" : true +} + +# Delete "companies" index +❯ curl -XDELETE --user "$USER:$PASSWORD" "http://localhost:9200/companies?pretty" +{ + "acknowledged" : true +} +``` + +Now, let's verify that the indexes have been deleted from the database, + +```bash +❯ curl -XGET --user "$USER:$PASSWORD" "http://localhost:9200/_cat/indices?v&s=index&pretty" +health status index uuid pri rep docs.count docs.deleted store.size pri.store.size +``` + +So, we can see our `sample-es` database does not have any indexes. In the next section, we are going to restore the deleted indexes from backed up data. + +#### Create RestoreSession + +To restore the database, you have to create a `RestoreSession` object pointing to the `AppBinding` of the targeted database. + +Here, is the YAML of the `RestoreSession` object that we are going to use for restoring our `sample-es` database. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-es-restore + namespace: demo +spec: + task: + name: elasticsearch-restore-7.3.2 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-es + interimVolumeTemplate: + metadata: + name: sample-es-restore-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + runtimeSettings: + pod: + securityContext: + fsGroup: 65534 + rules: + - snapshots: [latest] +``` + +Here, + +- `.spec.task.name` specifies the name of the `Task` object that specifies the necessary `Functions` and their execution order to restore an Elasticsearch database. +- `.spec.repository.name` specifies the `Repository` object that holds the backend information where our backed up data has been stored. +- `.spec.target.ref` refers to the respective `AppBinding` of the `sample-es` database. +- `spec.interimVolumeTemplate` specifies a PVC template that will be used by Stash to hold the restored data temporarily before injecting it into the database. +- `.spec.runtimeSettings.pod` specifies the runtime environment for the restore job at the pod level. +- `.spec.rules` specifies that we are restoring data from the latest backup snapshot of the database. + +> Note: When running a restore with Stash, it defaults to using the `nobody` user, which can cause permission issues when trying to access the interim volume directory. To avoid this problem, you can include the `fsGroup` of the Stash default user (which is `65534`) in the `runtimeSettings.pod.securityContext` section. + +Let's create the `RestoreSession` object object we have shown above, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/elasticsearch/kubedb/examples/restore/restoresession.yaml +restoresession.stash.appscode.com/sample-es-restore created +``` + +Once, you have created the `RestoreSession` object, Stash will create a restore Job. Run the following command to watch the phase of the `RestoreSession` object, + +```bash +❯ kubectl get restoresession -n demo -w +NAME REPOSITORY PHASE AGE +sample-es-restore gcs-repo Running 8s +sample-es-restore gcs-repo Running 24s +sample-es-restore gcs-repo Succeeded 24s +sample-es-restore gcs-repo Succeeded 25s +``` + +The `Succeeded` phase means that the restore process has been completed successfully. + +#### Verify Restored Data + +Now, it's time to verify whether the actual data has been restored or not. At first, let's verify that whether the indexes have been restored or not: + +```bash +❯ curl -XGET --user "$USER:$PASSWORD" "http://localhost:9200/_cat/indices?v&s=index&pretty" +health status index uuid pri rep docs.count docs.deleted store.size pri.store.size +green open companies 7UgxlL4wST6ZIAImxRVvzw 1 1 1 0 11.4kb 5.7kb +green open products vb19PIneSL2zMTPvNEgm-w 1 1 2 0 10.8kb 5.4kb +``` + +So, we can see the indexes have been restored. Now, let's verify the data of these indexes, + +```bash +# Verify the data of the "products" index +❯ curl -XGET --user "$USER:$PASSWORD" "http://localhost:9200/products/_search?pretty" +{ + "took" : 3, + "timed_out" : false, + "_shards" : { + "total" : 1, + "successful" : 1, + "skipped" : 0, + "failed" : 0 + }, + "hits" : { + "total" : { + "value" : 2, + "relation" : "eq" + }, + "max_score" : 1.0, + "hits" : [ + { + "_index" : "products", + "_type" : "_doc", + "_id" : "vKDVgXcBa1PZYKwIDBjy", + "_score" : 1.0, + "_source" : { + "name" : "Stash", + "vendor" : "AppsCode Inc.", + "description" : "Backup tool for Kubernetes workloads" + } + }, + { + "_index" : "products", + "_type" : "_doc", + "_id" : "u6DUgXcBa1PZYKwI5xic", + "_score" : 1.0, + "_source" : { + "name" : "KubeDB", + "vendor" : "AppsCode Inc.", + "description" : "Database Operator for Kubernetes" + } + } + ] + } +} + +# Verify the data of "companies" index +❯ curl -XGET --user "$USER:$PASSWORD" "http://localhost:9200/companies/_search?pretty" +{ + "took" : 2, + "timed_out" : false, + "_shards" : { + "total" : 1, + "successful" : 1, + "skipped" : 0, + "failed" : 0 + }, + "hits" : { + "total" : { + "value" : 1, + "relation" : "eq" + }, + "max_score" : 1.0, + "hits" : [ + { + "_index" : "companies", + "_type" : "_doc", + "_id" : "vaDVgXcBa1PZYKwIMxhm", + "_score" : 1.0, + "_source" : { + "name" : "AppsCode Inc.", + "mission" : "Accelerate the transition to Containers by building a Kubernetes-native Data Platform", + "products" : [ + "KubeDB", + "Stash", + "KubeVault", + "Kubeform", + "ByteBuilders" + ] + } + } + ] + } +} +``` + +So, we can see that the data has been restored as well. + +#### Resume Backup + +Since our data has been restored successfully we can now resume our usual backup process. Resume the `BackupConfiguration` using following command, + +```bash +❯ kubectl patch backupconfiguration -n demo sample-es-backup --type="merge" --patch='{"spec": {"paused": false}}' +backupconfiguration.stash.appscode.com/sample-es-backup patched +``` + +Verify that the `BackupConfiguration` has been resumed, + +```bash +❯ kubectl get backupconfiguration -n demo sample-es-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-es-backup elasticsearch-backup-7.3.2 */5 * * * * false Ready 30m +``` + +Here, `false` in the `PAUSED` column means the backup has been resume successfully. The CronJob also should be resumed now. + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-es-backup */5 * * * * False 0 2m50s 30m +``` + +Here, `False` in the `SUSPEND` column means the CronJob is no longer suspended and will trigger in the next schedule. + +### Restore into a different Elasticsearch + +Now, we are going to restore the backed up data into a different Elasticsearch of a different namespace. This time, we are going to use `opendistro` variant for Elasticsearch to demonstrate migration between the variants. You can use the same variant of Elasticsearch if you are not considering to migrate from your current variant. + +We are going to restore the data into an Elasticsearch in `restored` namespace. If you already don't have the namespace, let's create it first. + +```bash +❯ kubectl create ns restored +namespace/restored created +``` + +#### Install `stash` kubectl plugin + +Now, we are going to use `stash` kubectl plugin to help us copying the `Repository` and backend `Secret` from our `demo` namespace into `restored` namespace. If you haven't already installed the `stash` kubectl-plugin, please install it by following the guide from [here](https://stash.run/docs/{{< param "info.version" >}}/setup/install/kubectl-plugin/). + +Verify that the `stash` kubectl plugin has been installed properly, + +```bash +❯ kubectl stash version +Version = v0.11.9 +VersionStrategy = tag +GitTag = v0.11.9 +GitBranch = HEAD +CommitHash = 05511503bab90e48514aed24457458456876dfcf +CommitTimestamp = 2021-01-21T22:12:04 +GoVersion = go1.15.6 +Compiler = gcc +Platform = linux/amd64 +``` + +#### Copy Repository and backend Secret into the new namespace + +Now, let's copy the `gcs-repo` Repository into our new namespace using the `stash` kubectl plugin, + +```bash +❯ kubectl stash cp repository gcs-repo -n demo --to-namespace=restored +I0208 19:51:43.950560 666626 copy_repository.go:58] Repository demo/gcs-repo uses Storage Secret demo/gcs-secret. +I0208 19:51:43.952899 666626 copy_secret.go:60] Copying Storage Secret demo to restored namespace +I0208 19:51:43.957204 666626 copy_secret.go:73] Secret demo/gcs-secret has been copied to restored namespace successfully. +I0208 19:51:43.967768 666626 copy_repository.go:75] Repository demo/gcs-repo has been copied to restored namespace successfully. +``` + +The above command will copy the `gcs-repo` Repository as well as the respective backend secret `gcs-secret`. + +Let's verify that the `Repository` has been copied into `restored` namespace, + +```bash +❯ kubectl get repository -n restored +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo 2m9s +``` + +>The command does not copy the status of the `Repository`. As a result, you will see the `INTEGRITY`, `SIZE`, `SNAPSHOT-COUNT`, and `LAST-SUCCESSFUL-BACKUP` fields are empty. Nothing to panic about here. Your actual data exist safely in the cloud bucket. The `Repository` just contains the connection information to that bucket. + +Now, let's verify that the backend secret has been copied as well, + +```bash +❯ kubectl get secret -n restored +NAME TYPE DATA AGE +default-token-rd2v5 kubernetes.io/service-account-token 3 15m +gcs-secret Opaque 3 8m36s +``` + +As you can see, the backend secret `gcs-secret` also has been copied to `restored` namespace. + +#### Deploy new Elasticsearch + +Now, we are going to deploy an Elasticsearch into `restored` namespace. We are going to initialize this database from the backed up data of first Elasticsearch. + +Here, is the YAML of the Elasticsearch object that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Elasticsearch +metadata: + name: init-sample + namespace: restored +spec: + version: opendistro-1.9.0-v1 + storageType: Durable + init: + waitForInitialRestore: true + topology: + master: + suffix: master + replicas: 1 + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + data: + suffix: data + replicas: 2 + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + ingest: + suffix: client + replicas: 2 + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi +``` + +Notice that this time, we are using `opendistro-1.9.0-v1` variant for Elasticsearch. Also, notice that we have added an `init` section in the `spec`. Here, `waitForInitialRestore: true` tells KubeDB to wait for the first restore to complete before marking this database as ready to use. + +Let's deploy the above Elasticsearch, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/elasticsearch/kubedb/examples/elasticsearch/init_sample.yaml +elasticsearch.kubedb.com/init-sample created +``` + +Now, wait for the KubeDB to create all the nodes for this Elasticsearch. This time, Elasticsearch will get stuck in the `Provisioning` state because we haven't completed the first restore yet. + +You can check the condition of the Elasticsearch to verify whether we are ready to restore the database. + +```bash +❯ kubectl get elasticsearch -n restored init-sample -o jsonpath='{.status.conditions}' | jq +[ + { + "lastTransitionTime": "2021-02-08T14:13:22Z", + "message": "The KubeDB operator has started the provisioning of Elasticsearch: restored/init-sample", + "reason": "DatabaseProvisioningStartedSuccessfully", + "status": "True", + "type": "ProvisioningStarted" + }, + { + "lastTransitionTime": "2021-02-08T14:18:15Z", + "message": "All desired replicas are ready.", + "reason": "AllReplicasReady", + "status": "True", + "type": "ReplicaReady" + }, + { + "lastTransitionTime": "2021-02-08T14:19:22Z", + "message": "The Elasticsearch: restored/init-sample is accepting client requests.", + "observedGeneration": 3, + "reason": "DatabaseAcceptingConnectionRequest", + "status": "True", + "type": "AcceptingConnection" + }, + { + "lastTransitionTime": "2021-02-08T14:19:33Z", + "message": "The Elasticsearch: restored/init-sample is ready.", + "observedGeneration": 3, + "reason": "ReadinessCheckSucceeded", + "status": "True", + "type": "Ready" + } +] +``` + +Here, check the last two conditions. We can see that the database has passed the readiness check from `Ready` conditions and it is accepting connections from `AcceptingConnection` condition. So, we are good to start restoring into this database. + +KubeDB has created an AppBinding for this database. Let's verify that the AppBinding has been created, + +```bash +❯ kubectl get appbindings.appcatalog.appscode.com -n restored +NAME TYPE VERSION AGE +init-sample kubedb.com/elasticsearch 7.8.0 21m +``` + +We are going to create a `RestoreSession` targeting this AppBinding to restore into this database. + +#### Create RestoreSession for new Elasticsearch + +Now, we have to create a `RestoreSession` object targeting the `AppBinding` of our `init-sample` database. Here, is the YAML of the RestoreSession that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: init-sample-restore + namespace: restored +spec: + task: + name: elasticsearch-restore-7.3.2 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: init-sample + interimVolumeTemplate: + metadata: + name: init-sample-restore-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + rules: + - snapshots: [latest] +``` + +Let's create the above RestoreSession, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/elasticsearch/kubedb/examples/restore/init_sample_restore.yaml +restoresession.stash.appscode.com/init-sample-restore created +``` + +Now, wait for the restore process to complete, + +```bash +❯ kubectl get restoresession -n restored -w +NAME REPOSITORY PHASE AGE +init-sample-restore gcs-repo Running 4s +init-sample-restore gcs-repo Running 21s +init-sample-restore gcs-repo Succeeded 21s +init-sample-restore gcs-repo Succeeded 21s +``` + +#### Verify Restored Data in new Elasticsearch + +Now, we are going to verify whether the data has been restored or not. At first let's port-forward the respective Service for this Elasticsearch, + +```bash +❯ kubectl get service -n restored +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +init-sample ClusterIP 10.109.51.219 9200/TCP 54m +init-sample-master ClusterIP None 9300/TCP 54m +init-sample-pods ClusterIP None 9200/TCP 54m +``` + +```bash +❯ kubectl port-forward -n restored service/init-sample 9200 +Forwarding from 127.0.0.1:9200 -> 9200 +Forwarding from [::1]:9200 -> 9200 +``` + +Now, let's export the credentials of this Elasticsearch, + +```bash +❯ kubectl get secret -n restored | grep init-sample +init-sample-admin-cred kubernetes.io/basic-auth 2 55m +init-sample-ca-cert kubernetes.io/tls 2 55m +init-sample-config Opaque 3 55m +init-sample-kibanaro-cred kubernetes.io/basic-auth 2 55m +init-sample-kibanaserver-cred kubernetes.io/basic-auth 2 55m +init-sample-logstash-cred kubernetes.io/basic-auth 2 55m +init-sample-readall-cred kubernetes.io/basic-auth 2 55m +init-sample-snapshotrestore-cred kubernetes.io/basic-auth 2 55m +init-sample-token-xgnrx kubernetes.io/service-account-token 3 55m +init-sample-transport-cert kubernetes.io/tls 3 55m +stash-restore-init-sample-restore-0-token-vscdt kubernetes.io/service-account-token 3 4m40s +``` + +Here, we are going to use the `init-sample-admin-cred` for connecting with the database. Let's export the `username` and `password` keys. + +```bash +❯ export USER=$(kubectl get secrets -n restored init-sample-admin-cred -o jsonpath='{.data.\username}' | base64 -d) +❯ export PASSWORD=$(kubectl get secrets -n restored init-sample-admin-cred -o jsonpath='{.data.\password}' | base64 -d) +``` + +Now, let's verify whether the indexes have been restored or not. + +```bash +❯ curl -XGET --user "$USER:$PASSWORD" "http://localhost:9200/_cat/indices?v&s=index&pretty" +health status index uuid pri rep docs.count docs.deleted store.size pri.store.size +green open .opendistro_security _v-_YiJUReylNbUaIEXN8A 1 1 7 0 57.1kb 37.1kb +green open companies XfSvxePuS7-lNq-gcd-bxg 1 1 1 0 11.1kb 5.5kb +green open products pZYHzOp_TWK9bLaEU-uj8Q 1 1 2 0 10.5kb 5.2kb +``` + +So, we can see that our indexes have been restored successfully. Now, let's verify the data of these indexes. + +```bash +# Verify data of "products" index +❯ curl -XGET --user "$USER:$PASSWORD" "http://localhost:9200/products/_search?pretty" +{ + "took" : 634, + "timed_out" : false, + "_shards" : { + "total" : 1, + "successful" : 1, + "skipped" : 0, + "failed" : 0 + }, + "hits" : { + "total" : { + "value" : 2, + "relation" : "eq" + }, + "max_score" : 1.0, + "hits" : [ + { + "_index" : "products", + "_type" : "_doc", + "_id" : "u6DUgXcBa1PZYKwI5xic", + "_score" : 1.0, + "_source" : { + "name" : "KubeDB", + "vendor" : "AppsCode Inc.", + "description" : "Database Operator for Kubernetes" + } + }, + { + "_index" : "products", + "_type" : "_doc", + "_id" : "vKDVgXcBa1PZYKwIDBjy", + "_score" : 1.0, + "_source" : { + "name" : "Stash", + "vendor" : "AppsCode Inc.", + "description" : "Backup tool for Kubernetes workloads" + } + } + ] + } +} + +# Verify data of "companies" index +❯ curl -XGET --user "$USER:$PASSWORD" "http://localhost:9200/companies/_search?pretty" +{ + "took" : 5, + "timed_out" : false, + "_shards" : { + "total" : 1, + "successful" : 1, + "skipped" : 0, + "failed" : 0 + }, + "hits" : { + "total" : { + "value" : 1, + "relation" : "eq" + }, + "max_score" : 1.0, + "hits" : [ + { + "_index" : "companies", + "_type" : "_doc", + "_id" : "vaDVgXcBa1PZYKwIMxhm", + "_score" : 1.0, + "_source" : { + "name" : "AppsCode Inc.", + "mission" : "Accelerate the transition to Containers by building a Kubernetes-native Data Platform", + "products" : [ + "KubeDB", + "Stash", + "KubeVault", + "Kubeform", + "ByteBuilders" + ] + } + } + ] + } +} +``` + +So, we can see that the data of these indexes data has been restored too. + +### Restore into a different cluster + +If you want to restore into a different cluster, you have to install KubeDB and Stash in the desired cluster. Then, you have to install Stash Elasticsearch addon in that cluster too. Then, you have to deploy the target database there. Once, the database is ready to accept connections, create the Repository, backend Secret, in the same namespace as the database of your desired cluster. Finally, create the `RestoreSession` object in the desired cluster pointing to the AppBinding of the targeted database of that cluster. + +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +# delete all reasources from "demo" namespace +kubectl delete -n demo backupconfiguration sample-es-backup +kubectl delete -n demo restoresession sample-es-restore +kubectl delete -n demo repository gcs-repo +kubectl delete -n demo secret gcs-repo +kubectl delete -n demo secret gcs-secret +kubectl delete -n demo elasticsearch sample-es + +# delete all reasources from "restored" namespace +kubectl delete -n restored restoresession init-sample-restore +kubectl delete -n restored repository gcs-repo +kubectl delete -n restored secret gcs-secret +kubectl delete -n restored elasticsearch init-sample +``` diff --git a/content/docs/v2024.12.18/addons/elasticsearch/overview/images/backup_overview.svg b/content/docs/v2024.12.18/addons/elasticsearch/overview/images/backup_overview.svg new file mode 100644 index 0000000000..5d043fc483 --- /dev/null +++ b/content/docs/v2024.12.18/addons/elasticsearch/overview/images/backup_overview.svg @@ -0,0 +1,1033 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/addons/elasticsearch/overview/images/restore_overview.svg b/content/docs/v2024.12.18/addons/elasticsearch/overview/images/restore_overview.svg new file mode 100644 index 0000000000..d1285c8820 --- /dev/null +++ b/content/docs/v2024.12.18/addons/elasticsearch/overview/images/restore_overview.svg @@ -0,0 +1,892 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/addons/elasticsearch/overview/index.md b/content/docs/v2024.12.18/addons/elasticsearch/overview/index.md new file mode 100644 index 0000000000..809c28921e --- /dev/null +++ b/content/docs/v2024.12.18/addons/elasticsearch/overview/index.md @@ -0,0 +1,147 @@ +--- +title: Elasticsearch Backup Overview | Stash +description: How Elasticsearch Backup Works in Stash +menu: + docs_v2024.12.18: + identifier: stash-elasticsearch-overview + name: How does it work? + parent: stash-elasticsearch + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# How Stash Backup & Restore Elasticsearch Database + +Stash 0.9.0+ supports backup and restore operation of many databases. This guide will give you an overview of how Elasticsearch database backup and restore process works in Stash. + +## How Backup Works + +The following diagram shows how Stash takes a backup of an Elasticsearch database. Open the image in a new tab to see the enlarged version. + +
+ Elasticsearch Backup Overview +
Fig: Elasticsearch Backup Overview
+
+ +The backup process consists of the following steps: + +1. At first, a user creates a secret with access credentials of the backend where the backed up data will be stored. + +2. Then, she creates a `Repository` crd that specifies the backend information along with the secret that holds the credentials to access the backend. + +3. Then, she creates a `BackupConfiguration` crd targeting the [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) crd of the desired database. The `BackupConfiguration` object also specifies the `Task` to use to backup the database. + +4. Stash operator watches for `BackupConfiguration` crd. + +5. Once Stash operator finds a `BackupConfiguration` crd, it creates a CronJob with the schedule specified in `BackupConfiguration` object to trigger backup periodically. + +6. On the next scheduled slot, the CronJob triggers a backup by creating a `BackupSession` crd. + +7. Stash operator also watches for `BackupSession` crd. + +8. When it finds a `BackupSession` object, it resolves the respective `Task` and `Function` and prepares a Job definition to backup. + +9. Then, it creates the Job to backup the targeted database. + +10. The backup Job reads necessary information to connect with the database from the `AppBinding` crd. It also reads backend information and access credentials from `Repository` crd and Storage Secret respectively. + +11. Then, the Job dumps the targeted database and uploads the output to the backend. Stash stores the dumped files temporarily before uploading into the backend. Hence, you should provide a PVC template using `spec.interimVolumeTemplate` field of `BackupConfiguration` crd to use to store those dumped files temporarily. + +12. Finally, when the backup is completed, the Job sends Prometheus metrics to the Pushgateway running inside Stash operator pod. It also updates the `BackupSession` and `Repository` status to reflect the backup procedure. + +## How Restore Process Works + +The following diagram shows how Stash restores backed up data into an Elasticsearch database. Open the image in a new tab to see the enlarged version. + +
+ Database Restore Overview +
Fig: Elasticsearch Restore Process
+
+ +The restore process consists of the following steps: + +1. At first, a user creates a `RestoreSession` crd targeting the `AppBinding` of the desired database where the backed up data will be restored. It also specifies the `Repository` crd which holds the backend information and the `Task` to use to restore the target. + +2. Stash operator watches for `RestoreSession` object. + +3. Once it finds a `RestoreSession` object, it resolves the respective `Task` and `Function` and prepares a Job definition to restore. + +4. Then, it creates the Job to restore the target. + +5. The Job reads necessary information to connect with the database from respective `AppBinding` crd. It also reads backend information and access credentials from `Repository` crd and Storage Secret respectively. + +6. Then, the job downloads the backed up data from the backend and insert into the desired database. Stash stores the downloaded files temporarily before inserting into the targeted database. Hence, you should provide a PVC template using `spec.interimVolumeTemplate` field of `RestoreSession` crd to use to store those restored files temporarily. + +7. Finally, when the restore process is completed, the Job sends Prometheus metrics to the Pushgateway and update the `RestoreSession` status to reflect restore completion. + +## Next Steps + +- Backup your Elasticsearch databases using Stash by following the guide from [here](/docs/v2024.12.18/addons/elasticsearch/kubedb/). diff --git a/content/docs/v2024.12.18/addons/etcd/README.md b/content/docs/v2024.12.18/addons/etcd/README.md new file mode 100644 index 0000000000..077de3ef72 --- /dev/null +++ b/content/docs/v2024.12.18/addons/etcd/README.md @@ -0,0 +1,109 @@ +--- +title: Etcd Addon Overview | Stash +description: Etcd Addon Overview | Stash +menu: + docs_v2024.12.18: + identifier: stash-etcd-readme + name: Readme + parent: stash-etcd + weight: -1 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +url: /docs/v2024.12.18/addons/etcd/ +aliases: +- /docs/v2024.12.18/addons/etcd/README/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash Etcd Addon + +Stash `{{< param "info.version" >}}` supports extending its functionality through its addons. Stash Etcd addon enables Stash to backup and restore Etcd databases. + +This guide will give you an overview of which Etcd versions are supported and how the docs are organized. + +## Supported Etcd Versions + +Stash has the following addon versions for Etcd: + +{{< versionlist "etcd">}} + +Here, the addon follows `M.M.P` versioning scheme where `M.M.P` (Major.Minor.Patch) represents the respective database version. + +## Addon Version Compatibility + +Any addon with matching major version with the database version should be able to take backup of that database. For example, Etcd addon with version `3.x.x` should be able to take backup of any Etcd of `3.x.x` series. However, this might not be true for some versions. In that case, we will have a separate addon for that version. + +## Documentation Overview + +Stash Etcd documentations are organized as below: + +- [How does it work?](/docs/v2024.12.18/addons/etcd/overview/) gives an overview of how backup and restore process for Etcd database works in Stash. +- [Etcd Cluster with Basic Auth](/docs/v2024.12.18/addons/etcd/basic-auth/) shows how to backup and restore an Etcd cluster with basic authentication enabled. +- [Etcd Cluster with TLS](/docs/v2024.12.18/addons/etcd/tls/) shows how to configure backup and restore process for TLS secured Etcd cluster. +- [Customizing Backup & Restore Process](/docs/v2024.12.18/addons/etcd/customization/) shows how to customize the backup & restore process. diff --git a/content/docs/v2024.12.18/addons/etcd/_index.md b/content/docs/v2024.12.18/addons/etcd/_index.md new file mode 100644 index 0000000000..5ef5bc6087 --- /dev/null +++ b/content/docs/v2024.12.18/addons/etcd/_index.md @@ -0,0 +1,77 @@ +--- +title: Stash Etcd Addon +menu: + docs_v2024.12.18: + identifier: stash-etcd + name: Etcd + parent: stash-addons + weight: 100 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/addons/etcd/basic-auth/examples/appbinding.yaml b/content/docs/v2024.12.18/addons/etcd/basic-auth/examples/appbinding.yaml new file mode 100644 index 0000000000..87be153f2c --- /dev/null +++ b/content/docs/v2024.12.18/addons/etcd/basic-auth/examples/appbinding.yaml @@ -0,0 +1,15 @@ +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: etcd-appbinding + namespace: demo +spec: + clientConfig: + service: + name: etcd + port: 2379 + scheme: http + secret: + name: etcd-basic-auth + type: etcd + version: 3.5.0 \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/etcd/basic-auth/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/addons/etcd/basic-auth/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..cb37a1f2f5 --- /dev/null +++ b/content/docs/v2024.12.18/addons/etcd/basic-auth/examples/backupconfiguration.yaml @@ -0,0 +1,20 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: etcd-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: etcd-backup-3.5.0 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: etcd-appbinding + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/etcd/basic-auth/examples/etcd-secret.yaml b/content/docs/v2024.12.18/addons/etcd/basic-auth/examples/etcd-secret.yaml new file mode 100644 index 0000000000..71ffde91b5 --- /dev/null +++ b/content/docs/v2024.12.18/addons/etcd/basic-auth/examples/etcd-secret.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: Secret +metadata: + name: etcd-basic-auth + namespace: demo +type: Opaque +stringData: + username: root + password: not@secret \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/etcd/basic-auth/examples/etcd.yaml b/content/docs/v2024.12.18/addons/etcd/basic-auth/examples/etcd.yaml new file mode 100644 index 0000000000..13b4201c9b --- /dev/null +++ b/content/docs/v2024.12.18/addons/etcd/basic-auth/examples/etcd.yaml @@ -0,0 +1,68 @@ +apiVersion: v1 +kind: Service +metadata: + namespace: demo + name: etcd +spec: + clusterIP: None + ports: + - port: 2379 + name: client + - port: 2380 + name: peer + selector: + app: etcd +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: etcd + namespace: demo + labels: + app: etcd +spec: + serviceName: etcd + replicas: 3 + selector: + matchLabels: + app: etcd + template: + metadata: + name: etcd + labels: + app: etcd + spec: + containers: + - name: etcd + image: gcr.io/etcd-development/etcd:v3.5.0 + ports: + - containerPort: 2379 + name: client + - containerPort: 2380 + name: peer + volumeMounts: + - name: data + mountPath: /var/run/etcd + command: + - /bin/sh + - -c + - | + PEERS="etcd-0=http://etcd-0.etcd:2380,etcd-1=http://etcd-1.etcd:2380,etcd-2=http://etcd-2.etcd:2380" + exec etcd --name ${HOSTNAME} \ + --listen-peer-urls http://0.0.0.0:2380 \ + --listen-client-urls http://0.0.0.0:2379 \ + --initial-cluster etcd-0=http://etcd-0.etcd:2380,etcd-1=http://etcd-1.etcd:2380,etcd-2=http://etcd-2.etcd:2380 \ + --initial-cluster-token etcd-cluster-1 \ + --advertise-client-urls http://${HOSTNAME}.etcd:2379 \ + --initial-advertise-peer-urls http://${HOSTNAME}.etcd:2380 \ + --data-dir /var/run/etcd + volumeClaimTemplates: + - metadata: + name: data + namespace: demo + spec: + storageClassName: standard + accessModes: ["ReadWriteOnce"] + resources: + requests: + storage: 1Gi diff --git a/content/docs/v2024.12.18/addons/etcd/basic-auth/examples/repository.yaml b/content/docs/v2024.12.18/addons/etcd/basic-auth/examples/repository.yaml new file mode 100644 index 0000000000..7a565d9b29 --- /dev/null +++ b/content/docs/v2024.12.18/addons/etcd/basic-auth/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /demo/etcd/sample-etcd + storageSecretName: gcs-secret \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/etcd/basic-auth/examples/restoresession.yaml b/content/docs/v2024.12.18/addons/etcd/basic-auth/examples/restoresession.yaml new file mode 100644 index 0000000000..e7377caef2 --- /dev/null +++ b/content/docs/v2024.12.18/addons/etcd/basic-auth/examples/restoresession.yaml @@ -0,0 +1,34 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: etcd-restore + namespace: demo +spec: + task: + name: etcd-restore-3.5.0 + params: + - name: initialCluster + value: "etcd-0=http://etcd-0.etcd:2380,etcd-1=http://etcd-1.etcd:2380,etcd-2=http://etcd-2.etcd:2380" + - name: initialClusterToken + value: "etcd-cluster-1" + - name: dataDir + value: "/var/run/etcd" + - name: workloadKind + value: "StatefulSet" + - name: workloadName + value: "etcd" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: etcd-appbinding + runtimeSettings: + container: + securityContext: + runAsUser: 0 + runAsGroup: 0 + rules: + - snapshots: [latest] + \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/etcd/basic-auth/images/etcd-backup.jpg b/content/docs/v2024.12.18/addons/etcd/basic-auth/images/etcd-backup.jpg new file mode 100644 index 0000000000..1502bd6929 Binary files /dev/null and b/content/docs/v2024.12.18/addons/etcd/basic-auth/images/etcd-backup.jpg differ diff --git a/content/docs/v2024.12.18/addons/etcd/basic-auth/index.md b/content/docs/v2024.12.18/addons/etcd/basic-auth/index.md new file mode 100644 index 0000000000..c8e444b41c --- /dev/null +++ b/content/docs/v2024.12.18/addons/etcd/basic-auth/index.md @@ -0,0 +1,705 @@ +--- +title: Backup & Restore Etcd | Stash +description: Take backup of Etcd cluster using Stash +menu: + docs_v2024.12.18: + identifier: stash-etcd-basic-auth + name: Etcd Cluster with Basic Auth + parent: stash-etcd + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup & Restore an Etcd Cluster with Basic Auth Enabled + +Stash `{{< param "info.version" >}}` supports backup and restoration of Etcd database. This guide will show you how you can take backup & restore your Etcd database using Stash. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. +- Install Stash in your cluster following the steps [here](/docs/v2024.12.18/setup/install/stash/). +- If you are not familiar with how Stash backup and restore Etcd database, please check the following guide [here](/docs/v2024.12.18/addons/etcd/overview/). + +You have to be familiar with following custom resources: + +- [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) +- [Function](/docs/v2024.12.18/concepts/crds/function/) +- [Task](/docs/v2024.12.18/concepts/crds/task/) +- [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) +- [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) +- [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + +To keep things isolated, we are going to use a separate namespace called `demo` throughout this tutorial. Create `demo` namespace if you haven't created that already. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> Note: YAML files used in this tutorial are stored [here](https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/etcd/basic-auth/examples). + +## Prepare Etcd + +In this section, we are going to deploy an Etcd cluster. Then, we will insert some sample data into it. + +### Deploy Etcd + +At first, let's deploy an Etcd cluster. Here, we will use a StatefulSet and a Service to deploy an Etcd cluster consisting of three members. The Service is used for handling peer communications and client requests. + +Here, is the sample YAMLs that we are going to use to deploy the Etcd cluster, + +```yaml +apiVersion: v1 +kind: Service +metadata: + namespace: demo + name: etcd +spec: + clusterIP: None + ports: + - port: 2379 + name: client + - port: 2380 + name: peer + selector: + app: etcd +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: etcd + namespace: demo + labels: + app: etcd +spec: + serviceName: etcd + replicas: 3 + selector: + matchLabels: + app: etcd + template: + metadata: + name: etcd + labels: + app: etcd + spec: + containers: + - name: etcd + image: gcr.io/etcd-development/etcd:v3.5.0 + ports: + - containerPort: 2379 + name: client + - containerPort: 2380 + name: peer + volumeMounts: + - name: data + mountPath: /var/run/etcd + command: + - /bin/sh + - -c + - | + PEERS="etcd-0=http://etcd-0.etcd:2380,etcd-1=http://etcd-1.etcd:2380,etcd-2=http://etcd-2.etcd:2380" + exec etcd --name ${HOSTNAME} \ + --listen-peer-urls http://0.0.0.0:2380 \ + --listen-client-urls http://0.0.0.0:2379 \ + --initial-cluster etcd-0=http://etcd-0.etcd:2380,etcd-1=http://etcd-1.etcd:2380,etcd-2=http://etcd-2.etcd:2380 \ + --initial-cluster-token etcd-cluster-1 \ + --advertise-client-urls http://${HOSTNAME}.etcd:2379 \ + --initial-advertise-peer-urls http://${HOSTNAME}.etcd:2380 \ + --data-dir /var/run/etcd + volumeClaimTemplates: + - metadata: + name: data + namespace: demo + spec: + storageClassName: standard + accessModes: ["ReadWriteOnce"] + resources: + requests: + storage: 1Gi +``` + +Let's deploy the Etcd cluster we have shown above, +```bash +$ kubectl apply -f https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/etcd/basic-auth/examples/etcd.yaml +service/etcd created +statefulset.apps/etcd created +``` + +Now, let's wait for the database pods `etcd-0`, `etcd-1`, and `etcd-2` to go into `Running` state, + +```bash +❯ kubectl get pods -n demo --selector=app=etcd + +NAME READY STATUS RESTARTS AGE +etcd-0 1/1 Running 0 11s +etcd-1 1/1 Running 0 10s +etcd-2 1/1 Running 0 9s +``` + +Once the database pods are in `Running` state, verify that the Etcd cluster is ready to accept connections. Let's exec into the `etcd-0` pod and check cluster's health. + +```bash +❯ kubectl exec -it -n demo etcd-0 -- /bin/sh +127.0.0.1:2379> etcdctl endpoint health +127.0.0.1:2379 is healthy: successfully committed proposal: took = 1.258639ms +``` +We can see from the above output that our Etcd cluster is ready to accept connections. + +### Enabling basic authentication +To use basic authentication in Etcd cluster, we need to create a user using `etcdctl`. We will add one special user, `root` and grant this user `root` role. The `root` role has global read-write access and permission accross an Etcd database by default. + +Let's exec into `etcd-0` pod and enable basic authentication, + +```bash +❯ kubectl exec -it -n demo etcd-0 -- /bin/sh + +127.0.0.1:2379> etcdctl user add root +Password of root: +Type password of root again for confirmation: +User root created + +127.0.0.1:2379> etcdctl user grant-role root root +Role root is granted to user root + +127.0.0.1:2379> etcdctl auth enable +Authentication Enabled +127.0.0.1:2379> exit +``` +Here, we have used `not@secret` as password for the user we have created above. + +### Insert Sample Data + +Now, we are going to exec into any of the database pods and insert some sample data. + +Let's exec into the `etcd-0` pod for inserting sample data. We are going to export the username and password as an environment variable. + +```bash +❯ kubectl exec -it -n demo etcd-0 -- /bin/sh + +127.0.0.1:2379> export USER=root +127.0.0.1:2379> export PASSWORD=not@secret + +127.0.0.1:2379> etcdctl --user $USER:$PASSWORD put foo bar +OK +127.0.0.1:2379> etcdctl --user $USER:$PASSWORD put foo2 bar2 +OK +127.0.0.1:2379> etcdctl --user $USER:$PASSWORD put foo3 bar3 +OK + +# Verify that the data has been inserted successfully +127.0.0.1:2379> etcdctl --user $USER:$PASSWORD get --prefix foo +foo +bar +foo2 +bar2 +foo3 +bar3 +127.0.0.1:2379> exit +``` + +We have successfully deployed an Etcd cluster and inserted some sample data into it. In the subsequent sections, we are going to backup these data using Stash. + +## Prepare for Backup + +In this section, we are going to prepare the necessary resources (e.g., database connection information, backend information, etc.) before backup. + +### Ensure Etcd Addon + +When you install Stash, it will automatically install all the official addons. Make sure that Etcd addon has been installed properly using the following command. + +```bash +❯ kubectl get tasks.stash.appscode.com | grep etcd +etcd-backup-3.5.0 18m +etcd-restore-3.5.0 18m +``` + +This addon should be able to take backup of the databases with matching major versions as discussed in [Addon Version Compatibility](/docs/v2024.12.18/addons/etcd/README#addon-version-compatibility). + +### Create Secret + +>You can skip this section if you don't have basic authentication enabled in your Etcd cluster. + +Now, we have to create a Secret with the access credentials to our Etcd database. Here, is the YAML of the Secret we are going to create, + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: etcd-basic-auth + namespace: demo +type: Opaque +stringData: + username: root + password: not@secret +``` + +Let's create the `etcd-basic-auth` Secret we have shown above, +```bash +$ kubectl apply -f https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/etcd/basic-auth/examples/etcd-secret.yaml +secret/etcd-basic-auth created +``` + +### Create AppBinding + +Stash needs to know how to connect with the Etcd cluster. An `AppBinding` exactly provides this information. It holds the Service and Secret information of the Etcd cluster. You have to point to the respective `AppBinding` as a target of backup instead of the Etcd cluster itself. + +Here is the YAML of the `AppBinding` that we are going to create for the Etcd cluster we have deployed earlier. + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: etcd-appbinding + namespace: demo +spec: + clientConfig: + service: + name: etcd + port: 2379 + scheme: http + secret: + name: etcd-basic-auth + type: etcd + version: 3.5.0 +``` + +Here, + +- `.spec.clientConfig.Service` specifies the Service information to use to connects with the database client. +- `.spec.secret` specifies the name of the Secret that holds necessary credentials to access the database. If your Etcd database is not using authentication, then don't provide this field. +- `.spec.type` specifies the type of the database. + +Let's create the `AppBinding` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/etcd/basic-auth/examples/appbinding.yaml +appbinding.appcatalog.appscode.com/etcd-appbinding created +``` + +### Prepare Backend + +We are going to store our backed up data into a GCS bucket. So, we need to create a Secret with GCS credentials and a `Repository` object with the bucket information. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +**Create Storage Secret:** + +At first, let's create a secret called `gcs-secret` with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat downloaded-sa-key.json > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create Repository:** + +Now, create a `Repository` object with the information of your desired bucket. Below is the YAML of `Repository` object we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /demo/etcd/basic-auth-backup + storageSecretName: gcs-secret +``` + +Let's create the `Repository` we have shown above, + +```bash +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/etcd/basic-auth/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our data into our desired backend. + +### Backup + +To schedule a backup, we have to create a `BackupConfiguration` object targeting the respective `AppBinding` of our Etcd cluster. Then Stash will create a CronJob to periodically backup the database. + +#### Create BackupConfiguration + +Below, is the YAML for `BackupConfiguration` object we are going to use to backup the Etcd cluster we have deployed earlier. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: etcd-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: etcd-backup-3.5.0 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: etcd-appbinding + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +Here, + +- `.spec.schedule` specifies that we want to backup the database at 5 minutes intervals. +- `.spec.task.name` specifies the name of the Task object that specifies the necessary Functions and their execution order to backup an Etcd database. +- `.spec.repository.name` specifies the Repository CR name we have created earlier with backend information. +- `.spec.target.ref` refers to the AppBinding object that holds the connection information of our targeted database. +- `.spec.retentionPolicy` specifies a policy indicating how we want to cleanup the old backups. + +Let's create the `BackupConfiguration` object we have shown above, + +```bash +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/etcd/basic-auth/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/etcd-backup created +``` + +### Verify Backup Setup Successful + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. Let's verify the `Phase` of the BackupConfiguration, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +etcd-backup etcd-backup-3.5.0 */5 * * * * Ready 11s +``` + +#### Verify CronJob + +Stash will create a CronJob with the schedule specified in `spec.schedule` field of `BackupConfiguration` object. + +Verify that the CronJob has been created using the following command, + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-trigger-etcd-backup */5 * * * * False 0 14s +``` + +#### Wait for BackupSession + +The `stash-trigger-etcd-backup` CronJob will trigger a backup on each scheduled slot by creating a `BackupSession` object. + +Now, wait for a schedule to appear. Run the following command to watch for a `BackupSession` object, + +```bash +❯ kubectl get backupsession -n demo -w +NAME INVOKER-TYPE INVOKER-NAME PHASE DURATION AGE +etcd-backup-1634538902 BackupConfiguration etcd-backup 0s +etcd-backup-1634538902 BackupConfiguration etcd-backup Running 0s +etcd-backup-1634538902 BackupConfiguration etcd-backup Succeeded 39s 39s +``` + +Here, the phase `Succeeded` means that the backup process has been completed successfully. + +#### Verify Backup + +Now, we are going to verify whether the backed up data is present in the backend or not. Once a backup is completed, Stash will update the respective `Repository` object to reflect the backup completion. Check that the repository `gcs-repo` has been updated by the following command, + +```bash +❯ kubectl get repository -n demo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo true 93 B 1 2m1s 24m +``` + +Now, if we navigate to the GCS bucket, we will see the backed up data has been stored in `/demo/etcd/basic-auth-backup` directory as specified by `.spec.backend.gcs.prefix` field of the `Repository` object. + +
+ Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +> Note: Stash keeps all the backed up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Restore Etcd + +If you have followed the previous sections properly, you should have a successful backup of your Etcd cluster. Now, we are going to show how you can restore the database from the backed up data. + +### Restore Into the Same Etcd Cluster + +You can restore your data into the same Etcd cluster you have taken backup from or into a different Etcd cluster. In this section, we are going to show you how to restore data in the same Etcd cluster which maybe necessary when you have accidentally deleted any data from the running cluster. + +#### Temporarily Pause Backup + +At first, let's stop taking any further backup of the Etcd cluster so that no backup runs after we delete the sample data. We are going to pause the `BackupConfiguration` object. Stash will stop taking any further backup when the `BackupConfiguration` is paused. + +Let's pause the `etcd-backup` BackupConfiguration, + +```bash +$ kubectl patch backupconfiguration -n demo etcd-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/etcd-backup patched +``` + +Verify that the `BackupConfiguration` has been paused, + +```bash +❯ kubectl get backupconfiguration -n demo etcd-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +etcd-backup etcd-backup-3.5.0 */5 * * * * true Ready 22m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the `BackupConfiguration` has been paused. + +Stash will also suspend the respective CronJob. + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-trigger-etcd-backup */5 * * * * True 0 6m15s 23m +``` + +#### Simulate Disaster + +Now, let's simulate an accidental deletion scenario. Here, we are going to exec into the `etcd-0` database pod and delete the sample data we have inserted earlier. + +```bash +❯ kubectl exec -it -n demo etcd-0 -- /bin/sh +127.0.0.1:2379> export USER=root +127.0.0.1:2379> export PASSWORD=not@secret + +127.0.0.1:2379> etcdctl --user $USER:$PASSWORD del foo +1 +127.0.0.1:2379> etcdctl --user $USER:$PASSWORD del foo2 +1 +127.0.0.1:2379> etcdctl --user $USER:$PASSWORD del foo3 +1 +# verify that the sample data has been deleted +127.0.0.1:2379> etcdctl --user $USER:$PASSWORD get --prefix foo +(nil) +127.0.0.1:2379> exit +``` + +#### Create RestoreSession + +To restore the database, you have to create a `RestoreSession` object pointing to the `AppBinding` of the targeted database. + +Here, is the YAML of the `RestoreSession` object that we are going to use for restoring our Etcd database cluster. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: etcd-restore + namespace: demo +spec: + task: + name: etcd-restore-3.5.0 + params: + - name: initialCluster + value: "etcd-0=http://etcd-0.etcd:2380,etcd-1=http://etcd-1.etcd:2380,etcd-2=http://etcd-2.etcd:2380" + - name: initialClusterToken + value: "etcd-cluster-1" + - name: dataDir + value: "/var/run/etcd" + - name: workloadKind + value: "StatefulSet" + - name: workloadName + value: "etcd" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: etcd-appbinding + runtimeSettings: + container: + securityContext: + runAsUser: 0 + runAsGroup: 0 + rules: + - snapshots: [latest] +``` + +Here, + +- `.spec.task.name` specifies the name of the Task object that specifies the necessary Functions and their execution order to restore an Etcd database. +- `.spec.task.params` refers to the names and values of the Params objects specifying necessary parameters and their values for restoring backup data into an Etcd cluster. We need to specify the folowing parameters, + - `initialcluster` parameter refers to the initial cluster configuration of the Etcd cluster and it must be the same as the initial cluster configuration of the deployed Etcd cluster. + - `dataDir` parameter refers to the datadir of the deployed Etcd cluster where the backed up data will get restored. + - `workloadKind` parameter refers to the workload e.g. Pod/StatefulSet we have used to deploy the Etcd cluster. + - `workloadName` parameter refers to the workload name we have used to deploy the Etcd cluster. +- `.spec.repository.name` specifies the Repository object that holds the backend information where our backed up data has been stored. +- `.spec.target.ref` refers to the respective AppBinding of the Etcd database. +- `.spec.rules` specifies that we are restoring data from the latest backup snapshot of the database. +- The restore Job need access to the respective volume of the Etcd database. As a result, we have to run the restore Job as the same user as the Etcd database or as root user. Here, we are running the restore Job as root user using `spec.runtimeSettings.Container.securityContext` section. + +Let's create the `RestoreSession` object object we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/etcd/basic-auth/examples/restoresession.yaml +restoresession.stash.appscode.com/etcd-restore created +``` + +Once, you have created the `RestoreSession` object, Stash will create a restore Job. Run the following command to watch the phase of the `RestoreSession` object, + +```bash +❯ kubectl get restoresession -n demo -w +NAME REPOSITORY PHASE DURATION AGE +etcd-restore gcs-repo Running 9s +etcd-restore gcs-repo Running 13s +etcd-restore gcs-repo Running 72s +etcd-restore gcs-repo Succeeded 72s +etcd-restore gcs-repo Succeeded 1m13s 72s +``` + +The `Succeeded` phase means that the restore process has been completed successfully. + +#### Verify Restored Data + +Now, let's exec into the `etcd-0` database pod and verify whether the actual data has been restored or not, + +```bash +❯ kubectl exec -it -n demo etcd-0 -- /bin/sh + +127.0.0.1:2379> export USER=root +127.0.0.1:2379> export PASSWORD=not@secret + +127.0.0.1:2379> etcdctl --user $USER:$PASSWORD get --prefix foo +foo +bar +foo2 +bar2 +foo3 +bar3 +127.0.0.1:2379> exit +``` + +Hence, we can see from the above output that the deleted data has been restored successfully from the backup. + +#### Resume Backup + +Since our data has been restored successfully we can now resume our usual backup process. Resume the `BackupConfiguration` using following command, + +```bash +❯ kubectl patch backupconfiguration -n demo etcd-backup --type="merge" --patch='{"spec": {"paused": false}}' +backupconfiguration.stash.appscode.com/etcd-backup patched +``` + +Verify that the `BackupConfiguration` has been resumed, +```bash +❯ kubectl get backupconfiguration -n demo etcd-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +etcd-backup etcd-backup-3.5.0 */5 * * * * false Ready 4h54m +``` + +Here, `false` in the `PAUSED` column means the backup has been resumed successfully. The CronJob also should be resumed now. + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-trigger-etcd-backup */5 * * * * False 0 3m24s 4h54m +``` + +Here, `False` in the `SUSPEND` column means the CronJob is no longer suspended and will trigger in the next schedule. + +### Restore Into Different Database of the Same Namespace + +If you want to restore the backed up data into a different Etcd cluster of the same namespace, you have to create another `AppBinding` pointing to the desired Etcd database. Then, you have to create the `RestoreSession` pointing to the new `AppBinding`. + +### Restore Into Different Namespace + +If you want to restore into a different namespace of the same cluster, you have to create the Repository, backend Secret, AppBinding, in the desired namespace. You can use [Stash kubectl plugin](https://stash.run/docs/{{< param "info.version" >}}/guides/cli/cli/) to easily copy the resources into a new namespace. Then, you have to create the `RestoreSession` object in the desired namespace pointing to the Repository, AppBinding of that namespace. + +### Restore Into Different Cluster + +If you want to restore into a different cluster, you have to install Stash in the desired cluster. Then, you have to create the Repository, backend Secret, AppBinding, in the desired cluster. Finally, you have to create the `RestoreSession` object in the desired cluster pointing to the Repository, AppBinding of that cluster. + +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo backupconfiguration etcd-backup +kubectl delete -n demo restoresession etcd-restore +kubectl delete -n demo repository gcs-repo +kubectl delete -n demo appbinding etcd-appbinding +kubectl delete -n demo Secret etcd-basic-auth +kubectl delete -n demo Secret gcs-secret +# delete the Etcd cluster, Service, and PVCs +kubectl delete -f https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/etcd/basic-auth/examples/etcd.yaml +kubectl delete pvc -n demo data-etcd-0 data-etcd-1 data-etcd-2 +``` diff --git a/content/docs/v2024.12.18/addons/etcd/customization/examples/backup/multi-retention-policy.yaml b/content/docs/v2024.12.18/addons/etcd/customization/examples/backup/multi-retention-policy.yaml new file mode 100644 index 0000000000..3c9aed63b2 --- /dev/null +++ b/content/docs/v2024.12.18/addons/etcd/customization/examples/backup/multi-retention-policy.yaml @@ -0,0 +1,24 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: etcd-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: etcd-backup-3.5.0 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: etcd-appbinding + retentionPolicy: + name: sample-etcd-retention + keepLast: 5 + keepDaily: 10 + keepWeekly: 20 + keepMonthly: 50 + keepYearly: 100 + prune: true diff --git a/content/docs/v2024.12.18/addons/etcd/customization/examples/backup/passing-args.yaml b/content/docs/v2024.12.18/addons/etcd/customization/examples/backup/passing-args.yaml new file mode 100644 index 0000000000..e8e5bba7f1 --- /dev/null +++ b/content/docs/v2024.12.18/addons/etcd/customization/examples/backup/passing-args.yaml @@ -0,0 +1,23 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: etcd-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: etcd-backup-3.5.0 + params: + - name: args + value: --insecure-skip-tls-verify=true + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: etcd-appbinding + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/etcd/customization/examples/backup/resource-limit.yaml b/content/docs/v2024.12.18/addons/etcd/customization/examples/backup/resource-limit.yaml new file mode 100644 index 0000000000..a26e4fdb8a --- /dev/null +++ b/content/docs/v2024.12.18/addons/etcd/customization/examples/backup/resource-limit.yaml @@ -0,0 +1,29 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: etcd-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: etcd-backup-3.5.0 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: etcd-appbinding + runtimeSettings: + container: + resources: + requests: + cpu: "200m" + memory: "1Gi" + limits: + cpu: "200m" + memory: "1Gi" + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/etcd/customization/examples/backup/specific-user.yaml b/content/docs/v2024.12.18/addons/etcd/customization/examples/backup/specific-user.yaml new file mode 100644 index 0000000000..54c1d5e7dd --- /dev/null +++ b/content/docs/v2024.12.18/addons/etcd/customization/examples/backup/specific-user.yaml @@ -0,0 +1,25 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: etcd-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: etcd-backup-3.5.0 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: etcd-appbinding + runtimeSettings: + pod: + securityContext: + runAsUser: 0 + runAsGroup: 0 + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/etcd/customization/examples/restore/passing-args.yaml b/content/docs/v2024.12.18/addons/etcd/customization/examples/restore/passing-args.yaml new file mode 100644 index 0000000000..65c1f10e23 --- /dev/null +++ b/content/docs/v2024.12.18/addons/etcd/customization/examples/restore/passing-args.yaml @@ -0,0 +1,35 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: etcd-restore + namespace: demo +spec: + task: + name: etcd-restore-3.5.0 + params: + - name: initialCluster + value: "etcd-0=http://etcd-0.etcd:2380,etcd-1=http://etcd-1.etcd:2380,etcd-2=http://etcd-2.etcd:2380" + - name: initialClusterToken + value: "etcd-cluster-1" + - name: dataDir + value: "/var/run/etcd" + - name: workloadKind + value: "StatefulSet" + - name: workloadName + value: "etcd" + - name: args + value: --insecure-skip-tls-verify=true + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: etcd-appbinding + runtimeSettings: + container: + securityContext: + runAsUser: 0 + runAsGroup: 0 + rules: + - snapshots: [latest] \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/etcd/customization/examples/restore/resource-limit.yaml b/content/docs/v2024.12.18/addons/etcd/customization/examples/restore/resource-limit.yaml new file mode 100644 index 0000000000..494ae7f11e --- /dev/null +++ b/content/docs/v2024.12.18/addons/etcd/customization/examples/restore/resource-limit.yaml @@ -0,0 +1,40 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: etcd-restore + namespace: demo +spec: + task: + name: etcd-restore-3.5.0 + params: + - name: initialCluster + value: "etcd-0=http://etcd-0.etcd:2380,etcd-1=http://etcd-1.etcd:2380,etcd-2=http://etcd-2.etcd:2380" + - name: initialClusterToken + value: "etcd-cluster-1" + - name: dataDir + value: "/var/run/etcd" + - name: workloadKind + value: "StatefulSet" + - name: workloadName + value: "etcd" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: etcd-appbinding + runtimeSettings: + container: + securityContext: + runAsUser: 0 + runAsGroup: 0 + resources: + requests: + cpu: "200m" + memory: "1Gi" + limits: + cpu: "200m" + memory: "1Gi" + rules: + - snapshots: [latest] \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/etcd/customization/examples/restore/specific-snapshot.yaml b/content/docs/v2024.12.18/addons/etcd/customization/examples/restore/specific-snapshot.yaml new file mode 100644 index 0000000000..ad10d24f3f --- /dev/null +++ b/content/docs/v2024.12.18/addons/etcd/customization/examples/restore/specific-snapshot.yaml @@ -0,0 +1,33 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: etcd-restore + namespace: demo +spec: + task: + name: etcd-restore-3.5.0 + params: + - name: initialCluster + value: "etcd-0=http://etcd-0.etcd:2380,etcd-1=http://etcd-1.etcd:2380,etcd-2=http://etcd-2.etcd:2380" + - name: initialClusterToken + value: "etcd-cluster-1" + - name: dataDir + value: "/var/run/etcd" + - name: workloadKind + value: "StatefulSet" + - name: workloadName + value: "etcd" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: etcd-appbinding + runtimeSettings: + container: + securityContext: + runAsUser: 0 + runAsGroup: 0 + rules: + - snapshots: [4bc21d6f] \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/etcd/customization/examples/restore/specific-user.yaml b/content/docs/v2024.12.18/addons/etcd/customization/examples/restore/specific-user.yaml new file mode 100644 index 0000000000..5687b3c19f --- /dev/null +++ b/content/docs/v2024.12.18/addons/etcd/customization/examples/restore/specific-user.yaml @@ -0,0 +1,33 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: etcd-restore + namespace: demo +spec: + task: + name: etcd-restore-3.5.0 + params: + - name: initialCluster + value: "etcd-0=http://etcd-0.etcd:2380,etcd-1=http://etcd-1.etcd:2380,etcd-2=http://etcd-2.etcd:2380" + - name: initialClusterToken + value: "etcd-cluster-1" + - name: dataDir + value: "/var/run/etcd" + - name: workloadKind + value: "StatefulSet" + - name: workloadName + value: "etcd" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: etcd-appbinding + runtimeSettings: + container: + securityContext: + runAsUser: 0 + runAsGroup: 0 + rules: + - snapshots: [latest] \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/etcd/customization/index.md b/content/docs/v2024.12.18/addons/etcd/customization/index.md new file mode 100644 index 0000000000..60d157bbed --- /dev/null +++ b/content/docs/v2024.12.18/addons/etcd/customization/index.md @@ -0,0 +1,410 @@ +--- +title: Etcd Backup Customization | Stash +description: Customizing Backup and Restore process with Stash +menu: + docs_v2024.12.18: + identifier: stash-etcd-customization + name: Customizing Backup & Restore Process + parent: stash-etcd + weight: 40 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Customizing Backup and Restore Process + +Stash provides rich customization supports for the backup and restore process to meet the requirements of various cluster configurations. This guide will show you some examples of these customizations. + +> Note: YAML files used in this tutorial are stored [here](https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/etcd/customization/examples). + +## Customizing Backup Process + +In this section, we are going to show you how to customize the backup process. Here, we are going to show some examples of providing arguments to the backup process, running the backup process as a specific user, ignoring some indexes during the backup process, etc. + +### Passing arguments to the backup process +Stash Etcd addon uses [etcdctl](https://github.com/etcd-io/etcd/tree/main/etcdctl) for backup. You can pass arguments to the `etcdctl` through `args` param under `task.params` section. + +The below example shows how you can pass the `--insecure-skip-tls-verify` to skip server certificate verification (`CAUTION`: this option should be enabled only for testing purposes) +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: etcd-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: etcd-backup-3.5.0 + params: + - name: args + value: --insecure-skip-tls-verify=true + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: etcd-appbinding + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +### Running backup job as a specific user + +If your cluster requires running the backup job as a specific user, you can provide `securityContext` under `runtimeSettings.pod` section. The below example shows how you can run the backup job as the root user. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: etcd-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: etcd-backup-3.5.0 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: etcd-appbinding + runtimeSettings: + pod: + securityContext: + runAsUser: 0 + runAsGroup: 0 + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +### Specifying Memory/CPU limit/request for the backup job + +If you want to specify the Memory/CPU limit/request for your backup job, you can specify `resources` field under `runtimeSettings.container` section. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: etcd-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: etcd-backup-3.5.0 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: etcd-appbinding + runtimeSettings: + container: + resources: + requests: + cpu: "200m" + memory: "1Gi" + limits: + cpu: "200m" + memory: "1Gi" + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +### Using multiple retention policies + +You can also specify multiple retention policies for your backed up data. For example, you may want to keep few daily snapshots, few weekly snapshots, and few monthly snapshots, etc. You just need to pass the desired number with the respective key under the `retentionPolicy` section. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: etcd-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: etcd-backup-3.5.0 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: etcd-appbinding + retentionPolicy: + name: sample-etcd-retention + keepLast: 5 + keepDaily: 10 + keepWeekly: 20 + keepMonthly: 50 + keepYearly: 100 + prune: true +``` + +To know more about the available options for retention policies, please visit [here](/docs/v2024.12.18/concepts/crds/backupconfiguration/#specretentionpolicy). + +## Customizing Restore Process + +Stash uses `etcdctl` during the restore process as well. In this section, we are going to show how you can pass arguments to the restore process, restore a specific snapshot, run restore job as a specific user, etc. + +### Passing arguments to the restore process + +Similar to the backup process, you can pass additional arguments to the restore process alongside with the reqiored arguements through the `args` params under `task.params` section. Here, we have passed `--insecure-skip-tls-verify` argument to the `etcdctl` to skip server certificate verification (CAUTION: this option should be enabled only for testing purposes). + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: etcd-restore + namespace: demo +spec: + task: + name: etcd-restore-3.5.0 + params: + - name: initialCluster + value: "etcd-0=http://etcd-0.etcd:2380,etcd-1=http://etcd-1.etcd:2380,etcd-2=http://etcd-2.etcd:2380" + - name: initialClusterToken + value: "etcd-cluster-1" + - name: dataDir + value: "/var/run/etcd" + - name: workloadKind + value: "StatefulSet" + - name: workloadName + value: "etcd" + - name: args + value: --insecure-skip-tls-verify=true + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: etcd-appbinding + runtimeSettings: + container: + securityContext: + runAsUser: 0 + runAsGroup: 0 + rules: + - snapshots: [latest] +``` + +### Restore specific snapshot + +You can also restore a specific snapshot. At first, list the available snapshots as below, + +```bash +❯ kubectl get snapshots -n demo +NAME ID REPOSITORY HOSTNAME CREATED AT +gcs-repo-4bc21d6f 4bc21d6f gcs-repo host-0 2022-01-12T14:54:27Z +gcs-repo-f0ac7cbd f0ac7cbd gcs-repo host-0 2022-01-12T14:56:26Z +gcs-repo-9210ebb6 9210ebb6 gcs-repo host-0 2022-01-12T14:58:27Z +gcs-repo-0aff8890 0aff8890 gcs-repo host-0 2022-01-12T15:00:28Z +``` + +>You can also filter the snapshots as shown in the guide [here](https://stash.run/docs/{{< param "info.version" >}}/concepts/crds/snapshot/#working-with-snapshot). + +You can use the respective ID of the snapshot to restore a specific snapshot. + +The below example shows how you can pass a specific snapshot ID through the `snapshots` field of `rules` section. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: etcd-restore + namespace: demo +spec: + task: + name: etcd-restore-3.5.0 + params: + - name: initialCluster + value: "etcd-0=http://etcd-0.etcd:2380,etcd-1=http://etcd-1.etcd:2380,etcd-2=http://etcd-2.etcd:2380" + - name: initialClusterToken + value: "etcd-cluster-1" + - name: dataDir + value: "/var/run/etcd" + - name: workloadKind + value: "StatefulSet" + - name: workloadName + value: "etcd" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: etcd-appbinding + runtimeSettings: + container: + securityContext: + runAsUser: 0 + runAsGroup: 0 + rules: + - snapshots: [4bc21d6f] +``` + +>Please, do not specify multiple snapshots here. Each snapshot represents a complete backup of your database. Multiple snapshots are only usable during file/directory restore. + +### Running restore job as a specific user + +You can provide `securityContext` under `runtimeSettings.pod` section to run the restore job as a specific user. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: etcd-restore + namespace: demo +spec: + task: + name: etcd-restore-3.5.0 + params: + - name: initialCluster + value: "etcd-0=http://etcd-0.etcd:2380,etcd-1=http://etcd-1.etcd:2380,etcd-2=http://etcd-2.etcd:2380" + - name: initialClusterToken + value: "etcd-cluster-1" + - name: dataDir + value: "/var/run/etcd" + - name: workloadKind + value: "StatefulSet" + - name: workloadName + value: "etcd" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: etcd-appbinding + runtimeSettings: + container: + securityContext: + runAsUser: 0 + runAsGroup: 0 + rules: + - snapshots: [latest] +``` + +### Specifying Memory/CPU limit/request for the restore job + +Similar to the backup process, you can also provide `resources` field under the `runtimeSettings.container` section to limit the Memory/CPU for your restore job. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: etcd-restore + namespace: demo +spec: + task: + name: etcd-restore-3.5.0 + params: + - name: initialCluster + value: "etcd-0=http://etcd-0.etcd:2380,etcd-1=http://etcd-1.etcd:2380,etcd-2=http://etcd-2.etcd:2380" + - name: initialClusterToken + value: "etcd-cluster-1" + - name: dataDir + value: "/var/run/etcd" + - name: workloadKind + value: "StatefulSet" + - name: workloadName + value: "etcd" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: etcd-appbinding + runtimeSettings: + container: + securityContext: + runAsUser: 0 + runAsGroup: 0 + resources: + requests: + cpu: "200m" + memory: "1Gi" + limits: + cpu: "200m" + memory: "1Gi" + rules: + - snapshots: [latest] +``` diff --git a/content/docs/v2024.12.18/addons/etcd/overview/images/etcd-backup.svg b/content/docs/v2024.12.18/addons/etcd/overview/images/etcd-backup.svg new file mode 100644 index 0000000000..c8ec415493 --- /dev/null +++ b/content/docs/v2024.12.18/addons/etcd/overview/images/etcd-backup.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/etcd/overview/images/etcd-restore.svg b/content/docs/v2024.12.18/addons/etcd/overview/images/etcd-restore.svg new file mode 100644 index 0000000000..4078ec2b63 --- /dev/null +++ b/content/docs/v2024.12.18/addons/etcd/overview/images/etcd-restore.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/etcd/overview/index.md b/content/docs/v2024.12.18/addons/etcd/overview/index.md new file mode 100644 index 0000000000..06268c7223 --- /dev/null +++ b/content/docs/v2024.12.18/addons/etcd/overview/index.md @@ -0,0 +1,151 @@ +--- +title: Etcd Backup & Restore Overview | Stash +description: How Etcd Backup & Restore Works in Stash +menu: + docs_v2024.12.18: + identifier: stash-etcd-overview + name: How does it work? + parent: stash-etcd + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# How Stash Backups & Restores Etcd Database + +Stash `{{< param "info.version" >}}` supports backup and restore operation of many databases. This guide will give you an overview of how Etcd database backup and restore process works in Stash. + +## Backup + +Stash supports taking backup of Etcd database using [etcdctl](https://github.com/etcd-io/etcd/tree/main/etcdctl). It is the most flexible way to perform backup and restore of Etcd database. + +### How Backup Works + +The following diagram shows how Stash takes backup of a Etcd database. Open the image in a new tab to see the enlarged version. + +
+  Etcd Backup Overview +
Fig: Etcd Backup Overview
+
+ +The backup process consists of the following steps: + +1. At first, a user creates a secret with access credentials of the backend where the backed up data will be stored. + +2. Then, she creates a `Repository` crd that specifies the backend information along with the secret that holds the credentials to access the backend. + +3. Then, she creates a `BackupConfiguration` crd targeting the [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) crd of the desired database. The `BackupConfiguration` object also specifies the `Task` to use to backup the database. + +4. Stash operator watches for `BackupConfiguration` crd. + +5. Once Stash operator finds a `BackupConfiguration` crd, it creates a CronJob with the schedule specified in `BackupConfiguration` object to trigger backup periodically. + +6. On the next scheduled slot, the CronJob triggers a backup by creating a `BackupSession` crd. + +7. Stash operator also watches for `BackupSession` crd. + +8. When it finds a `BackupSession` object, it resolves the respective `Task` and `Function` and prepares a Job definition to backup. + +9. Then, it creates the Job to backup the targeted database. + +10. The backup Job reads the necessary information to connect with the database from the `AppBinding` crd. It also reads backend information and access credentials from `Repository` crd and Storage Secret respectively. + +11. Then, the Job takes snapshot of the targeted database using `etcdctl` and uploads the snapshot to the backend. Stash stores the snapshot temporarily in a directory before uploading that into the backend. You can limit the temporary directory size using `spec.TempDir` field of `BackupConfiguration` crd. + +12. Finally, when the backup is complete, the Job sends Prometheus metrics to the Pushgateway running inside Stash operator pod. It also updates the `BackupSession` and `Repository` status to reflect the backup completion. + +### How Restore from Backup Works + +The following diagram shows how Stash restores an Etcd database from a backup. Open the image in a new tab to see the enlarged version. + +
+  Etcd Database Restore Overview +
Fig: Etcd Restore Process Overview
+
+ +The restore process consists of the following steps: + +1. At first, a user creates a `RestoreSession` crd targeting the `AppBinding` of the desired database where the backed up data will be restored. It also specifies the `Repository` crd which holds the backend information and the `Task` to use to restore the target. + +2. Stash operator watches for `RestoreSession` object. + +3. Once it finds a `RestoreSession` object, it resolves the respective `Task` and `Function` and prepares a Job definition to restore. + +4. Then, it creates the Job to restore the target. + +5. The Job reads necessary information to connect with the database from respective `AppBinding` crd. It also reads backend information and access credentials from `Repository` crd and Storage Secret respectively. + +6. Then, the job downloads the backed up snapshot from the backend and restore that snapshot into the `Etcd` database. Stash stores the downloaded files temporarily before inserting into the targeted database. + +7. Finally, when the restore process is complete, the Job sends Prometheus metrics to the Pushgateway and update the `RestoreSession` status to reflect restore completion. + +## Next Steps + +- Backup your Etcd database using Stash following the guide from [here](/docs/v2024.12.18/addons/etcd/basic-auth/). diff --git a/content/docs/v2024.12.18/addons/etcd/tls/examples/appbinding.yaml b/content/docs/v2024.12.18/addons/etcd/tls/examples/appbinding.yaml new file mode 100644 index 0000000000..cde2f40b65 --- /dev/null +++ b/content/docs/v2024.12.18/addons/etcd/tls/examples/appbinding.yaml @@ -0,0 +1,16 @@ +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: etcd-appbinding + namespace: demo +spec: + clientConfig: + caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM2akNDQWRLZ0F3SUJBZ0lVZEJYNnU0RHRyNDA3WkZDTWN6Nzg4Y1YyWHVJd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0RURUxNQWtHQTFVRUF4TUNRMEV3SGhjTk1qRXhNREU1TVRBeE56QXdXaGNOTWpZeE1ERTRNVEF4TnpBdwpXakFOTVFzd0NRWURWUVFERXdKRFFUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCCkFMZmp6OEJhbDhpWTdjSTd2OHNFdndpSmJnQXBqTDIvNnVZbXBaQVZvcW50cjJCcmFMbTlCb1czdkMydm5tbWYKWDhRUFBsWnFIeUxzY1gxZUlpazJyWHJEYUdQaU45VHhLQXVrbWJjZXFsUXZScGNZZkVaVTBQMzhNc0xsQUlHaQpZamZxRjR5Z1UyMjA0L3FucVVPbFFjLzh2MmJpRFNSQXNUM1NUT2FVemdMd05KT20wOUlqT1dUQW15Q2xXWmxnClJmV2tETzVTQ0xZd1pmQ1Z1MTdBalJRMTNsZTdocW9GcW9SUW96dUZQMFp0dlVFdWVPSXlSa3ZlYTFRYVNyTjgKcm1aN1BaL0lIb3dyNjFtMFd0bVE3ckw1eTMyOTgxb3hRNGg2UHdLMGNGNVNyOG9WRUR0TGZVeE1OWHpoMXpRUAorY2FhZWlUWklyc1dqRGNxSm9VWk1wVUNBd0VBQWFOQ01FQXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkCkV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGQ1FzZmsvcHJxWGwxKzhIODk1WUFmZzR2THQxTUEwR0NTcUcKU0liM0RRRUJDd1VBQTRJQkFRQmpOOHlxalhEaUdqaDFuUGdKVFpZa1FCa1E4SFZHeThIdlFWWG0zdFhHM3RLcApTaVdDQTlPbittR0xZZTlCMi9lOEFJNkIyMFB1Z0NZWHljMHVOb1RiSFdiZ01pNURiNEVZYXdDdVpkN3M4MXlUClRXY1N0VWZFeUdKNW1ycWZ6OFFPaUt0Sk1UeWFYbHllWllURnhnWUsyOThTcDhubFBRQlgzNVBDakZTbXZwa1UKY0N5TllYMDF1RnFhWE9FZTdkTnpBUmhIaU1xVFM0dkNUUnFrbFpMWHB6a3ViZER3WTVKK3gzYmptcDk1RUtmVwpJbkhERTJ2ckxsU0crZDVWNnBuUG54bXc3aGg2L0NMUTNVMXM3V1d0clVlSU9NUDdCcFJxRG05TjJhajJXUHNLCmpEYXdRcFpGdGhmbEdJR1ZqUUNCNFMwTkQzWWliSkVqdHZHMnBuTlkKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ== + service: + name: etcd + port: 2379 + scheme: https + secret: + name: etcd-client-certs + type: etcd + version: 3.5.0 \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/etcd/tls/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/addons/etcd/tls/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..40b8ee2f8e --- /dev/null +++ b/content/docs/v2024.12.18/addons/etcd/tls/examples/backupconfiguration.yaml @@ -0,0 +1,20 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: etcd-tls-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: etcd-backup-3.5.0 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: etcd-appbinding + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/etcd/tls/examples/etcd-secret.yaml b/content/docs/v2024.12.18/addons/etcd/tls/examples/etcd-secret.yaml new file mode 100644 index 0000000000..0323bb8cb5 --- /dev/null +++ b/content/docs/v2024.12.18/addons/etcd/tls/examples/etcd-secret.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: Secret +metadata: + name: etcd-stash-auth + namespace: demo +type: Opaque +data: + client-key.pem: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBc1ZVeUQ3L25QanBnOWlrYlpIdk5pN2ZUZFUyM3NXLzZjT2p6cWdXYm9HRDJLbTdFCk9GeVFXb2FacWxWNHM5V3F3cy9vaGxjb0JHUzMrVUVNbkJjNi9QU0tTUmxVUUUxS3ZqeXhFUkwzU0Yxc3h4UnMKMExVZVFnWno2T1dubkhORTBjNXZObjlSUVo5VENOeHl0WjBqVi94MG9wd0c3KzBzNSs0R05GbmZQMjB5ZXFLNQpDM1JEbEJSWVFKRWZMYTR5dHh6TjI1TENUQ2dsaTlkdWZoaC9ieXVLdHUxVzVaTmowVVh0bXRNRkd5N2JhZ1J2CmlLQ0NqVDQvc0RqWXpTWlZ2VitESlFFemhLZmdqc2NrNXBhaTJsWFhpaXJQVzE4N3JUSkxoc1pacWt3NUlCWEEKSUpqWjFBSSttYytSUE1mVitxV0h0ZG5XOHM1TDZxd2VvVUdwUlFJREFRQUJBb0lCQUFMMGJIVWV1WGVyK1ZtZwpyYmdxNSszZ0RrSHlIWkZ6VURUNWJMWDBpZmRPSmt2bXRKWkwxSXZ0bWpuZ1dyYUVaT2dDRnRuR01nQ0F2U0FHCkdYT3dYMmMvbTk1RDhjZHdna0pST0pJVVF0S04yL1lsUFBydFNhZkgrNzV4dFMxQ0xtOWdoVEhmUlRkV3RFZDkKaE52SjFvRHN6L1Mxck5mcWw4ajFpbHpzOG05WUYxWEtoRlozQmpSWHBFRFdCWUIzeTE2dGV6RlU0NlJaMSs1UwpaR3pTakxhOTNuK0JEeGc2ejdMVjhON0xyYXVQY3lCbkFnUC9KMlR0MTQ3bHM2cHhUWlh2UFd0ZXdvRHV1aHF1CndWQ1FkUWZ3bmlPTmJmbUxDNUp6OWNrNzJvWUg2ditjbEtFc05GT2xZWjdjRGkzaTZ6K2RuK1JOYTUvc295Mm0KV0RsQ1ZURUNnWUVBNHlUSGlXYk5FMEk1N2NnNDNlWkJ6eTBSMGtvTktJRGlJMWZkQmRBWUcraU1vZzZUSEdBSApvYkRFSnI0YkZ3aUM1QmlYeHVxZ2RQSVhqcXNNTGtYM2Zra3ErNkh0VS9XRS9pSmJyRnN6clUreFdoYmxEc0ZPCkRCUWw3SjlkaitRaGcyeXBOcEtjUWVYS0E5WVdvV1VqTkp0Z1dVMG81MmFVcUF3NnRKWW8wMzhDZ1lFQXg5eDAKZVg1YkUyWU02ZU9tZWVXWWdBZC93cVV4NmlYaWl4S2M3Z1Z6WG9qVUVaaUQwVEdrSi9RTW9TNHNHV01OekRlYQorbTdXNzVSTUZoOGlzQjdlTUxlSE0zRTRBV08yVlc4SUVuM1h6U0JLNngvcWIwS2VoWVNIS0R4YnQ0UDBGSVdTCjdYc0pYc09mRlRMclZLbHYyZnE2ZzBwZ1R1Ri9QZzdaRUIxQWxUc0NnWUJ4VDJhdTEzYVVGZVI2QnZpL1VWOGcKNzdYRk5xV3J2K2VQaEFSQkl4Ynp6U1Zpcm15YXFoa0VndjdHNk96d3A1Rk1JaXlNMFh5citoemdVZG1vdDhTSAozZzR3S3c0T1pSc3IvNDNGeEZWYUxyZ2xYZWgwWE9BSFRJSENzWmxsNzRMOFlkZGozdTFPUGtoeGMzb2tseVJoCjJPVE9oNXhSR3k0clNyWjZZYklLRndLQmdDUEg1eDVkTGNjQ1RTdU9jeDU5cVZpNmZ2Z0ZCVE9yUnF5cFQya1oKbHJjRS9ocU1XSVVhUXc1WUZlN0JTbW5kSHZwQnRrQkJtYjlZcUdxSmRuZGJmMkh2YVlnZksreXJ3bGYzUWRXMQpxKzN3YXhrL0pJUjR3OUtaa0d6MnFXRG9nY2t1eE1nNWI4c0VjTFdsNFJYT0k5VTlteWlvSnlmWUhTU3FHZGhWCnRGdERBb0dCQUlEZ1RVOHZNL2VkTml3TVZSMmRnZjRXNEVhcE9zWXhmdFZnOU5YUFNOOEdVNHFtWURCNGtIWnMKQjg5dzFEajB0WU0xQnNseXRYN3llSTUxNi8rUDVuYnQ4eHRtS3RUWVlrWmlvOGFEM2FaZXh0ZTIySXRjTE1xTwpMMERWZ0s3bzRxMVdUVWVCZWkxbDB4b3JXWUR0a0tIYkUvWGJDeHFtOGgzWDdpMlVWOWZFCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0t + client.pem: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURnekNDQW11Z0F3SUJBZ0lVT1VLSTFzY2pVaEROTEJPazdma3J4dFFlNU9Fd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0RURUxNQWtHQTFVRUF4TUNRMEV3SGhjTk1qRXhNREU1TVRFMU56QXdXaGNOTWpZeE1ERTRNVEUxTnpBdwpXakFSTVE4d0RRWURWUVFERXdaamJHbGxiblF3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLCkFvSUJBUUN4VlRJUHYrYytPbUQyS1J0a2U4Mkx0OU4xVGJleGIvcHc2UE9xQlp1Z1lQWXFic1E0WEpCYWhwbXEKVlhpejFhckN6K2lHVnlnRVpMZjVRUXljRnpyODlJcEpHVlJBVFVxK1BMRVJFdmRJWFd6SEZHelF0UjVDQm5Qbwo1YWVjYzBUUnptODJmMUZCbjFNSTNISzFuU05YL0hTaW5BYnY3U3puN2dZMFdkOC9iVEo2b3JrTGRFT1VGRmhBCmtSOHRyakszSE0zYmtzSk1LQ1dMMTI1K0dIOXZLNHEyN1ZibGsyUFJSZTJhMHdVYkx0dHFCRytJb0lLTlBqK3cKT05qTkpsVzlYNE1sQVRPRXArQ094eVRtbHFMYVZkZUtLczliWHp1dE1rdUd4bG1xVERrZ0ZjQWdtTm5VQWo2Wgp6NUU4eDlYNnBZZTEyZGJ5emt2cXJCNmhRYWxGQWdNQkFBR2pnZFl3Z2RNd0RnWURWUjBQQVFIL0JBUURBZ1dnCk1DTUdBMVVkSlFRY01Cb0dDQ3NHQVFVRkJ3TUJCZ2dyQmdFRkJRY0RBZ1lFVlIwbEFEQU1CZ05WSFJNQkFmOEUKQWpBQU1CMEdBMVVkRGdRV0JCU3dUcWpsZWlxVCsyU1pHM1lndzBTY3RDeEkxekFmQmdOVkhTTUVHREFXZ0JRawpMSDVQNmE2bDVkZnZCL1BlV0FINE9MeTdkVEJPQmdOVkhSRUVSekJGZ2c5bGRHTmtMWFJzY3kwd0xtVjBZMlNDCkQyVjBZMlF0ZEd4ekxURXVaWFJqWklJUFpYUmpaQzEwYkhNdE1pNWxkR05rZ2dSbGRHTmtod1IvQUFBQmh3UUEKQUFBQU1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQXJlNHd2b2hGK094dHpONGgvM0RjUHd1dk5hU3BoMnpEWQp4SUwzVDY1U2kxcmNYL3NPdmVVZ0hBZ0RIeGRqeWoyRXB0ckpDWFBsaElQSGt4NWYydHVzV1hxRWVUNHhVdmo3CnlGaXZTSFR3OEtBSWlWL0FjWi96Z2JXYXFqaXo4dTFzd2JZVXFGWERkbDR2ZktVOFc2dVh2elU5U2k2RDRMTWwKbEtHMzY0VStCVzcxS2lBNnR3MmZ1ZitOd3E0TkFNUHZhRlhZaU5JOHVWUDV5eFNFZnBFcldicjBFZ2JwU3JWcwo4SVJPTEJ4cFo5b09qWGloNHBMWTFXV29xVXR4bVR6SWZhMjgxRi85ZzAyMUVrMmErb1lKbnZhMjQvMGEwNHlKCkYyYTM1VDZ0eVhsU0oxMGhkTFpDbi9QMnVNTkNJajBVZk5LZ1M3RVVMQ0x0UnpzbzhMWGkKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ== \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/etcd/tls/examples/etcd-tls.yaml b/content/docs/v2024.12.18/addons/etcd/tls/examples/etcd-tls.yaml new file mode 100644 index 0000000000..5b827b1f2c --- /dev/null +++ b/content/docs/v2024.12.18/addons/etcd/tls/examples/etcd-tls.yaml @@ -0,0 +1,80 @@ +apiVersion: v1 +kind: Service +metadata: + name: etcd + namespace: demo +spec: + clusterIP: None + ports: + - port: 2379 + name: client + - port: 2380 + name: peer + selector: + app: etcd-tls +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: etcd-tls + namespace: demo + labels: + app: etcd-tls +spec: + serviceName: etcd + replicas: 3 + selector: + matchLabels: + app: etcd-tls + template: + metadata: + name: etcd-tls + namespace: demo + labels: + app: etcd-tls + spec: + containers: + - name: etcd + image: gcr.io/etcd-development/etcd:v3.5.0 + ports: + - containerPort: 2379 + name: client + - containerPort: 2380 + name: peer + volumeMounts: + - name: data + mountPath: /var/run/etcd + - name: etcd-secret + mountPath: /etc/etcd-secret + command: + - /bin/sh + - -c + - | + PEERS="etcd-tls-0=https://etcd-tls-0.etcd:2380,etcd-tls-1=https://etcd-tls-1.etcd:2380,etcd-tls-2=https://etcd-tls-2.etcd:2380" ;\ + exec etcd --name ${HOSTNAME} \ + --listen-peer-urls https://0.0.0.0:2380 \ + --listen-client-urls https://0.0.0.0:2379 \ + --advertise-client-urls https://${HOSTNAME}.etcd:2379 \ + --initial-advertise-peer-urls https://${HOSTNAME}.etcd:2380 \ + --initial-cluster etcd-tls-0=https://etcd-tls-0.etcd:2380,etcd-tls-1=https://etcd-tls-1.etcd:2380,etcd-tls-2=https://etcd-tls-2.etcd:2380 \ + --initial-cluster-token etcd-cluster-1 \ + --data-dir /var/run/etcd \ + --client-cert-auth \ + --cert-file "/etc/etcd-secret/server.pem" \ + --key-file "/etc/etcd-secret/server-key.pem" \ + --trusted-ca-file "/etc/etcd-secret/ca.pem" \ + --peer-auto-tls + volumes: + - name: etcd-secret + secret: + secretName: etcd-server-certs + volumeClaimTemplates: + - metadata: + name: data + namespace: demo + spec: + storageClassName: standard + accessModes: ["ReadWriteOnce"] + resources: + requests: + storage: 1Gi diff --git a/content/docs/v2024.12.18/addons/etcd/tls/examples/repository.yaml b/content/docs/v2024.12.18/addons/etcd/tls/examples/repository.yaml new file mode 100644 index 0000000000..3ce106877d --- /dev/null +++ b/content/docs/v2024.12.18/addons/etcd/tls/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /demo/etcd/etcd-tls + storageSecretName: gcs-secret \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/etcd/tls/examples/restoresession.yaml b/content/docs/v2024.12.18/addons/etcd/tls/examples/restoresession.yaml new file mode 100644 index 0000000000..27dea9f89b --- /dev/null +++ b/content/docs/v2024.12.18/addons/etcd/tls/examples/restoresession.yaml @@ -0,0 +1,33 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: etcd-tls-restore + namespace: demo +spec: + task: + name: etcd-restore-3.5.0 + params: + - name: initialCluster + value: "etcd-tls-0=https://etcd-tls-0.etcd:2380,etcd-tls-1=https://etcd-tls-1.etcd:2380,etcd-tls-2=https://etcd-tls-2.etcd:2380" + - name: initialClusterToken + value: "etcd-cluster-1" + - name: dataDir + value: "/var/run/etcd" + - name: workloadKind + value: "StatefulSet" + - name: workloadName + value: "etcd-tls" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: etcd-appbinding + runtimeSettings: + container: + securityContext: + runAsUser: 0 + runAsGroup: 0 + rules: + - snapshots: [latest] \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/etcd/tls/images/etcd-tls-backup.jpg b/content/docs/v2024.12.18/addons/etcd/tls/images/etcd-tls-backup.jpg new file mode 100644 index 0000000000..e94ec1fb49 Binary files /dev/null and b/content/docs/v2024.12.18/addons/etcd/tls/images/etcd-tls-backup.jpg differ diff --git a/content/docs/v2024.12.18/addons/etcd/tls/index.md b/content/docs/v2024.12.18/addons/etcd/tls/index.md new file mode 100644 index 0000000000..8d698b9f7c --- /dev/null +++ b/content/docs/v2024.12.18/addons/etcd/tls/index.md @@ -0,0 +1,732 @@ +--- +title: TLS Secured Etcd Backup | Stash +description: Backup TLS Secured Etcd using Stash +menu: + docs_v2024.12.18: + identifier: etcd-backup-tls + name: Etcd Cluster with TLS + parent: stash-etcd + weight: 30 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup & Restore an Etcd Cluster with TLS + +Stash `{{< param "info.version" >}}` supports backup and restoration of Etcd database. This guide will show you how you can backup & restore a TLS secured Etcd cluster using Stash. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. +- Install Stash in your cluster following the steps [here](/docs/v2024.12.18/setup/install/stash/). +- If you are not familiar with how Stash backup and restore Etcd databases, please check the following guide [here](/docs/v2024.12.18/addons/etcd/overview/). + +You have to be familiar with following custom resources: + +- [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) +- [Function](/docs/v2024.12.18/concepts/crds/function/) +- [Task](/docs/v2024.12.18/concepts/crds/task/) +- [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) +- [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) +- [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + +To keep things isolated, we are going to use a separate namespace called `demo` throughout this tutorial. Create `demo` namespace if you haven't created already. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> Note: YAML files used in this tutorial are stored [here](https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/etcd/tls/examples). + +## Prepare Etcd + +In this section, we are going to deploy a TLS secured Etcd cluster. Then, we will insert some sample data into the cluster. + + +### Create Certificates +Let's create certificates that our Etcd cluster will use for authenticating client requests and peer communications. We will be using Etcd recommended [cfssl](https://github.com/cloudflare/cfssl) tool for creating our necessary certificates. + +If you have `go` installed on your machine, you can run the following commands to install `cfssl`, +```bash +$ go get github.com/cloudflare/cfssl/cmd/cfssl +$ go get github.com/cloudflare/cfssl/cmd/cfssljson +```` + +To create the necessary certificates using `cfssl` you can follow the commands below. + +```bash +$ echo '{"CN":"CA","key":{"algo":"rsa","size":2048}}' | cfssl gencert -initca - | cfssljson -bare ca - + + +$ echo '{"signing":{"default":{"expiry":"43800h","usages":["signing","key encipherment","server auth","client auth", "any"]}}}' > ca-config.json + + +$ export ADDRESS='127.0.0.1,0.0.0.0,etcd-tls-0.etcd,etcd-tls-1.etcd,etcd-tls-2.etcd,etcd' + +$ export NAME=server + +$ echo '{"CN":"'$NAME'","hosts":[""],"key":{"algo":"rsa","size":2048}}' | cfssl gencert -config=ca-config.json -ca=ca.pem -ca-key=ca-key.pem -hostname="$ADDRESS" - | cfssljson -bare $NAME + + +$ export NAME=client + +$ echo '{"CN":"'$NAME'","hosts":[""],"key":{"algo":"rsa","size":2048}}' | cfssl gencert -config=ca-config.json -ca=ca.pem -ca-key=ca-key.pem -hostname="$ADDRESS" - | cfssljson -bare $NAME +```` + +We have stored our SANs in the `ADDRESS` variable here. The above commands should create 5 certificates named `ca.pem`, `server.pem`, `server-key.pem`, `client.pem`, and `client-key.pem`. The `ca.pem` is a self-signed CA certificate. Rest of the certificates are signed by this CA. + +### Create Secret +Let's create a generic Secret with the certificates created above. +```bash +$ kubectl create secret generic -n demo etcd-server-certs\ + --from-file=./ca.pem\ + --from-file=./server.pem\ + --from-file=./server-key.pem\ + --from-file=./client.pem\ + --from-file=./client-key.pem + +secret/etcd-server-certs created +```` + +### Deploy Etcd + +At first, let's deploy an Etcd cluster. Here, we will use a StatefulSet and a Service to deploy an Etcd cluster consisting of three members. The Service is used for handling peer communications and client requests. + +Here, are the sample YAMLs that we are going to use to deploy the Etcd cluster, + +```yaml +apiVersion: v1 +kind: Service +metadata: + name: etcd + namespace: demo +spec: + clusterIP: None + ports: + - port: 2379 + name: client + - port: 2380 + name: peer + selector: + app: etcd-tls +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: etcd-tls + namespace: demo + labels: + app: etcd-tls +spec: + serviceName: etcd + replicas: 3 + selector: + matchLabels: + app: etcd-tls + template: + metadata: + name: etcd-tls + namespace: demo + labels: + app: etcd-tls + spec: + containers: + - name: etcd + image: gcr.io/etcd-development/etcd:v3.5.0 + ports: + - containerPort: 2379 + name: client + - containerPort: 2380 + name: peer + volumeMounts: + - name: data + mountPath: /var/run/etcd + - name: etcd-secret + mountPath: /etc/etcd-secret + command: + - /bin/sh + - -c + - | + PEERS="etcd-tls-0=https://etcd-tls-0.etcd:2380,etcd-tls-1=https://etcd-tls-1.etcd:2380,etcd-tls-2=https://etcd-tls-2.etcd:2380" ;\ + exec etcd --name ${HOSTNAME} \ + --listen-peer-urls https://0.0.0.0:2380 \ + --listen-client-urls https://0.0.0.0:2379 \ + --advertise-client-urls https://${HOSTNAME}.etcd:2379 \ + --initial-advertise-peer-urls https://${HOSTNAME}.etcd:2380 \ + --initial-cluster etcd-tls-0=https://etcd-tls-0.etcd:2380,etcd-tls-1=https://etcd-tls-1.etcd:2380,etcd-tls-2=https://etcd-tls-2.etcd:2380 \ + --initial-cluster-token etcd-cluster-1 \ + --data-dir /var/run/etcd \ + --client-cert-auth \ + --cert-file "/etc/etcd-secret/server.pem" \ + --key-file "/etc/etcd-secret/server-key.pem" \ + --trusted-ca-file "/etc/etcd-secret/ca.pem" \ + --peer-auto-tls + volumes: + - name: etcd-secret + secret: + secretName: etcd-server-certs + volumeClaimTemplates: + - metadata: + name: data + namespace: demo + spec: + storageClassName: standard + accessModes: ["ReadWriteOnce"] + resources: + requests: + storage: 1Gi +``` + +Let's deploy the Etcd cluster we have shown above, +```bash +$ kubectl apply -f https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/etcd/tls/examples/etcd.yaml +service/etcd created +statefulset.apps/etcd-tls created +``` + +Now, let's wait for the database pods `etcd-tls-0`, `etcd-tls-1`, and `etcd-tls-2` to go into `Running` state, + +```bash +❯ kubectl get pods -n demo --selector=app=etcd-tls + +NAME READY STATUS RESTARTS AGE +etcd-tls-0 1/1 Running 0 6m +etcd-tls-1 1/1 Running 0 6m +etcd-tls-2 1/1 Running 0 6m +``` + +Once the database pods are in `Running` state, verify that the Etcd cluster is ready to accept connections. Let's exec into the `etcd-tls-0` database pod and check cluster's health. + +```bash +❯ kubectl exec -it -n demo etcd-tls-0 -- /bin/sh + +127.0.0.1:2379> etcdctl --cacert /etc/etcd-secret/ca.pem --cert /etc/etcd-secret/client.pem --key /etc/etcd-secret/client-key.pem endpoint health +127.0.0.1:2379 is healthy: successfully committed proposal: took = 8.497131ms +``` +We can see from the above output that our Etcd cluster is ready to accept connections. + +### Insert Sample Data +Now, we are going to exec into any of the database pods and insert some sample data. + +Let's exec into the `etcd-tls-0` pod for inserting sample data. + +```bash +❯ kubectl exec -it -n demo etcd-tls-0 -- /bin/sh +127.0.0.1:2379> etcdctl --cacert /etc/etcd-secret/ca.pem --cert /etc/etcd-secret/client.pem --key /etc/etcd-secret/client-key.pem put foo bar +OK +127.0.0.1:2379> etcdctl --cacert /etc/etcd-secret/ca.pem --cert /etc/etcd-secret/client.pem --key /etc/etcd-secret/client-key.pem put foo2 bar2 +OK +127.0.0.1:2379> etcdctl --cacert /etc/etcd-secret/ca.pem --cert /etc/etcd-secret/client.pem --key /etc/etcd-secret/client-key.pem put foo3 bar3 +OK +127.0.0.1:2379> etcdctl --cacert /etc/etcd-secret/ca.pem --cert /etc/etcd-secret/client.pem --key /etc/etcd-secret/client-key.pem put foo4 bar4 +OK + +# Verify that the data has been inserted successfully +127.0.0.1:2379> etcdctl --cacert /etc/etcd-secret/ca.pem --cert /etc/etcd-secret/client.pem --key /etc/etcd-secret/client-key.pem get --prefix foo +foo +bar +foo2 +bar2 +foo3 +bar3 +foo4 +bar4 +127.0.0.1:2379> exit +``` + +We have successfully deployed an Etcd cluster and inserted some sample data into it. In the subsequent sections, we are going to backup these data using Stash. + + +## Prepare for Backup + +In this section, we are going to prepare the necessary resources (e.g., connection information, backend information, etc.) before backup. + +### Ensure Etcd Addon + +When you install Stash, it will automatically install all the official addons. Make sure that Etcd addon has been installed properly using the following command. + +```bash +❯ kubectl get tasks.stash.appscode.com | grep etcd +etcd-backup-3.5.0 18m +etcd-restore-3.5.0 18m +``` + +This addon should be able to take backup of the databases with matching major versions as discussed in [Addon Version Compatibility](/docs/v2024.12.18/addons/etcd/README#addon-version-compatibility). + +### Create Secret +To access TLS secured Etcd cluster from Stash, we need to create a Secret. Let's create the Secret containing `client-key,pem` and `client.pem` from the certificates we have created earlier. + +```bash +kc create secret generic -n demo etcd-client-certs\ + --from-file=./client.pem\ + --from-file=./client-key.pem +secret/etcd-client-certs created +``` + +### Create AppBinding + +Stash needs to know how to connect with the Etcd cluster. An `AppBinding` exactly provides this information. It holds the Service and Secret information of the Etcd cluster. You have to point to the respective `AppBinding` as a target of backup instead of the Etcd cluster itself. + +Here is the YAML of the `AppBinding` that we are going to create for the Etcd cluster we have deployed earlier. + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: etcd-appbinding + namespace: demo +spec: + clientConfig: + caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM2akNDQWRLZ0F3SUJBZ0lVZEJYNnU0RHRyNDA3WkZDTWN6Nzg4Y1YyWHVJd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0RURUxNQWtHQTFVRUF4TUNRMEV3SGhjTk1qRXhNREU1TVRBeE56QXdXaGNOTWpZeE1ERTRNVEF4TnpBdwpXakFOTVFzd0NRWURWUVFERXdKRFFUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCCkFMZmp6OEJhbDhpWTdjSTd2OHNFdndpSmJnQXBqTDIvNnVZbXBaQVZvcW50cjJCcmFMbTlCb1czdkMydm5tbWYKWDhRUFBsWnFIeUxzY1gxZUlpazJyWHJEYUdQaU45VHhLQXVrbWJjZXFsUXZScGNZZkVaVTBQMzhNc0xsQUlHaQpZamZxRjR5Z1UyMjA0L3FucVVPbFFjLzh2MmJpRFNSQXNUM1NUT2FVemdMd05KT20wOUlqT1dUQW15Q2xXWmxnClJmV2tETzVTQ0xZd1pmQ1Z1MTdBalJRMTNsZTdocW9GcW9SUW96dUZQMFp0dlVFdWVPSXlSa3ZlYTFRYVNyTjgKcm1aN1BaL0lIb3dyNjFtMFd0bVE3ckw1eTMyOTgxb3hRNGg2UHdLMGNGNVNyOG9WRUR0TGZVeE1OWHpoMXpRUAorY2FhZWlUWklyc1dqRGNxSm9VWk1wVUNBd0VBQWFOQ01FQXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkCkV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGQ1FzZmsvcHJxWGwxKzhIODk1WUFmZzR2THQxTUEwR0NTcUcKU0liM0RRRUJDd1VBQTRJQkFRQmpOOHlxalhEaUdqaDFuUGdKVFpZa1FCa1E4SFZHeThIdlFWWG0zdFhHM3RLcApTaVdDQTlPbittR0xZZTlCMi9lOEFJNkIyMFB1Z0NZWHljMHVOb1RiSFdiZ01pNURiNEVZYXdDdVpkN3M4MXlUClRXY1N0VWZFeUdKNW1ycWZ6OFFPaUt0Sk1UeWFYbHllWllURnhnWUsyOThTcDhubFBRQlgzNVBDakZTbXZwa1UKY0N5TllYMDF1RnFhWE9FZTdkTnpBUmhIaU1xVFM0dkNUUnFrbFpMWHB6a3ViZER3WTVKK3gzYmptcDk1RUtmVwpJbkhERTJ2ckxsU0crZDVWNnBuUG54bXc3aGg2L0NMUTNVMXM3V1d0clVlSU9NUDdCcFJxRG05TjJhajJXUHNLCmpEYXdRcFpGdGhmbEdJR1ZqUUNCNFMwTkQzWWliSkVqdHZHMnBuTlkKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ== + service: + name: etcd + port: 2379 + scheme: https + secret: + name: etcd-client-certs + type: etcd + version: 3.5.0 +``` + +Here, + +- `.spec.clientConfig.caBundle` specifies the base64 encoded CA certificate. Here, we have used the base64 encoded version of our previously generated `ca.pem` certificate. +- `.spec.clientConfig.Service` specifies the Service information to use to connect with the Etcd cluster. +- `.spec.secret` specifies the name of the Secret that holds the necessary client certificates. +- `.spec.type` specifies the type of the database. + +Let's create the `AppBinding` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/etcd/tls/examples/appbinding.yaml +appbinding.appcatalog.appscode.com/etcd-appbinding created +``` + +### Prepare Backend + +We are going to store our backed up data into a GCS bucket. So, we need to create a Secret with GCS credentials and a `Repository` object with the bucket information. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +**Create Storage Secret:** + +At first, let's create a secret called `gcs-secret` with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat downloaded-sa-key.json > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create Repository:** + +Now, create a `Repository` object with the information of your desired bucket. Below is the YAML of `Repository` object we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /demo/etcd/etcd-tls + storageSecretName: gcs-secret +``` + +Let's create the `Repository` we have shown above, + +```bash +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/etcd/tls/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our data into our desired backend. + +### Backup + +To schedule a backup, we need to create a `BackupConfiguration` object targeting the respective `AppBinding` of our Etcd cluster. Then, Stash will create a CronJob to periodically backup the cluster. + +#### Create BackupConfiguration + +Below, is the YAML for `BackupConfiguration` object that we are going to use to backup the TLS enabled Etcd cluster we have deployed earlier, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: etcd-tls-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: etcd-backup-3.5.0 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: etcd-appbinding + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +Here, + +- `.spec.schedule` specifies that we want to backup the streams at 5 minutes intervals. +- `.spec.task.name` specifies the name of the Task object that specifies the necessary Functions and their execution order to backup our Etcd cluster. +- `.spec.repository.name` specifies the Repository CR name we have created earlier with backend information. +- `.spec.target.ref` refers to the AppBinding object that holds the connection information of our targeted Etcd cluster. +- `.spec.retentionPolicy` specifies a policy indicating how we want to cleanup the old backups. + +Let's create the `BackupConfiguration` object we have shown above, + +```bash +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/etcd/tls/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/etcd-tls-backup created +``` + +### Verify Backup Setup Successful + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. Let's verify the `Phase` of the BackupConfiguration, +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +etcd-tls-backup etcd-backup-3.5.0 */5 * * * * Ready 11s +``` + +#### Verify CronJob + +Stash will create a CronJob with the schedule specified in `spec.schedule` field of `BackupConfiguration` object. + +Verify that the CronJob has been created using the following command, + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-trigger-etcd-tls-backup */5 * * * * False 0 65s +``` + +#### Wait for BackupSession + +The `stash-trigger-etcd-tls-backup` CronJob will trigger a backup on each scheduled slot by creating a `BackupSession` object. + +Now, wait for a schedule to appear. Run the following command to watch for `BackupSession` object, + +```bash +❯ kubectl get backupsession -n demo -w +NAME INVOKER-TYPE INVOKER-NAME PHASE DURATION AGE +etcd-tls-backup-q2dk6 BackupConfiguration etcd-tls-backup Succeeded 41s 60s +``` + +Here, the phase `Succeeded` means that the backup process has been completed successfully. + +#### Verify Backup + +Now, we are going to verify whether the backed up data is present in the backend or not. Once a backup is completed, Stash will update the respective `Repository` object to reflect the backup completion. Check that the repository `gcs-repo` has been updated by the following command, + +```bash +❯ kubectl get repository -n demo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo true 42.105 KiB 2 2m10s 47m +``` + +Now, if we navigate to the GCS bucket, we will see the backed up data has been stored in `demo/nats/sample-nats-tls` directory as specified by `.spec.backend.gcs.prefix` field of the `Repository` object. + +
+ Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ + + +> Note: Stash keeps all the backed up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Restore Etcd + +If you have followed the previous sections properly, you should have a successful backup of your TLS enabled Etcd cluster. Now, we are going to show how you can restore the Etcd cluster from the backup. + +### Restore Into the Same Etcd Cluster + +You can restore your data into the same Etcd cluster you have taken backup from or into a different Etcd cluster. In this section, we are going to show you how to restore data in the same Etcd cluster which maybe necessary when you have accidentally deleted any data from the running cluster. + + +#### Temporarily Pause Backup + +At first, let's stop taking any further backup of the Etcd cluster so that no backup runs after we delete the sample data. We are going to pause the `BackupConfiguration` object. Stash will stop taking any further backup when the `BackupConfiguration` is paused. + +Let's pause the `etcd-tls-backup` BackupConfiguration, + +```bash +$ kubectl patch backupconfiguration -n demo etcd-tls-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/etcd-tls-backup patched +``` + +Verify that the `BackupConfiguration` has been paused, + +```bash +❯ kubectl get backupconfiguration -n demo etcd-tls-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +etcd-tls-backup etcd-backup-3.5.0 */5 * * * * true Ready 25m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the `BackupConfiguration` has been paused. + +Stash will also suspend the respective CronJob. + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-trigger-etcd-tls-backup */5 * * * * True 0 6m25s 95m +``` + +#### Simulate Disaster + +Now, let's simulate an accidental deletion scenario. Here, we are going to exec into the `etcd-tls-0` database pod and delete the sample data we have inserted earlier. + +```bash +❯ kubectl exec -it -n demo etcd-tls-0 -- /bin/sh +127.0.0.1:2379> etcdctl --cacert /etc/etcd-secret/ca.pem --cert /etc/etcd-secret/client.pem --key /etc/etcd-secret/client-key.pem del foo +1 +127.0.0.1:2379> etcdctl --cacert /etc/etcd-secret/ca.pem --cert /etc/etcd-secret/client.pem --key /etc/etcd-secret/client-key.pem del foo2 +1 +127.0.0.1:2379> etcdctl --cacert /etc/etcd-secret/ca.pem --cert /etc/etcd-secret/client.pem --key /etc/etcd-secret/client-key.pem del foo3 +1 +127.0.0.1:2379> etcdctl --cacert /etc/etcd-secret/ca.pem --cert /etc/etcd-secret/client.pem --key /etc/etcd-secret/client-key.pem del foo4 +1 + +# Verify that the data has been deleted successfully +127.0.0.1:2379> etcdctl --cacert /etc/etcd-secret/ca.pem --cert /etc/etcd-secret/client.pem --key /etc/etcd-secret/client-key.pem get --prefix foo +(nil) +127.0.0.1:2379> exit +``` + +#### Create RestoreSession + +To restore the database, you have to create a `RestoreSession` object pointing to the `AppBinding` of the targeted database. + +Here, is the YAML of the `RestoreSession` object that we are going to use for restoring our Etcd database cluster. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: etcd-tls-restore + namespace: demo +spec: + task: + name: etcd-restore-3.5.0 + params: + - name: initialCluster + value: "etcd-tls-0=https://etcd-tls-0.etcd:2380,etcd-tls-1=https://etcd-tls-1.etcd:2380,etcd-tls-2=https://etcd-tls-2.etcd:2380" + - name: initialClusterToken + value: "etcd-cluster-1" + - name: dataDir + value: "/var/run/etcd" + - name: workloadKind + value: "StatefulSet" + - name: workloadName + value: "etcd-tls" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: etcd-appbinding + runtimeSettings: + container: + securityContext: + runAsUser: 0 + runAsGroup: 0 + rules: + - snapshots: [latest] +``` + +Here, + +- `.spec.task.name` specifies the name of the Task object that specifies the necessary Functions and their execution order to restore an Etcd database. +- `.spec.task.params` refers to the names and values of the Params objects specifying necessary parameters and their values for restoring backup data into an Etcd cluster. We need to specify the folowing parameters, + - `initialcluster` parameter refers to the initial cluster configuration of the Etcd cluster and it must be the same as the initial cluster configuration of the deployed Etcd cluster. + - `dataDir` parameter refers to the datadir of the deployed Etcd cluster where the backed up data will get restored. + - `workloadKind` parameter refers to the workload e.g. Pod/StatefulSet we have used to deploy the Etcd cluster. + - `workloadName` parameter refers to the workload name we have used to deploy the Etcd cluster. +- `.spec.repository.name` specifies the Repository object that holds the backend information where our backed up data has been stored. +- `.spec.target.ref` refers to the respective AppBinding of the Etcd database. +- `.spec.rules` specifies that we are restoring data from the latest backup snapshot of the database. +- The restore Job need access to the respective volume of the Etcd database. As a result, we have to run the restore Job as the same user as the Etcd database or as root user. Here, we are running the restore Job as root user using `spec.runtimeSettings.Container.securityContext` section. + +Let's create the `RestoreSession` object object we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/etcd/tls/examples/restoresession.yaml +restoresession.stash.appscode.com/etcd-tls-restore created +``` + +Once, you have created the `RestoreSession` object, Stash will create a restore Job. Run the following command to watch the phase of the `RestoreSession` object, + +```bash +❯ kubectl get restoresession -n demo -w +NAME REPOSITORY PHASE DURATION AGE +etcd-tls-restore gcs-repo Running 5s +etcd-tls-restore gcs-repo Running 60s +etcd-tls-restore gcs-repo Running 2m3s +etcd-tls-restore gcs-repo Succeeded 2m3s +etcd-tls-restore gcs-repo Succeeded 2m3s 2m3s +``` + +The `Succeeded` phase means that the restore process has been completed successfully. + +#### Verify Restored Data + +Now, let's exec into the `etcd-tls-0` database pod and verify whether the actual data has been restored or not, + +```bash +❯ kubectl exec -it -n demo etcd-tls-0 -- /bin/sh + +127.0.0.1:2379> etcdctl --cacert /etc/etcd-secret/ca.pem --cert /etc/etcd-secret/client.pem --key /etc/etcd-secret/client-key.pem get --prefix foo +foo +bar +foo2 +bar2 +foo3 +bar3 +foo4 +bar4 + +127.0.0.1:2379> exit +``` + +Hence, we can see from the above output that the deleted data has been restored successfully from the backup. + +#### Resume Backup + +Since our data has been restored successfully we can now resume our usual backup process. Resume the `BackupConfiguration` using following command, + +```bash +❯ kubectl patch backupconfiguration -n demo etcd-tls-backup --type="merge" --patch='{"spec": {"paused": false}}' +backupconfiguration.stash.appscode.com/etcd-tls-backup patched +``` + +Verify that the `BackupConfiguration` has been resumed, +```bash +❯ kubectl get backupconfiguration -n demo etcd-tls-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +etcd-tls-backup etcd-backup-3.5.0 */5 * * * * false Ready 39m +``` + +Here, `false` in the `PAUSED` column means the backup has been resumed successfully. The CronJob also should be resumed now. + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-trigger-etcd-tls-backup */5 * * * * False 0 2m39s 42m +``` + +Here, `False` in the `SUSPEND` column means the CronJob is no longer suspended and will trigger in the next schedule. + +### Restore Into Different Database of the Same Namespace + +If you want to restore the backed up data into a different Etcd cluster of the same namespace, you have to create another `AppBinding` ppointing to the desired Etcd database. Then, you have to create the `RestoreSession` pointing to the new `AppBinding`. + +### Restore Into Different Namespace + +If you want to restore into a different namespace of the same cluster, you have to create the Repository, backend Secret, AppBinding, in the desired namespace. You can use [Stash kubectl plugin](https://stash.run/docs/{{< param "info.version" >}}/guides/cli/cli/) to easily copy the resources into a new namespace. Then, you have to create the `RestoreSession` object in the desired namespace pointing to the Repository, AppBinding of that namespace. + +### Restore Into Different Cluster + +If you want to restore into a different cluster, you have to install Stash in the desired cluster. Then, you have to create the Repository, backend Secret, AppBinding, in the desired cluster. Finally, you have to create the `RestoreSession` object in the desired cluster pointing to the Repository, AppBinding of that cluster. + + +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo backupconfiguration etcd-tls-backup +kubectl delete -n demo restoresession etcd-tls-restore +kubectl delete -n demo repository gcs-repo +kubectl delete -n demo appbinding etcd-appbinding +kubectl delete -n demo Secret gcs-secret +kubectl delete -n demo Secret etcd-client-certs +kubectl delete -n demo Secret etcd-server-certs +# delete the database, Service, and PVCs +kubectl delete -f https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/etcd/tls/examples/etcd-tls.yaml +kubectl delete pvc -n demo data-etcd-tls-0 data-etcd-tls-1 data-etcd-tls-2 +``` diff --git a/content/docs/v2024.12.18/addons/kubedump/README.md b/content/docs/v2024.12.18/addons/kubedump/README.md new file mode 100644 index 0000000000..146c47b737 --- /dev/null +++ b/content/docs/v2024.12.18/addons/kubedump/README.md @@ -0,0 +1,98 @@ +--- +title: KubeDump Backup Addon Overview | Stash +description: KubeDump Backup Addon Overview | Stash +menu: + docs_v2024.12.18: + identifier: stash-kubedump-readme + name: Readme + parent: stash-kubedump + weight: -1 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +url: /docs/v2024.12.18/addons/kubedump/ +aliases: +- /docs/v2024.12.18/addons/kubedump/README/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash KubeDump Backup Addon + +Stash `{{< param "info.version" >}}` supports extending its functionality through addons. Stash KubeDump backup addon enables Stash to backup and restore Kubernetes manifests. You can backup the manifest of your entire cluster, a particular namespace, or a particular application. + +This guide will give you an overview of how the docs are organized. + +## Documentation Overview + +Stash KubeDump backup documentations are organized as below: + +- [How does it work?](/docs/v2024.12.18/addons/kubedump/overview/) gives an overview of how manifest backup works in Stash. +- [Cluster Backup](/docs/v2024.12.18/addons/kubedump/cluster/) shows how to backup all the cluster manifests. +- [Namespace Backup](/docs/v2024.12.18/addons/kubedump/namespace/) shows how to backup the manifests only for a particular namespace. +- [Application Backup](/docs/v2024.12.18/addons/kubedump/application/) shows how to manifests of a particular application. +- [Customizing Backup](/docs/v2024.12.18/addons/kubedump/customization/) shows how to customize the backup process. diff --git a/content/docs/v2024.12.18/addons/kubedump/_index.md b/content/docs/v2024.12.18/addons/kubedump/_index.md new file mode 100644 index 0000000000..a45b608916 --- /dev/null +++ b/content/docs/v2024.12.18/addons/kubedump/_index.md @@ -0,0 +1,77 @@ +--- +title: Stash KubeDump Backup Addon +menu: + docs_v2024.12.18: + identifier: stash-kubedump + name: KubeDump + parent: stash-addons + weight: 110 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/addons/kubedump/application/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/addons/kubedump/application/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..8cbc8aaaa7 --- /dev/null +++ b/content/docs/v2024.12.18/addons/kubedump/application/examples/backupconfiguration.yaml @@ -0,0 +1,27 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: application-manifest-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: kubedump-backup-0.1.0 + params: + - name: includeDependants + value: "true" + repository: + name: application-resource-storage + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-stash-enterprise + namespace: kube-system + runtimeSettings: + pod: + serviceAccountName: cluster-resource-reader + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/kubedump/application/examples/rbac.yaml b/content/docs/v2024.12.18/addons/kubedump/application/examples/rbac.yaml new file mode 100644 index 0000000000..52ae310646 --- /dev/null +++ b/content/docs/v2024.12.18/addons/kubedump/application/examples/rbac.yaml @@ -0,0 +1,27 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: cluster-resource-reader + namespace: demo +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: cluster-resource-reader +rules: +- apiGroups: ["*"] + resources: ["*"] + verbs: ["get","list"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: cluster-resource-reader +subjects: +- kind: ServiceAccount + name: cluster-resource-reader + namespace: demo +roleRef: + kind: ClusterRole + name: cluster-resource-reader + apiGroup: rbac.authorization.k8s.io diff --git a/content/docs/v2024.12.18/addons/kubedump/application/examples/repository.yaml b/content/docs/v2024.12.18/addons/kubedump/application/examples/repository.yaml new file mode 100644 index 0000000000..c2afa3b3ea --- /dev/null +++ b/content/docs/v2024.12.18/addons/kubedump/application/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: application-resource-storage + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /manifests/applications/kube-system/stash-enterprise + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/addons/kubedump/application/images/application_manifest_backup.png b/content/docs/v2024.12.18/addons/kubedump/application/images/application_manifest_backup.png new file mode 100644 index 0000000000..303719e18c Binary files /dev/null and b/content/docs/v2024.12.18/addons/kubedump/application/images/application_manifest_backup.png differ diff --git a/content/docs/v2024.12.18/addons/kubedump/application/index.md b/content/docs/v2024.12.18/addons/kubedump/application/index.md new file mode 100644 index 0000000000..eadd1ad490 --- /dev/null +++ b/content/docs/v2024.12.18/addons/kubedump/application/index.md @@ -0,0 +1,520 @@ +--- +title: Backup YAMLs of an Application | Stash +description: Backup application manifests along with it's dependant using Stash +menu: + docs_v2024.12.18: + identifier: stash-kubedump-application + name: Application Manifest Backup + parent: stash-kubedump + weight: 40 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup YAMLs of an Application using Stash + +Stash `{{< param "info.version" >}}` supports taking backup of the resource YAMLs using `kubedump` plugin. This guide will show you how you can take a backup of the YAMLs of an application along with it's dependant using Stash. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. +- Install Stash in your cluster following the steps [here](/docs/v2024.12.18/setup/install/stash/). +- Install Stash `kubectl` plugin in your local machine following the steps [here](/docs/v2024.12.18/setup/install/kubectl-plugin/). +- If you are not familiar with how Stash backup the resource YAMLs, please check the following guide [here](/docs/v2024.12.18/addons/kubedump/overview/). + +You have to be familiar with the following custom resources: + +- [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) +- [Function](/docs/v2024.12.18/concepts/crds/function/) +- [Task](/docs/v2024.12.18/concepts/crds/task/) +- [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) +- [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) + +To keep things isolated, we are going to use a separate namespace called `demo` throughout this tutorial. Create the `demo` namespace if you haven't created it already. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> Note: YAML files used in this tutorial are stored [here](https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/kubedump/application/examples). + +### Prepare for Backup + +In this section, we are going to configure a backup for YAML definition of a Deployment along with its ReplicaSet and its Pods. + +#### Ensure `kubedump` Addon + +When you install the Stash, it will automatically install all the official addons. Make sure that `kubedump` addon was installed properly using the following command. + +```bash +❯ kubectl get tasks.stash.appscode.com | grep kubedump +kubedump-backup-0.1.0 23s +``` + +#### Prepare Backend + +We are going to store our backed-up data into a GCS bucket. So, we need to create a Secret with GCS credentials and a `Repository` object with the bucket information. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +**Create Storage Secret:** + +At first, let's create a secret called `gcs-secret` with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat downloaded-sa-json.key > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create Repository:** + +Now, crete a `Repository` object with the information of your desired bucket. Below is the YAML of `Repository` object we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: application-resource-storage + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /manifests/applications/kube-system/stash-enterprise + storageSecretName: gcs-secret +``` + +Let's create the `Repository` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/kubedump/application/examples/repository.yaml +repository.stash.appscode.com/application-resource-storage created +``` + +#### Create RBAC + +The `kubedump` plugin requires read permission for the application resources. By default, Stash does not grant such permissions. We have to provide the necessary permissions manually. + +Here, is the YAML of the `ServiceAccount`, `ClusterRole`, and `ClusterRoleBinding` that we are going to use for granting the necessary permissions. + +```yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: cluster-resource-reader + namespace: demo +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: cluster-resource-reader +rules: +- apiGroups: ["*"] + resources: ["*"] + verbs: ["get","list"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: cluster-resource-reader +subjects: +- kind: ServiceAccount + name: cluster-resource-reader + namespace: demo +roleRef: + kind: ClusterRole + name: cluster-resource-reader + apiGroup: rbac.authorization.k8s.io +``` + +Here, we have give permission to read all the cluster resources. You can restrict this permission to a particular application resources only. + +Let's create the RBAC resources we have shown above, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/kubedump/application/examples/rbac.yaml +serviceaccount/cluster-resource-reader created +clusterrole.rbac.authorization.k8s.io/cluster-resource-reader created +clusterrolebinding.rbac.authorization.k8s.io/cluster-resource-reader created +``` + +Now, we are ready for backup. In the next section, we are going to schedule a backup for our cluster resources. + +### Backup + +To schedule a backup, we have to create a `BackupConfiguration` object. Then Stash will create a CronJob to periodically backup the database. + +At first, lets list available Deployment in `kube-system` namespace. + +```bash +❯ kubectl get deployments -n kube-system +NAME READY UP-TO-DATE AVAILABLE AGE +coredns 2/2 2 2 13d +stash-stash-enterprise 1/1 1 1 30h +``` + +Here, we are going to setup backup YAMLs for `stash-stash-enterprise` Deployment. + +#### Create BackupConfiguration + +Below is the YAML for `BackupConfiguration` object we care going to use to backup the YAMLs of the cluster resources, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: application-manifest-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: kubedump-backup-0.1.0 + params: + - name: includeDependants + value: "true" + repository: + name: application-resource-storage + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-stash-enterprise + namespace: kube-system + runtimeSettings: + pod: + serviceAccountName: cluster-resource-reader + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +Here, + +- `.spec.schedule` specifies that we want to backup the cluster resources at 5 minutes intervals. +- `.spec.task.name` specifies the name of the Task object that specifies the necessary Functions and their execution order to backup the resource YAMLs. +- `.spec.repository.name` specifies the Repository CR name we have created earlier with backend information. +- `.spec.target` specifies the targeted application that we are going to backup. +- `.spec.runtimeSettings.pod.serviceAccountName` specifies the ServiceAccount name that we have created earlier with cluster-wide resource reading permission. +- `.spec.retentionPolicy` specifies a policy indicating how we want to cleanup the old backups. + +Let's create the `BackupConfiguration` object we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/kubedump/application/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/application-manifest-backup created +``` + +#### Verify Backup Setup Successful + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. Let's verify the `Phase` of the BackupConfiguration, + +```bash +❯ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +application-manifest-backup kubedump-backup-0.1.0 */5 * * * * Ready 2m46s +``` + +#### Verify CronJob + +Stash will create a CronJob with the schedule specified in `spec.schedule` field of `BackupConfiguration` object. + +Verify that the CronJob has been created using the following command, + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-trigger-demo-application-manifest-backup */5 * * * * False 0 36s +``` + +#### Wait for BackupSession + +The `stash-trigger-application-manifest-backup` CronJob will trigger a backup on each scheduled slot by creating a `BackupSession` object. + +Now, wait for a schedule to appear. Run the following command to watch for a `BackupSession` object, + +```bash +❯ kubectl get backupsession -n demo -w +NAME INVOKER-TYPE INVOKER-NAME PHASE DURATION AGE +application-manifest-backup-1652269801 BackupConfiguration application-manifest-backup 0s +application-manifest-backup-1652269801 BackupConfiguration application-manifest-backup Pending 0s +application-manifest-backup-1652269801 BackupConfiguration application-manifest-backup Running 0s +application-manifest-backup-1652269801 BackupConfiguration application-manifest-backup Succeeded 59s 59s +``` + +Here, the phase `Succeeded` means that the backup process has been completed successfully. + +#### Verify Backup + +Now, we are going to verify whether the backed-up data is present in the backend or not. Once a backup is completed, Stash will update the respective `Repository` object to reflect the backup completion. Check that the repository `application-resource-storage` has been updated by the following command, + +```bash +❯ kubectl get repository -n demo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +application-resource-storage true 14.902 KiB 1 61s 11m +``` + +Now, if we navigate to the GCS bucket, we will see the backed up data has been stored in `/manifest/applications/kube-system/stash-enterprise` directory as specified by `.spec.backend.gcs.prefix` field of the `Repository` object. + +
+ Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +> Note: Stash keeps all the backed-up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Restore + +Stash does not provide any automatic mechanism to restore the cluster resources from the backed-up YAMLs. Your application might be managed by Helm or by an operator. In such cases, just applying the YAMLs is not enough to restore the application. Furthermore, there might be an order issue. Some resources must be applied before others. It is difficult to generalize and codify various application-specific logic. + +Therefore, it is the user's responsibility to download the backed-up YAMLs and take the necessary steps based on his application to restore it properly. + +### Download the YAMLs + +Stash provides a [kubectl plugin](https://stash.run/docs/v2022.05.12/guides/cli/cli/#download-snapshots) for making it easy to download a snapshot locally. + +Now, let's download the latest Snapshot from our backed-up data into the `$HOME/Downloads/stash/applications/kube-system/stash-enterprise` folder of our local machine. + +```bash +❯ kubectl stash download -n demo application-resource-storage --destination=$HOME/Downloads/stash/applications/kube-system/stash-enterprise --snapshots="latest" +``` + +Now, lets use [tree](https://linux.die.net/man/1/tree) command to inspect downloaded YAMLs files. + +```bash +❯ tree $HOME/Downloads/stash/applications/kube-system/stash-enterprise +/home/emruz/Downloads/stash/applications/kube-system/stash-enterprise +└── latest + └── tmp + └── resources + ├── ReplicaSet + │   └── stash-stash-enterprise-567dd95f5b + │   ├── Pod + │   │   └── stash-stash-enterprise-567dd95f5b-6xtxg + │   │   └── stash-stash-enterprise-567dd95f5b-6xtxg.yaml + │   └── stash-stash-enterprise-567dd95f5b.yaml + └── stash-stash-enterprise.yaml + +7 directories, 3 files +``` + +As you can see that the Deployment has been backed up along with it's ReplicaSet and Pods. + +Let's inspect the YAML of `stash-stash-enterprise.yaml` file, + +```yaml +❯ cat $HOME/Downloads/stash/applications/kube-system/stash-enterprise/latest/tmp/resources/stash-stash-enterprise.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + deployment.kubernetes.io/revision: "1" + meta.helm.sh/release-name: stash + meta.helm.sh/release-namespace: kube-system + labels: + app.kubernetes.io/instance: stash + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: stash-enterprise + app.kubernetes.io/version: v0.20.0 + helm.sh/chart: stash-enterprise-v0.20.0 + name: stash-stash-enterprise + namespace: kube-system +spec: + progressDeadlineSeconds: 600 + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/instance: stash + app.kubernetes.io/name: stash-enterprise + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + annotations: + checksum/apiregistration.yaml: ea1443f1d9a807c14104b3e24ca051acb32c215743fde21c682ccb1876deee8d + labels: + app.kubernetes.io/instance: stash + app.kubernetes.io/name: stash-enterprise + spec: + containers: + - args: + - run + - --v=3 + - --docker-registry=stashed + - --image=stash-enterprise + - --image-tag=v0.20.0 + - --secure-port=8443 + - --audit-log-path=- + - --tls-cert-file=/var/serving-cert/tls.crt + - --tls-private-key-file=/var/serving-cert/tls.key + - --pushgateway-url=http://stash-stash-enterprise.kube-system.svc:56789 + - --enable-mutating-webhook=true + - --enable-validating-webhook=true + - --bypass-validating-webhook-xray=false + - --use-kubeapiserver-fqdn-for-aks=true + - --cron-job-psp=baseline + - --backup-job-psp=baseline + - --restore-job-psp=baseline + - --nva-cpu=100m + - --nva-memory=128Mi + - --nva-user=2000 + - --nva-privileged-mode=false + - --nva-psp=baseline + - --license-file=/var/run/secrets/appscode/license/key.txt + - --license-apiservice=v1beta1.admission.stash.appscode.com + env: + - name: POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + image: stashed/stash-enterprise:v0.20.0 + imagePullPolicy: IfNotPresent + name: operator + ports: + - containerPort: 8443 + protocol: TCP + resources: + requests: + cpu: 100m + securityContext: {} + terminationMessagePolicy: File + volumeMounts: + - mountPath: /var/serving-cert + name: serving-cert + - mountPath: /var/run/secrets/appscode/license + name: license + - args: + - --web.listen-address=:56789 + - --persistence.file=/var/pv/pushgateway.dat + image: prom/pushgateway:v1.4.2 + imagePullPolicy: IfNotPresent + name: pushgateway + ports: + - containerPort: 56789 + protocol: TCP + resources: {} + securityContext: {} + terminationMessagePolicy: File + volumeMounts: + - mountPath: /var/pv + name: data-volume + - mountPath: /tmp + name: stash-scratchdir + nodeSelector: + kubernetes.io/os: linux + restartPolicy: Always + schedulerName: default-scheduler + securityContext: + fsGroup: 65535 + serviceAccount: stash-stash-enterprise + serviceAccountName: stash-stash-enterprise + volumes: + - emptyDir: {} + name: data-volume + - emptyDir: {} + name: stash-scratchdir + - name: serving-cert + secret: + defaultMode: 420 + secretName: stash-stash-enterprise-apiserver-cert + - name: license + secret: + defaultMode: 420 + secretName: stash-stash-enterprise-license +``` + +Now, you can use these YAML files to re-create your desired application. + +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo backupconfiguration application-manifest-backup +kubectl delete -n demo repository application-resource-storage +kubectl delete -n demo serviceaccount cluster-resource-reader +kubectl delete -n demo clusterrole cluster-resource-reader +kubectl delete -n demo clusterrolebinding cluster-resource-reader +``` diff --git a/content/docs/v2024.12.18/addons/kubedump/cluster/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/addons/kubedump/cluster/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..e9ee92b502 --- /dev/null +++ b/content/docs/v2024.12.18/addons/kubedump/cluster/examples/backupconfiguration.yaml @@ -0,0 +1,18 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: cluster-resources-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: kubedump-backup-0.1.0 + repository: + name: cluster-resource-storage + runtimeSettings: + pod: + serviceAccountName: cluster-resource-reader + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/kubedump/cluster/examples/rbac.yaml b/content/docs/v2024.12.18/addons/kubedump/cluster/examples/rbac.yaml new file mode 100644 index 0000000000..52ae310646 --- /dev/null +++ b/content/docs/v2024.12.18/addons/kubedump/cluster/examples/rbac.yaml @@ -0,0 +1,27 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: cluster-resource-reader + namespace: demo +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: cluster-resource-reader +rules: +- apiGroups: ["*"] + resources: ["*"] + verbs: ["get","list"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: cluster-resource-reader +subjects: +- kind: ServiceAccount + name: cluster-resource-reader + namespace: demo +roleRef: + kind: ClusterRole + name: cluster-resource-reader + apiGroup: rbac.authorization.k8s.io diff --git a/content/docs/v2024.12.18/addons/kubedump/cluster/examples/repository.yaml b/content/docs/v2024.12.18/addons/kubedump/cluster/examples/repository.yaml new file mode 100644 index 0000000000..fdc38ef16f --- /dev/null +++ b/content/docs/v2024.12.18/addons/kubedump/cluster/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: cluster-resource-storage + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /manifests/cluster + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/addons/kubedump/cluster/images/cluster_manifests_backup.png b/content/docs/v2024.12.18/addons/kubedump/cluster/images/cluster_manifests_backup.png new file mode 100644 index 0000000000..2ea0e447c9 Binary files /dev/null and b/content/docs/v2024.12.18/addons/kubedump/cluster/images/cluster_manifests_backup.png differ diff --git a/content/docs/v2024.12.18/addons/kubedump/cluster/index.md b/content/docs/v2024.12.18/addons/kubedump/cluster/index.md new file mode 100644 index 0000000000..dc179ee687 --- /dev/null +++ b/content/docs/v2024.12.18/addons/kubedump/cluster/index.md @@ -0,0 +1,603 @@ +--- +title: Backup resource YAMLs of entire cluster | Stash +description: Take backup of cluster resources YAMLs using Stash +menu: + docs_v2024.12.18: + identifier: stash-kubedump-cluster + name: Cluster Backup + parent: stash-kubedump + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup resource YAMLs of entire cluster using Stash + +Stash `{{< param "info.version" >}}` supports taking backup of the resource YAMLs using `kubedump` plugin. This guide will show you how you can take a backup of the resource YAMLs of your entire cluster using Stash. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. +- Install Stash in your cluster following the steps [here](/docs/v2024.12.18/setup/install/stash/). +- Install Stash `kubectl` plugin in your local machine following the steps [here](/docs/v2024.12.18/setup/install/kubectl-plugin/). +- If you are not familiar with how Stash backup the resource YAMLs, please check the following guide [here](/docs/v2024.12.18/addons/kubedump/overview/). + +You have to be familiar with the following custom resources: + +- [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) +- [Function](/docs/v2024.12.18/concepts/crds/function/) +- [Task](/docs/v2024.12.18/concepts/crds/task/) +- [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) +- [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) + +To keep things isolated, we are going to use a separate namespace called `demo` throughout this tutorial. Create the `demo` namespace if you haven't created it already. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> Note: YAML files used in this tutorial are stored [here](https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/kubedump/cluster/examples). + +### Prepare for Backup + +In this section, we are going to configure a backup for all the resource YAMLs of our cluster. + +#### Ensure `kubedump` Addon + +When you install the Stash, it will automatically install all the official addons. Make sure that `kubedump` addon was installed properly using the following command. + +```bash +❯ kubectl get tasks.stash.appscode.com | grep kubedump +kubedump-backup-0.1.0 23s +``` + +#### Prepare Backend + +We are going to store our backed-up data into a GCS bucket. So, we need to create a Secret with GCS credentials and a `Repository` object with the bucket information. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +**Create Storage Secret:** + +At first, let's create a secret called `gcs-secret` with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat downloaded-sa-json.key > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create Repository:** + +Now, crete a `Repository` object with the information of your desired bucket. Below is the YAML of `Repository` object we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: cluster-resource-storage + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /manifests/cluster + storageSecretName: gcs-secret +``` + +Let's create the `Repository` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/kubedump/cluster/examples/repository.yaml +repository.stash.appscode.com/cluster-resource-storage created +``` + +#### Create RBAC + +The `kubedump` plugin requires read permission for all the cluster resources. By default, Stash does not grant such cluster-wide permissions. We have to provide the necessary permissions manually. + +Here, is the YAML of the `ServiceAccount`, `ClusterRole`, and `ClusterRoleBinding` that we are going to use for granting the necessary permissions. + +```yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: cluster-resource-reader + namespace: demo +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: cluster-resource-reader +rules: +- apiGroups: ["*"] + resources: ["*"] + verbs: ["get","list"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: cluster-resource-reader +subjects: +- kind: ServiceAccount + name: cluster-resource-reader + namespace: demo +roleRef: + kind: ClusterRole + name: cluster-resource-reader + apiGroup: rbac.authorization.k8s.io +``` + +Let's create the RBAC resources we have shown above, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/kubedump/cluster/examples/rbac.yaml +serviceaccount/cluster-resource-reader created +clusterrole.rbac.authorization.k8s.io/cluster-resource-reader created +clusterrolebinding.rbac.authorization.k8s.io/cluster-resource-reader created +``` + +Now, we are ready for backup. In the next section, we are going to schedule a backup for our cluster resources. + +### Backup + +To schedule a backup, we have to create a `BackupConfiguration` object. Then Stash will create a CronJob to periodically backup the database. + +#### Create BackupConfiguration + +Below is the YAML for `BackupConfiguration` object we care going to use to backup the YAMLs of the cluster resources, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: cluster-resources-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: kubedump-backup-0.1.0 + repository: + name: cluster-resource-storage + runtimeSettings: + pod: + serviceAccountName: cluster-resource-reader + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +Here, + +- `.spec.schedule` specifies that we want to backup the cluster resources at 5 minutes intervals. +- `.spec.task.name` specifies the name of the Task object that specifies the necessary Functions and their execution order to backup the resource YAMLs. +- `.spec.repository.name` specifies the Repository CR name we have created earlier with backend information. +- `.spec.runtimeSettings.pod.serviceAccountName` specifies the ServiceAccount name that we have created earlier with cluster-wide resource reading permission. +- `.spec.retentionPolicy` specifies a policy indicating how we want to cleanup the old backups. + +Let's create the `BackupConfiguration` object we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/kubedump/cluster/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/cluster-resources-backup created +``` + +#### Verify Backup Setup Successful + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. Let's verify the `Phase` of the BackupConfiguration, + +```bash +❯ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +cluster-resources-backup kubedump-backup-0.1.0 */5 * * * * Ready 18s +``` + +#### Verify CronJob + +Stash will create a CronJob with the schedule specified in `spec.schedule` field of `BackupConfiguration` object. + +Verify that the CronJob has been created using the following command, + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-trigger-cluster-resources-backup */5 * * * * False 0 49s +``` + +#### Wait for BackupSession + +The `stash-trigger-cluster-resources-backup` CronJob will trigger a backup on each scheduled slot by creating a `BackupSession` object. + +Now, wait for a schedule to appear. Run the following command to watch for a `BackupSession` object, + +```bash +❯ kubectl get backupsession -n demo -w +NAME INVOKER-TYPE INVOKER-NAME PHASE DURATION AGE +cluster-resources-backup-1652164800 BackupConfiguration cluster-resources-backup 0s +cluster-resources-backup-1652164800 BackupConfiguration cluster-resources-backup Pending 0s +cluster-resources-backup-1652164800 BackupConfiguration cluster-resources-backup Running 0s +cluster-resources-backup-1652164800 BackupConfiguration cluster-resources-backup Running 69s +cluster-resources-backup-1652164800 BackupConfiguration cluster-resources-backup Succeeded 1m9s 69s +``` + +Here, the phase `Succeeded` means that the backup process has been completed successfully. + +#### Verify Backup + +Now, we are going to verify whether the backed-up data is present in the backend or not. Once a backup is completed, Stash will update the respective `Repository` object to reflect the backup completion. Check that the repository `cluster-resource-storage` has been updated by the following command, + +```bash +❯ kubectl get repository -n demo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +cluster-resource-storage true 2.324 MiB 1 70s 54m + +``` + +Now, if we navigate to the GCS bucket, we will see the backed up data has been stored in `/manifest/cluster` directory as specified by `.spec.backend.gcs.prefix` field of the `Repository` object. + +
+ Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +> Note: Stash keeps all the backed-up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Restore + +Stash does not provide any automatic mechanism to restore the cluster resources from the backed-up YAMLs. Your application might be managed by Helm or by an operator. In such cases, just applying the YAMLs is not enough to restore the application. Furthermore, there might be an order issue. Some resources must be applied before others. It is difficult to generalize and codify various application-specific logic. + +Therefore, it is the user's responsibility to download the backed-up YAMLs and take the necessary steps based on his application to restore it properly. + +### Download the YAMLs + +Stash provides a [kubectl plugin](https://stash.run/docs/v2022.05.12/guides/cli/cli/#download-snapshots) for making it easy to download a snapshot locally. + +Now, let's download the latest Snapshot from our backed-up data into the `$HOME/Downloads/stash` folder of our local machine. + +```bash +❯ kubectl stash download -n demo cluster-resource-storage --destination=$HOME/Downloads/stash --snapshots="latest" +``` + +Now, lets use [tree](https://linux.die.net/man/1/tree) command to inspect downloaded YAMLs files. + +```bash +❯ tree $HOME/Downloads/stash +/home/emruz/Downloads/stash +└── latest + └── tmp + └── resources + ├── global + │ ├── APIService + │ │ ├── v1.admissionregistration.k8s.io.yaml + │ │ ├── v1alpha1.admission.stash.appscode.com.yaml + │ │ ├── v1alpha1.metrics.appscode.com.yaml + │ │ ├── v1alpha1.repositories.stash.appscode.com.yaml + │ ├── ClusterRole + │ │ ├── admin.yaml + │ │ ├── system:heapster.yaml + │ │ └── view.yaml + │ ├── ClusterRoleBinding + │ │ ├── appscode:license-reader-demo-cluster-resource-reader.yaml + │ │ ├── appscode:stash:garbage-collector.yaml + │ │ ├── cluster-admin.yaml + │ │ ├── cluster-resource-reader.yaml + │ │ ├── kindnet.yaml + │ ├── ComponentStatus + │ │ ├── controller-manager.yaml + │ │ ├── etcd-0.yaml + │ │ └── scheduler.yaml + │ ├── CSINode + │ │ └── kind-control-plane.yaml + │ ├── CustomResourceDefinition + │ │ ├── appbindings.appcatalog.appscode.com.yaml + │ │ ├── backupbatches.stash.appscode.com.yaml + │ │ ├── backupblueprints.stash.appscode.com.yaml + │ │ ├── backupconfigurations.stash.appscode.com.yaml + │ ├── FlowSchema + │ │ ├── catch-all.yaml + │ │ ├── exempt.yaml + │ │ ├── global-default.yaml + │ │ ├── kube-controller-manager.yaml + │ │ ├── kube-scheduler.yaml + │ ├── Function + │ │ ├── elasticsearch-backup-5.6.4.yaml + │ │ ├── mongodb-restore-5.0.3.yaml + │ │ ├── mysql-backup-5.7.25.yaml + │ │ └── update-status.yaml + │ ├── MetricsConfiguration + │ │ ├── stash-appscode-com-backupconfiguration.yaml + │ ├── MutatingWebhookConfiguration + │ │ └── admission.stash.appscode.com.yaml + │ ├── Namespace + │ │ ├── default.yaml + │ │ ├── demo.yaml + │ │ ├── kube-node-lease.yaml + │ │ ├── kube-public.yaml + │ │ ├── kube-system.yaml + │ │ └── local-path-storage.yaml + │ ├── Node + │ │ └── kind-control-plane.yaml + │ ├── StorageClass + │ │ └── standard.yaml + │ ├── Task + │ │ ├── elasticsearch-backup-5.6.4.yaml + │ │ ├── redis-restore-5.0.13.yaml + │ │ └── redis-restore-6.2.5.yaml + │ └── ValidatingWebhookConfiguration + │ └── admission.stash.appscode.com.yaml + └── namespaces + ├── default + │ ├── ConfigMap + │ │ └── kube-root-ca.crt.yaml + │ ├── Endpoints + │ │ └── kubernetes.yaml + │ ├── EndpointSlice + │ │ └── kubernetes.yaml + │ ├── Secret + │ │ └── default-token-7lpm6.yaml + │ ├── Service + │ │ └── kubernetes.yaml + │ └── ServiceAccount + │ └── default.yaml + ├── demo + │ ├── BackupConfiguration + │ │ └── cluster-resources-backup.yaml + │ ├── BackupSession + │ │ ├── cluster-resources-backup-1652176500.yaml + │ │ └── cluster-resources-backup-1652176800.yaml + │ ├── ConfigMap + │ │ └── kube-root-ca.crt.yaml + │ ├── CronJob + │ │ └── stash-trigger-cluster-resources-backup.yaml + │ ├── Event + │ │ ├── cluster-resources-backup-1652173200.16edb2d9e21556ba.yaml + │ ├── Job + │ │ ├── stash-backup-cluster-resources-backup-1652176500-0.yaml + │ │ └── stash-backup-cluster-resources-backup-1652176800-0.yaml + │ ├── Pod + │ │ ├── stash-backup-cluster-resources-backup-1652176500-0-vmx94.yaml + │ │ └── stash-backup-cluster-resources-backup-1652176800-0-5v4k9.yaml + │ ├── Repository + │ │ └── cluster-resource-storage.yaml + │ ├── RoleBinding + │ │ ├── backupconfiguration-cluster-resources-backup-0.yaml + │ │ └── stash-trigger-cluster-resources-backup.yaml + │ ├── Secret + │ │ ├── cluster-resource-reader-token-rqf6n.yaml + │ │ ├── default-token-rbrqt.yaml + │ │ └── gcs-secret.yaml + │ ├── ServiceAccount + │ │ ├── cluster-resource-reader.yaml + │ │ └── default.yaml + │ └── Snapshot + │ ├── cluster-resource-storage-5085e316.yaml + │ ├── cluster-resource-storage-6034bdcf.yaml + │ ├── cluster-resource-storage-706e8f46.yaml + ├── kube-node-lease + │ ├── ConfigMap + │ │ └── kube-root-ca.crt.yaml + │ ├── Lease + │ │ └── kind-control-plane.yaml + │ ├── Secret + │ │ └── default-token-69n9s.yaml + │ └── ServiceAccount + │ └── default.yaml + ├── kube-public + │ ├── ConfigMap + │ │ ├── cluster-info.yaml + │ │ └── kube-root-ca.crt.yaml + │ ├── Role + │ │ ├── kubeadm:bootstrap-signer-clusterinfo.yaml + │ │ └── system:controller:bootstrap-signer.yaml + │ ├── RoleBinding + │ │ ├── kubeadm:bootstrap-signer-clusterinfo.yaml + │ │ └── system:controller:bootstrap-signer.yaml + │ ├── Secret + │ │ └── default-token-jqv4n.yaml + │ └── ServiceAccount + │ └── default.yaml + ├── kube-system + │ ├── ConfigMap + │ │ ├── coredns.yaml + │ │ ├── extension-apiserver-authentication.yaml + │ │ ├── kubeadm-config.yaml + │ │ ├── kubelet-config-1.21.yaml + │ │ ├── kube-proxy.yaml + │ │ └── kube-root-ca.crt.yaml + │ ├── ControllerRevision + │ │ ├── kindnet-5b547684d9.yaml + │ │ └── kube-proxy-6bc6858f58.yaml + │ ├── DaemonSet + │ │ ├── kindnet.yaml + │ │ └── kube-proxy.yaml + │ ├── Deployment + │ │ ├── coredns.yaml + │ │ └── stash-stash-enterprise.yaml + │ ├── Endpoints + │ │ ├── kube-dns.yaml + │ │ └── stash-stash-enterprise.yaml + │ ├── EndpointSlice + │ │ ├── kube-dns-m2s5c.yaml + │ │ └── stash-stash-enterprise-k28h6.yaml + │ ├── Lease + │ │ ├── kube-controller-manager.yaml + │ │ └── kube-scheduler.yaml + │ ├── Pod + │ │ ├── coredns-558bd4d5db-hdsw9.yaml + │ │ ├── coredns-558bd4d5db-wk9tx.yaml + │ │ ├── etcd-kind-control-plane.yaml + │ │ └── stash-stash-enterprise-567dd95f5b-6xtxg.yaml + │ ├── ReplicaSet + │ │ ├── coredns-558bd4d5db.yaml + │ │ └── stash-stash-enterprise-567dd95f5b.yaml + │ ├── Role + │ │ ├── extension-apiserver-authentication-reader.yaml + │ │ ├── kubeadm:kubelet-config-1.21.yaml + │ │ └── system::leader-locking-kube-scheduler.yaml + │ ├── RoleBinding + │ │ ├── kubeadm:kubelet-config-1.21.yaml + │ │ ├── kubeadm:nodes-kubeadm-config.yaml + │ │ ├── kube-proxy.yaml + │ ├── Service + │ │ ├── kube-dns.yaml + │ │ └── stash-stash-enterprise.yaml + │ └── ServiceAccount + │ ├── attachdetach-controller.yaml + │ ├── bootstrap-signer.yaml + └── local-path-storage + ├── ConfigMap + │ ├── kube-root-ca.crt.yaml + │ └── local-path-config.yaml + ├── Deployment + │ └── local-path-provisioner.yaml + ├── Endpoints + │ └── rancher.io-local-path.yaml + ├── Pod + │ └── local-path-provisioner-547f784dff-jb9tq.yaml + ├── ReplicaSet + │ └── local-path-provisioner-547f784dff.yaml + ├── Secret + │ ├── default-token-bnk6x.yaml + │ └── local-path-provisioner-service-account-token-fvkxj.yaml + └── ServiceAccount + ├── default.yaml + └── local-path-provisioner-service-account.yaml + +77 directories, 776 files +``` + +Here, the non-namespaced resources have been grouped under the `global` directory and the namespaced resources have been grouped inside the namespace specific folder under the `namespaces` directory. + +Let's inspect the YAML of `kubeadm-config.yaml` file under `kube-system` namespace. + +```yaml +❯ cat $HOME/Downloads/stash/latest/tmp/resources/namespaces/kube-system/ConfigMap/kubeadm-config.yaml +apiVersion: v1 +data: + ClusterConfiguration: | + apiServer: + certSANs: + - localhost + - 127.0.0.1 + extraArgs: + authorization-mode: Node,RBAC + runtime-config: "" + timeoutForControlPlane: 4m0s + apiVersion: kubeadm.k8s.io/v1beta2 + certificatesDir: /etc/kubernetes/pki + clusterName: kind + controlPlaneEndpoint: kind-control-plane:6443 + controllerManager: + extraArgs: + enable-hostpath-provisioner: "true" + dns: + type: CoreDNS + etcd: + local: + dataDir: /var/lib/etcd + imageRepository: k8s.gcr.io + kind: ClusterConfiguration + kubernetesVersion: v1.21.1 + networking: + dnsDomain: cluster.local + podSubnet: 10.244.0.0/16 + serviceSubnet: 10.96.0.0/16 + scheduler: {} + ClusterStatus: | + apiEndpoints: + kind-control-plane: + advertiseAddress: 172.18.0.2 + bindPort: 6443 + apiVersion: kubeadm.k8s.io/v1beta2 + kind: ClusterStatus +kind: ConfigMap +metadata: + name: kubeadm-config + namespace: kube-system +``` + +Now, you can use these YAML files to re-create your desired application. + +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo backupconfiguration cluster-resources-backup +kubectl delete -n demo repository cluster-resource-storage +kubectl delete -n demo serviceaccount cluster-resource-reader +kubectl delete -n demo clusterrole cluster-resource-reader +kubectl delete -n demo clusterrolebinding cluster-resource-reader +``` diff --git a/content/docs/v2024.12.18/addons/kubedump/customization/examples/filter-resources.yaml b/content/docs/v2024.12.18/addons/kubedump/customization/examples/filter-resources.yaml new file mode 100644 index 0000000000..ba4cf9b016 --- /dev/null +++ b/content/docs/v2024.12.18/addons/kubedump/customization/examples/filter-resources.yaml @@ -0,0 +1,21 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: cluster-resources-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: kubedump-backup-0.1.0 + params: + - name: labelSelector + value: "k8s-app=kube-dns" + repository: + name: cluster-resource-storage + runtimeSettings: + pod: + serviceAccountName: cluster-resource-reader + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/kubedump/customization/examples/multi-retention-policy.yaml b/content/docs/v2024.12.18/addons/kubedump/customization/examples/multi-retention-policy.yaml new file mode 100644 index 0000000000..08be02b1cd --- /dev/null +++ b/content/docs/v2024.12.18/addons/kubedump/customization/examples/multi-retention-policy.yaml @@ -0,0 +1,22 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: cluster-resources-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: kubedump-backup-0.1.0 + repository: + name: cluster-resource-storage + runtimeSettings: + pod: + serviceAccountName: cluster-resource-reader + retentionPolicy: + name: cluster-resource-retention + keepLast: 5 + keepDaily: 10 + keepWeekly: 20 + keepMonthly: 50 + keepYearly: 100 + prune: true diff --git a/content/docs/v2024.12.18/addons/kubedump/customization/examples/passing-args.yaml b/content/docs/v2024.12.18/addons/kubedump/customization/examples/passing-args.yaml new file mode 100644 index 0000000000..48e35d88e9 --- /dev/null +++ b/content/docs/v2024.12.18/addons/kubedump/customization/examples/passing-args.yaml @@ -0,0 +1,21 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: cluster-resources-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: kubedump-backup-0.1.0 + params: + - name: sanitize + value: "false" + repository: + name: cluster-resource-storage + runtimeSettings: + pod: + serviceAccountName: cluster-resource-reader + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/kubedump/customization/examples/resource-limit.yaml b/content/docs/v2024.12.18/addons/kubedump/customization/examples/resource-limit.yaml new file mode 100644 index 0000000000..6984a5e25e --- /dev/null +++ b/content/docs/v2024.12.18/addons/kubedump/customization/examples/resource-limit.yaml @@ -0,0 +1,26 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: cluster-resources-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: kubedump-backup-0.1.0 + repository: + name: cluster-resource-storage + runtimeSettings: + pod: + serviceAccountName: cluster-resource-reader + container: + resources: + requests: + cpu: "200m" + memory: "1Gi" + limits: + cpu: "200m" + memory: "1Gi" + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/kubedump/customization/examples/specific-user.yaml b/content/docs/v2024.12.18/addons/kubedump/customization/examples/specific-user.yaml new file mode 100644 index 0000000000..ed58cb9c41 --- /dev/null +++ b/content/docs/v2024.12.18/addons/kubedump/customization/examples/specific-user.yaml @@ -0,0 +1,21 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: cluster-resources-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: kubedump-backup-0.1.0 + repository: + name: cluster-resource-storage + runtimeSettings: + pod: + serviceAccountName: cluster-resource-reader + securityContext: + runAsUser: 0 + runAsGroup: 0 + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/kubedump/customization/index.md b/content/docs/v2024.12.18/addons/kubedump/customization/index.md new file mode 100644 index 0000000000..de233afc4a --- /dev/null +++ b/content/docs/v2024.12.18/addons/kubedump/customization/index.md @@ -0,0 +1,264 @@ +--- +title: Backup Customization | Stash +description: Customizing Backup Process with Stash +menu: + docs_v2024.12.18: + identifier: stash-kubedump-customization + name: Customizing Backup Process + parent: stash-kubedump + weight: 50 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Customizing Backup Process + +Stash provides rich customization supports for the backup and restores process to meet the requirements of various cluster configurations. This guide will show you some examples of these customizations. + +In this section, we are going to show you how to customize the backup process. Here, we are going to show some examples of filtering resources using a label selector, running the backup process as a specific user, using multiple retention policies, etc. + +> Note: YAML files used in this tutorial are stored [here](https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/kubedump/customization/examples). + +### Filtering resources + +You can use a label selector to backup the YAML for the resources that have particular labels. You just have to pass the `labelSelector` parameter under `task.params` section with your desired label selector. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: cluster-resources-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: kubedump-backup-0.1.0 + params: + - name: labelSelector + value: "k8s-app=kube-dns" + repository: + name: cluster-resource-storage + runtimeSettings: + pod: + serviceAccountName: cluster-resource-reader + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +The above backup process will backup only the resources that has `k8s-app: kube-dns` label. Here, is a sample of the resources backed up by the above BackupConfiguration. + +```bash +❯ tree $HOME/Downloads/stash +/home/emruz/Downloads/stash +└── latest + └── tmp + └── resources + └── namespaces + └── kube-system + ├── Deployment + │ └── coredns.yaml + ├── Endpoints + │ └── kube-dns.yaml + ├── EndpointSlice + │ └── kube-dns-m2s5c.yaml + ├── Pod + │ ├── coredns-558bd4d5db-hdsw9.yaml + │ └── coredns-558bd4d5db-wk9tx.yaml + ├── ReplicaSet + │ └── coredns-558bd4d5db.yaml + └── Service + └── kube-dns.yaml + +11 directories, 7 files +``` + +### Passing arguments + +You can pass arguments to the backup process using `task.params` section. + +The following example shows how passes `sanitize` argument value to `false` which tells the backup process not to remove decorators (i.e. `status`, `managedFields` etc.) from the YAML files. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: cluster-resources-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: kubedump-backup-0.1.0 + params: + - name: sanitize + value: "false" + repository: + name: cluster-resource-storage + runtimeSettings: + pod: + serviceAccountName: cluster-resource-reader + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +### Running backup job as a specific user + +If your cluster requires running the backup job as a specific user, you can provide `securityContext` under `runtimeSettings.pod` section. The below example shows how you can run the backup job as the root user. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: cluster-resources-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: kubedump-backup-0.1.0 + repository: + name: cluster-resource-storage + runtimeSettings: + pod: + serviceAccountName: cluster-resource-reader + securityContext: + runAsUser: 0 + runAsGroup: 0 + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +### Specifying Memory/CPU limit/request for the backup job + +If you want to specify the Memory/CPU limit/request for your backup job, you can specify `resources` field under `runtimeSettings.container` section. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: cluster-resources-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: kubedump-backup-0.1.0 + repository: + name: cluster-resource-storage + runtimeSettings: + pod: + serviceAccountName: cluster-resource-reader + container: + resources: + requests: + cpu: "200m" + memory: "1Gi" + limits: + cpu: "200m" + memory: "1Gi" + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +### Using multiple retention policies + +You can also specify multiple retention policies for your backed up data. For example, you may want to keep a few daily snapshots, a few weekly snapshots, and few monthly snapshots, etc. You just need to pass the desired number with the respective key under the `retentionPolicy` section. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: cluster-resources-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: kubedump-backup-0.1.0 + repository: + name: cluster-resource-storage + runtimeSettings: + pod: + serviceAccountName: cluster-resource-reader + retentionPolicy: + name: cluster-resource-retention + keepLast: 5 + keepDaily: 10 + keepWeekly: 20 + keepMonthly: 50 + keepYearly: 100 + prune: true +``` + +To know more about the available options for retention policies, please visit [here](/docs/v2024.12.18/concepts/crds/backupconfiguration/#specretentionpolicy). diff --git a/content/docs/v2024.12.18/addons/kubedump/namespace/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/addons/kubedump/namespace/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..f60a9d12fd --- /dev/null +++ b/content/docs/v2024.12.18/addons/kubedump/namespace/examples/backupconfiguration.yaml @@ -0,0 +1,23 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: kube-system-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: kubedump-backup-0.1.0 + repository: + name: namespace-resource-storage + target: + ref: + apiVersion: v1 + kind: Namespace + name: kube-system + runtimeSettings: + pod: + serviceAccountName: cluster-resource-reader + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/kubedump/namespace/examples/rbac.yaml b/content/docs/v2024.12.18/addons/kubedump/namespace/examples/rbac.yaml new file mode 100644 index 0000000000..52ae310646 --- /dev/null +++ b/content/docs/v2024.12.18/addons/kubedump/namespace/examples/rbac.yaml @@ -0,0 +1,27 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: cluster-resource-reader + namespace: demo +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: cluster-resource-reader +rules: +- apiGroups: ["*"] + resources: ["*"] + verbs: ["get","list"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: cluster-resource-reader +subjects: +- kind: ServiceAccount + name: cluster-resource-reader + namespace: demo +roleRef: + kind: ClusterRole + name: cluster-resource-reader + apiGroup: rbac.authorization.k8s.io diff --git a/content/docs/v2024.12.18/addons/kubedump/namespace/examples/repository.yaml b/content/docs/v2024.12.18/addons/kubedump/namespace/examples/repository.yaml new file mode 100644 index 0000000000..3c703b0d36 --- /dev/null +++ b/content/docs/v2024.12.18/addons/kubedump/namespace/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: namespace-resource-storage + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /manifests/namespace/kube-system + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/addons/kubedump/namespace/images/namespace_manifests_backup.png b/content/docs/v2024.12.18/addons/kubedump/namespace/images/namespace_manifests_backup.png new file mode 100644 index 0000000000..5d2d40502a Binary files /dev/null and b/content/docs/v2024.12.18/addons/kubedump/namespace/images/namespace_manifests_backup.png differ diff --git a/content/docs/v2024.12.18/addons/kubedump/namespace/index.md b/content/docs/v2024.12.18/addons/kubedump/namespace/index.md new file mode 100644 index 0000000000..7333dc2405 --- /dev/null +++ b/content/docs/v2024.12.18/addons/kubedump/namespace/index.md @@ -0,0 +1,465 @@ +--- +title: Backup resource YAMLs of a Namespace | Stash +description: Take backup of resources YAMLs of a Namespace using Stash +menu: + docs_v2024.12.18: + identifier: stash-kubedump-namespace + name: Namespace Backup + parent: stash-kubedump + weight: 30 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup resource YAMLs of a Namespace using Stash + +Stash `{{< param "info.version" >}}` supports taking backup of the resource YAMLs using `kubedump` plugin. This guide will show you how you can take a backup of the resource YAMLs of a particular namespace using Stash. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. +- Install Stash in your cluster following the steps [here](/docs/v2024.12.18/setup/install/stash/). +- Install Stash `kubectl` plugin in your local machine following the steps [here](/docs/v2024.12.18/setup/install/kubectl-plugin/). +- If you are not familiar with how Stash backup the resource YAMLs, please check the following guide [here](/docs/v2024.12.18/addons/kubedump/overview/). + +You have to be familiar with the following custom resources: + +- [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) +- [Function](/docs/v2024.12.18/concepts/crds/function/) +- [Task](/docs/v2024.12.18/concepts/crds/task/) +- [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) +- [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) + +To keep things isolated, we are going to use a separate namespace called `demo` throughout this tutorial. Create the `demo` namespace if you haven't created it already. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> Note: YAML files used in this tutorial are stored [here](https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/kubedump/namespace/examples). + +### Prepare for Backup + +In this section, we are going to configure a backup for all the resource YAMLs of `kube-system` namespace. + +#### Ensure `kubedump` Addon + +When you install the Stash, it will automatically install all the official addons. Make sure that `kubedump` addon was installed properly using the following command. + +```bash +❯ kubectl get tasks.stash.appscode.com | grep kubedump +kubedump-backup-0.1.0 23s +``` + +#### Prepare Backend + +We are going to store our backed-up data into a GCS bucket. So, we need to create a Secret with GCS credentials and a `Repository` object with the bucket information. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +**Create Storage Secret:** + +At first, let's create a secret called `gcs-secret` with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat downloaded-sa-json.key > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create Repository:** + +Now, crete a `Repository` object with the information of your desired bucket. Below is the YAML of `Repository` object we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: namespace-resource-storage + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /manifests/namespace/kube-system + storageSecretName: gcs-secret +``` + +Let's create the `Repository` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/kubedump/namespace/examples/repository.yaml +repository.stash.appscode.com/namespace-resource-storage created +``` + +#### Create RBAC + +The `kubedump` plugin requires read permission for all the resources of the desired namespace. By default, Stash does not grant such permissions. We have to provide the necessary permissions manually. + +Here, is the YAML of the `ServiceAccount`, `ClusterRole`, and `ClusterRoleBinding` that we are going to use for granting the necessary permissions. + +```yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: cluster-resource-reader + namespace: demo +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: cluster-resource-reader +rules: +- apiGroups: ["*"] + resources: ["*"] + verbs: ["get","list"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: cluster-resource-reader +subjects: +- kind: ServiceAccount + name: cluster-resource-reader + namespace: demo +roleRef: + kind: ClusterRole + name: cluster-resource-reader + apiGroup: rbac.authorization.k8s.io +``` + +Here, we have give permission to read all the cluster resources. You can restrict this permission to a particular namespace only. + +Let's create the RBAC resources we have shown above, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/kubedump/namespace/examples/rbac.yaml +serviceaccount/cluster-resource-reader created +clusterrole.rbac.authorization.k8s.io/cluster-resource-reader created +clusterrolebinding.rbac.authorization.k8s.io/cluster-resource-reader created +``` + +Now, we are ready for backup. In the next section, we are going to schedule a backup for our cluster resources. + +### Backup + +To schedule a backup, we have to create a `BackupConfiguration` object. Then Stash will create a CronJob to periodically backup the database. + +#### Create BackupConfiguration + +Below is the YAML for `BackupConfiguration` object we care going to use to backup the YAMLs of the cluster resources, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: kube-system-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: kubedump-backup-0.1.0 + repository: + name: namespace-resource-storage + target: + ref: + apiVersion: v1 + kind: Namespace + name: kube-system + runtimeSettings: + pod: + serviceAccountName: cluster-resource-reader + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +Here, + +- `.spec.schedule` specifies that we want to backup the cluster resources at 5 minutes intervals. +- `.spec.task.name` specifies the name of the Task object that specifies the necessary Functions and their execution order to backup the resource YAMLs. +- `.spec.repository.name` specifies the Repository CR name we have created earlier with backend information. +- `.spec.target` specifies the targeted Namespace that we are going to backup. +- `.spec.runtimeSettings.pod.serviceAccountName` specifies the ServiceAccount name that we have created earlier with cluster-wide resource reading permission. +- `.spec.retentionPolicy` specifies a policy indicating how we want to cleanup the old backups. + +Let's create the `BackupConfiguration` object we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/kubedump/namespace/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/kube-system-backup created +``` + +#### Verify Backup Setup Successful + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. Let's verify the `Phase` of the BackupConfiguration, + +```bash +❯ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +kube-system-backup kubedump-backup-0.1.0 */5 * * * * Ready 8s +``` + +#### Verify CronJob + +Stash will create a CronJob with the schedule specified in `spec.schedule` field of `BackupConfiguration` object. + +Verify that the CronJob has been created using the following command, + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-trigger-kube-system-backup */5 * * * * False 0 25s +``` + +#### Wait for BackupSession + +The `stash-trigger-kube-system-backup` CronJob will trigger a backup on each scheduled slot by creating a `BackupSession` object. + +Now, wait for a schedule to appear. Run the following command to watch for a `BackupSession` object, + +```bash +❯ kubectl get backupsession -n demo -w +NAME INVOKER-TYPE INVOKER-NAME PHASE DURATION AGE +kube-system-backup-1652247300 BackupConfiguration kube-system-backup 0s +kube-system-backup-1652247300 BackupConfiguration kube-system-backup Pending 0s +kube-system-backup-1652247300 BackupConfiguration kube-system-backup Running 0s +kube-system-backup-1652247300 BackupConfiguration kube-system-backup Running 17s +kube-system-backup-1652247300 BackupConfiguration kube-system-backup Succeeded 1m11s 71s +``` + +Here, the phase `Succeeded` means that the backup process has been completed successfully. + +#### Verify Backup + +Now, we are going to verify whether the backed-up data is present in the backend or not. Once a backup is completed, Stash will update the respective `Repository` object to reflect the backup completion. Check that the repository `namespace-resource-storage` has been updated by the following command, + +```bash +❯ kubectl get repository -n demo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +namespace-resource-storage true 407.949 KiB 1 95s 13m +``` + +Now, if we navigate to the GCS bucket, we will see the backed up data has been stored in `/manifest/namespace/kube-system` directory as specified by `.spec.backend.gcs.prefix` field of the `Repository` object. + +
+ Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +> Note: Stash keeps all the backed-up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Restore + +Stash does not provide any automatic mechanism to restore the cluster resources from the backed-up YAMLs. Your application might be managed by Helm or by an operator. In such cases, just applying the YAMLs is not enough to restore the application. Furthermore, there might be an order issue. Some resources must be applied before others. It is difficult to generalize and codify various application-specific logic. + +Therefore, it is the user's responsibility to download the backed-up YAMLs and take the necessary steps based on his application to restore it properly. + +### Download the YAMLs + +Stash provides a [kubectl plugin](https://stash.run/docs/v2022.05.12/guides/cli/cli/#download-snapshots) for making it easy to download a snapshot locally. + +Now, let's download the latest Snapshot from our backed-up data into the `$HOME/Downloads/stash/namespace/kube-system` folder of our local machine. + +```bash +❯ kubectl stash download -n demo namespace-resource-storage --destination=$HOME/Downloads/stash/namespace/kube-system --snapshots="latest" +``` + +Now, lets use [tree](https://linux.die.net/man/1/tree) command to inspect downloaded YAMLs files. + +```bash +❯ tree $HOME/Downloads/stash/namespace/kube-system +/home/emruz/Downloads/stash/namespace/kube-system +└── latest + └── tmp + └── resources + ├── ConfigMap + │   ├── coredns.yaml + │   ├── extension-apiserver-authentication.yaml + │   ├── kubeadm-config.yaml + │   ├── kubelet-config-1.21.yaml + │   ├── kube-proxy.yaml + │   └── kube-root-ca.crt.yaml + ├── ControllerRevision + │   ├── kindnet-5b547684d9.yaml + │   └── kube-proxy-6bc6858f58.yaml + ├── DaemonSet + │   ├── kindnet.yaml + │   └── kube-proxy.yaml + ├── Deployment + │   ├── coredns.yaml + │   └── stash-stash-enterprise.yaml + ├── Endpoints + │   ├── kube-dns.yaml + │   └── stash-stash-enterprise.yaml + ├── EndpointSlice + │   ├── kube-dns-m2s5c.yaml + │   └── stash-stash-enterprise-k28h6.yaml + ├── Lease + │   ├── kube-controller-manager.yaml + │   └── kube-scheduler.yaml + ├── Pod + │   ├── coredns-558bd4d5db-hdsw9.yaml + │   ├── coredns-558bd4d5db-wk9tx.yaml + │   ├── etcd-kind-control-plane.yaml + │   ├── kindnet-69whw.yaml + │   ├── kube-apiserver-kind-control-plane.yaml + │   ├── kube-controller-manager-kind-control-plane.yaml + │   ├── kube-proxy-p7j9f.yaml + │   ├── kube-scheduler-kind-control-plane.yaml + │   └── stash-stash-enterprise-567dd95f5b-6xtxg.yaml + ├── ReplicaSet + │   ├── coredns-558bd4d5db.yaml + │   └── stash-stash-enterprise-567dd95f5b.yaml + ├── Role + │   ├── extension-apiserver-authentication-reader.yaml + │   ├── kubeadm:kubelet-config-1.21.yaml + │   ├── kubeadm:nodes-kubeadm-config.yaml + │   ├── kube-proxy.yaml + ├── RoleBinding + │   ├── kubeadm:kubelet-config-1.21.yaml + │   ├── kubeadm:nodes-kubeadm-config.yaml + │   ├── kube-proxy.yaml + ├── Secret + │   ├── attachdetach-controller-token-w68zv.yaml + │   ├── bootstrap-signer-token-j6q2c.yaml + │   ├── certificate-controller-token-d5dvw.yaml + │   ├── clusterrole-aggregation-controller-token-77x8n.yaml + ├── Service + │   ├── kube-dns.yaml + │   └── stash-stash-enterprise.yaml + └── ServiceAccount + ├── attachdetach-controller.yaml + ├── bootstrap-signer.yaml + ├── certificate-controller.yaml + ├── clusterrole-aggregation-controller.yaml + ├── coredns.yaml + ├── cronjob-controller.yaml + ├── daemon-set-controller.yaml + ├── default.yaml + ├── deployment-controller.yaml + +17 directories, 131 files +``` + +Here, the resources has been grouped under the respective Kind folder. + +Let's inspect the YAML of `coredns.yaml` file under ConfigMap folder, + +```yaml +❯ cat $HOME/Downloads/stash/namespace/kube-system/latest/tmp/resources/ConfigMap/coredns.yaml +apiVersion: v1 +data: + Corefile: | + .:53 { + errors + health { + lameduck 5s + } + ready + kubernetes cluster.local in-addr.arpa ip6.arpa { + pods insecure + fallthrough in-addr.arpa ip6.arpa + ttl 30 + } + prometheus :9153 + forward . /etc/resolv.conf { + max_concurrent 1000 + } + cache 30 + loop + reload + loadbalance + } +kind: ConfigMap +metadata: + name: coredns + namespace: kube-system + +``` + +Now, you can use these YAML files to re-create your desired application. + +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo backupconfiguration kube-system-backup +kubectl delete -n demo repository namespace-resource-storage +kubectl delete -n demo serviceaccount cluster-resource-reader +kubectl delete -n demo clusterrole cluster-resource-reader +kubectl delete -n demo clusterrolebinding cluster-resource-reader +``` diff --git a/content/docs/v2024.12.18/addons/kubedump/overview/images/kubedump-backup.svg b/content/docs/v2024.12.18/addons/kubedump/overview/images/kubedump-backup.svg new file mode 100644 index 0000000000..2eac1cebd9 --- /dev/null +++ b/content/docs/v2024.12.18/addons/kubedump/overview/images/kubedump-backup.svg @@ -0,0 +1,914 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/addons/kubedump/overview/index.md b/content/docs/v2024.12.18/addons/kubedump/overview/index.md new file mode 100644 index 0000000000..5969cea53e --- /dev/null +++ b/content/docs/v2024.12.18/addons/kubedump/overview/index.md @@ -0,0 +1,122 @@ +--- +title: KubeDump Backup Overview | Stash +description: How KubeDump Backup Works in Stash +menu: + docs_v2024.12.18: + identifier: stash-kubedump-overview + name: How does it work? + parent: stash-kubedump + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# How Stash Backups Kubernetes Resources + +Stash `{{< param "info.version" >}}` supports taking backup of Kubernetes resource YAMLs. You can backup the YAML definition of the resources of entire cluster, a particular namespaces, or only an application etc. In this guide, we are going to show you how Kubernetes resource backup works in Stash. + +## How Backup Works + +The following diagram shows how Stash takes backup of the Kubernetes resources. Open the image in a new tab to see the enlarged version. + +
+  KubeDump Backup Overview +
Fig: KubeDump Backup Overview
+
+ +The backup process consists of the following steps: + +1. At first, a user creates a secret with access credentials of the backend where the backed up data will be stored. + +2. Then, she creates a `Repository` crd that specifies the backend information along with the secret that holds the credentials to access the backend. + +3. Then, she creates a `BackupConfiguration` crd which specifies the `Task` to use to backup the the resources. + +4. Stash operator watches for `BackupConfiguration` crd. + +5. Once Stash operator finds a `BackupConfiguration` crd, it creates a CronJob with the schedule specified in `BackupConfiguration` object to trigger backup periodically. + +6. On the next scheduled slot, the CronJob triggers a backup by creating a `BackupSession` crd. + +7. Stash operator also watches for `BackupSession` crd. + +8. When it finds a `BackupSession` object, it resolves the respective `Task` and `Function` and prepares a Job definition to backup. + +9. Then, it creates the Job to backup the desired resource YAMLs. + +10. Then, the Job dumps the Kubernetes Resource YAML, and store them temporarily in a directory.Then, it upload the content of the directory to the cloud backend. + +11. Finally, when the backup is complete, the Job sends Prometheus metrics to the Pushgateway running inside Stash operator pod. It also updates the `BackupSession` and `Repository` status to reflect the backup procedure. + +## Next Steps + +- Backup the YAMLs of your entire Kubernetes cluster using Stash following the guide from [here](/docs/v2024.12.18/addons/kubedump/cluster/). +- Backup the YAMLs of an entire Namespace using Stash following the guide from [here](/docs/v2024.12.18/addons/kubedump/namespace/). +- Backup the YAMLs of a particular application using Stash following the guide from [here](/docs/v2024.12.18/addons/kubedump/application/). diff --git a/content/docs/v2024.12.18/addons/mariadb/README.md b/content/docs/v2024.12.18/addons/mariadb/README.md new file mode 100644 index 0000000000..263858b7c3 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mariadb/README.md @@ -0,0 +1,109 @@ +--- +title: MariaDB Addon Overview | Stash +description: MariaDB Addon Overview | Stash +menu: + docs_v2024.12.18: + identifier: stash-mariadb-readme + name: Readme + parent: stash-mariadb + weight: -1 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +url: /docs/v2024.12.18/addons/mariadb/ +aliases: +- /docs/v2024.12.18/addons/mariadb/README/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash MariaDB Addon + +Stash 0.9.0+ supports extending its functionality through addons. Stash MariaDB addon enables Stash to backup and restore MariaDB databases. + +This guide will give you an overview of which MariaDB versions are supported and how the docs are organized. + +## Supported MariaDB Versions + +Stash has the following addon versions for MariaDB: + +{{< versionlist "mariadb">}} + +Here, the addon follows `M.M.P` versioning scheme where `M.M.P` (Major.Minor.Patch) represents the respective database version. + +## Addon Version Compatibility + +Any addon with matching major version with the database version should be able to take backup of that database. For example, MariaDB addon with version `10.x.x` should be able take backup of any MariaDB of `10.x.x` series. However, this might not be true for some versions. In that case, we will have separate addon for that version. + +## Documentation Overview + +Stash MariaDB documentations are organized as below: + +- [How does it work?](/docs/v2024.12.18/addons/mariadb/overview/) gives an overview of how backup and restore process for MariaDB database works in Stash. +- [Helm managed MariaDB](/docs/v2024.12.18/addons/mariadb/helm/) shows how to backup and restore a Helm managed MariaDB database. +- [Auto-Backup](/docs/v2024.12.18/addons/mariadb/auto-backup/) shows how to configure a generic backup template for all the MariaDB databases of a cluster. +- [Customizing Backup & Restore Process](/docs/v2024.12.18/addons/mariadb/customization/) shows how to customize the backup & restore process. diff --git a/content/docs/v2024.12.18/addons/mariadb/_index.md b/content/docs/v2024.12.18/addons/mariadb/_index.md new file mode 100644 index 0000000000..6ba8418cb4 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mariadb/_index.md @@ -0,0 +1,77 @@ +--- +title: Stash MariaDB Addon +menu: + docs_v2024.12.18: + identifier: stash-mariadb + name: MariaDB + parent: stash-addons + weight: 30 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/addons/mariadb/auto-backup/examples/backupblueprint.yaml b/content/docs/v2024.12.18/addons/mariadb/auto-backup/examples/backupblueprint.yaml new file mode 100644 index 0000000000..967d2e0581 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mariadb/auto-backup/examples/backupblueprint.yaml @@ -0,0 +1,19 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupBlueprint +metadata: + name: mariadb-backup-template +spec: + # ============== Blueprint for Repository ========================== + backend: + gcs: + bucket: stash-testing + prefix: mariadb-backup/${TARGET_NAMESPACE}/${TARGET_APP_RESOURCE}/${TARGET_NAME} + storageSecretName: gcs-secret + # ============== Blueprint for BackupConfiguration ================= + task: + name: mariadb-backup-10.5.8 + schedule: "*/5 * * * *" + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/mariadb/auto-backup/examples/sample-mariadb-2.yaml b/content/docs/v2024.12.18/addons/mariadb/auto-backup/examples/sample-mariadb-2.yaml new file mode 100644 index 0000000000..ece057ec9b --- /dev/null +++ b/content/docs/v2024.12.18/addons/mariadb/auto-backup/examples/sample-mariadb-2.yaml @@ -0,0 +1,20 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MariaDB +metadata: + name: sample-mariadb-2 + namespace: demo-2 + annotations: + stash.appscode.com/backup-blueprint: mariadb-backup-template + stash.appscode.com/schedule: "*/3 * * * *" +spec: + version: "10.5.8" + replicas: 1 + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: WipeOut \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/mariadb/auto-backup/examples/sample-mariadb-3.yaml b/content/docs/v2024.12.18/addons/mariadb/auto-backup/examples/sample-mariadb-3.yaml new file mode 100644 index 0000000000..6c25e93b3a --- /dev/null +++ b/content/docs/v2024.12.18/addons/mariadb/auto-backup/examples/sample-mariadb-3.yaml @@ -0,0 +1,20 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MariaDB +metadata: + name: sample-mariadb-3 + namespace: demo-3 + annotations: + stash.appscode.com/backup-blueprint: mariadb-backup-template + params.stash.appscode.com/args: --databases mysql +spec: + version: "10.5.8" + replicas: 1 + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: WipeOut \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/mariadb/auto-backup/examples/sample-mariadb.yaml b/content/docs/v2024.12.18/addons/mariadb/auto-backup/examples/sample-mariadb.yaml new file mode 100644 index 0000000000..491738de04 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mariadb/auto-backup/examples/sample-mariadb.yaml @@ -0,0 +1,19 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MariaDB +metadata: + name: sample-mariadb + namespace: demo + annotations: + stash.appscode.com/backup-blueprint: mariadb-backup-template +spec: + version: "10.5.8" + replicas: 1 + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: WipeOut \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/mariadb/auto-backup/images/sample-mariadb-2.png b/content/docs/v2024.12.18/addons/mariadb/auto-backup/images/sample-mariadb-2.png new file mode 100644 index 0000000000..8806af218d Binary files /dev/null and b/content/docs/v2024.12.18/addons/mariadb/auto-backup/images/sample-mariadb-2.png differ diff --git a/content/docs/v2024.12.18/addons/mariadb/auto-backup/images/sample-mariadb-3.png b/content/docs/v2024.12.18/addons/mariadb/auto-backup/images/sample-mariadb-3.png new file mode 100644 index 0000000000..3253bf52f4 Binary files /dev/null and b/content/docs/v2024.12.18/addons/mariadb/auto-backup/images/sample-mariadb-3.png differ diff --git a/content/docs/v2024.12.18/addons/mariadb/auto-backup/images/sample-mariadb.png b/content/docs/v2024.12.18/addons/mariadb/auto-backup/images/sample-mariadb.png new file mode 100644 index 0000000000..eb9e1c9691 Binary files /dev/null and b/content/docs/v2024.12.18/addons/mariadb/auto-backup/images/sample-mariadb.png differ diff --git a/content/docs/v2024.12.18/addons/mariadb/auto-backup/index.md b/content/docs/v2024.12.18/addons/mariadb/auto-backup/index.md new file mode 100644 index 0000000000..fef104c3de --- /dev/null +++ b/content/docs/v2024.12.18/addons/mariadb/auto-backup/index.md @@ -0,0 +1,731 @@ +--- +title: MariaDB Auto-Backup | Stash +description: Backup MariaDB using Stash Auto-Backup +menu: + docs_v2024.12.18: + identifier: stash-mariadb-auto-backup + name: Auto-Backup + parent: stash-mariadb + weight: 30 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup MariaDB using Stash Auto-Backup + +Stash can be configured to automatically backup any MariaDB database in your cluster. Stash enables cluster administrators to deploy backup blueprints ahead of time so that the database owners can easily backup their database with just a few annotations. + +In this tutorial, we are going to show how you can configure a backup blueprint for MariaDB databases in your cluster and backup them with few annotations. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. +- Install Stash in your cluster following the steps [here](/docs/v2024.12.18/setup/install/stash/). +- Install [KubeDB](https://kubedb.com) in your cluster following the steps [here](https://kubedb.com/docs/latest/setup/). This step is optional. You can deploy your database using any method you want. +- If you are not familiar with how Stash backup and restore MariaDB databases, please check the following guide [here](/docs/v2024.12.18/addons/mariadb/overview/). +- If you are not familiar with how auto-backup works in Stash, please check the following guide [here](/docs/v2024.12.18/guides/auto-backup/overview/). +- If you are not familiar with the available auto-backup options for databases in Stash, please check the following guide [here](/docs/v2024.12.18/guides/auto-backup/database/). + +You should be familiar with the following `Stash` concepts: + +- [BackupBlueprint](/docs/v2024.12.18/concepts/crds/backupblueprint/) +- [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) +- [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) +- [Repository](/docs/v2024.12.18/concepts/crds/repository/) +- [Function](/docs/v2024.12.18/concepts/crds/function/) +- [Task](/docs/v2024.12.18/concepts/crds/task/) + +In this tutorial, we are going to show backup of three different MariaDB databases on three different namespaces named `demo`, `demo-2`, and `demo-3`. Create the namespaces as below if you haven't done it already. + +```bash +❯ kubectl create ns demo +namespace/demo created + +❯ kubectl create ns demo-2 +namespace/demo-2 created + +❯ kubectl create ns demo-3 +namespace/demo-3 created +``` + +When you install Stash, it installs the necessary addons to backup MariaDB. Verify that the MariaDB addons were installed properly using the following command. + +```bash +❯ kubectl get tasks.stash.appscode.com | grep mariadb +mariadb-backup-10.5.8 62m +mariadb-backup-10.5.8 62m +``` + +## Prepare Backup Blueprint + +To backup an MariaDB database using Stash, you have to create a `Secret` containing the backend credentials, a `Repository` containing the backend information, and a `BackupConfiguration` containing the schedule and target information. A `BackupBlueprint` allows you to specify a template for the `Repository` and the `BackupConfiguration`. + +The `BackupBlueprint` is a non-namespaced CRD. So, once you have created a `BackupBlueprint`, you can use it to backup any MariaDB database of any namespace just by creating the storage `Secret` in that namespace and adding few annotations to your MariaDB CRO. Then, Stash will automatically create a `Repository` and a `BackupConfiguration` according to the template to backup the database. + +Below is the `BackupBlueprint` object that we are going to use in this tutorial, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupBlueprint +metadata: + name: mariadb-backup-template +spec: + # ============== Blueprint for Repository ========================== + backend: + gcs: + bucket: stash-testing + prefix: mariadb-backup/${TARGET_NAMESPACE}/${TARGET_APP_RESOURCE}/${TARGET_NAME} + storageSecretName: gcs-secret + # ============== Blueprint for BackupConfiguration ================= + task: + name: mariadb-backup-10.5.8 + schedule: "*/5 * * * *" + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Here, we are using a GCS bucket as our backend. We are providing `gcs-secret` at the `storageSecretName` field. Hence, we have to create a secret named `gcs-secret` with the access credentials of our bucket in every namespace where we want to enable backup through this blueprint. + +Notice the `prefix` field of `backend` section. We have used some variables in form of `${VARIABLE_NAME}`. Stash will automatically resolve those variables from the database information to make the backend prefix unique for each database instance. + +Let's create the `BackupBlueprint` we have shown above, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mariadb/auto-backup/examples/backupblueprint.yaml +backupblueprint.stash.appscode.com/mariadb-backup-template created +``` + +Now, we are ready to backup our MariaDB databases using few annotations. You can check available auto-backup annotations for a databases from [here](/docs/v2024.12.18/guides/auto-backup/database/#available-auto-backup-annotations-for-database). + +## Auto-backup with default configurations + +In this section, we are going to backup an MariaDB database of `demo` namespace. We are going to use the default configurations specified in the `BackupBlueprint`. + +### Create Storage Secret + +At first, let's create the `gcs-secret` in `demo` namespace with the access credentials to our GCS bucket. + +```bash +❯ echo -n 'changeit' > RESTIC_PASSWORD +❯ echo -n '' > GOOGLE_PROJECT_ID +❯ cat downloaded-sa-key.json > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +❯ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +### Create Database + +Now, we are going to create an MariaDB CRO in `demo` namespace. Below is the YAML of the MariaDB object that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MariaDB +metadata: + name: sample-mariadb + namespace: demo + annotations: + stash.appscode.com/backup-blueprint: mariadb-backup-template +spec: + version: "10.5.8" + replicas: 1 + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: WipeOut +``` + +Notice the `annotations` section. We are pointing to the `BackupBlueprint` that we have created earlier though `stash.appscode.com/backup-blueprint` annotation. Stash will watch this annotation and create a `Repository` and a `BackupConfiguration` according to the `BackupBlueprint`. + +Let's create the above MariaDB CRO, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mariadb/auto-backup/examples/sample-mariadb.yaml +mariadb.kubedb.com/sample-mariadb created +``` + +### Verify Auto-backup configured + +In this section, we are going to verify whether Stash has created the respective `Repository` and `BackupConfiguration` for our MariaDB database we have just deployed or not. + +#### Verify Repository + +At first, let's verify whether Stash has created a `Repository` for our MariaDB or not. + +```bash +❯ kubectl get repository -n demo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +app-sample-mariadb 10s +``` + +Now, let's check the YAML of the `Repository`. + +```yaml +❯ kubectl get repository -n demo app-sample-mariadb -o yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: +... + name: app-sample-mariadb + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: mariadb-backup/demo/mariadb/sample-mariadb + storageSecretName: gcs-secret +``` + +Here, you can see that Stash has resolved the variables in `prefix` field and substituted them with the equivalent information from this database. + +#### Verify BackupConfiguration + +If everything goes well, Stash should create a `BackupConfiguration` for our MariaDB in `demo` namespace and the phase of that `BackupConfiguration` should be `Ready`. Verify the `BackupConfiguration` crd by the following command, + +```bash +❯ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +app-sample-mariadb mariadb-backup-10.5.8 */5 * * * * Ready 7m28s +``` + +Now, let's check the YAML of the `BackupConfiguration`. + +```yaml +❯ kubectl get backupconfiguration -n demo app-sample-mariadb -o yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: app-sample-mariadb + namespace: demo + ... + spec: + driver: Restic + repository: + name: app-sample-mariadb + retentionPolicy: + keepLast: 5 + name: keep-last-5 + prune: true + runtimeSettings: {} + schedule: '*/5 * * * *' + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + task: + name: mariadb-backup-10.5.8 + tempDir: {} +status: + conditions: + - lastTransitionTime: "2021-02-25T05:14:51Z" + message: Repository demo/app-sample-mariadb exist. + reason: RepositoryAvailable + status: "True" + type: RepositoryFound + - lastTransitionTime: "2021-02-25T05:14:51Z" + message: Backend Secret demo/gcs-secret exist. + reason: BackendSecretAvailable + status: "True" + type: BackendSecretFound + - lastTransitionTime: "2021-02-25T05:14:51Z" + message: Backup target appcatalog.appscode.com/v1alpha1 appbinding/sample-mariadb + found. + reason: TargetAvailable + status: "True" + type: BackupTargetFound + - lastTransitionTime: "2021-02-25T05:14:51Z" + message: Successfully created backup triggering CronJob. + reason: CronJobCreationSucceeded + status: "True" + type: CronJobCreated + observedGeneration: 1 + +``` + +Notice the `target` section. Stash has automatically added the MariaDB as the target of this `BackupConfiguration`. + +#### Verify Backup + +Now, let's wait for a backup run to complete. You can watch for `BackupSession` as below, + +```bash +❯ kubectl get backupsession -n demo -w +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +app-sample-mariadb-1614230401 BackupConfiguration app-sample-mariadb Succeeded 5m40s +app-sample-mariadb-1614230701 BackupConfiguration app-sample-mariadb Running 39s +``` + +Once the backup has been completed successfully, you should see the backed up data has been stored in the bucket at the directory pointed by the `prefix` field of the `Repository`. + +
+ Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +## Auto-backup with a custom schedule + +In this section, we are going to backup an MariaDB database of `demo-2` namespace. This time, we are going to overwrite the default schedule used in the `BackupBlueprint`. + +### Create Storage Secret + +At first, let's create the `gcs-secret` in `demo-2` namespace with the access credentials to our GCS bucket. + +```bash +❯ kubectl create secret generic -n demo-2 gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +### Create Database + +Now, we are going to create an MariaDB CRO in `demo-2` namespace. Below is the YAML of the MariaDB object that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MariaDB +metadata: + name: sample-mariadb-2 + namespace: demo-2 + annotations: + stash.appscode.com/backup-blueprint: mariadb-backup-template + stash.appscode.com/schedule: "*/3 * * * *" +spec: + version: "10.5.8" + replicas: 1 + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: WipeOut +``` + +Notice the `annotations` section. This time, we have passed a schedule via `stash.appscode.com/schedule` annotation along with the `stash.appscode.com/backup-blueprint` annotation. + +Let's create the above MariaDB CRO, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mariadb/auto-backup/examples/sample-mariadb-2.yaml +mariadb.kubedb.com/sample-mariadb-2 created +``` + +### Verify Auto-backup configured + +Now, let's verify whether the auto-backup has been configured properly or not. + +#### Verify Repository + +At first, let's verify whether Stash has created a `Repository` for our MariaDB or not. + +```bash +❯ kubectl get repository -n demo-2 +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +app-sample-mariadb-2 4s +``` + +Now, let's check the YAML of the `Repository`. + +```yaml +❯ kubectl get repository -n demo-2 app-sample-mariadb-2 -o yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: app-sample-mariadb-2 + namespace: demo-2 + ... +spec: + backend: + gcs: + bucket: stash-testing + prefix: stash-backup/demo-2/mariadb/sample-mariadb-2 + storageSecretName: gcs-secret + +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: app-sample-mariadb-2 + namespace: demo-2 + ... +spec: + backend: + gcs: + bucket: stash-testing + prefix: mariadb-backup/demo-2/mariadb/sample-mariadb-2 + storageSecretName: gcs-secret +``` + +Here, you can see that Stash has resolved the variables in `prefix` field and substituted them with the equivalent information from this new database. + +#### Verify BackupConfiguration + +If everything goes well, Stash should create a `BackupConfiguration` for our MariaDB in `demo-2` namespace and the phase of that `BackupConfiguration` should be `Ready`. Verify the `BackupConfiguration` crd by the following command, + +```bash +❯ kubectl get backupconfiguration -n demo-2 +NAME TASK SCHEDULE PAUSED PHASE AGE +app-sample-mariadb-2 mariadb-backup-10.5.8 */3 * * * * Ready 3m24s +``` + +Now, let's check the YAML of the `BackupConfiguration`. + +```yaml +❯ kubectl get backupconfiguration -n demo-2 app-sample-mariadb-2 -o yaml + +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: app-sample-mariadb-2 + namespace: demo-2 + ... + ownerReferences: + - apiVersion: appcatalog.appscode.com/v1alpha1 + blockOwnerDeletion: true + controller: true + kind: AppBinding + name: sample-mariadb-2 + uid: 7cbdf140-5fd1-487a-b04f-1847def418e8 + resourceVersion: "56888" + selfLink: /apis/stash.appscode.com/v1beta1/namespaces/demo-2/backupconfigurations/app-sample-mariadb-2 + uid: e85dd3db-fa41-48b8-b253-5731ee8cc956 +spec: + driver: Restic + repository: + name: app-sample-mariadb-2 + retentionPolicy: + keepLast: 5 + name: keep-last-5 + prune: true + runtimeSettings: {} + schedule: '*/3 * * * *' + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb-2 + task: + name: mariadb-backup-10.5.8 + tempDir: {} +status: + conditions: + - lastTransitionTime: "2021-02-25T06:10:14Z" + message: Repository demo-2/app-sample-mariadb-2 exist. + reason: RepositoryAvailable + status: "True" + type: RepositoryFound + - lastTransitionTime: "2021-02-25T06:10:14Z" + message: Backend Secret demo-2/gcs-secret exist. + reason: BackendSecretAvailable + status: "True" + type: BackendSecretFound + - lastTransitionTime: "2021-02-25T06:10:14Z" + message: Backup target appcatalog.appscode.com/v1alpha1 appbinding/sample-mariadb-2 + found. + reason: TargetAvailable + status: "True" + type: BackupTargetFound + - lastTransitionTime: "2021-02-25T06:10:14Z" + message: Successfully created backup triggering CronJob. + reason: CronJobCreationSucceeded + status: "True" + type: CronJobCreated + observedGeneration: 1 +``` + +Notice the `schedule` section. This time the `BackupConfiguration` has been created with the schedule we have provided via annotation. + +Also, notice the `target` section. Stash has automatically added the new MariaDB as the target of this `BackupConfiguration`. + +#### Verify Backup + +Now, let's wait for a backup run to complete. You can watch for `BackupSession` as below, + +```bash +❯ kubectl get backupsession -n demo-2 -w +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +app-sample-mariadb-2-1614233715 BackupConfiguration app-sample-mariadb-2 Succeeded 3m2s +app-sample-mariadb-2-1614233880 BackupConfiguration app-sample-mariadb-2 Running 17s +``` + +Once the backup has been completed successfully, you should see that Stash has created a new directory as pointed by the `prefix` field of the new `Repository` and stored the backed up data there. + +
+ Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +## Auto-backup with custom parameters + +In this section, we are going to backup an MariaDB database of `demo-3` namespace. This time, we are going to pass some parameters for the Task through the annotations. + +### Create Storage Secret + +At first, let's create the `gcs-secret` in `demo-3` namespace with the access credentials to our GCS bucket. + +```bash +❯ kubectl create secret generic -n demo-3 gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +### Create Database + +Now, we are going to create an Elasticsearch CRO in `demo-3` namespace. Below is the YAML of the MariaDB object that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MariaDB +metadata: + name: sample-mariadb-3 + namespace: demo-3 + annotations: + stash.appscode.com/backup-blueprint: mariadb-backup-template + params.stash.appscode.com/args: --databases mysql +spec: + version: "10.5.8" + replicas: 1 + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: WipeOut + +``` + +Notice the `annotations` section. This time, we have passed an argument via `params.stash.appscode.com/args` annotation along with the `stash.appscode.com/backup-blueprint` annotation. + +Let's create the above MariaDB CRO, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mariadb/auto-backup/examples/sample-mariadb-3.yaml +mariadb.kubedb.com/sample-mariadb-3 created +``` + +### Verify Auto-backup configured + +Now, let's verify whether the auto-backup resources has been created or not. + +#### Verify Repository + +At first, let's verify whether Stash has created a `Repository` for our MariaDB or not. + +```bash +❯ kubectl get repository -n demo-3 +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +app-sample-mariadb-3 8s +``` + +Now, let's check the YAML of the `Repository`. + +```yaml +❯ kubectl get repository -n demo-3 app-sample-mariadb-3 -o yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: app-sample-mariadb-3 + namespace: demo-3 + ... +spec: + backend: + gcs: + bucket: stash-testing + prefix: mariadb-backup/demo-3/mariadb/sample-mariadb-3 + storageSecretName: gcs-secret +``` + +Here, you can see that Stash has resolved the variables in `prefix` field and substituted them with the equivalent information from this new database. + +#### Verify BackupConfiguration + +If everything goes well, Stash should create a `BackupConfiguration` for our MariaDB in `demo-3` namespace and the phase of that `BackupConfiguration` should be `Ready`. Verify the `BackupConfiguration` crd by the following command, + +```bash +❯ kubectl get backupconfiguration -n demo-3 +NAME TASK SCHEDULE PAUSED PHASE AGE +app-sample-mariadb-3 mariadb-backup-10.5.8 */5 * * * * Ready 106s +``` + +Now, let's check the YAML of the `BackupConfiguration`. + +```yaml +❯ kubectl get backupconfiguration -n demo-3 app-sample-mariadb-3 -o yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: app-sample-mariadb-3 + namespace: demo-3 + ... +spec: + driver: Restic + repository: + name: app-sample-mariadb-3 + retentionPolicy: + keepLast: 5 + name: keep-last-5 + prune: true + runtimeSettings: {} + schedule: '*/5 * * * *' + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb-3 + task: + name: mariadb-backup-10.5.8 + params: + - name: args + value: --databases mysql + tempDir: {} +status: + conditions: + - lastTransitionTime: "2021-02-25T11:58:12Z" + message: Repository demo-3/app-sample-mariadb-3 exist. + reason: RepositoryAvailable + status: "True" + type: RepositoryFound + - lastTransitionTime: "2021-02-25T11:58:12Z" + message: Backend Secret demo-3/gcs-secret exist. + reason: BackendSecretAvailable + status: "True" + type: BackendSecretFound + - lastTransitionTime: "2021-02-25T11:58:12Z" + message: Backup target appcatalog.appscode.com/v1alpha1 appbinding/sample-mariadb-3 + found. + reason: TargetAvailable + status: "True" + type: BackupTargetFound + - lastTransitionTime: "2021-02-25T11:58:12Z" + message: Successfully created backup triggering CronJob. + reason: CronJobCreationSucceeded + status: "True" + type: CronJobCreated + observedGeneration: 1 +``` + +Notice the `task` section. The `args` parameter that we had passed via annotations has been added to the `params` section. + +Also, notice the `target` section. Stash has automatically added the new MariaDB as the target of this `BackupConfiguration`. + +#### Verify Backup + +Now, let's wait for a backup run to complete. You can watch for `BackupSession` as below, + +```bash +❯ kubectl get backupsession -n demo-3 -w +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +app-sample-mariadb-3-1614254408 BackupConfiguration app-sample-mariadb-3 Succeeded 5m23s +app-sample-mariadb-3-1614254708 BackupConfiguration app-sample-mariadb-3 Running 23s +``` + +Once the backup has been completed successfully, you should see that Stash has created a new directory as pointed by the `prefix` field of the new `Repository` and stored the backed up data there. + +
+ Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +## Cleanup + +To cleanup the resources crated by this tutorial, run the following commands, + +```bash +❯ kubectl delete -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mariadb/auto-backup/examples/ +backupblueprint.stash.appscode.com "mariadb-backup-template" deleted +mariadb.kubedb.com "sample-mariadb-2" deleted +mariadb.kubedb.com "sample-mariadb-3" deleted +mariadb.kubedb.com "sample-mariadb" deleted + +❯ kubectl delete repository -n demo --all +repository.stash.appscode.com "app-sample-mariadb" deleted +❯ kubectl delete repository -n demo-2 --all +repository.stash.appscode.com "app-sample-mariadb-2" deleted +❯ kubectl delete repository -n demo-3 --all +repository.stash.appscode.com "app-sample-mariadb-3" deleted +``` diff --git a/content/docs/v2024.12.18/addons/mariadb/customization/examples/backup/multi-retention-policy.yaml b/content/docs/v2024.12.18/addons/mariadb/customization/examples/backup/multi-retention-policy.yaml new file mode 100644 index 0000000000..aab328dee2 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mariadb/customization/examples/backup/multi-retention-policy.yaml @@ -0,0 +1,24 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mariadb-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: mariadb-backup-10.5.8 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + retentionPolicy: + name: sample-mariadb-retention + keepLast: 5 + keepDaily: 10 + keepWeekly: 20 + keepMonthly: 50 + keepYearly: 100 + prune: true \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/mariadb/customization/examples/backup/passing-args.yaml b/content/docs/v2024.12.18/addons/mariadb/customization/examples/backup/passing-args.yaml new file mode 100644 index 0000000000..398df8ef27 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mariadb/customization/examples/backup/passing-args.yaml @@ -0,0 +1,23 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mariadb-backup + namespace: demo +spec: + schedule: "*/2 * * * *" + task: + name: mariadb-backup-10.5.8 + params: + - name: args + value: --databases testdb + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/mariadb/customization/examples/backup/resource-limit.yaml b/content/docs/v2024.12.18/addons/mariadb/customization/examples/backup/resource-limit.yaml new file mode 100644 index 0000000000..696cf0a4ed --- /dev/null +++ b/content/docs/v2024.12.18/addons/mariadb/customization/examples/backup/resource-limit.yaml @@ -0,0 +1,29 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mariadb-backup + namespace: demo +spec: + schedule: "*/2 * * * *" + task: + name: mariadb-backup-10.5.8 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + runtimeSettings: + container: + resources: + requests: + cpu: "200m" + memory: "1Gi" + limits: + cpu: "200m" + memory: "1Gi" + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/mariadb/customization/examples/backup/specific-user.yaml b/content/docs/v2024.12.18/addons/mariadb/customization/examples/backup/specific-user.yaml new file mode 100644 index 0000000000..709123aab9 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mariadb/customization/examples/backup/specific-user.yaml @@ -0,0 +1,25 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mariadb-backup + namespace: demo +spec: + schedule: "*/2 * * * *" + task: + name: mariadb-backup-10.5.8 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + runtimeSettings: + pod: + securityContext: + runAsUser: 0 + runAsGroup: 0 + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/mariadb/customization/examples/repository.yaml b/content/docs/v2024.12.18/addons/mariadb/customization/examples/repository.yaml new file mode 100644 index 0000000000..3bfd4ef2f4 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mariadb/customization/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /demo/customizing + storageSecretName: gcs-secret \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/mariadb/customization/examples/restore/passing-args.yaml b/content/docs/v2024.12.18/addons/mariadb/customization/examples/restore/passing-args.yaml new file mode 100644 index 0000000000..4c75636182 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mariadb/customization/examples/restore/passing-args.yaml @@ -0,0 +1,22 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mariadb-restore + namespace: demo + labels: + app.kubernetes.io/name: mariadb.kubedb.com +spec: + task: + name: mariadb-restore-10.5.8 + params: + - name: args + value: --one-database testdb + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + rules: + - snapshots: [latest] \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/mariadb/customization/examples/restore/resource-limit.yaml b/content/docs/v2024.12.18/addons/mariadb/customization/examples/restore/resource-limit.yaml new file mode 100644 index 0000000000..2cd84f793b --- /dev/null +++ b/content/docs/v2024.12.18/addons/mariadb/customization/examples/restore/resource-limit.yaml @@ -0,0 +1,29 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mariadb-restore + namespace: demo + labels: + app.kubernetes.io/name: mariadbes.kubedb.com +spec: + task: + name: mariadb-restore-10.5.8 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + runtimeSettings: + container: + resources: + requests: + cpu: "200m" + memory: "1Gi" + limits: + cpu: "200m" + memory: "1Gi" + rules: + - snapshots: [latest] + diff --git a/content/docs/v2024.12.18/addons/mariadb/customization/examples/restore/specific-snapshot.yaml b/content/docs/v2024.12.18/addons/mariadb/customization/examples/restore/specific-snapshot.yaml new file mode 100644 index 0000000000..fe64cce841 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mariadb/customization/examples/restore/specific-snapshot.yaml @@ -0,0 +1,19 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mariadb-restore + namespace: demo + labels: + app.kubernetes.io/name: mariadb.kubedb.com +spec: + task: + name: mariadb-restore-10.5.8 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + rules: + - snapshots: [4bc21d6f] \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/mariadb/customization/examples/restore/specific-user.yaml b/content/docs/v2024.12.18/addons/mariadb/customization/examples/restore/specific-user.yaml new file mode 100644 index 0000000000..899617a777 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mariadb/customization/examples/restore/specific-user.yaml @@ -0,0 +1,24 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mariadb-restore + namespace: demo + labels: + app.kubernetes.io/name: mariadb.kubedb.com +spec: + task: + name: mariadb-restore-10.5.8 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + runtimeSettings: + pod: + securityContext: + runAsUser: 0 + runAsGroup: 0 + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/addons/mariadb/customization/examples/sample-mariadb.yaml b/content/docs/v2024.12.18/addons/mariadb/customization/examples/sample-mariadb.yaml new file mode 100644 index 0000000000..a0821f0f22 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mariadb/customization/examples/sample-mariadb.yaml @@ -0,0 +1,15 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MariaDB +metadata: + name: sample-mariadb + namespace: demo +spec: + version: "10.5.8" + replicas: 1 + storageType: Durable + storage: + resources: + requests: + storage: 1Gi + storageClassName: standard + terminationPolicy: Delete \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/mariadb/customization/index.md b/content/docs/v2024.12.18/addons/mariadb/customization/index.md new file mode 100644 index 0000000000..887a302bf4 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mariadb/customization/index.md @@ -0,0 +1,366 @@ +--- +title: MariaDB Backup Customization | Stash +description: Customizing MariaDB Backup and Restore process with Stash +menu: + docs_v2024.12.18: + identifier: stash-mariadb-customization + name: Customizing Backup & Restore Process + parent: stash-mariadb + weight: 40 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Customizing Backup and Restore Process + +Stash provides rich customization supports for the backup and restore process to meet the requirements of various cluster configurations. This guide will show you some examples of these customizations. + +> Note: YAML files used in this tutorial are stored [here](https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/mariadb/customization/examples). + +## Customizing Backup Process + +In this section, we are going to show you how to customize the backup process. Here, we are going to show some examples of providing arguments to the backup process, running the backup process as a specific user, ignoring some indexes during the backup process, etc. + +### Passing arguments to the backup process + +Stash MariaDB addon uses [mysqldump](https://mariadb.com/kb/en/mysqldump) for backup. You can pass arguments to the `mysqldump` through `args` param under `task.params` section. + +The below example shows how you can pass the `--databases testdb` to take backup for a specific mariadb databases named `testdb`. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mariadb-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: mariadb-backup-10.5.8 + params: + - name: args + value: --databases testdb + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +> **WARNING**: Make sure that you have the specific database created before taking backup. In this case, Database `testdb` should exist before the backup job starts. + +### Running backup job as a specific user + +If your cluster requires running the backup job as a specific user, you can provide `securityContext` under `runtimeSettings.pod` section. The below example shows how you can run the backup job as the root user. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mariadb-backup + namespace: demo +spec: + schedule: "*/2 * * * *" + task: + name: mariadb-backup-10.5.8 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + runtimeSettings: + pod: + securityContext: + runAsUser: 0 + runAsGroup: 0 + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +### Specifying Memory/CPU limit/request for the backup job + +If you want to specify the Memory/CPU limit/request for your backup job, you can specify `resources` field under `runtimeSettings.container` section. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mariadb-backup + namespace: demo +spec: + schedule: "*/2 * * * *" + task: + name: mariadb-backup-10.5.8 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + runtimeSettings: + container: + resources: + requests: + cpu: "200m" + memory: "1Gi" + limits: + cpu: "200m" + memory: "1Gi" + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +### Using multiple retention policies + +You can also specify multiple retention policies for your backed up data. For example, you may want to keep few daily snapshots, few weekly snapshots, and few monthly snapshots, etc. You just need to pass the desired number with the respective key under the `retentionPolicy` section. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mariadb-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: mariadb-backup-10.5.8 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + retentionPolicy: + name: sample-mariadb-retention + keepLast: 5 + keepDaily: 10 + keepWeekly: 20 + keepMonthly: 50 + keepYearly: 100 + prune: true +``` + +To know more about the available options for retention policies, please visit [here](/docs/v2024.12.18/concepts/crds/backupconfiguration/#specretentionpolicy). + +## Customizing Restore Process + +Stash also uses `mysql` during the restore process. In this section, we are going to show how you can pass arguments to the restore process, restore a specific snapshot, run restore job as a specific user, etc. + +### Passing arguments to the restore process + +Similar to the backup process, you can pass arguments to the restore process through the `args` params under `task.params` section. This example will restore data from database `testdb` only. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mariadb-restore + namespace: demo + labels: + app.kubernetes.io/name: mariadb.kubedb.com +spec: + task: + name: mariadb-restore-10.5.8 + params: + - name: args + value: --one-database testdb + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + rules: + - snapshots: [latest] +``` + +### Restore specific snapshot + +You can also restore a specific snapshot. At first, list the available snapshots as below, + +```bash +❯ kubectl get snapshots -n demo +NAME ID REPOSITORY HOSTNAME CREATED AT +gcs-repo-4bc21d6f 4bc21d6f gcs-repo host-0 2022-01-12T14:54:27Z +gcs-repo-f0ac7cbd f0ac7cbd gcs-repo host-0 2022-01-12T14:56:26Z +gcs-repo-9210ebb6 9210ebb6 gcs-repo host-0 2022-01-12T14:58:27Z +gcs-repo-0aff8890 0aff8890 gcs-repo host-0 2022-01-12T15:00:28Z +``` + +>You can also filter the snapshots as shown in the guide [here](https://stash.run/docs/{{< param "info.version" >}}/concepts/crds/snapshot/#working-with-snapshot). + +You can use the respective ID of the snapshot to restore a specific snapshot. + +The below example shows how you can pass a specific snapshot ID through the `snapshots` field of `rules` section. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mariadb-restore + namespace: demo + labels: + app.kubernetes.io/name: mariadb.kubedb.com +spec: + task: + name: mariadb-restore-10.5.8 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + rules: + - snapshots: [4bc21d6f] +``` + +>Please, do not specify multiple snapshots here. Each snapshot represents a complete backup of your database. Multiple snapshots are only usable during file/directory restore. + +### Running restore job as a specific user + +You can provide `securityContext` under `runtimeSettings.pod` section to run the restore job as a specific user. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mariadb-restore + namespace: demo + labels: + app.kubernetes.io/name: mariadb.kubedb.com +spec: + task: + name: mariadb-restore-10.5.8 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + runtimeSettings: + pod: + securityContext: + runAsUser: 0 + runAsGroup: 0 + rules: + - snapshots: [latest] +``` + +### Specifying Memory/CPU limit/request for the restore job + +Similar to the backup process, you can also provide `resources` field under the `runtimeSettings.container` section to limit the Memory/CPU for your restore job. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mariadb-restore + namespace: demo + labels: + app.kubernetes.io/name: mariadb.kubedb.com +spec: + task: + name: mariadb-restore-10.5.8 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + runtimeSettings: + container: + resources: + requests: + cpu: "200m" + memory: "1Gi" + limits: + cpu: "200m" + memory: "1Gi" + rules: + - snapshots: [latest] +``` diff --git a/content/docs/v2024.12.18/addons/mariadb/helm/examples/appbinding.yaml b/content/docs/v2024.12.18/addons/mariadb/helm/examples/appbinding.yaml new file mode 100644 index 0000000000..8c883b67c8 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mariadb/helm/examples/appbinding.yaml @@ -0,0 +1,23 @@ +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: sample-mariadb + namespace: demo +spec: + clientConfig: + service: + name: sample-mariadb + path: / + port: 3306 + scheme: mysql + secret: + name: sample-mariadb + secretTransforms: + - addKey: + key: username + stringValue: root + - renameKey: + from: mariadb-root-password + to: password + type: mariadb + version: 10.5.8 diff --git a/content/docs/v2024.12.18/addons/mariadb/helm/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/addons/mariadb/helm/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..154aabafdc --- /dev/null +++ b/content/docs/v2024.12.18/addons/mariadb/helm/examples/backupconfiguration.yaml @@ -0,0 +1,20 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mariadb-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: mariadb-backup-10.5.8 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/mariadb/helm/examples/repository.yaml b/content/docs/v2024.12.18/addons/mariadb/helm/examples/repository.yaml new file mode 100644 index 0000000000..2c6ed55b1b --- /dev/null +++ b/content/docs/v2024.12.18/addons/mariadb/helm/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /demo/mariadb/sample-mariadb + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/addons/mariadb/helm/examples/restoresession.yaml b/content/docs/v2024.12.18/addons/mariadb/helm/examples/restoresession.yaml new file mode 100644 index 0000000000..ad150d1774 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mariadb/helm/examples/restoresession.yaml @@ -0,0 +1,17 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mariadb-restore + namespace: demo +spec: + task: + name: mariadb-restore-10.5.8 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/addons/mariadb/helm/images/sample-mariadb-backup.png b/content/docs/v2024.12.18/addons/mariadb/helm/images/sample-mariadb-backup.png new file mode 100644 index 0000000000..8ec12b62b6 Binary files /dev/null and b/content/docs/v2024.12.18/addons/mariadb/helm/images/sample-mariadb-backup.png differ diff --git a/content/docs/v2024.12.18/addons/mariadb/helm/index.md b/content/docs/v2024.12.18/addons/mariadb/helm/index.md new file mode 100644 index 0000000000..b898f0d2e4 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mariadb/helm/index.md @@ -0,0 +1,706 @@ +--- +title: Logical Backup & Restore MariaDB | Stash +description: Take logical backup of MariaDB database using Stash +menu: + docs_v2024.12.18: + identifier: stash-mariadb-helm + name: Helm managed MariaDB + parent: stash-mariadb + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Take a logical backup of the MariaDB database using Stash + +Stash `v0.11.8+` supports backup and restoration of MariaDB databases. This guide will show you how you can take a logical backup of your MariaDB databases and restore them using Stash. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. +- Install Stash in your cluster following the steps [here](/docs/v2024.12.18/setup/install/stash/). +- If you are not familiar with how Stash backup and restore MariaDB databases, please check the following guide [here](/docs/v2024.12.18/addons/mariadb/overview/). + +You have to be familiar with following custom resources: + +- [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) +- [Function](/docs/v2024.12.18/concepts/crds/function/) +- [Task](/docs/v2024.12.18/concepts/crds/task/) +- [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) +- [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) +- [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + +To keep things isolated, we are going to use a separate namespace called `demo` throughout this tutorial. Create `demo` namespace if you haven't created it yet. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> Note: YAML files used in this tutorial are stored [here](https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/mariadb/helm/examples). + +## Prepare MariaDB + +In this section, we are going to deploy a MariaDB database. Then, we are going to insert some sample data into it. + +### Deploy MariaDB + +At first, let's deploy a MariaDB database. Here, we are going to use [bitnami/mariadb](https://artifacthub.io/packages/helm/bitnami/mariadb) chart from [ArtifactHub](https://artifacthub.io/). + +Let's deploy a MariaDB database named `sample-mariadb` using Helm as below, + +```bash +# Add bitnami chart registry +$ helm repo add bitnami https://charts.bitnami.com/bitnami +# Update helm registries +$ helm repo update +# Install bitnami/mariadb chart into demo namespace +$ helm install sample-mariadb bitnami/mariadb -n demo +``` + +This chart will create the necessary StatefulSet, Secret, Service etc. for the database. You can easily view all the resources created by chart using [ketall](https://github.com/corneliusweig/ketall) `kubectl` plugin as below, + +```bash +$ kubectl get-all -n demo -l app.kubernetes.io/instance=sample-mariadb +NAME NAMESPACE AGE +configmap/sample-mariadb demo 5m59s +endpoints/sample-mariadb demo 5m59s +persistentvolumeclaim/data-sample-mariadb-0 demo 5m59s +pod/sample-mariadb-0 demo 5m59s +secret/sample-mariadb demo 5m59s +serviceaccount/sample-mariadb demo 5m59s +service/sample-mariadb demo 5m59s +controllerrevision.apps/sample-mariadb-bb8d8865b demo 5m59s +statefulset.apps/sample-mariadb demo 5m59s +``` + +Now, wait for the database pod `sample-mariadb-0` to go into `Running` state, + +```bash +$ kubectl get pod -n demo sample-mariadb-0 +NAME READY STATUS RESTARTS AGE +sample-mariadb-0 1/1 Running 0 11m +``` + +Once the database pod is in `Running` state, verify that the database is ready to accept the connections. + +```bash +$ kubectl logs -n demo sample-mariadb-0 +mariadb 10:44:37.29 +mariadb 10:44:37.29 Welcome to the Bitnami mariadb container +... +2020-12-03 10:44:46 0 [Note] /opt/bitnami/mariadb/sbin/mysqld: ready for connections. +Version: '10.5.8-MariaDB' socket: '/opt/bitnami/mariadb/tmp/mysql.sock' port: 3306 Source distribution +``` + +From the above log, we can see the database is ready to accept connections. + +### Insert Sample Data + +Now, we are going to exec into the database pod and create some sample data. The helm chart has created a secret with access credentials. Let's find out the credentials from the Secret, + +```yaml +$ kubectl get secret -n demo sample-mariadb -o yaml +apiVersion: v1 +data: + mariadb-password: ZlFSdzA1ZXRvbg== + mariadb-root-password: Y1ZrUXA0TXdENQ== +kind: Secret +metadata: + annotations: + meta.helm.sh/release-name: sample-mariadb + meta.helm.sh/release-namespace: demo + creationTimestamp: "2020-12-03T10:43:43Z" + labels: + app.kubernetes.io/instance: sample-mariadb + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: mariadb + helm.sh/chart: mariadb-9.0.1 + .... + name: sample-mariadb + namespace: demo +type: Opaque +``` + +Here, we are going to use the root user credential `mariadb-root-password` to insert the sample data. + +At first, let's export the username and password as environment variables to make further commands re-usable. + +```bash +export USER_NAME=root +export PASSWORD=$(kubectl get secrets -n demo sample-mariadb -o jsonpath='{.data.\mariadb-root-password}' | base64 -d) +``` + +Now, let's exec into the database pod and insert some sample data, + +```bash +$ kubectl exec -it -n demo sample-mariadb-0 -- mariadb --user=$USER_NAME --password=$PASSWORD +... +# Let's create a database named "company" +MariaDB [(none)]> create database company; +Query OK, 1 row affected (0.001 sec) + +# Verify that the database has been created successfully +MariaDB [(none)]> show databases; ++--------------------+ +| Database | ++--------------------+ +| company | +| information_schema | +| my_database | +| mysql | +| performance_schema | +| test | ++--------------------+ +6 rows in set (0.001 sec) + +# Now, let create a table called "employee" in the "company" table +MariaDB [(none)]> create table company.employees ( name varchar(50), salary int); +Query OK, 0 rows affected (0.018 sec) + +# Verify that the table has been created successfully +MariaDB [(none)]> show tables in company; ++-------------------+ +| Tables_in_company | ++-------------------+ +| employees | ++-------------------+ +1 row in set (0.001 sec) + +# Now, let's insert a sample row in the table +MariaDB [(none)]> insert into company.employees values ('John Doe', 5000); +Query OK, 1 row affected (0.003 sec) + +# Insert another sample row +MariaDB [(none)]> insert into company.employees values ('James William', 7000); +Query OK, 1 row affected (0.002 sec) + +# Verify that the rows have been inserted into the table successfully +MariaDB [(none)]> select * from company.employees; ++---------------+--------+ +| name | salary | ++---------------+--------+ +| John Doe | 5000 | +| James William | 7000 | ++---------------+--------+ +2 rows in set (0.001 sec) + +MariaDB [(none)]> exit +Bye +``` + +We have successfully deployed a MariaDB database and inserted some sample data into it. In the subsequent sections, we are going to backup these data using Stash. + +## Prepare for Backup + +In this section, we are going to prepare the necessary resources (i.e. database connection information, backend information, etc.) before backup. + +### Ensure MariaDB Addon + +When you install Stash, it will automatically install all the official database addons. Make sure that MariaDB addon was installed properly using the following command. + +```bash +$ kubectl get tasks.stash.appscode.com | grep mariadb +mariadb-backup-10.5.8 35s +mariadb-backup-10.5.8 35s +``` + +This addon should be able to take backup of the databases with matching major versions as discussed in [Addon Version Compatibility](/docs/v2024.12.18/addons/mariadb/README#addon-version-compatibility). + +### Create AppBinding + +Stash needs to know how to connect with the database. An `AppBinding` exactly provides this information. It holds the Service and Secret information of the database. You have to point to the respective `AppBinding` as a target of backup instead of the database itself. + +Stash expect your database Secret to have `username` and `password` keys. If your database secret does not have them, the `AppBinding` can also help here. You can specify a `secretTransforms` section with the mapping between the current keys and the desired keys. + +Here, is the YAML of the `AppBinding` that we are going to create for the MariaDB database we have deployed earlier. + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: sample-mariadb + namespace: demo +spec: + clientConfig: + service: + name: sample-mariadb + path: / + port: 3306 + scheme: mysql + secret: + name: sample-mariadb + secretTransforms: + - addKey: + key: username + stringValue: root + - renameKey: + from: mariadb-root-password + to: password + type: mariadb + version: 10.5.8 +``` + +Here, + +- **.spec.clientConfig.service** specifies the Service information to use to connects with the database. +- **.spec.secret** specifies the name of the Secret that holds necessary credentials to access the database. +- **.spec.secretTransforms** specifies the transformations required to achieve the desired keys from the current Secret. You can apply the following transformations here: + - **addKey**: If your database Secret does not have an equivalent key expected by Stash, you can add the key using `addKey` transformation. Here, our deployed MariaDB Secret didn't have any key equivalent to `username`. Hence, we are adding the key using `addKey` transformation. + - **renameKey**: If your database Secret does not have a key expected by Stash but it has an equivalent key that is used for the same purpose, you can use `renameKey` transformation to specify the mapping between the keys. For example, our MariaDB Secret didn't have `password` key but it has an equivalent `mariadb-root-password` key that contains password for the root user. Hence, we are telling Stash using `renameKey` transformation that the `mariadb-root-password` should be used as `password` key. + - **addKeysFrom**: You can also merge keys from another Secret using `addKeysFrom` transformation. You have to specify the respective Secret name and namespace as below: + ```yaml + addKeysFrom: + name: + namespace: + ``` +- `spec.type` specifies the type of the database. This is particularly helpful in auto-backup where you want to use different path prefixes for different types of database. + +Let's create the `AppBinding` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/mariadb/helm/examples/appbinding.yaml +appbinding.appcatalog.appscode.com/sample-mariadb created +``` + +>The `secretTransforms` does not modify your original database Secret. Stash just uses those transformations to obtain the desired keys from the original Secret. + +### Prepare Backend + +We are going to store our backed up data into a GCS bucket. So, we need to create a Secret with GCS credentials and a `Repository` object with the bucket information. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +**Create Storage Secret:** + +At first, let's create a secret called `gcs-secret` with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat downloaded-sa-key.json > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create Repository:** + +Now, crete a `Repository` object with the information of your desired bucket. Below is the YAML of `Repository` object we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /demo/mariadb/sample-mariadb + storageSecretName: gcs-secret +``` + +Let's create the `Repository` we have shown above, + +```bash +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mariadb/helm/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our database into our desired backend. + +### Backup + +To schedule a backup, we have to create a `BackupConfiguration` object targeting the respective `AppBinding` of our desired database. Then Stash will create a CronJob to periodically backup the database. + +#### Create BackupConfiguration + +Below is the YAML for `BackupConfiguration` object we care going to use to backup the `sample-mariadb` database we have deployed earlier, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mariadb-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: mariadb-backup-10.5.8 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +Here, + +- `.spec.schedule` specifies that we want to backup the database at 5 minutes intervals. +- `.spec.task.name` specifies the name of the Task object that specifies the necessary Functions and their execution order to backup a MariaDB database. +- `.spec.target.ref` refers to the AppBinding object that holds the connection information of our targeted database. + +Let's create the `BackupConfiguration` object we have shown above, + +```bash +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mariadb/helm/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/sample-mariadb-backup created +``` + +### Verify Backup Setup Successful + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. Let's verify the `Phase` of the BackupConfiguration, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-mariadb-backup mariadb-backup-10.5.8 */5 * * * * Ready 11s +``` + +#### Verify CronJob + +Stash will create a CronJob with the schedule specified in `spec.schedule` field of `BackupConfiguration` object. + +Verify that the CronJob has been created using the following command, + +```bash +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-mariadb-backup */5 * * * * False 0 15s 17s +``` + +#### Wait for BackupSession + +The `sample-mariadb-backup` CronJob will trigger a backup on each scheduled slot by creating a `BackupSession` object. + +Now, wait for a schedule to appear. Run the following command to watch for a `BackupSession` object, + +```bash +$ kubectl get backupsession -n demo -w +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +sample-mariadb-backup-1606994706 BackupConfiguration sample-mariadb-backup Running 24s +sample-mariadb-backup-1606994706 BackupConfiguration sample-mariadb-backup Running 75s +sample-mariadb-backup-1606994706 BackupConfiguration sample-mariadb-backup Succeeded 103s +``` + +Here, the phase `Succeeded` means that the backup process has been completed successfully. + +#### Verify Backup + +Now, we are going to verify whether the backed up data is present in the backend or not. Once a backup is completed, Stash will update the respective `Repository` object to reflect the backup completion. Check that the repository `gcs-repo` has been updated by the following command, + +```bash +$ kubectl get repository -n demo gcs-repo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo true 1.327 MiB 1 60s 8m +``` + +Now, if we navigate to the GCS bucket, we will see the backed up data has been stored in `demo/mariadb/sample-mariadb` directory as specified by `.spec.backend.gcs.prefix` field of the `Repository` object. + +
+ Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +> Note: Stash keeps all the backed up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Restore MariaDB + +If you have followed the previous sections properly, you should have a successful logical backup of your MariaDB database. Now, we are going to show how you can restore the database from the backed up data. + +### Restore Into the Same Database + +You can restore your data into the same database you have backed up from or into a different database in the same cluster or a different cluster. In this section, we are going to show you how to restore in the same database which may be necessary when you have accidentally deleted any data from the running database. + +#### Temporarily Pause Backup + +At first, let's stop taking any further backup of the database so that no backup runs after we delete the sample data. We are going to pause the `BackupConfiguration` object. Stash will stop taking any further backup when the `BackupConfiguration` is paused. + +Let's pause the `sample-mariadb-backup` BackupConfiguration, + +```bash +$ kubectl patch backupconfiguration -n demo sample-mariadb-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/sample-mariadb-backup patched +``` + +Verify that the `BackupConfiguration` has been paused, + +```bash +$ kubectl get backupconfiguration -n demo sample-mariadb-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-mariadb-backup mariadb-backup-10.5.8 */5 * * * * true Ready 26m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the `BackupConfiguration` has been paused. + +Stash will also suspend the respective CronJob. + +```bash +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-mariadb-backup */5 * * * * True 0 2m59s 20m +``` + +#### Simulate Disaster + +Now, let's simulate an accidental deletion scenario. Here, we are going to exec into the database pod and delete the `company` database we had created earlier. + +```bash +$ kubectl exec -it -n demo sample-mariadb-0 -- mariadb --user=$USER_NAME --password=$PASSWORD + +# View current databases +MariaDB [(none)]> show databases; ++--------------------+ +| Database | ++--------------------+ +| company | +| information_schema | +| my_database | +| mysql | +| performance_schema | +| test | ++--------------------+ +6 rows in set (0.001 sec) + +# Let's delete the "company" database +MariaDB [(none)]> drop database company; +Query OK, 1 row affected (0.268 sec) + +# Verify that the "company" database has been deleted +MariaDB [(none)]> show databases; ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| my_database | +| mysql | +| performance_schema | +| test | ++--------------------+ +5 rows in set (0.001 sec) + +MariaDB [(none)]> exit +Bye +``` + +#### Create RestoreSession + +To restore the database, you have to create a `RestoreSession` object pointing to the `AppBinding` of the targeted database. + +Here, is the YAML of the `RestoreSession` object that we are going to use for restoring our `sample-mariadb` database. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mariadb-restore + namespace: demo +spec: + task: + name: mariadb-backup-10.5.8 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + rules: + - snapshots: [latest] +``` + +Here, + +- `.spec.task.name` specifies the name of the Task object that specifies the necessary Functions and their execution order to restore a MariaDB database. +- `.spec.repository.name` specifies the Repository object that holds the backend information where our backed up data has been stored. +- `.spec.target.ref` refers to the respective AppBinding of the `sample-mariadb` database. +- `.spec.rules` specifies that we are restoring data from the latest backup snapshot of the database. + +Let's create the `RestoreSession` object object we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mariadb/helm/examples/restoresession.yaml +restoresession.stash.appscode.com/sample-mariadb-restore created +``` + +Once, you have created the `RestoreSession` object, Stash will create a restore Job. Run the following command to watch the phase of the `RestoreSession` object, + +```bash +$ kubectl get restoresession -n demo -w +NAME REPOSITORY PHASE AGE +sample-mariadb-restore gcs-repo Running 15s +sample-mariadb-restore gcs-repo Succeeded 18s +``` + +The `Succeeded` phase means that the restore process has been completed successfully. + +#### Verify Restored Data + +Now, let's exec into the database pod and verify whether data actual data was restored or not, + +```bash +$ kubectl exec -it -n demo sample-mariadb-0 -- mariadb --user=$USER_NAME --password=$PASSWORD + +# Verify that the "company" database has been restored +MariaDB [(none)]> show databases; ++--------------------+ +| Database | ++--------------------+ +| company | +| information_schema | +| my_database | +| mysql | +| performance_schema | +| test | ++--------------------+ +6 rows in set (0.000 sec) + +# Verify that the tables of the "company" database have been restored +MariaDB [(none)]> show tables from company; ++-------------------+ +| Tables_in_company | ++-------------------+ +| employees | ++-------------------+ +1 row in set (0.000 sec) + +# Verify that the sample data of the "employees" table has been restored +MariaDB [(none)]> select * from company.employees; ++---------------+--------+ +| name | salary | ++---------------+--------+ +| John Doe | 5000 | +| James William | 7000 | ++---------------+--------+ +2 rows in set (0.000 sec) + +MariaDB [(none)]> exit +Bye +``` + +Hence, we can see from the above output that the deleted data has been restored successfully from the backup. + +#### Resume Backup + +Since our data has been restored successfully we can now resume our usual backup process. Resume the `BackupConfiguration` using following command, + +```bash +$ kubectl patch backupconfiguration -n demo sample-mariadb-backup --type="merge" --patch='{"spec": {"paused": false}}' +backupconfiguration.stash.appscode.com/sample-mariadb-backup patched +``` + +Verify that the `BackupConfiguration` has been resumed, +```bash +$ kubectl get backupconfiguration -n demo sample-mariadb-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-mariadb-backup mariadb-backup-10.5.8 */5 * * * * false Ready 29m +``` + +Here, `false` in the `PAUSED` column means the backup has been resume successfully. The CronJob also should be resumed now. + +```bash +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-mariadb-backup */5 * * * * False 0 2m59s 29m +``` + +Here, `False` in the `SUSPEND` column means the CronJob is no longer suspended and will trigger in the next schedule. + +### Restore Into Different Database of the Same Namespace + +If you want to restore the backed up data into a different database of the same namespace, you have to create another `AppBinding` pointing to the desired database. Then, you have to create the `RestoreSession` pointing to the new `AppBinding`. + +### Restore Into Different Namespace + +If you want to restore into a different namespace of the same cluster, you have to create the Repository, backend Secret, AppBinding, in the desired namespace. You can use [Stash kubectl plugin](https://stash.run/docs/{{< param "info.version" >}}/guides/cli/cli/) to easily copy the resources into a new namespace. Then, you have to create the `RestoreSession` object in the desired namespace pointing to the Repository, AppBinding of that namespace. + +### Restore Into Different Cluster + +If you want to restore into a different cluster, you have to install Stash in the desired cluster. Then, you have to install Stash MariaDB addon in that cluster too. Then, you have to create the Repository, backend Secret, AppBinding, in the desired cluster. Finally, you have to create the `RestoreSession` object in the desired cluster pointing to the Repository, AppBinding of that cluster. + +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo backupconfiguration sample-mariadb-backup +kubectl delete -n demo restoresession sample-mariadb-restore +kubectl delete -n demo repository gcs-repo +# delete the database chart +helm delete sample-mariadb -n demo +``` diff --git a/content/docs/v2024.12.18/addons/mariadb/overview/images/mariadb-logical-backup.svg b/content/docs/v2024.12.18/addons/mariadb/overview/images/mariadb-logical-backup.svg new file mode 100644 index 0000000000..04faf0ae92 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mariadb/overview/images/mariadb-logical-backup.svg @@ -0,0 +1,987 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/addons/mariadb/overview/images/mariadb-logical-restore.svg b/content/docs/v2024.12.18/addons/mariadb/overview/images/mariadb-logical-restore.svg new file mode 100644 index 0000000000..c930c8641b --- /dev/null +++ b/content/docs/v2024.12.18/addons/mariadb/overview/images/mariadb-logical-restore.svg @@ -0,0 +1,857 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/addons/mariadb/overview/index.md b/content/docs/v2024.12.18/addons/mariadb/overview/index.md new file mode 100644 index 0000000000..b83d55e1ad --- /dev/null +++ b/content/docs/v2024.12.18/addons/mariadb/overview/index.md @@ -0,0 +1,151 @@ +--- +title: MariaDB Backup & Restore Overview | Stash +description: How MariaDB Backup & Restore Works in Stash +menu: + docs_v2024.12.18: + identifier: stash-mariadb-overview + name: How does it work? + parent: stash-mariadb + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# How Stash Backups & Restores MariaDB Database + +Stash 0.9.0+ supports backup and restore operation of many databases. This guide will give you an overview of how MariaDB database backup and restore process works in Stash. + +## Logical Backup + +Stash supports taking [logical backup](https://mariadb.com/kb/en/backup-and-restore-overview/#logical-vs-physical-backups) of MariaDB databases using [mysqldump](https://mariadb.com/kb/en/mysqldump/). It is the most flexible way to perform a backup and restore, and a good choice when the data size is relatively small. + +### How Logical Backup Works + +The following diagram shows how Stash takes logical backup of a MariaDB database. Open the image in a new tab to see the enlarged version. + +
+  MariaDB Backup Overview +
Fig: MariaDB Logical Backup Overview
+
+ +The backup process consists of the following steps: + +1. At first, a user creates a secret with access credentials of the backend where the backed up data will be stored. + +2. Then, she creates a `Repository` crd that specifies the backend information along with the secret that holds the credentials to access the backend. + +3. Then, she creates a `BackupConfiguration` crd targeting the [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) crd of the desired database. The `BackupConfiguration` object also specifies the `Task` to use to backup the database. + +4. Stash operator watches for `BackupConfiguration` crd. + +5. Once Stash operator finds a `BackupConfiguration` crd, it creates a CronJob with the schedule specified in `BackupConfiguration` object to trigger backup periodically. + +6. On the next scheduled slot, the CronJob triggers a backup by creating a `BackupSession` crd. + +7. Stash operator also watches for `BackupSession` crd. + +8. When it finds a `BackupSession` object, it resolves the respective `Task` and `Function` and prepares a Job definition to backup. + +9. Then, it creates the Job to backup the targeted database. + +10. The backup Job reads necessary information to connect with the database from the `AppBinding` crd. It also reads backend information and access credentials from `Repository` crd and Storage Secret respectively. + +11. Then, the Job dumps the targeted database and uploads the output to the backend. Stash pipes the output of dump command to uploading process. Hence, backup Job does not require a large volume to hold the entire dump output. + +12. Finally, when the backup is complete, the Job sends Prometheus metrics to the Pushgateway running inside Stash operator pod. It also updates the `BackupSession` and `Repository` status to reflect the backup procedure. + +### How Restore from Logical Backup Works + +The following diagram shows how Stash restores a MariaDB database from a logical backup. Open the image in a new tab to see the enlarged version. + +
+  Database Restore Overview +
Fig: MariaDB Logical Restore Process Overview
+
+ +The restore process consists of the following steps: + +1. At first, a user creates a `RestoreSession` crd targeting the `AppBinding` of the desired database where the backed up data will be restored. It also specifies the `Repository` crd which holds the backend information and the `Task` to use to restore the target. + +2. Stash operator watches for `RestoreSession` object. + +3. Once it finds a `RestoreSession` object, it resolves the respective `Task` and `Function` and prepares a Job definition to restore. + +4. Then, it creates the Job to restore the target. + +5. The Job reads necessary information to connect with the database from respective `AppBinding` crd. It also reads backend information and access credentials from `Repository` crd and Storage Secret respectively. + +6. Then, the job downloads the backed up data from the backend and injects into the desired database. Stash pipes the downloaded data to the respective database tool to inject into the database. Hence, restore job does not require a large volume to download entire backup data inside it. + +7. Finally, when the restore process is complete, the Job sends Prometheus metrics to the Pushgateway and update the `RestoreSession` status to reflect restore completion. + +## Next Steps + +- Backup your MariaDB database using Stash following the guide from [here](/docs/v2024.12.18/addons/mariadb/helm/). diff --git a/content/docs/v2024.12.18/addons/mongodb/README.md b/content/docs/v2024.12.18/addons/mongodb/README.md new file mode 100644 index 0000000000..4b9ed33a61 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/README.md @@ -0,0 +1,109 @@ +--- +title: MongoDB Addon Overview | Stash +description: MongoDB Addon Overview | Stash +menu: + docs_v2024.12.18: + identifier: stash-mongodb-readme + name: Readme + parent: stash-mongodb + weight: -1 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +url: /docs/v2024.12.18/addons/mongodb/ +aliases: +- /docs/v2024.12.18/addons/mongodb/README/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash MongoDB Addon + +Stash 0.9.0+ supports extending its functionality through addons. Stash MongoDB addon enables Stash to backup and restore MongoDB databases. + +This guide will give you an overview of which MongoDB versions are supported and how the docs are organized. + +## Supported MongoDB Versions + +Stash has the following addon versions for MongoDB: + +{{< versionlist "mongodb">}} + +Here, the addon follows `M.M.P` versioning scheme where `M.M.P` (Major.Minor.Patch) represents the respective database version. + +## Addon Version Compatibility + +Any addon with matching major version with the database version should be able to take backup of that database. For example, MongoDB addon with version `4.x.x` should be able take backup of any MongoDB of `4.x.x` series. However, this might not be true for some versions. In that case, we will have separate addon for that version. + +## Documentation Overview + +Stash MongoDB documentations are organized as below: + +- [How does it work?](/docs/v2024.12.18/addons/mongodb/overview/) gives an overview of how backup and restore process for MongoDB database works in Stash. +- [Standalone MongoDB](/docs/v2024.12.18/addons/mongodb/standalone/) shows how to backup and restore a standalone MongoDB database. +- [MongoDB ReplicaSet](/docs/v2024.12.18/addons/mongodb/replicaset/) shows how to backup & restore a MongoDB ReplicaSet. +- [Sharded MongoDB Cluster](/docs/v2024.12.18/addons/mongodb/sharding/) shows how to backup & restore a sharded MongoDB cluster. diff --git a/content/docs/v2024.12.18/addons/mongodb/_index.md b/content/docs/v2024.12.18/addons/mongodb/_index.md new file mode 100644 index 0000000000..862fc5b51a --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/_index.md @@ -0,0 +1,77 @@ +--- +title: Stash MongoDB Addon +menu: + docs_v2024.12.18: + identifier: stash-mongodb + name: MongoDB + parent: stash-addons + weight: 40 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/addons/mongodb/overview/images/backup_overview.svg b/content/docs/v2024.12.18/addons/mongodb/overview/images/backup_overview.svg new file mode 100644 index 0000000000..1c9ec7308d --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/overview/images/backup_overview.svg @@ -0,0 +1,997 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/addons/mongodb/overview/images/replicaset_backup.svg b/content/docs/v2024.12.18/addons/mongodb/overview/images/replicaset_backup.svg new file mode 100644 index 0000000000..206eb76648 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/overview/images/replicaset_backup.svg @@ -0,0 +1,673 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/addons/mongodb/overview/images/replicaset_restore.svg b/content/docs/v2024.12.18/addons/mongodb/overview/images/replicaset_restore.svg new file mode 100644 index 0000000000..ad6cd40659 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/overview/images/replicaset_restore.svg @@ -0,0 +1,673 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/addons/mongodb/overview/images/restore_overview.svg b/content/docs/v2024.12.18/addons/mongodb/overview/images/restore_overview.svg new file mode 100644 index 0000000000..09dff9b37c --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/overview/images/restore_overview.svg @@ -0,0 +1,867 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/addons/mongodb/overview/images/sharded_backup.svg b/content/docs/v2024.12.18/addons/mongodb/overview/images/sharded_backup.svg new file mode 100644 index 0000000000..5f3b4c5436 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/overview/images/sharded_backup.svg @@ -0,0 +1,2107 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/addons/mongodb/overview/images/sharded_restore.svg b/content/docs/v2024.12.18/addons/mongodb/overview/images/sharded_restore.svg new file mode 100644 index 0000000000..03884e256f --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/overview/images/sharded_restore.svg @@ -0,0 +1,2107 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/addons/mongodb/overview/images/standalone_backup.svg b/content/docs/v2024.12.18/addons/mongodb/overview/images/standalone_backup.svg new file mode 100644 index 0000000000..080787412d --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/overview/images/standalone_backup.svg @@ -0,0 +1,673 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/addons/mongodb/overview/images/standalone_restore.svg b/content/docs/v2024.12.18/addons/mongodb/overview/images/standalone_restore.svg new file mode 100644 index 0000000000..3306a4d28c --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/overview/images/standalone_restore.svg @@ -0,0 +1,673 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/addons/mongodb/overview/index.md b/content/docs/v2024.12.18/addons/mongodb/overview/index.md new file mode 100644 index 0000000000..c5c64e1634 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/overview/index.md @@ -0,0 +1,225 @@ +--- +title: MongoDB Backup Overview | Stash +description: How MongoDB Backup Works in Stash +menu: + docs_v2024.12.18: + identifier: stash-mongodb-overview + name: How does it work? + parent: stash-mongodb + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# How Stash Backup & Restore MongoDB Database + +Stash 0.9.0+ supports backup and restore operation of many databases. This guide will give you an overview of how MongoDB database backup and restore process works in Stash. + +## How Backup Works + +The following diagram shows how Stash takes backup of a MongoDB database. Open the image in a new tab to see the enlarged version. + +
+ MongoDB Backup Overview +
Fig: MongoDB Backup Overview
+
+ +The backup process consists of the following steps: + +1. At first, a user creates a secret with access credentials of the backend where the backed up data will be stored. + +2. Then, she creates a `Repository` crd that specifies the backend information along with the secret that holds the credentials to access the backend. + +3. Then, she creates a `BackupConfiguration` crd targeting the [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) crd of the desired database. The `BackupConfiguration` object also specifies the `Task` to use to backup the database. + +4. Stash operator watches for `BackupConfiguration` crd. + +5. Once Stash operator finds a `BackupConfiguration` crd, it creates a CronJob with the schedule specified in `BackupConfiguration` object to trigger backup periodically. + +6. On the next scheduled slot, the CronJob triggers a backup by creating a `BackupSession` crd. + +7. Stash operator also watches for `BackupSession` crd. + +8. When it finds a `BackupSession` object, it resolves the respective `Task` and `Function` and prepares a Job definition to backup. + +9. Then, it creates the Job to backup the targeted database. + +10. The backup Job reads necessary information to connect with the database from the `AppBinding` crd. It also reads backend information and access credentials from `Repository` crd and Storage Secret respectively. + +11. Then, the Job dumps the targeted database and uploads the output to the backend. Stash pipes the output of dump command to uploading process. Hence, backup Job does not require a large volume to hold the entire dump output. + +12. Finally, when the backup is complete, the Job sends Prometheus metrics to the Pushgateway running inside Stash operator pod. It also updates the `BackupSession` and `Repository` status to reflect the backup procedure. + +### Backup Different MongoDB Configurations + +This section will show you how backup works for different MongoDB configurations. + +#### Standalone MongoDB + +For a standalone MongoDB database, the backup job directly dumps the database using `mongodump` and pipe the output to the backup process. + +
+ Standalone MongoDB Backup Overview +
Fig: Standalone MongoDB Backup
+
+ +#### MongoDB ReplicaSet Cluster + +For MongoDB ReplicaSet cluster, Stash takes backup from one of the secondary replicas. The backup process consists of the following steps: + +1. Identify a secondary replica. +2. Lock the secondary replica. +3. Backup the secondary replica. +4. Unlock the secondary replica. + +
+ MongoDB ReplicaSet Cluster Backup Overview +
Fig: MongoDB ReplicaSet Cluster Backup
+
+ +#### MongoDB Sharded Cluster + +For MongoDB sharded cluster, Stash takes backup of the individual shards as well as the config server. Stash takes backup from a secondary replica of the shards and the config server. If there is no secondary replica then Stash will take backup from the primary replica. The backup process consists of the following steps: + +1. Disable balancer. +2. Lock config server. +3. Identify a secondary replica for each shard. +4. Lock the secondary replica. +5. Run backup on the secondary replica. +6. Unlock the secondary replica. +7. Unlock config server. +8. Enable balancer. + +
+ MongoDB Sharded Cluster Backup Overview +
Fig: MongoDB Sharded Cluster Backup
+
+ +## How Restore Process Works + +The following diagram shows how Stash restores backed up data into a MongoDB database. Open the image in a new tab to see the enlarged version. + +
+ Database Restore Overview +
Fig: MongoDB Restore Process Overview
+
+ +The restore process consists of the following steps: + +1. At first, a user creates a `RestoreSession` crd targeting the `AppBinding` of the desired database where the backed up data will be restored. It also specifies the `Repository` crd which holds the backend information and the `Task` to use to restore the target. + +2. Stash operator watches for `RestoreSession` object. + +3. Once it finds a `RestoreSession` object, it resolves the respective `Task` and `Function` and prepares a Job definition to restore. + +4. Then, it creates the Job to restore the target. + +5. The Job reads necessary information to connect with the database from respective `AppBinding` crd. It also reads backend information and access credentials from `Repository` crd and Storage Secret respectively. + +6. Then, the job downloads the backed up data from the backend and injects into the desired database. Stash pipes the downloaded data to the respective database tool to inject into the database. Hence, restore job does not require a large volume to download entire backup data inside it. + +7. Finally, when the restore process is complete, the Job sends Prometheus metrics to the Pushgateway and update the `RestoreSession` status to reflect restore completion. + +### Restoring Different MongoDB Configurations + +This section will show you restore process works for different MongoDB configurations. + +#### Standalone MongoDB + +For a standalone MongoDB database, the restore job downloads the backed up data from the backend and pipe the downloaded data to `mongorestore` command which inserts the data into the desired MongoDB database. + +
+ Standalone MongoDB Restore Overview +
Fig: Standalone MongoDB Restore
+
+ +#### MongoDB ReplicaSet Cluster + +For MongoDB ReplicaSet cluster, Stash identifies the primary replica and restore into it. + +
+ MongoDB ReplicaSet Cluster Restore Overview +
Fig: MongoDB ReplicaSet Cluster Restore
+
+ +#### MongoDB Sharded Cluster + +For MongoDB sharded cluster, Stash identifies the primary replica of each shard as well as the config server and restore respective backed up data into them. + +
+ MongoDB Sharded Cluster Restore +
Fig: MongoDB Sharded Cluster Restore
+
+ +## Next Steps + +- Backup your standalone MongoDB database using Stash following the guide from [here](/docs/v2024.12.18/addons/mongodb/standalone/). +- Backup your MongoDB Replicaset using Stash following the guide from [here](/docs/v2024.12.18/addons/mongodb/replicaset/). +- Backup your sharded MongoDB cluster using Stash following the guide from [here](/docs/v2024.12.18/addons/mongodb/sharding/). diff --git a/content/docs/v2024.12.18/addons/mongodb/replicaset/examples/backupconfiguration-replicaset.yaml b/content/docs/v2024.12.18/addons/mongodb/replicaset/examples/backupconfiguration-replicaset.yaml new file mode 100644 index 0000000000..e9be3b3a1c --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/replicaset/examples/backupconfiguration-replicaset.yaml @@ -0,0 +1,20 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mgo-rs-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: mongodb-backup-4.2.3 + repository: + name: gcs-repo-replicaset + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mgo-rs + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/mongodb/replicaset/examples/mongodb-replicaset.yaml b/content/docs/v2024.12.18/addons/mongodb/replicaset/examples/mongodb-replicaset.yaml new file mode 100644 index 0000000000..b6cad02ed7 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/replicaset/examples/mongodb-replicaset.yaml @@ -0,0 +1,18 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MongoDB +metadata: + name: sample-mgo-rs + namespace: demo +spec: + version: "4.2.3" + replicas: 3 + replicaSet: + name: rs0 + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: WipeOut diff --git a/content/docs/v2024.12.18/addons/mongodb/replicaset/examples/repository-replicaset.yaml b/content/docs/v2024.12.18/addons/mongodb/replicaset/examples/repository-replicaset.yaml new file mode 100644 index 0000000000..02c7d4b469 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/replicaset/examples/repository-replicaset.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo-replicaset + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: demo/mongodb/sample-mgo-rs + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/addons/mongodb/replicaset/examples/restored-mongodb-replicaset.yaml b/content/docs/v2024.12.18/addons/mongodb/replicaset/examples/restored-mongodb-replicaset.yaml new file mode 100644 index 0000000000..724871121c --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/replicaset/examples/restored-mongodb-replicaset.yaml @@ -0,0 +1,20 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MongoDB +metadata: + name: restored-mgo-rs + namespace: demo +spec: + version: "4.2.3" + replicas: 3 + replicaSet: + name: rs0 + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: WipeOut + init: + waitForInitialRestore: true diff --git a/content/docs/v2024.12.18/addons/mongodb/replicaset/examples/restored-standalone.yaml b/content/docs/v2024.12.18/addons/mongodb/replicaset/examples/restored-standalone.yaml new file mode 100644 index 0000000000..ba49736fd5 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/replicaset/examples/restored-standalone.yaml @@ -0,0 +1,18 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MongoDB +metadata: + name: restored-mongodb + namespace: demo +spec: + version: "4.2.3" + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + init: + waitForInitialRestore: true + terminationPolicy: WipeOut diff --git a/content/docs/v2024.12.18/addons/mongodb/replicaset/examples/restoresession-replicaset.yaml b/content/docs/v2024.12.18/addons/mongodb/replicaset/examples/restoresession-replicaset.yaml new file mode 100644 index 0000000000..3ec9f81f0a --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/replicaset/examples/restoresession-replicaset.yaml @@ -0,0 +1,17 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mgo-rs-restore + namespace: demo +spec: + task: + name: mongodb-restore-4.2.3 + repository: + name: gcs-repo-replicaset + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: restored-mgo-rs + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/addons/mongodb/replicaset/examples/restoresession-standalone.yaml b/content/docs/v2024.12.18/addons/mongodb/replicaset/examples/restoresession-standalone.yaml new file mode 100644 index 0000000000..f64157d2d4 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/replicaset/examples/restoresession-standalone.yaml @@ -0,0 +1,17 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mongodb-restore + namespace: demo +spec: + task: + name: mongodb-restore-4.2.3 + repository: + name: gcs-repo-custom + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: restored-mongodb + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/addons/mongodb/replicaset/examples/standalone-backup.yaml b/content/docs/v2024.12.18/addons/mongodb/replicaset/examples/standalone-backup.yaml new file mode 100644 index 0000000000..1fed8f4eb0 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/replicaset/examples/standalone-backup.yaml @@ -0,0 +1,47 @@ +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: sample-mgo-rs-custom + namespace: demo +spec: + clientConfig: + service: + name: sample-mgo-rs + port: 27017 + scheme: mongodb + secret: + name: sample-mgo-rs-auth + type: kubedb.com/mongodb +--- +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo-custom + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: demo/mongodb/sample-mgo-rs/standalone + storageSecretName: gcs-secret +--- +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mgo-rs-backup2 + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: mongodb-backup-4.2.3 + repository: + name: gcs-repo-custom + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mgo-rs-custom + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/mongodb/replicaset/index.md b/content/docs/v2024.12.18/addons/mongodb/replicaset/index.md new file mode 100644 index 0000000000..7a34f2c325 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/replicaset/index.md @@ -0,0 +1,827 @@ +--- +title: Backup & Restore MongoDB ReplicaSet Cluster | Stash +description: Backup and restore MongoDB ReplicaSet cluster using Stash +menu: + docs_v2024.12.18: + identifier: stash-mongodb-replicaset + name: MongoDB ReplicaSet Cluster + parent: stash-mongodb + weight: 30 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup and Restore MongoDB ReplicaSet Clusters using Stash + +Stash supports taking [backup and restores MongoDB ReplicaSet clusters in "idiomatic" way](https://docs.mongodb.com/manual/tutorial/restore-replica-set-from-backup/). This guide will show you how you can backup and restore your MongoDB ReplicaSet clusters with Stash. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using Minikube. +- Install Stash in your cluster following the steps [here](/docs/v2024.12.18/setup/install/stash/). +- Install [KubeDB](https://kubedb.com) in your cluster following the steps [here](https://kubedb.com/docs/latest/setup/). This step is optional. You can deploy your database using any method you want. We are using KubeDB because KubeDB simplifies many of the difficult or tedious management tasks of running a production grade databases on private and public clouds. +- If you are not familiar with how Stash backup and restore MongoDB databases, please check the following guide [here](/docs/v2024.12.18/addons/mongodb/overview/). + +You have to be familiar with following custom resources: + +- [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) +- [Function](/docs/v2024.12.18/concepts/crds/function/) +- [Task](/docs/v2024.12.18/concepts/crds/task/) +- [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) +- [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + +To keep things isolated, we are going to use a separate namespace called `demo` throughout this tutorial. Create `demo` namespace if you haven't created yet. + +```console +$ kubectl create ns demo +namespace/demo created +``` + +> Note: YAML files used in this tutorial are stored [here](https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/mongodb/replicaset/examples). + +## Backup MongoDB ReplicaSet using Stash + +This section will demonstrate how to backup MongoDB ReplicaSet cluster. Here, we are going to deploy a MongoDB ReplicaSet using KubeDB. Then, we are going to backup this database into a GCS bucket. Finally, we are going to restore the backed up data into another MongoDB ReplicaSet. + +### Deploy Sample MongoDB ReplicaSet + +Let's deploy a sample MongoDB ReplicaSet database and insert some data into it. + +**Create MongoDB CRD:** + +Below is the YAML of a sample MongoDB crd that we are going to create for this tutorial: + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MongoDB +metadata: + name: sample-mgo-rs + namespace: demo +spec: + version: "4.2.3" + replicas: 3 + replicaSet: + name: rs0 + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: WipeOut +``` + +Create the above `MongoDB` crd, + +```console +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mongodb/replicaset/examples/mongodb-replicaset.yaml +mongodb.kubedb.com/sample-mgo-rs created +``` + +KubeDB will deploy a MongoDB database according to the above specification. It will also create the necessary secrets and services to access the database. + +Let's check if the database is ready to use, + +```console +$ kubectl get mg -n demo sample-mgo-rs +NAME VERSION STATUS AGE +sample-mgo-rs 4.2.3 Ready 1m +``` + +The database is `Ready`. Verify that KubeDB has created a Secret and a Service for this database using the following commands, + +```console +$ kubectl get secret -n demo -l=app.kubernetes.io/instance=sample-mgo-rs +NAME TYPE DATA AGE +sample-mgo-rs-auth Opaque 2 117s +sample-mgo-rs-cert Opaque 4 116s + +$ kubectl get service -n demo -l=app.kubernetes.io/instance=sample-mgo-rs +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +sample-mgo-rs ClusterIP 10.107.13.16 27017/TCP 2m14s +sample-mgo-rs-gvr ClusterIP None 27017/TCP 2m14s +``` + +KubeDB creates an [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) crd that holds the necessary information to connect with the database. + +**Verify AppBinding:** + +Verify that the `AppBinding` has been created successfully using the following command, + +```console +$ kubectl get appbindings -n demo +NAME AGE +sample-mgo-rs 58s +``` + +Let's check the YAML of the above `AppBinding`, + +```console +$ kubectl get appbindings -n demo sample-mgo-rs -o yaml +``` + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + labels: + app.kubernetes.io/component: database + app.kubernetes.io/instance: sample-mgo-rs + app.kubernetes.io/managed-by: kubedb.com + app.kubernetes.io/name: mongodbs.kubedb.com + app.kubernetes.io/instance: sample-mgo-rs + name: sample-mgo-rs + namespace: demo +spec: + clientConfig: + service: + name: sample-mgo-rs + port: 27017 + scheme: mongodb + parameters: + apiVersion: config.kubedb.com/v1alpha1 + kind: MongoConfiguration + replicaSets: + host-0: rs0/sample-mgo-rs-0.sample-mgo-rs-gvr.demo.svc,sample-mgo-rs-1.sample-mgo-rs-gvr.demo.svc,sample-mgo-rs-2.sample-mgo-rs-gvr.demo.svc + secret: + name: sample-mgo-rs-auth + type: kubedb.com/mongodb + version: "4.2.3" +``` + +Stash uses the `AppBinding` crd to connect with the target database. It requires the following two fields to set in AppBinding's `Spec` section. + +- `spec.clientConfig.service.name` specifies the name of the service that connects to the database. +- `spec.secret` specifies the name of the secret that holds necessary credentials to access the database. +- `spec.parameters.replicaSets` contains the dsn of replicaset. The DSNs are in key-value pair. If there is only one replicaset (replicaset can be multiple, because of sharding), then ReplicaSets field contains only one key-value pair where the key is host-0 and the value is dsn of that replicaset. +- `spec.type` specifies the types of the app that this AppBinding is pointing to. KubeDB generated AppBinding follows the following format: `/`. + +**Creating AppBinding Manually:** + +If you deploy MongoDB database without KubeDB, you have to create the AppBinding crd manually in the same namespace as the service and secret of the database. + +**Insert Sample Data:** + +Now, we are going to exec into the database pod and create some sample data. At first, find out the database pod using the following command, + +```console +$ kubectl get pods -n demo --selector="app.kubernetes.io/instance=sample-mgo-rs" +NAME READY STATUS RESTARTS AGE +sample-mgo-rs-0 1/1 Running 0 16m +sample-mgo-rs-1 1/1 Running 0 15m +sample-mgo-rs-2 1/1 Running 0 15m +``` + +Now, let's exec into the pod and create a table, + +```console +$ kubectl get secrets -n demo sample-mgo-rs-auth -o jsonpath='{.data.\username}' | base64 -d +root + +$ kubectl get secrets -n demo sample-mgo-rs-auth -o jsonpath='{.data.\password}' | base64 -d +CRz6EuxvKdFjopfP + +$ kubectl exec -it -n demo sample-mgo-rs-0 bash + +mongodb@sample-mgo-rs-0:/$ mongo admin -u root -p CRz6EuxvKdFjopfP + +rs0:PRIMARY> rs.isMaster().primary +sample-mgo-rs-0.sample-mgo-rs-gvr.demo.svc.cluster.local:27017 + +rs0:PRIMARY> show dbs +admin 0.000GB +config 0.000GB +local 0.000GB + +rs0:PRIMARY> show users +{ + "_id" : "admin.root", + "userId" : UUID("0e9345cc-27ea-4175-acc4-295c987ac06b"), + "user" : "root", + "db" : "admin", + "roles" : [ + { + "role" : "root", + "db" : "admin" + } + ] +} + +rs0:PRIMARY> use newdb +switched to db newdb + +rs0:PRIMARY> db.movie.insert({"name":"batman"}); +WriteResult({ "nInserted" : 1 }) + +rs0:PRIMARY> db.movie.find().pretty() +{ "_id" : ObjectId("5d31b9d44db670db130d7a5c"), "name" : "batman" } + +rs0:PRIMARY> exit +bye +``` + +Now, we are ready to backup this sample database. + +### Prepare Backend + +We are going to store our backed up data into a GCS bucket. At first, we need to create a secret with GCS credentials then we need to create a `Repository` crd. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +**Create Storage Secret:** + +Let's create a secret called `gcs-secret` with access credentials to our desired GCS bucket, + +```console +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat downloaded-sa-key.json > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create Repository:** + +Now, crete a `Repository` using this secret. Below is the YAML of Repository crd we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo-replicaset + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: demo/mongodb/sample-mgo-rs + storageSecretName: gcs-secret +``` + +Let's create the `Repository` we have shown above, + +```console +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mongodb/replicaset/examples/repository-replicaset.yaml +repository.stash.appscode.com/gcs-repo-replicaset created +``` + +Now, we are ready to backup our database to our desired backend. + +### Backup MongoDB ReplicaSet + +We have to create a `BackupConfiguration` targeting respective AppBinding crd of our desired database. Then Stash will create a CronJob to periodically backup the database. + +**Create BackupConfiguration:** + +Below is the YAML for `BackupConfiguration` crd to backup the `sample-mgo-rs` database we have deployed earlier., + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mgo-rs-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: mongodb-backup-4.2.3 + repository: + name: gcs-repo-replicaset + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mgo-rs + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +Here, + +- `spec.schedule` specifies that we want to backup the database at 5 minutes interval. +- `spec.task.name` specifies the name of the task crd that specifies the necessary Function and their execution order to backup a MongoDB database. +- `spec.target.ref` refers to the `AppBinding` crd that was created for `sample-mgo-rs` database. + +Let's create the `BackupConfiguration` crd we have shown above, + +```console +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mongodb/replicaset/examples/backupconfiguration-replicaset.yaml +backupconfiguration.stash.appscode.com/sample-mgo-rs-backup created +``` + +**Verify Backup Setup Successful** + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. Let's verify the `Phase` of the BackupConfiguration, + +```console +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-mgo-rs-backup mongodb-backup-4.2.3 */5 * * * * Ready 11s +``` + +**Verify CronJob:** + +Stash will create a CronJob with the schedule specified in `spec.schedule` field of `BackupConfiguration` crd. + +Verify that the CronJob has been created using the following command, + +```console +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +sample-mgo-rs-backup */5 * * * * False 0 62s +``` + +**Wait for BackupSession:** + +The `sample-mgo-rs-backup` CronJob will trigger a backup on each schedule by creating a `BackupSession` crd. + +Wait for the next schedule. Run the following command to watch `BackupSession` crd, + +```console +$ kubectl get backupsession -n demo -w +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +sample-mgo-rs-backup-1563540308 BackupConfiguration sample-mgo-rs-backup Running 5m19s +sample-mgo-rs-backup-1563540308 BackupConfiguration sample-mgo-rs-backup Succeeded 5m45s +``` + +We can see above that the backup session has succeeded. Now, we are going to verify that the backed up data has been stored in the backend. + +**Verify Backup:** + +Once a backup is complete, Stash will update the respective `Repository` crd to reflect the backup. Check that the repository `gcs-repo-replicaset` has been updated by the following command, + +```console +$ kubectl get repository -n demo gcs-repo-replicaset +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo-replicaset true 3.844 KiB 2 14s 10m +``` + +Now, if we navigate to the GCS bucket, we are going to see backed up data has been stored in `demo/mongodb/sample-mgo-rs` directory as specified by `spec.backend.gcs.prefix` field of Repository crd. + +> Note: Stash keeps all the backed up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Restore MongoDB ReplicaSet + +In this section, we are going to restore the database from the backup we have taken in the previous section. We are going to deploy a new replicaset database and initialize it from the backup. + +**Stop Taking Backup of the Old Database:** + +At first, let's stop taking any further backup of the old database so that no backup is taken during restore process. We are going to pause the `BackupConfiguration` crd that we had created to backup the `sample-mgo-rs` database. Then, Stash will stop taking any further backup for this database. + +Let's pause the `sample-mgo-rs-backup` BackupConfiguration, + +```console +$ kubectl patch backupconfiguration -n demo sample-mgo-rs-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/sample-mgo-rs-backup patched +``` + +Now, wait for a moment. Stash will pause the BackupConfiguration. Verify that the BackupConfiguration has been paused, + +```console +$ kubectl get backupconfiguration -n demo sample-mgo-rs-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-mgo-rs-backup mongodb-backup-4.2.3 */5 * * * * true Ready 26m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the BackupConfiguration has been paused. + +**Deploy Restored Database:** + +Now, we have to deploy the restored database similarly as we have deployed the original `sample-psotgres` database. However, this time there will be the following differences: + +- We are going to specify `spec.init.waitForInitialRestore: true` which will tell KubeDB to wait until the first restore to complete before marking this database as ready to use. + +Below is the YAML for `MongoDB` crd we are going deploy to initialize from backup, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MongoDB +metadata: + name: restored-mgo-rs + namespace: demo +spec: + version: "4.2.3" + replicas: 3 + replicaSet: + name: rs0 + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: WipeOut + init: + waitForInitialRestore: true +``` + +Let's create the above database, + +```console +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mongodb/replicaset/examples/restored-mongodb-replicaset.yaml +mongodb.kubedb.com/restored-mgo-rs created +``` + +If you check the database status, you will see it is stuck in `Provisioning` state. + +```console +$ kubectl get mg -n demo restored-mgo-rs +NAME VERSION STATUS AGE +restored-mgo-rs 4.2.3 Provisioning 2m +``` + +**Create RestoreSession:** + +Now, we need to create a `RestoreSession` crd pointing to the AppBinding for this restored database. + +Check AppBinding has been created for the `restored-mgo-rs` database using the following command, + +```console +$ kubectl get appbindings -n demo restored-mgo-rs +NAME AGE +restored-mgo-rs 29s +``` + +NB. The appbinding `restored-mgo-rs` also contains `spec.parametrs` field. the number of hosts in `spec.parameters.replicaSets` needs to be similar to the old appbinding. Otherwise, the replicaset recover may not be accurate. + +> If you are not using KubeDB to deploy database, create the AppBinding manually. + +Below is the YAML for the `RestoreSession` crd that we are going to create to restore backed up data into `restored-mgo-rs` database. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mgo-rs-restore + namespace: demo +spec: + task: + name: mongodb-restore-4.2.3 + repository: + name: gcs-repo-replicaset + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: restored-mgo-rs + rules: + - snapshots: [latest] +``` + +Here, + +- `spec.task.name` specifies the name of the `Task` crd that specifies the Functions and their execution order to restore a MongoDB database. +- `spec.repository.name` specifies the `Repository` crd that holds the backend information where our backed up data has been stored. +- `spec.target.ref` refers to the AppBinding crd for the `restored-mgo-rs` database. +- `spec.rules` specifies that we are restoring from the latest backup snapshot of the database. + +Let's create the `RestoreSession` crd we have shown above, + +```console +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mongodb/replicaset/examples/restoresession-replicaset.yaml +restoresession.stash.appscode.com/sample-mgo-rs-restore created +``` + +Once, you have created the `RestoreSession` crd, Stash will create a job to restore. We can watch the `RestoreSession` phase to check if the restore process is succeeded or not. + +Run the following command to watch `RestoreSession` phase, + +```console +$ kubectl get restoresession -n demo sample-mgo-rs-restore -w +NAME REPOSITORY-NAME PHASE AGE +sample-mgo-rs-restore gcs-repo-replicaset Running 5s +sample-mgo-rs-restore gcs-repo-replicaset Succeeded 43s +``` + +So, we can see from the output of the above command that the restore process succeeded. + +**Verify Restored Data:** + +In this section, we are going to verify that the desired data has been restored successfully. We are going to connect to `mongos` and check whether the table we had created in the original database is restored or not. + +At first, check if the database has gone into `Ready` state by the following command, + +```console +$ kubectl get mg -n demo restored-mgo-rs +NAME VERSION STATUS AGE +restored-mgo-rs 4.2.3 Ready 3m +``` + +Now, exec into the database pod and list available tables, + +```console +$ kubectl get secrets -n demo sample-mgo-rs-auth -o jsonpath='{.data.\username}' | base64 -d +root + +$ kubectl get secrets -n demo sample-mgo-rs-auth -o jsonpath='{.data.\password}' | base64 -d +CRz6EuxvKdFjopfP + +$ kubectl exec -it -n demo restored-mgo-rs-0 bash + +mongodb@restored-mgo-rs-0:/$ mongo admin -u root -p CRz6EuxvKdFjopfP + +rs0:PRIMARY> rs.isMaster().primary +restored-mgo-rs-0.restored-mgo-rs-gvr.demo.svc.cluster.local:27017 + +rs0:PRIMARY> show dbs +admin 0.000GB +config 0.000GB +local 0.000GB +newdb 0.000GB + +rs0:PRIMARY> show users +{ + "_id" : "admin.root", + "userId" : UUID("00f521b5-2b43-4712-ba80-efaa6b382813"), + "user" : "root", + "db" : "admin", + "roles" : [ + { + "role" : "root", + "db" : "admin" + } + ] +} + +rs0:PRIMARY> use newdb +switched to db newdb + +rs0:PRIMARY> db.movie.find().pretty() +{ "_id" : ObjectId("5d31b9d44db670db130d7a5c"), "name" : "batman" } + +rs0:PRIMARY> exit +bye +``` + +So, from the above output, we can see the database `newdb` that we had created in the original database `sample-mgo-rs` is restored in the restored database `restored-mgo-rs`. + +## Backup MongoDB ReplicaSet Cluster and Restore into a Standalone database + +It is possible to take backup of a MongoDB ReplicaSet Cluster and restore it into a standalone database, but user need to create the appbinding for this process. + +### Backup a replicaset cluster + +Keep all the fields of appbinding that is explained earlier in this guide, except `spec.parameter`. Do not set `spec.parameter.configServer` and `spec.parameter.replicaSet`. By doing this, the job will use `spec.clientConfig.service.name` as host, which is replicaset DSN. So, the backup will treat this cluster as a standalone and will skip the [`idiomatic way` of taking backups of a replicaset cluster](https://docs.mongodb.com/manual/tutorial/restore-replica-set-from-backup/). Then follow the rest of the procedure as described above. + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: sample-mgo-rs-custom + namespace: demo +spec: + clientConfig: + service: + name: sample-mgo-rs + port: 27017 + scheme: mongodb + secret: + name: sample-mgo-rs-auth + type: kubedb.com/mongodb + +--- +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo-custom + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: demo/mongodb/sample-mgo-rs/standalone + storageSecretName: gcs-secret + +--- +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mgo-rs-backup2 + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: mongodb-backup-4.2.3 + repository: + name: gcs-repo-custom + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mgo-rs-custom + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +```console +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mongodb/replicaset/examples/standalone-backup.yaml +appbinding.appcatalog.appscode.com/sample-mgo-rs-custom created +repository.stash.appscode.com/gcs-repo-custom created +backupconfiguration.stash.appscode.com/sample-mgo-rs-backup2 created + + +$ kubectl get backupsession -n demo +NAME BACKUPCONFIGURATION PHASE AGE +sample-mgo-rs-backup2-1563541509 sample-mgo-rs-backup Succeeded 35s + + +$ kubectl get repository -n demo gcs-repo-custom +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo-custom true 1.640 KiB 1 1m 5m +``` + +### Restore to a standalone database + +No additional configuration is needed to restore the replicaset cluster to a standalone database. Follow the normal procedure of restoring a MongoDB Database. + +Standalone MongoDB, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MongoDB +metadata: + name: restored-mongodb + namespace: demo +spec: + version: "4.2.3" + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + init: + waitForInitialRestore: true + terminationPolicy: WipeOut +``` + +RestoreSession crd object, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mongodb-restore + namespace: demo +spec: + task: + name: mongodb-restore-4.2.3 + repository: + name: gcs-repo-custom + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: restored-mongodb + rules: + - snapshots: [latest] +``` + +```console +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mongodb/replicaset/examples/restored-standalone.yaml +mongodb.kubedb.com/restored-mongodb created + +$ kubectl get mg -n demo restored-mongodb +NAME VERSION STATUS AGE +restored-mongodb 4.2.3 Provisioning 56s + +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mongodb/replicaset/examples/restoresession-standalone.yaml +restoresession.stash.appscode.com/sample-mongodb-restore created + +$ kubectl get mg -n demo restored-mongodb +NAME VERSION STATUS AGE +restored-mongodb 4.2.3 Ready 2m +``` + +Now, exec into the database pod and list available tables, + +```console +$ kubectl get secrets -n demo sample-mgo-rs-auth -o jsonpath='{.data.\username}' | base64 -d +root + +$ kubectl get secrets -n demo sample-mgo-rs-auth -o jsonpath='{.data.\password}' | base64 -d +CRz6EuxvKdFjopfP + +$ kubectl exec -it -n demo restored-mongodb-0 bash + +mongodb@restored-mongodb-0:/$ mongo admin -u root -p CRz6EuxvKdFjopfP + +> show dbs +admin 0.000GB +config 0.000GB +local 0.000GB +newdb 0.000GB + +> show users +{ + "_id" : "admin.root", + "userId" : UUID("11e00a38-7b08-4864-b452-ae356350e50f"), + "user" : "root", + "db" : "admin", + "roles" : [ + { + "role" : "root", + "db" : "admin" + } + ] +} + +> use newdb +switched to db newdb + +> db.movie.find().pretty() +{ "_id" : ObjectId("5d31b9d44db670db130d7a5c"), "name" : "batman" } + +> exit +bye +``` + +So, from the above output, we can see the database `newdb` that we had created in the original database `sample-mgo-rs` is restored in the restored database `restored-mongodb`. + +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```console +kubectl delete -n demo restoresession sample-mgo-rs-restore sample-mongodb-restore +kubectl delete -n demo backupconfiguration sample-mgo-rs-backup sample-mgo-rs-backup2 +kubectl delete -n demo mg sample-mgo-rs sample-mgo-rs-ssl restored-mgo-rs restored-mgo-rs restored-mongodb +kubectl delete -n demo repository gcs-repo-replicaset gcs-repo-custom +kubectl delete -n demo appbinding sample-mgo-rs-custom +``` diff --git a/content/docs/v2024.12.18/addons/mongodb/sharding/examples/backupconfiguration-sharding.yaml b/content/docs/v2024.12.18/addons/mongodb/sharding/examples/backupconfiguration-sharding.yaml new file mode 100644 index 0000000000..8252a27e85 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/sharding/examples/backupconfiguration-sharding.yaml @@ -0,0 +1,20 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mgo-sh-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: mongodb-backup-4.2.3 + repository: + name: gcs-repo-sharding + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mgo-sh + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/mongodb/sharding/examples/mongodb-sharding.yaml b/content/docs/v2024.12.18/addons/mongodb/sharding/examples/mongodb-sharding.yaml new file mode 100644 index 0000000000..401ac10901 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/sharding/examples/mongodb-sharding.yaml @@ -0,0 +1,26 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MongoDB +metadata: + name: sample-mgo-sh + namespace: demo +spec: + version: 4.2.3 + shardTopology: + configServer: + replicas: 3 + storage: + resources: + requests: + storage: 1Gi + storageClassName: standard + mongos: + replicas: 2 + shard: + replicas: 3 + shards: 3 + storage: + resources: + requests: + storage: 1Gi + storageClassName: standard + terminationPolicy: WipeOut diff --git a/content/docs/v2024.12.18/addons/mongodb/sharding/examples/repository-sharding.yaml b/content/docs/v2024.12.18/addons/mongodb/sharding/examples/repository-sharding.yaml new file mode 100644 index 0000000000..fb69d936e9 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/sharding/examples/repository-sharding.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo-sharding + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: demo/mongodb/sample-mgo-sh + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/addons/mongodb/sharding/examples/restored-mongodb-sharding.yaml b/content/docs/v2024.12.18/addons/mongodb/sharding/examples/restored-mongodb-sharding.yaml new file mode 100644 index 0000000000..b5e9d1c3f3 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/sharding/examples/restored-mongodb-sharding.yaml @@ -0,0 +1,30 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MongoDB +metadata: + name: restored-mgo-sh + namespace: demo +spec: + authSecret: + name: sample-mgo-sh-auth + version: 4.2.3 + shardTopology: + configServer: + replicas: 3 + storage: + resources: + requests: + storage: 1Gi + storageClassName: standard + mongos: + replicas: 2 + shard: + replicas: 3 + shards: 3 + storage: + resources: + requests: + storage: 1Gi + storageClassName: standard + init: + waitForInitialRestore: true + terminationPolicy: WipeOut diff --git a/content/docs/v2024.12.18/addons/mongodb/sharding/examples/restored-standalone.yaml b/content/docs/v2024.12.18/addons/mongodb/sharding/examples/restored-standalone.yaml new file mode 100644 index 0000000000..3c8c2dc929 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/sharding/examples/restored-standalone.yaml @@ -0,0 +1,20 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MongoDB +metadata: + name: restored-mongodb + namespace: demo +spec: + version: "4.2.3" + storageType: Durable + authSecret: + name: sample-mgo-sh-auth + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + init: + waitForInitialRestore: true + terminationPolicy: WipeOut diff --git a/content/docs/v2024.12.18/addons/mongodb/sharding/examples/restoresession-sharding.yaml b/content/docs/v2024.12.18/addons/mongodb/sharding/examples/restoresession-sharding.yaml new file mode 100644 index 0000000000..ced0ce7152 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/sharding/examples/restoresession-sharding.yaml @@ -0,0 +1,17 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mgo-sh-restore + namespace: demo +spec: + task: + name: mongodb-restore-4.2.3 + repository: + name: gcs-repo-sharding + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: restored-mgo-sh + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/addons/mongodb/sharding/examples/restoresession-standalone.yaml b/content/docs/v2024.12.18/addons/mongodb/sharding/examples/restoresession-standalone.yaml new file mode 100644 index 0000000000..f64157d2d4 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/sharding/examples/restoresession-standalone.yaml @@ -0,0 +1,17 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mongodb-restore + namespace: demo +spec: + task: + name: mongodb-restore-4.2.3 + repository: + name: gcs-repo-custom + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: restored-mongodb + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/addons/mongodb/sharding/examples/standalone-backup.yaml b/content/docs/v2024.12.18/addons/mongodb/sharding/examples/standalone-backup.yaml new file mode 100644 index 0000000000..6683daaf68 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/sharding/examples/standalone-backup.yaml @@ -0,0 +1,47 @@ +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: sample-mgo-sh-custom + namespace: demo +spec: + clientConfig: + service: + name: sample-mgo-sh + port: 27017 + scheme: mongodb + secret: + name: sample-mgo-sh-auth + type: kubedb.com/mongodb +--- +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo-custom + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: demo/mongodb/sample-mgo-sh/standalone + storageSecretName: gcs-secret +--- +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mgo-sh-backup2 + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: mongodb-backup-4.2.3 + repository: + name: gcs-repo-custom + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mgo-sh-custom + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/mongodb/sharding/index.md b/content/docs/v2024.12.18/addons/mongodb/sharding/index.md new file mode 100644 index 0000000000..a151d00f06 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/sharding/index.md @@ -0,0 +1,856 @@ +--- +title: Backup & Restore Sharded MongoDB Cluster| Stash +description: Backup and restore sharded MongoDB cluster using Stash +menu: + docs_v2024.12.18: + identifier: stash-mongodb-sharding + name: MongoDB Sharded Cluster + parent: stash-mongodb + weight: 40 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup and Restore MongoDB Sharded Clusters using Stash + +Stash 0.9.0+ supports taking [backup](https://docs.mongodb.com/manual/tutorial/backup-sharded-cluster-with-database-dumps/) and [restores](https://docs.mongodb.com/manual/tutorial/restore-sharded-cluster/) MongoDB Sharded clusters in ["idiomatic" way](https://docs.mongodb.com/manual/administration/backup-sharded-clusters/). This guide will show you how you can backup and restore your MongoDB Sharded clusters with Stash. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using Minikube. +- Install Stash in your cluster following the steps [here](/docs/v2024.12.18/setup/install/stash/). +- Install [KubeDB](https://kubedb.com) in your cluster following the steps [here](https://kubedb.com/docs/latest/setup/). This step is optional. You can deploy your database using any method you want. We are using KubeDB because KubeDB simplifies many of the difficult or tedious management tasks of running a production grade databases on private and public clouds. +- If you are not familiar with how Stash backup and restore MongoDB databases, please check the following guide [here](/docs/v2024.12.18/addons/mongodb/overview/). + +You have to be familiar with following custom resources: + +- [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) +- [Function](/docs/v2024.12.18/concepts/crds/function/) +- [Task](/docs/v2024.12.18/concepts/crds/task/) +- [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) +- [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + +To keep things isolated, we are going to use a separate namespace called `demo` throughout this tutorial. Create `demo` namespace if you haven't created yet. + +```console +$ kubectl create ns demo +namespace/demo created +``` + +> Note: YAML files used in this tutorial are stored [here](https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/mongodb/sharding/examples). + +## Backup Sharded MongoDB Cluster + +This section will demonstrate how to backup MongoDB cluster. We are going to use [KubeDB](https://kubedb.com) to deploy a sample database. Then, we are going to backup this database into a GCS bucket. Finally, we are going to restore the backed up data into another MongoDB cluster. + +### Deploy Sample MongoDB Sharding + +Let's deploy a sample MongoDB Sharding database and insert some data into it. + +**Create MongoDB CRD:** + +Below is the YAML of a sample MongoDB crd that we are going to create for this tutorial: + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MongoDB +metadata: + name: sample-mgo-sh + namespace: demo +spec: + version: 4.2.3 + shardTopology: + configServer: + replicas: 3 + storage: + resources: + requests: + storage: 1Gi + storageClassName: standard + mongos: + replicas: 2 + shard: + replicas: 3 + shards: 3 + storage: + resources: + requests: + storage: 1Gi + storageClassName: standard + terminationPolicy: WipeOut +``` + +Create the above `MongoDB` crd, + +```console +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mongodb/sharding/examples/mongodb-sharding.yaml +mongodb.kubedb.com/sample-mgo-sh created +``` + +MongoDB [recommends](https://www.mongodb.com/docs/manual/core/replica-set-members/#replica-set-members) that there should be at least 3 replicas for a replicaSet configuration. For a sharded MongoDB setup, a secondary configserver is locked while running `mongodump` utility for backup. This can result in various issues like sharding commands get stucked, primary-secondary syncing issue etc. So, ensure at least 3 configServer replicas by specifying >= 3 replicas in `.spec.shardTopology.configServer.replicas` field. + +KubeDB will deploy a MongoDB database according to the above specification. It will also create the necessary secrets and services to access the database. + +Let's check if the database is ready to use, + +```console +$ kubectl get mg -n demo sample-mgo-sh +NAME VERSION STATUS AGE +sample-mgo-sh 4.2.3 Ready 35m +``` + +The database is `Ready`. Verify that KubeDB has created a Secret and a Service for this database using the following commands, + +```console +$ kubectl get secret -n demo -l=app.kubernetes.io/instance=sample-mgo-sh +NAME TYPE DATA AGE +sample-mgo-sh-auth Opaque 2 36m +sample-mgo-sh-cert Opaque 4 36m + +$ kubectl get service -n demo -l=app.kubernetes.io/instance=sample-mgo-sh +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +sample-mgo-sh ClusterIP 10.107.11.117 27017/TCP 36m +sample-mgo-sh-configsvr-gvr ClusterIP None 27017/TCP 36m +sample-mgo-sh-shard0-gvr ClusterIP None 27017/TCP 36m +sample-mgo-sh-shard1-gvr ClusterIP None 27017/TCP 36m +sample-mgo-sh-shard2-gvr ClusterIP None 27017/TCP 36m +``` + +KubeDB creates an [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) crd that holds the necessary information to connect with the database. + +**Verify AppBinding:** + +Verify that the `AppBinding` has been created successfully using the following command, + +```console +$ kubectl get appbindings -n demo +NAME AGE +sample-mgo-sh 30m +``` + +Let's check the YAML of the above `AppBinding`, + +```console +$ kubectl get appbindings -n demo sample-mgo-sh -o yaml +``` + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + labels: + app.kubernetes.io/component: database + app.kubernetes.io/managed-by: kubedb.com + app.kubernetes.io/name: mongodbs.kubedb.com + app.kubernetes.io/instance: sample-mgo-sh + name: sample-mgo-sh + namespace: demo +spec: + clientConfig: + service: + name: sample-mgo-sh + port: 27017 + scheme: mongodb + parameters: + apiVersion: config.kubedb.com/v1alpha1 + kind: MongoConfiguration + configServer: cnfRepSet/sample-mgo-sh-configsvr-0.sample-mgo-sh-configsvr-gvr.demo.svc:27017,sample-mgo-sh-configsvr-1.sample-mgo-sh-configsvr-gvr.demo.svc:27017,sample-mgo-sh-configsvr-2.sample-mgo-sh-configsvr-gvr.demo.svc:27017 + replicaSets: + host-0: shard0/sample-mgo-sh-shard0-0.sample-mgo-sh-shard0-gvr.demo.svc:27017,sample-mgo-sh-shard0-1.sample-mgo-sh-shard0-gvr.demo.svc:27017,sample-mgo-sh-shard0-2.sample-mgo-sh-shard0-gvr.demo.svc:27017 + host-1: shard1/sample-mgo-sh-shard1-0.sample-mgo-sh-shard1-gvr.demo.svc:27017,sample-mgo-sh-shard1-1.sample-mgo-sh-shard1-gvr.demo.svc:27017,sample-mgo-sh-shard1-2.sample-mgo-sh-shard1-gvr.demo.svc:27017 + host-2: shard2/sample-mgo-sh-shard2-0.sample-mgo-sh-shard2-gvr.demo.svc:27017,sample-mgo-sh-shard2-1.sample-mgo-sh-shard2-gvr.demo.svc:27017,sample-mgo-sh-shard2-2.sample-mgo-sh-shard2-gvr.demo.svc:27017 + secret: + name: sample-mgo-sh-auth + type: kubedb.com/mongodb + version: 4.2.3 +``` + +Stash uses the `AppBinding` crd to connect with the target database. It requires the following two fields to set in AppBinding's `Spec` section. + +- `spec.clientConfig.service.name` specifies the name of the service that connects to the database. +- `spec.secret` specifies the name of the secret that holds necessary credentials to access the database. +- `spec.parameters.configServer` specifies the dsn of config server of mongodb sharding. The dsn includes the port no too. +- `spec.parameters.replicaSets` contains the dsn of each replicaset of sharding. The DSNs are in key-value pair, where the keys are host-0, host-1 etc, and the values are DSN of each replicaset. If there is no sharding but only one replicaset, then ReplicaSets field contains only one key-value pair where the key is host-0 and the value is dsn of that replicaset. +- `spec.type` specifies the types of the app that this AppBinding is pointing to. KubeDB generated AppBinding follows the following format: `/`. + +**Creating AppBinding Manually:** + +If you deploy MongoDB database without KubeDB, you have to create the AppBinding crd manually in the same namespace as the service and secret of the database. + +**Insert Sample Data:** + +Now, we are going to exec into the database pod and create some sample data. At first, find out the database pod using the following command, + +```console +$ kubectl get pods -n demo --selector="mongodb.kubedb.com/node.mongos=sample-mgo-sh-mongos" +NAME READY STATUS RESTARTS AGE +sample-mgo-sh-mongos-9459cfc44-4jthd 1/1 Running 0 60m +sample-mgo-sh-mongos-9459cfc44-6d2st 1/1 Running 0 60m +``` + +Now, let's exec into the pod and create a table, + +```console +$ kubectl get secrets -n demo sample-mgo-sh-auth -o jsonpath='{.data.\username}' | base64 -d +root + +$ kubectl get secrets -n demo sample-mgo-sh-auth -o jsonpath='{.data.\password}' | base64 -d +JJPcMxNKJev0SzgX + +$ kubectl exec -it -n demo sample-mgo-sh-mongos-9459cfc44-4jthd bash + +mongodb@sample-mgo-sh-0:/$ mongo admin -u root -p JJPcMxNKJev0SzgX + +mongos> show dbs +admin 0.000GB +config 0.001GB + + +mongos> show users +{ + "_id" : "admin.root", + "userId" : UUID("b9a1551b-83cf-4ebb-852b-dd23c890f301"), + "user" : "root", + "db" : "admin", + "roles" : [ + { + "role" : "root", + "db" : "admin" + } + ] +} + +mongos> use newdb +switched to db newdb + +mongos> db.movie.insert({"name":"batman"}); +WriteResult({ "nInserted" : 1 }) + +mongos> db.movie.find().pretty() +{ "_id" : ObjectId("5d3064bf144a1b8fda04cd4f"), "name" : "batman" } + +mongos> exit +bye +``` + +Now, we are ready to backup this sample database. + +### Prepare Backend + +We are going to store our backed up data into a GCS bucket. At first, we need to create a secret with GCS credentials then we need to create a `Repository` crd. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +**Create Storage Secret:** + +Let's create a secret called `gcs-secret` with access credentials to our desired GCS bucket, + +```console +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat downloaded-sa-key.json > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create Repository:** + +Now, create a `Repository` using this secret. Below is the YAML of Repository crd we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo-sharding + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: demo/mongodb/sample-mgo-sh + storageSecretName: gcs-secret +``` + +Let's create the `Repository` we have shown above, + +```console +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mongodb/sharding/examples/repository-sharding.yaml +repository.stash.appscode.com/gcs-repo-sharding created +``` + +Now, we are ready to backup our database to our desired backend. + +### Backup MongoDB Sharding + +We have to create a `BackupConfiguration` targeting respective AppBinding crd of our desired database. Then Stash will create a CronJob to periodically backup the database. + +**Create BackupConfiguration:** + +Below is the YAML for `BackupConfiguration` crd to backup the `sample-mgo-sh` database we have deployed earlier., + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mgo-sh-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: mongodb-backup-4.2.3 + repository: + name: gcs-repo-sharding + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mgo-sh + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +Here, + +- `spec.schedule` specifies that we want to backup the database at 5 minutes interval. +- `spec.task.name` specifies the name of the task crd that specifies the necessary Function and their execution order to backup a MongoDB database. +- `spec.target.ref` refers to the `AppBinding` crd that was created for `sample-mgo-sh` database. + +Let's create the `BackupConfiguration` crd we have shown above, + +```console +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mongodb/sharding/examples/backupconfiguration-sharding.yaml +backupconfiguration.stash.appscode.com/sample-mgo-sh-backup created +``` + +**Verify Backup Setup Successful** + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. Let's verify the `Phase` of the BackupConfiguration, + +```console +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-mgo-sh-backup mongodb-backup-4.2.3 */5 * * * * Ready 11s +``` + +**Verify CronJob:** + +Stash will create a CronJob with the schedule specified in `spec.schedule` field of `BackupConfiguration` crd. + +Verify that the CronJob has been created using the following command, + +```console +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +sample-mgo-sh-backup */5 * * * * False 0 13s +``` + +**Wait for BackupSession:** + +The `sample-mgo-sh-backup` CronJob will trigger a backup on each schedule by creating a `BackupSession` crd. + +Wait for the next schedule. Run the following command to watch `BackupSession` crd, + +```console +$ kubectl get backupsession -n demo -w +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +sample-mgo-sh-backup-1563512707 BackupConfiguration sample-mgo-sh-backup Running 5m19s +sample-mgo-sh-backup-1563512707 BackupConfiguration sample-mgo-sh-backup Succeeded 5m45s +``` + +We can see above that the backup session has succeeded. Now, we are going to verify that the backed up data has been stored in the backend. + +**Verify Backup:** + +Once a backup is complete, Stash will update the respective `Repository` crd to reflect the backup. Check that the repository `gcs-repo-sharding` has been updated by the following command, + +```console +$ kubectl get repository -n demo gcs-repo-sharding +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo-sharding true 66.453 KiB 12 1m 20m +``` + +Now, if we navigate to the GCS bucket, we are going to see backed up data has been stored in `demo/mongodb/sample-mgo-sh` directory as specified by `spec.backend.gcs.prefix` field of Repository crd. + +> Note: Stash keeps all the backed up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Restore MongoDB Sharding + +In this section, we are going to restore the database from the backup we have taken in the previous section. We are going to deploy a new sharded database and initialize it from the backup. + +**Stop Taking Backup of the Old Database:** + +At first, let's stop taking any further backup of the old database so that no backup is taken during restore process. We are going to pause the `BackupConfiguration` crd that we had created to backup the `sample-mgo-sh` database. Then, Stash will stop taking any further backup for this database. + +Let's pause the `sample-mgo-sh-backup` BackupConfiguration, + +```console +$ kubectl patch backupconfiguration -n demo sample-mgo-sh-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/sample-mgo-sh-backup patched +``` + +Now, wait for a moment. Stash will pause the BackupConfiguration. Verify that the BackupConfiguration has been paused, + +```console +$ kubectl get backupconfiguration -n demo sample-mgo-sh-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-mgo-sh-backup mongodb-backup-4.2.3 */5 * * * * true Ready 26m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the BackupConfiguration has been paused. + +**Deploy Restored Database:** + +Now, we have to deploy the restored database similarly as we have deployed the original `sample-mgo-sh` database. However, this time there will be the following differences: + +- We are going to specify `spec.init.waitForInitialRestore: true` which will tell KubeDB to wait until the first restore to complete before marking this database as ready to use. + +Below is the YAML for `MongoDB` crd we are going deploy to initialize from backup, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MongoDB +metadata: + name: restored-mgo-sh + namespace: demo +spec: + authSecret: + name: sample-mgo-sh-auth + version: 4.2.3 + shardTopology: + configServer: + replicas: 3 + storage: + resources: + requests: + storage: 1Gi + storageClassName: standard + mongos: + replicas: 2 + shard: + replicas: 3 + shards: 3 + storage: + resources: + requests: + storage: 1Gi + storageClassName: standard + init: + waitForInitialRestore: true + terminationPolicy: WipeOut +``` + +Let's create the above database, + +```console +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mongodb/sharding/examples/restored-mongodb-sharding.yaml +mongodb.kubedb.com/restored-mgo-sh created +``` + +If you check the database status, you will see it is stuck in `Provisioning` state. + +```console +$ kubectl get mg -n demo restored-mgo-sh +NAME VERSION STATUS AGE +restored-mgo-sh 4.2.3 Provisioning 48m +``` + +**Create RestoreSession:** + +Now, we need to create a `RestoreSession` crd pointing to the AppBinding for this restored database. + +Check AppBinding has been created for the `restored-mgo-sh` database using the following command, + +```console +$ kubectl get appbindings -n demo restored-mgo-sh +NAME AGE +restored-mgo-sh 29s +``` + +NB. The appbinding `restored-mgo-sh` also contains `spec.parametrs` field. the number of hosts in `spec.parameters.replicaSets` needs to be similar to the old appbinding. Otherwise, the sharding recover may not be accurate. + +> If you are not using KubeDB to deploy database, create the AppBinding manually. + +Below is the YAML for the `RestoreSession` crd that we are going to create to restore backed up data into `restored-mgo-sh` database. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mgo-sh-restore + namespace: demo +spec: + task: + name: mongodb-restore-4.2.3 + repository: + name: gcs-repo-sharding + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: restored-mgo-sh + rules: + - snapshots: [latest] +``` + +Here, + +- `spec.task.name` specifies the name of the `Task` crd that specifies the Functions and their execution order to restore a MongoDB database. +- `spec.repository.name` specifies the `Repository` crd that holds the backend information where our backed up data has been stored. +- `spec.target.ref` refers to the AppBinding crd for the `restored-mgo-sh` database. +- `spec.rules` specifies that we are restoring from the latest backup snapshot of the database. + +Let's create the `RestoreSession` crd we have shown above, + +```console +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mongodb/sharding/examples/restoresession-sharding.yaml +restoresession.stash.appscode.com/sample-mgo-sh-restore created +``` + +Once, you have created the `RestoreSession` crd, Stash will create a job to restore. We can watch the `RestoreSession` phase to check if the restore process is succeeded or not. + +Run the following command to watch `RestoreSession` phase, + +```console +$ kubectl get restoresession -n demo sample-mgo-sh-restore -w +NAME REPOSITORY-NAME PHASE AGE +sample-mgo-sh-restore gcs-repo-sharding Running 5s +sample-mgo-sh-restore gcs-repo-sharding Succeeded 43s +``` + +So, we can see from the output of the above command that the restore process succeeded. + +**Verify Restored Data:** + +In this section, we are going to verify that the desired data has been restored successfully. We are going to connect to `mongos` and check whether the table we had created in the original database is restored or not. + +At first, check if the database has gone into `Running` state by the following command, + +```console +$ kubectl get mg -n demo restored-mgo-sh +NAME VERSION STATUS AGE +restored-mgo-sh 4.2.3 Running 2h +``` + +Now, find out the `mongos` pod, + +```console +$ kubectl get pods -n demo --selector="mongodb.kubedb.com/node.mongos=restored-mgo-sh-mongos" +NAME READY STATUS RESTARTS AGE +restored-mgo-sh-mongos-7bccd5d684-2z5xs 1/1 Running 0 169m +restored-mgo-sh-mongos-7bccd5d684-vvdxb 1/1 Running 0 169m +``` + +Now, exec into the database pod and list available tables, + +```console +$ kubectl get secrets -n demo sample-mgo-sh-auth -o jsonpath='{.data.\username}' | base64 -d +root + +$ kubectl get secrets -n demo sample-mgo-sh-auth -o jsonpath='{.data.\password}' | base64 -d +JJPcMxNKJev0SzgX + +$ kubectl exec -it -n demo restored-mgo-sh-mongos-7bccd5d684-2z5xs bash + +mongodb@restored-mgo-sh-0:/$ mongo admin -u root -p JJPcMxNKJev0SzgX + +mongos> show dbs +admin 0.000GB +config 0.001GB +newdb 0.000GB + + +mongos> show users +{ + "_id" : "admin.root", + "userId" : UUID("a57cb466-ec66-453b-b795-654169a0f035"), + "user" : "root", + "db" : "admin", + "roles" : [ + { + "role" : "root", + "db" : "admin" + } + ] +} + +mongos> use newdb +switched to db newdb + +mongos> db.movie.find().pretty() +{ "_id" : ObjectId("5d3064bf144a1b8fda04cd4f"), "name" : "batman" } + +mongos> exit +bye +``` + +So, from the above output, we can see the database `newdb` that we had created in the original database `sample-mgo-sh` is restored in the restored database `restored-mgo-sh`. + +## Backup MongoDB Sharded Cluster and Restore into a Standalone database + +It is possible to take backup of a MongoDB Sharded Cluster and restore it into a standalone database, but user need to create the appbinding for this process. + +### Backup a sharded cluster + +Keep all the fields of appbinding that is explained earlier in this guide, except `spec.parameter`. Do not set `spec.parameter.configServer` and `spec.parameter.replicaSet`. By doing this, the job will use `spec.clientConfig.service.name` as host, which is `mongos` router DSN. So, the backup will treat this cluster as a standalone and will skip the [`idiomatic way` of taking backups of a sharded cluster](https://docs.mongodb.com/manual/tutorial/backup-sharded-cluster-with-database-dumps/). Then follow the rest of the procedure as described above. + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: sample-mgo-sh-custom + namespace: demo +spec: + clientConfig: + service: + name: sample-mgo-sh + port: 27017 + scheme: mongodb + secret: + name: sample-mgo-sh-auth + type: kubedb.com/mongodb + +--- +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo-custom + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: demo/mongodb/sample-mgo-sh/standalone + storageSecretName: gcs-secret + +--- +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mgo-sh-backup2 + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: mongodb-backup-4.2.3 + repository: + name: gcs-repo-custom + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mgo-sh-custom + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +```console +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mongodb/sharding/examples/standalone-backup.yaml +appbinding.appcatalog.appscode.com/sample-mgo-sh-custom created +repository.stash.appscode.com/gcs-repo-custom created +backupconfiguration.stash.appscode.com/sample-mgo-sh-backup2 created + + +$ kubectl get backupsession -n demo +NAME BACKUPCONFIGURATION PHASE AGE +sample-mgo-sh-backup-1563528902 sample-mgo-sh-backup Succeeded 35s + + +$ kubectl get repository -n demo gcs-repo-custom +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo-custom true 22.160 KiB 4 1m 2m +``` + +### Restore to a standalone database + +No additional configuration is needed to restore the sharded cluster to a standalone database. Follow the normal procedure of restoring a MongoDB Database. + +Standalone MongoDB, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MongoDB +metadata: + name: restored-mongodb + namespace: demo +spec: + version: "4.2.3" + storageType: Durable + authSecret: + name: sample-mgo-sh-auth + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + init: + waitForInitialRestore: true + terminationPolicy: WipeOut +``` + +RestoreSession crd object, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mongodb-restore + namespace: demo +spec: + task: + name: mongodb-restore-4.2.3 + repository: + name: gcs-repo-custom + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: restored-mongodb + rules: + - snapshots: [latest] +``` + +```console +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mongodb/sharding/examples/restored-standalone.yaml +mongodb.kubedb.com/restored-mongodb created + +$ kubectl get mg -n demo restored-mongodb +NAME VERSION STATUS AGE +restored-mongodb 4.2.3 Provisioning 56s + +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mongodb/sharding/examples/restoresession-standalone.yaml +restoresession.stash.appscode.com/sample-mongodb-restore created + +$ kubectl get mg -n demo restored-mongodb +NAME VERSION STATUS AGE +restored-mongodb 4.2.3 Running 56s +``` + +Now, exec into the database pod and list available tables, + +```console +$ kubectl get secrets -n demo sample-mgo-sh-auth -o jsonpath='{.data.\username}' | base64 -d +root + +$ kubectl get secrets -n demo sample-mgo-sh-auth -o jsonpath='{.data.\password}' | base64 -d +JJPcMxNKJev0SzgX + +$ kubectl exec -it -n demo restored-mongodb-0 bash + +mongodb@restored-mongodb-0:/$ mongo admin -u root -p JJPcMxNKJev0SzgX + +> show dbs +admin 0.000GB +config 0.000GB +local 0.000GB +newdb 0.000GB + +> show users +{ + "_id" : "admin.root", + "userId" : UUID("98fa7511-2ae0-4466-bb2a-f9a7e17631ad"), + "user" : "root", + "db" : "admin", + "roles" : [ + { + "role" : "root", + "db" : "admin" + } + ] +} + +> use newdb +switched to db newdb + +> db.movie.find().pretty() +{ "_id" : ObjectId("5d3064bf144a1b8fda04cd4f"), "name" : "batman" } + +> exit +bye +``` + +So, from the above output, we can see the database `newdb` that we had created in the original database `sample-mgo-sh` is restored in the restored database `restored-mongodb`. + +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```console +kubectl delete -n demo restoresession sample-mgo-sh-restore sample-mongodb-restore +kubectl delete -n demo backupconfiguration sample-mgo-sh-backup sample-mgo-sh-backup2 +kubectl delete -n demo mg sample-mgo-sh sample-mgo-sh-ssl restored-mgo-sh restored-mgo-sh restored-mongodb +kubectl delete -n demo repository gcs-repo-sharding gcs-repo-custom +``` diff --git a/content/docs/v2024.12.18/addons/mongodb/standalone/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/addons/mongodb/standalone/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..e4947637bc --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/standalone/examples/backupconfiguration.yaml @@ -0,0 +1,20 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mongodb-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: mongodb-backup-4.2.3 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mongodb + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/mongodb/standalone/examples/mongodb.yaml b/content/docs/v2024.12.18/addons/mongodb/standalone/examples/mongodb.yaml new file mode 100644 index 0000000000..bc205087e1 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/standalone/examples/mongodb.yaml @@ -0,0 +1,16 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MongoDB +metadata: + name: sample-mongodb + namespace: demo +spec: + version: "4.2.3" + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: WipeOut diff --git a/content/docs/v2024.12.18/addons/mongodb/standalone/examples/repository.yaml b/content/docs/v2024.12.18/addons/mongodb/standalone/examples/repository.yaml new file mode 100644 index 0000000000..9b224913a8 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/standalone/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: demo/mongodb/sample-mongodb + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/addons/mongodb/standalone/examples/restored-mongodb.yaml b/content/docs/v2024.12.18/addons/mongodb/standalone/examples/restored-mongodb.yaml new file mode 100644 index 0000000000..2269cfa289 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/standalone/examples/restored-mongodb.yaml @@ -0,0 +1,19 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MongoDB +metadata: + name: restored-mongodb + namespace: demo +spec: + version: "4.2.3" + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + init: + waitForInitialRestore: true + terminationPolicy: WipeOut + diff --git a/content/docs/v2024.12.18/addons/mongodb/standalone/examples/restoresession.yaml b/content/docs/v2024.12.18/addons/mongodb/standalone/examples/restoresession.yaml new file mode 100644 index 0000000000..231b31c68b --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/standalone/examples/restoresession.yaml @@ -0,0 +1,17 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mongodb-restore + namespace: demo +spec: + task: + name: mongodb-restore-4.2.3 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: restored-mongodb + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/addons/mongodb/standalone/index.md b/content/docs/v2024.12.18/addons/mongodb/standalone/index.md new file mode 100644 index 0000000000..a41cab23a2 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mongodb/standalone/index.md @@ -0,0 +1,645 @@ +--- +title: Backup & Restore Standalone MongoDB | Stash +description: Backup and restore standalone MongoDB database using Stash +menu: + docs_v2024.12.18: + identifier: stash-mongodb-standalone + name: Standalone MongoDB + parent: stash-mongodb + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup and Restore MongoDB database using Stash + +Stash 0.9.0+ supports backup and restoration of MongoDB databases. This guide will show you how you can backup and restore your MongoDB database with Stash. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using Minikube. +- Install Stash in your cluster following the steps [here](/docs/v2024.12.18/setup/README). +- Install [KubeDB](https://kubedb.com) in your cluster following the steps [here](https://kubedb.com/docs/latest/setup/). This step is optional. You can deploy your database using any method you want. We are using KubeDB because KubeDB simplifies many of the difficult or tedious management tasks of running a production grade databases on private and public clouds. +- If you are not familiar with how Stash backup and restore MongoDB databases, please check the following guide [here](/docs/v2024.12.18/addons/mongodb/overview/). + +You have to be familiar with following custom resources: + +- [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) +- [Function](/docs/v2024.12.18/concepts/crds/function/) +- [Task](/docs/v2024.12.18/concepts/crds/task/) +- [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) +- [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + +To keep things isolated, we are going to use a separate namespace called `demo` throughout this tutorial. Create `demo` namespace if you haven't created yet. + +```console +$ kubectl create ns demo +namespace/demo created +``` + +> Note: YAML files used in this tutorial are stored [here](https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/mongodb/standalone/examples). + +## Backup MongoDB + +This section will demonstrate how to backup MongoDB database. Here, we are going to deploy a MongoDB database using KubeDB. Then, we are going to backup this database into a GCS bucket. Finally, we are going to restore the backed up data into another MongoDB database. + +### Deploy Sample MongoDB Database + +Let's deploy a sample MongoDB database and insert some data into it. + +**Create MongoDB CRD:** + +Below is the YAML of a sample MongoDB crd that we are going to create for this tutorial: + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MongoDB +metadata: + name: sample-mongodb + namespace: demo +spec: + version: "4.2.3" + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: WipeOut +``` + +Create the above `MongoDB` crd, + +```console +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mongodb/standalone/examples/mongodb.yaml +mongodb.kubedb.com/sample-mongodb created +``` + +KubeDB will deploy a MongoDB database according to the above specification. It will also create the necessary secrets and services to access the database. + +Let's check if the database is ready to use, + +```console +$ kubectl get mg -n demo sample-mongodb +NAME VERSION STATUS AGE +sample-mongodb 4.2.3 Ready 2m9s +``` + +The database is `Ready`. Verify that KubeDB has created a Secret and a Service for this database using the following commands, + +```console +$ kubectl get secret -n demo -l=app.kubernetes.io/instance=sample-mongodb +NAME TYPE DATA AGE +sample-mongodb-auth Opaque 2 2m28s + +$ kubectl get service -n demo -l=app.kubernetes.io/instance=sample-mongodb +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +sample-mongodb ClusterIP 10.107.58.222 27017/TCP 2m48s +sample-mongodb-gvr ClusterIP None 27017/TCP 2m48s +``` + +Here, we have to use service `sample-mongodb` and secret `sample-mongodb-auth` to connect with the database. KubeDB creates an [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) crd that holds the necessary information to connect with the database. + +**Verify AppBinding:** + +Verify that the `AppBinding` has been created successfully using the following command, + +```console +$ kubectl get appbindings -n demo +NAME AGE +sample-mongodb 20m +``` + +Let's check the YAML of the above `AppBinding`, + +```console +$ kubectl get appbindings -n demo sample-mongodb -o yaml +``` + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + labels: + app.kubernetes.io/component: database + app.kubernetes.io/instance: sample-mongodb + app.kubernetes.io/managed-by: kubedb.com + app.kubernetes.io/name: mongodbs.kubedb.com + name: sample-mongodb + namespace: demo +spec: + clientConfig: + service: + name: sample-mongodb + port: 27017 + scheme: mongodb + secret: + name: sample-mongodb-auth + type: kubedb.com/mongodb + version: "4.2.3" +``` + +Stash uses the `AppBinding` crd to connect with the target database. It requires the following two fields to set in AppBinding's `Spec` section. + +- `spec.clientConfig.service.name` specifies the name of the service that connects to the database. +- `spec.secret` specifies the name of the secret that holds necessary credentials to access the database. +- `spec.type` specifies the types of the app that this AppBinding is pointing to. KubeDB generated AppBinding follows the following format: `/`. + +**Creating AppBinding Manually:** + +If you deploy MongoDB database without KubeDB, you have to create the AppBinding crd manually in the same namespace as the service and secret of the database. + +The following YAML shows a minimal AppBinding specification that you have to create if you deploy MongoDB database without KubeDB. + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: my-custom-appbinding + namespace: my-database-namespace +spec: + clientConfig: + service: + name: my-database-service + port: 27017 + scheme: mongodb + secret: + name: my-database-credentials-secret + # type field is optional. you can keep it empty. + # if you keep it empty then the value of TARGET_APP_RESOURCE variable + # will be set to "appbinding" during auto-backup. + type: mongodb +``` + +**Insert Sample Data:** + +Now, we are going to exec into the database pod and create some sample data. At first, find out the database pod using the following command, + +```console +$ kubectl get pods -n demo --selector="app.kubernetes.io/instance=sample-mongodb" +NAME READY STATUS RESTARTS AGE +sample-mongodb-0 1/1 Running 0 12m +``` + +Now, let's exec into the pod and create a table, + +```console +$ kubectl get secrets -n demo sample-mongodb-auth -o jsonpath='{.data.\username}' | base64 -d +root + +$ kubectl get secrets -n demo sample-mongodb-auth -o jsonpath='{.data.\password}' | base64 -d +Tv1pSiLjGqZ9W4jE + +$ kubectl exec -it -n demo sample-mongodb-0 bash + +mongodb@sample-mongodb-0:/$ mongo admin -u root -p Tv1pSiLjGqZ9W4jE + +> show dbs +admin 0.000GB +local 0.000GB +mydb 0.000GB + +> show users +{ + "_id" : "admin.root", + "user" : "root", + "db" : "admin", + "roles" : [ + { + "role" : "root", + "db" : "admin" + } + ] +} + +> use newdb +switched to db newdb + +> db.movie.insert({"name":"batman"}); +WriteResult({ "nInserted" : 1 }) + +> db.movie.find().pretty() +{ "_id" : ObjectId("5d19d1cdc93d828f44e37735"), "name" : "batman" } + +> exit +bye +``` + +Now, we are ready to backup this sample database. + +### Prepare Backend + +We are going to store our backed up data into a GCS bucket. At first, we need to create a secret with GCS credentials then we need to create a `Repository` crd. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +**Create Storage Secret:** + +Let's create a secret called `gcs-secret` with access credentials to our desired GCS bucket, + +```console +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat downloaded-sa-json.key > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create Repository:** + +Now, crete a `Repository` using this secret. Below is the YAML of Repository crd we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: /demo/mongodb/sample-mongodb + storageSecretName: gcs-secret +``` + +Let's create the `Repository` we have shown above, + +```console +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mongodb/standalone/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our database to our desired backend. + +### Backup + +We have to create a `BackupConfiguration` targeting respective AppBinding crd of our desired database. Then Stash will create a CronJob to periodically backup the database. + +**Create BackupConfiguration:** + +Below is the YAML for `BackupConfiguration` crd to backup the `sample-mongodb` database we have deployed earlier., + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mongodb-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: mongodb-backup-4.2.3 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mongodb + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +Here, + +- `spec.schedule` specifies that we want to backup the database at 5 minutes interval. +- `spec.task.name` specifies the name of the task crd that specifies the necessary Function and their execution order to backup a MongoDB database. +- `spec.target.ref` refers to the `AppBinding` crd that was created for `sample-mongodb` database. + +Let's create the `BackupConfiguration` crd we have shown above, + +```console +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mongodb/standalone/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/sample-mongodb-backup created +``` + +**Verify Backup Setup Successful** + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. Let's verify the `Phase` of the BackupConfiguration, + +```console +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-mongodb-backup mongodb-backup-4.2.3 */5 * * * * Ready 11s +``` + +**Verify CronJob:** + +Stash will create a CronJob with the schedule specified in `spec.schedule` field of `BackupConfiguration` crd. + +Verify that the CronJob has been created using the following command, + +```console +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +sample-mongodb-backup */5 * * * * False 0 61s +``` + +**Wait for BackupSession:** + +The `sample-mongodb-backup` CronJob will trigger a backup on each schedule by creating a `BackpSession` crd. + +Wait for the next schedule. Run the following command to watch `BackupSession` crd, + +```console +$ kubectl get backupsession -n demo -w +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +sample-mongodb-backup-1561974001 BackupConfiguration sample-mongodb-backup Running 5m19s +sample-mongodb-backup-1561974001 BackupConfiguration sample-mongodb-backup Succeeded 5m45s +``` + +We can see above that the backup session has succeeded. Now, we are going to verify that the backed up data has been stored in the backend. + +**Verify Backup:** + +Once a backup is complete, Stash will update the respective `Repository` crd to reflect the backup. Check that the repository `gcs-repo` has been updated by the following command, + +```console +$ kubectl get repository -n demo gcs-repo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo true 1.611 KiB 1 33s 33m +``` + +Now, if we navigate to the GCS bucket, we are going to see backed up data has been stored in `demo/mongodb/sample-mongodb` directory as specified by `spec.backend.gcs.prefix` field of Repository crd. + +> Note: Stash keeps all the backed up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Restore MongoDB + +In this section, we are going to restore the database from the backup we have taken in the previous section. We are going to deploy a new database and initialize it from the backup. + +**Stop Taking Backup of the Old Database:** + +At first, let's stop taking any further backup of the old database so that no backup is taken during restore process. We are going to pause the `BackupConfiguration` crd that we had created to backup the `sample-mongodb` database. Then, Stash will stop taking any further backup for this database. + +Let's pause the `sample-mongodb-backup` BackupConfiguration, + +```console +$ kubectl patch backupconfiguration -n demo sample-mongodb-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/sample-mongodb-backup patched +``` + +Now, wait for a moment. Stash will pause the BackupConfiguration. Verify that the BackupConfiguration has been paused, + +```console +$ kubectl get backupconfiguration -n demo sample-mongodb-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-mongodb-backup mongodb-backup-4.2.3 */5 * * * * true Ready 26m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the BackupConfiguration has been paused. + +**Deploy Restored Database:** + +Now, we have to deploy the restored database similarly as we have deployed the original `sample-psotgres` database. However, this time there will be the following differences: + +- We are going to specify `spec.init.waitForInitialRestore: true` which will tell KubeDB to wait until the first restore to complete before marking this database as ready to use. + +Below is the YAML for `MongoDB` crd we are going deploy to initialize from backup, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MongoDB +metadata: + name: restored-mongodb + namespace: demo +spec: + version: "4.2.3" + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + init: + waitForInitialRestore: true + terminationPolicy: WipeOut +``` + +Let's create the above database, + +```console +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mongodb/standalone/examples/restore/standalone/restored-mongodb.yaml +mongodb.kubedb.com/restored-mongodb created +``` + +If you check the database status, you will see it is stuck in `Provisioning` state. + +```console +$ kubectl get mg -n demo restored-mongodb +NAME VERSION STATUS AGE +restored-mongodb 4.2.3 Provisioning 17s +``` + +**Create RestoreSession:** + +Now, we need to create a `RestoreSession` crd pointing to the AppBinding for this restored database. + +Check AppBinding has been created for the `restored-mongodb` database using the following command, + +```console +$ kubectl get appbindings -n demo restored-mongodb +NAME AGE +restored-mongodb 29s +``` + +> If you are not using KubeDB to deploy database, create the AppBinding manually. + +Below is the YAML for the `RestoreSession` crd that we are going to create to restore backed up data into `restored-mongodb` database. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mongodb-restore + namespace: demo +spec: + task: + name: mongodb-restore-4.2.3 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: restored-mongodb + rules: + - snapshots: [latest] +``` + +Here, + +- `spec.task.name` specifies the name of the `Task` crd that specifies the Functions and their execution order to restore a MongoDB database. +- `spec.repository.name` specifies the `Repository` crd that holds the backend information where our backed up data has been stored. +- `spec.target.ref` refers to the AppBinding crd for the `restored-mongodb` database. +- `spec.rules` specifies that we are restoring from the latest backup snapshot of the database. + +Let's create the `RestoreSession` crd we have shown above, + +```console +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mongodb/standalone/examples/restore/standalone/restoresession.yaml +restoresession.stash.appscode.com/sample-mongodb-restore created +``` + +Once, you have created the `RestoreSession` crd, Stash will create a job to restore. We can watch the `RestoreSession` phase to check if the restore process is succeeded or not. + +Run the following command to watch `RestoreSession` phase, + +```console +$ kubectl get restoresession -n demo sample-mongodb-restore -w +NAME REPOSITORY-NAME PHASE AGE +sample-mongodb-restore gcs-repo Running 5s +sample-mongodb-restore gcs-repo Succeeded 43s +``` + +So, we can see from the output of the above command that the restore process succeeded. + +**Verify Restored Data:** + +In this section, we are going to verify that the desired data has been restored successfully. We are going to connect to the database and check whether the table we had created in the original database is restored or not. + +At first, check if the database has gone into `Running` state by the following command, + +```console +$ kubectl get mg -n demo restored-mongodb +NAME VERSION STATUS AGE +restored-mongodb 4.2.3 Running 105m +``` + +Now, find out the database pod by the following command, + +```console +$ kubectl get pods -n demo --selector="app.kubernetes.io/instance=restored-mongodb" +NAME READY STATUS RESTARTS AGE +restored-mongodb-0 1/1 Running 0 106m +``` + +Now, exec into the database pod and list available tables, + +```console +$ kubectl get secrets -n demo sample-mongodb-auth -o jsonpath='{.data.\username}' | base64 -d +root + +$ kubectl get secrets -n demo sample-mongodb-auth -o jsonpath='{.data.\password}' | base64 -d +Tv1pSiLjGqZ9W4jE + +$ kubectl exec -it -n demo restored-mongodb-0 bash + +mongodb@restored-mongodb-0:/$ mongo admin -u root -p Tv1pSiLjGqZ9W4jE + +> show dbs +admin 0.000GB +config 0.000GB +local 0.000GB +newdb 0.000GB + +> show users +{ + "_id" : "admin.root", + "user" : "root", + "db" : "admin", + "roles" : [ + { + "role" : "root", + "db" : "admin" + } + ] +} + +> use newdb +switched to db newdb + +> db.movie.find().pretty() +{ "_id" : ObjectId("5d19d1cdc93d828f44e37735"), "name" : "batman" } + +> exit +bye +``` + +So, from the above output, we can see the database `newdb` that we had created in the original database `sample-mongodb` is restored in the restored database `restored-mongodb`. + +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```console +kubectl delete -n demo restoresession sample-mongodb-restore sample-mongo +kubectl delete -n demo backupconfiguration sample-mongodb-backup +kubectl delete -n demo mg sample-mongodb sample-mongodb-ssl restored-mongodb +kubectl delete -n demo repository gcs-repo +``` diff --git a/content/docs/v2024.12.18/addons/mysql/README.md b/content/docs/v2024.12.18/addons/mysql/README.md new file mode 100644 index 0000000000..510bb1a1e1 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mysql/README.md @@ -0,0 +1,107 @@ +--- +title: MySQL Addon Overview | Stash +description: MySQL Addon Overview | Stash +menu: + docs_v2024.12.18: + identifier: stash-mysql-readme + name: Readme + parent: stash-mysql + weight: -1 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +url: /docs/v2024.12.18/addons/mysql/ +aliases: +- /docs/v2024.12.18/addons/mysql/README/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash MySQL Addon + +Stash 0.9.0+ supports extending its functionality through addons. Stash MySQL addon enables Stash to backup and restore MySQL databases. + +This guide will give you an overview of which MySQL versions are supported and how the docs are organized. + +## Supported MySQL Versions + +Stash has the following addon versions for MySQL: + +{{< versionlist "mysql">}} + +Here, the addon follows `M.M.P` versioning scheme where `M.M.P` (Major.Minor.Patch) represents the respective database version. + +## Addon Version Compatibility + +Any addon with matching major version with the database version should be able to take backup of that database. For example, MySQL addon with version `8.x.x` should be able take backup of any MySQL of `8.x.x` series. However, this might not be true for some versions. In that case, we will have separate addon for that version. + +## Documentation Overview + +Stash MySQL documentations are organized as below: + +- [How does it work?](/docs/v2024.12.18/addons/mysql/overview/) gives an overview of how backup and restore process for MySQL database works in Stash. +- [Standalone MySQL Database](/docs/v2024.12.18/addons/mysql/standalone/) shows how to backup and restore a standalone MySQL database. diff --git a/content/docs/v2024.12.18/addons/mysql/_index.md b/content/docs/v2024.12.18/addons/mysql/_index.md new file mode 100644 index 0000000000..c58ae5484b --- /dev/null +++ b/content/docs/v2024.12.18/addons/mysql/_index.md @@ -0,0 +1,77 @@ +--- +title: Stash MySQL Addon +menu: + docs_v2024.12.18: + identifier: stash-mysql + name: MySQL + parent: stash-addons + weight: 50 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/addons/mysql/overview/images/backup_overview.svg b/content/docs/v2024.12.18/addons/mysql/overview/images/backup_overview.svg new file mode 100644 index 0000000000..dc71cd59e5 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mysql/overview/images/backup_overview.svg @@ -0,0 +1,997 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/addons/mysql/overview/images/restore_overview.svg b/content/docs/v2024.12.18/addons/mysql/overview/images/restore_overview.svg new file mode 100644 index 0000000000..de6898c060 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mysql/overview/images/restore_overview.svg @@ -0,0 +1,867 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/addons/mysql/overview/index.md b/content/docs/v2024.12.18/addons/mysql/overview/index.md new file mode 100644 index 0000000000..07bff57209 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mysql/overview/index.md @@ -0,0 +1,147 @@ +--- +title: MySQL Backup & Restore Overview | Stash +description: How MySQL Backup & Restore Works in Stash +menu: + docs_v2024.12.18: + identifier: stash-mysql-overview + name: How does it work? + parent: stash-mysql + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# How Stash Backup & Restore MySQL Database + +Stash 0.9.0+ supports backup and restore operation of many databases. This guide will give you an overview of how MySQL database backup and restore process works in Stash. + +## How Backup Works + +The following diagram shows how Stash takes backup of a MySQL database. Open the image in a new tab to see the enlarged version. + +
+  MySQL Backup Overview +
Fig: MySQL Backup Overview
+
+ +The backup process consists of the following steps: + +1. At first, a user creates a secret with access credentials of the backend where the backed up data will be stored. + +2. Then, she creates a `Repository` crd that specifies the backend information along with the secret that holds the credentials to access the backend. + +3. Then, she creates a `BackupConfiguration` crd targeting the [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) crd of the desired database. The `BackupConfiguration` object also specifies the `Task` to use to backup the database. + +4. Stash operator watches for `BackupConfiguration` crd. + +5. Once Stash operator finds a `BackupConfiguration` crd, it creates a CronJob with the schedule specified in `BackupConfiguration` object to trigger backup periodically. + +6. On the next scheduled slot, the CronJob triggers a backup by creating a `BackupSession` crd. + +7. Stash operator also watches for `BackupSession` crd. + +8. When it finds a `BackupSession` object, it resolves the respective `Task` and `Function` and prepares a Job definition to backup. + +9. Then, it creates the Job to backup the targeted database. + +10. The backup Job reads necessary information to connect with the database from the `AppBinding` crd. It also reads backend information and access credentials from `Repository` crd and Storage Secret respectively. + +11. Then, the Job dumps the targeted database and uploads the output to the backend. Stash pipes the output of dump command to uploading process. Hence, backup Job does not require a large volume to hold the entire dump output. + +12. Finally, when the backup is complete, the Job sends Prometheus metrics to the Pushgateway running inside Stash operator pod. It also updates the `BackupSession` and `Repository` status to reflect the backup procedure. + +## How Restore Process Works + +The following diagram shows how Stash restores backed up data into a MySQL database. Open the image in a new tab to see the enlarged version. + +
+  Database Restore Overview +
Fig: MySQL Restore Process Overview
+
+ +The restore process consists of the following steps: + +1. At first, a user creates a `RestoreSession` crd targeting the `AppBinding` of the desired database where the backed up data will be restored. It also specifies the `Repository` crd which holds the backend information and the `Task` to use to restore the target. + +2. Stash operator watches for `RestoreSession` object. + +3. Once it finds a `RestoreSession` object, it resolves the respective `Task` and `Function` and prepares a Job definition to restore. + +4. Then, it creates the Job to restore the target. + +5. The Job reads necessary information to connect with the database from respective `AppBinding` crd. It also reads backend information and access credentials from `Repository` crd and Storage Secret respectively. + +6. Then, the job downloads the backed up data from the backend and injects into the desired database. Stash pipes the downloaded data to the respective database tool to inject into the database. Hence, restore job does not require a large volume to download entire backup data inside it. + +7. Finally, when the restore process is complete, the Job sends Prometheus metrics to the Pushgateway and update the `RestoreSession` status to reflect restore completion. + +## Next Steps + +- Backup MySQL database using Stash following the guide from [here](/docs/v2024.12.18/addons/mysql/standalone/). diff --git a/content/docs/v2024.12.18/addons/mysql/standalone/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/addons/mysql/standalone/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..84b6ad066e --- /dev/null +++ b/content/docs/v2024.12.18/addons/mysql/standalone/examples/backupconfiguration.yaml @@ -0,0 +1,20 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mysql-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: mysql-backup-8.0.21 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mysql + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/mysql/standalone/examples/repository.yaml b/content/docs/v2024.12.18/addons/mysql/standalone/examples/repository.yaml new file mode 100644 index 0000000000..f08f305706 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mysql/standalone/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: /demo/mysql/sample-mysql + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/addons/mysql/standalone/examples/restored-mysql.yaml b/content/docs/v2024.12.18/addons/mysql/standalone/examples/restored-mysql.yaml new file mode 100644 index 0000000000..e4dafcb165 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mysql/standalone/examples/restored-mysql.yaml @@ -0,0 +1,18 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MySQL +metadata: + name: restored-mysql + namespace: demo +spec: + version: "8.0.27" + replicas: 1 + storageType: Durable + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 50Mi + init: + waitForInitialRestore: true + terminationPolicy: WipeOut \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/mysql/standalone/examples/restoresession.yaml b/content/docs/v2024.12.18/addons/mysql/standalone/examples/restoresession.yaml new file mode 100644 index 0000000000..6f1acfe7c3 --- /dev/null +++ b/content/docs/v2024.12.18/addons/mysql/standalone/examples/restoresession.yaml @@ -0,0 +1,17 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: restore-sample-mysql + namespace: demo +spec: + task: + name: mysql-restore-8.0.21 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: restored-mysql + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/addons/mysql/standalone/examples/sample-mysql.yaml b/content/docs/v2024.12.18/addons/mysql/standalone/examples/sample-mysql.yaml new file mode 100644 index 0000000000..52904385da --- /dev/null +++ b/content/docs/v2024.12.18/addons/mysql/standalone/examples/sample-mysql.yaml @@ -0,0 +1,16 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MySQL +metadata: + name: sample-mysql + namespace: demo +spec: + version: "8.0.27" + replicas: 1 + storageType: Durable + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 50Mi + terminationPolicy: WipeOut diff --git a/content/docs/v2024.12.18/addons/mysql/standalone/images/sample-mysql-backup.png b/content/docs/v2024.12.18/addons/mysql/standalone/images/sample-mysql-backup.png new file mode 100644 index 0000000000..242b9dc718 Binary files /dev/null and b/content/docs/v2024.12.18/addons/mysql/standalone/images/sample-mysql-backup.png differ diff --git a/content/docs/v2024.12.18/addons/mysql/standalone/index.md b/content/docs/v2024.12.18/addons/mysql/standalone/index.md new file mode 100644 index 0000000000..b6f7a52dce --- /dev/null +++ b/content/docs/v2024.12.18/addons/mysql/standalone/index.md @@ -0,0 +1,705 @@ +--- +title: Backup & Restore MySQL | Stash +description: Backup a standalone MySQL database using Stash +menu: + docs_v2024.12.18: + identifier: stash-mysql-standalone + name: Standalone MySQL Database + parent: stash-mysql + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup and Restore MySQL database using Stash + +Stash 0.9.0+ supports backup and restoration of MySQL databases. This guide will show you how you can backup and restore your MySQL database with Stash. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using Minikube. +- Install Stash in your cluster following the steps [here](/docs/v2024.12.18/setup/README). +- Install [KubeDB](https://kubedb.com) in your cluster following the steps [here](https://kubedb.com/docs/latest/setup/). This step is optional. You can deploy your database using any method you want. We are using KubeDB because KubeDB simplifies many of the difficult or tedious management tasks of running a production grade databases on private and public clouds. +- If you are not familiar with how Stash backup and restore MySQL databases, please check the following guide [here](/docs/v2024.12.18/addons/mysql/overview/). + +You have to be familiar with following custom resources: + +- [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) +- [Function](/docs/v2024.12.18/concepts/crds/function/) +- [Task](/docs/v2024.12.18/concepts/crds/task/) +- [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) +- [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + +To keep things isolated, we are going to use a separate namespace called `demo` throughout this tutorial. Create `demo` namespace if you haven't created yet. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> Note: YAML files used in this tutorial are stored [here](https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/mysql/standalone/examples). + +## Backup MySQL + +This section will demonstrate how to backup MySQL database. Here, we are going to deploy a MySQL database using KubeDB. Then, we are going to backup this database into a GCS bucket. Finally, we are going to restore the backed up data into another MySQL database. + +### Deploy Sample MySQL Database + +Let's deploy a sample MySQL database and insert some data into it. + +**Create MySQL CRD:** + +Below is the YAML of a sample MySQL CRD that we are going to create for this tutorial: + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MySQL +metadata: + name: sample-mysql + namespace: demo +spec: + version: "8.0.27" + replicas: 1 + storageType: Durable + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 50Mi + terminationPolicy: WipeOut +``` + +Create the above `MySQL` CRD, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mysql/standalone/examples/sample-mysql.yaml +mysql.kubedb.com/sample-mysql created +``` + +KubeDB will deploy a MySQL database according to the above specification. It will also create the necessary Secrets and Services to access the database. + +Let's check if the database is ready to use, + +```bash +$ kubectl get my -n demo sample-mysql +NAME VERSION STATUS AGE +sample-mysql 8.0.14 Ready 4m22s +``` + +The database is `Ready`. Verify that KubeDB has created a Secret and a Service for this database using the following commands, + +```bash +$ kubectl get secret -n demo -l=app.kubernetes.io/instance=sample-mysql +NAME TYPE DATA AGE +sample-mysql-auth Opaque 2 4m58s + +$ kubectl get service -n demo -l=app.kubernetes.io/instance=sample-mysql +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +sample-mysql ClusterIP 10.101.2.138 3306/TCP 5m33s +sample-mysql-gvr ClusterIP None 3306/TCP 5m33s +``` + +Here, we have to use service `sample-mysql` and secret `sample-mysql-auth` to connect with the database. KubeDB creates an [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) CRD that holds the necessary information to connect with the database. + +**Verify AppBinding:** + +Verify that the AppBinding has been created successfully using the following command, + +```bash +$ kubectl get appbindings -n demo +NAME AGE +sample-mysql 9m24s +``` + +Let's check the YAML of the above AppBinding, + +```bash +$ kubectl get appbindings -n demo sample-mysql -o yaml +``` + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + creationTimestamp: "2019-09-27T05:07:34Z" + generation: 1 + labels: + app.kubernetes.io/component: database + app.kubernetes.io/instance: sample-mysql + app.kubernetes.io/managed-by: kubedb.com + app.kubernetes.io/name: mysqls.kubedb.com + name: sample-mysql + namespace: demo +spec: + clientConfig: + service: + name: sample-mysql + path: / + port: 3306 + scheme: mysql + url: tcp(sample-mysql:3306)/ + secret: + name: sample-mysql-auth + type: kubedb.com/mysql + version: "8.0.21" +``` + +Stash uses the AppBinding CRD to connect with the target database. It requires the following two fields to set in AppBinding's `.spec` section. + +- `.spec.clientConfig.service.name` specifies the name of the Service that connects to the database. +- `.spec.secret` specifies the name of the Secret that holds necessary credentials to access the database. +- `spec.type` specifies the types of the app that this AppBinding is pointing to. KubeDB generated AppBinding follows the following format: `/`. + +**Creating AppBinding Manually:** + +If you deploy MySQL database without KubeDB, you have to create the AppBinding CRD manually in the same namespace as the service and secret of the database. + +The following YAML shows a minimal AppBinding specification that you have to create if you deploy MySQL database without KubeDB. + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: my-custom-appbinding-name + namespace: my-database-namespace +spec: + clientConfig: + service: + name: my-database-service-name + port: 3306 # my_database_port_number + scheme: mysql + secret: + name: my-database-credentials-secret-name + # type field is optional. you can keep it empty. + # if you keep it empty then the value of TARGET_APP_RESOURCE variable + # will be set to "appbinding" during auto-backup. + type: mysql +``` + +You have to replace the `<...>` quoted part with proper values in the above YAML. + +**Insert Sample Data:** + +Now, we are going to exec into the database pod and create some sample data. At first, find out the database Pod using the following command, + +```bash +$ kubectl get pods -n demo --selector="app.kubernetes.io/instance=sample-mysql" +NAME READY STATUS RESTARTS AGE +sample-mysql-0 1/1 Running 0 33m +``` + +And copy the user name and password of the `root` user to access into `mysql` shell. + +```bash +$ kubectl get secret -n demo sample-mysql-auth -o jsonpath='{.data.username}'| base64 -d +root⏎ + +$ kubectl get secret -n demo sample-mysql-auth -o jsonpath='{.data.password}'| base64 -d +5HEqoozyjgaMO97N⏎ +``` + +Now, let's exec into the Pod to enter into `mysql` shell and create a database and a table, + +```bash +$ kubectl exec -it -n demo sample-mysql-0 -- mysql --user=root --password=5HEqoozyjgaMO97N +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 10 +Server version: 8.0.14 MySQL Community Server - GPL + +Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> CREATE DATABASE playground; +Query OK, 1 row affected (0.01 sec) + +mysql> SHOW DATABASES; ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| mysql | +| performance_schema | +| playground | +| sys | ++--------------------+ +5 rows in set (0.00 sec) + +mysql> CREATE TABLE playground.equipment ( id INT NOT NULL AUTO_INCREMENT, type VARCHAR(50), quant INT, color VARCHAR(25), PRIMARY KEY(id)); +Query OK, 0 rows affected (0.01 sec) + +mysql> SHOW TABLES IN playground; ++----------------------+ +| Tables_in_playground | ++----------------------+ +| equipment | ++----------------------+ +1 row in set (0.01 sec) + +mysql> INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue"); +Query OK, 1 row affected (0.01 sec) + +mysql> SELECT * FROM playground.equipment; ++----+-------+-------+-------+ +| id | type | quant | color | ++----+-------+-------+-------+ +| 1 | slide | 2 | blue | ++----+-------+-------+-------+ +1 row in set (0.00 sec) + +mysql> exit +Bye +``` + +Now, we are ready to backup the database. + +### Prepare Backend + +We are going to store our backed up data into a GCS bucket. At first, we need to create a secret with GCS credentials then we need to create a `Repository` CRD. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +**Create Storage Secret:** + +Let's create a secret called `gcs-secret` with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat downloaded-sa-json.key > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create Repository:** + +Now, crete a `Repository` using this secret. Below is the YAML of Repository CRD we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: /demo/mysql/sample-mysql + storageSecretName: gcs-secret +``` + +Let's create the `Repository` we have shown above, + +```bash +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mysql/standalone/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our database to our desired backend. + +### Backup + +We have to create a `BackupConfiguration` targeting respective AppBinding CRD of our desired database. Then Stash will create a CronJob to periodically backup the database. + +**Create BackupConfiguration:** + +Below is the YAML for `BackupConfiguration` CRD to backup the `sample-mysql` database we have deployed earlier, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mysql-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: mysql-backup-8.0.21 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mysql + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +Here, + +- `.spec.schedule` specifies that we want to backup the database at 5 minutes interval. +- `.spec.task.name` specifies the name of the Task CRD that specifies the necessary Functions and their execution order to backup a MySQL database. +- `.spec.target.ref` refers to the AppBinding CRD that was created for `sample-mysql` database. + +Let's create the `BackupConfiguration` CRD we have shown above, + +```bash +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mysql/standalone/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/sample-mysql-backup created +``` + +**Verify Backup Setup Successful** + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. Let's verify the `Phase` of the BackupConfiguration, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-mysql-backup mysql-backup-8.0.21 */5 * * * * Ready 11s +``` + +**Verify CronJob:** + +Stash will create a CronJob with the schedule specified in `spec.schedule` field of `BackupConfiguration` CRD. + +Verify that the CronJob has been created using the following command, + +```bash +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +sample-mysql-backup */5 * * * * False 0 27s +``` + +**Wait for BackupSession:** + +The `sample-mysql-backup` CronJob will trigger a backup on each scheduled slot by creating a `BackupSession` CRD. + +Wait for a schedule to appear. Run the following command to watch `BackupSession` CRD, + +```bash +$ watch -n 1 kubectl get backupsession -n demo -l=stash.appscode.com/backup-configuration=sample-mysql-backup + +Every 1.0s: kubectl get backupsession -n demo -l=stash.appscode.com/backup-configuration=sample-mysql-backup workstation: Fri Sep 27 11:14:43 2019 + +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +sample-mysql-backup-1569561245 BackupConfiguration sample-mysql-backup Succeeded 38s +``` + +Here, the phase **`Succeeded`** means that the backupsession has been succeeded. + +>Note: Backup CronJob creates `BackupSession` crds with the following label `stash.appscode.com/backup-configuration=`. We can use this label to watch only the `BackupSession` of our desired `BackupConfiguration`. + +**Verify Backup:** + +Now, we are going to verify whether the backed up data is in the backend. Once a backup is completed, Stash will update the respective `Repository` CRD to reflect the backup completion. Check that the repository `gcs-repo` has been updated by the following command, + +```bash +$ kubectl get repository -n demo gcs-repo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo true 6.815 MiB 1 3m39s 30m +``` + +Now, if we navigate to the GCS bucket, we will see the backed up data has been stored in `demo/mysql/sample-mysql` directory as specified by `.spec.backend.gcs.prefix` field of Repository CRD. + +
+  Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +> Note: Stash keeps all the backed up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Restore MySQL + +In this section, we are going to restore the database from the backup we have taken in the previous section. We are going to deploy a new database and initialize it from the backup. + +**Stop Taking Backup of the Old Database:** + +At first, let's stop taking any further backup of the old database so that no backup is taken during restore process. We are going to pause the `BackupConfiguration` crd that we had created to backup the `sample-mysql` database. Then, Stash will stop taking any further backup for this database. + +Let's pause the `sample-mysql-backup` BackupConfiguration, + +```console +$ kubectl patch backupconfiguration -n demo sample-mysql-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/sample-mysql-backup patched +``` + +Now, wait for a moment. Stash will pause the BackupConfiguration. Verify that the BackupConfiguration has been paused, + +```console +$ kubectl get backupconfiguration -n demo sample-mysql-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-mysql-backup mysql-backup-8.0.21 */5 * * * * true Ready 26m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the BackupConfiguration has been paused. + +**Deploy Restored Database:** + +Now, we have to deploy the restored database similarly as we have deployed the original `sample-mysql` database. However, this time there will be the following differences: + +- We are going to specify `spec.init.waitForInitialRestore: true` which will tell KubeDB to wait until the first restore to complete before marking this database as ready to use. + +Below is the YAML for `MySQL` CRD we are going deploy to initialize from backup, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MySQL +metadata: + name: restored-mysql + namespace: demo +spec: + version: "8.0.27" + replicas: 1 + storageType: Durable + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 50Mi + init: + waitForInitialRestore: true + terminationPolicy: WipeOut +``` + +Let's create the above database, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mysql/standalone/examples/restored-mysql.yaml +mysql.kubedb.com/restored-mysql created +``` + +If you check the database status, you will see it is stuck in **`Provisioning`** state. + +```bash +$ kubectl get my -n demo restored-mysql +NAME VERSION STATUS AGE +restored-mysql 8.0.14 Provisioning 61s +``` + +**Create RestoreSession:** + +Now, we need to create a RestoreSession CRD pointing to the AppBinding for this restored database. + +Using the following command, check that another AppBinding object has been created for the `restored-mysql` object, + +```bash +$ kubectl get appbindings -n demo restored-mysql +NAME AGE +restored-mysql 6m6s +``` + +> If you are not using KubeDB to deploy database, create the AppBinding manually. + +Below is the contents of YAML file of the RestoreSession CRD that we are going to create to restore backed up data into the newly created database provisioned by MySQL CRD named `restored-mysql`. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mysql-restore + namespace: demo +spec: + task: + name: mysql-restore-8.0.21 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: restored-mysql + rules: + - snapshots: [latest] +``` + +Here, + +- `.spec.task.name` specifies the name of the Task CRD that specifies the necessary Functions and their execution order to restore a MySQL database. +- `.spec.repository.name` specifies the Repository CRD that holds the backend information where our backed up data has been stored. +- `.spec.target.ref` refers to the newly created AppBinding object for the `restored-mysql` MySQL object. +- `.spec.rules` specifies that we are restoring data from the latest backup snapshot of the database. + +Let's create the RestoreSession CRD object we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/mysql/standalone/examples/restoresession.yaml +restoresession.stash.appscode.com/sample-mysql-restore created +``` + +Once, you have created the RestoreSession object, Stash will create a restore Job. We can watch the phase of the RestoreSession object to check whether the restore process has succeeded or not. + +Run the following command to watch the phase of the RestoreSession object, + +```bash +$ watch -n 1 kubectl get restoresession -n demo restore-sample-mysql + +Every 1.0s: kubectl get restoresession -n demo restore-sample-mysql workstation: Fri Sep 27 11:18:51 2019 +NAMESPACE NAME REPOSITORY-NAME PHASE AGE +demo restore-sample-mysql gcs-repo Succeeded 59s +``` + +Here, we can see from the output of the above command that the restore process succeeded. + +**Verify Restored Data:** + +In this section, we are going to verify whether the desired data has been restored successfully. We are going to connect to the database server and check whether the database and the table we created earlier in the original database are restored. + +At first, check if the database has gone into **`Running`** state by the following command, + +```bash +$ kubectl get my -n demo restored-mysql +NAME VERSION STATUS AGE +restored-mysql 8.0.14 Ready 34m +``` + +Now, find out the database Pod by the following command, + +```bash +$ kubectl get pods -n demo --selector="app.kubernetes.io/instance=restored-mysql" +NAME READY STATUS RESTARTS AGE +restored-mysql-0 1/1 Running 0 39m +``` + +And then copy the user name and password of the `root` user to access into `mysql` shell. + +> Notice: We used the same Secret for the `restored-mysql` object. So, we will use the same commands as before. + +```bash +$ kubectl get secret -n demo restored-mysql-auth -o jsonpath='{.data.username}'| base64 -d +root⏎ + +$ kubectl get secret -n demo restored-mysql-auth -o jsonpath='{.data.password}'| base64 -d +x*Tw66CEDZ_kj16y⏎ +``` + +Now, let's exec into the Pod to enter into `mysql` shell and create a database and a table, + +```bash +$ kubectl exec -it -n demo restored-mysql-0 -- mysql --user=root --password=5HEqoozyjgaMO97N +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 9 +Server version: 8.0.14 MySQL Community Server - GPL + +Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> SHOW DATABASES; ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| mysql | +| performance_schema | +| playground | +| sys | ++--------------------+ +5 rows in set (0.00 sec) + +mysql> SHOW TABLES IN playground; ++----------------------+ +| Tables_in_playground | ++----------------------+ +| equipment | ++----------------------+ +1 row in set (0.00 sec) + +mysql> SELECT * FROM playground.equipment; ++----+-------+-------+-------+ +| id | type | quant | color | ++----+-------+-------+-------+ +| 1 | slide | 2 | blue | ++----+-------+-------+-------+ +1 row in set (0.00 sec) + +mysql> exit +Bye +``` + +So, from the above output, we can see that the `playground` database and the `equipment` table we created earlier in the original database and now, they are restored successfully. + +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete backupconfiguration -n demo sample-mysql-backup +kubectl delete restoresession -n demo restore-sample-mysql +kubectl delete repository -n demo gcs-repo +kubectl delete my -n demo restored-mysql +kubectl delete my -n demo sample-mysql +``` diff --git a/content/docs/v2024.12.18/addons/nats/README.md b/content/docs/v2024.12.18/addons/nats/README.md new file mode 100644 index 0000000000..ee9808ee4c --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/README.md @@ -0,0 +1,114 @@ +--- +title: NATS Addon Overview | Stash +description: NATS Addon Overview | Stash +menu: + docs_v2024.12.18: + identifier: stash-nats-readme + name: Readme + parent: stash-nats + weight: -1 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +url: /docs/v2024.12.18/addons/nats/ +aliases: +- /docs/v2024.12.18/addons/nats/README/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash NATS Addon + +Stash `{{< param "info.version" >}}` supports extending its functionality through addons. Stash NATS addon enables Stash to backup and restore NATS streams. + +This guide will give you an overview of which NATS versions are supported and how the docs are organized. + +## Supported NATS Versions + +Stash has the following addon versions for NATS: + +{{< versionlist "nats">}} + +Here, the addon follows `M.M.P` versioning scheme where `M.M.P` (Major.Minor.Patch) represents the respective NATS version. + +## Addon Version Compatibility + +This addon with matching major version with the NATS version should be able to take backup of that NATS streams. For example, NATS addon with version `2.x.x` should be able take backup of any NATS of `2.x.x` series. However, this might not be true for some versions. In that case, we will have separate addon for that version. + +## Documentation Overview + +Stash NATS documentations are organized as below: + +- [How does it work?](/docs/v2024.12.18/addons/nats/overview/) gives an overview of how backup and restore process for NATS works in Stash. +- [Helm managed NATS](/docs/v2024.12.18/addons/nats/helm/) shows how to backup and restore a Helm managed NATS. +- **Different authentications:** shows how to backup and restore NATS using different authentication methods. + - [Basic Authentication](/docs/v2024.12.18/addons/nats/authentications/basic-auth/) + - [Token Authentication](/docs/v2024.12.18/addons/nats/authentications/token-auth/) + - [Nkey Authentication](/docs/v2024.12.18/addons/nats/authentications/nkey-auth/) + - [JWT Authentication](/docs/v2024.12.18/addons/nats/authentications/jwt-auth/) +- [TLS secured NATS](/docs/v2024.12.18/addons/nats/tls/) shows how to backup and restore TLS secured NATS. +- [Customizing Backup & Restore Process](/docs/v2024.12.18/addons/nats/customization/) shows how to customize the backup & restore process. diff --git a/content/docs/v2024.12.18/addons/nats/_index.md b/content/docs/v2024.12.18/addons/nats/_index.md new file mode 100644 index 0000000000..8b4439e7a4 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/_index.md @@ -0,0 +1,77 @@ +--- +title: Stash NATS Addon +menu: + docs_v2024.12.18: + identifier: stash-nats + name: NATS + parent: stash-addons + weight: 90 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/addons/nats/authentications/_index.md b/content/docs/v2024.12.18/addons/nats/authentications/_index.md new file mode 100644 index 0000000000..793198bcbe --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/authentications/_index.md @@ -0,0 +1,80 @@ +--- +title: NATS with authentication +description: Backup and restore NATS streams using different authentication methods with Stash +menu: + docs_v2024.12.18: + identifier: stash-nats-auth + name: Authentication + parent: stash-nats + weight: 30 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/addons/nats/authentications/basic-auth/examples/appbinding.yaml b/content/docs/v2024.12.18/addons/nats/authentications/basic-auth/examples/appbinding.yaml new file mode 100644 index 0000000000..7e4a9e8c29 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/authentications/basic-auth/examples/appbinding.yaml @@ -0,0 +1,17 @@ +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + labels: + app.kubernetes.io/instance: sample-nats + name: sample-nats + namespace: demo +spec: + clientConfig: + service: + name: sample-nats + port: 4222 + scheme: nats + secret: + name: sample-nats-auth + type: nats.io/nats + version: 2.6.1 diff --git a/content/docs/v2024.12.18/addons/nats/authentications/basic-auth/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/addons/nats/authentications/basic-auth/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..3e1fe9fabd --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/authentications/basic-auth/examples/backupconfiguration.yaml @@ -0,0 +1,29 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-nats-backup + namespace: demo +spec: + task: + name: nats-backup-2.6.1 + schedule: "*/5 * * * *" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + interimVolumeTemplate: + metadata: + name: sample-nats-backup-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/nats/authentications/basic-auth/examples/repository.yaml b/content/docs/v2024.12.18/addons/nats/authentications/basic-auth/examples/repository.yaml new file mode 100644 index 0000000000..dae91419b2 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/authentications/basic-auth/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /demo/nats/sample-nats + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/addons/nats/authentications/basic-auth/examples/restoresession.yaml b/content/docs/v2024.12.18/addons/nats/authentications/basic-auth/examples/restoresession.yaml new file mode 100644 index 0000000000..9c5f52422a --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/authentications/basic-auth/examples/restoresession.yaml @@ -0,0 +1,26 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-nats-restore + namespace: demo +spec: + task: + name: nats-restore-2.6.1 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + interimVolumeTemplate: + metadata: + name: nats-restore-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/addons/nats/authentications/basic-auth/examples/secret.yaml b/content/docs/v2024.12.18/addons/nats/authentications/basic-auth/examples/secret.yaml new file mode 100644 index 0000000000..d83d02ad6e --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/authentications/basic-auth/examples/secret.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: Secret +metadata: + labels: + app.kubernetes.io/instance: sample-nats + name: sample-nats-auth + namespace: demo +data: + password: MjIy + username: dTI= diff --git a/content/docs/v2024.12.18/addons/nats/authentications/basic-auth/images/sample-nats-backup.png b/content/docs/v2024.12.18/addons/nats/authentications/basic-auth/images/sample-nats-backup.png new file mode 100644 index 0000000000..b3f603de78 Binary files /dev/null and b/content/docs/v2024.12.18/addons/nats/authentications/basic-auth/images/sample-nats-backup.png differ diff --git a/content/docs/v2024.12.18/addons/nats/authentications/basic-auth/index.md b/content/docs/v2024.12.18/addons/nats/authentications/basic-auth/index.md new file mode 100644 index 0000000000..8b97470129 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/authentications/basic-auth/index.md @@ -0,0 +1,724 @@ +--- +title: NATS with Basic authentication +description: Backup NATS with Basic authentication using Stash +menu: + docs_v2024.12.18: + identifier: stash-nats-basic-auth + name: Basic Authentication + parent: stash-nats-auth + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup NATS with Basic Authentication using Stash + +Stash `{{< param "info.version" >}}` supports backup and restoration of NATS streams. This guide will show you how you can backup & restore a NATS server with basic authentication using Stash. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. +- Install Stash in your cluster following the steps [here](/docs/v2024.12.18/setup/install/stash/). +- If you are not familiar with how Stash backup and restore NATS streams, please check the following guide [here](/docs/v2024.12.18/addons/nats/overview/). + +You have to be familiar with following custom resources: + +- [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) +- [Function](/docs/v2024.12.18/concepts/crds/function/) +- [Task](/docs/v2024.12.18/concepts/crds/task/) +- [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) +- [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) +- [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + +To keep things isolated, we are going to use a separate namespace called `demo` throughout this tutorial. Create `demo` namespace if you haven't created already. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> Note: YAML files used in this tutorial are stored [here](https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/nats/authentications/basic-auth/examples). + +## Prepare NATS + +In this section, we are going to deploy a NATS cluster with basic authentication enabled. Then, we are going to create a stream and publish some messages into it. + +### Deploy NATS Cluster + +At first, let's deploy a NATS cluster. Here, we are going to use [NATS](https://github.com/nats-io/k8s/tree/main/helm/charts/nats ) chart from [nats.io](https://nats.io/). + +Let's deploy a NATS cluster named `sample-nats` using Helm as below, + +```bash +# Add nats chart registry +$ helm repo add nats https://nats-io.github.io/k8s/helm/charts/ +# Update helm registries +$ helm repo update +# Install nats/nats chart into demo namespace +$ helm install sample-nats nats/nats -n demo \ +--set nats.jetstream.enabled=true \ +--set nats.jetstream.fileStorage.enabled=true \ +--set cluster.enabled=true \ +--set cluster.replicas=3 \ +--set auth.enabled=true \ +--set-string auth.basic.users[0].user="sample-user",auth.basic.users[0].password="changeit" +``` + +This chart will create the necessary StatefulSet, Service, PVCs etc. for the NATS cluster. You can easily view all the resources created by chart using [ketall](https://github.com/corneliusweig/ketall) `kubectl` plugin as below, + +```bash +❯ kubectl get-all -n demo -l app.kubernetes.io/instance=sample-nats +NAME NAMESPACE AGE +configmap/sample-nats-config demo 11m +endpoints/sample-nats demo 11m +persistentvolumeclaim/sample-nats-js-pvc-sample-nats-0 demo 11m +persistentvolumeclaim/sample-nats-js-pvc-sample-nats-1 demo 10m +persistentvolumeclaim/sample-nats-js-pvc-sample-nats-2 demo 10m +pod/sample-nats-0 demo 11m +pod/sample-nats-1 demo 10m +pod/sample-nats-2 demo 10m +service/sample-nats demo 11m +controllerrevision.apps/sample-nats-775468b94f demo 11m +statefulset.apps/sample-nats demo 11m +endpointslice.discovery.k8s.io/sample-nats-7n7v6 demo 11m +``` + +Now, wait for the NATS server pods `sample-nats-0`, `sample-nats-1`, `sample-nats-2` to go into `Running` state, + +```bash +❯ kubectl get pod -n demo -l app.kubernetes.io/instance=sample-nats +NAME READY STATUS RESTARTS AGE +sample-nats-0 3/3 Running 0 9m58s +sample-nats-1 3/3 Running 0 9m35s +sample-nats-2 3/3 Running 0 9m12s +``` + +Once the pods are in `Running` state, verify that the NATS server is ready to accept the connections. + +```bash +❯ kubectl logs -n demo sample-nats-0 -c nats +[7] 2021/09/06 08:33:53.111508 [INF] Starting nats-server +[7] 2021/09/06 08:33:53.111560 [INF] Version: 2.6.1 +... +[7] 2021/09/06 08:33:53.116004 [INF] Server is ready +``` + +From the above log, we can see the NATS server is ready to accept connections. + +### Insert Sample Data + +The above Helm chart also deploy a pod with nats-box image which can be used to interact with the NATS server. Let's verify the nats-box pod has been created. + +```bash +❯ kubectl get pod -n demo -l app=sample-nats-box +NAME READY STATUS RESTARTS AGE +sample-nats-box-785f8458d7-wtnfx 1/1 Running 0 7m20s +``` + +Let's exec into the nats-box pod, + +```bash +❯ kubectl exec -n demo -it sample-nats-box-785f8458d7-wtnfx -- sh -l +... +# Let's export the username and password as environment variables to make further commands re-usable. +sample-nats-box-785f8458d7-wtnfx:~# export NATS_USER=sample-user +sample-nats-box-785f8458d7-wtnfx:~# export NATS_PASSWORD=changeit + +# Let's create a stream named "ORDERS" +sample-nats-box-785f8458d7-wtnfx:~# nats stream add ORDERS --subjects "ORDERS.*" --ack --max-msgs=-1 --max-bytes=-1 --max-age=1y --storage file --retention limits --max-msg-size=-1 --max-msgs-per-subject=-1 --discard old --dupe-window="0s" --replicas 1 +Stream ORDERS was created + +Information for Stream ORDERS created 2021-09-03T07:12:07Z + +Configuration: + + Subjects: ORDERS.* + Acknowledgements: true + Retention: File - Limits + Replicas: 1 + Discard Policy: Old + Duplicate Window: 2m0s + Maximum Messages: unlimited + Maximum Bytes: unlimited + Maximum Age: 1y0d0h0m0s + Maximum Message Size: unlimited + Maximum Consumers: unlimited + + +Cluster Information: + + Name: nats + Leader: nats-0 + +State: + + Messages: 0 + Bytes: 0 B + FirstSeq: 0 + LastSeq: 0 + Active Consumers: 0 + + +# Verify that the stream has been created successfully +sample-nats-box-785f8458d7-wtnfx:~# nats stream ls +Streams: + + ORDERS + +# Lets add some messages to the stream "ORDERS" +sample-nats-box-785f8458d7-wtnfx:~# nats pub ORDERS.scratch hello +08:55:39 Published 5 bytes to "ORDERS.scratch" + +# Add another message +sample-nats-box-785f8458d7-wtnfx:~# nats pub ORDERS.scratch world +08:56:11 Published 5 bytes to "ORDERS.scratch" + +# Verify that the messages have been published to the stream successfully +sample-nats-box-785f8458d7-wtnfx:~# nats stream info ORDERS +Information for Stream ORDERS created 2021-09-03T07:12:07Z + +Configuration: + + Subjects: ORDERS.* + Acknowledgements: true + Retention: File - Limits + Replicas: 1 + Discard Policy: Old + Duplicate Window: 2m0s + Maximum Messages: unlimited + Maximum Bytes: unlimited + Maximum Age: 1y0d0h0m0s + Maximum Message Size: unlimited + Maximum Consumers: unlimited + + +Cluster Information: + + Name: nats + Leader: nats-0 + +State: + + Messages: 2 + Bytes: 98 B + FirstSeq: 1 @ 2021-09-03T08:55:39 UTC + LastSeq: 2 @ 2021-09-03T08:56:11 UTC + Active Consumers: 0 + +sample-nats-box-785f8458d7-wtnfx:~# exit +``` + +We have successfully deployed a NATS cluster, created a stream and publish some messages into the stream. In the subsequent sections, we are going to backup this sample data using Stash. + +## Prepare for Backup + +In this section, we are going to prepare the necessary resources (i.e. connection information, backend information, etc.) before backup. + +### Ensure NATS Addon + +When you install Stash, it will automatically install all the official addons. Make sure that NATS addon has been installed properly using the following command. + +```bash +❯ kubectl get tasks.stash.appscode.com | grep nats +nats-backup-2.6.1 24m +nats-restore-2.6.1 24m +``` + +This addon should be able to take backup of the NATS streams with matching major versions as discussed in [Addon Version Compatibility](/docs/v2024.12.18/addons/nats/README#addon-version-compatibility). + +### Create Secret + + Lets create a secret with basic auth credentials. Below is the YAML of `Secret` object we are going to create. + +```yaml +apiVersion: v1 +kind: Secret +metadata: + labels: + app.kubernetes.io/instance: sample-nats + name: sample-nats-auth + namespace: demo +data: + password: Y2hhbmdlaXQ= + username: c2FtcGxlLXVzZXI= +``` + +Let's create the `Secret` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/nats/authentications/basic-auth/examples/secret.yaml +secret/sample-nats-auth created +``` + + + +### Create AppBinding + +Stash needs to know how to connect with the NATS server. An `AppBinding` exactly provides this information. It holds the Service and Secret information of the NATS server. You have to point to the respective `AppBinding` as a target of backup instead of the NATS server itself. + +Here, is the YAML of the `AppBinding` that we are going to create for the NATS server we have deployed earlier. + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + labels: + app.kubernetes.io/instance: sample-nats + name: sample-nats + namespace: demo +spec: + clientConfig: + service: + name: sample-nats + port: 4222 + scheme: nats + secret: + name: sample-nats-auth + type: nats.io/nats + version: 2.6.1 +``` + +Here, + +- `.spec.clientConfig.service` specifies the Service information to use to connects with the NATS server. +- `.spec.secret` specifies the name of the Secret that holds necessary credentials to access the server. +- `spec.type` specifies the type of the target. This is particularly helpful in auto-backup where you want to use different path prefixes for different types of target. + +Let's create the `AppBinding` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/nats/authentications/basic-auth/examples/appbinding.yaml +appbinding.appcatalog.appscode.com/sample-nats created +``` + +### Prepare Backend + +We are going to store our backed up data into a GCS bucket. So, we need to create a Secret with GCS credentials and a `Repository` object with the bucket information. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +**Create Storage Secret:** + +At first, let's create a secret called `gcs-secret` with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat downloaded-sa-json.key > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create Repository:** + +Now, create a `Repository` object with the information of your desired bucket. Below is the YAML of `Repository` object we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /demo/nats/sample-nats + storageSecretName: gcs-secret +``` + +Let's create the `Repository` we have shown above, + +```bash +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/nats/authentications/basic-auth/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our streams into our desired backend. + +### Backup + +To schedule a backup, we have to create a `BackupConfiguration` object targeting the respective `AppBinding` of our NATS server. Then, Stash will create a CronJob to periodically backup the streams. + +#### Create BackupConfiguration + +Below is the YAML for `BackupConfiguration` object that we are going to use to backup the streams of the NATS server we have created earlier, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-nats-backup + namespace: demo +spec: + task: + name: nats-backup-2.6.1 + schedule: "*/5 * * * *" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + interimVolumeTemplate: + metadata: + name: sample-nats-backup-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +Here, + +- `.spec.schedule` specifies that we want to backup the streams at 5 minutes intervals. +- `.spec.task.name` specifies the name of the Task object that specifies the necessary Functions and their execution order to backup NATS streams. +- `.spec.repository.name` specifies the Repository CR name we have created earlier with backend information. +- `.spec.target.ref` refers to the AppBinding object that holds the connection information of our targeted NATS server. +- `spec.interimVolumeTemplate` specifies a PVC template that will be used by Stash to hold the dumped data temporarily before uploading it into the cloud bucket. +- `.spec.retentionPolicy` specifies a policy indicating how we want to cleanup the old backups. + +Let's create the `BackupConfiguration` object we have shown above, + +```bash +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/nats/authentications/basic-auth/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/sample-nats-backup created +``` + +#### Verify Backup Setup Successful + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. Let's verify the `Phase` of the BackupConfiguration, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-nats-backup nats-backup-2.6.1 */5 * * * * Ready 11s +``` +#### Verify CronJob + +Stash will create a CronJob with the schedule specified in `spec.schedule` field of `BackupConfiguration` object. + +Verify that the CronJob has been created using the following command, + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-nats-backup */5 * * * * False 0 14s +``` + +#### Wait for BackupSession + +The `sample-nats-backup` CronJob will trigger a backup on each scheduled slot by creating a `BackupSession` object. + +Now, wait for a schedule to appear. Run the following command to watch for `BackupSession` object, + +```bash +❯ kubectl get backupsession -n demo -w +NAME INVOKER-TYPE INVOKER-NAME PHASE DURATION AGE +sample-nats-backup-8x8fp BackupConfiguration sample-nats-backup Succeeded 42s 8m28s +``` + +Here, the phase `Succeeded` means that the backup process has been completed successfully. + +#### Verify Backup + +Now, we are going to verify whether the backed up data is present in the backend or not. Once a backup is completed, Stash will update the respective `Repository` object to reflect the backup completion. Check that the repository `gcs-repo` has been updated by the following command, + +```bash +❯ kubectl get repository -n demo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo true 1.382 KiB 1 9m4s 24m +``` + +Now, if we navigate to the GCS bucket, we will see the backed up data has been stored in `demo/nats/sample-nats` directory as specified by `.spec.backend.gcs.prefix` field of the `Repository` object. + +
+ Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +> Note: Stash keeps all the backed up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Restore + +If you have followed the previous sections properly, you should have a successful backup of your NATS streams. Now, we are going to show how you can restore the streams from the backed up data. + +### Restore Into the Same NATS Cluster + +You can restore your data into the same nats cluster you have backed up from or into a different NATS cluster in the same cluster or a different cluster. In this section, we are going to show you how to restore in the same nats cluster which may be necessary when you have accidentally lost any data. + +#### Temporarily Pause Backup + +At first, let's stop taking any further backup of the NATS streams so that no backup runs after we delete the sample data. We are going to pause the `BackupConfiguration` object. Stash will stop taking any further backup when the `BackupConfiguration` is paused. + +Let's pause the `sample-nats-backup` BackupConfiguration, + +```bash +$ kubectl patch backupconfiguration -n demo sample-nats-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/sample-nats-backup patched +``` + +Verify that the `BackupConfiguration` has been paused, + +```bash +❯ kubectl get backupconfiguration -n demo sample-nats-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-nats-backup nats-backup-2.6.1 */5 * * * * true Ready 2d18h +``` + +Notice the `PAUSED` column. Value `true` for this field means that the `BackupConfiguration` has been paused. + +Stash will also suspend the respective CronJob. + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-nats-backup */5 * * * * True 0 56s 2d18h +``` + +#### Simulate Disaster + +Now, let's simulate a disaster scenario. Here, we are going to exec into the nats-box pod and delete the sample data we have inserted earlier. + +```bash +❯ kubectl exec -n demo -it sample-nats-box-785f8458d7-wtnfx -- sh -l +... +# Let's export the username and password as environment variables to make further commands re-usable. +sample-nats-box-785f8458d7-wtnfx:~# export NATS_USER=sample-user +sample-nats-box-785f8458d7-wtnfx:~# export NATS_PASSWORD=changeit + +# delete the stream "ORDERS" +sample-nats-box-785f8458d7-wtnfx:~# nats stream rm ORDERS -f + +# verify that the stream has been deleted +sample-nats-box-785f8458d7-wtnfx:~# nats stream ls +No Streams defined +sample-nats-box-785f8458d7-wtnfx:~# exit +``` + +#### Create RestoreSession + +To restore the streams, you have to create a `RestoreSession` object pointing to the `AppBinding` of the targeted NATS server. + +Here, is the YAML of the `RestoreSession` object that we are going to use for restoring the streams of the NATS server. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-nats-restore + namespace: demo +spec: + task: + name: nats-restore-2.6.1 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + interimVolumeTemplate: + metadata: + name: nats-restore-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + rules: + - snapshots: [latest] +``` + +Here, + +- `.spec.task.name` specifies the name of the Task object that specifies the necessary Functions and their execution order to restore NATS streams. +- `.spec.repository.name` specifies the Repository object that holds the backend information where our backed up data has been stored. +- `.spec.target.ref` refers to the AppBinding object that holds the connection information of our targeted NATS server. +- `.spec.interimVolumeTemplate` specifies a PVC template that will be used by Stash to hold the restored data temporarily before injecting into the NATS server. +- `.spec.rules` specifies that we are restoring data from the latest backup snapshot of the streams. + +Let's create the `RestoreSession` object object we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/nats/authentications/basic-auth/examples/restoresession.yaml +restoresession.stash.appscode.com/sample-nats-restore created +``` + +Once, you have created the `RestoreSession` object, Stash will create a restore Job. Run the following command to watch the phase of the `RestoreSession` object, + +```bash +❯ kubectl get restoresession -n demo -w +NAME REPOSITORY PHASE DURATION AGE +sample-nats-restore gcs-repo Succeeded 15s 55s +``` + +The `Succeeded` phase means that the restore process has been completed successfully. + +#### Verify Restored Data + +Now, let's exec into the nats-box pod and verify whether data actual data has been restored or not, + +```bash +❯ kubectl exec -n demo -it sample-nats-box-785f8458d7-wtnfx -- sh -l +... +# Let's export the username and password as environment variables to make further commands re-usable. +sample-nats-box-785f8458d7-wtnfx:~# export NATS_USER=sample-user +sample-nats-box-785f8458d7-wtnfx:~# export NATS_PASSWORD=changeit + +# Verify that the stream has been restored successfully +sample-nats-box-785f8458d7-wtnfx:~# nats stream ls +Streams: + + ORDERS + +# Verify that the messages have been restored successfully +sample-nats-box-785f8458d7-wtnfx:~# nats stream info ORDERS +Information for Stream ORDERS created 2021-09-03T07:12:07Z + +Configuration: + + Subjects: ORDERS.* + Acknowledgements: true + Retention: File - Limits + Replicas: 1 + Discard Policy: Old + Duplicate Window: 2m0s + Maximum Messages: unlimited + Maximum Bytes: unlimited + Maximum Age: 1y0d0h0m0s + Maximum Message Size: unlimited + Maximum Consumers: unlimited + + +Cluster Information: + + Name: nats + Leader: nats-0 + +State: + + Messages: 2 + Bytes: 98 B + FirstSeq: 1 @ 2021-09-03T08:55:39 UTC + LastSeq: 2 @ 2021-09-03T08:56:11 UTC + Active Consumers: 0 + +sample-nats-box-785f8458d7-wtnfx:~# exit +``` + +Hence, we can see from the above output that the deleted data has been restored successfully from the backup. + +#### Resume Backup + +Since our data has been restored successfully we can now resume our usual backup process. Resume the `BackupConfiguration` using following command, + +```bash +❯ kubectl patch backupconfiguration -n demo sample-nats-backup --type="merge" --patch='{"spec": {"paused": false}}' +backupconfiguration.stash.appscode.com/sample-nats-backup patched +``` + +Verify that the `BackupConfiguration` has been resumed, +```bash +❯ kubectl get backupconfiguration -n demo sample-nats-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-nats-backup nats-backup-2.6.1 */5 * * * * false Ready 2d19h +``` + +Here, `false` in the `PAUSED` column means the backup has been resumed successfully. The CronJob also should be resumed now. + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-nats-backup */5 * * * * False 0 3m24s 4h54m +``` + +Here, `False` in the `SUSPEND` column means the CronJob is no longer suspended and will trigger in the next schedule. + +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo backupconfiguration sample-nats-backup +kubectl delete -n demo restoresession sample-nats-restore +kubectl delete -n demo repository gcs-repo +# delete the nats chart +helm delete sample-nats -n demo +``` diff --git a/content/docs/v2024.12.18/addons/nats/authentications/jwt-auth/examples/appbinding.yaml b/content/docs/v2024.12.18/addons/nats/authentications/jwt-auth/examples/appbinding.yaml new file mode 100644 index 0000000000..7e4a9e8c29 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/authentications/jwt-auth/examples/appbinding.yaml @@ -0,0 +1,17 @@ +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + labels: + app.kubernetes.io/instance: sample-nats + name: sample-nats + namespace: demo +spec: + clientConfig: + service: + name: sample-nats + port: 4222 + scheme: nats + secret: + name: sample-nats-auth + type: nats.io/nats + version: 2.6.1 diff --git a/content/docs/v2024.12.18/addons/nats/authentications/jwt-auth/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/addons/nats/authentications/jwt-auth/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..70b58a6647 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/authentications/jwt-auth/examples/backupconfiguration.yaml @@ -0,0 +1,29 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-nats-backup + namespace: demo +spec: + task: + name: nats-backup-2.6.1 + schedule: "*/5 * * * *" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + interimVolumeTemplate: + metadata: + name: sample-nats-backup-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/nats/authentications/jwt-auth/examples/repository.yaml b/content/docs/v2024.12.18/addons/nats/authentications/jwt-auth/examples/repository.yaml new file mode 100644 index 0000000000..dae91419b2 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/authentications/jwt-auth/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /demo/nats/sample-nats + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/addons/nats/authentications/jwt-auth/examples/restoresession.yaml b/content/docs/v2024.12.18/addons/nats/authentications/jwt-auth/examples/restoresession.yaml new file mode 100644 index 0000000000..9c5f52422a --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/authentications/jwt-auth/examples/restoresession.yaml @@ -0,0 +1,26 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-nats-restore + namespace: demo +spec: + task: + name: nats-restore-2.6.1 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + interimVolumeTemplate: + metadata: + name: nats-restore-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/addons/nats/authentications/jwt-auth/examples/secret.yaml b/content/docs/v2024.12.18/addons/nats/authentications/jwt-auth/examples/secret.yaml new file mode 100644 index 0000000000..7e92b7e6c2 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/authentications/jwt-auth/examples/secret.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: Secret +metadata: + labels: + app.kubernetes.io/instance: sample-nats + name: sample-nats-auth + namespace: demo +data: + creds: LS0tLS1CRUdJTiBOQVRTIFVTRVIgSldULS0tLS0KZXlKMGVYQWlPaUpLVjFRaUxDSmhiR2NpT2lKbFpESTFOVEU1TFc1clpYa2lmUS5leUpxZEdraU9pSklRVXBLVDFJeVQwZFBXRVphVUZOQ1VVUk5OVTlaVnpKYVNVVlRURXcxTjFNMVJGVkZWVmhSVGxRMlNUVkZUMWxFVnpaQklpd2lhV0YwSWpveE5qSTVPRGt6TWpReExDSnBjM01pT2lKQlJFWkRNMWxNUVZVMU5rNHlOa2hIVGpkVVIxQlhSRmhSVGxwVFFsRkZXa3RSV0ZCUVVsQXlORWhMTkRaV1NsbFJXRFExVXpKVlNDSXNJbTVoYldVaU9pSjRJaXdpYzNWaUlqb2lWVUZZVEVnMFdUVlNOazVNUmxwT1RsaENVVTh5V1VaWk56SlNRbE5ETms4MFZFNUpRa0pOUzBOVlRGcExNell6TjFGQ05GTldNa1lpTENKdVlYUnpJanA3SW5CMVlpSTZlMzBzSW5OMVlpSTZlMzBzSW5OMVluTWlPaTB4TENKa1lYUmhJam90TVN3aWNHRjViRzloWkNJNkxURXNJblI1Y0dVaU9pSjFjMlZ5SWl3aWRtVnljMmx2YmlJNk1uMTkuMFFyeW11Mi1HdUVYV3hOaU5MNGRxc1JMdlJ4VGNXQ24zRHN6UTJIbUhHOElEbXhwUG9oeGRGMFU3aUQ5WGdQU2xSMVBOakJ6bXFxMHhFME1lWmRTRHcKLS0tLS0tRU5EIE5BVFMgVVNFUiBKV1QtLS0tLS0KCi0tLS0tQkVHSU4gVVNFUiBOS0VZIFNFRUQtLS0tLQpTVUFCUlc0Sjc2RlpCTjVTMlZOR0MzWVdLRlRXR1FVNTI3TzVSQkdPTVRQNkRYRUpDSUZSS0NKSUtVCi0tLS0tLUVORCBVU0VSIE5LRVkgU0VFRC0tLS0tLQo= diff --git a/content/docs/v2024.12.18/addons/nats/authentications/jwt-auth/images/sample-nats-backup.png b/content/docs/v2024.12.18/addons/nats/authentications/jwt-auth/images/sample-nats-backup.png new file mode 100644 index 0000000000..b3f603de78 Binary files /dev/null and b/content/docs/v2024.12.18/addons/nats/authentications/jwt-auth/images/sample-nats-backup.png differ diff --git a/content/docs/v2024.12.18/addons/nats/authentications/jwt-auth/index.md b/content/docs/v2024.12.18/addons/nats/authentications/jwt-auth/index.md new file mode 100644 index 0000000000..1b3622d349 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/authentications/jwt-auth/index.md @@ -0,0 +1,728 @@ +--- +title: NATS with JWT authentication +description: Backup NATS with JWT authentication using Stash +menu: + docs_v2024.12.18: + identifier: stash-nats-jwt-auth + name: JWT Authentication + parent: stash-nats-auth + weight: 25 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup NATS with JWT Authentication using Stash + +Stash `{{< param "info.version" >}}` supports backup and restoration of NATS streams. This guide will show you how you can backup & restore a NATS server with JWT authentication using Stash. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. +- Install Stash in your cluster following the steps [here](/docs/v2024.12.18/setup/install/stash/). +- If you are not familiar with how Stash backup and restore NATS streams, please check the following guide [here](/docs/v2024.12.18/addons/nats/overview/). + +You have to be familiar with following custom resources: + +- [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) +- [Function](/docs/v2024.12.18/concepts/crds/function/) +- [Task](/docs/v2024.12.18/concepts/crds/task/) +- [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) +- [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) +- [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + +To keep things isolated, we are going to use a separate namespace called `demo` throughout this tutorial. Create `demo` namespace if you haven't created already. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> Note: YAML files used in this tutorial are stored [here](https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/nats/authentications/jwt-auth/examples). + +## Prepare NATS + +In this section, we are going to deploy a NATS cluster with JWT authentication enabled. Then, we are going to create a stream and publish some messages into it. + +### Deploy NATS Cluster + +At first, let's deploy a NATS cluster. Here, we are going to use [NATS](https://github.com/nats-io/k8s/tree/main/helm/charts/nats ) chart from [nats.io](https://nats.io/). + +Let's deploy a NATS cluster named `sample-nats` using Helm as below, + +```bash +# Add nats chart registry +$ helm repo add nats https://nats-io.github.io/k8s/helm/charts/ +# Update helm registries +$ helm repo update +# Install nats/nats chart into demo namespace +$ helm install sample-nats nats/nats -n demo \ +--set nats.jetstream.enabled=true \ +--set nats.jetstream.fileStorage.enabled=true \ +--set cluster.enabled=true \ +--set cluster.replicas=3 \ +--set auth.enabled=true \ +--set auth.resolver.type=full \ +--set auth.resolver.operator=eyJ0eXAiOiJKV1QiLCJhbGciOiJlZDI1NTE5LW5rZXkifQ.eyJhdWQiOiJPQU5US0NDTkFQTUdCNE9YRE1YT1ZON01DQUVKNVZGV1ZXVEFVVlVXQllBUFhMWlpHU1NZVTRLVCIsImV4cCI6MTk0NTQyNjA0MSwianRpIjoiWktRTllaTlNRTUhNQzNHREdVRVpDUFlDT0RNSjIyMzRPM0pGTjUzWlZYWEZBUFU3Qlg2QSIsImlhdCI6MTYyOTg5MzI0MSwiaXNzIjoiT0FOVEtDQ05BUE1HQjRPWERNWE9WTjdNQ0FFSjVWRldWV1RBVVZVV0JZQVBYTFpaR1NTWVU0S1QiLCJuYW1lIjoiS08iLCJuYmYiOjE2Mjk4OTMyNDEsInN1YiI6Ik9BTlRLQ0NOQVBNR0I0T1hETVhPVk43TUNBRUo1VkZXVldUQVVWVVdCWUFQWExaWkdTU1lVNEtUIiwibmF0cyI6eyJzaWduaW5nX2tleXMiOlsiT0FOVEtDQ05BUE1HQjRPWERNWE9WTjdNQ0FFSjVWRldWV1RBVVZVV0JZQVBYTFpaR1NTWVU0S1QiXSwidHlwZSI6Im9wZXJhdG9yIiwidmVyc2lvbiI6Mn19.jxs4znpE50PzRFfKOjENlFQTfsRHH5VqIplnTgAziUJuYBSNmBQeYsBDJTOgLJyADgtqIWkAQF_G5K7xuVXpCg \ +--set auth.resolver.systemAccount=ABQBM7PTUNWRWQRWFFQGRCVRQ7ULYSZQLCMGDK62WYRHRO3NUN3SUONF \ +--set auth.resolver.resolverPreload.ABQBM7PTUNWRWQRWFFQGRCVRQ7ULYSZQLCMGDK62WYRHRO3NUN3SUONF=eyJ0eXAiOiJKV1QiLCJhbGciOiJlZDI1NTE5LW5rZXkifQ.eyJqdGkiOiJDRTZHVUdISEYzVzRGUU5VMjdVWks2SUtNSkpQWEEzUlEyNDVYTE5LWEVIS0xaQ1ZaT1FBIiwiaWF0IjoxNjI5ODkzMjQxLCJpc3MiOiJPQU5US0NDTkFQTUdCNE9YRE1YT1ZON01DQUVKNVZGV1ZXVEFVVlVXQllBUFhMWlpHU1NZVTRLVCIsIm5hbWUiOiJTWVMiLCJzdWIiOiJBQlFCTTdQVFVOV1JXUVJXRkZRR1JDVlJRN1VMWVNaUUxDTUdESzYyV1lSSFJPM05VTjNTVU9ORiIsIm5hdHMiOnsibGltaXRzIjp7InN1YnMiOi0xLCJkYXRhIjotMSwicGF5bG9hZCI6LTEsImltcG9ydHMiOi0xLCJleHBvcnRzIjotMSwid2lsZGNhcmRzIjp0cnVlLCJjb25uIjotMSwibGVhZiI6LTF9LCJkZWZhdWx0X3Blcm1pc3Npb25zIjp7InB1YiI6e30sInN1YiI6e319LCJ0eXBlIjoiYWNjb3VudCIsInZlcnNpb24iOjJ9fQ.DM8U4Ld4OWmd-hk9fobMI3fWMDZdLr-Q33Uq7h5eoM-RMVKN-5nuUlmaxPffYRwE1egVIn9mQuu7YYmwX31wDQ \ +--set auth.resolver.resolverPreload.ADFC3YLAU56N26HGN7TGPWDXQNZSBQEZKQXPPRP24HK46VJYQX45S2UH=eyJ0eXAiOiJKV1QiLCJhbGciOiJlZDI1NTE5LW5rZXkifQ.eyJqdGkiOiJEMlYzVE9NUTQ1WjRGUFNTM0hCMk5TR1dLV0xITDVNSUpVWENNSTRGVEtYNTIzNjdWRUhRIiwiaWF0IjoxNjI5ODkzMjQxLCJpc3MiOiJPQU5US0NDTkFQTUdCNE9YRE1YT1ZON01DQUVKNVZGV1ZXVEFVVlVXQllBUFhMWlpHU1NZVTRLVCIsIm5hbWUiOiJYIiwic3ViIjoiQURGQzNZTEFVNTZOMjZIR043VEdQV0RYUU5aU0JRRVpLUVhQUFJQMjRISzQ2VkpZUVg0NVMyVUgiLCJuYXRzIjp7ImV4cG9ydHMiOlt7Im5hbWUiOiJ4LkV2ZW50cyIsInN1YmplY3QiOiJ4LkV2ZW50cyIsInR5cGUiOiJzdHJlYW0ifSx7Im5hbWUiOiJ4Lk5vdGlmaWNhdGlvbnMiLCJzdWJqZWN0IjoieC5Ob3RpZmljYXRpb25zIiwidHlwZSI6InNlcnZpY2UiLCJyZXNwb25zZV90eXBlIjoiU3RyZWFtIn1dLCJsaW1pdHMiOnsic3VicyI6LTEsImRhdGEiOi0xLCJwYXlsb2FkIjotMSwiaW1wb3J0cyI6LTEsImV4cG9ydHMiOi0xLCJ3aWxkY2FyZHMiOnRydWUsImNvbm4iOi0xLCJsZWFmIjotMSwibWVtX3N0b3JhZ2UiOi0xLCJkaXNrX3N0b3JhZ2UiOi0xLCJzdHJlYW1zIjotMSwiY29uc3VtZXIiOi0xfSwiZGVmYXVsdF9wZXJtaXNzaW9ucyI6eyJwdWIiOnt9LCJzdWIiOnt9fSwidHlwZSI6ImFjY291bnQiLCJ2ZXJzaW9uIjoyfX0.oXatnt7Tqt1iHDpUAKGroac9Sv6G4kbAPIt75BrBRh6B9MOFa_y8QLsUnIffI4-aG31cVYjECs7QlsNTPJ-oCg +``` + +This chart will create the necessary StatefulSet, Service, PVCs etc. for the NATS cluster. You can easily view all the resources created by chart using [ketall](https://github.com/corneliusweig/ketall) `kubectl` plugin as below, + +```bash +❯ kubectl get-all -n demo -l app.kubernetes.io/instance=sample-nats +NAME NAMESPACE AGE +configmap/sample-nats-config demo 11m +endpoints/sample-nats demo 11m +persistentvolumeclaim/sample-nats-js-pvc-sample-nats-0 demo 11m +persistentvolumeclaim/sample-nats-js-pvc-sample-nats-1 demo 10m +persistentvolumeclaim/sample-nats-js-pvc-sample-nats-2 demo 10m +pod/sample-nats-0 demo 11m +pod/sample-nats-1 demo 10m +pod/sample-nats-2 demo 10m +service/sample-nats demo 11m +controllerrevision.apps/sample-nats-775468b94f demo 11m +statefulset.apps/sample-nats demo 11m +endpointslice.discovery.k8s.io/sample-nats-7n7v6 demo 11m +``` + +Now, wait for the NATS server pods `sample-nats-0`, `sample-nats-1`, `sample-nats-2` to go into `Running` state, + +```bash +❯ kubectl get pod -n demo -l app.kubernetes.io/instance=sample-nats +NAME READY STATUS RESTARTS AGE +sample-nats-0 3/3 Running 0 9m58s +sample-nats-1 3/3 Running 0 9m35s +sample-nats-2 3/3 Running 0 9m12s +``` + +Once the pods are in `Running` state, verify that the NATS server is ready to accept the connections. + +```bash +❯ kubectl logs -n demo sample-nats-0 -c nats +[7] 2021/09/06 08:33:53.111508 [INF] Starting nats-server +[7] 2021/09/06 08:33:53.111560 [INF] Version: 2.6.1 +... +[7] 2021/09/06 08:33:53.116004 [INF] Server is ready +``` + +From the above log, we can see the NATS server is ready to accept connections. + +### Insert Sample Data +The above Helm chart also deploy a pod with nats-box image which can be used to interact with the NATS server. Let's verify the nats-box pod has been created. + +```bash +❯ kubectl get pod -n demo -l app=sample-nats-box +NAME READY STATUS RESTARTS AGE +sample-nats-box-785f8458d7-wtnfx 1/1 Running 0 7m20s +``` + +Let's exec into the nats-box pod, + +```bash +❯ kubectl exec -n demo -it sample-nats-box-785f8458d7-wtnfx -- sh -l +... +# Let's create the creds file for our user +sample-nats-box-785f8458d7-wtnfx:~# echo LS0tLS1CRUdJTiBOQVRTIFVTRVIgSldULS0tLS0KZXlKMGVYQWlPaUpLVjFRaUxDSmhiR2NpT2lKbFpESTFOVEU1TFc1clpYa2lmUS5leUpxZEdraU9pSklRVXBLVDFJeVQwZFBXRVphVUZOQ1VVUk5OVTlaVnpKYVNVVlRURXcxTjFNMVJGVkZWVmhSVGxRMlNUVkZUMWxFVnpaQklpd2lhV0YwSWpveE5qSTVPRGt6TWpReExDSnBjM01pT2lKQlJFWkRNMWxNUVZVMU5rNHlOa2hIVGpkVVIxQlhSRmhSVGxwVFFsRkZXa3RSV0ZCUVVsQXlORWhMTkRaV1NsbFJXRFExVXpKVlNDSXNJbTVoYldVaU9pSjRJaXdpYzNWaUlqb2lWVUZZVEVnMFdUVlNOazVNUmxwT1RsaENVVTh5V1VaWk56SlNRbE5ETms4MFZFNUpRa0pOUzBOVlRGcExNell6TjFGQ05GTldNa1lpTENKdVlYUnpJanA3SW5CMVlpSTZlMzBzSW5OMVlpSTZlMzBzSW5OMVluTWlPaTB4TENKa1lYUmhJam90TVN3aWNHRjViRzloWkNJNkxURXNJblI1Y0dVaU9pSjFjMlZ5SWl3aWRtVnljMmx2YmlJNk1uMTkuMFFyeW11Mi1HdUVYV3hOaU5MNGRxc1JMdlJ4VGNXQ24zRHN6UTJIbUhHOElEbXhwUG9oeGRGMFU3aUQ5WGdQU2xSMVBOakJ6bXFxMHhFME1lWmRTRHcKLS0tLS0tRU5EIE5BVFMgVVNFUiBKV1QtLS0tLS0KCi0tLS0tQkVHSU4gVVNFUiBOS0VZIFNFRUQtLS0tLQpTVUFCUlc0Sjc2RlpCTjVTMlZOR0MzWVdLRlRXR1FVNTI3TzVSQkdPTVRQNkRYRUpDSUZSS0NKSUtVCi0tLS0tLUVORCBVU0VSIE5LRVkgU0VFRC0tLS0tLQo= | base64 -d > user.creds + +# Let's export the file path as environment variables to make further commands re-usable. +sample-nats-box-785f8458d7-wtnfx:~# export NATS_CREDS=/tmp/user.creds + +# Let's create a stream named "ORDERS" +sample-nats-box-785f8458d7-wtnfx:~# nats stream add ORDERS --subjects "ORDERS.*" --ack --max-msgs=-1 --max-bytes=-1 --max-age=1y --storage file --retention limits --max-msg-size=-1 --max-msgs-per-subject=-1 --discard old --dupe-window="0s" --replicas 1 +Stream ORDERS was created + +Information for Stream ORDERS created 2021-09-03T07:12:07Z + +Configuration: + + Subjects: ORDERS.* + Acknowledgements: true + Retention: File - Limits + Replicas: 1 + Discard Policy: Old + Duplicate Window: 2m0s + Maximum Messages: unlimited + Maximum Bytes: unlimited + Maximum Age: 1y0d0h0m0s + Maximum Message Size: unlimited + Maximum Consumers: unlimited + + +Cluster Information: + + Name: nats + Leader: nats-0 + +State: + + Messages: 0 + Bytes: 0 B + FirstSeq: 0 + LastSeq: 0 + Active Consumers: 0 + + +# Verify that the stream has been created successfully +sample-nats-box-785f8458d7-wtnfx:~# nats stream ls +Streams: + + ORDERS + +# Lets add some messages to the stream "ORDERS" +sample-nats-box-785f8458d7-wtnfx:~# nats pub ORDERS.scratch hello +08:55:39 Published 5 bytes to "ORDERS.scratch" + +# Add another message +sample-nats-box-785f8458d7-wtnfx:~# nats pub ORDERS.scratch world +08:56:11 Published 5 bytes to "ORDERS.scratch" + +# Verify that the messages have been published to the stream successfully +sample-nats-box-785f8458d7-wtnfx:~# nats stream info ORDERS +Information for Stream ORDERS created 2021-09-03T07:12:07Z + +Configuration: + + Subjects: ORDERS.* + Acknowledgements: true + Retention: File - Limits + Replicas: 1 + Discard Policy: Old + Duplicate Window: 2m0s + Maximum Messages: unlimited + Maximum Bytes: unlimited + Maximum Age: 1y0d0h0m0s + Maximum Message Size: unlimited + Maximum Consumers: unlimited + + +Cluster Information: + + Name: nats + Leader: nats-0 + +State: + + Messages: 2 + Bytes: 98 B + FirstSeq: 1 @ 2021-09-03T08:55:39 UTC + LastSeq: 2 @ 2021-09-03T08:56:11 UTC + Active Consumers: 0 + +sample-nats-box-785f8458d7-wtnfx:~# exit +``` + +We have successfully deployed a NATS cluster, created a stream and publish some messages into the stream. In the subsequent sections, we are going to backup this sample data using Stash. + +## Prepare for Backup + +In this section, we are going to prepare the necessary resources (i.e. connection information, backend information, etc.) before backup. + +### Ensure NATS Addon + +When you install Stash, it will automatically install all the official addons. Make sure that NATS addon has been installed properly using the following command. + +```bash +❯ kubectl get tasks.stash.appscode.com | grep nats +nats-backup-2.6.1 24m +nats-restore-2.6.1 24m +``` + +This addon should be able to take backup of the NATS streams with matching major versions as discussed in [Addon Version Compatibility](/docs/v2024.12.18/addons/nats/README#addon-version-compatibility). + +### Create Secret + + Lets create a secret with JWT auth credentials. Below is the YAML of `Secret` object we are going to create. + +```yaml +apiVersion: v1 +kind: Secret +metadata: + labels: + app.kubernetes.io/instance: sample-nats + name: sample-nats-auth + namespace: demo +data: + creds: LS0tLS1CRUdJTiBOQVRTIFVTRVIgSldULS0tLS0KZXlKMGVYQWlPaUpLVjFRaUxDSmhiR2NpT2lKbFpESTFOVEU1TFc1clpYa2lmUS5leUpxZEdraU9pSklRVXBLVDFJeVQwZFBXRVphVUZOQ1VVUk5OVTlaVnpKYVNVVlRURXcxTjFNMVJGVkZWVmhSVGxRMlNUVkZUMWxFVnpaQklpd2lhV0YwSWpveE5qSTVPRGt6TWpReExDSnBjM01pT2lKQlJFWkRNMWxNUVZVMU5rNHlOa2hIVGpkVVIxQlhSRmhSVGxwVFFsRkZXa3RSV0ZCUVVsQXlORWhMTkRaV1NsbFJXRFExVXpKVlNDSXNJbTVoYldVaU9pSjRJaXdpYzNWaUlqb2lWVUZZVEVnMFdUVlNOazVNUmxwT1RsaENVVTh5V1VaWk56SlNRbE5ETms4MFZFNUpRa0pOUzBOVlRGcExNell6TjFGQ05GTldNa1lpTENKdVlYUnpJanA3SW5CMVlpSTZlMzBzSW5OMVlpSTZlMzBzSW5OMVluTWlPaTB4TENKa1lYUmhJam90TVN3aWNHRjViRzloWkNJNkxURXNJblI1Y0dVaU9pSjFjMlZ5SWl3aWRtVnljMmx2YmlJNk1uMTkuMFFyeW11Mi1HdUVYV3hOaU5MNGRxc1JMdlJ4VGNXQ24zRHN6UTJIbUhHOElEbXhwUG9oeGRGMFU3aUQ5WGdQU2xSMVBOakJ6bXFxMHhFME1lWmRTRHcKLS0tLS0tRU5EIE5BVFMgVVNFUiBKV1QtLS0tLS0KCi0tLS0tQkVHSU4gVVNFUiBOS0VZIFNFRUQtLS0tLQpTVUFCUlc0Sjc2RlpCTjVTMlZOR0MzWVdLRlRXR1FVNTI3TzVSQkdPTVRQNkRYRUpDSUZSS0NKSUtVCi0tLS0tLUVORCBVU0VSIE5LRVkgU0VFRC0tLS0tLQo= +``` + +Let's create the `Secret` we have shown above, +```bash +$ kubectl apply -f https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/nats/authentications/jwt-auth/examples/secret.yaml +secret/sample-nats-auth created +``` + + +### Create AppBinding + +Stash needs to know how to connect with the NATS server. An `AppBinding` exactly provides this information. It holds the Service and Secret information of the NATS server. You have to point to the respective `AppBinding` as a target of backup instead of the NATS server itself. + +Here, is the YAML of the `AppBinding` that we are going to create for the NATS server we have deployed earlier. + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + labels: + app.kubernetes.io/instance: sample-nats + name: sample-nats + namespace: demo +spec: + clientConfig: + service: + name: sample-nats + port: 4222 + scheme: nats + secret: + name: sample-nats-auth + type: nats.io/nats + version: 2.6.1 +``` + +Here, + +- `.spec.clientConfig.service` specifies the Service information to use to connects with the NATS server. +- `.spec.secret` specifies the name of the Secret that holds necessary credentials to access the server. +- `.spec.type` specifies the type of the target. This is particularly helpful in auto-backup where you want to use different path prefixes for different types of target. + +Let's create the `AppBinding` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/nats/authentications/jwt-auth/examples/appbinding.yaml +appbinding.appcatalog.appscode.com/sample-nats created +``` + +### Prepare Backend + +We are going to store our backed up data into a GCS bucket. So, we need to create a Secret with GCS credentials and a `Repository` object with the bucket information. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +**Create Storage Secret:** + +At first, let's create a secret called `gcs-secret` with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat downloaded-sa-json.key > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create Repository:** + +Now, create a `Repository` object with the information of your desired bucket. Below is the YAML of `Repository` object we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /demo/nats/sample-nats + storageSecretName: gcs-secret +``` + +Let's create the `Repository` we have shown above, + +```bash +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/nats/authentications/jwt-auth/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our streams into our desired backend. + +### Backup + +To schedule a backup, we have to create a `BackupConfiguration` object targeting the respective `AppBinding` of our NATS server. Then, Stash will create a CronJob to periodically backup the streams. + +#### Create BackupConfiguration + +Below is the YAML for `BackupConfiguration` object that we are going to use to backup the streams of the NATS server we have created earlier, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-nats-backup + namespace: demo +spec: + task: + name: nats-backup-2.6.1 + schedule: "*/5 * * * *" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + interimVolumeTemplate: + metadata: + name: sample-nats-backup-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +Here, + +- `.spec.schedule` specifies that we want to backup the streams at 5 minutes intervals. +- `.spec.task.name` specifies the name of the Task object that specifies the necessary Functions and their execution order to backup NATS streams. +- `.spec.repository.name` specifies the Repository CR name we have created earlier with backend information. +- `.spec.target.ref` refers to the AppBinding object that holds the connection information of our targeted NATS server. +- `spec.interimVolumeTemplate` specifies a PVC template that will be used by Stash to hold the dumped data temporarily before uploading it into the cloud bucket. +- `.spec.retentionPolicy` specifies a policy indicating how we want to cleanup the old backups. + +Let's create the `BackupConfiguration` object we have shown above, + +```bash +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/nats/authentications/jwt-auth/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/sample-nats-backup created +``` +#### Verify Backup Setup Successful + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. Let's verify the `Phase` of the BackupConfiguration, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-nats-backup nats-backup-2.6.1 */5 * * * * Ready 11s +``` + + +#### Verify CronJob + +Stash will create a CronJob with the schedule specified in `spec.schedule` field of `BackupConfiguration` object. + +Verify that the CronJob has been created using the following command, + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-nats-backup */5 * * * * False 0 14s +``` + +#### Wait for BackupSession + +The `sample-nats-backup` CronJob will trigger a backup on each scheduled slot by creating a `BackupSession` object. + +Now, wait for a schedule to appear. Run the following command to watch for `BackupSession` object, + +```bash +❯ kubectl get backupsession -n demo -w +NAME INVOKER-TYPE INVOKER-NAME PHASE DURATION AGE +sample-nats-backup-8x8fp BackupConfiguration sample-nats-backup Succeeded 42s 8m28s +``` + +Here, the phase `Succeeded` means that the backup process has been completed successfully. + +#### Verify Backup + +Now, we are going to verify whether the backed up data is present in the backend or not. Once a backup is completed, Stash will update the respective `Repository` object to reflect the backup completion. Check that the repository `gcs-repo` has been updated by the following command, + +```bash +❯ kubectl get repository -n demo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo true 1.382 KiB 1 9m4s 24m +``` + +Now, if we navigate to the GCS bucket, we will see the backed up data has been stored in `demo/nats/sample-nats` directory as specified by `.spec.backend.gcs.prefix` field of the `Repository` object. + +
+ Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ + + + +> Note: Stash keeps all the backed up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Restore + +If you have followed the previous sections properly, you should have a successful backup of your nats streams. Now, we are going to show how you can restore the streams from the backed up data. + +### Restore Into the Same NATS Cluster + +You can restore your data into the same NATS cluster you have backed up from or into a different NATS cluster in the same cluster or a different cluster. In this section, we are going to show you how to restore in the same NATS cluster which may be necessary when you have accidentally lost any data. + +#### Temporarily Pause Backup + +At first, let's stop taking any further backup of the NATS streams so that no backup runs after we delete the sample data. We are going to pause the `BackupConfiguration` object. Stash will stop taking any further backup when the `BackupConfiguration` is paused. + +Let's pause the `sample-nats-backup` BackupConfiguration, + +```bash +$ kubectl patch backupconfiguration -n demo sample-nats-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/sample-nats-backup patched +``` + +Verify that the `BackupConfiguration` has been paused, + +```bash +❯ kubectl get backupconfiguration -n demo sample-nats-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-nats-backup nats-backup-2.6.1 */5 * * * * true Redy 2d18h +``` + +Notice the `PAUSED` column. Value `true` for this field means that the `BackupConfiguration` has been paused. + +Stash will also suspend the respective CronJob. + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-nats-backup */5 * * * * True 0 56s 2d18h +``` + +#### Simulate Disaster + +Now, let's simulate a disaster scenario. Here, we are going to exec into the nats-box pod and delete the sample data we have inserted earlier. + +```bash +❯ kubectl exec -n demo -it sample-nats-box-785f8458d7-wtnfx -- sh -l +... +# Let's export the file path of user.creds file as environment variable to make further commands re-usable. +sample-nats-box-785f8458d7-wtnfx:~# export NATS_CREDS=/tmp/user.creds + +# delete the stream "ORDERS" +sample-nats-box-785f8458d7-wtnfx:~# nats stream rm ORDERS -f + +# verify that the stream has been deleted +sample-nats-box-785f8458d7-wtnfx:~# nats stream ls +No Streams defined +sample-nats-box-785f8458d7-wtnfx:~# exit +``` + +#### Create RestoreSession + +To restore the streams, you have to create a `RestoreSession` object pointing to the `AppBinding` of the targeted NATS server. + +Here, is the YAML of the `RestoreSession` object that we are going to use for restoring the streams of the NATS server. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-nats-restore + namespace: demo +spec: + task: + name: nats-restore-2.6.1 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + interimVolumeTemplate: + metadata: + name: nats-restore-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + rules: + - snapshots: [latest] +``` + +Here, + +- `.spec.task.name` specifies the name of the Task object that specifies the necessary Functions and their execution order to restore NATS streams. +- `.spec.repository.name` specifies the Repository object that holds the backend information where our backed up data has been stored. +- `.spec.target.ref` refers to the AppBinding object that holds the connection information of our targeted NATS server. +- `.spec.interimVolumeTemplate` specifies a PVC template that will be used by Stash to hold the restored data temporarily before injecting into the NATS server. +- `.spec.rules` specifies that we are restoring data from the latest backup snapshot of the streams. + +Let's create the `RestoreSession` object object we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/nats/authentications/jwt-auth/examples/restoresession.yaml +restoresession.stash.appscode.com/sample-nats-restore created +``` + +Once, you have created the `RestoreSession` object, Stash will create a restore Job. Run the following command to watch the phase of the `RestoreSession` object, + +```bash +❯ kubectl get restoresession -n demo -w +NAME REPOSITORY PHASE DURATION AGE +sample-nats-restore gcs-repo Succeeded 15s 55s +``` + +The `Succeeded` phase means that the restore process has been completed successfully. + +#### Verify Restored Data + +Now, let's exec into the nats-box pod and verify whether data actual data has been restored or not, + +```bash +❯ kubectl exec -n demo -it sample-nats-box-785f8458d7-wtnfx -- sh -l +... +# Let's export the file path of user.creds file as environment variable to make further commands re-usable. +sample-nats-box-785f8458d7-wtnfx:~# export NATS_CREDS=/tmp/user.creds + +# Verify that the stream has been restored successfully +sample-nats-box-785f8458d7-wtnfx:~# nats stream ls +Streams: + + ORDERS + +# Verify that the messages have been restored successfully +sample-nats-box-785f8458d7-wtnfx:~# nats stream info ORDERS +Information for Stream ORDERS created 2021-09-03T07:12:07Z + +Configuration: + + Subjects: ORDERS.* + Acknowledgements: true + Retention: File - Limits + Replicas: 1 + Discard Policy: Old + Duplicate Window: 2m0s + Maximum Messages: unlimited + Maximum Bytes: unlimited + Maximum Age: 1y0d0h0m0s + Maximum Message Size: unlimited + Maximum Consumers: unlimited + + +Cluster Information: + + Name: nats + Leader: nats-0 + +State: + + Messages: 2 + Bytes: 98 B + FirstSeq: 1 @ 2021-09-03T08:55:39 UTC + LastSeq: 2 @ 2021-09-03T08:56:11 UTC + Active Consumers: 0 + +sample-nats-box-785f8458d7-wtnfx:~# exit +``` + +Hence, we can see from the above output that the deleted data has been restored successfully from the backup. + +#### Resume Backup + +Since our data has been restored successfully we can now resume our usual backup process. Resume the `BackupConfiguration` using following command, + +```bash +❯ kubectl patch backupconfiguration -n demo sample-nats-backup --type="merge" --patch='{"spec": {"paused": false}}' +backupconfiguration.stash.appscode.com/sample-nats-backup patched +``` + +Verify that the `BackupConfiguration` has been resumed, +```bash +❯ kubectl get backupconfiguration -n demo sample-nats-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-nats-backup nats-backup-2.6.1 */5 * * * * false Ready 2d19h +``` + +Here, `false` in the `PAUSED` column means the backup has been resumed successfully. The CronJob also should be resumed now. + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-nats-backup */5 * * * * False 0 3m24s 4h54m +``` + +Here, `False` in the `SUSPEND` column means the CronJob is no longer suspended and will trigger in the next schedule. + +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo backupconfiguration sample-nats-backup +kubectl delete -n demo restoresession sample-nats-restore +kubectl delete -n demo repository gcs-repo +# delete the nats chart +helm delete sample-nats -n demo +``` diff --git a/content/docs/v2024.12.18/addons/nats/authentications/nkey-auth/examples/appbinding.yaml b/content/docs/v2024.12.18/addons/nats/authentications/nkey-auth/examples/appbinding.yaml new file mode 100644 index 0000000000..7e4a9e8c29 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/authentications/nkey-auth/examples/appbinding.yaml @@ -0,0 +1,17 @@ +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + labels: + app.kubernetes.io/instance: sample-nats + name: sample-nats + namespace: demo +spec: + clientConfig: + service: + name: sample-nats + port: 4222 + scheme: nats + secret: + name: sample-nats-auth + type: nats.io/nats + version: 2.6.1 diff --git a/content/docs/v2024.12.18/addons/nats/authentications/nkey-auth/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/addons/nats/authentications/nkey-auth/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..70b58a6647 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/authentications/nkey-auth/examples/backupconfiguration.yaml @@ -0,0 +1,29 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-nats-backup + namespace: demo +spec: + task: + name: nats-backup-2.6.1 + schedule: "*/5 * * * *" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + interimVolumeTemplate: + metadata: + name: sample-nats-backup-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/nats/authentications/nkey-auth/examples/repository.yaml b/content/docs/v2024.12.18/addons/nats/authentications/nkey-auth/examples/repository.yaml new file mode 100644 index 0000000000..dae91419b2 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/authentications/nkey-auth/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /demo/nats/sample-nats + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/addons/nats/authentications/nkey-auth/examples/restoresession.yaml b/content/docs/v2024.12.18/addons/nats/authentications/nkey-auth/examples/restoresession.yaml new file mode 100644 index 0000000000..9c5f52422a --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/authentications/nkey-auth/examples/restoresession.yaml @@ -0,0 +1,26 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-nats-restore + namespace: demo +spec: + task: + name: nats-restore-2.6.1 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + interimVolumeTemplate: + metadata: + name: nats-restore-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/addons/nats/authentications/nkey-auth/examples/secret.yaml b/content/docs/v2024.12.18/addons/nats/authentications/nkey-auth/examples/secret.yaml new file mode 100644 index 0000000000..71bd6e0936 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/authentications/nkey-auth/examples/secret.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: Secret +metadata: + labels: + app.kubernetes.io/instance: sample-nats + name: sample-nats-auth + namespace: demo +data: + nkey: U1VBRDJRWlBJQU9aRTdTQlZHUjJQS09YVkEyTDYzVUQ1UEVWNkVVUTZPTEdUS0ZJV0o0VTNaQ1NDQQpVQVdHR1ZFSFhJRU9XWVZCTjdSTzdJSUtJWEhJT0s2SldXVURKT1dJVVo2TDNYTUlXTTVJRkdQRAo= diff --git a/content/docs/v2024.12.18/addons/nats/authentications/nkey-auth/images/sample-nats-backup.png b/content/docs/v2024.12.18/addons/nats/authentications/nkey-auth/images/sample-nats-backup.png new file mode 100644 index 0000000000..b3f603de78 Binary files /dev/null and b/content/docs/v2024.12.18/addons/nats/authentications/nkey-auth/images/sample-nats-backup.png differ diff --git a/content/docs/v2024.12.18/addons/nats/authentications/nkey-auth/index.md b/content/docs/v2024.12.18/addons/nats/authentications/nkey-auth/index.md new file mode 100644 index 0000000000..6c18515680 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/authentications/nkey-auth/index.md @@ -0,0 +1,725 @@ +--- +title: NKey authentication +description: Backup NATS with Nkey authentication using Stash +menu: + docs_v2024.12.18: + identifier: stash-nats-nkey-auth + name: Nkey Authentication + parent: stash-nats-auth + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup NATS with Nkey Authentication using Stash + +Stash `{{< param "info.version" >}}` supports backup and restoration of NATS streams. This guide will show you how you can backup & restore a NATS server with nkey authentication using Stash. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. +- Install Stash in your cluster following the steps [here](/docs/v2024.12.18/setup/install/stash/). +- If you are not familiar with how Stash backup and restore NATS streams, please check the following guide [here](/docs/v2024.12.18/addons/nats/overview/). + +You have to be familiar with following custom resources: + +- [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) +- [Function](/docs/v2024.12.18/concepts/crds/function/) +- [Task](/docs/v2024.12.18/concepts/crds/task/) +- [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) +- [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) +- [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + +To keep things isolated, we are going to use a separate namespace called `demo` throughout this tutorial. Create `demo` namespace if you haven't created already. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> Note: YAML files used in this tutorial are stored [here](https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/nats/authentications/nkey-auth/examples). + +## Prepare NATS + +In this section, we are going to deploy a NATS cluster with nkey authentication enabled. Then, we are going to create a stream and publish some messages into it. + +### Deploy NATS Cluster + +At first, let's deploy a NATS cluster. Here, we are going to use [NATS]( https://github.com/nats-io/k8s/tree/main/helm/charts/nats) chart from [nats.io](https://nats.io/). + +Let's deploy a NATS cluster named `sample-nats` using Helm as below, + +```bash +# Add nats chart registry +$ helm repo add nats https://nats-io.github.io/k8s/helm/charts/ +# Update helm registries +$ helm repo update +# Install nats/nats chart into demo namespace +$ helm install sample-nats nats/nats -n demo \ +--set nats.jetstream.enabled=true \ +--set nats.jetstream.fileStorage.enabled=true \ +--set cluster.enabled=true \ +--set cluster.replicas=3 \ +--set auth.enabled=true \ +--set auth.nkeys.users[0].nkey="UAWGGVEHXIEOWYVBN7RO7IIKIXHIOK6JWWUDJOWIUZ6L3XMIWM5IFGPD" + +``` + +This chart will create the necessary StatefulSet, Service, PVCs etc. for the NATS cluster. You can easily view all the resources created by chart using [ketall](https://github.com/corneliusweig/ketall) `kubectl` plugin as below, + +```bash +❯ kubectl get-all -n demo -l app.kubernetes.io/instance=sample-nats +NAME NAMESPACE AGE +configmap/sample-nats-config demo 11m +endpoints/sample-nats demo 11m +persistentvolumeclaim/sample-nats-js-pvc-sample-nats-0 demo 11m +persistentvolumeclaim/sample-nats-js-pvc-sample-nats-1 demo 10m +persistentvolumeclaim/sample-nats-js-pvc-sample-nats-2 demo 10m +pod/sample-nats-0 demo 11m +pod/sample-nats-1 demo 10m +pod/sample-nats-2 demo 10m +service/sample-nats demo 11m +controllerrevision.apps/sample-nats-775468b94f demo 11m +statefulset.apps/sample-nats demo 11m +endpointslice.discovery.k8s.io/sample-nats-7n7v6 demo 11m +``` + +Now, wait for the NATS server pods `sample-nats-0`, `sample-nats-1`, `sample-nats-2` to go into `Running` state, + +```bash +❯ kubectl get pod -n demo -l app.kubernetes.io/instance=sample-nats +NAME READY STATUS RESTARTS AGE +sample-nats-0 3/3 Running 0 9m58s +sample-nats-1 3/3 Running 0 9m35s +sample-nats-2 3/3 Running 0 9m12s +``` + +Once the pods are in `Running` state, verify that the NATS server is ready to accept the connections. + +```bash +❯ kubectl logs -n demo sample-nats-0 -c nats +[7] 2021/09/06 08:33:53.111508 [INF] Starting nats-server +[7] 2021/09/06 08:33:53.111560 [INF] Version: 2.6.1 +... +[7] 2021/09/06 08:33:53.116004 [INF] Server is ready +``` + +From the above log, we can see the NATS server is ready to accept connections. + +### Insert Sample Data +The above Helm chart also deploy a pod with nats-box image which can be used to interact with the NATS server. Let's verify the nats-box pod has been created. + +```bash +❯ kubectl get pod -n demo -l app=sample-nats-box +NAME READY STATUS RESTARTS AGE +sample-nats-box-785f8458d7-wtnfx 1/1 Running 0 7m20s +``` + +Let's exec into the nats-box pod, + +```bash +❯ kubectl exec -n demo -it sample-nats-box-785f8458d7-wtnfx -- sh -l +... +# Let's create the nkey file for our user +sample-nats-box-785f8458d7-wtnfx:~# echo U1VBRDJRWlBJQU9aRTdTQlZHUjJQS09YVkEyTDYzVUQ1UEVWNkVVUTZPTEdUS0ZJV0o0VTNaQ1NDQQpVQVdHR1ZFSFhJRU9XWVZCTjdSTzdJSUtJWEhJT0s2SldXVURKT1dJVVo2TDNYTUlXTTVJRkdQRA== | base64 -d > user.nk + +# Let's export the file path as environment variables to make further commands re-usable. +sample-nats-box-785f8458d7-wtnfx:~# export NATS_NKEY=/tmp/user.nk + +# Let's create a stream named "ORDERS" +sample-nats-box-785f8458d7-wtnfx:~# nats stream add ORDERS --subjects "ORDERS.*" --ack --max-msgs=-1 --max-bytes=-1 --max-age=1y --storage file --retention limits --max-msg-size=-1 --max-msgs-per-subject=-1 --discard old --dupe-window="0s" --replicas 1 +Stream ORDERS was created + +Information for Stream ORDERS created 2021-09-03T07:12:07Z + +Configuration: + + Subjects: ORDERS.* + Acknowledgements: true + Retention: File - Limits + Replicas: 1 + Discard Policy: Old + Duplicate Window: 2m0s + Maximum Messages: unlimited + Maximum Bytes: unlimited + Maximum Age: 1y0d0h0m0s + Maximum Message Size: unlimited + Maximum Consumers: unlimited + + +Cluster Information: + + Name: nats + Leader: nats-0 + +State: + + Messages: 0 + Bytes: 0 B + FirstSeq: 0 + LastSeq: 0 + Active Consumers: 0 + + +# Verify that the stream has been created successfully +sample-nats-box-785f8458d7-wtnfx:~# nats stream ls +Streams: + + ORDERS + +# Lets add some messages to the stream "ORDERS" +sample-nats-box-785f8458d7-wtnfx:~# nats pub ORDERS.scratch hello +08:55:39 Published 5 bytes to "ORDERS.scratch" + +# Add another message +sample-nats-box-785f8458d7-wtnfx:~# nats pub ORDERS.scratch world +08:56:11 Published 5 bytes to "ORDERS.scratch" + +# Verify that the messages have been published to the stream successfully +sample-nats-box-785f8458d7-wtnfx:~# nats stream info ORDERS +Information for Stream ORDERS created 2021-09-03T07:12:07Z + +Configuration: + + Subjects: ORDERS.* + Acknowledgements: true + Retention: File - Limits + Replicas: 1 + Discard Policy: Old + Duplicate Window: 2m0s + Maximum Messages: unlimited + Maximum Bytes: unlimited + Maximum Age: 1y0d0h0m0s + Maximum Message Size: unlimited + Maximum Consumers: unlimited + + +Cluster Information: + + Name: nats + Leader: nats-0 + +State: + + Messages: 2 + Bytes: 98 B + FirstSeq: 1 @ 2021-09-03T08:55:39 UTC + LastSeq: 2 @ 2021-09-03T08:56:11 UTC + Active Consumers: 0 + +sample-nats-box-785f8458d7-wtnfx:~# exit +``` + +We have successfully deployed a NATS cluster, created a stream and publish some messages into the stream. In the subsequent sections, we are going to backup this sample data using Stash. + +## Prepare for Backup + +In this section, we are going to prepare the necessary resources (i.e. connection information, backend information, etc.) before backup. + +### Ensure NATS Addon + +When you install Stash, it will automatically install all the official addons. Make sure that NATS addon has been installed properly using the following command. + +```bash +❯ kubectl get tasks.stash.appscode.com | grep nats +nats-backup-2.6.1 24m +nats-restore-2.6.1 24m +``` + +This addon should be able to take backup of the NATS streams with matching major versions as discussed in [Addon Version Compatibility](/docs/v2024.12.18/addons/nats/README#addon-version-compatibility). + +### Create Secret + + Lets create a secret with nkey credentials. Below is the YAML of `Secret` object we are going to create. + +```yaml +apiVersion: v1 +kind: Secret +metadata: + labels: + app.kubernetes.io/instance: sample-nats + name: sample-nats-auth + namespace: demo +data: + nkey: U1VBRDJRWlBJQU9aRTdTQlZHUjJQS09YVkEyTDYzVUQ1UEVWNkVVUTZPTEdUS0ZJV0o0VTNaQ1NDQQpVQVdHR1ZFSFhJRU9XWVZCTjdSTzdJSUtJWEhJT0s2SldXVURKT1dJVVo2TDNYTUlXTTVJRkdQRAo= +``` + +Let's create the `Secret` we have shown above, +```bash +$ kubectl apply -f https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/nats/authentications/nkey-auth/examples/secret.yaml +secret/sample-nats-auth created +``` + + +### Create AppBinding + +Stash needs to know how to connect with the NATS server. An `AppBinding` exactly provides this information. It holds the Service and Secret information of the NATS server. You have to point to the respective `AppBinding` as a target of backup instead of the NATS server itself. + +Here, is the YAML of the `AppBinding` that we are going to create for the NATS server we have deployed earlier. + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + labels: + app.kubernetes.io/instance: sample-nats + name: sample-nats + namespace: demo +spec: + clientConfig: + service: + name: sample-nats + port: 4222 + scheme: nats + secret: + name: sample-nats-auth + type: nats.io/nats + version: 2.6.1 +``` + +Here, + +- `.spec.clientConfig.service` specifies the Service information to use to connects with the NATS server. +- `.spec.secret` specifies the name of the Secret that holds necessary credentials to access the server. +- `.spec.type` specifies the type of the target. This is particularly helpful in auto-backup where you want to use different path prefixes for different types of target. + +Let's create the `AppBinding` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/nats/authentications/nkey-auth/examples/appbinding.yaml +appbinding.appcatalog.appscode.com/sample-nats created +``` + +### Prepare Backend + +We are going to store our backed up data into a GCS bucket. So, we need to create a Secret with GCS credentials and a `Repository` object with the bucket information. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +**Create Storage Secret:** + +At first, let's create a secret called `gcs-secret` with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat downloaded-sa-json.key > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create Repository:** + +Now, create a `Repository` object with the information of your desired bucket. Below is the YAML of `Repository` object we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /demo/nats/sample-nats + storageSecretName: gcs-secret +``` + +Let's create the `Repository` we have shown above, + +```bash +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/nats/authentications/nkey-auth/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our streams into our desired backend. + +### Backup + +To schedule a backup, we have to create a `BackupConfiguration` object targeting the respective `AppBinding` of our NATS server. Then, Stash will create a CronJob to periodically backup the streams. + +#### Create BackupConfiguration + +Below is the YAML for `BackupConfiguration` object that we are going to use to backup the streams of the NATS server we have created earlier, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-nats-backup + namespace: demo +spec: + task: + name: nats-backup-2.6.1 + schedule: "*/5 * * * *" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + interimVolumeTemplate: + metadata: + name: sample-nats-backup-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +Here, + +- `.spec.schedule` specifies that we want to backup the streams at 5 minutes intervals. +- `.spec.task.name` specifies the name of the Task object that specifies the necessary Functions and their execution order to backup NATS streams. +- `.spec.repository.name` specifies the Repository CR name we have created earlier with backend information. +- `.spec.target.ref` refers to the AppBinding object that holds the connection information of our targeted NATS server. +- `spec.interimVolumeTemplate` specifies a PVC template that will be used by Stash to hold the dumped data temporarily before uploading it into the cloud bucket. +- `.spec.retentionPolicy` specifies a policy indicating how we want to cleanup the old backups. + +Let's create the `BackupConfiguration` object we have shown above, + +```bash +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/nats/authentications/nkey-auth/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/sample-nats-backup created +``` + +#### Verify Backup Setup Successful + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. Let's verify the `Phase` of the BackupConfiguration, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-nats-backup nats-backup-2.6.1 */5 * * * * Ready 11s +``` + +#### Verify CronJob + +Stash will create a CronJob with the schedule specified in `spec.schedule` field of `BackupConfiguration` object. + +Verify that the CronJob has been created using the following command, + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-nats-backup */5 * * * * False 0 14s +``` + +#### Wait for BackupSession + +The `sample-nats-backup` CronJob will trigger a backup on each scheduled slot by creating a `BackupSession` object. + +Now, wait for a schedule to appear. Run the following command to watch for `BackupSession` object, + +```bash +❯ kubectl get backupsession -n demo -w +NAME INVOKER-TYPE INVOKER-NAME PHASE DURATION AGE +sample-nats-backup-8x8fp BackupConfiguration sample-nats-backup Succeeded 42s 8m28s +``` + +Here, the phase `Succeeded` means that the backup process has been completed successfully. + +#### Verify Backup + +Now, we are going to verify whether the backed up data is present in the backend or not. Once a backup is completed, Stash will update the respective `Repository` object to reflect the backup completion. Check that the repository `gcs-repo` has been updated by the following command, + +```bash +❯ kubectl get repository -n demo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo true 1.382 KiB 1 9m4s 24m +``` + +Now, if we navigate to the GCS bucket, we will see the backed up data has been stored in `demo/nats/sample-nats` directory as specified by `.spec.backend.gcs.prefix` field of the `Repository` object. + +
+ Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ + + + +> Note: Stash keeps all the backed up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Restore + +If you have followed the previous sections properly, you should have a successful backup of your nats streams. Now, we are going to show how you can restore the streams from the backed up data. + +### Restore Into the Same NATS Cluster + +You can restore your data into the same NATS cluster you have backed up from or into a different NATS cluster in the same cluster or a different cluster. In this section, we are going to show you how to restore in the same NATS cluster which may be necessary when you have accidentally lost any data. + +#### Temporarily Pause Backup + +At first, let's stop taking any further backup of the NATS streams so that no backup runs after we delete the sample data. We are going to pause the `BackupConfiguration` object. Stash will stop taking any further backup when the `BackupConfiguration` is paused. + +Let's pause the `sample-nats-backup` BackupConfiguration, + +```bash +$ kubectl patch backupconfiguration -n demo sample-nats-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/sample-nats-backup patched +``` + +Verify that the `BackupConfiguration` has been paused, + +```bash +❯ kubectl get backupconfiguration -n demo sample-nats-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-nats-backup nats-backup-2.6.1 */5 * * * * true Ready 2d18h +``` + +Notice the `PAUSED` column. Value `true` for this field means that the `BackupConfiguration` has been paused. + +Stash will also suspend the respective CronJob. + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-nats-backup */5 * * * * True 0 56s 2d18h +``` + +#### Simulate Disaster + +Now, let's simulate a disaster scenario. Here, we are going to exec into the nats-box pod and delete the sample data we have inserted earlier. + +```bash +❯ kubectl exec -n demo -it sample-nats-box-785f8458d7-wtnfx -- sh -l +... +# Let's export the file path of user.nk file as environment variable to make further commands re-usable. +sample-nats-box-785f8458d7-wtnfx:~# export NATS_NKEY=/tmp/user.nk + +# delete the stream "ORDERS" +sample-nats-box-785f8458d7-wtnfx:~# nats stream rm ORDERS -f + +# verify that the stream has been deleted +sample-nats-box-785f8458d7-wtnfx:~# nats stream ls +No Streams defined +sample-nats-box-785f8458d7-wtnfx:~# exit +``` + +#### Create RestoreSession + +To restore the streams, you have to create a `RestoreSession` object pointing to the `AppBinding` of the targeted NATS server. + +Here, is the YAML of the `RestoreSession` object that we are going to use for restoring the streams of the NATS server. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-nats-restore + namespace: demo +spec: + task: + name: nats-restore-2.6.1 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + interimVolumeTemplate: + metadata: + name: nats-restore-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + rules: + - snapshots: [latest] +``` + +Here, + +- `.spec.task.name` specifies the name of the Task object that specifies the necessary Functions and their execution order to restore NATS streams. +- `.spec.repository.name` specifies the Repository object that holds the backend information where our backed up data has been stored. +- `.spec.target.ref` refers to the AppBinding object that holds the connection information of our targeted NATS server. +- `.spec.interimVolumeTemplate` specifies a PVC template that will be used by Stash to hold the restored data temporarily before injecting into the NATS server. +- `.spec.rules` specifies that we are restoring data from the latest backup snapshot of the streams. + +Let's create the `RestoreSession` object object we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/nats/authentications/nkey-auth/examples/restoresession.yaml +restoresession.stash.appscode.com/sample-nats-restore created +``` + +Once, you have created the `RestoreSession` object, Stash will create a restore Job. Run the following command to watch the phase of the `RestoreSession` object, + +```bash +❯ kubectl get restoresession -n demo -w +NAME REPOSITORY PHASE DURATION AGE +sample-nats-restore gcs-repo Succeeded 15s 55s +``` + +The `Succeeded` phase means that the restore process has been completed successfully. + +#### Verify Restored Data + +Now, let's exec into the nats-box pod and verify whether data actual data has been restored or not, + +```bash +❯ kubectl exec -n demo -it sample-nats-box-785f8458d7-wtnfx -- sh -l +... +# Let's export the file path of user.nk file as environment variable to make further commands re-usable. +sample-nats-box-785f8458d7-wtnfx:~# export NATS_NKEY=/tmp/user.nk + +# Verify that the stream has been restored successfully +sample-nats-box-785f8458d7-wtnfx:~# nats stream ls +Streams: + + ORDERS + +# Verify that the messages have been restored successfully +sample-nats-box-785f8458d7-wtnfx:~# nats stream info ORDERS +Information for Stream ORDERS created 2021-09-03T07:12:07Z + +Configuration: + + Subjects: ORDERS.* + Acknowledgements: true + Retention: File - Limits + Replicas: 1 + Discard Policy: Old + Duplicate Window: 2m0s + Maximum Messages: unlimited + Maximum Bytes: unlimited + Maximum Age: 1y0d0h0m0s + Maximum Message Size: unlimited + Maximum Consumers: unlimited + + +Cluster Information: + + Name: nats + Leader: nats-0 + +State: + + Messages: 2 + Bytes: 98 B + FirstSeq: 1 @ 2021-09-03T08:55:39 UTC + LastSeq: 2 @ 2021-09-03T08:56:11 UTC + Active Consumers: 0 + +sample-nats-box-785f8458d7-wtnfx:~# exit +``` + +Hence, we can see from the above output that the deleted data has been restored successfully from the backup. + +#### Resume Backup + +Since our data has been restored successfully we can now resume our usual backup process. Resume the `BackupConfiguration` using following command, + +```bash +❯ kubectl patch backupconfiguration -n demo sample-nats-backup --type="merge" --patch='{"spec": {"paused": false}}' +backupconfiguration.stash.appscode.com/sample-nats-backup patched +``` + +Verify that the `BackupConfiguration` has been resumed, +```bash +❯ kubectl get backupconfiguration -n demo sample-nats-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-nats-backup nats-backup-2.6.1 */5 * * * * false Ready 2d19h +``` + +Here, `false` in the `PAUSED` column means the backup has been resumed successfully. The CronJob also should be resumed now. + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-nats-backup */5 * * * * False 0 3m24s 4h54m +``` + +Here, `False` in the `SUSPEND` column means the CronJob is no longer suspended and will trigger in the next schedule. + +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo backupconfiguration sample-nats-backup +kubectl delete -n demo restoresession sample-nats-restore +kubectl delete -n demo repository gcs-repo +# delete the nats chart +helm delete sample-nats -n demo +``` diff --git a/content/docs/v2024.12.18/addons/nats/authentications/token-auth/examples/appbinding.yaml b/content/docs/v2024.12.18/addons/nats/authentications/token-auth/examples/appbinding.yaml new file mode 100644 index 0000000000..7e4a9e8c29 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/authentications/token-auth/examples/appbinding.yaml @@ -0,0 +1,17 @@ +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + labels: + app.kubernetes.io/instance: sample-nats + name: sample-nats + namespace: demo +spec: + clientConfig: + service: + name: sample-nats + port: 4222 + scheme: nats + secret: + name: sample-nats-auth + type: nats.io/nats + version: 2.6.1 diff --git a/content/docs/v2024.12.18/addons/nats/authentications/token-auth/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/addons/nats/authentications/token-auth/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..70b58a6647 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/authentications/token-auth/examples/backupconfiguration.yaml @@ -0,0 +1,29 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-nats-backup + namespace: demo +spec: + task: + name: nats-backup-2.6.1 + schedule: "*/5 * * * *" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + interimVolumeTemplate: + metadata: + name: sample-nats-backup-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/nats/authentications/token-auth/examples/repository.yaml b/content/docs/v2024.12.18/addons/nats/authentications/token-auth/examples/repository.yaml new file mode 100644 index 0000000000..dae91419b2 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/authentications/token-auth/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /demo/nats/sample-nats + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/addons/nats/authentications/token-auth/examples/restoresession.yaml b/content/docs/v2024.12.18/addons/nats/authentications/token-auth/examples/restoresession.yaml new file mode 100644 index 0000000000..9c5f52422a --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/authentications/token-auth/examples/restoresession.yaml @@ -0,0 +1,26 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-nats-restore + namespace: demo +spec: + task: + name: nats-restore-2.6.1 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + interimVolumeTemplate: + metadata: + name: nats-restore-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/addons/nats/authentications/token-auth/examples/secret.yaml b/content/docs/v2024.12.18/addons/nats/authentications/token-auth/examples/secret.yaml new file mode 100644 index 0000000000..372666137b --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/authentications/token-auth/examples/secret.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: Secret +metadata: + labels: + app.kubernetes.io/instance: sample-nats + name: sample-nats-auth + namespace: demo +data: + token: c2VjcmV0 diff --git a/content/docs/v2024.12.18/addons/nats/authentications/token-auth/images/sample-nats-backup.png b/content/docs/v2024.12.18/addons/nats/authentications/token-auth/images/sample-nats-backup.png new file mode 100644 index 0000000000..b3f603de78 Binary files /dev/null and b/content/docs/v2024.12.18/addons/nats/authentications/token-auth/images/sample-nats-backup.png differ diff --git a/content/docs/v2024.12.18/addons/nats/authentications/token-auth/index.md b/content/docs/v2024.12.18/addons/nats/authentications/token-auth/index.md new file mode 100644 index 0000000000..888f9e6f48 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/authentications/token-auth/index.md @@ -0,0 +1,721 @@ +--- +title: NATS with Token authentication +description: Backup NATS with Token authetication using Stash +menu: + docs_v2024.12.18: + identifier: stash-nats-token-auth + name: Token Authentication + parent: stash-nats-auth + weight: 15 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup NATS with Token Authentication using Stash + +Stash `{{< param "info.version" >}}` supports backup and restoration of NATS streams. This guide will show you how you can backup & restore a NATS server with token authentication using Stash. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. +- Install Stash in your cluster following the steps [here](/docs/v2024.12.18/setup/install/stash/). +- If you are not familiar with how Stash backup and restore NATS streams, please check the following guide [here](/docs/v2024.12.18/addons/nats/overview/). + +You have to be familiar with following custom resources: + +- [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) +- [Function](/docs/v2024.12.18/concepts/crds/function/) +- [Task](/docs/v2024.12.18/concepts/crds/task/) +- [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) +- [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) +- [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + +To keep things isolated, we are going to use a separate namespace called `demo` throughout this tutorial. Create `demo` namespace if you haven't created already. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> Note: YAML files used in this tutorial are stored [here](https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/nats/authentications/token-auth/examples). + +## Prepare NATS + +In this section, we are going to deploy a NATS cluster with token authentication enabled. Then, we are going to create a stream and publish some messages into it. + +### Deploy NATS Cluster + +At first, let's deploy a NATS cluster. Here, we are going to use [NATS](https://github.com/nats-io/k8s/tree/main/helm/charts/nats ) chart from [nats.io](https://nats.io/). + +Let's deploy a NATS cluster named `sample-nats` using Helm as below, + +```bash +# Add nats chart registry +$ helm repo add nats https://nats-io.github.io/k8s/helm/charts/ +# Update helm registries +$ helm repo update +# Install nats/nats chart into demo namespace +$ helm install sample-nats nats/nats -n demo \ +--set nats.jetstream.enabled=true \ +--set nats.jetstream.fileStorage.enabled=true \ +--set cluster.enabled=true \ +--set cluster.replicas=3 \ +--set auth.enabled=true \ +--set auth.token="secret" +``` + +This chart will create the necessary StatefulSet, Service, PVCs etc. for the NATS cluster. You can easily view all the resources created by chart using [ketall](https://github.com/corneliusweig/ketall) `kubectl` plugin as below, + +```bash +❯ kubectl get-all -n demo -l app.kubernetes.io/instance=sample-nats +NAME NAMESPACE AGE +configmap/sample-nats-config demo 11m +endpoints/sample-nats demo 11m +persistentvolumeclaim/sample-nats-js-pvc-sample-nats-0 demo 11m +persistentvolumeclaim/sample-nats-js-pvc-sample-nats-1 demo 10m +persistentvolumeclaim/sample-nats-js-pvc-sample-nats-2 demo 10m +pod/sample-nats-0 demo 11m +pod/sample-nats-1 demo 10m +pod/sample-nats-2 demo 10m +service/sample-nats demo 11m +controllerrevision.apps/sample-nats-775468b94f demo 11m +statefulset.apps/sample-nats demo 11m +endpointslice.discovery.k8s.io/sample-nats-7n7v6 demo 11m +``` + +Now, wait for the NATS server pods `sample-nats-0`, `sample-nats-1`, `sample-nats-2` to go into `Running` state, + +```bash +❯ kubectl get pod -n demo -l app.kubernetes.io/instance=sample-nats +NAME READY STATUS RESTARTS AGE +sample-nats-0 3/3 Running 0 9m58s +sample-nats-1 3/3 Running 0 9m35s +sample-nats-2 3/3 Running 0 9m12s +``` + +Once the pods are in `Running` state, verify that the NATS server is ready to accept the connections. + +```bash +❯ kubectl logs -n demo sample-nats-0 -c nats +[7] 2021/09/06 08:33:53.111508 [INF] Starting nats-server +[7] 2021/09/06 08:33:53.111560 [INF] Version: 2.6.1 +... +[7] 2021/09/06 08:33:53.116004 [INF] Server is ready +``` + +From the above log, we can see the NATS server is ready to accept connections. + +### Insert Sample Data +The above Helm chart also deploy a pod with nats-box image which can be used to interact with the NATS server. Let's verify the nats-box pod has been created. + +```bash +❯ kubectl get pod -n demo -l app=sample-nats-box +NAME READY STATUS RESTARTS AGE +sample-nats-box-785f8458d7-wtnfx 1/1 Running 0 7m20s +``` + +Let's exec into the nats-box pod, + +```bash +❯ kubectl exec -n demo -it sample-nats-box-785f8458d7-wtnfx -- sh -l +... +# Let's export the token as environment variables to make further commands re-usable. +sample-nats-box-785f8458d7-wtnfx:~# export NATS_USER=secret + +# Let's create a stream named "ORDERS" +sample-nats-box-785f8458d7-wtnfx:~# nats stream add ORDERS --subjects "ORDERS.*" --ack --max-msgs=-1 --max-bytes=-1 --max-age=1y --storage file --retention limits --max-msg-size=-1 --max-msgs-per-subject=-1 --discard old --dupe-window="0s" --replicas 1 +Stream ORDERS was created + +Information for Stream ORDERS created 2021-09-03T07:12:07Z + +Configuration: + + Subjects: ORDERS.* + Acknowledgements: truee + Retention: File - Limits + Replicas: 1 + Discard Policy: Old + Duplicate Window: 2m0s + Maximum Messages: unlimited + Maximum Bytes: unlimited + Maximum Age: 1y0d0h0m0s + Maximum Message Size: unlimited + Maximum Consumers: unlimited + + +Cluster Information: + + Name: nats + Leader: nats-0 + +State: + + Messages: 0 + Bytes: 0 B + FirstSeq: 0 + LastSeq: 0 + Active Consumers: 0 + + +# Verify that the stream has been created successfully +sample-nats-box-785f8458d7-wtnfx:~# nats stream ls +Streams: + + ORDERS + +# Lets add some messages to the stream "ORDERS" +sample-nats-box-785f8458d7-wtnfx:~# nats pub ORDERS.scratch hello +08:55:39 Published 5 bytes to "ORDERS.scratch" + +# Add another message +sample-nats-box-785f8458d7-wtnfx:~# nats pub ORDERS.scratch world +08:56:11 Published 5 bytes to "ORDERS.scratch" + +# Verify that the messages have been published to the stream successfully +sample-nats-box-785f8458d7-wtnfx:~# nats stream info ORDERS +Information for Stream ORDERS created 2021-09-03T07:12:07Z + +Configuration: + + Subjects: ORDERS.* + Acknowledgements: true + Retention: File - Limits + Replicas: 1 + Discard Policy: Old + Duplicate Window: 2m0s + Maximum Messages: unlimited + Maximum Bytes: unlimited + Maximum Age: 1y0d0h0m0s + Maximum Message Size: unlimited + Maximum Consumers: unlimited + + +Cluster Information: + + Name: nats + Leader: nats-0 + +State: + + Messages: 2 + Bytes: 98 B + FirstSeq: 1 @ 2021-09-03T08:55:39 UTC + LastSeq: 2 @ 2021-09-03T08:56:11 UTC + Active Consumers: 0 + +sample-nats-box-785f8458d7-wtnfx:~# exit +``` + +We have successfully deployed a NATS cluster, created a stream and publish some messages into the stream. In the subsequent sections, we are going to backup this sample data using Stash. + +## Prepare for Backup + +In this section, we are going to prepare the necessary resources (i.e. connection information, backend information, etc.) before backup. + +### Ensure NATS Addon + +When you install Stash, it will automatically install all the official addons. Make sure that NATS addon has been installed properly using the following command. + +```bash +❯ kubectl get tasks.stash.appscode.com | grep nats +nats-backup-2.6.1 24m +nats-restore-2.6.1 24m +``` + +This addon should be able to take backup of the NATS streams with matching major versions as discussed in [Addon Version Compatibility](/docs/v2024.12.18/addons/nats/README#addon-version-compatibility). + +### Create Secret + + Lets create a secret with token auth credentials. Below is the YAML of `Secret` object we are going to create. + +```yaml +apiVersion: v1 +kind: Secret +metadata: + labels: + app.kubernetes.io/instance: sample-nats + name: sample-nats-auth + namespace: demo +data: + token: c2VjcmV0 +``` + +Let's create the `Secret` we have shown above, +```bash +$ kubectl apply -f https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/nats/authentications/token-auth/examples/secret.yaml +secret/sample-nats-auth created +``` + + +### Create AppBinding + +Stash needs to know how to connect with the NATS server. An `AppBinding` exactly provides this information. It holds the Service and Secret information of the NATS server. You have to point to the respective `AppBinding` as a target of backup instead of the NATS server itself. + +Here, is the YAML of the `AppBinding` that we are going to create for the NATS server we have deployed earlier. + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + labels: + app.kubernetes.io/instance: sample-nats + name: sample-nats + namespace: demo +spec: + clientConfig: + service: + name: sample-nats + port: 4222 + scheme: nats + secret: + name: sample-nats-auth + type: nats.io/nats + version: 2.6.1 +``` + +Here, + +- `.spec.clientConfig.service` specifies the Service information to use to connects with the NATS server. +- `.spec.secret` specifies the name of the Secret that holds necessary credentials to access the server. +- `.spec.type` specifies the type of the target. This is particularly helpful in auto-backup where you want to use different path prefixes for different types of target. + +Let's create the `AppBinding` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/nats/authentications/token-auth/examples/appbinding.yaml +appbinding.appcatalog.appscode.com/sample-nats created +``` + +### Prepare Backend + +We are going to store our backed up data into a GCS bucket. So, we need to create a Secret with GCS credentials and a `Repository` object with the bucket information. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +**Create Storage Secret:** + +At first, let's create a secret called `gcs-secret` with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat downloaded-sa-json.key > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create Repository:** + +Now, create a `Repository` object with the information of your desired bucket. Below is the YAML of `Repository` object we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /demo/nats/sample-nats + storageSecretName: gcs-secret +``` + +Let's create the `Repository` we have shown above, + +```bash +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/nats/authentications/token-auth/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our streams into our desired backend. + +### Backup + +To schedule a backup, we have to create a `BackupConfiguration` object targeting the respective `AppBinding` of our NATS server. Then, Stash will create a CronJob to periodically backup the streams. + +#### Create BackupConfiguration + +Below is the YAML for `BackupConfiguration` object that we are going to use to backup the streams of the NATS server we have created earlier, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-nats-backup + namespace: demo +spec: + task: + name: nats-backup-2.6.1 + schedule: "*/5 * * * *" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + interimVolumeTemplate: + metadata: + name: sample-nats-backup-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +Here, + +- `.spec.schedule` specifies that we want to backup the streams at 5 minutes intervals. +- `.spec.task.name` specifies the name of the Task object that specifies the necessary Functions and their execution order to backup NATS streams. +- `.spec.repository.name` specifies the Repository CR name we have created earlier with backend information. +- `.spec.target.ref` refers to the AppBinding object that holds the connection information of our targeted NATS server. +- `spec.interimVolumeTemplate` specifies a PVC template that will be used by Stash to hold the dumped data temporarily before uploading it into the cloud bucket. +- `.spec.retentionPolicy` specifies a policy indicating how we want to cleanup the old backups. + +Let's create the `BackupConfiguration` object we have shown above, + +```bash +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/nats/authentications/token-auth/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/sample-nats-backup created +``` + +#### Verify Backup Setup Successful + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. Let's verify the `Phase` of the BackupConfiguration, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-nats-backup nats-backup-2.6.1 */5 * * * * Ready 11s +``` + +#### Verify CronJob + +Stash will create a CronJob with the schedule specified in `spec.schedule` field of `BackupConfiguration` object. + +Verify that the CronJob has been created using the following command, + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-nats-backup */5 * * * * False 0 14s +``` + +#### Wait for BackupSession + +The `sample-nats-backup` CronJob will trigger a backup on each scheduled slot by creating a `BackupSession` object. + +Now, wait for a schedule to appear. Run the following command to watch for `BackupSession` object, + +```bash +❯ kubectl get backupsession -n demo -w +NAME INVOKER-TYPE INVOKER-NAME PHASE DURATION AGE +sample-nats-backup-8x8fp BackupConfiguration sample-nats-backup Succeeded 42s 8m28s +``` + +Here, the phase `Succeeded` means that the backup process has been completed successfully. + +#### Verify Backup + +Now, we are going to verify whether the backed up data is present in the backend or not. Once a backup is completed, Stash will update the respective `Repository` object to reflect the backup completion. Check that the repository `gcs-repo` has been updated by the following command, + +```bash +❯ kubectl get repository -n demo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo true 1.382 KiB 1 9m4s 24m +``` + +Now, if we navigate to the GCS bucket, we will see the backed up data has been stored in `demo/nats/sample-nats` directory as specified by `.spec.backend.gcs.prefix` field of the `Repository` object. + +
+ Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ + + + +> Note: Stash keeps all the backed up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Restore + +If you have followed the previous sections properly, you should have a successful backup of your nats streams. Now, we are going to show how you can restore the streams from the backed up data. + +### Restore Into the Same NATS Cluster + +You can restore your data into the same NATS cluster you have backed up from or into a different NATS cluster in the same cluster or a different cluster. In this section, we are going to show you how to restore in the same NATS cluster which may be necessary when you have accidentally lost any data. + +#### Temporarily Pause Backup + +At first, let's stop taking any further backup of the NATS streams so that no backup runs after we delete the sample data. We are going to pause the `BackupConfiguration` object. Stash will stop taking any further backup when the `BackupConfiguration` is paused. + +Let's pause the `sample-nats-backup` BackupConfiguration, + +```bash +$ kubectl patch backupconfiguration -n demo sample-nats-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/sample-nats-backup patched +``` + +Verify that the `BackupConfiguration` has been paused, + +```bash +❯ kubectl get backupconfiguration -n demo sample-nats-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-nats-backup nats-backup-2.6.1 */5 * * * * true Ready 2d18h +``` + +Notice the `PAUSED` column. Value `true` for this field means that the `BackupConfiguration` has been paused. + +Stash will also suspend the respective CronJob. + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-nats-backup */5 * * * * True 0 56s 2d18h +``` + +#### Simulate Disaster + +Now, let's simulate a disaster scenario. Here, we are going to exec into the nats-box pod and delete the sample data we have inserted earlier. + +```bash +❯ kubectl exec -n demo -it sample-nats-box-785f8458d7-wtnfx -- sh -l +... +# Let's export the token as environment variables to make further commands re-usable. +sample-nats-box-785f8458d7-wtnfx:~# export NATS_USER=secret + +# delete the stream "ORDERS" +sample-nats-box-785f8458d7-wtnfx:~# nats stream rm ORDERS -f + +# verify that the stream has been deleted +sample-nats-box-785f8458d7-wtnfx:~# nats stream ls +No Streams defined +sample-nats-box-785f8458d7-wtnfx:~# exit +``` + +#### Create RestoreSession + +To restore the streams, you have to create a `RestoreSession` object pointing to the `AppBinding` of the targeted NATS server. + +Here, is the YAML of the `RestoreSession` object that we are going to use for restoring the streams of the NATS server. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-nats-restore + namespace: demo +spec: + task: + name: nats-restore-2.6.1 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + interimVolumeTemplate: + metadata: + name: nats-restore-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + rules: + - snapshots: [latest] +``` + +Here, + +- `.spec.task.name` specifies the name of the Task object that specifies the necessary Functions and their execution order to restore NATS streams. +- `.spec.repository.name` specifies the Repository object that holds the backend information where our backed up data has been stored. +- `.spec.target.ref` refers to the AppBinding object that holds the connection information of our targeted NATS server. +- `.spec.interimVolumeTemplate` specifies a PVC template that will be used by Stash to hold the restored data temporarily before injecting into the NATS server. +- `.spec.rules` specifies that we are restoring data from the latest backup snapshot of the streams. + +Let's create the `RestoreSession` object object we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/nats/authentications/token-auth/examples/restoresession.yaml +restoresession.stash.appscode.com/sample-nats-restore created +``` + +Once, you have created the `RestoreSession` object, Stash will create a restore Job. Run the following command to watch the phase of the `RestoreSession` object, + +```bash +❯ kubectl get restoresession -n demo -w +NAME REPOSITORY PHASE DURATION AGE +sample-nats-restore gcs-repo Succeeded 15s 55s +``` + +The `Succeeded` phase means that the restore process has been completed successfully. + +#### Verify Restored Data + +Now, let's exec into the nats-box pod and verify whether data actual data has been restored or not, + +```bash +❯ kubectl exec -n demo -it sample-nats-box-785f8458d7-wtnfx -- sh -l +... +# Let's export the token as environment variables to make further commands re-usable. +sample-nats-box-785f8458d7-wtnfx:~# export NATS_USER=secret + +# Verify that the stream has been restored successfully +sample-nats-box-785f8458d7-wtnfx:~# nats stream ls +Streams: + + ORDERS + +# Verify that the messages have been restored successfully +sample-nats-box-785f8458d7-wtnfx:~# nats stream info ORDERS +Information for Stream ORDERS created 2021-09-03T07:12:07Z + +Configuration: + + Subjects: ORDERS.* + Acknowledgements: true + Retention: File - Limits + Replicas: 1 + Discard Policy: Old + Duplicate Window: 2m0s + Maximum Messages: unlimited + Maximum Bytes: unlimited + Maximum Age: 1y0d0h0m0s + Maximum Message Size: unlimited + Maximum Consumers: unlimited + + +Cluster Information: + + Name: nats + Leader: nats-0 + +State: + + Messages: 2 + Bytes: 98 B + FirstSeq: 1 @ 2021-09-03T08:55:39 UTC + LastSeq: 2 @ 2021-09-03T08:56:11 UTC + Active Consumers: 0 + +sample-nats-box-785f8458d7-wtnfx:~# exit +``` + +Hence, we can see from the above output that the deleted data has been restored successfully from the backup. + +#### Resume Backup + +Since our data has been restored successfully we can now resume our usual backup process. Resume the `BackupConfiguration` using following command, + +```bash +❯ kubectl patch backupconfiguration -n demo sample-nats-backup --type="merge" --patch='{"spec": {"paused": false}}' +backupconfiguration.stash.appscode.com/sample-nats-backup patched +``` + +Verify that the `BackupConfiguration` has been resumed, +```bash +❯ kubectl get backupconfiguration -n demo sample-nats-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-nats-backup nats-backup-2.6.1 */5 * * * * false Ready 2d19h +``` + +Here, `false` in the `PAUSED` column means the backup has been resumed successfully. The CronJob also should be resumed now. + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-nats-backup */5 * * * * False 0 3m24s 4h54m +``` + +Here, `False` in the `SUSPEND` column means the CronJob is no longer suspended and will trigger in the next schedule. + +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo backupconfiguration sample-nats-backup +kubectl delete -n demo restoresession sample-nats-restore +kubectl delete -n demo repository gcs-repo +# delete the nats chart +helm delete sample-nats -n demo +``` diff --git a/content/docs/v2024.12.18/addons/nats/customization/examples/backup/multi-retention-policy.yaml b/content/docs/v2024.12.18/addons/nats/customization/examples/backup/multi-retention-policy.yaml new file mode 100644 index 0000000000..0e8dc27263 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/customization/examples/backup/multi-retention-policy.yaml @@ -0,0 +1,24 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-nats-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: nats-backup-2.6.1 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nat + retentionPolicy: + name: sample-nats-retention + keepLast: 5 + keepDaily: 10 + keepWeekly: 20 + keepMonthly: 50 + keepYearly: 100 + prune: true diff --git a/content/docs/v2024.12.18/addons/nats/customization/examples/backup/passing-args.yaml b/content/docs/v2024.12.18/addons/nats/customization/examples/backup/passing-args.yaml new file mode 100644 index 0000000000..549b46287b --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/customization/examples/backup/passing-args.yaml @@ -0,0 +1,23 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-nats-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: nats-backup-2.6.1 + params: + - name: args + value: --check + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/nats/customization/examples/backup/passing-streams.yaml b/content/docs/v2024.12.18/addons/nats/customization/examples/backup/passing-streams.yaml new file mode 100644 index 0000000000..9057e8a043 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/customization/examples/backup/passing-streams.yaml @@ -0,0 +1,23 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-nats-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: nats-backup-2.6.1 + params: + - name: streams + value: "str1,str2" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/nats/customization/examples/backup/resource-limit.yaml b/content/docs/v2024.12.18/addons/nats/customization/examples/backup/resource-limit.yaml new file mode 100644 index 0000000000..a9f4fc5126 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/customization/examples/backup/resource-limit.yaml @@ -0,0 +1,29 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-nats-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: nats-backup-2.6.1 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + runtimeSettings: + container: + resources: + requests: + cpu: "200m" + memory: "1Gi" + limits: + cpu: "200m" + memory: "1Gi" + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/nats/customization/examples/backup/specific-user.yaml b/content/docs/v2024.12.18/addons/nats/customization/examples/backup/specific-user.yaml new file mode 100644 index 0000000000..4e4774b9d0 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/customization/examples/backup/specific-user.yaml @@ -0,0 +1,25 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-nats-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: nats-backup-2.6.1 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + runtimeSettings: + pod: + securityContext: + runAsUser: 0 + runAsGroup: 0 + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/nats/customization/examples/restore/passing-args.yaml b/content/docs/v2024.12.18/addons/nats/customization/examples/restore/passing-args.yaml new file mode 100644 index 0000000000..c637f1b9e0 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/customization/examples/restore/passing-args.yaml @@ -0,0 +1,20 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-nats-restore + namespace: demo +spec: + task: + name: nats-restore-2.6.1 + params: + - name: args + value: --no-progress + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/addons/nats/customization/examples/restore/passing-streams.yaml b/content/docs/v2024.12.18/addons/nats/customization/examples/restore/passing-streams.yaml new file mode 100644 index 0000000000..3bb16bb0b0 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/customization/examples/restore/passing-streams.yaml @@ -0,0 +1,20 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-nats-restore + namespace: demo +spec: + task: + name: nats-restore-2.6.1 + params: + - name: streams + value: "str1,str2" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/addons/nats/customization/examples/restore/resource-limit.yaml b/content/docs/v2024.12.18/addons/nats/customization/examples/restore/resource-limit.yaml new file mode 100644 index 0000000000..86a71af7ee --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/customization/examples/restore/resource-limit.yaml @@ -0,0 +1,26 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-nats-restore + namespace: demo +spec: + task: + name: nats-backup-2.6.1 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + runtimeSettings: + container: + resources: + requests: + cpu: "200m" + memory: "1Gi" + limits: + cpu: "200m" + memory: "1Gi" + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/addons/nats/customization/examples/restore/specific-snapshot.yaml b/content/docs/v2024.12.18/addons/nats/customization/examples/restore/specific-snapshot.yaml new file mode 100644 index 0000000000..32ed0fa0cf --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/customization/examples/restore/specific-snapshot.yaml @@ -0,0 +1,17 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-nats-restore + namespace: demo +spec: + task: + name: nats-backup-2.6.1 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + rules: + - snapshots: [4bc21d6f] diff --git a/content/docs/v2024.12.18/addons/nats/customization/examples/restore/specific-user.yaml b/content/docs/v2024.12.18/addons/nats/customization/examples/restore/specific-user.yaml new file mode 100644 index 0000000000..7ffa61821c --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/customization/examples/restore/specific-user.yaml @@ -0,0 +1,22 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-nats-restore + namespace: demo +spec: + task: + name: nats-backup-2.6.1 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + runtimeSettings: + pod: + securityContext: + runAsUser: 0 + runAsGroup: 0 + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/addons/nats/customization/index.md b/content/docs/v2024.12.18/addons/nats/customization/index.md new file mode 100644 index 0000000000..53d6639183 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/customization/index.md @@ -0,0 +1,446 @@ +--- +title: NATS Backup Customization +description: Customizing NATS Backup and Restore process with Stash +menu: + docs_v2024.12.18: + identifier: stash-nats-customization + name: Customizing Backup & Restore Process + parent: stash-nats + weight: 50 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Customizing Backup and Restore Process + +Stash provides rich customization supports for the backup and restore process to meet the requirements of various cluster configurations. This guide will show you some examples of these customizations. + +> Note: YAML files used in this tutorial are stored [here](https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/nats/customization/examples). + +## Customizing Backup Process + +In this section, we are going to show you how to customize the backup process. Here, we are going to show some examples of providing arguments to the backup process, running the backup process as a specific user, taking backup of specific streams, etc. + +### Passing arguments to the backup process +Stash NATS addon uses NATS CLI for backup. You can pass arguments to the backup command of the NATS CLI through `args` param under `task.params` section. + +The below example shows how you can pass the `--check` to check a stream for health prior to backup. + + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-nats-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: nats-backup-2.6.1 + params: + - name: args + value: --check + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +### Backup specific streams + +Stash takes backup of all the streams by default. If you want to take backup of specific streams, you can pass a list of streams through `streams` param under `task.params` section. + +The below example shows how you can pass the `"str1,str2"` to take backup of the streams `str1` and ` str2`. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-nats-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: nats-backup-2.6.1 + params: + - name: streams + value: "str1,str2" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +### Running backup job as a specific user + +If your cluster requires running the backup job as a specific user, you can provide `securityContext` under `runtimeSettings.pod` section. The below example shows how you can run the backup job as the root user. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-nats-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: nats-backup-2.6.1 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + runtimeSettings: + pod: + securityContext: + runAsUser: 0 + runAsGroup: 0 + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +### Specifying Memory/CPU limit/request for the backup job + +If you want to specify the Memory/CPU limit/request for your backup job, you can specify `resources` field under `runtimeSettings.container` section. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-nats-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: nats-backup-2.6.1 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + runtimeSettings: + container: + resources: + requests: + cpu: "200m" + memory: "1Gi" + limits: + cpu: "200m" + memory: "1Gi" + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +### Using multiple retention policies + +You can also specify multiple retention policies for your backed up data. For example, you may want to keep few daily snapshots, few weekly snapshots, and few monthly snapshots, etc. You just need to pass the desired number with the respective key under the `retentionPolicy` section. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-nats-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: nats-backup-2.6.1 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nat + retentionPolicy: + name: sample-nats-retention + keepLast: 5 + keepDaily: 10 + keepWeekly: 20 + keepMonthly: 50 + keepYearly: 100 + prune: true +``` + +To know more about the available options for retention policies, please visit [here](/docs/v2024.12.18/concepts/crds/backupconfiguration/#specretentionpolicy). + +## Customizing Restore Process + +In this section, we are going to show how you can overwrite existing streams, restore a specific snapshot, run restore job as a specific user, etc. + +### Passing arguments to the restore process +Stash NATS addon uses NATS CLI for restore. You can pass arguments to the restore command of NATS CLI through `args` param under `task.params` section. + +The below example shows how you can pass the `--no-progress` to disable the progress using the terminal bar. It will then issue log lines instead. + + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-nats-restore + namespace: demo +spec: + task: + name:nats-backup-2.6.1 + params: + - name: args + value: --no-progress + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + rules: + - snapshots: [latest] +``` + +### Restore specific streams + +Stash restores all the streams by default. If you want to restore specific streams, you can pass a list of streams through `streams` param under `task.params` section. + +The below example shows how you can pass the `"str1,str2"` to restore the streams `str1` and ` str2`. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-nats-restore + namespace: demo +spec: + task: + name: nats-restore-2.6.1 + params: + - name: streams + value: "str1,str2" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + rules: + - snapshots: [latest] +``` + +### Overwrite existing streams + +Stash doesn't overwrite any existing stream by default during the restore process. If you want to overwrite the existing streams, you can pass `true` to the `overwrite` params under `task.params` section. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-nats-restore + namespace: demo +spec: + task: + name:nats-backup-2.6.1 + params: + - name: overwrite + value: "true" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + rules: + - snapshots: [latest] +``` + +### Restore specific snapshot + +You can also restore a specific snapshot. At first, list the available snapshots as below, + +```bash +❯ kubectl get snapshots -n demo +NAME ID REPOSITORY HOSTNAME CREATED AT +gcs-repo-4bc21d6f 4bc21d6f gcs-repo host-0 2022-01-12T14:54:27Z +gcs-repo-f0ac7cbd f0ac7cbd gcs-repo host-0 2022-01-12T14:56:26Z +gcs-repo-9210ebb6 9210ebb6 gcs-repo host-0 2022-01-12T14:58:27Z +gcs-repo-0aff8890 0aff8890 gcs-repo host-0 2022-01-12T15:00:28Z +``` + +>You can also filter the snapshots as shown in the guide [here](https://stash.run/docs/{{< param "info.version" >}}/concepts/crds/snapshot/#working-with-snapshot). + +You can use the respective ID of the snapshot to restore a specific snapshot. + +The below example shows how you can pass a specific snapshot ID through the `snapshots` field of `rules` section. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-nats-restore + namespace: demo +spec: + task: + name: nats-backup-2.6.1 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + rules: + - snapshots: [4bc21d6f] +``` + +>Please, do not specify multiple snapshots here. Each snapshot represents a complete backup of your database. Multiple snapshots are only usable during file/directory restore. + +### Running restore job as a specific user + +You can provide `securityContext` under `runtimeSettings.pod` section to run the restore job as a specific user. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-nats-restore + namespace: demo +spec: + task: + name: nats-backup-2.6.1 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + runtimeSettings: + pod: + securityContext: + runAsUser: 0 + runAsGroup: 0 + rules: + - snapshots: [latest] +``` + +### Specifying Memory/CPU limit/request for the restore job + +Similar to the backup process, you can also provide `resources` field under the `runtimeSettings.container` section to limit the Memory/CPU for your restore job. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-nats-restore + namespace: demo +spec: + task: + name: nats-backup-2.6.1 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + runtimeSettings: + container: + resources: + requests: + cpu: "200m" + memory: "1Gi" + limits: + cpu: "200m" + memory: "1Gi" + rules: + - snapshots: [latest] +``` diff --git a/content/docs/v2024.12.18/addons/nats/helm/examples/appbinding.yaml b/content/docs/v2024.12.18/addons/nats/helm/examples/appbinding.yaml new file mode 100644 index 0000000000..0c41842455 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/helm/examples/appbinding.yaml @@ -0,0 +1,15 @@ +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + labels: + app.kubernetes.io/instance: sample-nats + name: sample-nats + namespace: demo +spec: + clientConfig: + service: + name: sample-nats + port: 4222 + scheme: nats + type: nats.io/nats + version: 2.6.1 diff --git a/content/docs/v2024.12.18/addons/nats/helm/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/addons/nats/helm/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..3e1fe9fabd --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/helm/examples/backupconfiguration.yaml @@ -0,0 +1,29 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-nats-backup + namespace: demo +spec: + task: + name: nats-backup-2.6.1 + schedule: "*/5 * * * *" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + interimVolumeTemplate: + metadata: + name: sample-nats-backup-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/nats/helm/examples/repository.yaml b/content/docs/v2024.12.18/addons/nats/helm/examples/repository.yaml new file mode 100644 index 0000000000..dae91419b2 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/helm/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /demo/nats/sample-nats + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/addons/nats/helm/examples/restoresession.yaml b/content/docs/v2024.12.18/addons/nats/helm/examples/restoresession.yaml new file mode 100644 index 0000000000..9c5f52422a --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/helm/examples/restoresession.yaml @@ -0,0 +1,26 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-nats-restore + namespace: demo +spec: + task: + name: nats-restore-2.6.1 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + interimVolumeTemplate: + metadata: + name: nats-restore-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/addons/nats/helm/images/sample-nats-backup.png b/content/docs/v2024.12.18/addons/nats/helm/images/sample-nats-backup.png new file mode 100644 index 0000000000..b3f603de78 Binary files /dev/null and b/content/docs/v2024.12.18/addons/nats/helm/images/sample-nats-backup.png differ diff --git a/content/docs/v2024.12.18/addons/nats/helm/index.md b/content/docs/v2024.12.18/addons/nats/helm/index.md new file mode 100644 index 0000000000..4164b9bf25 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/helm/index.md @@ -0,0 +1,697 @@ +--- +title: Helm managed NATS +description: Backup Helm managed NATS using Stash +menu: + docs_v2024.12.18: + identifier: stash-nats-helm + name: Helm managed NATS + parent: stash-nats + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup Helm managed NATS using Stash + +Stash `{{< param "info.version" >}}` supports backup and restoration of NATS streams. This guide will show you how you can backup & restore a Helm managed NATS server using Stash. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. +- Install Stash in your cluster following the steps [here](/docs/v2024.12.18/setup/install/stash/). +- If you are not familiar with how Stash backup and restore NATS streams, please check the following guide [here](/docs/v2024.12.18/addons/nats/overview/). + +You have to be familiar with following custom resources: + +- [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) +- [Function](/docs/v2024.12.18/concepts/crds/function/) +- [Task](/docs/v2024.12.18/concepts/crds/task/) +- [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) +- [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) +- [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + +To keep things isolated, we are going to use a separate namespace called `demo` throughout this tutorial. Create `demo` namespace if you haven't created already. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> Note: YAML files used in this tutorial are stored [here](https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/nats/helm/examples). + +## Prepare NATS + +In this section, we are going to deploy a NATS cluster. Then, we are going to insert some sample data into it. + +### Deploy NATS Cluster + +At first, let's deploy a NATS cluster. Here, we are going to use [NATS]( https://github.com/nats-io/k8s/tree/main/helm/charts/nats) chart from [nats.io](https://nats.io/). + +Let's deploy a nats cluster named `sample-nats` using Helm as below, + +```bash +# Add nats chart registry +$ helm repo add nats https://nats-io.github.io/k8s/helm/charts/ +# Update helm registries +$ helm repo update +# Install nats/nats chart into demo namespace +$ helm install sample-nats nats/nats -n demo \ +--set nats.jetstream.enabled=true \ +--set nats.jetstream.fileStorage.enabled=true \ +--set cluster.enabled=true \ +--set cluster.replicas=3 +``` + +This chart will create the necessary StatefulSet, Service, PVCs etc. for the NATS cluster. You can easily view all the resources created by chart using [ketall](https://github.com/corneliusweig/ketall) `kubectl` plugin as below, + +```bash +❯ kubectl get-all -n demo -l app.kubernetes.io/instance=sample-nats +NAME NAMESPACE AGE +configmap/sample-nats-config demo 11m +endpoints/sample-nats demo 11m +persistentvolumeclaim/sample-nats-js-pvc-sample-nats-0 demo 11m +persistentvolumeclaim/sample-nats-js-pvc-sample-nats-1 demo 10m +persistentvolumeclaim/sample-nats-js-pvc-sample-nats-2 demo 10m +pod/sample-nats-0 demo 11m +pod/sample-nats-1 demo 10m +pod/sample-nats-2 demo 10m +service/sample-nats demo 11m +controllerrevision.apps/sample-nats-775468b94f demo 11m +statefulset.apps/sample-nats demo 11m +endpointslice.discovery.k8s.io/sample-nats-7n7v6 demo 11m +``` + +Now, wait for the NATS server pods `sample-nats-0`, `sample-nats-1`, `sample-nats-2` to go into `Running` state, + +```bash +❯ kubectl get pod -n demo -l app.kubernetes.io/instance=sample-nats +NAME READY STATUS RESTARTS AGE +sample-nats-0 3/3 Running 0 9m58s +sample-nats-1 3/3 Running 0 9m35s +sample-nats-2 3/3 Running 0 9m12s +``` + +Once the nats server pods are in `Running` state, verify that the NATS server is ready to accept the connections. + +```bash +❯ kubectl logs -n demo sample-nats-0 -c nats +[7] 2021/09/06 08:33:53.111508 [INF] Starting nats-server +[7] 2021/09/06 08:33:53.111560 [INF] Version: 2.6.1 +... +[7] 2021/09/06 08:33:53.116004 [INF] Server is ready +``` + +From the above log, we can see the NATS server is ready to accept connections. + +### Insert Sample Data + +The above Helm chart also deploy a pod with nats-box image which can be used to interact with the NATS server. Let's verify the nats-box pod has been created. + +```bash +❯ kubectl get pod -n demo -l app=sample-nats-box +NAME READY STATUS RESTARTS AGE +sample-nats-box-785f8458d7-wtnfx 1/1 Running 0 7m20s +``` + +Now, let's exec into the nats-box pod and insert some sample data, + +``` +❯ kubectl exec -n demo -it sample-nats-box-785f8458d7-wtnfx -- sh -l +... +# Let's create a stream named "ORDERS" +sample-nats-box-785f8458d7-wtnfx:~# nats stream add ORDERS --subjects "ORDERS.*" --ack --max-msgs=-1 --max-bytes=-1 --max-age=1y --storage file --retention limits --max-msg-size=-1 --max-msgs-per-subject=-1 --discard old --dupe-window="0s" --replicas 1 +Stream ORDERS was created + +Information for Stream ORDERS created 2021-09-03T07:12:07Z + +Configuration: + + Subjects: ORDERS.* + Acknowledgements: true + Retention: File - Limits + Replicas: 1 + Discard Policy: Old + Duplicate Window: 2m0s + Maximum Messages: unlimited + Maximum Bytes: unlimited + Maximum Age: 1y0d0h0m0s + Maximum Message Size: unlimited + Maximum Consumers: unlimited + + +Cluster Information: + + Name: nats + Leader: nats-0 + +State: + + Messages: 0 + Bytes: 0 B + FirstSeq: 0 + LastSeq: 0 + Active Consumers: 0 + + +# Verify that the stream has been created successfully +sample-nats-box-785f8458d7-wtnfx:~# nats stream ls +Streams: + + ORDERS + +# Lets add some messages to the stream "ORDERS" +sample-nats-box-785f8458d7-wtnfx:~# nats pub ORDERS.scratch hello +08:55:39 Published 5 bytes to "ORDERS.scratch" + +# Add another message +sample-nats-box-785f8458d7-wtnfx:~# nats pub ORDERS.scratch world +08:56:11 Published 5 bytes to "ORDERS.scratch" + +# Verify that the messages have been published to the stream successfully +sample-nats-box-785f8458d7-wtnfx:~# nats stream info ORDERS +Information for Stream ORDERS created 2021-09-03T07:12:07Z + +Configuration: + + Subjects: ORDERS.* + Acknowledgements: true + Retention: File - Limits + Replicas: 1 + Discard Policy: Old + Duplicate Window: 2m0s + Maximum Messages: unlimited + Maximum Bytes: unlimited + Maximum Age: 1y0d0h0m0s + Maximum Message Size: unlimited + Maximum Consumers: unlimited + + +Cluster Information: + + Name: nats + Leader: nats-0 + +State: + + Messages: 2 + Bytes: 98 B + FirstSeq: 1 @ 2021-09-03T08:55:39 UTC + LastSeq: 2 @ 2021-09-03T08:56:11 UTC + Active Consumers: 0 + +sample-nats-box-785f8458d7-wtnfx:~# exit +``` + +We have successfully deployed a NATS cluster, created a stream and publish some messages into the stream. In the subsequent sections, we are going to backup this sample data using Stash. + +## Prepare for Backup + +In this section, we are going to prepare the necessary resources (i.e. connection information, backend information, etc.) before backup. + +### Ensure NATS Addon + +When you install Stash, it will automatically install all the official addons. Make sure that NATS addon has been installed properly using the following command. + +```bash +❯ kubectl get tasks.stash.appscode.com | grep nats +nats-backup-2.6.1 24m +nats-restore-2.6.1 24m +``` + +This addon should be able to take backup of the NATS streams with matching major versions as discussed in [Addon Version Compatibility](/docs/v2024.12.18/addons/nats/README#addon-version-compatibility). + +### Create AppBinding + +Stash needs to know how to connect with the NATS server. An `AppBinding` exactly provides this information. It holds the Service and Secret information of the NATS server. You have to point to the respective `AppBinding` as a target of backup instead of the NATS server itself. + +Here, is the YAML of the `AppBinding` that we are going to create for the NATS server we have deployed earlier. + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + labels: + app.kubernetes.io/instance: sample-nats + name: sample-nats + namespace: demo +spec: + clientConfig: + service: + name: sample-nats + port: 4222 + scheme: nats + type: nats.io/nats + version: 2.6.1 +``` + +Here, + +- **.spec.clientConfig.service** specifies the Service information to use to connects with the NATS server. +- `spec.type` specifies the type of the target. This is particularly helpful in auto-backup where you want to use different path prefixes for different types of target. + +Let's create the `AppBinding` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/nats/helm/examples/appbinding.yaml +appbinding.appcatalog.appscode.com/sample-nats created +``` + +### Prepare Backend + +We are going to store our backed up data into a GCS bucket. So, we need to create a Secret with GCS credentials and a `Repository` object with the bucket information. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +**Create Storage Secret:** + +At first, let's create a secret called `gcs-secret` with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat downloaded-sa-json.key > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create Repository:** + +Now, create a `Repository` object with the information of your desired bucket. Below is the YAML of `Repository` object we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /demo/nats/sample-nats + storageSecretName: gcs-secret +``` + +Let's create the `Repository` we have shown above, + +```bash +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/nats/helm/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our streams into our desired backend. + +### Backup + +To schedule a backup, we have to create a `BackupConfiguration` object targeting the respective `AppBinding` of our NATS server. Then, Stash will create a CronJob to periodically backup the streams. + +#### Create BackupConfiguration + +Below is the YAML for `BackupConfiguration` object that we are going to use to backup the streams of the NATS server we have created earlier, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-nats-backup + namespace: demo +spec: + task: + name: nats-backup-2.6.1 + schedule: "*/5 * * * *" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + interimVolumeTemplate: + metadata: + name: sample-nats-backup-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +Here, + +- `.spec.schedule` specifies that we want to backup the streams at 5 minutes intervals. +- `.spec.task.name` specifies the name of the Task object that specifies the necessary Functions and their execution order to backup NATS streams. +- `.spec.repository.name` specifies the Repository CR name we have created earlier with backend information. +- `.spec.target.ref` refers to the AppBinding object that holds the connection information of our targeted NATS server. +- `spec.interimVolumeTemplate` specifies a PVC template that will be used by Stash to hold the dumped data temporarily before uploading it into the cloud bucket. +- `.spec.retentionPolicy` specifies a policy indicating how we want to cleanup the old backups. + +Let's create the `BackupConfiguration` object we have shown above, + +```bash +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/nats/helm/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/sample-nats-backup created +``` + +#### Verify Backup Setup Successful + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. Let's verify the `Phase` of the BackupConfiguration, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-nats-backup nats-backup-2.6.1 */5 * * * * Ready 11s +``` + + +#### Verify CronJob + +Stash will create a CronJob with the schedule specified in `spec.schedule` field of `BackupConfiguration` object. + +Verify that the CronJob has been created using the following command, + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-nats-backup */5 * * * * False 0 14s +``` + +#### Wait for BackupSession + +The `sample-nats-backup` CronJob will trigger a backup on each scheduled slot by creating a `BackupSession` object. + +Now, wait for a schedule to appear. Run the following command to watch for `BackupSession` object, + +```bash +❯ kubectl get backupsession -n demo -w +NAME INVOKER-TYPE INVOKER-NAME PHASE DURATION AGE +sample-nats-backup-8x8fp BackupConfiguration sample-nats-backup Succeeded 42s 8m28s +``` + +Here, the phase `Succeeded` means that the backup process has been completed successfully. + +#### Verify Backup + +Now, we are going to verify whether the backed up data is present in the backend or not. Once a backup is completed, Stash will update the respective `Repository` object to reflect the backup completion. Check that the repository `gcs-repo` has been updated by the following command, + +```bash +❯ kubectl get repository -n demo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo true 1.382 KiB 1 9m4s 24m +``` + +Now, if we navigate to the GCS bucket, we will see the backed up data has been stored in `demo/nats/sample-nats` directory as specified by `.spec.backend.gcs.prefix` field of the `Repository` object. + +
+ Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ + +> Note: Stash keeps all the backed up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Restore + +If you have followed the previous sections properly, you should have a successful backup of your NATS streams. Now, we are going to show how you can restore the streams from the backed up data. + +### Restore Into the Same NATS Cluster + +You can restore your data into the same NATS cluster you have backed up from or into a different NATS cluster in the same cluster or a different cluster. In this section, we are going to show you how to restore in the same NATS cluster which may be necessary when you have accidentally lost any data. + +#### Temporarily Pause Backup + +At first, let's stop taking any further backup of the NATS streams so that no backup runs after we delete the sample data. We are going to pause the `BackupConfiguration` object. Stash will stop taking any further backup when the `BackupConfiguration` is paused. + +Let's pause the `sample-nats-backup` BackupConfiguration, + +```bash +$ kubectl patch backupconfiguration -n demo sample-nats-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/sample-nats-backup patched +``` + +Verify that the `BackupConfiguration` has been paused, + +```bash +❯ kubectl get backupconfiguration -n demo sample-nats-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-nats-backup nats-backup-2.6.1 */5 * * * * true Ready 2d18h +``` + +Notice the `PAUSED` column. Value `true` for this field means that the `BackupConfiguration` has been paused. + +Stash will also suspend the respective CronJob. + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-nats-backup */5 * * * * True 0 56s 2d18h +``` + +#### Simulate Disaster + +Now, let's simulate a disaster scenario. Here, we are going to exec into the nats-box pod and delete the sample data we have inserted earlier. + +```bash +❯ kubectl exec -n demo -it sample-nats-box-785f8458d7-wtnfx -- sh -l +... +# delete the stream "ORDERS" +sample-nats-box-785f8458d7-wtnfx:~# nats stream rm ORDERS -f + +# verify that the stream has been deleted +sample-nats-box-785f8458d7-wtnfx:~# nats stream ls +No Streams defined + +sample-nats-box-785f8458d7-wtnfx:~# exit +``` + +#### Create RestoreSession + +To restore the streams, you have to create a `RestoreSession` object pointing to the `AppBinding` of the targeted NATS server. + +Here, is the YAML of the `RestoreSession` object that we are going to use for restoring the streams of the NATS server. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-nats-restore + namespace: demo +spec: + task: + name: nats-restore-2.6.1 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats + interimVolumeTemplate: + metadata: + name: nats-restore-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + rules: + - snapshots: [latest] +``` + +Here, + +- `.spec.task.name` specifies the name of the Task object that specifies the necessary Functions and their execution order to restore NATS streams. +- `.spec.repository.name` specifies the Repository object that holds the backend information where our backed up data has been stored. +- `.spec.target.ref` refers to the respective AppBinding of the `sample-nats` cluster. +- `.spec.interimVolumeTemplate` specifies a PVC template that will be used by Stash to hold the restored data temporarily before injecting into the NATS server. +- `.spec.rules` specifies that we are restoring data from the latest backup snapshot of the streams. + +Let's create the `RestoreSession` object object we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/nats/helm/examples/restoresession.yaml +restoresession.stash.appscode.com/sample-nats-restore created +``` + +Once, you have created the `RestoreSession` object, Stash will create a restore Job. Run the following command to watch the phase of the `RestoreSession` object, + +```bash +❯ kubectl get restoresession -n demo -w +NAME REPOSITORY PHASE DURATION AGE +sample-nats-restore gcs-repo Succeeded 15s 55s +``` + +The `Succeeded` phase means that the restore process has been completed successfully. + +#### Verify Restored Data + +Now, let's exec into the nats-box pod and verify whether data actual data has been restored or not, + +```bash +❯ kubectl exec -n demo -it sample-nats-box-785f8458d7-wtnfx -- sh -l +... +# Verify that the stream has been restored successfully +sample-nats-box-785f8458d7-wtnfx:~# nats stream ls +Streams: + + ORDERS + +# Verify that the messages have been restored successfully +sample-nats-box-785f8458d7-wtnfx:~# nats stream info ORDERS +Information for Stream ORDERS created 2021-09-03T07:12:07Z + +Configuration: + + Subjects: ORDERS.* + Acknowledgements: true + Retention: File - Limits + Replicas: 1 + Discard Policy: Old + Duplicate Window: 2m0s + Maximum Messages: unlimited + Maximum Bytes: unlimited + Maximum Age: 1y0d0h0m0s + Maximum Message Size: unlimited + Maximum Consumers: unlimited + + +Cluster Information: + + Name: nats + Leader: nats-0 + +State: + + Messages: 2 + Bytes: 98 B + FirstSeq: 1 @ 2021-09-03T08:55:39 UTC + LastSeq: 2 @ 2021-09-03T08:56:11 UTC + Active Consumers: 0 + +sample-nats-box-785f8458d7-wtnfx:~# exit +``` + +Hence, we can see from the above output that the deleted data has been restored successfully from the backup. + +#### Resume Backup + +Since our data has been restored successfully we can now resume our usual backup process. Resume the `BackupConfiguration` using following command, + +```bash +❯ kubectl patch backupconfiguration -n demo sample-nats-backup --type="merge" --patch='{"spec": {"paused": false}}' +backupconfiguration.stash.appscode.com/sample-nats-backup patched +``` + +Verify that the `BackupConfiguration` has been resumed, +```bash +❯ kubectl get backupconfiguration -n demo sample-nats-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-nats-backup nats-backup-2.6.1 */5 * * * * false Ready 2d19h +``` + +Here, `false` in the `PAUSED` column means the backup has been resumed successfully. The CronJob also should be resumed now. + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-nats-backup */5 * * * * False 0 3m24s 4h54m +``` + +Here, `False` in the `SUSPEND` column means the CronJob is no longer suspended and will trigger in the next schedule. + +### Restore Into Different NATS Cluster of the Same Namespace + +If you want to restore the backed up data into a different NATS cluster of the same namespace, you have to create another `AppBinding` pointing to the desired NATS cluster. Then, you have to create the `RestoreSession` pointing to the new `AppBinding`. + +### Restore Into Different Namespace + +If you want to restore into a different namespace of the same cluster, you have to create the Repository, backend Secret, AppBinding, in the desired namespace. You can use [Stash kubectl plugin](https://stash.run/docs/{{< param "info.version" >}}/guides/cli/cli/) to easily copy the resources into a new namespace. Then, you have to create the `RestoreSession` object in the desired namespace pointing to the Repository, AppBinding of that namespace. + +### Restore Into Different Cluster + +If you want to restore into a different cluster, you have to install Stash in the desired cluster. Then, you have to create the Repository, backend Secret, AppBinding, in the desired cluster. Finally, you have to create the `RestoreSession` object in the desired cluster pointing to the Repository, AppBinding of that cluster. + +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo backupconfiguration sample-nats-backup +kubectl delete -n demo restoresession sample-nats-restore +kubectl delete -n demo repository gcs-repo +# delete the nats chart +helm delete sample-nats -n demo +``` diff --git a/content/docs/v2024.12.18/addons/nats/overview/images/backup_overview.svg b/content/docs/v2024.12.18/addons/nats/overview/images/backup_overview.svg new file mode 100644 index 0000000000..6d54b9c313 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/overview/images/backup_overview.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/nats/overview/images/restore_overview.svg b/content/docs/v2024.12.18/addons/nats/overview/images/restore_overview.svg new file mode 100644 index 0000000000..e76fdc8c1c --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/overview/images/restore_overview.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/nats/overview/index.md b/content/docs/v2024.12.18/addons/nats/overview/index.md new file mode 100644 index 0000000000..60706c77df --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/overview/index.md @@ -0,0 +1,147 @@ +--- +title: NATS Backup & Restore Overview | Stash +description: How NATS Backup & Restore Works in Stash +menu: + docs_v2024.12.18: + identifier: stash-nats-overview + name: How does it work? + parent: stash-nats + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# How Stash Backups & Restores NATS Streams + +Stash `{{< param "info.version" >}}` supports backup and restore operation of NATS streams. This guide will give you an overview of how NATS stream backup and restore process works in Stash. + +## How Backup Works + +The following diagram shows how Stash takes a backup of NATS streams. Open the image in a new tab to see the enlarged version. + +
+ NATS Backup Overview +
Fig: NATS Backup Overview
+
+ +The backup process consists of the following steps: + +1. At first, a user creates a secret with access credentials of the backend where the backed up data will be stored. + +2. Then, she creates a `Repository` crd that specifies the backend information along with the secret that holds the credentials to access the backend. + +3. Then, she creates a `BackupConfiguration` crd targeting the [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) crd of the respective NATS server. The `BackupConfiguration` object also specifies the `Task` to use to backup the NATS streams. + +4. Stash operator watches for `BackupConfiguration` crd. + +5. Once Stash operator finds a `BackupConfiguration` crd, it creates a CronJob with the schedule specified in `BackupConfiguration` object to trigger backup periodically. + +6. On the next scheduled slot, the CronJob triggers a backup by creating a `BackupSession` crd. + +7. Stash operator also watches for `BackupSession` crd. + +8. When it finds a `BackupSession` object, it resolves the respective `Task` and `Function` and prepares a Job definition to backup. + +9. Then, it creates the Job to backup the targeted NATS server. + +10. The backup Job reads necessary information to connect with the NATS server from the `AppBinding` crd. It also reads backend information and access credentials from `Repository` crd and Storage Secret respectively. + +11. Then, the Job dumps the targeted streams and uploads the output to the backend. Stash stores the dumped files temporarily before uploading into the backend. Hence, you should provide a PVC template using `spec.interimVolumeTemplate` field of `BackupConfiguration` crd to use to store those dumped files temporarily. Make sure that the provided PVC size is capable of storing all (or, specified) the NATS streams. + +12. Finally, when the backup is completed, the Job sends Prometheus metrics to the Pushgateway running inside Stash operator pod. It also updates the `BackupSession` and `Repository` status to reflect the backup procedure. + +## How Restore Process Works + +The following diagram shows how Stash restores backed up data into a NATS streaming server. Open the image in a new tab to see the enlarged version. + +
+ NATS Restore Overview +
Fig: NATS Restore Process
+
+ +The restore process consists of the following steps: + +1. At first, a user creates a `RestoreSession` crd targeting the `AppBinding` of the desired NATS server where the backed up data will be restored. It also specifies the `Repository` crd which holds the backend information and the `Task` to use to restore the target. + +2. Stash operator watches for `RestoreSession` object. + +3. Once it finds a `RestoreSession` object, it resolves the respective `Task` and `Function` and prepares a Job definition to restore. + +4. Then, it creates the Job to restore the target. + +5. The Job reads necessary information to connect with the NATS server from respective `AppBinding` crd. It also reads backend information and access credentials from `Repository` crd and Storage Secret respectively. + +6. Then, the job downloads the backed up data from the backend and restore the streams. Stash stores the downloaded files temporarily before inserting into the targeted NATS server. Hence, you should provide a PVC template using `spec.interimVolumeTemplate` field of `RestoreSession` crd to use to store those restored files temporarily. Make sure that the provided PVC size is capable of storing all the backed up NATS streams. + +7. Finally, when the restore process is completed, the Job sends Prometheus metrics to the Pushgateway and update the `RestoreSession` status to reflect restore completion. + +## Next Steps + +- Backup your NATS using Stash following the guide from [here](/docs/v2024.12.18/addons/nats/helm/). diff --git a/content/docs/v2024.12.18/addons/nats/tls/examples/appbinding.yaml b/content/docs/v2024.12.18/addons/nats/tls/examples/appbinding.yaml new file mode 100644 index 0000000000..71b54b3058 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/tls/examples/appbinding.yaml @@ -0,0 +1,18 @@ +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + labels: + app.kubernetes.io/instance: sample-nats-tls + name: sample-nats-tls + namespace: demo +spec: + clientConfig: + caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4RENDQWRpZ0F3SUJBZ0lRUDZ1UXIxQVlFWnJzREF6ZHBRR09HekFOQmdrcWhraUc5dzBCQVFzRkFEQVMKTVJBd0RnWURWUVFERXdkdVlYUnpMV05oTUI0WERUSXhNRGt5TnpBMU5EWTBOVm9YRFRJeU1Ea3lOakExTkRZMApOVm93RWpFUU1BNEdBMVVFQXhNSGJtRjBjeTFqWVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDCkFRb0NnZ0VCQUovelJtSE1CUVdGMTNXZlJubzFsV0ZJajZmNmhyRGRVR0RTMXBrY0hmMDlqNS90bEpYSHpCbVMKZSs2YS9Qb1MrdkMyWEtyeVp3UVB0NW5BaUxXR1NxM3VBRnJ3TUJncVBBQktOa1hHL1hjamNvbU5lVTFaQlNYYgo1WmlJa2F6TUZPOGFqRWxYb3RmYnQ2cVc5MGNCTVduRW9pcnUyWkFyam50WjJpMmpPeGRodUJpRTkxamRsZWMyCkdZWGFKVlJ5RkF1eVdXanVEV3o0NjFKdXBMdXcxVWJyVHpmMExUenQxdk9ONnZNU1RQT0Z0S0tnd0RGenB5ZkgKVjFFQlZ5aG1KSk42QW13SkErZGEvMmsxMUJCeHFEWldsOEZMWE1TWUcvU0hKak5sQ3VsQTFvVVJWbFI3MVF6KwpTanB2bkxKVm9nL01sYVcvTzB5N0lRcTVQNUZGeDBNQ0F3RUFBYU5DTUVBd0RnWURWUjBQQVFIL0JBUURBZ0trCk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZNcm5ZN0Izek5VY1AvN3hHTzhkTFIwZVcxUnIKTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFDQVZPQUZhTjRVOUQ0U1cxcWJUTDhkcWhFbklXTFd3YVBJdXJGSAo1MVVRMEUxenFTOWcvQ1gwUElOUmJ1bFpseHVKRGFBZEwweVYwYmZYZExLQnJacDNwS001eGRyaEoxQ3luNjV5CkRML0RTd3hTOHlxT3NwTXF2SkoyUTBhQ0JQTXhDRFZoOGVFZ2krOG9ISmdobkZzaTkvanNoZ0dUS09QbVVWdHcKTyszS1B0MFBiNVRDSVpJdlA1cXBybkU0U2hDWnRRZ0UyY0dJTEJPZEt5VEl6QlpuM3ZNZjc2Zjd4NU4rWEtINgpQN3Q4Yks0SUFSbzR1WUN0cDQ0K0dkY2FlcjlDL2RVNlpaMSs1Nm4xcUo3a3FTV3cwNFZqbi9CVWt5WnhIdFZPCkFLcUNCRWtnK3NBQytYUmNiOFdxTHkreEEzdmU0TmxqalE3T2MrVXVzanNrSndOVQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== + service: + name: sample-nats-tls + port: 4222 + scheme: nats + secret: + name: nats-client-tls + type: nats.io/nats + version: 2.6.1 diff --git a/content/docs/v2024.12.18/addons/nats/tls/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/addons/nats/tls/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..ab6e7a7064 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/tls/examples/backupconfiguration.yaml @@ -0,0 +1,29 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-nats-backup-tls + namespace: demo +spec: + task: + name: nats-backup-2.6.1 + schedule: "*/5 * * * *" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats-tls + interimVolumeTemplate: + metadata: + name: nats-backup-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/nats/tls/examples/ca.yaml b/content/docs/v2024.12.18/addons/nats/tls/examples/ca.yaml new file mode 100644 index 0000000000..3ec8c1ef9b --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/tls/examples/ca.yaml @@ -0,0 +1,14 @@ +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: nats-ca + namespace: demo +spec: + secretName: nats-ca + duration: 8736h # 1 year + renewBefore: 240h # 10 days + issuerRef: + name: selfsigning + kind: ClusterIssuer + commonName: nats-ca + isCA: true diff --git a/content/docs/v2024.12.18/addons/nats/tls/examples/cert.yaml b/content/docs/v2024.12.18/addons/nats/tls/examples/cert.yaml new file mode 100644 index 0000000000..45639bbc26 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/tls/examples/cert.yaml @@ -0,0 +1,29 @@ +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: nats-server-tls + namespace: demo +spec: + secretName: nats-server-tls + duration: 2160h # 90 days + renewBefore: 240h # 10 days + issuerRef: + name: nats-ca + kind: Issuer + commonName: sample-nats-server + dnsNames: + - sample-nats-tls +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: nats-client-tls + namespace: demo +spec: + secretName: nats-client-tls + duration: 2160h # 90 days + renewBefore: 240h # 10 days + issuerRef: + name: nats-ca + kind: Issuer + commonName: sample-nats-client diff --git a/content/docs/v2024.12.18/addons/nats/tls/examples/clusterissuer.yaml b/content/docs/v2024.12.18/addons/nats/tls/examples/clusterissuer.yaml new file mode 100644 index 0000000000..220c6578da --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/tls/examples/clusterissuer.yaml @@ -0,0 +1,6 @@ +apiVersion: cert-manager.io/v1 +kind: ClusterIssuer +metadata: + name: selfsigning +spec: + selfSigned: {} diff --git a/content/docs/v2024.12.18/addons/nats/tls/examples/issuer.yaml b/content/docs/v2024.12.18/addons/nats/tls/examples/issuer.yaml new file mode 100644 index 0000000000..fea695a433 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/tls/examples/issuer.yaml @@ -0,0 +1,8 @@ +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: nats-ca + namespace: demo +spec: + ca: + secretName: nats-ca diff --git a/content/docs/v2024.12.18/addons/nats/tls/examples/repository.yaml b/content/docs/v2024.12.18/addons/nats/tls/examples/repository.yaml new file mode 100644 index 0000000000..c1a9d7d789 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/tls/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /demo/nats/sample-nats-tls + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/addons/nats/tls/examples/restoresession.yaml b/content/docs/v2024.12.18/addons/nats/tls/examples/restoresession.yaml new file mode 100644 index 0000000000..243d012dd2 --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/tls/examples/restoresession.yaml @@ -0,0 +1,26 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-nats-restore-tls + namespace: demo +spec: + task: + name: nats-restore-2.6.1 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats-tls + interimVolumeTemplate: + metadata: + name: nats-restore-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/addons/nats/tls/images/sample-nats-backup.png b/content/docs/v2024.12.18/addons/nats/tls/images/sample-nats-backup.png new file mode 100644 index 0000000000..adc8598059 Binary files /dev/null and b/content/docs/v2024.12.18/addons/nats/tls/images/sample-nats-backup.png differ diff --git a/content/docs/v2024.12.18/addons/nats/tls/index.md b/content/docs/v2024.12.18/addons/nats/tls/index.md new file mode 100644 index 0000000000..994919f3ba --- /dev/null +++ b/content/docs/v2024.12.18/addons/nats/tls/index.md @@ -0,0 +1,868 @@ +--- +title: TLS secured NATS +description: Backup TLS secured NATS using Stash +menu: + docs_v2024.12.18: + identifier: stash-nats-tls-auth + name: TLS secured NATS + parent: stash-nats + weight: 40 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup TLS secured NATS using Stash + +Stash `{{< param "info.version" >}}` supports backup and restoration of NATS streams. This guide will show you how you can backup & restore a TLS secured NATS server using Stash. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. +- Install Stash in your cluster following the steps [here](/docs/v2024.12.18/setup/install/stash/). +- Install cert-manager in your cluster following the instruction [here](https://cert-manager.io/docs/installation/). +- If you are not familiar with how Stash backup and restore NATS streams, please check the following guide [here](/docs/v2024.12.18/addons/nats/overview/). + +You have to be familiar with following custom resources: + +- [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) +- [Function](/docs/v2024.12.18/concepts/crds/function/) +- [Task](/docs/v2024.12.18/concepts/crds/task/) +- [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) +- [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) +- [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + +To keep things isolated, we are going to use a separate namespace called `demo` throughout this tutorial. Create `demo` namespace if you haven't created already. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> Note: YAML files used in this tutorial are stored [here](https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/nats/tls/examples). + +## Prepare NATS + +In this section, we are going to deploy a TLS secured NATS cluster. Then, we are going to create a stream and publish some messages into it. + + +### Create Certificate +At first, let's create a ` ClusterIssuer` that we will be using to issue our CA certificates. Below is the YAML of `ClusterIssuer` object we are going to create. +```yaml +apiVersion: cert-manager.io/v1 +kind: ClusterIssuer +metadata: + name: selfsigning +spec: + selfSigned: {} +``` +Let's create the `ClusterIssuer` we have shown above, +```bash +$ kubectl apply -f https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/nats/tls/examples/clusterissuer.yaml +clusterissuer.cert-manager.io/selfsigning created +``` + +Now, let's issue the CA certificate using the `ClusterIssuer` we have created above. Below is the YAML of `Certificate` object we are going to create. +```yaml +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: nats-ca + namespace: demo +spec: + secretName: nats-ca + duration: 8736h # 1 year + renewBefore: 240h # 10 days + issuerRef: + name: selfsigning + kind: ClusterIssuer + commonName: nats-ca + isCA: true +``` +Let's create the `Certificate` we have shown above, +```bash +$ kubectl apply -f https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/nats/tls/examples/ca.yaml +certificate.cert-manager.io/nats-ca created +``` + +Cert-manager will automatically create a Secret named specified by `spec.secretName` field with the desired CA certificate. Let's verify that the Secret has been created successfully, + +```bash +❯ kubectl get secret -n demo nats-ca +NAME TYPE DATA AGE +nats-ca kubernetes.io/tls 3 24h +``` + +Now, we are going create a `Issuer` with the above CA Secret. We are going to use this `Issuer` to issue server and client certificates for our NATS server. Below is the YAML of `Issuer` object we are going to create. + +```yaml +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: nats-ca + namespace: demo +spec: + ca: + secretName: nats-ca +``` +Let's create the `Issuer` we have shown above, +```bash +$ kubectl apply -f https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/nats/tls/examples/issuer.yaml +issuer.cert-manager.io/nats-ca created +``` + +Now, lets create the server and client certificates. Below is the YAML of `Certificate` objects we are going to create. + +```yaml +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: nats-server-tls + namespace: demo +spec: + secretName: nats-server-tls + duration: 2160h # 90 days + renewBefore: 240h # 10 days + issuerRef: + name: nats-ca + kind: Issuer + commonName: sample-nats-server + dnsNames: + - sample-nats-tls +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: nats-client-tls + namespace: demo +spec: + secretName: nats-client-tls + duration: 2160h # 90 days + renewBefore: 240h # 10 days + issuerRef: + name: nats-ca + kind: Issuer + commonName: sample-nats-client +``` +Let's create the `Certificates` we have shown above, +```bash +$ kubectl apply -f https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/nats/tls/examples/cert.yaml +certificate.cert-manager.io/nats-server-tls created +certificate.cert-manager.io/nats-client-tls created +``` + +Cert-manager will automatically create `nats-server-tls` and `nats-client-tls` Secrets with the desired certificates. Let's verify the Secrets have been created successfully, + +```bash +❯ kubectl get secrets -n demo nats-client-tls nats-server-tls +NAME TYPE DATA AGE +nats-client-tls kubernetes.io/tls 3 24h +nats-server-tls kubernetes.io/tls 3 24h + +``` + +### Deploy NATS Cluster + +Now, let's deploy a NATS cluster. Here, we are going to use [NATS]( https://nats-io.github.io/k8s/helm/charts/) chart from [nats.io](https://nats.io/). + +Let's deploy a NATS cluster named `sample-nats` using Helm as below, + +```bash +# Add nats chart registry +$ helm repo add nats https://nats-io.github.io/k8s/helm/charts/ +# Update helm registries +$ helm repo update +# Install nats/nats chart into demo namespace +$ helm install sample-nats-tls nats/nats -n demo \ +--set nats.jetstream.enabled=true \ +--set nats.jetstream.fileStorage.enabled=true \ +--set nats.tls.secret.name=nats-server-tls \ +--set nats.tls.ca="ca.crt" \ +--set nats.tls.cert="tls.crt" \ +--set nats.tls.key="tls.key" \ +--set nats.tls.verify=true \ +--set cluster.enabled=true \ +--set cluster.replicas=3 + +``` + +This chart will create the necessary StatefulSet, Service, PVCs etc. for the NATS cluster. You can easily view all the resources created by chart using [ketall](https://github.com/corneliusweig/ketall) `kubectl` plugin as below, + +```bash +❯ kubectl get-all -n demo -l app.kubernetes.io/instance=sample-nats-tls +NAME NAMESPACE AGE +configmap/sample-nats-tls-config demo 9m40s +endpoints/sample-nats-tls demo 9m40s +persistentvolumeclaim/sample-nats-tls-js-pvc-sample-nats-tls-0 demo 9m40s +persistentvolumeclaim/sample-nats-tls-js-pvc-sample-nats-tls-1 demo 9m17s +persistentvolumeclaim/sample-nats-tls-js-pvc-sample-nats-tls-2 demo 8m54s +pod/sample-nats-tls-0 demo 9m40s +pod/sample-nats-tls-1 demo 9m17s +pod/sample-nats-tls-2 demo 8m54s +service/sample-nats-tls demo 9m40s +controllerrevision.apps/sample-nats-tls-76dfb9c75 demo 9m40s +statefulset.apps/sample-nats-tls demo 9m40s +endpointslice.discovery.k8s.io/sample-nats-tls-6lxps demo 9m40s + +``` + +Now, wait for the NATS server pods `sample-nats-tls-0`, `sample-nats-tls-1`, `sample-nats-tls-2` to go into `Running` state, + +```bash +❯ kubectl get pod -n demo -l app.kubernetes.io/instance=sample-nats +NAME READY STATUS RESTARTS AGE +sample-nats-tls-0 3/3 Running 0 11m +sample-nats-tls-1 3/3 Running 0 11m +sample-nats-tls-2 3/3 Running 0 11m +``` + +Once the pods are in `Running` state, verify that the NATS server is ready to accept the connections. + +```bash +❯ kubectl logs -n demo sample-nats-tls-0 -c nats +[7] 2021/09/06 08:33:53.111508 [INF] Starting nats-server +[7] 2021/09/06 08:33:53.111560 [INF] Version: 2.6.1 +... +[7] 2021/09/06 08:33:53.116004 [INF] Server is ready +``` + +From the above log, we can see the NATS server is ready to accept connections. + +### Insert Sample Data +The above Helm chart also deploy a pod with nats-box image which can be used to interact with the NATS server. Let's verify the nats-box pod has been created. + +```bash +❯ kubectl get pod -n demo -l app=sample-nats-tls-box +NAME READY STATUS RESTARTS AGE +sample-nats-tls-box-67fb4fb4f9-gtt9z 1/1 Running 0 13m +``` + +Now, we are going to exec into the nats-box pod and create some sample data, We are going to use the client certificates created in `nats-client-tls` Secret to connect with the NATS server. So, let's create the certificates files inside the nats-box pod. + +At first, let's get the certificates from the `nats-client-tls` Secret, + +```bash +❯ kubectl get secret -n demo nats-client-tls -o yaml +apiVersion: v1 +data: + ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4RENDQWRpZ0F3SUJBZ0lRUDZ1UXIxQVlFWnJzREF6ZHBRR09HekFOQmdrcWhraUc5dzBCQVFzRkFEQVMKTVJBd0RnWURWUVFERXdkdVlYUnpMV05oTUI0WERUSXhNRGt5TnpBMU5EWTBOVm9YRFRJeU1Ea3lOakExTkRZMApOVm93RWpFUU1BNEdBMVVFQXhNSGJtRjBjeTFqWVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDCkFRb0NnZ0VCQUovelJtSE1CUVdGMTNXZlJubzFsV0ZJajZmNmhyRGRVR0RTMXBrY0hmMDlqNS90bEpYSHpCbVMKZSs2YS9Qb1MrdkMyWEtyeVp3UVB0NW5BaUxXR1NxM3VBRnJ3TUJncVBBQktOa1hHL1hjamNvbU5lVTFaQlNYYgo1WmlJa2F6TUZPOGFqRWxYb3RmYnQ2cVc5MGNCTVduRW9pcnUyWkFyam50WjJpMmpPeGRodUJpRTkxamRsZWMyCkdZWGFKVlJ5RkF1eVdXanVEV3o0NjFKdXBMdXcxVWJyVHpmMExUenQxdk9ONnZNU1RQT0Z0S0tnd0RGenB5ZkgKVjFFQlZ5aG1KSk42QW13SkErZGEvMmsxMUJCeHFEWldsOEZMWE1TWUcvU0hKak5sQ3VsQTFvVVJWbFI3MVF6KwpTanB2bkxKVm9nL01sYVcvTzB5N0lRcTVQNUZGeDBNQ0F3RUFBYU5DTUVBd0RnWURWUjBQQVFIL0JBUURBZ0trCk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZNcm5ZN0Izek5VY1AvN3hHTzhkTFIwZVcxUnIKTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFDQVZPQUZhTjRVOUQ0U1cxcWJUTDhkcWhFbklXTFd3YVBJdXJGSAo1MVVRMEUxenFTOWcvQ1gwUElOUmJ1bFpseHVKRGFBZEwweVYwYmZYZExLQnJacDNwS001eGRyaEoxQ3luNjV5CkRML0RTd3hTOHlxT3NwTXF2SkoyUTBhQ0JQTXhDRFZoOGVFZ2krOG9ISmdobkZzaTkvanNoZ0dUS09QbVVWdHcKTyszS1B0MFBiNVRDSVpJdlA1cXBybkU0U2hDWnRRZ0UyY0dJTEJPZEt5VEl6QlpuM3ZNZjc2Zjd4NU4rWEtINgpQN3Q4Yks0SUFSbzR1WUN0cDQ0K0dkY2FlcjlDL2RVNlpaMSs1Nm4xcUo3a3FTV3cwNFZqbi9CVWt5WnhIdFZPCkFLcUNCRWtnK3NBQytYUmNiOFdxTHkreEEzdmU0TmxqalE3T2MrVXVzanNrSndOVQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== + tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMrekNDQWVPZ0F3SUJBZ0lSQUlnc1laWkI2RU1MQjR6NGRnZTI2ZUV3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQXhNSGJtRjBjeTFqWVRBZUZ3MHlNVEE1TWpjd05UUTJORGxhRncweU1URXlNall3TlRRMgpORGxhTUIweEd6QVpCZ05WQkFNVEVuTmhiWEJzWlMxdVlYUnpMV05zYVdWdWREQ0NBU0l3RFFZSktvWklodmNOCkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOZEdselNWRTBGS1cyY1M5V3VqZmk1Wk5oY3I3dXJsUjZZSGR1dkwKQ2ZDRGdEZTNBUVBpWG92YzI4elgxY3d2cVVQU3l2WXpGUFN4dUtVRXpoLzBGZE5kMGk2SkVRQUp4dVgwU2JSdwpjYXZXMVR5MkZFWExtYTNiMnBWVWJ6dUE1VVdGQzFwd3hZVCsvcERHNmI4YnFuQVJiaFNvdUowQUoxTGNGT08zCjg1V1RtWUFDRHY4dmFyRFQvM0xmYWtndXJqYWc4SWdMMURyd2hxNFNjRllveElYbXJJZjhMTVVERkN4Y251aE0KNnIraUl4OXFhWkJjMys2eU4yNXNvc2J6ZDlXbXRlT3J3Z2pKUzRLdU9ZaWl2VzBsSDNzQTlOSG9HU3cwSDVtWgpjcndsMHZxV0JvaWFoMXdWSjM5S1NrWlRvLzhUaGpMQUV5QUZKdzRuNzk1eHFwOENBd0VBQWFOQk1EOHdEZ1lEClZSMFBBUUgvQkFRREFnV2dNQXdHQTFVZEV3RUIvd1FDTUFBd0h3WURWUjBqQkJnd0ZvQVV5dWRqc0hmTTFSdy8KL3ZFWTd4MHRIUjViVkdzd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFGRTE0OTJkdS9HSVpKS3BuMEdRNE1STApHbDI5bXc1Wi9nUWxwTTN3NGdYU1hxbmNGczREcHJFd2g5R25PTkEzcXpta1NIakFwWmwwQzdWZi84Y2RnNS8zCk90UVZSSGkxQVJFcGFHMlVUMnFJSXp1SUVLN0tRZE5maXpVYVVaMFgzb041Kyt4YWU4WSsxa3dZOXZxaXdWRlcKbS96T1JzSmRtcnRqNGZRSTVaVGRzVG1jRkxqUXBOcktOSWFVU2pHOFM1Q3pOMlJBekZHTTBCZWYzSWFzWTF2WQpDTWpOZlBxaUNtZFNlOFFxRE1UMURwRExjaFltQlQ3UjdyR0JBaEFXWEpEZlVMRXlXUk9XdmRrWlhnTk5ZMnlJCkhmbktUTy9TL1FpUUs4N0Y2SWtEM2tKalZPVDhUNVBmYjBwYTJnaDlnSkZmZUJPVW9FUkYrdG4zYWI3Z3BkQT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= + tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBMTBhWE5KVVRRVXBiWnhMMWE2TitMbGsyRnl2dTZ1VkhwZ2QyNjhzSjhJT0FON2NCCkErSmVpOXpiek5mVnpDK3BROUxLOWpNVTlMRzRwUVRPSC9RVjAxM1NMb2tSQUFuRzVmUkp0SEJ4cTliVlBMWVUKUmN1WnJkdmFsVlJ2TzREbFJZVUxXbkRGaFA3K2tNYnB2eHVxY0JGdUZLaTRuUUFuVXR3VTQ3ZnpsWk9aZ0FJTwoveTlxc05QL2N0OXFTQzZ1TnFEd2lBdlVPdkNHcmhKd1ZpakVoZWFzaC93c3hRTVVMRnllNkV6cXY2SWpIMnBwCmtGemY3ckkzYm15aXh2TjMxYWExNDZ2Q0NNbExncTQ1aUtLOWJTVWZld0QwMGVnWkxEUWZtWmx5dkNYUytwWUcKaUpxSFhCVW5mMHBLUmxPai94T0dNc0FUSUFVbkRpZnYzbkdxbndJREFRQUJBb0lCQUZWZ0NvRnhDY1RmLzJYZQpiL1J6VDR5RUZ0NlRydG43ZWpIUFRndHZaNDY2S0RSd1lIZXc0L3dsNkFuU0kxa3FJYi9qTGxqN296ano3cDJMClRWQUExbE1RSjFZTFIvR3k3dTJ0dHpsWFNzMXlrdmpUNFRCWThhYXd4WHhwa3YrUE85NFpTSXBpcFFMOHVlcWkKNkhyQk54UGc1YjVOdDRHVVdRUVVnamhaY01JRm9DUUwrRmNkZGs4RkQ1UFkxNnprWDNReUpITlVkZXRoYmJKdQoveVAvMTk3b2l6aVdzbWJSQ3Z6Z3Q2bEtOUk51VjZJRitMdnM4RWxGUlAyeStLcmI2SXRjT3lwRjY5TGE1N1pZCjY0enJWSVJnc2FYZVBTTWpGVkN1ZHFDY2QrL0FEeFU3YVc2TzhFaXJBQ0pqcXFYcnBYamd3MVNUY21WR2ZYK1gKQithRjIza0NnWUVBNXFsYnJGaHhWQlZBVTlMR3JnVGNLZXRGUEJveTQyOWxVTnJXMU5xSUxEaExZVjgxRGZIQQpXQVdYK1l0NGJUTXZqTUd2TDhDM0pXL0NiNDNHSDhmU2lwUTZDUlR2dDBYNXlyNytWL0tVdWdpKzV4ZmVoMlIzCldiRUNBVWNKM0UxVmtvRkN2ZEFtbHZBMlNROGlRVHNkV3JuclJxWFhEVkFGQzlCNEtZQ0JiWk1DZ1lFQTd1eU4KNVVGMkg0dmZmSWtZQUZzS0k0YlM4blQ5UGw4dmNPeUNoTUFLNUlnSHQyQUk0RTRVa20zeHFiblV0cDdjdHoySgplbUxJaTJ3M2pVMXdjWittc0pIYnRyMmxDdGVMNjJjMENLYXVsaDA1YWhLZ0VZUjhlVzcyL1F6Skg1WDhPTkZsCkx4eW9vRUo0Vmo2T1VwcTZKZmJTUW03YUFKMWE1dVBHUzhZWmxrVUNnWUJhcm5oSThGaFZpeWxJQ3hScTg2UXUKb3IwTVhPeG10N09vTHZESXE4VmZSUjUxZ0gyV0p0WE1oUjV6VDk2Zlo4RW80RGhrV0twb0FHRDdoRXhBMEVrNAppLytvOUY4dHVVZno2bFNKOU9kOW45U1ZlNi9Ub0s2L1J6U1hsZnNOYmlYWFBCUW1GWUFtVlBleWowMlRRWTlQCnpNbnZjMkZ4YldVZWVPM1V1eDJuR3dLQmdCQkFreDVuSjR2WnplZ0F3MXN5MWl1NGZoejBERTN6MTV4TTJrd0IKYkR4RGJKTHl1MmZXcDl1V0V2eENvYytTV3QwMEdHZjAxRU4zcHdlN25zeDcyYkRsR3hjQkszcmpVcWMrcS9GeQp0U21NNzF6aHkzV2xsM29ETEZYbVNzQVZTY1RycVlCYzZMT09FZlY3NTk2Q20rcjlNU3hIc2hpY201UmRKaDM5CmFid3BBb0dBQmZKeC91cXk3RGpubnZPLzUxMW1CSEh5bS9pdG9TNzNVL2FOd1pqWmhyWlpzZGVxUUZNcm5xSTQKQU83S05ldE9oa3NmQnVndTg5Q3dXTjRYMkpYWjd1aFFlVWlKQWNhNFc4ZmJLdTNjYytsZUVMTisrVEZ5Um91MgphRlpRYnZSazdYU01nM3d0ekk5SUtoNzIyZXRPVXJPb0FaNWthRlcrRWt2WjBoNmlTTzg9Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg== +kind: Secret +metadata: + annotations: + cert-manager.io/alt-names: "" + cert-manager.io/certificate-name: nats-client-tls + cert-manager.io/common-name: sample-nats-client + cert-manager.io/ip-sans: "" + cert-manager.io/issuer-group: "" + cert-manager.io/issuer-kind: Issuer + cert-manager.io/issuer-name: nats-ca + cert-manager.io/uri-sans: "" + creationTimestamp: "2021-09-27T05:46:49Z" + name: nats-client-tls + namespace: demo + resourceVersion: "386072" + uid: 89931f0b-aa0d-499c-b7f9-d3b6ada4ab08 +type: kubernetes.io/tls +``` + +Now, let's create `tls.crt` and `tls.key` files in the local machine, + +```bash +❯ echo LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMrekNDQWVPZ0F3SUJBZ0lSQUlnc1laWkI2RU1MQjR6NGRnZTI2ZUV3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQXhNSGJtRjBjeTFqWVRBZUZ3MHlNVEE1TWpjd05UUTJORGxhRncweU1URXlNall3TlRRMgpORGxhTUIweEd6QVpCZ05WQkFNVEVuTmhiWEJzWlMxdVlYUnpMV05zYVdWdWREQ0NBU0l3RFFZSktvWklodmNOCkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOZEdselNWRTBGS1cyY1M5V3VqZmk1Wk5oY3I3dXJsUjZZSGR1dkwKQ2ZDRGdEZTNBUVBpWG92YzI4elgxY3d2cVVQU3l2WXpGUFN4dUtVRXpoLzBGZE5kMGk2SkVRQUp4dVgwU2JSdwpjYXZXMVR5MkZFWExtYTNiMnBWVWJ6dUE1VVdGQzFwd3hZVCsvcERHNmI4YnFuQVJiaFNvdUowQUoxTGNGT08zCjg1V1RtWUFDRHY4dmFyRFQvM0xmYWtndXJqYWc4SWdMMURyd2hxNFNjRllveElYbXJJZjhMTVVERkN4Y251aE0KNnIraUl4OXFhWkJjMys2eU4yNXNvc2J6ZDlXbXRlT3J3Z2pKUzRLdU9ZaWl2VzBsSDNzQTlOSG9HU3cwSDVtWgpjcndsMHZxV0JvaWFoMXdWSjM5S1NrWlRvLzhUaGpMQUV5QUZKdzRuNzk1eHFwOENBd0VBQWFOQk1EOHdEZ1lEClZSMFBBUUgvQkFRREFnV2dNQXdHQTFVZEV3RUIvd1FDTUFBd0h3WURWUjBqQkJnd0ZvQVV5dWRqc0hmTTFSdy8KL3ZFWTd4MHRIUjViVkdzd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFGRTE0OTJkdS9HSVpKS3BuMEdRNE1STApHbDI5bXc1Wi9nUWxwTTN3NGdYU1hxbmNGczREcHJFd2g5R25PTkEzcXpta1NIakFwWmwwQzdWZi84Y2RnNS8zCk90UVZSSGkxQVJFcGFHMlVUMnFJSXp1SUVLN0tRZE5maXpVYVVaMFgzb041Kyt4YWU4WSsxa3dZOXZxaXdWRlcKbS96T1JzSmRtcnRqNGZRSTVaVGRzVG1jRkxqUXBOcktOSWFVU2pHOFM1Q3pOMlJBekZHTTBCZWYzSWFzWTF2WQpDTWpOZlBxaUNtZFNlOFFxRE1UMURwRExjaFltQlQ3UjdyR0JBaEFXWEpEZlVMRXlXUk9XdmRrWlhnTk5ZMnlJCkhmbktUTy9TL1FpUUs4N0Y2SWtEM2tKalZPVDhUNVBmYjBwYTJnaDlnSkZmZUJPVW9FUkYrdG4zYWI3Z3BkQT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= | base64 -d > /tmp/tls.crt +❯ echo LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBMTBhWE5KVVRRVXBiWnhMMWE2TitMbGsyRnl2dTZ1VkhwZ2QyNjhzSjhJT0FON2NCCkErSmVpOXpiek5mVnpDK3BROUxLOWpNVTlMRzRwUVRPSC9RVjAxM1NMb2tSQUFuRzVmUkp0SEJ4cTliVlBMWVUKUmN1WnJkdmFsVlJ2TzREbFJZVUxXbkRGaFA3K2tNYnB2eHVxY0JGdUZLaTRuUUFuVXR3VTQ3ZnpsWk9aZ0FJTwoveTlxc05QL2N0OXFTQzZ1TnFEd2lBdlVPdkNHcmhKd1ZpakVoZWFzaC93c3hRTVVMRnllNkV6cXY2SWpIMnBwCmtGemY3ckkzYm15aXh2TjMxYWExNDZ2Q0NNbExncTQ1aUtLOWJTVWZld0QwMGVnWkxEUWZtWmx5dkNYUytwWUcKaUpxSFhCVW5mMHBLUmxPai94T0dNc0FUSUFVbkRpZnYzbkdxbndJREFRQUJBb0lCQUZWZ0NvRnhDY1RmLzJYZQpiL1J6VDR5RUZ0NlRydG43ZWpIUFRndHZaNDY2S0RSd1lIZXc0L3dsNkFuU0kxa3FJYi9qTGxqN296ano3cDJMClRWQUExbE1RSjFZTFIvR3k3dTJ0dHpsWFNzMXlrdmpUNFRCWThhYXd4WHhwa3YrUE85NFpTSXBpcFFMOHVlcWkKNkhyQk54UGc1YjVOdDRHVVdRUVVnamhaY01JRm9DUUwrRmNkZGs4RkQ1UFkxNnprWDNReUpITlVkZXRoYmJKdQoveVAvMTk3b2l6aVdzbWJSQ3Z6Z3Q2bEtOUk51VjZJRitMdnM4RWxGUlAyeStLcmI2SXRjT3lwRjY5TGE1N1pZCjY0enJWSVJnc2FYZVBTTWpGVkN1ZHFDY2QrL0FEeFU3YVc2TzhFaXJBQ0pqcXFYcnBYamd3MVNUY21WR2ZYK1gKQithRjIza0NnWUVBNXFsYnJGaHhWQlZBVTlMR3JnVGNLZXRGUEJveTQyOWxVTnJXMU5xSUxEaExZVjgxRGZIQQpXQVdYK1l0NGJUTXZqTUd2TDhDM0pXL0NiNDNHSDhmU2lwUTZDUlR2dDBYNXlyNytWL0tVdWdpKzV4ZmVoMlIzCldiRUNBVWNKM0UxVmtvRkN2ZEFtbHZBMlNROGlRVHNkV3JuclJxWFhEVkFGQzlCNEtZQ0JiWk1DZ1lFQTd1eU4KNVVGMkg0dmZmSWtZQUZzS0k0YlM4blQ5UGw4dmNPeUNoTUFLNUlnSHQyQUk0RTRVa20zeHFiblV0cDdjdHoySgplbUxJaTJ3M2pVMXdjWittc0pIYnRyMmxDdGVMNjJjMENLYXVsaDA1YWhLZ0VZUjhlVzcyL1F6Skg1WDhPTkZsCkx4eW9vRUo0Vmo2T1VwcTZKZmJTUW03YUFKMWE1dVBHUzhZWmxrVUNnWUJhcm5oSThGaFZpeWxJQ3hScTg2UXUKb3IwTVhPeG10N09vTHZESXE4VmZSUjUxZ0gyV0p0WE1oUjV6VDk2Zlo4RW80RGhrV0twb0FHRDdoRXhBMEVrNAppLytvOUY4dHVVZno2bFNKOU9kOW45U1ZlNi9Ub0s2L1J6U1hsZnNOYmlYWFBCUW1GWUFtVlBleWowMlRRWTlQCnpNbnZjMkZ4YldVZWVPM1V1eDJuR3dLQmdCQkFreDVuSjR2WnplZ0F3MXN5MWl1NGZoejBERTN6MTV4TTJrd0IKYkR4RGJKTHl1MmZXcDl1V0V2eENvYytTV3QwMEdHZjAxRU4zcHdlN25zeDcyYkRsR3hjQkszcmpVcWMrcS9GeQp0U21NNzF6aHkzV2xsM29ETEZYbVNzQVZTY1RycVlCYzZMT09FZlY3NTk2Q20rcjlNU3hIc2hpY201UmRKaDM5CmFid3BBb0dBQmZKeC91cXk3RGpubnZPLzUxMW1CSEh5bS9pdG9TNzNVL2FOd1pqWmhyWlpzZGVxUUZNcm5xSTQKQU83S05ldE9oa3NmQnVndTg5Q3dXTjRYMkpYWjd1aFFlVWlKQWNhNFc4ZmJLdTNjYytsZUVMTisrVEZ5Um91MgphRlpRYnZSazdYU01nM3d0ekk5SUtoNzIyZXRPVXJPb0FaNWthRlcrRWt2WjBoNmlTTzg9Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg== | base64 -d > /tmp/tls.key +``` + +Then, let's copy these files from local machine to nats-box pod, + +```bash +❯ kubectl cp -n demo /tmp/tls.crt sample-nats-box-785f8458d7-wtnfx:/tmp/tls.crt +❯ kubectl cp -n demo /tmp/tls.key sample-nats-box-785f8458d7-wtnfx:/tmp/tls.key +``` + +Finally, Let's exec into the nats-box pod, + +```bash +❯ kubectl exec -n demo sample-nats-tls-box-67fb4fb4f9-gtt9z -it -- sh -l +... +# Let's export the tls.crt and tls.key file paths as environment variables to make further commands re-usable. +sample-nats-tls-box-67fb4fb4f9-gtt9z:~# export NATS_CERT=/tmp/tls.crt +sample-nats-tls-box-67fb4fb4f9-gtt9z:~# export NATS_KEY=/tmp/tls.key + +# Let's create a stream named "ORDERS" +sample-nats-tls-box-67fb4fb4f9-gtt9z:~# nats stream add ORDERS --subjects "ORDERS.*" --ack --max-msgs=-1 --max-bytes=-1 --max-age=1y --storage file --retention limits --max-msg-size=-1 --max-msgs-per-subject=-1 --discard old --dupe-window="0s" --replicas 1 +Stream ORDERS was created + +Information for Stream ORDERS created 2021-09-27T06:27:30Z + +Configuration: + + Subjects: ORDERS.* + Acknowledgements: true + Retention: File - Limits + Replicas: 1 + Discard Policy: Old + Duplicate Window: 2m0s + Maximum Messages: unlimited + Maximum Bytes: unlimited + Maximum Age: 1y0d0h0m0s + Maximum Message Size: unlimited + Maximum Consumers: unlimited + + +Cluster Information: + + Name: nats + Leader: sample-nats-tls-2 + +State: + + Messages: 0 + Bytes: 0 B + FirstSeq: 0 + LastSeq: 0 + Active Consumers: 0 + +# Verify that the stream has been created successfully +sample-nats-tls-box-67fb4fb4f9-gtt9z:~# nats stream ls +Streams: + + ORDERS + +# Lets add some messages to the stream "ORDERS" +sample-nats-tls-box-67fb4fb4f9-gtt9z:~# nats pub ORDERS.scratch hello +06:29:18 Published 5 bytes to "ORDERS.scratch" + +# Add another message +ample-nats-tls-box-67fb4fb4f9-gtt9z:~# nats pub ORDERS.scratch world +06:29:41 Published 5 bytes to "ORDERS.scratch" + +# Verify that the messages have been published to the stream successfully +sample-nats-tls-box-67fb4fb4f9-gtt9z:~# nats stream info ORDERS +Information for Stream ORDERS created 2021-09-27T06:27:30Z + +Configuration: + + Subjects: ORDERS.* + Acknowledgements: true + Retention: File - Limits + Replicas: 1 + Discard Policy: Old + Duplicate Window: 2m0s + Maximum Messages: unlimited + Maximum Bytes: unlimited + Maximum Age: 1y0d0h0m0s + Maximum Message Size: unlimited + Maximum Consumers: unlimited + + +Cluster Information: + + Name: nats + Leader: sample-nats-tls-2 + +State: + + Messages: 2 + Bytes: 98 B + FirstSeq: 1 @ 2021-09-27T06:29:18 UTC + LastSeq: 2 @ 2021-09-27T06:29:41 UTC + Active Consumers: 0 + +sample-nats-tls-box-67fb4fb4f9-gtt9z:~# exit +``` + +We have successfully deployed a NATS cluster, created a stream and publish some messages into the stream. In the subsequent sections, we are going to backup this sample data using Stash. + +## Prepare for Backup + +In this section, we are going to prepare the necessary resources (i.e. connection information, backend information, etc.) before backup. + +### Ensure NATS Addon + +When you install Stash, it will automatically install all the official addons. Make sure that NATS addon was installed properly using the following command. + +```bash +❯ kubectl get tasks.stash.appscode.com | grep nats +nats-backup-2.6.1 24m +nats-restore-2.6.1 24m +``` + +This addon should be able to take backup of the NATS streams with matching major versions as discussed in [Addon Version Compatibility](/docs/v2024.12.18/addons/nats/README#addon-version-compatibility). + + +### Create AppBinding + +Stash needs to know how to connect with the NATS server. An `AppBinding` exactly provides this information. It holds the Service and Secret information of the NATS server. You have to point to the respective `AppBinding` as a target of backup instead of the NATS server itself. + +Here, is the YAML of the `AppBinding` that we are going to create for the NATS server we have deployed earlier. + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + labels: + app.kubernetes.io/instance: sample-nats-tls + name: sample-nats-tls + namespace: demo +spec: + clientConfig: + caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4RENDQWRpZ0F3SUJBZ0lRUDZ1UXIxQVlFWnJzREF6ZHBRR09HekFOQmdrcWhraUc5dzBCQVFzRkFEQVMKTVJBd0RnWURWUVFERXdkdVlYUnpMV05oTUI0WERUSXhNRGt5TnpBMU5EWTBOVm9YRFRJeU1Ea3lOakExTkRZMApOVm93RWpFUU1BNEdBMVVFQXhNSGJtRjBjeTFqWVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDCkFRb0NnZ0VCQUovelJtSE1CUVdGMTNXZlJubzFsV0ZJajZmNmhyRGRVR0RTMXBrY0hmMDlqNS90bEpYSHpCbVMKZSs2YS9Qb1MrdkMyWEtyeVp3UVB0NW5BaUxXR1NxM3VBRnJ3TUJncVBBQktOa1hHL1hjamNvbU5lVTFaQlNYYgo1WmlJa2F6TUZPOGFqRWxYb3RmYnQ2cVc5MGNCTVduRW9pcnUyWkFyam50WjJpMmpPeGRodUJpRTkxamRsZWMyCkdZWGFKVlJ5RkF1eVdXanVEV3o0NjFKdXBMdXcxVWJyVHpmMExUenQxdk9ONnZNU1RQT0Z0S0tnd0RGenB5ZkgKVjFFQlZ5aG1KSk42QW13SkErZGEvMmsxMUJCeHFEWldsOEZMWE1TWUcvU0hKak5sQ3VsQTFvVVJWbFI3MVF6KwpTanB2bkxKVm9nL01sYVcvTzB5N0lRcTVQNUZGeDBNQ0F3RUFBYU5DTUVBd0RnWURWUjBQQVFIL0JBUURBZ0trCk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZNcm5ZN0Izek5VY1AvN3hHTzhkTFIwZVcxUnIKTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFDQVZPQUZhTjRVOUQ0U1cxcWJUTDhkcWhFbklXTFd3YVBJdXJGSAo1MVVRMEUxenFTOWcvQ1gwUElOUmJ1bFpseHVKRGFBZEwweVYwYmZYZExLQnJacDNwS001eGRyaEoxQ3luNjV5CkRML0RTd3hTOHlxT3NwTXF2SkoyUTBhQ0JQTXhDRFZoOGVFZ2krOG9ISmdobkZzaTkvanNoZ0dUS09QbVVWdHcKTyszS1B0MFBiNVRDSVpJdlA1cXBybkU0U2hDWnRRZ0UyY0dJTEJPZEt5VEl6QlpuM3ZNZjc2Zjd4NU4rWEtINgpQN3Q4Yks0SUFSbzR1WUN0cDQ0K0dkY2FlcjlDL2RVNlpaMSs1Nm4xcUo3a3FTV3cwNFZqbi9CVWt5WnhIdFZPCkFLcUNCRWtnK3NBQytYUmNiOFdxTHkreEEzdmU0TmxqalE3T2MrVXVzanNrSndOVQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== + service: + name: sample-nats-tls + port: 4222 + scheme: nats + secret: + name: nats-client-tls + type: nats.io/nats + version: 2.6.1 +``` + +Here, + +- `.spec.clientConfig.caBundle` specifies a PEM encoded CA bundle which will be used to validate the serving certificate of the NATS server. +- `.spec.clientConfig.service` specifies the Service information to use to connects with the NATS server. +- `.spec.secret` specifies the name of the Secret that holds necessary credentials to access the server. +- `.spec.type` specifies the type of the target. This is particularly helpful in auto-backup where you want to use different path prefixes for different types of target. + +Let's create the `AppBinding` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/nats/tls/examples/appbinding.yaml +appbinding.appcatalog.appscode.com/sample-nats-tls created +``` + +### Prepare Backend + +We are going to store our backed up data into a GCS bucket. So, we need to create a Secret with GCS credentials and a `Repository` object with the bucket information. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +**Create Storage Secret:** + +At first, let's create a secret called `gcs-secret` with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat downloaded-sa-json.key > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create Repository:** + +Now, create a `Repository` object with the information of your desired bucket. Below is the YAML of `Repository` object we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /demo/nats/sample-nats-tls + storageSecretName: gcs-secret +``` + +Let's create the `Repository` we have shown above, + +```bash +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/nats/tls/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our streams into our desired backend. + +### Backup + +To schedule a backup, we have to create a `BackupConfiguration` object targeting the respective `AppBinding` of our NATS server. Then, Stash will create a CronJob to periodically backup the streams. + +#### Create BackupConfiguration + +Below is the YAML for `BackupConfiguration` object that we are going to use to backup the streams of the NATS server we have created earlier, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-nats-backup-tls + namespace: demo +spec: + task: + name: nats-backup-2.6.1 + schedule: "*/5 * * * *" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats-tls + interimVolumeTemplate: + metadata: + name: nats-backup-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +Here, + +- `.spec.schedule` specifies that we want to backup the streams at 5 minutes intervals. +- `.spec.task.name` specifies the name of the Task object that specifies the necessary Functions and their execution order to backup NATS streams. +- `.spec.repository.name` specifies the Repository CR name we have created earlier with backend information. +- `.spec.target.ref` refers to the AppBinding object that holds the connection information of our targeted NATS server. +- `spec.interimVolumeTemplate` specifies a PVC template that will be used by Stash to hold the dumped data temporarily before uploading it into the cloud bucket. +- `.spec.retentionPolicy` specifies a policy indicating how we want to cleanup the old backups. + +Let's create the `BackupConfiguration` object we have shown above, + +```bash +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/nats/tls/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/sample-nats-backup-tls created +``` + +#### Verify Backup Setup Successful + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. Let's verify the `Phase` of the BackupConfiguration, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-nats-backup-tls nats-backup-2.6.1 */5 * * * * Ready 11s +``` + +#### Verify CronJob + +Stash will create a CronJob with the schedule specified in `spec.schedule` field of `BackupConfiguration` object. + +Verify that the CronJob has been created using the following command, + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-nats-backup-tls */5 * * * * False 0 14s +``` + +#### Wait for BackupSession + +The `stash-sample-nats-backup` CronJob will trigger a backup on each scheduled slot by creating a `BackupSession` object. + +Now, wait for a schedule to appear. Run the following command to watch for `BackupSession` object, + +```bash +❯ kubectl get backupsession -n demo -w +NAME INVOKER-TYPE INVOKER-NAME PHASE DURATION AGE +sample-nats-backup-tls-prszs BackupConfiguration sample-nats-backup-tls Succeeded 35s 84s +``` + +Here, the phase `Succeeded` means that the backup process has been completed successfully. + +#### Verify Backup + +Now, we are going to verify whether the backed up data is present in the backend or not. Once a backup is completed, Stash will update the respective `Repository` object to reflect the backup completion. Check that the repository `gcs-repo` has been updated by the following command, + +```bash +❯ kubectl get repository -n demo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo true 4.156 KiB 3 2m2s 97m +``` + +Now, if we navigate to the GCS bucket, we will see the backed up data has been stored in `demo/nats/sample-nats-tls` directory as specified by `.spec.backend.gcs.prefix` field of the `Repository` object. + +
+ Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ + + +> Note: Stash keeps all the backed up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Restore + +If you have followed the previous sections properly, you should have a successful backup of your nats streams. Now, we are going to show how you can restore the streams from the backed up data. + +### Restore Into the Same NATS Cluster + +You can restore your data into the same NATS cluster you have backed up from or into a different NATS cluster in the same cluster or a different cluster. In this section, we are going to show you how to restore in the same NATS cluster which may be necessary when you have accidentally lost any data. + +#### Temporarily Pause Backup + +At first, let's stop taking any further backup of the NATS streams so that no backup runs after we delete the sample data. We are going to pause the `BackupConfiguration` object. Stash will stop taking any further backup when the `BackupConfiguration` is paused. + +Let's pause the `sample-nats-backup` BackupConfiguration, + +```bash +$ kubectl patch backupconfiguration -n demo sample-nats-backup-tls --type="merge" --patch='{"spec": {"paused": true}}' +``` + +Verify that the `BackupConfiguration` has been paused, + +```bash +❯ kubectl get backupconfiguration -n demo sample-nats-backup-tls +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-nats-backup-tls nats-backup-2.6.1 */5 * * * * true Ready 4m26s +``` + +Notice the `PAUSED` column. Value `true` for this field means that the `BackupConfiguration` has been paused. + +Stash will also suspend the respective CronJob. + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-nats-backup-tls */5 * * * * True 0 2m12s 5m4s +``` + +#### Simulate Disaster + +Now, let's simulate a disaster scenario. Here, we are going to exec into the nats-box pod and delete the sample data we have inserted earlier. + +```bash +❯ kubectl exec -n demo sample-nats-tls-box-67fb4fb4f9-gtt9z -it -- sh -l +... +# Let's export the tls.crt and tls.key file paths as environment variables to make further commands re-usable. +sample-nats-tls-box-67fb4fb4f9-gtt9z:~# export NATS_CERT=/tmp/tls.crt +sample-nats-tls-box-67fb4fb4f9-gtt9z:~# export NATS_KEY=/tmp/tls.key + +# delete the stream "ORDERS" +sample-nats-tls-box-67fb4fb4f9-gtt9z:~# nats stream rm ORDERS -f + +# verify that the stream has been deleted +sample-nats-tls-box-67fb4fb4f9-gtt9z:~# nats stream ls +No Streams defined + +sample-nats-tls-box-67fb4fb4f9-gtt9z:~# exit +``` + +#### Create RestoreSession + +To restore the streams, you have to create a `RestoreSession` object pointing to the `AppBinding` of the targeted NATS server. + +Here, is the YAML of the `RestoreSession` object that we are going to use for restoring the streams of the NATS server. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-nats-restore-tls + namespace: demo +spec: + task: + name: nats-restore-2.6.1 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-nats-tls + interimVolumeTemplate: + metadata: + name: nats-restore-tmp-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + rules: + - snapshots: [latest] +``` + +Here, + +- `.spec.task.name` specifies the name of the Task object that specifies the necessary Functions and their execution order to restore NATS streams. +- `.spec.repository.name` specifies the Repository object that holds the backend information where our backed up data has been stored. +- `.spec.target.ref` refers to the AppBinding object that holds the connection information of our targeted NATS server. +- `.spec.interimVolumeTemplate` specifies a PVC template that will be used by Stash to hold the restored data temporarily before injecting into the NATS server. +- `.spec.rules` specifies that we are restoring data from the latest backup snapshot of the streams. + +Let's create the `RestoreSession` object object we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/nats/tls/examples/restoresession.yaml +restoresession.stash.appscode.com/sample-nats-restore-tls created +``` + +Once, you have created the `RestoreSession` object, Stash will create a restore Job. Run the following command to watch the phase of the `RestoreSession` object, + +```bash +❯ kubectl get restoresession -n demo -w +NAME REPOSITORY PHASE DURATION AGE +sample-nats-restore-tls gcs-repo Succeeded 15s 55s +``` + +The `Succeeded` phase means that the restore process has been completed successfully. + +#### Verify Restored Data + +Now, let's exec into the nats-box pod and verify whether data actual data has been restored or not, + +```bash +❯ kubectl exec -n demo sample-nats-tls-box-67fb4fb4f9-gtt9z -it -- sh -l +... +# Let's export the tls.crt and tls.key file paths as environment variables to make further commands re-usable. +sample-nats-tls-box-67fb4fb4f9-gtt9z:~# export NATS_CERT=/tmp/tls.crt +sample-nats-tls-box-67fb4fb4f9-gtt9z:~# export NATS_KEY=/tmp/tls.key + +# Verify that the stream has been restored successfully +sample-nats-tls-box-67fb4fb4f9-gtt9z:~# nats str ls +Streams: + + ORDERS + +# Verify that the messages have been restored successfully +sample-nats-tls-box-67fb4fb4f9-gtt9z:~# nats stream info ORDERS +Information for Stream ORDERS created 2021-09-27T08:23:58Z + +Configuration: + + Subjects: ORDERS.* + Acknowledgements: true + Retention: File - Limits + Replicas: 1 + Discard Policy: Old + Duplicate Window: 2m0s + Maximum Messages: unlimited + Maximum Bytes: unlimited + Maximum Age: 1y0d0h0m0s + Maximum Message Size: unlimited + Maximum Consumers: unlimited + + +Cluster Information: + + Name: nats + Leader: sample-nats-tls-2 + +State: + + Messages: 2 + Bytes: 98 B + FirstSeq: 1 @ 2021-09-27T06:29:18 UTC + LastSeq: 2 @ 2021-09-27T06:29:41 UTC + Active Consumers: 0 + +sample-nats-tls-box-67fb4fb4f9-gtt9z:~# exit +``` + +Hence, we can see from the above output that the deleted data has been restored successfully from the backup. + +#### Resume Backup + +Since our data has been restored successfully we can now resume our usual backup process. Resume the `BackupConfiguration` using following command, + +```bash +❯ kubectl patch backupconfiguration -n demo sample-nats-backup-tls --type="merge" --patch='{"spec": {"paused": false}}' +backupconfiguration.stash.appscode.com/sample-nats-backup-tls patched +``` + +Verify that the `BackupConfiguration` has been resumed, +```bash +❯ kubectl get backupconfiguration -n demo sample-nats-backup-tls +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-nats-backup-tls nats-backup-2.6.1 */5 * * * * false Ready 16m +``` + +Here, `false` in the `PAUSED` column means the backup has been resumed successfully. The CronJob also should be resumed now. + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-nats-backup-tls */5 * * * * False 0 23s 17m +``` + +Here, `False` in the `SUSPEND` column means the CronJob is no longer suspended and will trigger in the next schedule. + +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo backupconfiguration sample-nats-backup-tls +kubectl delete -n demo restoresession sample-nats-restore-tls +kubectl delete -n demo repository gcs-repo +# delete the nats chart +helm delete sample-nats-tls -n demo +``` diff --git a/content/docs/v2024.12.18/addons/percona-xtradb/README.md b/content/docs/v2024.12.18/addons/percona-xtradb/README.md new file mode 100644 index 0000000000..a1f173d505 --- /dev/null +++ b/content/docs/v2024.12.18/addons/percona-xtradb/README.md @@ -0,0 +1,109 @@ +--- +title: Percona XtraDB Addon Overview | Stash +description: Percona XtraDB Addon Overview | Stash +menu: + docs_v2024.12.18: + identifier: stash-percona-xtradb-readme + name: Readme + parent: stash-percona-xtradb + weight: -1 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +url: /docs/v2024.12.18/addons/percona-xtradb/ +aliases: +- /docs/v2024.12.18/addons/percona-xtradb/README/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash Percona XtraDB Addon + +Stash 0.9.0+ supports extending its functionality through addons. Stash Percona XtraDB addon enables Stash to backup and restore Percona XtraDB databases. + +This guide will give you an overview of which Percona XtraDB versions are supported and how the docs are organized. + +## Supported Percona XtraDB Versions + + +Stash has the following addon versions for Percona-XtraDB: + +{{< versionlist "percona-xtradb">}} + +Here, the addon follows `M.M.P` versioning scheme where `M.M.P` (Major.Minor.Patch) represents the respective database version. + +## Addon Version Compatibility + +Any addon with matching major version with the database version should be able to take backup of that database. For example, PerconaXtraDB addon with version `5.x.x` should be able take backup of any PerconaXtraDB of `5.x.x` series. However, this might not be true for some versions. In that case, we will have separate addon for that version. + +## Documentation Overview + +Stash Percona XtraDB documentations are organized as below: + +- [How does it work?](/docs/v2024.12.18/addons/percona-xtradb/overview/) gives an overview of how backup and restore process for Percona XtraDB database works in Stash. +- [Standalone Percona-XtraDB](/docs/v2024.12.18/addons/percona-xtradb/standalone/) shows how to backup and restore a standalone Percona-XtraDB database. +- [Percona-XtraDB Cluster](/docs/v2024.12.18/addons/percona-xtradb/cluster/) shows how to backup & restore a Percona-XtraDB cluster. diff --git a/content/docs/v2024.12.18/addons/percona-xtradb/_index.md b/content/docs/v2024.12.18/addons/percona-xtradb/_index.md new file mode 100644 index 0000000000..64d9354c3f --- /dev/null +++ b/content/docs/v2024.12.18/addons/percona-xtradb/_index.md @@ -0,0 +1,77 @@ +--- +title: Stash Percona XtraDB Addon +menu: + docs_v2024.12.18: + identifier: stash-percona-xtradb + name: Percona XtraDB + parent: stash-addons + weight: 60 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/addons/percona-xtradb/cluster/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/addons/percona-xtradb/cluster/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..4744b210e7 --- /dev/null +++ b/content/docs/v2024.12.18/addons/percona-xtradb/cluster/examples/backupconfiguration.yaml @@ -0,0 +1,20 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-xtradb-cluster-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: perconaxtradb-backup-5.7 + repository: + name: gcs-repo-xtradb-cluster + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-xtradb-cluster + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/percona-xtradb/cluster/examples/repository.yaml b/content/docs/v2024.12.18/addons/percona-xtradb/cluster/examples/repository.yaml new file mode 100644 index 0000000000..4e237dd58f --- /dev/null +++ b/content/docs/v2024.12.18/addons/percona-xtradb/cluster/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo-xtradb-cluster + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: /demo/xtradb/sample-xtradb-cluster + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/addons/percona-xtradb/cluster/examples/restored-xtradb-cluster.yaml b/content/docs/v2024.12.18/addons/percona-xtradb/cluster/examples/restored-xtradb-cluster.yaml new file mode 100644 index 0000000000..eb3dfc44be --- /dev/null +++ b/content/docs/v2024.12.18/addons/percona-xtradb/cluster/examples/restored-xtradb-cluster.yaml @@ -0,0 +1,21 @@ +apiVersion: kubedb.com/v1alpha2 +kind: PerconaXtraDB +metadata: + name: restored-xtradb-cluster + namespace: demo +spec: + version: "5.7-cluster" + replicas: 3 + authSecret: + name: sample-xtradb-cluster-auth + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + init: + waitForInitialRestore: true + terminationPolicy: WipeOut diff --git a/content/docs/v2024.12.18/addons/percona-xtradb/cluster/examples/restoresession.yaml b/content/docs/v2024.12.18/addons/percona-xtradb/cluster/examples/restoresession.yaml new file mode 100644 index 0000000000..7c70b2529a --- /dev/null +++ b/content/docs/v2024.12.18/addons/percona-xtradb/cluster/examples/restoresession.yaml @@ -0,0 +1,32 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: restored-xtradb-cluster-restore + namespace: demo +spec: + task: + name: perconaxtradb-restore-5.7 + repository: + name: gcs-repo-xtradb-cluster + target: + replicas: 3 + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: restored-xtradb-cluster + volumeMounts: + - name: data-restored-xtradb-cluster + mountPath: /var/lib/mysql + volumeClaimTemplates: + - metadata: + name: data-restored-xtradb-cluster-${POD_ORDINAL} + spec: + accessModes: ["ReadWriteOnce"] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + rules: + - targetHosts: [] # empty host match all hosts + sourceHost: "host-0" # restore same data on all pvc + snapshots: ["latest"] diff --git a/content/docs/v2024.12.18/addons/percona-xtradb/cluster/examples/sample-xtradb-cluster.yaml b/content/docs/v2024.12.18/addons/percona-xtradb/cluster/examples/sample-xtradb-cluster.yaml new file mode 100644 index 0000000000..1c1af21c2e --- /dev/null +++ b/content/docs/v2024.12.18/addons/percona-xtradb/cluster/examples/sample-xtradb-cluster.yaml @@ -0,0 +1,17 @@ +apiVersion: kubedb.com/v1alpha2 +kind: PerconaXtraDB +metadata: + name: sample-xtradb-cluster + namespace: demo +spec: + version: "5.7-cluster" + replicas: 3 + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: WipeOut diff --git a/content/docs/v2024.12.18/addons/percona-xtradb/cluster/images/sample-xtradb-cluster-backup.png b/content/docs/v2024.12.18/addons/percona-xtradb/cluster/images/sample-xtradb-cluster-backup.png new file mode 100644 index 0000000000..e4fdd3fae3 Binary files /dev/null and b/content/docs/v2024.12.18/addons/percona-xtradb/cluster/images/sample-xtradb-cluster-backup.png differ diff --git a/content/docs/v2024.12.18/addons/percona-xtradb/cluster/index.md b/content/docs/v2024.12.18/addons/percona-xtradb/cluster/index.md new file mode 100644 index 0000000000..ecc4092622 --- /dev/null +++ b/content/docs/v2024.12.18/addons/percona-xtradb/cluster/index.md @@ -0,0 +1,742 @@ +--- +title: Backup & Restore Percona XtraDB Cluster | Stash +description: Backup & Restore a Percona XtraDB Cluster using Stash +menu: + docs_v2024.12.18: + identifier: stash-percona-xtradb-cluster + name: Percona XtraDB Cluster + parent: stash-percona-xtradb + weight: 30 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup and Restore Percona XtraDB Cluster using Stash + +Stash 0.9.0+ supports backup and restoration of Percona XtraDB cluster databases. This guide will show you how you can backup and restore your Percona XtraDB cluster with Stash. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using Minikube. +- Install Stash in your cluster following the steps [here](/docs/v2024.12.18/setup/README). +- Install [KubeDB](https://kubedb.com) in your cluster following the steps [here](https://kubedb.com/docs/latest/setup/). This step is optional. You can deploy your database using any method you want. We are using KubeDB because KubeDB simplifies many of the difficult or tedious management tasks to run a production-grade database on private and public clouds. +- If you are not familiar with how Stash takes backup and restores Percona XtraDB, please check the following guide [here](/docs/v2024.12.18/addons/percona-xtradb/overview/). + +You have to be familiar with the following custom resources: + +- [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) +- [Function](/docs/v2024.12.18/concepts/crds/function/) +- [Task](/docs/v2024.12.18/concepts/crds/task/) +- [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) +- [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + +To keep things isolated, we are going to use a separate namespace called `demo` throughout this tutorial. Create `demo` namespace if you haven't created yet. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> Note: YAML files used in this tutorial are stored [here](https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/percona-xtradb/cluster/examples). + +## Backup Percona XtraDB Cluster + +This section will demonstrate how to backup a Percona XtraDB cluster. Here, we are going to deploy a Percona XtraDB cluster using KubeDB. Then, we are going to back up this database into a GCS bucket. Finally, we are going to restore the backed up data into another Percona XtraDB cluster. + +### Deploy Sample Percona XtraDB Cluster + +Let's deploy a sample Percona XtraDB cluster and insert some data into it. + +#### Create Percona XtraDB CRD + +Below is the YAML of a sample `PerconaXtraDB` CRD that we are going to create for this tutorial: + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: PerconaXtraDB +metadata: + name: sample-xtradb-cluster + namespace: demo +spec: + version: "5.7-cluster" + replicas: 3 + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: WipeOut +``` + +Create the above `PerconaXtraDB` CRD, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/percona-xtradb/cluster/examples/sample-xtradb-cluster.yaml +perconaxtradb.kubedb.com/sample-xtradb-cluster created +``` + +KubeDB will deploy a Percona XtraDB cluster according to the above specification. It will also create the necessary Secrets and Services to access the database. + +Let's check if the database is ready to use, + +```bash +$ kubectl get px -n demo sample-xtradb-cluster +NAME VERSION STATUS AGE +sample-xtradb-cluster 5.7-cluster Ready 7m46s +``` + +The database is `Ready`. Verify that KubeDB has created a Secret and a Service for this database using the following commands, + +```bash +$ kubectl get secret -n demo -l=app.kubernetes.io/instance=sample-xtradb-cluster +NAME TYPE DATA AGE +sample-xtradb-cluster-auth Opaque 2 9m2s + +$ kubectl get service -n demo -l=app.kubernetes.io/instance=sample-xtradb-cluster +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +sample-xtradb-cluster ClusterIP 10.103.37.141 3306/TCP 11m +sample-xtradb-cluster-gvr ClusterIP None 3306/TCP 11m +``` + +Here, we have to use service `sample-xtradb-cluster` and secret `sample-xtradb-cluster-auth` to connect with the database. KubeDB creates an [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) CRD that holds the necessary information to connect with the database. + +#### Verify AppBinding + +Verify that the `AppBinding` has been created successfully using the following command, + +```bash +$ kubectl get appbindings -n demo +NAME AGE +sample-xtradb-cluster 14m +``` + +Let's check the YAML of the above AppBinding, + +```bash +$ kubectl get appbindings -n demo sample-xtradb-cluster -o yaml +``` + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + creationTimestamp: "2019-10-30T11:41:20Z" + generation: 1 + labels: + app.kubernetes.io/component: database + app.kubernetes.io/managed-by: kubedb.com + app.kubernetes.io/name: perconaxtradbs.kubedb.com + app.kubernetes.io/instance: sample-xtradb-cluster + name: sample-xtradb-cluster + namespace: demo + ownerReferences: + - apiVersion: kubedb.com/v1alpha2 + blockOwnerDeletion: false + kind: PerconaXtraDB + name: sample-xtradb-cluster + uid: 79d90fc4-f5e8-4a8c-83d7-3eae7c12f01a + resourceVersion: "12319" + selfLink: /apis/appcatalog.appscode.com/v1alpha1/namespaces/demo/appbindings/sample-xtradb-cluster + uid: 977cb8fd-b5e5-4830-a50f-58de9eb5d82c +spec: + clientConfig: + service: + name: sample-xtradb-cluster + path: / + port: 3306 + scheme: mysql + url: tcp(sample-xtradb-cluster:3306)/ + parameters: + address: gcomm://sample-xtradb-cluster-0.sample-xtradb-cluster-gvr.demo,sample-xtradb-cluster-1.sample-xtradb-cluster-gvr.demo,sample-xtradb-cluster-2.sample-xtradb-cluster-gvr.demo + apiVersion: config.kubedb.com/v1alpha2 + group: sample-xtradb-cluster + kind: GaleraArbitratorConfiguration + sstMethod: xtrabackup-v2 + secret: + name: sample-xtradb-cluster-auth + type: kubedb.com/perconaxtradb + version: "5.7-cluster" +``` + +Stash uses the AppBinding CRD to connect with the target database. It requires the following two fields to be set in the AppBinding's `.spec` section. + +- `.spec.clientConfig.service.name` specifies the name of the Service that connects to the database. +- `.spec.secret` specifies the name of the Secret that holds the necessary credentials to access the database. +- `.spec.type` specifies the type of the app that this AppBinding is pointing to. The format KubeDB generated AppBinding follows to set the value of `.spec.type` is `/`. + +#### Creating AppBinding Manually + +If you deploy the Percona XtraDB cluster without KubeDB, you have to create the AppBinding CRD manually in the same namespace as the service and secret of the database. + +The following YAML shows a minimal AppBinding specification that you have to create if you deploy the Percona XtraDB cluster without KubeDB. + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: your-custom-appbinding-name + namespace: your-database-namespace +spec: + clientConfig: + service: + name: your-database-service-name + port: 3306 + scheme: mysql + secret: + name: your-database-auth-secret-name + # type field is optional. you can keep it empty. + # if you keep it empty then the value of TARGET_APP_RESOURCE variable + # will be set to "appbinding" during auto-backup. + type: kubedb.com/perconaxtradb +``` + +You have to replace the `<...>` quoted part with proper values in the above YAML. + +#### Insert Sample Data + +Now, we are going to exec into the database pod and create some sample data. At first, find out the database pods using the following command, + +```bash +$ kubectl get pods -n demo --selector="app.kubernetes.io/instance=sample-xtradb-cluster" +NAME READY STATUS RESTARTS AGE +sample-xtradb-cluster-0 1/1 Running 0 39m +sample-xtradb-cluster-1 1/1 Running 0 38m +sample-xtradb-cluster-2 1/1 Running 0 37m +``` + +And copy the username and password of the `root` user to access into `mysql` shell. + +```bash +$ kubectl get secret -n demo sample-xtradb-cluster-auth -o jsonpath='{.data.username}'| base64 -d +root⏎ + +$ kubectl get secret -n demo sample-xtradb-cluster-auth -o jsonpath='{.data.password}'| base64 -d +CZYWy7MDXiedL2EG⏎ +``` + +Now, let's exec into the Pod to enter into `mysql` shell and create a database and a table, + +```bash +$ kubectl exec -it -n demo sample-xtradb-cluster-0 -- mysql --user=root --password=CZYWy7MDXiedL2EG +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 275 +Server version: 5.7.25-28-57 Percona XtraDB Cluster (GPL), Release rel28, Revision a2ef85f, WSREP version 31.35, wsrep_31.35 + +Copyright (c) 2009-2019 Percona LLC and/or its affiliates +Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> CREATE DATABASE playground; +Query OK, 1 row affected (0.01 sec) + +mysql> SHOW DATABASES; ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| mysql | +| performance_schema | +| playground | +| sys | ++--------------------+ +5 rows in set (0.00 sec) + +mysql> CREATE TABLE playground.equipment ( id INT NOT NULL AUTO_INCREMENT, type VARCHAR(50), quant INT, color VARCHAR(25), PRIMARY KEY(id)); +Query OK, 0 rows affected (0.01 sec) + +mysql> SHOW TABLES IN playground; ++----------------------+ +| Tables_in_playground | ++----------------------+ +| equipment | ++----------------------+ +1 row in set (0.01 sec) + +mysql> INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue"); +Query OK, 1 row affected (0.01 sec) + +mysql> SELECT * FROM playground.equipment; ++----+-------+-------+-------+ +| id | type | quant | color | ++----+-------+-------+-------+ +| 1 | slide | 2 | blue | ++----+-------+-------+-------+ +1 row in set (0.00 sec) + +mysql> exit +Bye +``` + +Now, we are ready to back up the database. + +### Prepare Backend + +We are going to store our backed up data into a GCS bucket. At first, we need to create a secret with GCS credentials then we need to create a `Repository` CRD. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +#### Create Storage Secret + +Let's create a secret called `gcs-secret` with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat downloaded-sa-json.key > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +#### Create Repository + +Now, crete a `Repository` using this secret. Below is the YAML of Repository CRD we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo-xtradb-cluster + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: /demo/xtradb/sample-xtradb-cluster + storageSecretName: gcs-secret +``` + +Let's create the `Repository` we have shown above, + +```bash +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/percona-xtradb/cluster/examples/repository.yaml +repository.stash.appscode.com/gcs-repo-xtradb-cluster created +``` + +Now, we are ready to back up our database to our desired backend. + +### Backup + +We have to create a `BackupConfiguration` targeting respective AppBinding CRD of our desired database. Then Stash will create a CronJob to periodically backup the database. + +#### Create BackupConfiguration + +Below is the YAML for `BackupConfiguration` CRD to backup the `sample-xtradb-cluster` database we have deployed earlier, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-xtradb-cluster-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: perconaxtradb-backup-5.7 + repository: + name: gcs-repo-xtradb-cluster + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-xtradb-cluster + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +Here, + +- `.spec.schedule` specifies that we want to back up the database at 5 minutes interval. +- `.spec.task.name` specifies the name of the Task CRD that specifies the necessary Functions and their execution order to backup a Percona XtraDB cluster. +- `.spec.target.ref` refers to the AppBinding CRD that was created for the `sample-xtradb-cluster` database. + +Let's create the `BackupConfiguration` CRD we have shown above, + +```bash +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/percona-xtradb/cluster/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/sample-xtradb-cluster-backup created +``` + +#### Verify Backup Setup Successful + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. Let's verify the `Phase` of the BackupConfiguration, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-xtradb-cluster-backup perconaxtradb-backup-5.7 */5 * * * * Ready 11s +``` + + +#### Verify CronJob + +Stash will create a CronJob with the schedule specified in `.spec.schedule` field of `BackupConfiguration` CRD. + +Verify that the CronJob has been created using the following command, + +```bash +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +sample-xtradb-cluster-backup */5 * * * * False 0 49s 2m22s +``` + +#### Wait for BackupSession + +The `sample-xtradb-cluster-backup` CronJob will trigger a backup on each scheduled slot by creating a `BackupSession` CRD. + +Wait for a schedule to appear. Run the following command to watch `BackupSession` CRD, + +```bash +$ kubectl get backupsession -n demo -l=stash.appscode.com/invoker-name=sample-xtradb-cluster-backup --watch +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +sample-xtradb-cluster-backup-1572439801 BackupConfiguration sample-xtradb-cluster-backup Succeeded 4m27s +``` + +Here, the phase **`Succeeded`** means that the backupsession has been succeeded. + +>Note: Backup CronJob creates `BackupSession` CRD the label `stash.appscode.com/invoker-name=`. We can use this label to watch only the `BackupSession` of our desired `BackupConfiguration`. + +#### Verify Backup + +Now, we are going to verify whether the backed up data is in the backend. Once a backup is completed, Stash will update the respective `Repository` CRD to reflect the backup completion. Check that the repository `gcs-repo-xtradb-cluster` has been updated by the following command, + +```bash +$ kubectl get repository -n demo gcs-repo-xtradb-cluster +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo-xtradb-cluster true 304.165 MiB 3 97s 13m +``` + +Now, if we navigate to the GCS bucket, we will see the backed up data has been stored in `demo/xtradb/sample-xtradb-cluster` directory as specified by `.spec.backend.gcs.prefix` field of Repository CRD. + +
+  Backed up data in GCS Bucket +
Fig: Backed up data in GCS Bucket
+
+ +> Note: Stash keeps all the backed up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +### Restore Percona XtraDB Cluster + +In this section, we are going to restore the database from the backup we have taken in the previous section. We are going to deploy a new database and initialize it from the backup. + +#### Stop Taking Backup of the Old Database + +At first, let's stop taking any further backup of the old database so that no backup is taken during the restore process. We are going to pause the `BackupConfiguration` CRD that we had created to backup the `sample-xtradb-cluster` database. Then, Stash will stop taking any further backup for this database. + +Let's pause the `sample-xtradb-cluster-backup` BackupConfiguration, + +```console +$ kubectl patch backupconfiguration -n demo sample-xtradb-cluster-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/sample-xtradb-cluster-backup patched +``` + +Now, wait for a moment. Stash will pause the BackupConfiguration. Verify that the operator has paused the BackupConfiguration object, + +```console +$ kubectl get backupconfiguration -n demo sample-xtradb-cluster-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-xtradb-cluster-backup perconaxtradb-backup-5.7 */5 * * * * true Ready 50m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the BackupConfiguration has been paused. + +#### Deploy Restored Database + +Now, we have to deploy the restored database similarly as we have deployed the original `sample-xtradb-cluster` database. However, this time there will be the following differences: + +- We have to use the same secret that was used in the original database. We are going to specify it using `.spec.databaseSecret` field. +- We are going to specify `.spec.init.waitForInitialRestore: true` which tells KubeDB to wait for the initial restore to complete before marking this database as ready to use. + +Below is the YAML for `PerconaXtraDB` CRD we are going deploy to initialize from backup, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: PerconaXtraDB +metadata: + name: restored-xtradb-cluster + namespace: demo +spec: + version: "5.7-cluster" + replicas: 3 + authSecret: + name: sample-xtradb-cluster-auth + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + init: + waitForInitialRestore: true + terminationPolicy: WipeOut +``` + +Let's create the above database, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/percona-xtradb/cluster/examples/restored-xtradb-cluster.yaml +perconaxtradb.kubedb.com/restored-xtradb-cluster created +``` + +If you check the database status, you will see it is stuck in **`Provisioning`** state. + +```bash +$ kubectl get px -n demo restored-xtradb-cluster +NAME VERSION STATUS AGE +restored-xtradb-cluster 5.7-cluster Provisioning 4m10s +``` + +#### Create RestoreSession + +Now, we need to create a `RestoreSession` CRD pointing to the newly created restored database. + +In case of Percona XtraDB cluster, the RestoreSession object contains some different configurations unlike other databases supported by KubeDB. To restore Percona XtraDB cluster, Stash operator will create the required number of PVCs and mount the data in the data directory `/var/lib/mysql` with proper ownership and permission. After completing the PVC creation, KubeDB then creates AppBinding, Secret, Services, etc. objects. + +Below is the contents of YAML file of the RestoreSession CRD that we are going to create to restore the backed up data into the newly created database provisioned by PerconaXtrDB CRD named `restored-xtradb-cluster`. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: restored-xtradb-cluster-restore + namespace: demo +spec: + task: + name: perconaxtradb-restore-5.7 + repository: + name: gcs-repo-xtradb-cluster + target: + replicas: 3 + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: restored-xtradb-cluster + volumeMounts: + - name: data-restored-xtradb-cluster + mountPath: /var/lib/mysql + volumeClaimTemplates: + - metadata: + name: data-restored-xtradb-cluster-${POD_ORDINAL} + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + rules: + - targetHosts: [] # empty host match all hosts + sourceHost: "host-0" # restore same data on all pvc + snapshots: ["latest"] +``` + +Here, + +- `.spec.task.name` specifies the name of the Task CRD that specifies the necessary Functions and their execution order to restore a Percona XtraDB cluster. +- `.spec.repository.name` specifies the Repository CRD that holds the backend information where our backed up data has been stored. +- `.spec.target.replicas` specifies the number of PVCs where snapshot data will be restored. +- `.spec.target.ref` refers to the AppBinding object for the `restored-xtradb-cluster` PerconaXtraDB object. Though the KubeDB operator will create this AppBinding object later, we need to tell Stash operator about this AppBinding object ref. Because the AppBinding object name is identical with the corresponding PerconaXtraDB object name and the names of the PVCs directly depend on this name. +- `.spec.target.volumeClaimTemplates` specifies the template used for the PVCs. The important thing here is the `.metadata.name`. In KubeDB side, the PVC name is formed by following the rule `data--`. Since we have created our restore database named `restored-xtradb-cluster` and later KubeDB will create a StatefulSet for this database, the PVC names will be `data-restored-xtradb-cluster-0`, `data-restored-xtradb-cluster-1`, `data-restored-xtradb-cluster-2`, etc. up to the number of replicas. Here Stash operator will create these PVCs by following the same convention as KubeDB. We just need to provide the `.metadata.name` as `data--${POD_ORDINAL}`. You must insert `${POD_ORDINAL}` at the end of the name. Stash will create the required PVCs by replacing this with the corresponding pod index. That means if the value of `.spec.target.replicas` is 3, then Stash will create 3 PVCs named `data-restored-xtradb-cluster-0`, `data-restored-xtradb-cluster-1`, and `data-restored-xtradb-cluster-2`. +- `.spec.target.volumeMounts` specifies the mount path for the volume. The `mountPath` must be `/var/lib/mysql` as expected by Percona XtraDB server. And the volume name is form as `"data-"`. Since for restoring purpose, we have created a PerconaXtraDB object named `restored-xtradb-cluster`, the volume name will be `"data-restored-xtradb-cluster"`. +- `.spec.rules` specifies that we are restoring data from the `latest` backup snapshot of the database. Empty (`[]`) `targetHosts` means snapshot data will be restored in all specified number of PVCs. And another obvious thing is we want to restore the same data from `host-0` to all PVCs. During the backup procedure, we took backup data as `host-0` from the Percona XtraDB cluster. So, here the source host is `host-0`. + +Let's create the RestoreSession CRD object we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/percona-xtradb/cluster/examples/restoresession.yaml +restoresession.stash.appscode.com/restored-xtradb-cluster-restore created +``` + +Once you have created the RestoreSession object, Stash will create a restore Job. We can watch the phase of the RestoreSession object to check whether the restore process has succeeded or not. + +Run the following command to watch the phase of the RestoreSession object, + +```bash +$ kubectl get restoresession -n demo restored-xtradb-cluster-restore --watch +NAME REPOSITORY PHASE AGE +restored-xtradb-cluster-restore gcs-repo-xtradb-cluster Running 3m33s +restored-xtradb-cluster-restore gcs-repo-xtradb-cluster Running 3m51s +restored-xtradb-cluster-restore gcs-repo-xtradb-cluster Running 3m58s +restored-xtradb-cluster-restore gcs-repo-xtradb-cluster Succeeded 3m58s +``` + +Here, we can see from the output of the above command that the restore process succeeded. + +#### Verify Restored Data + +In this section, we are going to verify whether the desired data has restored successfully. We are going to connect to the database server and check whether the database and the table we created earlier in the original database have restored. + +At first, check if the database has gone into **`Running`** state, + +```bash +$ kubectl get px -n demo restored-xtradb-cluster --watch +NAME VERSION STATUS AGE +restored-xtradb-cluster 5.7-cluster Provisioning 3m36s +restored-xtradb-cluster 5.7-cluster Provisioning 4m4s +restored-xtradb-cluster 5.7-cluster Ready 4m4s +``` + +Now, find out the database Pod, + +```bash +$ kubectl get pods -n demo --selector="app.kubernetes.io/instance=restored-xtradb-cluster" --watch +NAME READY STATUS RESTARTS AGE +restored-xtradb-cluster-0 1/1 Running 0 115s +restored-xtradb-cluster-1 1/1 Running 0 77s +restored-xtradb-cluster-2 1/1 Running 0 41s +``` + +And then copy the user name and password of the `root` user to access into `mysql` shell. + +> Notice: We used the same Secret for the `restored-xtradb-cluster` object. So, we will use the same commands as before. + +```bash +$ kubectl get secret -n demo sample-xtradb-cluster-auth -o jsonpath='{.data.username}'| base64 -d +root⏎ + +$ kubectl get secret -n demo sample-xtradb-cluster-auth -o jsonpath='{.data.password}'| base64 -d +CZYWy7MDXiedL2EG⏎ +``` + +Now, let's exec into the Pod to enter into `mysql` shell and check the database and the table we created before, + +```bash +$ kubectl exec -it -n demo restored-xtradb-cluster-0 -- mysql --user=root --password=CZYWy7MDXiedL2EG +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 275 +Server version: 5.7.25-28-57 Percona XtraDB Cluster (GPL), Release rel28, Revision a2ef85f, WSREP version 31.35, wsrep_31.35 + +Copyright (c) 2009-2019 Percona LLC and/or its affiliates +Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> SHOW DATABASES; ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| mysql | +| performance_schema | +| playground | +| sys | ++--------------------+ +5 rows in set (0.00 sec) + +mysql> SHOW TABLES IN playground; ++----------------------+ +| Tables_in_playground | ++----------------------+ +| equipment | ++----------------------+ +1 row in set (0.00 sec) + +mysql> SELECT * FROM playground.equipment; ++----+-------+-------+-------+ +| id | type | quant | color | ++----+-------+-------+-------+ +| 1 | slide | 2 | blue | ++----+-------+-------+-------+ +1 row in set (0.00 sec) + +mysql> exit +Bye +``` + +So, from the above output, we can see that the `playground` database and the `equipment` table we created before in the original database are restored successfully. + +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete restoresession -n demo restored-xtradb-cluster-restore +kubectl delete px -n demo restored-xtradb-cluster +kubectl delete repository -n demo gcs-repo-xtradb-cluster +kubectl delete backupconfiguration -n demo sample-xtradb-cluster-backup +kubectl delete px -n demo sample-xtradb-cluster +``` diff --git a/content/docs/v2024.12.18/addons/percona-xtradb/overview/images/backup_overview.svg b/content/docs/v2024.12.18/addons/percona-xtradb/overview/images/backup_overview.svg new file mode 100644 index 0000000000..508f350424 --- /dev/null +++ b/content/docs/v2024.12.18/addons/percona-xtradb/overview/images/backup_overview.svg @@ -0,0 +1,1002 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/addons/percona-xtradb/overview/images/cluster_backup.png b/content/docs/v2024.12.18/addons/percona-xtradb/overview/images/cluster_backup.png new file mode 100644 index 0000000000..1e70ba4426 Binary files /dev/null and b/content/docs/v2024.12.18/addons/percona-xtradb/overview/images/cluster_backup.png differ diff --git a/content/docs/v2024.12.18/addons/percona-xtradb/overview/images/cluster_restore.png b/content/docs/v2024.12.18/addons/percona-xtradb/overview/images/cluster_restore.png new file mode 100644 index 0000000000..41923f0fca Binary files /dev/null and b/content/docs/v2024.12.18/addons/percona-xtradb/overview/images/cluster_restore.png differ diff --git a/content/docs/v2024.12.18/addons/percona-xtradb/overview/images/restore_overview.svg b/content/docs/v2024.12.18/addons/percona-xtradb/overview/images/restore_overview.svg new file mode 100644 index 0000000000..5fbb1158f6 --- /dev/null +++ b/content/docs/v2024.12.18/addons/percona-xtradb/overview/images/restore_overview.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content/docs/v2024.12.18/addons/percona-xtradb/overview/images/standalone_backup.png b/content/docs/v2024.12.18/addons/percona-xtradb/overview/images/standalone_backup.png new file mode 100644 index 0000000000..7803c9cf93 Binary files /dev/null and b/content/docs/v2024.12.18/addons/percona-xtradb/overview/images/standalone_backup.png differ diff --git a/content/docs/v2024.12.18/addons/percona-xtradb/overview/images/standalone_backup.svg b/content/docs/v2024.12.18/addons/percona-xtradb/overview/images/standalone_backup.svg new file mode 100644 index 0000000000..d8428839c7 --- /dev/null +++ b/content/docs/v2024.12.18/addons/percona-xtradb/overview/images/standalone_backup.svg @@ -0,0 +1,273 @@ + + + + + diff --git a/content/docs/v2024.12.18/addons/percona-xtradb/overview/images/standalone_restore.png b/content/docs/v2024.12.18/addons/percona-xtradb/overview/images/standalone_restore.png new file mode 100644 index 0000000000..301a760d92 Binary files /dev/null and b/content/docs/v2024.12.18/addons/percona-xtradb/overview/images/standalone_restore.png differ diff --git a/content/docs/v2024.12.18/addons/percona-xtradb/overview/index.md b/content/docs/v2024.12.18/addons/percona-xtradb/overview/index.md new file mode 100644 index 0000000000..3ef4820e8e --- /dev/null +++ b/content/docs/v2024.12.18/addons/percona-xtradb/overview/index.md @@ -0,0 +1,192 @@ +--- +title: Percona XtraDB Backup & Restore Overview | Stash +description: How Percona XtraDB Backup & Restore Works in Stash +menu: + docs_v2024.12.18: + identifier: stash-percona-xtradb-overview + name: How does it work? + parent: stash-percona-xtradb + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# How Stash Backup & Restore Percona XtraDB Database + +Stash 0.9.0+ supports backup and restore operation of many databases. This guide will give you an overview of how Percona XtraDB database backup and restore process works in Stash. + +## How Backup Works + +The following diagram shows how Stash takes backup of a Percona XtraDB database. Open the image in a new tab to see the enlarged version. + +
+  Percona XtraDB Backup Overview +
Fig: Percona XtraDB Backup Overview
+
+ +The backup process consists of the following steps: + +1. At first, a user creates a secret with access credentials of the backend where the backed up data will be stored. + +2. Then, she creates a `Repository` crd that specifies the backend information along with the secret that holds the credentials to access the backend. + +3. Then, she creates a `BackupConfiguration` crd targeting the [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) crd of the desired database. The `BackupConfiguration` object also specifies the `Task` to use to backup the database. + +4. Stash operator watches for `BackupConfiguration` crd. + +5. Once Stash operator finds a `BackupConfiguration` crd, it creates a CronJob with the schedule specified in `BackupConfiguration` object to trigger backup periodically. + +6. On the next scheduled slot, the CronJob triggers a backup by creating a `BackupSession` crd. + +7. Stash operator also watches for `BackupSession` crd. + +8. When it finds a `BackupSession` object, it resolves the respective `Task` and `Function` and prepares a Job definition to backup. + +9. Then, it creates the Job to backup the targeted database. + +10. The backup Job reads necessary information to connect with the database from the `AppBinding` crd. It also reads backend information and access credentials from `Repository` crd and Storage Secret respectively. + +11. Then, the Job dumps the targeted database(s) and uploads the output to the backend. Stash pipes the output of the dump command to the upload process. Hence, backup Job does not require a large volume to hold the entire dump output. + +12. Finally, when the backup is complete, the Job sends Prometheus metrics to the Pushgateway running inside Stash operator pod. It also updates the `BackupSession` and `Repository` status to reflect the backup procedure. + +### Backup Different Percona XtraDB Configurations + +This section will show you how backup works for different Percona XtraDB Configurations. + +#### Standalone Percona XtraDB + +For a standalone Percona XtraDB database, the backup job directly dumps the database using `mysqldump` and pipe the output to the backup process. + +
+ Standalone Percona XtraDB Backup Overview +
Fig: Standalone Percona XtraDB Backup
+
+ +#### Percona XtraDB Cluster + +For a standalone Percona XtraDB database, the backup Job runs the backup procedure to take the backup of the targeted databases and uploads the output to the backend. In backup procedure, the Job runs a process called `garbd` ([Galera Arbitrator](https://galeracluster.com/library/documentation/arbitrator.html)) which uses `xtrabackup-v2` script during State Snapshot Transfer (SST). Basically this Job takes a full copy of the data stored in the data directory (`/var/lib/mysql`) and pipes the output of the backup procedure to the uploading process. Hence, backup Job does not require a large volume to hold the entire backed up data. + +
+ Percona XtraDB Cluster Backup Overview +
Fig: Percona XtraDB Cluster Backup
+
+ +## How Restore Process Works + +The following diagram shows how Stash restores backed up data into a Percona XtraDB database. Open the image in a new tab to see the enlarged version. + +
+  Percona XtraDB Restore Overview +
Fig: Percona XtraDB Restore Process Overview
+
+ +The restore process consists of the following steps: + +1. At first, a user creates a `RestoreSession` crd targeting the `AppBinding` of the desired database where the backed up data will be restored. It also specifies the `Repository` crd which holds the backend information and the `Task` to use to restore the target. + +2. Stash operator watches for `RestoreSession` object. + +3. Once it finds a `RestoreSession` object, it resolves the respective `Task` and `Function` and prepares a Job (in case of restoring cluster more than one Job and PVC) definition(s) to restore. + +4. Then, it creates the Job(s) (as well as PVCs in case of cluster) to restore the target. + +5. The Job(s) reads necessary information to connect with the database from respective `AppBinding` crd. It also reads backend information and access credentials from `Repository` crd and Storage Secret respectively. + +6. Then, the Job(s) downloads the backed up data from the backend and injects into the desired database. Stash pipes the downloaded data to inject into the database. Hence, the restore Job(s) does not require a large volume to download entire backup data inside it. + +7. Finally, when the restore process is complete, the Job(s) sends Prometheus metrics to the Pushgateway and update the `RestoreSession` status to reflect restore completion. + +### Restore Different Percona XtraDB Configurations + +This section will show you how restore works for different Percona XtraDB Configurations. + +#### Standalone Percona XtraDB + +For a standalone Percona XtraDB database, the restore Job downloads the backed up data from the backend and pipe the downloaded data to `mysql` command which inserts the data into the desired database. + +
+ Standalone Percona XtraDB Restore Overview +
Fig: Standalone Percona XtraDB Restore
+
+ +#### Percona XtraDB Cluster + +For a Percona XtraDB Cluster, the Stash operator creates a number (equal to the value of `.spec.target.replicas` of `RestoreSession` object) of Jobs to restore. Each of these Jobs requires a PVC to store the previously backed up data of the data directory `/var/lib/mysql` from the backend. Then each Job downloads the backed up data from the backend and injects into the associated PVC. + +
+ Percona XtraDB Cluster Restore Overview +
Fig: Percona XtraDB Cluster Restore
+
+ +## Next Steps + +- Backup standalone Precona-XtraDB using Stash following the guide from [here](/docs/v2024.12.18/addons/percona-xtradb/standalone/). +- Backup Precona-XtraDB cluster using Stash following the guide from [here](/docs/v2024.12.18/addons/percona-xtradb/cluster/). diff --git a/content/docs/v2024.12.18/addons/percona-xtradb/standalone/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/addons/percona-xtradb/standalone/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..8590296309 --- /dev/null +++ b/content/docs/v2024.12.18/addons/percona-xtradb/standalone/examples/backupconfiguration.yaml @@ -0,0 +1,20 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-xtradb-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: perconaxtradb-backup-5.7 + repository: + name: gcs-repo-sample-xtradb + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-xtradb + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/percona-xtradb/standalone/examples/repository.yaml b/content/docs/v2024.12.18/addons/percona-xtradb/standalone/examples/repository.yaml new file mode 100644 index 0000000000..05f180f88c --- /dev/null +++ b/content/docs/v2024.12.18/addons/percona-xtradb/standalone/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo-sample-xtradb + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: /demo/xtradb/sample-xtradb + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/addons/percona-xtradb/standalone/examples/restored-xtradb.yaml b/content/docs/v2024.12.18/addons/percona-xtradb/standalone/examples/restored-xtradb.yaml new file mode 100644 index 0000000000..e58e377a4e --- /dev/null +++ b/content/docs/v2024.12.18/addons/percona-xtradb/standalone/examples/restored-xtradb.yaml @@ -0,0 +1,21 @@ +apiVersion: kubedb.com/v1alpha2 +kind: PerconaXtraDB +metadata: + name: restored-xtradb + namespace: demo +spec: + version: "5.7" + replicas: 1 + authSecret: + name: sample-xtradb-auth + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + init: + waitForInitialRestore: true + terminationPolicy: WipeOut diff --git a/content/docs/v2024.12.18/addons/percona-xtradb/standalone/examples/restoresession.yaml b/content/docs/v2024.12.18/addons/percona-xtradb/standalone/examples/restoresession.yaml new file mode 100644 index 0000000000..051c952836 --- /dev/null +++ b/content/docs/v2024.12.18/addons/percona-xtradb/standalone/examples/restoresession.yaml @@ -0,0 +1,17 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: restored-xtradb-restore + namespace: demo +spec: + task: + name: perconaxtradb-restore-5.7 + repository: + name: gcs-repo-sample-xtradb + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: restored-xtradb + rules: + - snapshots: ["latest"] diff --git a/content/docs/v2024.12.18/addons/percona-xtradb/standalone/examples/sample-xtradb.yaml b/content/docs/v2024.12.18/addons/percona-xtradb/standalone/examples/sample-xtradb.yaml new file mode 100644 index 0000000000..9ea30a4596 --- /dev/null +++ b/content/docs/v2024.12.18/addons/percona-xtradb/standalone/examples/sample-xtradb.yaml @@ -0,0 +1,17 @@ +apiVersion: kubedb.com/v1alpha2 +kind: PerconaXtraDB +metadata: + name: sample-xtradb + namespace: demo +spec: + version: "5.7" + replicas: 1 + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: WipeOut diff --git a/content/docs/v2024.12.18/addons/percona-xtradb/standalone/images/sample-xtradb-backup.png b/content/docs/v2024.12.18/addons/percona-xtradb/standalone/images/sample-xtradb-backup.png new file mode 100644 index 0000000000..67855bb9b6 Binary files /dev/null and b/content/docs/v2024.12.18/addons/percona-xtradb/standalone/images/sample-xtradb-backup.png differ diff --git a/content/docs/v2024.12.18/addons/percona-xtradb/standalone/index.md b/content/docs/v2024.12.18/addons/percona-xtradb/standalone/index.md new file mode 100644 index 0000000000..d7c8d07cfb --- /dev/null +++ b/content/docs/v2024.12.18/addons/percona-xtradb/standalone/index.md @@ -0,0 +1,722 @@ +--- +title: Backup & Restore Percona XtraDB Database | Stash +description: Backup & Restore a standalone Percona XtraDB Database database using Stash +menu: + docs_v2024.12.18: + identifier: stash-percona-xtradb-standalone + name: Standalone Percona XtraDB + parent: stash-percona-xtradb + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup and Restore Percona XtraDB database using Stash + +Stash 0.9.0+ supports backup and restoration of Percona XtraDB databases. This guide will show you how you can backup and restore your Percona XtraDB database with Stash. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using Minikube. +- Install Stash in your cluster following the steps [here](/docs/v2024.12.18/setup/README). +- Install [KubeDB](https://kubedb.com) in your cluster following the steps [here](https://kubedb.com/docs/latest/setup/). This step is optional. You can deploy your database using any method you want. We are using KubeDB because KubeDB simplifies many of the difficult or tedious management tasks to run a production-grade database on private and public clouds. +- If you are not familiar with how Stash takes backup and restores Percona XtraDB databases, please check the following guide [here](/docs/v2024.12.18/addons/percona-xtradb/overview/). + +You have to be familiar with the following custom resources: + +- [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) +- [Function](/docs/v2024.12.18/concepts/crds/function/) +- [Task](/docs/v2024.12.18/concepts/crds/task/) +- [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) +- [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + +To keep things isolated, we are going to use a separate namespace called `demo` throughout this tutorial. Create `demo` namespace if you haven't created yet. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> Note: YAML files used in this tutorial are stored [here](https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/percona-xtradb/standalone/examples). + +## Backup Percona XtraDB + +This section will demonstrate how to backup a Percona XtraDB database. Here, we are going to deploy a Percona XtraDB database using KubeDB. Then, we are going to back up this database into a GCS bucket. Finally, we are going to restore the backed up data into another Percona XtraDB database. + +### Deploy Sample Percona XtraDB Database + +Let's deploy a sample Percona XtraDB database and insert some data into it. + +#### Create Percona XtraDB CRD + +Below is the YAML of a sample `PerconaXtraDB` CRD that we are going to create for this tutorial: + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: PerconaXtraDB +metadata: + name: sample-xtradb + namespace: demo +spec: + version: "5.7" + replicas: 1 + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: WipeOut +``` + +Create the above `PerconaXtraDB` CRD, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/percona-xtradb/standalone/examples/sample-xtradb.yaml +perconaxtradb.kubedb.com/sample-xtradb created +``` + +KubeDB will deploy a Percona XtraDB database according to the above specification. It will also create the necessary Secrets and Services to access the database. + +Let's check if the database is ready to use, + +```bash +$ kubectl get px -n demo sample-xtradb +NAME VERSION STATUS AGE +sample-xtradb 5.7 Provisioning 54s +``` + +The database is `Running`. Verify that KubeDB has created a Secret and a Service for this database using the following commands, + +```bash +$ kubectl get secret -n demo -l=app.kubernetes.io/instance=sample-xtradb +NAME TYPE DATA AGE +sample-xtradb-auth Opaque 2 85s + +$ kubectl get service -n demo -l=app.kubernetes.io/instance=sample-xtradb +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +sample-xtradb ClusterIP 10.108.43.167 3306/TCP 111s +sample-xtradb-gvr ClusterIP None 3306/TCP 111s +``` + +Here, we have to use service `sample-xtradb` and secret `sample-xtradb-auth` to connect with the database. KubeDB creates an [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) CRD that holds the necessary information to connect with the database. + +#### Verify AppBinding + +Verify that the `AppBinding` has been created successfully using the following command, + +```bash +$ kubectl get appbindings -n demo +NAME TYPE VERSION AGE +sample-xtradb kubedb.com/perconaxtradb 5.7 89s +``` + +Let's check the YAML of the above AppBinding, + +```bash +$ kubectl get appbindings -n demo sample-xtradb -o yaml +``` + +Output is as follows, + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + creationTimestamp: "2020-01-26T06:57:35Z" + generation: 1 + labels: + app.kubernetes.io/component: database + app.kubernetes.io/instance: sample-xtradb + app.kubernetes.io/managed-by: kubedb.com + app.kubernetes.io/name: perconaxtradbs.kubedb.com + name: sample-xtradb + namespace: demo + ownerReferences: + - apiVersion: kubedb.com/v1alpha2 + blockOwnerDeletion: true + controller: true + kind: PerconaXtraDB + name: sample-xtradb + uid: 279e90e5-7596-4cd2-b971-99e9a3dff839 + resourceVersion: "16218" + selfLink: /apis/appcatalog.appscode.com/v1alpha1/namespaces/demo/appbindings/sample-xtradb + uid: 5aff9236-e886-4a0d-b767-85d639cfe7c4 +spec: + clientConfig: + service: + name: sample-xtradb + path: / + port: 3306 + scheme: mysql + url: tcp(sample-xtradb:3306)/ + secret: + name: sample-xtradb-auth + type: kubedb.com/perconaxtradb + version: "5.7" +``` + +Stash uses the AppBinding CRD to connect with the target database. It requires the following two fields to be set in the AppBinding's `.spec` section. + +- `.spec.clientConfig.service.name` specifies the name of the Service that connects to the database. +- `.spec.secret` specifies the name of the Secret that holds the necessary credentials to access the database. +- `.spec.type` specifies the type of the app that this AppBinding is pointing to. The format KubeDB generated AppBinding follows to set the value of `.spec.type` is `/`. + +#### Provisioning AppBinding Manually + +If you deploy the Percona XtraDB database without KubeDB, you have to create the AppBinding CRD manually in the same namespace as the service and secret of the database. + +The following YAML shows a minimal AppBinding specification that you have to create if you deploy the Percona XtraDB database without KubeDB. + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: your-custom-appbinding-name + namespace: your-database-namespace +spec: + clientConfig: + service: + name: your-database-service-name + port: 3306 + scheme: mysql + secret: + name: your-database_credentials_secret_name> + # type field is optional. you can keep it empty. + # if you keep it empty then the value of TARGET_APP_RESOURCE variable + # will be set to "appbinding" during auto-backup. + type: kubedb.com/perconaxtradb +``` + +You have to replace the `<...>` quoted part with proper values in the above YAML. + +#### Insert Sample Data + +Now, we are going to exec into the database pod and create some sample data. At first, find out the database pods using the following command, + +```bash +$ kubectl get pods -n demo --selector="app.kubernetes.io/instance=sample-xtradb" +NAME READY STATUS RESTARTS AGE +sample-xtradb-0 1/1 Running 0 6m56s +``` + +And copy the username and password of the `root` user to access into `mysql` shell. + +```bash +$ kubectl get secret -n demo sample-xtradb-auth -o jsonpath='{.data.username}'| base64 -d +root⏎ + +$ kubectl get secret -n demo sample-xtradb-auth -o jsonpath='{.data.password}'| base64 -d +5qtWP192NLD-nwgd⏎ +``` + +Now, let's exec into the Pod to enter into `mysql` shell and create a database and a table, + +```bash +$ kubectl exec -it -n demo sample-xtradb-0 -- mysql --user=root --password=5qtWP192NLD-nwgd +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 48 +Server version: 5.7.26-29 Percona Server (GPL), Release 29, Revision 11ad961 + +Copyright (c) 2009-2019 Percona LLC and/or its affiliates +Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> CREATE DATABASE playground; +Query OK, 1 row affected (0.00 sec) + +mysql> SHOW DATABASES; ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| mysql | +| performance_schema | +| playground | +| sys | ++--------------------+ +5 rows in set (0.00 sec) + +mysql> CREATE TABLE playground.equipment ( id INT NOT NULL AUTO_INCREMENT, type VARCHAR(50), quant INT, color VARCHAR(25), PRIMARY KEY(id)); +Query OK, 0 rows affected (0.06 sec) + +mysql> INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue"); +Query OK, 1 row affected (0.01 sec) + +mysql> SELECT * FROM playground.equipment; ++----+-------+-------+-------+ +| id | type | quant | color | ++----+-------+-------+-------+ +| 1 | slide | 2 | blue | ++----+-------+-------+-------+ +1 row in set (0.00 sec) + +mysql> exit +Bye +``` + +Now, we are ready to back up the database. + +### Prepare Backend + +We are going to store our backed up data into a GCS bucket. At first, we need to create a secret with GCS credentials then we need to create a `Repository` CRD. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +#### Create Storage Secret + +Let's create a secret called `gcs-secret` with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat downloaded-sa-json.key > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +#### Create Repository + +Now, crete a `Repository` using this secret. Below is the YAML of Repository CRD we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo-sample-xtradb + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: /demo/xtradb/sample-xtradb + storageSecretName: gcs-secret +``` + +Let's create the `Repository` we have shown above, + +```bash +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/percona-xtradb/standalone/examples/repository.yaml +repository.stash.appscode.com/gcs-repo-sample-xtradb created +``` + +Now, we are ready to back up our database to our desired backend. + +### Backup + +We have to create a `BackupConfiguration` targeting respective AppBinding CRD of our desired database. Then Stash will create a CronJob to periodically backup the database. + +#### Create BackupConfiguration + +Below is the YAML for `BackupConfiguration` CRD to backup the `sample-xtradb` database we have deployed earlier, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-xtradb-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: perconaxtradb-backup-5.7 + repository: + name: gcs-repo-sample-xtradb + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-xtradb + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +Here, + +- `.spec.schedule` specifies that we want to back up the database at 5 minutes interval. +- `.spec.task.name` specifies the name of the Task CRD that specifies the necessary Functions and their execution order to backup a Percona XtraDB database. +- `.spec.target.ref` refers to the AppBinding CRD that was created for the `sample-xtradb` database. + +Let's create the `BackupConfiguration` CRD we have shown above, + +```bash +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/percona-xtradb/standalone/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/sample-xtradb-backup created +``` + +#### Verify Backup Setup Successful + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. Let's verify the `Phase` of the BackupConfiguration, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-xtradb-backup perconaxtradb-backup-5.7 */5 * * * * Ready 11s +``` + +```bash +$ kubectl describe backupconfiguration -n demo sample-xtradb-backup +``` + +#### Verify CronJob + +Stash will create a CronJob with the schedule specified in `.spec.schedule` field of `BackupConfiguration` CRD. + +Verify that the CronJob has been created using the following command, + +```bash +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-xtradb-backup */5 * * * * False 0 38s +``` + +#### Wait for BackupSession + +The `sample-xtradb-backup` CronJob will trigger a backup on each scheduled slot by Provisioning a `BackupSession` CRD. + +Wait for a schedule to appear. Run the following command to watch `BackupSession` CRD, + +```bash +$ kubectl get backupsession -n demo -l=stash.appscode.com/invoker-name=sample-xtradb-backup --watch +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +sample-xtradb-backup-1580023322 BackupConfiguration sample-xtradb-backup 0s +sample-xtradb-backup-1580023322 BackupConfiguration sample-xtradb-backup 0s +sample-xtradb-backup-1580023322 BackupConfiguration sample-xtradb-backup Running 0s +sample-xtradb-backup-1580023322 BackupConfiguration sample-xtradb-backup Running 36s +sample-xtradb-backup-1580023322 BackupConfiguration sample-xtradb-backup Succeeded 36s +``` + +Here, the phase **`Succeeded`** means that the backupsession has been succeeded. + +>Note: Backup CronJob creates `BackupSession` CRD the label `stash.appscode.com/invoker-name=`. We can use this label to watch only the `BackupSession` of our desired `BackupConfiguration`. + +#### Verify Backup + +Now, we are going to verify whether the backed up data is in the backend. Once a backup is completed, Stash will update the respective `Repository` CRD to reflect the backup completion. Check that the repository `gcs-repo-sample-xtradb` has been updated by the following command, + +```bash +$ kubectl get repository -n demo gcs-repo-sample-xtradb +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo-sample-xtradb true 3 82s 17m +``` + +Now, if we navigate to the GCS bucket, we will see the backed up data has been stored in `demo/xtradb/sample-xtradb` directory as specified by `.spec.backend.gcs.prefix` field of Repository CRD. + +
+  Backed up data in GCS Bucket +
Fig: Backed up data in GCS Bucket
+
+ +> Note: Stash keeps all the backed up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +### Restore Percona XtraDB + +In this section, we are going to restore the database from the backup we have taken in the previous section. We are going to deploy a new database and initialize it from the backup. + +#### Stop Taking Backup of the Old Database + +At first, let's stop taking any further backup of the old database so that no backup is taken during the restore process. We are going to pause the `BackupConfiguration` CRD that we had created to backup the `sample-xtradb` database. Then, Stash will stop taking any further backup for this database. + +Let's pause the `sample-xtradb-backup` BackupConfiguration, + +```console +$ kubectl patch backupconfiguration -n demo sample-xtradb-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/sample-xtradb-backup patched +``` + +Now, wait for a moment. Stash will pause the BackupConfiguration. Verify that the operator has paused the BackupConfiguration object, + +```console +$ kkubectl get backupconfiguration -n demo sample-xtradb-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-xtradb-backup perconaxtradb-backup-5.7 */5 * * * * true Ready 13m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the BackupConfiguration has been paused. + +#### Deploy Restored Database + +Now, we have to deploy the restored database similarly as we have deployed the original `sample-xtradb` database. However, this time there will be the following differences: + +- We have to use the same secret that was used in the original database. We are going to specify it using `.spec.databaseSecret` field. +- We are going to specify `.spec.init.waitForInitialRestore: true` which tells KubeDB to wait for the initial restore to complete before marking this database as ready to use. + +Below is the YAML for `PerconaXtraDB` CRD we are going deploy to initialize from backup, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: PerconaXtraDB +metadata: + name: restored-xtradb + namespace: demo +spec: + version: "5.7" + replicas: 1 + authSecret: + name: sample-xtradb-auth + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + init: + waitForInitialRestore: true + terminationPolicy: WipeOut +``` + +Let's create the above database, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/percona-xtradb/standalone/restored-xtradb.yaml +perconaxtradb.kubedb.com/restored-xtradb created +``` + +If you check the database status, you will see it is stuck in **`Provisioning`** state. + +```bash +$ kubectl get px -n demo restored-xtradb --watch +NAME VERSION STATUS AGE +restored-xtradb 5.7 Provisioning 42s +restored-xtradb 5.7 Provisioning 74s +``` + +#### Create RestoreSession + +Now, we need to create a `RestoreSession` CRD pointing to the newly created restored database. + +Using the following command, check that another AppBinding object has been created for the `restored-xtradb` object, + +```bash +$ kubectl get appbindings -n demo restored-xtradb +NAME TYPE VERSION AGE +restored-xtradb kubedb.com/perconaxtradb 5.7 4m6s +``` + +> If you are not using KubeDB to deploy database, create the AppBinding manually. + +Below is the contents of YAML file of the RestoreSession CRD that we are going to create to restore the backed up data into the newly created database provisioned by PerconaXtrDB CRD named `restored-xtradb`. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: restored-xtradb-restore + namespace: demo +spec: + task: + name: perconaxtradb-restore-5.7 + repository: + name: gcs-repo-sample-xtradb + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: restored-xtradb + rules: + - snapshots: ["latest"] +``` + +Here, + +- `.spec.task.name` specifies the name of the Task CRD that specifies the necessary Functions and their execution order to restore a Percona XtraDB database. +- `.spec.repository.name` specifies the Repository CRD that holds the backend information where our backed up data has been stored. +- `.spec.target.ref` refers to the AppBinding object for the `restored-xtradb` PerconaXtraDB object. +- `.spec.rules` specifies that we are restoring data from the `latest` backup snapshot of the database. + +Let's create the RestoreSession CRD object we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/percona-xtradb/standalone/restoresession.yaml +restoresession.stash.appscode.com/restored-xtradb-restore created +``` + +Once you have created the RestoreSession object, Stash will create a restore Job. We can watch the phase of the RestoreSession object to check whether the restore process has succeeded or not. + +Run the following command to watch the phase of the RestoreSession object, + +```bash +$ kubectl get restoresession -n demo restored-xtradb-restore --watch +NAME REPOSITORY PHASE AGE +restored-xtradb-restore gcs-repo-sample-xtradb Running 35s +restored-xtradb-restore gcs-repo-sample-xtradb Succeeded 44s +``` + +Here, we can see from the output of the above command that the restore process succeeded. + +#### Verify Restored Data + +In this section, we are going to verify whether the desired data has restored successfully. We are going to connect to the database server and check whether the database and the table we created earlier in the original database have restored. + +At first, check if the database has gone into **`Ready`** state, + +```bash +$ kubectl get px -n demo restored-xtradb --watch +NAME VERSION STATUS AGE +restored-xtradb 5.7 Provisioning 10m +restored-xtradb 5.7 Ready 13m +``` + +Now, find out the database Pod, + +```bash +$ kubectl get pods -n demo --selector="app.kubernetes.io/instance=restored-xtradb" --watch +NAME READY STATUS RESTARTS AGE +restored-xtradb-0 1/1 Running 0 15m +``` + +And then copy the user name and password of the `root` user to access into `mysql` shell. + +> Notice: We used the same Secret for the `restored-xtradb` object. So, we will use the same commands as before. + +```bash +$ kubectl get secret -n demo sample-xtradb-auth -o jsonpath='{.data.username}'| base64 -d +root⏎ + +$ kubectl get secret -n demo sample-xtradb-auth -o jsonpath='{.data.password}'| base64 -d +5qtWP192NLD-nwgd⏎ +``` + +Now, let's exec into the Pod to enter into `mysql` shell and check the database and the table we created before, + +```bash +$ kubectl exec -it -n demo restored-xtradb-0 -- mysql --user=root --password=5qtWP192NLD-nwgd +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 103 +Server version: 5.7.26-29 Percona Server (GPL), Release 29, Revision 11ad961 + +Copyright (c) 2009-2019 Percona LLC and/or its affiliates +Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> SHOW DATABASES; ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| mysql | +| performance_schema | +| playground | +| sys | ++--------------------+ +5 rows in set (0.00 sec) + +mysql> SHOW TABLES IN playground; ++----------------------+ +| Tables_in_playground | ++----------------------+ +| equipment | ++----------------------+ +1 row in set (0.00 sec) + +mysql> SELECT * FROM playground.equipment; ++----+-------+-------+-------+ +| id | type | quant | color | ++----+-------+-------+-------+ +| 1 | slide | 2 | blue | ++----+-------+-------+-------+ +1 row in set (0.00 sec) + +mysql> exit +Bye +``` + +So, from the above output, we can see that the `playground` database and the `equipment` table we created before in the original database are restored successfully. + +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete restoresession -n demo restored-xtradb-restore +kubectl delete px -n demo restored-xtradb +kubectl delete repository -n demo gcs-repo-sample-xtradb +kubectl delete backupconfiguration -n demo sample-xtradb-backup +kubectl delete px -n demo sample-xtradb +``` diff --git a/content/docs/v2024.12.18/addons/postgres/README.md b/content/docs/v2024.12.18/addons/postgres/README.md new file mode 100644 index 0000000000..a69ae20faa --- /dev/null +++ b/content/docs/v2024.12.18/addons/postgres/README.md @@ -0,0 +1,108 @@ +--- +title: PostgreSQL Addon Overview | Stash +description: PostgreSQL Addon Overview | Stash +menu: + docs_v2024.12.18: + identifier: stash-postgres-readme + name: Readme + parent: stash-postgres + weight: -1 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +url: /docs/v2024.12.18/addons/postgres/ +aliases: +- /docs/v2024.12.18/addons/postgres/README/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash PostgreSQL Addon + +Stash 0.9.0+ supports extending its functionality through addons. Stash PostgreSQL addon enables Stash to backup and restore PostgreSQL databases. + +This guide will give you an overview of which PostgreSQL versions are supported and how the docs are organized. + +## Supported PostgreSQL Versions + +Stash has the following addon versions for PostgreSQL: + +{{< versionlist "postgres">}} + +Here, the addon follows `M.M.P` versioning scheme where `M.M.P` (Major.Minor.Patch) represents the respective database version. + +## Addon Version Compatibility + +Any addon with matching major version with the database version should be able to take backup of that database. For example, PostgreSQL addon with version `12.x.x` should be able take backup of any PostgreSQL of `12.x.x` series. However, this might not be true for some versions. In that case, we will have separate addon for that version. + +## Documentation Overview + +Stash PostgreSQL documentations are organized as below: + +- [How does it work?](/docs/v2024.12.18/addons/postgres/overview/) gives an overview of how backup and restore process for PostgreSQL database works in Stash. +- [Standalone PostgreSQL](/docs/v2024.12.18/addons/postgres/standalone/) shows how to backup and restore a standalone PostgreSQL database using Stash. +- [Auto-Backup](/docs/v2024.12.18/addons/postgres/auto-backup/) shows how to configure a generic backup template for all the PostgreSQL databases of a cluster. diff --git a/content/docs/v2024.12.18/addons/postgres/_index.md b/content/docs/v2024.12.18/addons/postgres/_index.md new file mode 100644 index 0000000000..0072bef557 --- /dev/null +++ b/content/docs/v2024.12.18/addons/postgres/_index.md @@ -0,0 +1,77 @@ +--- +title: Stash PostgreSQL Addon +menu: + docs_v2024.12.18: + identifier: stash-postgres + name: Postgres + parent: stash-addons + weight: 70 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/addons/postgres/auto-backup/examples/backupblueprint.yaml b/content/docs/v2024.12.18/addons/postgres/auto-backup/examples/backupblueprint.yaml new file mode 100644 index 0000000000..ade06c2254 --- /dev/null +++ b/content/docs/v2024.12.18/addons/postgres/auto-backup/examples/backupblueprint.yaml @@ -0,0 +1,19 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupBlueprint +metadata: + name: postgres-backup-template +spec: + # ============== Blueprint for Repository ========================== + backend: + gcs: + bucket: stash-testing + prefix: stash-backup/${TARGET_NAMESPACE}/${TARGET_APP_RESOURCE}/${TARGET_NAME} + storageSecretName: gcs-secret + # ============== Blueprint for BackupConfiguration ================= + task: + name: postgres-backup-11.9 + schedule: "*/5 * * * *" + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/postgres/auto-backup/examples/sample-pg-1.yaml b/content/docs/v2024.12.18/addons/postgres/auto-backup/examples/sample-pg-1.yaml new file mode 100644 index 0000000000..aca08d5422 --- /dev/null +++ b/content/docs/v2024.12.18/addons/postgres/auto-backup/examples/sample-pg-1.yaml @@ -0,0 +1,18 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Postgres +metadata: + name: sample-postgres-1 + namespace: demo + annotations: + stash.appscode.com/backup-blueprint: postgres-backup-template +spec: + version: "11.11" + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: Delete diff --git a/content/docs/v2024.12.18/addons/postgres/auto-backup/examples/sample-pg-2.yaml b/content/docs/v2024.12.18/addons/postgres/auto-backup/examples/sample-pg-2.yaml new file mode 100644 index 0000000000..53a4257ec3 --- /dev/null +++ b/content/docs/v2024.12.18/addons/postgres/auto-backup/examples/sample-pg-2.yaml @@ -0,0 +1,19 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Postgres +metadata: + name: sample-postgres-2 + namespace: demo-2 + annotations: + stash.appscode.com/backup-blueprint: postgres-backup-template + stash.appscode.com/schedule: "*/3 * * * *" +spec: + version: "11.11" + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: Delete diff --git a/content/docs/v2024.12.18/addons/postgres/auto-backup/examples/sample-pg-3.yaml b/content/docs/v2024.12.18/addons/postgres/auto-backup/examples/sample-pg-3.yaml new file mode 100644 index 0000000000..98ff388e9e --- /dev/null +++ b/content/docs/v2024.12.18/addons/postgres/auto-backup/examples/sample-pg-3.yaml @@ -0,0 +1,19 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Postgres +metadata: + name: sample-postgres-3 + namespace: demo-3 + annotations: + stash.appscode.com/backup-blueprint: postgres-backup-template + params.stash.appscode.com/args: --no-owner --clean +spec: + version: "11.11" + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: Delete diff --git a/content/docs/v2024.12.18/addons/postgres/auto-backup/images/sample-postgres-1.png b/content/docs/v2024.12.18/addons/postgres/auto-backup/images/sample-postgres-1.png new file mode 100644 index 0000000000..08ac7e0983 Binary files /dev/null and b/content/docs/v2024.12.18/addons/postgres/auto-backup/images/sample-postgres-1.png differ diff --git a/content/docs/v2024.12.18/addons/postgres/auto-backup/images/sample-postgres-2.png b/content/docs/v2024.12.18/addons/postgres/auto-backup/images/sample-postgres-2.png new file mode 100644 index 0000000000..2331644c8b Binary files /dev/null and b/content/docs/v2024.12.18/addons/postgres/auto-backup/images/sample-postgres-2.png differ diff --git a/content/docs/v2024.12.18/addons/postgres/auto-backup/images/sample-postgres-3.png b/content/docs/v2024.12.18/addons/postgres/auto-backup/images/sample-postgres-3.png new file mode 100644 index 0000000000..b27d7581e9 Binary files /dev/null and b/content/docs/v2024.12.18/addons/postgres/auto-backup/images/sample-postgres-3.png differ diff --git a/content/docs/v2024.12.18/addons/postgres/auto-backup/index.md b/content/docs/v2024.12.18/addons/postgres/auto-backup/index.md new file mode 100644 index 0000000000..d62dab6beb --- /dev/null +++ b/content/docs/v2024.12.18/addons/postgres/auto-backup/index.md @@ -0,0 +1,714 @@ +--- +title: PostgreSQL | Stash +description: Stash auto-backup for PostgreSQL database +menu: + docs_v2024.12.18: + identifier: stash-postgres-auto-backup + name: Auto-Backup + parent: stash-postgres + weight: 30 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup PostgreSQL using Stash Auto-Backup + +Stash can be configured to automatically backup any PostgreSQL database in your cluster. Stash enables cluster administrators to deploy backup blueprints ahead of time so that the database owners can easily backup their database with just a few annotations. + +In this tutorial, we are going to show how you can configure a backup blueprint for PostgreSQL databases in your cluster and backup them with few annotations. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. +- Install Stash in your cluster following the steps [here](/docs/v2024.12.18/setup/install/stash/). +- Install [KubeDB](https://kubedb.com) in your cluster following the steps [here](https://kubedb.com/docs/latest/setup/). This step is optional. You can deploy your database using any method you want. +- If you are not familiar with how Stash backup and restore PostgreSQL databases, please check the following guide [here](/docs/v2024.12.18/addons/postgres/overview/). +- If you are not familiar with how auto-backup works in Stash, please check the following guide [here](/docs/v2024.12.18/guides/auto-backup/overview/). +- If you are not familiar with the available auto-backup options for databases in Stash, please check the following guide [here](/docs/v2024.12.18/guides/auto-backup/database/). + +You should be familiar with the following `Stash` concepts: + +- [BackupBlueprint](/docs/v2024.12.18/concepts/crds/backupblueprint/) +- [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) +- [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) +- [Repository](/docs/v2024.12.18/concepts/crds/repository/) +- [Function](/docs/v2024.12.18/concepts/crds/function/) +- [Task](/docs/v2024.12.18/concepts/crds/task/) + +In this tutorial, we are going to show backup of three different PostgreSQL databases on three different namespaces named `demo`, `demo-2`, and `demo-3`. Create the namespaces as below if you haven't done it already. + +```bash +❯ kubectl create ns demo +namespace/demo created + +❯ kubectl create ns demo-2 +namespace/demo-2 created + +❯ kubectl create ns demo-3 +namespace/demo-3 created +``` + +When you install Stash, it will automatically installs the official database addons. Make sure the addons for PostgreSQL was installed properly using the following command. + +```bash +❯ kubectl get tasks.stash.appscode.com | grep postgres +postgres-backup-10.14 8d +postgres-backup-11.9 8d +postgres-backup-12.4 8d +postgres-backup-13.1 8d +postgres-backup-9.6.19 8d +postgres-restore-10.14 8d +postgres-restore-11.9 8d +postgres-restore-12.4 8d +postgres-restore-13.1 8d +postgres-restore-9.6.19 8d +``` + +## Prepare Backup Blueprint + +To backup a PostgreSQL database using Stash, you have to create a `Secret` containing the backend credentials, a `Repository` containing the backend information, and a `BackupConfiguration` containing the schedule and target information. A `BackupBlueprint` allows you to specify a template for the `Repository` and the `BackupConfiguration`. + +The `BackupBlueprint` is a non-namespaced CRD. So, once you have created a `BackupBlueprint`, you can use it to backup any PostgreSQL database of any namespace just by creating the storage `Secret` in that namespace and adding few annotations to your Postgres CRO. Then, Stash will automatically create a `Repository` and a `BackupConfiguration` according to the template to backup the database. + +Below is the `BackupBlueprint` object that we are going to use in this tutorial, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupBlueprint +metadata: + name: postgres-backup-template +spec: + # ============== Blueprint for Repository ========================== + backend: + gcs: + bucket: stash-testing + prefix: stash-backup/${TARGET_NAMESPACE}/${TARGET_APP_RESOURCE}/${TARGET_NAME} + storageSecretName: gcs-secret + # ============== Blueprint for BackupConfiguration ================= + task: + name: postgres-backup-11.9 + schedule: "*/5 * * * *" + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Here, we are using a GCS bucket as our backend. We are providing `gcs-secret` at the `storageSecretName` field. Hence, we have to create a secret named `gcs-secret` with the access credentials of our bucket in every namespace where we want to enable backup through this blueprint. + +Notice the `prefix` field of `backend` section. We have used some variables in form of `${VARIABLE_NAME}`. Stash will automatically resolve those variables from the database information to make the backend prefix unique for each database instance. + +Let's create the `BackupBlueprint` we have shown above, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/postgres/auto-backup/examples/backupblueprint.yaml +backupblueprint.stash.appscode.com/postgres-backup-template created +``` + +Now, we are ready to backup our PostgreSQL databases using few annotations. You can check available auto-backup annotations for a database from [here](/docs/v2024.12.18/guides/auto-backup/database/#available-auto-backup-annotations-for-database). + +## Auto-backup with default configurations + +In this section, we are going to backup a PostgreSQL database of `demo` namespace. We are going to use the default configurations specified in the `BackupBlueprint`. + +### Create Storage Secret + +At first, let's create the `gcs-secret` in `demo` namespace with the access credentials to our GCS bucket. + +```bash +❯ echo -n 'changeit' > RESTIC_PASSWORD +❯ echo -n '' > GOOGLE_PROJECT_ID +❯ cat downloaded-sa-json.key > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +❯ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +### Create Database + +Now, we are going to create a Postgres CRO in `demo` namespace. Below is the YAML of the PostgreSQL object that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Postgres +metadata: + name: sample-postgres-1 + namespace: demo + annotations: + stash.appscode.com/backup-blueprint: postgres-backup-template +spec: + version: "11.11" + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: Delete +``` + +Notice the `annotations` section. We are pointing to the `BackupBlueprint` that we have created earlier though `stash.appscode.com/backup-blueprint` annotation. Stash will watch this annotation and create a `Repository` and a `BackupConfiguration` according to the `BackupBlueprint`. + +Let's create the above Postgres CRO, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/postgres/auto-backup/examples/sample-pg-1.yaml +postgres.kubedb.com/sample-postgres-1 created +``` + +### Verify Auto-backup configured + +In this section, we are going to verify whether Stash has created the respective `Repository` and `BackupConfiguration` for our PostgreSQL database we have just deployed. + +#### Verify Repository + +At first, let's verify whether Stash has created a `Repository` for our PostgreSQL or not. + +```bash +❯ kubectl get repository -n demo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +app-sample-postgres-1 25s +``` + +Now, let's check the YAML of the `Repository`. + +```yaml +❯ kubectl get repository -n demo app-sample-postgres-1 -o yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: app-sample-postgres-1 + namespace: demo + ... +spec: + backend: + gcs: + bucket: stash-testing + prefix: stash-backup/demo/postgres/sample-postgres-1 + storageSecretName: gcs-secret +``` + +Here, you can see that Stash has resolved the variables in `prefix` field and substituted them with the equivalent information from this database. + +#### Verify BackupConfiguration + +If everything goes well, Stash should create a `BackupConfiguration` for our Postgres in `demo` namespace and the phase of that `BackupConfiguration` should be `Ready`. Verify the `BackupConfiguration` crd by the following command, + +```bash +❯ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +app-sample-postgres-1 postgres-backup-11.9 */5 * * * * Ready 97s +``` + +Now, let's check the YAML of the `BackupConfiguration`. + +```yaml +❯ kubectl get backupconfiguration -n demo app-sample-postgres-1 -o yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: app-sample-postgres-1 + namespace: demo + ... +spec: + driver: Restic + repository: + name: app-sample-postgres-1 + retentionPolicy: + keepLast: 5 + name: keep-last-5 + prune: true + runtimeSettings: {} + schedule: '*/5 * * * *' + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-postgres-1 + task: + name: postgres-backup-11.9 + tempDir: {} +status: + conditions: + - lastTransitionTime: "2021-02-23T09:38:19Z" + message: Repository demo/app-sample-postgres-1 exist. + reason: RepositoryAvailable + status: "True" + type: RepositoryFound + - lastTransitionTime: "2021-02-23T09:38:19Z" + message: Backend Secret demo/gcs-secret exist. + reason: BackendSecretAvailable + status: "True" + type: BackendSecretFound + - lastTransitionTime: "2021-02-23T09:38:19Z" + message: Backup target appcatalog.appscode.com/v1alpha1 appbinding/sample-postgres-1 + found. + reason: TargetAvailable + status: "True" + type: BackupTargetFound + - lastTransitionTime: "2021-02-23T09:38:19Z" + message: Successfully created backup triggering CronJob. + reason: CronJobCreationSucceeded + status: "True" + type: CronJobCreated + observedGeneration: 1 + +``` + +Notice the `target` section. Stash has automatically added the respective AppBinding of our PostgreSQL database as the target of this `BackupConfiguration`. + +#### Verify Backup + +Now, let's wait for a backup run to complete. You can watch for `BackupSession` as below, + +```bash +❯ kubectl get backupsession -n demo -w +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +app-sample-postgres-1-1614073215 BackupConfiguration app-sample-postgres-1 0s +app-sample-postgres-1-1614073215 BackupConfiguration app-sample-postgres-1 Running 3s +app-sample-postgres-1-1614073215 BackupConfiguration app-sample-postgres-1 Succeeded 47s +``` + +Once the backup has been completed successfully, you should see the backed-up data has been stored in the bucket at the directory pointed by the `prefix` field of the `Repository`. + +
+ Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +## Auto-backup with a custom schedule + +In this section, we are going to backup a PostgreSQL database of `demo-2` namespace. This time, we are going to overwrite the default schedule used in the `BackupBlueprint`. + +### Create Storage Secret + +At first, let's create the backend Secret `gcs-secret` in `demo-2` namespace with the access credentials to our GCS bucket. + +```bash +❯ kubectl create secret generic -n demo-2 gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +### Create Database + +Now, we are going to create a Postgres CRO in `demo-2` namespace. Below is the YAML of the PostgreSQL object that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Postgres +metadata: + name: sample-postgres-2 + namespace: demo-2 + annotations: + stash.appscode.com/backup-blueprint: postgres-backup-template + stash.appscode.com/schedule: "*/3 * * * *" +spec: + version: "11.11" + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: Delete +``` + +Notice the `annotations` section. This time, we have passed a schedule via `stash.appscode.com/schedule` annotation along with the `stash.appscode.com/backup-blueprint` annotation. + +Let's create the above Postgres CRO, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/postgres/auto-backup/examples/sample-pg-2.yaml +postgres.kubedb.com/sample-postgres-2 created +``` + +### Verify Auto-backup configured + +Now, let's verify whether the auto-backup has been configured properly or not. + +#### Verify Repository + +At first, let's verify whether Stash has created a `Repository` for our PostgreSQL or not. + +```bash +❯ kubectl get repository -n demo-2 +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +app-sample-postgres-2 13s +``` + +Now, let's check the YAML of the `Repository`. + +```yaml +❯ kubectl get repository -n demo-2 app-sample-postgres-2 -o yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: app-sample-postgres-2 + namespace: demo-2 + ... +spec: + backend: + gcs: + bucket: stash-testing + prefix: stash-backup/demo-2/postgres/sample-postgres-2 + storageSecretName: gcs-secret +``` + +Here, you can see that Stash has resolved the variables in `prefix` field and substituted them with the equivalent information from this new database. + +#### Verify BackupConfiguration + +If everything goes well, Stash should create a `BackupConfiguration` for our Postgres in `demo-2` namespace and the phase of that `BackupConfiguration` should be `Ready`. Verify the `BackupConfiguration` crd by the following command, + +```bash +❯ kubectl get backupconfiguration -n demo-2 +NAME TASK SCHEDULE PAUSED PHASE AGE +app-sample-postgres-2 postgres-backup-11.9 */3 * * * * Ready 61s +``` + +Now, let's check the YAML of the `BackupConfiguration`. + +```yaml +❯ kubectl get backupconfiguration -n demo-2 app-sample-postgres-2 -o yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: app-sample-postgres-2 + namespace: demo-2 + ... +spec: + driver: Restic + repository: + name: app-sample-postgres-2 + retentionPolicy: + keepLast: 5 + name: keep-last-5 + prune: true + runtimeSettings: {} + schedule: '*/3 * * * *' + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-postgres-2 + task: + name: postgres-backup-11.9 + tempDir: {} +status: + conditions: + - lastTransitionTime: "2021-02-23T09:44:33Z" + message: Repository demo-2/app-sample-postgres-2 exist. + reason: RepositoryAvailable + status: "True" + type: RepositoryFound + - lastTransitionTime: "2021-02-23T09:44:33Z" + message: Backend Secret demo-2/gcs-secret exist. + reason: BackendSecretAvailable + status: "True" + type: BackendSecretFound + - lastTransitionTime: "2021-02-23T09:44:33Z" + message: Backup target appcatalog.appscode.com/v1alpha1 appbinding/sample-postgres-2 + found. + reason: TargetAvailable + status: "True" + type: BackupTargetFound + - lastTransitionTime: "2021-02-23T09:44:33Z" + message: Successfully created backup triggering CronJob. + reason: CronJobCreationSucceeded + status: "True" + type: CronJobCreated + observedGeneration: 1 +``` + +Notice the `schedule` section. This time the `BackupConfiguration` has been created with the schedule we have provided via annotation. + +Also, notice the `target` section. Stash has automatically added the new PostgreSQL as the target of this `BackupConfiguration`. + +#### Verify Backup + +Now, let's wait for a backup run to complete. You can watch for `BackupSession` as below, + +```bash +❯ kubectl get backupsession -n demo-2 -w +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +app-sample-postgres-2-1614073502 BackupConfiguration app-sample-postgres-2 0s +app-sample-postgres-2-1614073502 BackupConfiguration app-sample-postgres-2 Running 2s +app-sample-postgres-2-1614073502 BackupConfiguration app-sample-postgres-2 Succeeded 48s +``` + +Once the backup has been completed successfully, you should see that Stash has created a new directory as pointed by the `prefix` field of the new `Repository` and stored the backed-up data there. + +
+ Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +## Auto-backup with custom parameters + +In this section, we are going to backup a PostgreSQL database of `demo-3` namespace. This time, we are going to pass some parameters for the Task through the annotations. + +### Create Storage Secret + +At first, let's create the `gcs-secret` in `demo-3` namespace with the access credentials to our GCS bucket. + +```bash +❯ kubectl create secret generic -n demo-3 gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +### Create Database + +Now, we are going to create a Postgres CRO in `demo-3` namespace. Below is the YAML of the PostgreSQL object that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Postgres +metadata: + name: sample-postgres-3 + namespace: demo-3 + annotations: + stash.appscode.com/backup-blueprint: postgres-backup-template + params.stash.appscode.com/args: --no-owner --clean +spec: + version: "11.11" + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: Delete +``` + +Notice the `annotations` section. This time, we have passed an argument via `params.stash.appscode.com/args` annotation along with the `stash.appscode.com/backup-blueprint` annotation. + +Let's create the above Postgres CRO, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/postgres/auto-backup/examples/sample-pg-3.yaml +postgres.kubedb.com/sample-postgres-3 created +``` + +### Verify Auto-backup configured + +Now, let's verify whether the auto-backup resources has been created or not. + +#### Verify Repository + +At first, let's verify whether Stash has created a `Repository` for our PostgreSQL or not. + +```bash +❯ kubectl get repository -n demo-3 +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +app-sample-postgres-3 17s +``` + +Now, let's check the YAML of the `Repository`. + +```yaml +❯ kubectl get repository -n demo-3 app-sample-postgres-3 -o yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: app-sample-postgres-3 + namespace: demo-3 + ... +spec: + backend: + gcs: + bucket: stash-testing + prefix: stash-backup/demo-3/postgres/sample-postgres-3 + storageSecretName: gcs-secret +``` + +Here, you can see that Stash has resolved the variables in `prefix` field and substituted them with the equivalent information from this new database. + +#### Verify BackupConfiguration + +If everything goes well, Stash should create a `BackupConfiguration` for our Postgres in `demo-3` namespace and the phase of that `BackupConfiguration` should be `Ready`. Verify the `BackupConfiguration` crd by the following command, + +```bash +❯ kubectl get backupconfiguration -n demo-3 +NAME TASK SCHEDULE PAUSED PHASE AGE +app-sample-postgres-3 postgres-backup-11.9 */5 * * * * Ready 51s +``` + +Now, let's check the YAML of the `BackupConfiguration`. + +```yaml +❯ kubectl get backupconfiguration -n demo-3 app-sample-postgres-3 -o yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: app-sample-postgres-3 + namespace: demo-3 + ... +spec: + driver: Restic + repository: + name: app-sample-postgres-3 + retentionPolicy: + keepLast: 5 + name: keep-last-5 + prune: true + runtimeSettings: {} + schedule: '*/5 * * * *' + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-postgres-3 + task: + name: postgres-backup-11.9 + params: + - name: args + value: --no-owner --clean + tempDir: {} +status: + conditions: + - lastTransitionTime: "2021-02-23T09:48:15Z" + message: Repository demo-3/app-sample-postgres-3 exist. + reason: RepositoryAvailable + status: "True" + type: RepositoryFound + - lastTransitionTime: "2021-02-23T09:48:15Z" + message: Backend Secret demo-3/gcs-secret exist. + reason: BackendSecretAvailable + status: "True" + type: BackendSecretFound + - lastTransitionTime: "2021-02-23T09:48:15Z" + message: Backup target appcatalog.appscode.com/v1alpha1 appbinding/sample-postgres-3 + found. + reason: TargetAvailable + status: "True" + type: BackupTargetFound + - lastTransitionTime: "2021-02-23T09:48:15Z" + message: Successfully created backup triggering CronJob. + reason: CronJobCreationSucceeded + status: "True" + type: CronJobCreated + observedGeneration: 1 +``` + +Notice the `task` section. The `args` parameter that we had passed via annotations has been added to the `params` section. + +Also, notice the `target` section. Stash has automatically added the new PostgreSQL as the target of this `BackupConfiguration`. + +#### Verify Backup + +Now, let's wait for a backup run to complete. You can watch for `BackupSession` as below, + +```bash +❯ kubectl get backupsession -n demo-3 -w +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +app-sample-postgres-3-1614073808 BackupConfiguration app-sample-postgres-3 0s +app-sample-postgres-3-1614073808 BackupConfiguration app-sample-postgres-3 Running 3s +app-sample-postgres-3-1614073808 BackupConfiguration app-sample-postgres-3 Succeeded 47s +``` + +Once the backup has been completed successfully, you should see that Stash has created a new directory as pointed by the `prefix` field of the new `Repository` and stored the backed-up data there. + +
+ Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +## Cleanup + +To cleanup the resources crated by this tutorial, run the following commands, + +```bash +❯ kubectl delete -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/postgres/auto-backup/examples/ +backupblueprint.stash.appscode.com "postgres-backup-template" deleted +postgres.kubedb.com "sample-postgres-1" deleted +postgres.kubedb.com "sample-postgres-2" deleted +postgres.kubedb.com "sample-postgres-3" deleted + +❯ kubectl delete repository -n demo --all +repository.stash.appscode.com "app-sample-postgres-1" deleted +❯ kubectl delete repository -n demo-2 --all +repository.stash.appscode.com "app-sample-postgres-2" deleted +❯ kubectl delete repository -n demo-3 --all +repository.stash.appscode.com "app-sample-postgres-3" deleted +``` diff --git a/content/docs/v2024.12.18/addons/postgres/overview/images/backup_overview.svg b/content/docs/v2024.12.18/addons/postgres/overview/images/backup_overview.svg new file mode 100644 index 0000000000..68437a3669 --- /dev/null +++ b/content/docs/v2024.12.18/addons/postgres/overview/images/backup_overview.svg @@ -0,0 +1,997 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/addons/postgres/overview/images/restore_overview.svg b/content/docs/v2024.12.18/addons/postgres/overview/images/restore_overview.svg new file mode 100644 index 0000000000..b9adb0bba0 --- /dev/null +++ b/content/docs/v2024.12.18/addons/postgres/overview/images/restore_overview.svg @@ -0,0 +1,857 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/addons/postgres/overview/index.md b/content/docs/v2024.12.18/addons/postgres/overview/index.md new file mode 100644 index 0000000000..863999c3bf --- /dev/null +++ b/content/docs/v2024.12.18/addons/postgres/overview/index.md @@ -0,0 +1,147 @@ +--- +title: PostgreSQL Backup & Restore Overview | Stash +description: How PostgreSQL Backup & Restore Works in Stash +menu: + docs_v2024.12.18: + identifier: stash-postgres-overview + name: How does it work? + parent: stash-postgres + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# How Stash Backup & Restore PostgreSQL Database + +Stash 0.9.0+ supports backup and restore operation of many databases. This guide will give you an overview of how PostgreSQL database backup and restore process works in Stash. + +## How Backup Works + +The following diagram shows how Stash takes backup of a PostgreSQL database. Open the image in a new tab to see the enlarged version. + +
+  PostgreSQL Backup Overview +
Fig: PostgreSQL Backup Overview
+
+ +The backup process consists of the following steps: + +1. At first, a user creates a secret with access credentials of the backend where the backed up data will be stored. + +2. Then, she creates a `Repository` crd that specifies the backend information along with the secret that holds the credentials to access the backend. + +3. Then, she creates a `BackupConfiguration` crd targeting the [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) crd of the desired database. The `BackupConfiguration` object also specifies the `Task` to use to backup the database. + +4. Stash operator watches for `BackupConfiguration` crd. + +5. Once Stash operator finds a `BackupConfiguration` crd, it creates a CronJob with the schedule specified in `BackupConfiguration` object to trigger backup periodically. + +6. On the next scheduled slot, the CronJob triggers a backup by creating a `BackupSession` crd. + +7. Stash operator also watches for `BackupSession` crd. + +8. When it finds a `BackupSession` object, it resolves the respective `Task` and `Function` and prepares a Job definition to backup. + +9. Then, it creates the Job to backup the targeted database. + +10. The backup Job reads necessary information to connect with the database from the `AppBinding` crd. It also reads backend information and access credentials from `Repository` crd and Storage Secret respectively. + +11. Then, the Job dumps the targeted database and uploads the output to the backend. Stash pipes the output of dump command to uploading process. Hence, backup Job does not require a large volume to hold the entire dump output. + +12. Finally, when the backup is complete, the Job sends Prometheus metrics to the Pushgateway running inside Stash operator pod. It also updates the `BackupSession` and `Repository` status to reflect the backup procedure. + +## How Restore Process Works + +The following diagram shows how Stash restores backed up data into a PostgreSQL database. Open the image in a new tab to see the enlarged version. + +
+  Database Restore Overview +
Fig: PostgreSQL Restore Process Overview
+
+ +The restore process consists of the following steps: + +1. At first, a user creates a `RestoreSession` crd targeting the `AppBinding` of the desired database where the backed up data will be restored. It also specifies the `Repository` crd which holds the backend information and the `Task` to use to restore the target. + +2. Stash operator watches for `RestoreSession` object. + +3. Once it finds a `RestoreSession` object, it resolves the respective `Task` and `Function` and prepares a Job definition to restore. + +4. Then, it creates the Job to restore the target. + +5. The Job reads necessary information to connect with the database from respective `AppBinding` crd. It also reads backend information and access credentials from `Repository` crd and Storage Secret respectively. + +6. Then, the job downloads the backed up data from the backend and injects into the desired database. Stash pipes the downloaded data to the respective database tool to inject into the database. Hence, restore job does not require a large volume to download entire backup data inside it. + +7. Finally, when the restore process is complete, the Job sends Prometheus metrics to the Pushgateway and update the `RestoreSession` status to reflect restore completion. + +## Next Steps + +- Backup standalone PostgreSQL database using Stash following the guides from [here](/docs/v2024.12.18/addons/postgres/standalone/). diff --git a/content/docs/v2024.12.18/addons/postgres/standalone/examples/appbinding.yaml b/content/docs/v2024.12.18/addons/postgres/standalone/examples/appbinding.yaml new file mode 100644 index 0000000000..93a5c3bf47 --- /dev/null +++ b/content/docs/v2024.12.18/addons/postgres/standalone/examples/appbinding.yaml @@ -0,0 +1,22 @@ +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + labels: + app.kubernetes.io/component: database + app.kubernetes.io/instance: sample-postgres + app.kubernetes.io/managed-by: kubedb.com + app.kubernetes.io/name: postgreses.kubedb.com + name: sample-postgres + namespace: demo +spec: + clientConfig: + service: + name: sample-postgres + path: / + port: 5432 + query: sslmode=disable + scheme: postgresql + secret: + name: sample-postgres-auth + type: kubedb.com/postgres + version: "11.2" diff --git a/content/docs/v2024.12.18/addons/postgres/standalone/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/addons/postgres/standalone/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..5c4862ea41 --- /dev/null +++ b/content/docs/v2024.12.18/addons/postgres/standalone/examples/backupconfiguration.yaml @@ -0,0 +1,20 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-postgres-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: postgres-backup-11.9 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-postgres + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/postgres/standalone/examples/minimal_appbinding.yaml b/content/docs/v2024.12.18/addons/postgres/standalone/examples/minimal_appbinding.yaml new file mode 100644 index 0000000000..c30d5f4eb2 --- /dev/null +++ b/content/docs/v2024.12.18/addons/postgres/standalone/examples/minimal_appbinding.yaml @@ -0,0 +1,17 @@ +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: my-custom-appbinding + namespace: my-database-namespace +spec: + clientConfig: + service: + name: my-database-service + port: 5432 + scheme: postgresql + secret: + name: my-database-credentials-secret + # type field is optional. you can keep it empty. + # if you keep it empty then the value of TARGET_APP_RESOURCE variable + # will be set to "appbinding" during auto-backup. + type: postgres diff --git a/content/docs/v2024.12.18/addons/postgres/standalone/examples/postgres.yaml b/content/docs/v2024.12.18/addons/postgres/standalone/examples/postgres.yaml new file mode 100644 index 0000000000..674fb778d3 --- /dev/null +++ b/content/docs/v2024.12.18/addons/postgres/standalone/examples/postgres.yaml @@ -0,0 +1,16 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Postgres +metadata: + name: sample-postgres + namespace: demo +spec: + version: "11.11" + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: Delete diff --git a/content/docs/v2024.12.18/addons/postgres/standalone/examples/repository.yaml b/content/docs/v2024.12.18/addons/postgres/standalone/examples/repository.yaml new file mode 100644 index 0000000000..025191f0be --- /dev/null +++ b/content/docs/v2024.12.18/addons/postgres/standalone/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: demo/postgres/sample-postgres + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/addons/postgres/standalone/examples/restored-postgres.yaml b/content/docs/v2024.12.18/addons/postgres/standalone/examples/restored-postgres.yaml new file mode 100644 index 0000000000..d47082f7ff --- /dev/null +++ b/content/docs/v2024.12.18/addons/postgres/standalone/examples/restored-postgres.yaml @@ -0,0 +1,18 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Postgres +metadata: + name: restored-postgres + namespace: demo +spec: + version: "11.11" + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + init: + waitForInitialRestore: true + terminationPolicy: Delete diff --git a/content/docs/v2024.12.18/addons/postgres/standalone/examples/restoresession.yaml b/content/docs/v2024.12.18/addons/postgres/standalone/examples/restoresession.yaml new file mode 100644 index 0000000000..bd6e5d7b70 --- /dev/null +++ b/content/docs/v2024.12.18/addons/postgres/standalone/examples/restoresession.yaml @@ -0,0 +1,17 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-postgres-restore + namespace: demo +spec: + task: + name: postgres-restore-11.9 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: restored-postgres + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/addons/postgres/standalone/examples/secret_transform.yaml b/content/docs/v2024.12.18/addons/postgres/standalone/examples/secret_transform.yaml new file mode 100644 index 0000000000..0e28f36069 --- /dev/null +++ b/content/docs/v2024.12.18/addons/postgres/standalone/examples/secret_transform.yaml @@ -0,0 +1,21 @@ +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: my-custom-appbinding + namespace: my-database-namespace +spec: + clientConfig: + service: + name: my-database-service + port: 5432 + scheme: postgresql + secret: + name: my-database-credentials-secret + secretTransforms: + - renameKey: + from: POSTGRES_USER + to: username + - renameKey: + from: POSTGRES_PASSWORD + to: password + type: postgres diff --git a/content/docs/v2024.12.18/addons/postgres/standalone/images/sample-postgres-backup.png b/content/docs/v2024.12.18/addons/postgres/standalone/images/sample-postgres-backup.png new file mode 100644 index 0000000000..333d669827 Binary files /dev/null and b/content/docs/v2024.12.18/addons/postgres/standalone/images/sample-postgres-backup.png differ diff --git a/content/docs/v2024.12.18/addons/postgres/standalone/index.md b/content/docs/v2024.12.18/addons/postgres/standalone/index.md new file mode 100644 index 0000000000..6d7b2d318a --- /dev/null +++ b/content/docs/v2024.12.18/addons/postgres/standalone/index.md @@ -0,0 +1,710 @@ +--- +title: PostgreSQL | Stash +description: Backup and restore standalone PostgreSQL database using Stash +menu: + docs_v2024.12.18: + identifier: stash-postgres-standalone + name: Standalone PostgreSQL + parent: stash-postgres + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup and Restore PostgreSQL database using Stash + +Stash 0.9.0+ supports backup and restoration of PostgreSQL databases. This guide will show you how you can backup and restore your PostgreSQL database with Stash. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using Minikube. +- Install Stash in your cluster following the steps [here](/docs/v2024.12.18/setup/README). +- Install [KubeDB](https://kubedb.com) in your cluster following the steps [here](https://kubedb.com/docs/latest/setup/). This step is optional. You can deploy your database using any method you want. We are using KubeDB because KubeDB simplifies many of the difficult or tedious management tasks of running production-grade databases on private and public clouds. +- If you are not familiar with how Stash backup and restore PostgreSQL databases, please check the following guide [here](/docs/v2024.12.18/addons/postgres/overview/): + +You have to be familiar with following custom resources: + +- [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) +- [Function](/docs/v2024.12.18/concepts/crds/function/) +- [Task](/docs/v2024.12.18/concepts/crds/task/) +- [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) +- [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + +To keep things isolated, we are going to use a separate namespace called `demo` throughout this tutorial. Create the `demo` namespace if you haven't created it already. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> Note: YAML files used in this tutorial are stored [here](https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/postgres/standalone/examples). + +## Backup PostgreSQL + +This section will demonstrate how to backup a PostgreSQL database. Here, we are going to deploy a PostgreSQL database using KubeDB. Then, we are going to backup this database into a GCS bucket. Finally, we are going to restore the backed-up data into another PostgreSQL database. + +### Deploy Sample PostgreSQL Database + +Let's deploy a sample PostgreSQL database and insert some data into it. + +**Create Postgres CRD:** + +Below is the YAML of a sample Postgres crd that we are going to create for this tutorial: + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Postgres +metadata: + name: sample-postgres + namespace: demo +spec: + version: "11.11" + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: Delete +``` + +Create the above `Postgres` crd, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/postgres/standalone/examples/postgres.yaml +postgres.kubedb.com/sample-postgres created +``` + +KubeDB will deploy a PostgreSQL database according to the above specification. It will also create the necessary secrets and services to access the database. + +Let's check if the database is ready to use, + +```bash +❯ kubectl get pg -n demo sample-postgres +NAME VERSION STATUS AGE +sample-postgres 11.2-v1 Ready 50s +``` + +The database is `Ready`. Verify that KubeDB has created a Secret and a Service for this database using the following commands, + +```bash +❯ kubectl get secret -n demo -l=app.kubernetes.io/instance=sample-postgres +NAME TYPE DATA AGE +sample-postgres-auth kubernetes.io/basic-auth 2 2m42s + + +❯ kubectl get service -n demo -l=app.kubernetes.io/instance=sample-postgres +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +sample-postgres ClusterIP 10.96.242.0 5432/TCP 3m9s +sample-postgres-pods ClusterIP None 5432/TCP 3m9s +``` + +Here, we have to use the service `sample-postgres` and secret `sample-postgres-auth` to connect with the database. KubeDB creates an [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) crd that holds the necessary information to connect with the database. + +**Verify AppBinding:** + +Verify that the `AppBinding` has been created successfully using the following command, + +```bash +❯ kubectl get appbindings -n demo +NAME TYPE VERSION AGE +sample-postgres kubedb.com/postgres 11.2 3m54s +``` + +Let's check the YAML of the above `AppBinding`, + +```bash +❯ kubectl get appbindings -n demo sample-postgres -o yaml +``` + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + labels: + app.kubernetes.io/component: database + app.kubernetes.io/instance: sample-postgres + app.kubernetes.io/managed-by: kubedb.com + app.kubernetes.io/name: postgreses.kubedb.com + name: sample-postgres + namespace: demo + ... +spec: + clientConfig: + service: + name: sample-postgres + path: / + port: 5432 + query: sslmode=disable + scheme: postgresql + secret: + name: sample-postgres-auth + type: kubedb.com/postgres + version: "11.2" +``` + +Stash uses the `AppBinding` crd to connect with the target database. It requires the following two fields to set in AppBinding's `Spec` section. + +- `spec.clientConfig.service.name` specifies the name of the service that connects to the database. +- `spec.secret` specifies the name of the secret that holds necessary credentials to access the database. +- `spec.type` specifies the types of the app that this AppBinding is pointing to. KubeDB generated AppBinding follows the following format: `/`. + +**Creating AppBinding Manually:** + +If you deploy the PostgreSQL database without KubeDB, you have to create the AppBinding crd manually in the same namespace as the service and secret of the database. + +The following YAML shows a minimal AppBinding specification that you have to create if you deploy the PostgreSQL database without KubeDB. + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: my-custom-appbinding + namespace: my-database-namespace +spec: + clientConfig: + service: + name: my-database-service + port: 5432 + scheme: postgresql + secret: + name: my-database-credentials-secret + # type field is optional. you can keep it empty. + # if you keep it empty then the value of TARGET_APP_RESOURCE variable + # will be set to "appbinding" during auto-backup. + type: postgres +``` + +Stash expects your database secret to have `username` and `password` keys. If your database secret has different keys, you can map them to the Stash recommended keys using `secretTransformation` section of the AppBinding. An example of such transformation is shown below, + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: my-custom-appbinding + namespace: my-database-namespace +spec: + clientConfig: + service: + name: my-database-service + port: 5432 + scheme: postgresql + secret: + name: my-database-credentials-secret + secretTransforms: + - renameKey: + from: POSTGRES_USER + to: username + - renameKey: + from: POSTGRES_PASSWORD + to: password + type: postgres +``` + +>The `secretTransforms` does not modify your original database Secret. Stash just uses those transformations to obtain the desired keys from the original Secret. + +**Insert Sample Data:** + +Now, we are going to exec into the database pod and create some sample data. At first, find out the database pod using the following command, + +```bash +❯ kubectl get pods -n demo --selector="app.kubernetes.io/instance=sample-postgres" +NAME READY STATUS RESTARTS AGE +sample-postgres-0 1/1 Running 0 18m +``` + +Now, let's exec into the pod and create a table, + +```bash +❯ kubectl exec -it -n demo sample-postgres-0 -- sh + +# login as "postgres" superuser. +/ # psql -U postgres +psql (11.2) +Type "help" for help. + +# list available databases +postgres=# \l + List of databases + Name | Owner | Encoding | Collate | Ctype | Access privileges +-----------+----------+----------+------------+------------+----------------------- + 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 +(3 rows) + +# create a database named "demo" +postgres=# create database demo; +CREATE DATABASE + +# verify that the "demo" database has been created +postgres=# \l + List of databases + Name | Owner | Encoding | Collate | Ctype | Access privileges +-----------+----------+----------+------------+------------+----------------------- + demo | 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) + +# connect to the "demo" database +postgres=# \c demo +You are now connected to database "demo" as user "postgres". + +# create a sample table +demo=# CREATE TABLE COMPANY( NAME TEXT NOT NULL, EMPLOYEE INT NOT NULL); +CREATE TABLE + +# verify that the table has been created +demo=# \d + List of relations + Schema | Name | Type | Owner +--------+---------+-------+---------- + public | company | table | postgres +(1 row) + +# quit from the database +demo=# \q + +# exit from the pod +/ # exit +``` + +Now, we are ready to backup this sample database. + +### Prepare Backend + +We are going to store our backed-up data into a GCS bucket. At first, we need to create a secret with GCS credentials then we need to create a `Repository` crd. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +**Create Storage Secret:** + +Let's create a secret called `gcs-secret` with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat downloaded-sa-json.key > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create Repository:** + +Now, crete a `Repository` using this secret. Below is the YAML of Repository crd we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: demo/postgres/sample-postgres + storageSecretName: gcs-secret +``` + +Let's create the `Repository` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/postgres/standalone/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our database to our desired backend. + +### Backup + +We have to create a `BackupConfiguration` targeting the respective AppBinding object of our desired database. Stash will create a CronJob to periodically backup the database. + +**Create BackupConfiguration:** + +Below is the YAML for `BackupConfiguration` crd to backup the `sample-postgres` database we have deployed earlier., + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-postgres-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: postgres-backup-11.9 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-postgres + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +Here, + +- `spec.schedule` specifies that we want to backup the database at 5 minutes interval. +- `spec.task.name` specifies the name of the task crd that specifies the necessary Function and their execution order to backup a PostgreSQL database. +- `spec.repository.name` specifies the name of the `Repository` crd the holds the backend information where the backed up data will be stored. +- `spec.target.ref` refers to the `AppBinding` crd that was created for `sample-postgres` database. +- `spec.retentionPolicy` specifies the policy to follow for cleaning old snapshots. + +Let's create the `BackupConfiguration` object we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/postgres/standalone/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/sample-postgres-backup created +``` + +**Verify Backup Setup Successful** + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. Let's verify the `Phase` of the BackupConfiguration, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-postgres-backup postgres-backup-11.9 */5 * * * * Ready 11s +``` + +**Verify CronJob:** + +Stash will create a CronJob with the schedule specified in `spec.schedule` field of `BackupConfiguration` crd. + +Verify that the CronJob has been created using the following command, + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-postgres-backup */5 * * * * False 0 30s +``` + +**Wait for BackupSession:** + +The `sample-postgres-backup` CronJob will trigger a backup on each scheduled slot by creating a `BackupSession` crd. + +Wait for a schedule to appear. Run the following command to watch `BackupSession` crd, + +```bash +❯ kubectl get backupsession -n demo -w +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +sample-postgres-backup-1613390711 BackupConfiguration sample-postgres-backup Running 15s +sample-postgres-backup-1613390711 BackupConfiguration sample-postgres-backup Succeeded 78s +``` + +We can see above that the backup session has succeeded. Now, we are going to verify that the backed up data has been stored in the backend. + +**Verify Backup:** + +Once a backup is complete, Stash will update the respective `Repository` object to reflect the backup completion. Check that the repository `gcs-repo` has been updated by the following command, + +```bash +❯ kubectl get repository -n demo gcs-repo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo true 1.770 KiB 1 2m 4m16s +``` + +Now, if we navigate to the GCS bucket, we are going to see backed up data has been stored in `demo/postgres/sample-postgres` directory as specified by `spec.backend.gcs.prefix` field of Repository crd. + +
+ Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +> Note: Stash keeps all the backed-up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Restore PostgreSQL + +Now, we are going to restore the database from the backup we have taken in the previous section. We are going to deploy a new database and initialize it from the backup. + +**Stop Taking Backup of the Old Database:** + +At first, let's stop taking any further backup of the old database so that no backup is taken during the restore process. We are going to pause the `BackupConfiguration` crd that we had created to backup the `sample-postgres` database. Then, Stash will stop taking any further backup for this database. + +Let's pause the `sample-postgres-backup` BackupConfiguration, + +```bash +❯ kubectl patch backupconfiguration -n demo sample-postgres-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/sample-postgres-backup patched +``` + +Now, wait for a moment. Stash will pause the BackupConfiguration. Verify that the BackupConfiguration has been paused, + +```bash +❯ kubectl get backupconfiguration -n demo sample-postgres-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-postgres-backup postgres-backup-11.9 */5 * * * * true Ready 5m55s +``` + +Notice the `PAUSED` column. Value `true` for this field means that the BackupConfiguration has been paused. + +**Deploy Restored Database:** + +Now, we are going to deploy the restored database similarly as we have deployed the original `sample-psotgres` database. + +Below is the YAML for `Postgres` crd we are going deploy to initialize from backup, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Postgres +metadata: + name: restored-postgres + namespace: demo +spec: + version: "11.11" + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + init: + waitForInitialRestore: true + terminationPolicy: Delete + +``` + +Notice the `init` section. Here, we have specified `waitForInitialRestore: true` which tells KubeDB to wait for the first restore to complete before marking this database as ready to use. + +Let's create the above database, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/postgres/standalone/examples/restored-postgres.yaml +postgres.kubedb.com/restored-postgres created +``` + +This time, the database will get stuck in the `Provisioning` state because we haven't restored the data yet. + +```bash +❯ kubectl get postgres -n demo restored-postgres +NAME VERSION STATUS AGE +restored-postgres 11.2-v1 Provisioning 6m7s +``` + +You can check the log from the database pod to be sure whether the database is ready to accept connections or not. + +```bash +❯ kubectl logs -n demo restored-postgres-0 +.... +2021-02-15 12:36:31.087 UTC [19] LOG: listening on IPv4 address "0.0.0.0", port 5432 +2021-02-15 12:36:31.087 UTC [19] LOG: listening on IPv6 address "::", port 5432 +2021-02-15 12:36:31.094 UTC [19] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" +2021-02-15 12:36:31.121 UTC [50] LOG: database system was shut down at 2021-02-15 12:36:31 UTC +2021-02-15 12:36:31.126 UTC [19] LOG: database system is ready to accept connections +``` + +As you can see from the above log that the database is ready to accept connections. Now, we can start restoring this database. + +**Create RestoreSession:** + +Now, we need to create a `RestoreSession` object pointing to the AppBinding for this restored database. + +Check AppBinding has been created for the `restored-postgres` database using the following command, + +```bash +❯ kubectl get appbindings -n demo restored-postgres +NAME TYPE VERSION AGE +restored-postgres kubedb.com/postgres 11.2-v1 6m45s +``` + +> If you are not using KubeDB to deploy the database, then create the AppBinding manually. + +Below is the YAML for the `RestoreSession` crd that we are going to create to restore backed up data into `restored-postgres` database. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-postgres-restore + namespace: demo +spec: + task: + name: postgres-restore-11.9 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: restored-postgres + rules: + - snapshots: [latest] +``` + +Here, + +- `spec.task.name` specifies the name of the `Task` crd that specifies the Functions and their execution order to restore a PostgreSQL database. +- `spec.repository.name` specifies the `Repository` crd that holds the backend information where our backed up data has been stored. +- `spec.target.ref` refers to the AppBinding crd for the `restored-postgres` database where the backed up data will be restored. +- `spec.rules` specifies that we are restoring from the latest backup snapshot of the original database. + +Let's create the `RestoreSession` crd we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/postgres/standalone/examples/restoresession.yaml +restoresession.stash.appscode.com/sample-postgres-restore created +``` + +Once, you have created the `RestoreSession` object, Stash will create a job to restore the database. We can watch the `RestoreSession` phase to check whether the restore process has succeeded or not. + +Run the following command to watch `RestoreSession` phase, + +```bash +❯ kubectl get restoresession -n demo -w +NAME REPOSITORY PHASE AGE +sample-postgres-restore gcs-repo Running 4s +sample-postgres-restore gcs-repo Running 15s +sample-postgres-restore gcs-repo Succeeded 15s +sample-postgres-restore gcs-repo Succeeded 15s +``` + +So, we can see from the output of the above command that the restore process succeeded. + +**Verify Restored Data:** + +In this section, we are going to verify that the desired data has been restored successfully. We are going to connect to the database and check whether the table we had created in the original database has been restored or not. + +At first, check if the database has gone into `Ready` state using the following command, + +```bash +❯ kubectl get pg -n demo restored-postgres +NAME VERSION STATUS AGE +restored-postgres 11.2-v1 Ready 11m +``` + +Now, exec into the database pod and verify restored data. + +```bash +❯ kubectl exec -it -n demo restored-postgres-0 -- /bin/sh +# login as "postgres" superuser. +/ # psql -U postgres +psql (11.2) +Type "help" for help. + +# verify that the "demo" database has been restored +postgres=# \l + List of databases + Name | Owner | Encoding | Collate | Ctype | Access privileges +-----------+----------+----------+------------+------------+----------------------- + demo | 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) + +# connect to the "demo" database +postgres=# \c demo +You are now connected to database "demo" as user "postgres". + +# verify that the sample table has been restored +demo=# \d + List of relations + Schema | Name | Type | Owner +--------+---------+-------+---------- + public | company | table | postgres +(1 row) + +# disconnect from the database +demo=# \q + +# exit from the pod +/ # exit +``` + +So, from the above output, we can see the `demo` database we had created in the original database `sample-postgres` has been restored in the `restored-postgres` database. + +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo backupconfiguration sample-postgres-backup +kubectl delete -n demo restoresession sample-postgres-restore +kubectl delete -n demo postgres sample-postgres restored-postgres +kubectl delete -n demo repository gcs-repo +``` diff --git a/content/docs/v2024.12.18/addons/redis/README.md b/content/docs/v2024.12.18/addons/redis/README.md new file mode 100644 index 0000000000..5c288753fe --- /dev/null +++ b/content/docs/v2024.12.18/addons/redis/README.md @@ -0,0 +1,109 @@ +--- +title: Redis Addon Overview | Stash +description: Redis Addon Overview | Stash +menu: + docs_v2024.12.18: + identifier: stash-redis-readme + name: Readme + parent: stash-redis + weight: -1 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +url: /docs/v2024.12.18/addons/redis/ +aliases: +- /docs/v2024.12.18/addons/redis/README/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash Redis Addon + +Stash `{{< param "info.version" >}}` supports extending its functionality through addons. Stash Redis addon enables Stash to backup and restore Redis databases. + +This guide will give you an overview of which Redis versions are supported and how the docs are organized. + +## Supported Redis Versions + +Stash has the following addon versions for Redis: + +{{< versionlist "redis">}} + +Here, the addon follows `M.M.P` versioning scheme where `M.M.P` (Major.Minor.Patch) represents the respective database version. + +## Addon Version Compatibility + +Any addon with matching major version with the database version should be able to take backup of that database. For example, Redis addon with version `6.x.x` should be able take backup of any Redis of `6.x.x` series. However, this might not be true for some versions. In that case, we will have separate addon for that version. + +## Documentation Overview + +Stash Redis documentations are organized as below: + +- [How does it work?](/docs/v2024.12.18/addons/redis/overview/) gives an overview of how backup and restore process for Redis database works in Stash. +- [Helm managed Redis](/docs/v2024.12.18/addons/redis/helm/) shows how to backup and restore a Helm managed Redis database. +- [Auto-Backup](/docs/v2024.12.18/addons/redis/auto-backup/) shows how to configure a generic backup template for all the Redis databases of a cluster. +- [Customizing Backup & Restore Process](/docs/v2024.12.18/addons/redis/customization/) shows how to customize the backup & restore process. diff --git a/content/docs/v2024.12.18/addons/redis/_index.md b/content/docs/v2024.12.18/addons/redis/_index.md new file mode 100644 index 0000000000..76e5038603 --- /dev/null +++ b/content/docs/v2024.12.18/addons/redis/_index.md @@ -0,0 +1,77 @@ +--- +title: Stash Redis Addon +menu: + docs_v2024.12.18: + identifier: stash-redis + name: Redis + parent: stash-addons + weight: 30 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/addons/redis/auto-backup/examples/backupblueprint.yaml b/content/docs/v2024.12.18/addons/redis/auto-backup/examples/backupblueprint.yaml new file mode 100644 index 0000000000..de4f5cd4db --- /dev/null +++ b/content/docs/v2024.12.18/addons/redis/auto-backup/examples/backupblueprint.yaml @@ -0,0 +1,19 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupBlueprint +metadata: + name: redis-backup-template +spec: + # ============== Blueprint for Repository ========================== + backend: + gcs: + bucket: stash-testing + prefix: redis-backup/${TARGET_NAMESPACE}/${TARGET_APP_RESOURCE}/${TARGET_NAME} + storageSecretName: gcs-secret + # ============== Blueprint for BackupConfiguration ================= + task: + name: redis-backup-6.2.5 + schedule: "*/5 * * * *" + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/redis/auto-backup/examples/sample-redis-1.yaml b/content/docs/v2024.12.18/addons/redis/auto-backup/examples/sample-redis-1.yaml new file mode 100644 index 0000000000..27d4628da6 --- /dev/null +++ b/content/docs/v2024.12.18/addons/redis/auto-backup/examples/sample-redis-1.yaml @@ -0,0 +1,22 @@ +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: sample-redis-1 + namespace: demo-1 + annotations: + stash.appscode.com/backup-blueprint: redis-backup-template +spec: + clientConfig: + service: + name: sample-redis-1-master + path: / + port: 6379 + scheme: http + secret: + name: sample-redis-1 + secretTransforms: + - renameKey: + from: redis-password + to: password + type: redis + version: 6.2.5 diff --git a/content/docs/v2024.12.18/addons/redis/auto-backup/examples/sample-redis-2.yaml b/content/docs/v2024.12.18/addons/redis/auto-backup/examples/sample-redis-2.yaml new file mode 100644 index 0000000000..ae2240e37c --- /dev/null +++ b/content/docs/v2024.12.18/addons/redis/auto-backup/examples/sample-redis-2.yaml @@ -0,0 +1,23 @@ +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: sample-redis-2 + namespace: demo-2 + annotations: + stash.appscode.com/backup-blueprint: redis-backup-template + stash.appscode.com/schedule: "*/3 * * * *" +spec: + clientConfig: + service: + name: sample-redis-2-master + path: / + port: 6379 + scheme: http + secret: + name: sample-redis-2 + secretTransforms: + - renameKey: + from: redis-password + to: password + type: redis + version: 6.2.5 diff --git a/content/docs/v2024.12.18/addons/redis/auto-backup/examples/sample-redis-3.yaml b/content/docs/v2024.12.18/addons/redis/auto-backup/examples/sample-redis-3.yaml new file mode 100644 index 0000000000..aecb738af8 --- /dev/null +++ b/content/docs/v2024.12.18/addons/redis/auto-backup/examples/sample-redis-3.yaml @@ -0,0 +1,23 @@ +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: sample-redis-3 + namespace: demo-3 + annotations: + stash.appscode.com/backup-blueprint: redis-backup-template + params.stash.appscode.com/args: -db 0 +spec: + clientConfig: + service: + name: sample-redis-3-master + path: / + port: 6379 + scheme: http + secret: + name: sample-redis-3 + secretTransforms: + - renameKey: + from: redis-password + to: password + type: redis + version: 6.2.5 diff --git a/content/docs/v2024.12.18/addons/redis/auto-backup/images/sample-redis-1.png b/content/docs/v2024.12.18/addons/redis/auto-backup/images/sample-redis-1.png new file mode 100644 index 0000000000..fafe699957 Binary files /dev/null and b/content/docs/v2024.12.18/addons/redis/auto-backup/images/sample-redis-1.png differ diff --git a/content/docs/v2024.12.18/addons/redis/auto-backup/images/sample-redis-2.png b/content/docs/v2024.12.18/addons/redis/auto-backup/images/sample-redis-2.png new file mode 100644 index 0000000000..3ca8153635 Binary files /dev/null and b/content/docs/v2024.12.18/addons/redis/auto-backup/images/sample-redis-2.png differ diff --git a/content/docs/v2024.12.18/addons/redis/auto-backup/images/sample-redis-3.png b/content/docs/v2024.12.18/addons/redis/auto-backup/images/sample-redis-3.png new file mode 100644 index 0000000000..6da0f056c5 Binary files /dev/null and b/content/docs/v2024.12.18/addons/redis/auto-backup/images/sample-redis-3.png differ diff --git a/content/docs/v2024.12.18/addons/redis/auto-backup/index.md b/content/docs/v2024.12.18/addons/redis/auto-backup/index.md new file mode 100644 index 0000000000..799bf37aa0 --- /dev/null +++ b/content/docs/v2024.12.18/addons/redis/auto-backup/index.md @@ -0,0 +1,792 @@ +--- +title: Redis Auto-Backup | Stash +description: Backup Redis using Stash Auto-Backup +menu: + docs_v2024.12.18: + identifier: stash-redis-auto-backup + name: Auto-Backup + parent: stash-redis + weight: 30 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup Redis using Stash Auto-Backup + +Stash can be configured to automatically backup any Redis database in your cluster. Stash enables cluster administrators to deploy backup blueprints ahead of time so that the database owners can easily backup their database with just a few annotations. + +In this tutorial, we are going to show how you can configure a backup blueprint for Redis databases in your cluster and backup them with few annotations. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. +- Install Stash in your cluster following the steps [here](/docs/v2024.12.18/setup/install/stash/). +- If you are not familiar with how Stash backup and restore Redis databases, please check the following guide [here](/docs/v2024.12.18/addons/redis/overview/). +- If you are not familiar with how auto-backup works in Stash, please check the following guide [here](/docs/v2024.12.18/guides/auto-backup/overview/). +- If you are not familiar with the available auto-backup options for databases in Stash, please check the following guide [here](/docs/v2024.12.18/guides/auto-backup/database/). + +You should be familiar with the following `Stash` concepts: + +- [BackupBlueprint](/docs/v2024.12.18/concepts/crds/backupblueprint/) +- [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) +- [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) +- [Repository](/docs/v2024.12.18/concepts/crds/repository/) +- [Function](/docs/v2024.12.18/concepts/crds/function/) +- [Task](/docs/v2024.12.18/concepts/crds/task/) + +In this tutorial, we are going to show backup of three different Redis databases on three different namespaces named `demo-1`, `demo-2`, and `demo-3`. Create the namespaces as below if you haven't done it already. + +```bash +❯ kubectl create ns demo-1 +namespace/demo-1 created + +❯ kubectl create ns demo-2 +namespace/demo-2 created + +❯ kubectl create ns demo-3 +namespace/demo-3 created +``` + +When you install Stash, it installs the necessary addons to backup Redis. Verify that the Redis addons were installed properly using the following command. + +```bash +❯ kubectl get tasks.stash.appscode.com | grep redis +redis-backup-6.2.5 62m +redis-backup-6.2.5 62m +``` + +We are going to use [bitnami/redis](https://artifacthub.io/packages/helm/bitnami/redis) chart from [ArtifactHub](https://artifacthub.io/). Let's add the respective chart repository to our helm repo list. + +```bash +# Add bitnami chart registry +$ helm repo add bitnami https://charts.bitnami.com/bitnami +# Update helm registries +$ helm repo update +``` + +## Prepare Backup Blueprint + +To backup a Redis database using Stash, you have to create a `Secret` containing the backend credentials, a `Repository` containing the backend information, and a `BackupConfiguration` containing the schedule and target information. A `BackupBlueprint` allows you to specify a template for the `Repository` and the `BackupConfiguration`. + +The `BackupBlueprint` is a non-namespaced CRD. So, once you have created a `BackupBlueprint`, you can use it to backup any Redis database of any namespace just by creating the storage `Secret` in that namespace and adding few annotations to the AppBinding containing the connection info to your database. Then, Stash will automatically create a `Repository` and a `BackupConfiguration` according to the template to backup the database. + +Below is the `BackupBlueprint` object that we are going to use in this tutorial, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupBlueprint +metadata: + name: redis-backup-template +spec: + # ============== Blueprint for Repository ========================== + backend: + gcs: + bucket: stash-testing + prefix: redis-backup/${TARGET_NAMESPACE}/${TARGET_APP_RESOURCE}/${TARGET_NAME} + storageSecretName: gcs-secret + # ============== Blueprint for BackupConfiguration ================= + task: + name: redis-backup-6.2.5 + schedule: "*/5 * * * *" + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Here, we are using a GCS bucket as our backend. We are providing `gcs-secret` at the `storageSecretName` field. Hence, we have to create a secret named `gcs-secret` with the access credentials of our bucket in every namespace where we want to enable backup through this blueprint. + +Notice the `prefix` field of `backend` section. We have used some variables in form of `${VARIABLE_NAME}`. Stash will automatically resolve those variables from the database information to make the backend prefix unique for each database instance. + +Let's create the `BackupBlueprint` we have shown above, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/redis/auto-backup/examples/backupblueprint.yaml +backupblueprint.stash.appscode.com/redis-backup-template created +``` + +Now, we are ready to backup our Redis databases using few annotations. You can check available auto-backup annotations for a databases from [here](/docs/v2024.12.18/guides/auto-backup/database/#available-auto-backup-annotations-for-database). + +## Auto-backup with default configurations + +In this section, we are going to backup a Redis database of `demo-1` namespace. We are going to use the default configurations specified in the `BackupBlueprint`. + +### Create Storage Secret + +At first, let's create the `gcs-secret` in `demo-1` namespace with the access credentials to our GCS bucket. + +```bash +❯ echo -n 'changeit' > RESTIC_PASSWORD +❯ echo -n '' > GOOGLE_PROJECT_ID +❯ cat downloaded-sa-json.key > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +❯ kubectl create secret generic -n demo-1 gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +### Deploy Database + +Let's deploy a Redis database named `sample-redis-1` in the `demo-1` namespace. + +```bash +❯ helm install sample-redis-1 bitnami/redis -n demo-1 +``` + +Now, let's insert some sample data into it. + +```bash +❯ export PASSWORD=$(kubectl get secrets -n demo-1 sample-redis-1 -o jsonpath='{.data.\redis-password}' | base64 -d) +❯ kubectl exec -it -n demo-1 sample-redis-1-master-0 -- redis-cli -a $PASSWORD +Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. +127.0.0.1:6379> set key1 value1 +OK +127.0.0.1:6379> get key1 +"value1" +127.0.0.1:6379> exit +``` + +### Create AppBinding + +Now, we have to create an AppBinding with the connection information of our database. Below, is the YAML of the AppBinding that we are going to create for our `sample-redis-1` database. + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: sample-redis-1 + namespace: demo-1 + annotations: + stash.appscode.com/backup-blueprint: redis-backup-template +spec: + clientConfig: + service: + name: sample-redis-1-master + path: / + port: 6379 + scheme: http + secret: + name: sample-redis-1 + secretTransforms: + - renameKey: + from: redis-password + to: password + type: redis + version: 6.2.5 +``` + +Notice the `annotations` section. We are pointing to the `BackupBlueprint` that we have created earlier through `stash.appscode.com/backup-blueprint` annotation. Stash will watch this annotation and create a `Repository` and a `BackupConfiguration` according to the `BackupBlueprint`. + +Let's create the above AppBinding, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/redis/auto-backup/examples/sample-redis-1.yaml +appbinding.appcatalog.appscode.com/sample-redis-1 created +``` + +### Verify Auto-backup configured + +In this section, we are going to verify whether Stash has created the respective `Repository` and `BackupConfiguration` for our Redis database or not. + +#### Verify Repository + +At first, let's verify whether Stash has created a `Repository` for our Redis or not. + +```bash +❯ kubectl get repository -n demo-1 +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +app-sample-redis-1 22s +``` + +Now, let's check the YAML of the `Repository`. + +```yaml +❯ kubectl get repository -n demo-1 app-sample-redis-1 -o yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: app-sample-redis-1 + namespace: demo-1 + ... +spec: + backend: + gcs: + bucket: stash-testing + prefix: redis-backup/demo-1/redis/sample-redis-1 + storageSecretName: gcs-secret +``` + +Here, you can see that Stash has resolved the variables in `prefix` field and substituted them with the equivalent information from this database. + +#### Verify BackupConfiguration + +If everything goes well, Stash should create a `BackupConfiguration` for our Redis in `demo-1` namespace and the phase of that `BackupConfiguration` should be `Ready`. Verify the `BackupConfiguration` crd by the following command, + +```bash +❯ kubectl get backupconfiguration -n demo-1 +NAME TASK SCHEDULE PAUSED PHASE AGE +app-sample-redis-1 redis-backup-6.2.5 */5 * * * * Ready 76s +``` + +Now, let's check the YAML of the `BackupConfiguration`. + +```yaml +❯ kubectl get backupconfiguration -n demo-1 app-sample-redis-1 -o yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: app-sample-redis-1 + namespace: demo-1 + ... +spec: + driver: Restic + repository: + name: app-sample-redis-1 + retentionPolicy: + keepLast: 5 + name: keep-last-5 + prune: true + runtimeSettings: {} + schedule: '*/5 * * * *' + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-redis-1 + task: + name: redis-backup-6.2.5 + tempDir: {} +status: + conditions: + - lastTransitionTime: "2021-07-29T13:59:57Z" + message: Repository demo-1/app-sample-redis-1 exist. + reason: RepositoryAvailable + status: "True" + type: RepositoryFound + - lastTransitionTime: "2021-07-29T13:59:57Z" + message: Backend Secret demo-1/gcs-secret exist. + reason: BackendSecretAvailable + status: "True" + type: BackendSecretFound + - lastTransitionTime: "2021-07-29T13:59:57Z" + message: Backup target appcatalog.appscode.com/v1alpha1 appbinding/sample-redis-1 + found. + reason: TargetAvailable + status: "True" + type: BackupTargetFound + - lastTransitionTime: "2021-07-29T13:59:57Z" + message: Successfully created backup triggering CronJob. + reason: CronJobCreationSucceeded + status: "True" + type: CronJobCreated + observedGeneration: 1 + +``` + +Notice the `target` section. Stash has automatically added the Redis as the target of this `BackupConfiguration`. + +#### Verify Backup + +Now, let's wait for a backup run to complete. You can watch for `BackupSession` as below, + +```bash +❯ kubectl get backupsession -n demo-1 -w +NAME INVOKER-TYPE INVOKER-NAME PHASE DURATION AGE +app-sample-redis-1-1627567808 BackupConfiguration app-sample-redis-1 0s +app-sample-redis-1-1627567808 BackupConfiguration app-sample-redis-1 Running 22s +app-sample-redis-1-1627567808 BackupConfiguration app-sample-redis-1 Succeeded 1m28.696008079s 88s +``` + +Once the backup has been completed successfully, you should see the backed up data has been stored in the bucket at the directory pointed by the `prefix` field of the `Repository`. + +
+ Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +## Auto-backup with a custom schedule + +In this section, we are going to backup a Redis database of `demo-2` namespace. This time, we are going to overwrite the default schedule used in the `BackupBlueprint`. + +### Create Storage Secret + +At first, let's create the `gcs-secret` in `demo-2` namespace with the access credentials to our GCS bucket. + +```bash +❯ kubectl create secret generic -n demo-2 gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +### Deploy Database + +Let's deploy a Redis database named `sample-redis-2` in the `demo-2` namespace. + +```bash +❯ helm install sample-redis-2 bitnami/redis -n demo-2 +``` + +Now, let's insert some sample data into it. + +```bash +❯ export PASSWORD=$(kubectl get secrets -n demo-2 sample-redis-2 -o jsonpath='{.data.\redis-password}' | base64 -d) +❯ kubectl exec -it -n demo-2 sample-redis-2-master-0 -- redis-cli -a $PASSWORD +Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. +127.0.0.1:6379> set key1 value1 +OK +127.0.0.1:6379> get key1 +"value1" +127.0.0.1:6379> exit +``` + +### Create AppBinding + +Now, we have to create an AppBinding with the connection information of our database. Below, is the YAML of the AppBinding that we are going to create for our `sample-redis-2` database. + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: sample-redis-2 + namespace: demo-2 + annotations: + stash.appscode.com/backup-blueprint: redis-backup-template + stash.appscode.com/schedule: "*/3 * * * *" +spec: + clientConfig: + service: + name: sample-redis-2-master + path: / + port: 6379 + scheme: http + secret: + name: sample-redis-2 + secretTransforms: + - renameKey: + from: redis-password + to: password + type: redis + version: 6.2.5 +``` + +Notice the `annotations` section. This time, we have passed a schedule via `stash.appscode.com/schedule` annotation along with the `stash.appscode.com/backup-blueprint` annotation. + +Let's create the above AppBinding, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/redis/auto-backup/examples/sample-redis-2.yaml +appbinding.appcatalog.appscode.com/sample-redis-2 created +``` + +### Verify Auto-backup configured + +Now, let's verify whether the auto-backup has been configured properly or not. + +#### Verify Repository + +At first, let's verify whether Stash has created a `Repository` for our Redis or not. + +```bash +❯ kubectl get repository -n demo-2 +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +app-sample-redis-2 29s +``` + +Now, let's check the YAML of the `Repository`. + +```yaml +❯ kubectl get repository -n demo-2 app-sample-redis-2 -o yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: app-sample-redis-2 + namespace: demo-2 + ... +spec: + backend: + gcs: + bucket: stash-testing + prefix: redis-backup/demo-2/redis/sample-redis-2 + storageSecretName: gcs-secret +``` + +Here, you can see that Stash has resolved the variables in `prefix` field and substituted them with the equivalent information from this new database. + +#### Verify BackupConfiguration + +If everything goes well, Stash should create a `BackupConfiguration` for our Redis in `demo-2` namespace and the phase of that `BackupConfiguration` should be `Ready`. Verify the `BackupConfiguration` crd by the following command, + +```bash +❯ kubectl get backupconfiguration -n demo-2 +NAME TASK SCHEDULE PAUSED PHASE AGE +app-sample-redis-2 redis-backup-6.2.5 */3 * * * * Ready 64s +``` + +Now, let's check the YAML of the `BackupConfiguration`. + +```yaml +❯ kubectl get backupconfiguration -n demo-2 app-sample-redis-2 -o yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: app-sample-redis-2 + namespace: demo-2 + ... +spec: + driver: Restic + repository: + name: app-sample-redis-2 + retentionPolicy: + keepLast: 5 + name: keep-last-5 + prune: true + runtimeSettings: {} + schedule: '*/3 * * * *' + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-redis-2 + task: + name: redis-backup-6.2.5 + tempDir: {} +status: + conditions: + - lastTransitionTime: "2021-07-29T14:17:31Z" + message: Repository demo-2/app-sample-redis-2 exist. + reason: RepositoryAvailable + status: "True" + type: RepositoryFound + - lastTransitionTime: "2021-07-29T14:17:31Z" + message: Backend Secret demo-2/gcs-secret exist. + reason: BackendSecretAvailable + status: "True" + type: BackendSecretFound + - lastTransitionTime: "2021-07-29T14:17:31Z" + message: Backup target appcatalog.appscode.com/v1alpha1 appbinding/sample-redis-2 + found. + reason: TargetAvailable + status: "True" + type: BackupTargetFound + - lastTransitionTime: "2021-07-29T14:17:31Z" + message: Successfully created backup triggering CronJob. + reason: CronJobCreationSucceeded + status: "True" + type: CronJobCreated + observedGeneration: 1 +``` + +Notice the `schedule` section. This time the `BackupConfiguration` has been created with the schedule we have provided via annotation. + +Also, notice the `target` section. Stash has automatically added the new Redis as the target of this `BackupConfiguration`. + +#### Verify Backup + +Now, let's wait for a backup run to complete. You can watch for `BackupSession` as below, + +```bash +❯ kubectl get backupsession -n demo-2 -w +NAME INVOKER-TYPE INVOKER-NAME PHASE DURATION AGE +app-sample-redis-2-1627568283 BackupConfiguration app-sample-redis-2 Running 86s +app-sample-redis-2-1627568283 BackupConfiguration app-sample-redis-2 Succeeded 1m33.522226054s 93s +``` + +Once the backup has been completed successfully, you should see that Stash has created a new directory as pointed by the `prefix` field of the new `Repository` and stored the backed up data there. + +
+ Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +## Auto-backup with custom parameters + +In this section, we are going to backup a Redis database of `demo-3` namespace. This time, we are going to pass some parameters for the Task through the annotations. + +### Create Storage Secret + +At first, let's create the `gcs-secret` in `demo-3` namespace with the access credentials to our GCS bucket. + +```bash +❯ kubectl create secret generic -n demo-3 gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +### Deploy Database + +Let's deploy a Redis database named `sample-redis-3` in the `demo-3` namespace. + +```bash +❯ helm install sample-redis-3 bitnami/redis -n demo-3 +``` + +Now, let's insert some sample data into it. + +```bash +❯ export PASSWORD=$(kubectl get secrets -n demo-3 sample-redis-3 -o jsonpath='{.data.\redis-password}' | base64 -d) +❯ kubectl exec -it -n demo-3 sample-redis-3-master-0 -- redis-cli -a $PASSWORD +Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. +127.0.0.1:6379> set key1 value1 +OK +127.0.0.1:6379> get key1 +"value1" +127.0.0.1:6379> exit +``` + +### Create AppBinding + +Now, we have to create an AppBinding with the connection information of our database. Below, is the YAML of the AppBinding that we are going to create for our `sample-redis-3` database. + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: sample-redis-3 + namespace: demo-3 + annotations: + stash.appscode.com/backup-blueprint: redis-backup-template + params.stash.appscode.com/args: -db 0 +spec: + clientConfig: + service: + name: sample-redis-3-master + path: / + port: 6379 + scheme: http + secret: + name: sample-redis-3 + secretTransforms: + - renameKey: + from: redis-password + to: password + type: redis + version: 6.2.5 +``` + +Notice the `annotations` section. This time, we have passed an argument via `params.stash.appscode.com/args` annotation along with the `stash.appscode.com/backup-blueprint` annotation. + +Let's create the above AppBinding, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/redis/auto-backup/examples/sample-redis-3.yaml +appbinding.appcatalog.appscode.com/sample-redis-3 created +``` + +### Verify Auto-backup configured + +Now, let's verify whether the auto-backup resources has been created or not. + +#### Verify Repository + +At first, let's verify whether Stash has created a `Repository` for our Redis or not. + +```bash +❯ kubectl get repository -n demo-3 +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +app-sample-redis-3 29s +``` + +Now, let's check the YAML of the `Repository`. + +```yaml +❯ kubectl get repository -n demo-3 app-sample-redis-3 -o yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: app-sample-redis-3 + namespace: demo-3 + ... +spec: + backend: + gcs: + bucket: stash-testing + prefix: redis-backup/demo-3/redis/sample-redis-3 + storageSecretName: gcs-secret +``` + +Here, you can see that Stash has resolved the variables in `prefix` field and substituted them with the equivalent information from this new database. + +#### Verify BackupConfiguration + +If everything goes well, Stash should create a `BackupConfiguration` for our Redis in `demo-3` namespace and the phase of that `BackupConfiguration` should be `Ready`. Verify the `BackupConfiguration` crd by the following command, + +```bash +❯ kubectl get backupconfiguration -n demo-3 +NAME TASK SCHEDULE PAUSED PHASE AGE +app-sample-redis-3 redis-backup-6.2.5 */5 * * * * Ready 62s +``` + +Now, let's check the YAML of the `BackupConfiguration`. + +```yaml +❯ kubectl get backupconfiguration -n demo-3 app-sample-redis-3 -o yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: app-sample-redis-3 + namespace: demo-3 + ... +spec: + driver: Restic + repository: + name: app-sample-redis-3 + retentionPolicy: + keepLast: 5 + name: keep-last-5 + prune: true + runtimeSettings: {} + schedule: '*/5 * * * *' + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-redis-3 + task: + name: redis-backup-6.2.5 + params: + - name: args + value: -db 0 + tempDir: {} +status: + conditions: + - lastTransitionTime: "2021-07-29T14:23:58Z" + message: Repository demo-3/app-sample-redis-3 exist. + reason: RepositoryAvailable + status: "True" + type: RepositoryFound + - lastTransitionTime: "2021-07-29T14:23:58Z" + message: Backend Secret demo-3/gcs-secret exist. + reason: BackendSecretAvailable + status: "True" + type: BackendSecretFound + - lastTransitionTime: "2021-07-29T14:23:58Z" + message: Backup target appcatalog.appscode.com/v1alpha1 appbinding/sample-redis-3 + found. + reason: TargetAvailable + status: "True" + type: BackupTargetFound + - lastTransitionTime: "2021-07-29T14:23:58Z" + message: Successfully created backup triggering CronJob. + reason: CronJobCreationSucceeded + status: "True" + type: CronJobCreated + observedGeneration: 1 +``` + +Notice the `task` section. The `args` parameter that we had passed via annotations has been added to the `params` section. + +Also, notice the `target` section. Stash has automatically added the new Redis as the target of this `BackupConfiguration`. + +#### Verify Backup + +Now, let's wait for a backup run to complete. You can watch for `BackupSession` as below, + +```bash +❯ kubectl get backupsession -n demo-3 -w +NAME INVOKER-TYPE INVOKER-NAME PHASE DURATION AGE +app-sample-redis-3-1627568709 BackupConfiguration app-sample-redis-3 Running 20s +app-sample-redis-3-1627568709 BackupConfiguration app-sample-redis-3 Succeeded 1m43.931692282s 103s +``` + +Once the backup has been completed successfully, you should see that Stash has created a new directory as pointed by the `prefix` field of the new `Repository` and stored the backed up data there. + +
+ Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +## Cleanup + +To cleanup the resources crated by this tutorial, run the following commands, + +```bash +# cleanup sample-redis-1 resources +❯ helm uninstall sample-redis-1 -n demo-1 +❯ kubectl delete appbinding sample-redis-1 -n demo-1 +❯ kubectl delete repository -n demo-1 --all + +# cleanup sample-redis-2 resources +❯ helm uninstall sample-redis-2 -n demo-2 +❯ kubectl delete appbinding sample-redis-2 -n demo-2 +❯ kubectl delete repository -n demo-2 --all + +# cleanup sample-redis-3 resources +❯ helm uninstall sample-redis-3 -n demo-3 +❯ kubectl delete appbinding sample-redis-3 -n demo-3 +❯ kubectl delete repository -n demo-3 --all + +# cleanup BackupBlueprint +❯ kubectl delete backupblueprint redis-backup-template +``` diff --git a/content/docs/v2024.12.18/addons/redis/customization/examples/backup/multi-retention-policy.yaml b/content/docs/v2024.12.18/addons/redis/customization/examples/backup/multi-retention-policy.yaml new file mode 100644 index 0000000000..430c3c4fd3 --- /dev/null +++ b/content/docs/v2024.12.18/addons/redis/customization/examples/backup/multi-retention-policy.yaml @@ -0,0 +1,24 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-redis-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: redis-backup-6.2.5 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-redis + retentionPolicy: + name: sample-redis-retention + keepLast: 5 + keepDaily: 10 + keepWeekly: 20 + keepMonthly: 50 + keepYearly: 100 + prune: true diff --git a/content/docs/v2024.12.18/addons/redis/customization/examples/backup/passing-args.yaml b/content/docs/v2024.12.18/addons/redis/customization/examples/backup/passing-args.yaml new file mode 100644 index 0000000000..90a9d22bdb --- /dev/null +++ b/content/docs/v2024.12.18/addons/redis/customization/examples/backup/passing-args.yaml @@ -0,0 +1,23 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-redis-backup + namespace: demo +spec: + schedule: "*/2 * * * *" + task: + name: redis-backup-6.2.5 + params: + - name: args + value: -db 1 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-redis + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/redis/customization/examples/backup/resource-limit.yaml b/content/docs/v2024.12.18/addons/redis/customization/examples/backup/resource-limit.yaml new file mode 100644 index 0000000000..310b6b6177 --- /dev/null +++ b/content/docs/v2024.12.18/addons/redis/customization/examples/backup/resource-limit.yaml @@ -0,0 +1,29 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-redis-backup + namespace: demo +spec: + schedule: "*/2 * * * *" + task: + name: redis-backup-6.2.5 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-redis + runtimeSettings: + container: + resources: + requests: + cpu: "200m" + memory: "1Gi" + limits: + cpu: "200m" + memory: "1Gi" + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/redis/customization/examples/backup/specific-user.yaml b/content/docs/v2024.12.18/addons/redis/customization/examples/backup/specific-user.yaml new file mode 100644 index 0000000000..54e877a18b --- /dev/null +++ b/content/docs/v2024.12.18/addons/redis/customization/examples/backup/specific-user.yaml @@ -0,0 +1,25 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-redis-backup + namespace: demo +spec: + schedule: "*/2 * * * *" + task: + name: redis-backup-6.2.5 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-redis + runtimeSettings: + pod: + securityContext: + runAsUser: 0 + runAsGroup: 0 + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/redis/customization/examples/restore/passing-args.yaml b/content/docs/v2024.12.18/addons/redis/customization/examples/restore/passing-args.yaml new file mode 100644 index 0000000000..ef84e8e5cc --- /dev/null +++ b/content/docs/v2024.12.18/addons/redis/customization/examples/restore/passing-args.yaml @@ -0,0 +1,20 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-redis-restore + namespace: demo +spec: + task: + name: redis-restore-6.2.5 + params: + - name: args + value: --pipe-timeout 300 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-redis + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/addons/redis/customization/examples/restore/resource-limit.yaml b/content/docs/v2024.12.18/addons/redis/customization/examples/restore/resource-limit.yaml new file mode 100644 index 0000000000..cb71b7aaa9 --- /dev/null +++ b/content/docs/v2024.12.18/addons/redis/customization/examples/restore/resource-limit.yaml @@ -0,0 +1,26 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-redis-restore + namespace: demo +spec: + task: + name: redis-restore-6.2.5 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-redis + runtimeSettings: + container: + resources: + requests: + cpu: "200m" + memory: "1Gi" + limits: + cpu: "200m" + memory: "1Gi" + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/addons/redis/customization/examples/restore/specific-snapshot.yaml b/content/docs/v2024.12.18/addons/redis/customization/examples/restore/specific-snapshot.yaml new file mode 100644 index 0000000000..ca36e05baa --- /dev/null +++ b/content/docs/v2024.12.18/addons/redis/customization/examples/restore/specific-snapshot.yaml @@ -0,0 +1,17 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-redis-restore + namespace: demo +spec: + task: + name: redis-restore-6.2.5 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-redis + rules: + - snapshots: [4bc21d6f] diff --git a/content/docs/v2024.12.18/addons/redis/customization/examples/restore/specific-user.yaml b/content/docs/v2024.12.18/addons/redis/customization/examples/restore/specific-user.yaml new file mode 100644 index 0000000000..e681c5bbdb --- /dev/null +++ b/content/docs/v2024.12.18/addons/redis/customization/examples/restore/specific-user.yaml @@ -0,0 +1,22 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-redis-restore + namespace: demo +spec: + task: + name: redis-restore-6.2.5 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-redis + runtimeSettings: + pod: + securityContext: + runAsUser: 0 + runAsGroup: 0 + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/addons/redis/customization/index.md b/content/docs/v2024.12.18/addons/redis/customization/index.md new file mode 100644 index 0000000000..217b7ffc57 --- /dev/null +++ b/content/docs/v2024.12.18/addons/redis/customization/index.md @@ -0,0 +1,356 @@ +--- +title: Redis Backup Customization | Stash +description: Customizing Redis Backup and Restore process with Stash +menu: + docs_v2024.12.18: + identifier: stash-redis-customization + name: Customizing Backup & Restore Process + parent: stash-redis + weight: 40 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Customizing Backup and Restore Process + +Stash provides rich customization supports for the backup and restore process to meet the requirements of various cluster configurations. This guide will show you some examples of these customizations. + +> Note: YAML files used in this tutorial are stored [here](https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/redis/customization/examples). + +## Customizing Backup Process + +In this section, we are going to show you how to customize the backup process. Here, we are going to show some examples of providing arguments to the backup process, running the backup process as a specific user, ignoring some indexes during the backup process, etc. + +### Passing arguments to the backup process + +Stash Redis addon uses [redis-dump-go](https://github.com/yannh/redis-dump-go) for backup. You can pass arguments to the `redis-dump-go` through `args` param under `task.params` section. + +The below example shows how you can pass the `-db 1` to take backup only the database with index 1. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-redis-backup + namespace: demo +spec: + schedule: "*/2 * * * *" + task: + name: redis-backup-6.2.5 + params: + - name: args + value: -db 1 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-redis + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +### Running backup job as a specific user + +If your cluster requires running the backup job as a specific user, you can provide `securityContext` under `runtimeSettings.pod` section. The below example shows how you can run the backup job as the root user. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-redis-backup + namespace: demo +spec: + schedule: "*/2 * * * *" + task: + name: redis-backup-6.2.5 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-redis + runtimeSettings: + pod: + securityContext: + runAsUser: 0 + runAsGroup: 0 + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +### Specifying Memory/CPU limit/request for the backup job + +If you want to specify the Memory/CPU limit/request for your backup job, you can specify `resources` field under `runtimeSettings.container` section. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-redis-backup + namespace: demo +spec: + schedule: "*/2 * * * *" + task: + name: redis-backup-6.2.5 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-redis + runtimeSettings: + container: + resources: + requests: + cpu: "200m" + memory: "1Gi" + limits: + cpu: "200m" + memory: "1Gi" + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +### Using multiple retention policies + +You can also specify multiple retention policies for your backed up data. For example, you may want to keep few daily snapshots, few weekly snapshots, and few monthly snapshots, etc. You just need to pass the desired number with the respective key under the `retentionPolicy` section. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-redis-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: redis-backup-6.2.5 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-redis + retentionPolicy: + name: sample-redis-retention + keepLast: 5 + keepDaily: 10 + keepWeekly: 20 + keepMonthly: 50 + keepYearly: 100 + prune: true +``` + +To know more about the available options for retention policies, please visit [here](/docs/v2024.12.18/concepts/crds/backupconfiguration/#specretentionpolicy). + +## Customizing Restore Process + +Stash uses `redis-cli` during the restore process. In this section, we are going to show how you can pass arguments to the restore process, restore a specific snapshot, run restore job as a specific user, etc. + +### Passing arguments to the restore process + +Similar to the backup process, you can pass arguments to the restore process through the `args` params under `task.params` section. Here, we have passed `--pipe-timeout` argument to the `redis-cli`. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-redis-restore + namespace: demo +spec: + task: + name: redis-restore-6.2.5 + params: + - name: args + value: --pipe-timeout 300 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-redis + rules: + - snapshots: [latest] +``` + +### Restore specific snapshot + +You can also restore a specific snapshot. At first, list the available snapshots as below, + +```bash +❯ kubectl get snapshots -n demo +NAME ID REPOSITORY HOSTNAME CREATED AT +gcs-repo-4bc21d6f 4bc21d6f gcs-repo host-0 2022-01-12T14:54:27Z +gcs-repo-f0ac7cbd f0ac7cbd gcs-repo host-0 2022-01-12T14:56:26Z +gcs-repo-9210ebb6 9210ebb6 gcs-repo host-0 2022-01-12T14:58:27Z +gcs-repo-0aff8890 0aff8890 gcs-repo host-0 2022-01-12T15:00:28Z +``` + +>You can also filter the snapshots as shown in the guide [here](https://stash.run/docs/{{< param "info.version" >}}/concepts/crds/snapshot/#working-with-snapshot). + +You can use the respective ID of the snapshot to restore a specific snapshot. + +The below example shows how you can pass a specific snapshot ID through the `snapshots` field of `rules` section. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-redis-restore + namespace: demo +spec: + task: + name: redis-restore-6.2.5 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-redis + rules: + - snapshots: [4bc21d6f] +``` + +>Please, do not specify multiple snapshots here. Each snapshot represents a complete backup of your database. Multiple snapshots are only usable during file/directory restore. + +### Running restore job as a specific user + +You can provide `securityContext` under `runtimeSettings.pod` section to run the restore job as a specific user. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-redis-restore + namespace: demo +spec: + task: + name: redis-restore-6.2.5 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-redis + runtimeSettings: + pod: + securityContext: + runAsUser: 0 + runAsGroup: 0 + rules: + - snapshots: [latest] +``` + +### Specifying Memory/CPU limit/request for the restore job + +Similar to the backup process, you can also provide `resources` field under the `runtimeSettings.container` section to limit the Memory/CPU for your restore job. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-redis-restore + namespace: demo +spec: + task: + name: redis-restore-6.2.5 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-redis + runtimeSettings: + container: + resources: + requests: + cpu: "200m" + memory: "1Gi" + limits: + cpu: "200m" + memory: "1Gi" + rules: + - snapshots: [latest] +``` diff --git a/content/docs/v2024.12.18/addons/redis/helm/examples/appbinding.yaml b/content/docs/v2024.12.18/addons/redis/helm/examples/appbinding.yaml new file mode 100644 index 0000000000..26c2b73bb0 --- /dev/null +++ b/content/docs/v2024.12.18/addons/redis/helm/examples/appbinding.yaml @@ -0,0 +1,20 @@ +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: sample-redis + namespace: demo +spec: + clientConfig: + service: + name: sample-redis-master + path: / + port: 6379 + scheme: http + secret: + name: sample-redis + secretTransforms: + - renameKey: + from: redis-password + to: password + type: redis + version: 6.2.5 diff --git a/content/docs/v2024.12.18/addons/redis/helm/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/addons/redis/helm/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..541464f51e --- /dev/null +++ b/content/docs/v2024.12.18/addons/redis/helm/examples/backupconfiguration.yaml @@ -0,0 +1,20 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-redis-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: redis-backup-6.2.5 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-redis + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/addons/redis/helm/examples/repository.yaml b/content/docs/v2024.12.18/addons/redis/helm/examples/repository.yaml new file mode 100644 index 0000000000..112349ead9 --- /dev/null +++ b/content/docs/v2024.12.18/addons/redis/helm/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /demo/redis/sample-redis + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/addons/redis/helm/examples/restoresession.yaml b/content/docs/v2024.12.18/addons/redis/helm/examples/restoresession.yaml new file mode 100644 index 0000000000..c5ebeebbd2 --- /dev/null +++ b/content/docs/v2024.12.18/addons/redis/helm/examples/restoresession.yaml @@ -0,0 +1,17 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-redis-restore + namespace: demo +spec: + task: + name: redis-restore-6.2.5 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-redis + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/addons/redis/helm/images/sample-redis-backup.png b/content/docs/v2024.12.18/addons/redis/helm/images/sample-redis-backup.png new file mode 100644 index 0000000000..c646174c77 Binary files /dev/null and b/content/docs/v2024.12.18/addons/redis/helm/images/sample-redis-backup.png differ diff --git a/content/docs/v2024.12.18/addons/redis/helm/index.md b/content/docs/v2024.12.18/addons/redis/helm/index.md new file mode 100644 index 0000000000..8356a0c5e0 --- /dev/null +++ b/content/docs/v2024.12.18/addons/redis/helm/index.md @@ -0,0 +1,634 @@ +--- +title: Logical Backup & Restore Redis | Stash +description: Take logical backup of Redis database using Stash +menu: + docs_v2024.12.18: + identifier: stash-redis-helm + name: Helm managed Redis + parent: stash-redis + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Take a logical backup of the Redis database using Stash + +Stash `{{< param "info.version" >}}` supports backup and restoration of Redis databases. This guide will show you how you can take a logical backup of your Redis databases and restore them using Stash. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. +- Install Stash in your cluster following the steps [here](/docs/v2024.12.18/setup/install/stash/). +- If you are not familiar with how Stash backup and restore Redis databases, please check the following guide [here](/docs/v2024.12.18/addons/redis/overview/). + +You have to be familiar with following custom resources: + +- [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) +- [Function](/docs/v2024.12.18/concepts/crds/function/) +- [Task](/docs/v2024.12.18/concepts/crds/task/) +- [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) +- [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) +- [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + +To keep things isolated, we are going to use a separate namespace called `demo` throughout this tutorial. Create `demo` namespace if you haven't created already. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> Note: YAML files used in this tutorial are stored [here](https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/redis/helm/examples). + +## Prepare Redis + +In this section, we are going to deploy a Redis database. Then, we are going to insert some sample data into it. + +### Deploy Redis + +At first, let's deploy a Redis database. Here, we are going to use [bitnami/redis](https://artifacthub.io/packages/helm/bitnami/redis) chart from [ArtifactHub](https://artifacthub.io/). + +Let's deploy a Redis database named `sample-redis` using Helm as below, + +```bash +# Add bitnami chart registry +$ helm repo add bitnami https://charts.bitnami.com/bitnami +# Update helm registries +$ helm repo update +# Install bitnami/redis chart into demo namespace +$ helm install sample-redis bitnami/redis -n demo +``` + +This chart will create the necessary StatefulSet, Secret, Service etc. for the database. You can easily view all the resources created by chart using [ketall](https://github.com/corneliusweig/ketall) `kubectl` plugin as below, + +```bash +❯ kubectl get-all -n demo -l app.kubernetes.io/instance=sample-redis +NAME NAMESPACE AGE +configmap/sample-redis-configuration demo 117s +configmap/sample-redis-health demo 117s +configmap/sample-redis-scripts demo 117s +endpoints/sample-redis-headless demo 117s +endpoints/sample-redis-master demo 117s +endpoints/sample-redis-replicas demo 117s +persistentvolumeclaim/redis-data-sample-redis-master-0 demo 117s +persistentvolumeclaim/redis-data-sample-redis-replicas-0 demo 117s +persistentvolumeclaim/redis-data-sample-redis-replicas-1 demo 79s +persistentvolumeclaim/redis-data-sample-redis-replicas-2 demo 51s +pod/sample-redis-master-0 demo 117s +pod/sample-redis-replicas-0 demo 117s +pod/sample-redis-replicas-1 demo 79s +pod/sample-redis-replicas-2 demo 51s +secret/sample-redis demo 117s +serviceaccount/sample-redis demo 117s +service/sample-redis-headless demo 117s +service/sample-redis-master demo 117s +service/sample-redis-replicas demo 117s +controllerrevision.apps/sample-redis-master-755dd8b64d demo 117s +controllerrevision.apps/sample-redis-replicas-7b8c7694bf demo 117s +statefulset.apps/sample-redis-master demo 117s +statefulset.apps/sample-redis-replicas demo 117s +endpointslice.discovery.k8s.io/sample-redis-headless-6bvt2 demo 117s +endpointslice.discovery.k8s.io/sample-redis-master-78wcv demo 117s +endpointslice.discovery.k8s.io/sample-redis-replicas-vhc7z demo 117s +``` + +Now, wait for the database pod `sample-redis-master-0` to go into `Running` state, + +```bash +❯ kubectl get pod -n demo sample-redis-master-0 +NAME READY STATUS RESTARTS AGE +sample-redis-master-0 1/1 Running 0 2m57s +``` + +Once the database pod is in `Running` state, verify that the database is ready to accept the connections. + +```bash +❯ kubectl logs -n demo sample-redis-master-0 +1:C 28 Jul 2021 13:03:28.191 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo +1:C 28 Jul 2021 13:03:28.191 # Redis version=6.2.5, bits=64, commit=00000000, modified=0, pid=1, just started +1:C 28 Jul 2021 13:03:28.191 # Configuration loaded +1:M 28 Jul 2021 13:03:28.192 * monotonic clock: POSIX clock_gettime +1:M 28 Jul 2021 13:03:28.192 * Running mode=standalone, port=6379. +1:M 28 Jul 2021 13:03:28.192 # Server initialized +1:M 28 Jul 2021 13:03:28.193 * Ready to accept connections +``` + +From the above log, we can see the database is ready to accept connections. + +### Insert Sample Data + +Now, we are going to exec into the database pod and create some sample data. The helm chart has created a secret with access credentials. Let's find out the credentials from the Secret, + +```yaml +❯ kubectl get secret -n demo sample-redis -o yaml +apiVersion: v1 +data: + redis-password: WTFZTENrZmNpcw== +kind: Secret +metadata: + annotations: + meta.helm.sh/release-name: sample-redis + meta.helm.sh/release-namespace: demo + creationTimestamp: "2021-07-28T13:03:23Z" + labels: + app.kubernetes.io/instance: sample-redis + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: redis + helm.sh/chart: redis-14.8.6 + name: sample-redis + namespace: demo + resourceVersion: "530037" + uid: a48ce23a-105d-4d92-9067-c80623cbe269 +type: Opaque + +``` + +Here, we are going to use `redis-password` to authenticate and insert the sample data. + +At first, let's export the password as environment variables to make further commands re-usable. + +```bash +export PASSWORD=$(kubectl get secrets -n demo sample-redis -o jsonpath='{.data.\redis-password}' | base64 -d) +``` + +Now, let's exec into the database pod and insert some sample data, + +```bash +❯ kubectl exec -it -n demo sample-redis-master-0 -- redis-cli -a $PASSWORD +Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. +# insert some key value pairs +127.0.0.1:6379> set key1 value1 +OK +127.0.0.1:6379> set key2 value2 +OK +# check the inserted data +127.0.0.1:6379> get key1 +"value1" +127.0.0.1:6379> get key2 +"value2" +# exit from redis-cli +127.0.0.1:6379> exit +``` + +We have successfully deployed a Redis database and inserted some sample data into it. In the subsequent sections, we are going to backup these data using Stash. + +## Prepare for Backup + +In this section, we are going to prepare the necessary resources (i.e. database connection information, backend information, etc.) before backup. + +### Ensure Redis Addon + +When you install Stash, it will automatically install all the official database addons. Make sure that Redis addon was installed properly using the following command. + +```bash +❯ kubectl get tasks.stash.appscode.com | grep redis +redis-backup-6.2.5 24m +redis-restore-6.2.5 24m +``` + +This addon should be able to take backup of the databases with matching major versions as discussed in [Addon Version Compatibility](/docs/v2024.12.18/addons/redis/README#addon-version-compatibility). + +### Create AppBinding + +Stash needs to know how to connect with the database. An `AppBinding` exactly provides this information. It holds the Service and Secret information of the database. You have to point to the respective `AppBinding` as a target of backup instead of the database itself. + +Stash expect your database Secret to have `password` keys. If your database secret does not have the expected key, the `AppBinding` can also help here. You can specify a `secretTransforms` section with the mapping between the current keys and the desired keys. + +Here, is the YAML of the `AppBinding` that we are going to create for the Redis database we have deployed earlier. + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: sample-redis + namespace: demo +spec: + clientConfig: + service: + name: sample-redis-master + path: / + port: 6379 + scheme: http + secret: + name: sample-redis + secretTransforms: + - renameKey: + from: redis-password + to: password + type: redis + version: 6.2.5 +``` + +Here, + +- **.spec.clientConfig.service** specifies the Service information to use to connects with the database. +- **.spec.secret** specifies the name of the Secret that holds necessary credentials to access the database. If your Redis is not using authentication, then don't provide this field. +- **.spec.secretTransforms** specifies the transformations required to achieve the desired keys from the current Secret. You can apply the following transformations here: + - **addKey**: If your database Secret does not have an equivalent key expected by Stash, you can add the key using `addKey` transformation. + - **renameKey**: If your database Secret does not have a key expected by Stash but it has an equivalent key that is used for the same purpose, you can use `renameKey` transformation to specify the mapping between the keys. For example, our Redis Secret didn't have `password` key but it has an equivalent `redis-password` key that contains password for the database. Hence, we are telling Stash using `renameKey` transformation that the `redis-password` should be used as `password` key. + - **addKeysFrom**: You can also merge keys from another Secret using `addKeysFrom` transformation. You have to specify the respective Secret name and namespace as below: + ```yaml + addKeysFrom: + name: + namespace: + ``` +- `spec.type` specifies the type of the database. This is particularly helpful in auto-backup where you want to use different path prefixes for different types of database. + +Let's create the `AppBinding` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/addons/redis/helm/examples/appbinding.yaml +appbinding.appcatalog.appscode.com/sample-redis created +``` + +>The `secretTransforms` does not modify your original database Secret. Stash just uses those transformations to obtain the desired keys from the original Secret. + +### Prepare Backend + +We are going to store our backed up data into a GCS bucket. So, we need to create a Secret with GCS credentials and a `Repository` object with the bucket information. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +**Create Storage Secret:** + +At first, let's create a secret called `gcs-secret` with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat downloaded-sa-json.key > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create Repository:** + +Now, crete a `Repository` object with the information of your desired bucket. Below is the YAML of `Repository` object we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /demo/redis/sample-redis + storageSecretName: gcs-secret +``` + +Let's create the `Repository` we have shown above, + +```bash +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/redis/helm/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our database into our desired backend. + +### Backup + +To schedule a backup, we have to create a `BackupConfiguration` object targeting the respective `AppBinding` of our desired database. Then Stash will create a CronJob to periodically backup the database. + +#### Create BackupConfiguration + +Below is the YAML for `BackupConfiguration` object we care going to use to backup the `sample-redis` database we have deployed earlier, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-redis-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: redis-backup-6.2.5 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-redis + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +Here, + +- `.spec.schedule` specifies that we want to backup the database at 5 minutes intervals. +- `.spec.task.name` specifies the name of the Task object that specifies the necessary Functions and their execution order to backup a Redis database. +- `.spec.repository.name` specifies the Repository CR name we have created earlier with backend information. +- `.spec.target.ref` refers to the AppBinding object that holds the connection information of our targeted database. +- `.spec.retentionPolicy` specifies a policy indicating how we want to cleanup the old backups. + +Let's create the `BackupConfiguration` object we have shown above, + +```bash +$ kubectl create -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/redis/helm/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/sample-redis-backup created +``` + + +#### Verify Backup Setup Successful + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. Let's verify the `Phase` of the BackupConfiguration, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-redis-backup redis-backup-6.2.5 */5 * * * * Ready 11s +``` + +#### Verify CronJob + +Stash will create a CronJob with the schedule specified in `spec.schedule` field of `BackupConfiguration` object. + +Verify that the CronJob has been created using the following command, + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-redis-backup */5 * * * * False 0 14s +``` + +#### Wait for BackupSession + +The `sample-redis-backup` CronJob will trigger a backup on each scheduled slot by creating a `BackupSession` object. + +Now, wait for a schedule to appear. Run the following command to watch for a `BackupSession` object, + +```bash +❯ kubectl get backupsession -n demo -w +NAME INVOKER-TYPE INVOKER-NAME PHASE DURATION AGE +sample-redis-backup-1627490702 BackupConfiguration sample-redis-backup 0s +sample-redis-backup-1627490702 BackupConfiguration sample-redis-backup Running 0s +sample-redis-backup-1627490702 BackupConfiguration sample-redis-backup Succeeded 1m18.098555424s 78s +``` + +Here, the phase `Succeeded` means that the backup process has been completed successfully. + +#### Verify Backup + +Now, we are going to verify whether the backed up data is present in the backend or not. Once a backup is completed, Stash will update the respective `Repository` object to reflect the backup completion. Check that the repository `gcs-repo` has been updated by the following command, + +```bash +❯ kubectl get repository -n demo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo true 93 B 1 2m1s 24m +``` + +Now, if we navigate to the GCS bucket, we will see the backed up data has been stored in `demo/redis/sample-redis` directory as specified by `.spec.backend.gcs.prefix` field of the `Repository` object. + +
+ Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +> Note: Stash keeps all the backed up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Restore Redis + +If you have followed the previous sections properly, you should have a successful logical backup of your Redis database. Now, we are going to show how you can restore the database from the backed up data. + +### Restore Into the Same Database + +You can restore your data into the same database you have backed up from or into a different database in the same cluster or a different cluster. In this section, we are going to show you how to restore in the same database which may be necessary when you have accidentally deleted any data from the running database. + +#### Temporarily Pause Backup + +At first, let's stop taking any further backup of the database so that no backup runs after we delete the sample data. We are going to pause the `BackupConfiguration` object. Stash will stop taking any further backup when the `BackupConfiguration` is paused. + +Let's pause the `sample-redis-backup` BackupConfiguration, + +```bash +$ kubectl patch backupconfiguration -n demo sample-redis-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/sample-redis-backup patched +``` + +Verify that the `BackupConfiguration` has been paused, + +```bash +❯ kubectl get backupconfiguration -n demo sample-redis-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-redis-backup redis-backup-6.2.5 */5 * * * * true Ready 4h47m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the `BackupConfiguration` has been paused. + +Stash will also suspend the respective CronJob. + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-redis-backup */5 * * * * True 0 113s 4h48m +``` + +#### Simulate Disaster + +Now, let's simulate an accidental deletion scenario. Here, we are going to exec into the database pod and delete the sample data we have inserted earlier. + +```bash +❯ kubectl exec -it -n demo sample-redis-master-0 -- redis-cli -a $PASSWORD +Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. +# delete the sample data +127.0.0.1:6379> del key1 key2 +(integer) 2 +# verify that the sample data has been deleted +127.0.0.1:6379> get key1 +(nil) +127.0.0.1:6379> get key2 +(nil) +127.0.0.1:6379> exit +``` + +#### Create RestoreSession + +To restore the database, you have to create a `RestoreSession` object pointing to the `AppBinding` of the targeted database. + +Here, is the YAML of the `RestoreSession` object that we are going to use for restoring our `sample-redis` database. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-redis-restore + namespace: demo +spec: + task: + name: redis-restore-6.2.5 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-redis + rules: + - snapshots: [latest] +``` + +Here, + +- `.spec.task.name` specifies the name of the Task object that specifies the necessary Functions and their execution order to restore a Redis database. +- `.spec.repository.name` specifies the Repository object that holds the backend information where our backed up data has been stored. +- `.spec.target.ref` refers to the respective AppBinding of the `sample-redis` database. +- `.spec.rules` specifies that we are restoring data from the latest backup snapshot of the database. + +Let's create the `RestoreSession` object object we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/addons/redis/helm/examples/restoresession.yaml +restoresession.stash.appscode.com/sample-redis-restore created +``` + +Once, you have created the `RestoreSession` object, Stash will create a restore Job. Run the following command to watch the phase of the `RestoreSession` object, + +```bash +❯ kubectl get restoresession -n demo -w +NAME REPOSITORY PHASE DURATION AGE +sample-redis-restore gcs-repo Running 6s +sample-redis-restore gcs-repo Running 16s +sample-redis-restore gcs-repo Succeeded 16s +sample-redis-restore gcs-repo Succeeded 16.324570911s 16s +``` + +The `Succeeded` phase means that the restore process has been completed successfully. + +#### Verify Restored Data + +Now, let's exec into the database pod and verify whether data actual data has been restored or not, + +```bash +❯ kubectl exec -it -n demo sample-redis-master-0 -- redis-cli -a $PASSWORD +Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. +127.0.0.1:6379> get key1 +"value1" +127.0.0.1:6379> get key2 +"value2" +127.0.0.1:6379> exit +``` + +Hence, we can see from the above output that the deleted data has been restored successfully from the backup. + +#### Resume Backup + +Since our data has been restored successfully we can now resume our usual backup process. Resume the `BackupConfiguration` using following command, + +```bash +❯ kubectl patch backupconfiguration -n demo sample-redis-backup --type="merge" --patch='{"spec": {"paused": false}}' +backupconfiguration.stash.appscode.com/sample-redis-backup patched +``` + +Verify that the `BackupConfiguration` has been resumed, +```bash +❯ kubectl get backupconfiguration -n demo sample-redis-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-redis-backup redis-backup-6.2.5 */5 * * * * false Ready 4h54m +``` + +Here, `false` in the `PAUSED` column means the backup has been resume successfully. The CronJob also should be resumed now. + +```bash +❯ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-redis-backup */5 * * * * False 0 3m24s 4h54m +``` + +Here, `False` in the `SUSPEND` column means the CronJob is no longer suspended and will trigger in the next schedule. + +### Restore Into Different Database of the Same Namespace + +If you want to restore the backed up data into a different database of the same namespace, you have to create another `AppBinding` pointing to the desired database. Then, you have to create the `RestoreSession` pointing to the new `AppBinding`. + +### Restore Into Different Namespace + +If you want to restore into a different namespace of the same cluster, you have to create the Repository, backend Secret, AppBinding, in the desired namespace. You can use [Stash kubectl plugin](https://stash.run/docs/{{< param "info.version" >}}/guides/cli/cli/) to easily copy the resources into a new namespace. Then, you have to create the `RestoreSession` object in the desired namespace pointing to the Repository, AppBinding of that namespace. + +### Restore Into Different Cluster + +If you want to restore into a different cluster, you have to install Stash in the desired cluster. Then, you have to install Stash Redis addon in that cluster too. Then, you have to create the Repository, backend Secret, AppBinding, in the desired cluster. Finally, you have to create the `RestoreSession` object in the desired cluster pointing to the Repository, AppBinding of that cluster. + +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo backupconfiguration sample-redis-backup +kubectl delete -n demo restoresession sample-redis-restore +kubectl delete -n demo repository gcs-repo +# delete the database chart +helm delete sample-redis -n demo +``` diff --git a/content/docs/v2024.12.18/addons/redis/overview/images/redis-logical-backup.svg b/content/docs/v2024.12.18/addons/redis/overview/images/redis-logical-backup.svg new file mode 100644 index 0000000000..58769ecaa1 --- /dev/null +++ b/content/docs/v2024.12.18/addons/redis/overview/images/redis-logical-backup.svg @@ -0,0 +1,987 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/addons/redis/overview/images/redis-logical-restore.svg b/content/docs/v2024.12.18/addons/redis/overview/images/redis-logical-restore.svg new file mode 100644 index 0000000000..1ad280075f --- /dev/null +++ b/content/docs/v2024.12.18/addons/redis/overview/images/redis-logical-restore.svg @@ -0,0 +1,857 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/addons/redis/overview/index.md b/content/docs/v2024.12.18/addons/redis/overview/index.md new file mode 100644 index 0000000000..331be49d97 --- /dev/null +++ b/content/docs/v2024.12.18/addons/redis/overview/index.md @@ -0,0 +1,151 @@ +--- +title: Redis Backup & Restore Overview | Stash +description: How Redis Backup & Restore Works in Stash +menu: + docs_v2024.12.18: + identifier: stash-redis-overview + name: How does it work? + parent: stash-redis + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: stash-addons +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# How Stash Backups & Restores Redis Database + +Stash `{{< param "info.version" >}}` supports backup and restore operation of many databases. This guide will give you an overview of how Redis database backup and restore process works in Stash. + +## Logical Backup + +Stash supports taking logical backup of Redis databases using [redis-dump-go](https://github.com/yannh/redis-dump-go). It is the most flexible way to perform a backup and restore, and a good choice when the data size is relatively small. + +### How Logical Backup Works + +The following diagram shows how Stash takes logical backup of a Redis database. Open the image in a new tab to see the enlarged version. + +
+  Redis Backup Overview +
Fig: Redis Logical Backup Overview
+
+ +The backup process consists of the following steps: + +1. At first, a user creates a secret with access credentials of the backend where the backed up data will be stored. + +2. Then, she creates a `Repository` crd that specifies the backend information along with the secret that holds the credentials to access the backend. + +3. Then, she creates a `BackupConfiguration` crd targeting the [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) crd of the desired database. The `BackupConfiguration` object also specifies the `Task` to use to backup the database. + +4. Stash operator watches for `BackupConfiguration` crd. + +5. Once Stash operator finds a `BackupConfiguration` crd, it creates a CronJob with the schedule specified in `BackupConfiguration` object to trigger backup periodically. + +6. On the next scheduled slot, the CronJob triggers a backup by creating a `BackupSession` crd. + +7. Stash operator also watches for `BackupSession` crd. + +8. When it finds a `BackupSession` object, it resolves the respective `Task` and `Function` and prepares a Job definition to backup. + +9. Then, it creates the Job to backup the targeted database. + +10. The backup Job reads necessary information to connect with the database from the `AppBinding` crd. It also reads backend information and access credentials from `Repository` crd and Storage Secret respectively. + +11. Then, the Job dumps the targeted database and uploads the output to the backend. Stash pipes the output of dump command to uploading process. Hence, backup Job does not require a large volume to hold the entire dump output. + +12. Finally, when the backup is complete, the Job sends Prometheus metrics to the Pushgateway running inside Stash operator pod. It also updates the `BackupSession` and `Repository` status to reflect the backup procedure. + +### How Restore from Logical Backup Works + +The following diagram shows how Stash restores a Redis database from a logical backup. Open the image in a new tab to see the enlarged version. + +
+  Database Restore Overview +
Fig: Redis Logical Restore Process Overview
+
+ +The restore process consists of the following steps: + +1. At first, a user creates a `RestoreSession` crd targeting the `AppBinding` of the desired database where the backed up data will be restored. It also specifies the `Repository` crd which holds the backend information and the `Task` to use to restore the target. + +2. Stash operator watches for `RestoreSession` object. + +3. Once it finds a `RestoreSession` object, it resolves the respective `Task` and `Function` and prepares a Job definition to restore. + +4. Then, it creates the Job to restore the target. + +5. The Job reads necessary information to connect with the database from respective `AppBinding` crd. It also reads backend information and access credentials from `Repository` crd and Storage Secret respectively. + +6. Then, the job downloads the backed up data from the backend and injects into the desired database. Stash pipes the downloaded data to the respective database tool to inject into the database. Hence, restore job does not require a large volume to download entire backup data inside it. + +7. Finally, when the restore process is complete, the Job sends Prometheus metrics to the Pushgateway and update the `RestoreSession` status to reflect restore completion. + +## Next Steps + +- Backup your Redis database using Stash following the guide from [here](/docs/v2024.12.18/addons/redis/helm/). diff --git a/content/docs/v2024.12.18/concepts/README.md b/content/docs/v2024.12.18/concepts/README.md new file mode 100644 index 0000000000..bb68a49fd4 --- /dev/null +++ b/content/docs/v2024.12.18/concepts/README.md @@ -0,0 +1,104 @@ +--- +title: Concepts | Stash +menu: + docs_v2024.12.18: + identifier: concepts-readme + name: README + parent: concepts + weight: -1 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: concepts +url: /docs/v2024.12.18/concepts/ +aliases: +- /docs/v2024.12.18/concepts/README/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Concepts + +Concepts help you to learn about the different parts of the Stash and the abstractions it uses. + +This concept section is divided into the following modules: + +- What is Stash? + - [Overview](/docs/v2024.12.18/concepts/what-is-stash/overview/) provides an introduction to Stash. It also give an overview of the features it provides. + - [Architecture](/docs/v2024.12.18/concepts/what-is-stash/architecture/) provides a visual representation of Stash architecture. It also provides a brief overview of the components it uses. + +- Declarative API + - [Repository](/docs/v2024.12.18/concepts/crds/repository/) introduces the concept of `Repository` crd that holds backend information in a Kubernetes native way. + - [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) introduces the concept of `BackupConfiguration` crd that is used to configure backup for a target resource in a Kubernetes native way. + - [BackupBatch](/docs/v2024.12.18/concepts/crds/backupbatch/) introduces the concept of `BackupBatch` crd that is used to setup backup of multiple co-related targets under single configuration. + - [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) introduces the concept of `BackupSession` crd that represents a backup run of a target resource for the respective `BackupConfiguration` or `BackupBatch` object. + - [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) introduces the concept of `RestoreSession` crd that represents a restore run of a target resource. + - [RestoreBatch](/docs/v2024.12.18/concepts/crds/restorebatch/) introduces the concept of `RestoreBatch` crd that allows restore of multiple targets that were backed up using `BackupBatch` under single configuration. + - [Function](/docs/v2024.12.18/concepts/crds/function/) introduces the concept of `Function` crd that represents a step of a backup or restore process. + - [Task](/docs/v2024.12.18/concepts/crds/task/) introduces the concept of `Task` crd which specifies an ordered collection of multiple `Function`s and their parameters that make up a complete backup or restore process. + - [BackupBlueprint](/docs/v2024.12.18/concepts/crds/backupblueprint/) introduces the concept of `BackupBlueprint` crd that specifies a blueprint for `Repository` and `BackupConfiguration` object which provides an option to share backup configuration across similar targets. + - [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) introduces the concept of `AppBinding` crd which holds the information that are necessary to connect with an application like database. + - [Snapshot](/docs/v2024.12.18/concepts/crds/snapshot/) introduces the concept of `Snapshot` object that represents backed up snapshots in a Kubernetes native way. diff --git a/content/docs/v2024.12.18/concepts/_index.md b/content/docs/v2024.12.18/concepts/_index.md new file mode 100644 index 0000000000..9693726673 --- /dev/null +++ b/content/docs/v2024.12.18/concepts/_index.md @@ -0,0 +1,77 @@ +--- +title: Concepts +description: Stash Concepts +menu: + docs_v2024.12.18: + identifier: concepts + name: Concepts + weight: 20 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/concepts/crds/_index.md b/content/docs/v2024.12.18/concepts/crds/_index.md new file mode 100644 index 0000000000..49fb98a8f4 --- /dev/null +++ b/content/docs/v2024.12.18/concepts/crds/_index.md @@ -0,0 +1,78 @@ +--- +title: Declarative API | Stash +description: Declarative API +menu: + docs_v2024.12.18: + identifier: crds + parent: concepts + name: Declarative API + weight: 15 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/concepts/crds/appbinding/appbinding.yaml b/content/docs/v2024.12.18/concepts/crds/appbinding/appbinding.yaml new file mode 100644 index 0000000000..f7c5cd932a --- /dev/null +++ b/content/docs/v2024.12.18/concepts/crds/appbinding/appbinding.yaml @@ -0,0 +1,22 @@ +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: quick-postgres + namespace: demo + labels: + app.kubernetes.io/component: database + app.kubernetes.io/instance: quick-postgres + app.kubernetes.io/managed-by: kubedb.com + app.kubernetes.io/name: postgreses.kubedb.com +spec: + type: kubedb.com/postgres + secret: + name: quick-postgres-auth + clientConfig: + service: + name: quick-postgres + path: / + port: 5432 + query: sslmode=disable + scheme: postgresql + version: "10.2" diff --git a/content/docs/v2024.12.18/concepts/crds/appbinding/index.md b/content/docs/v2024.12.18/concepts/crds/appbinding/index.md new file mode 100644 index 0000000000..cdbe6f1ff2 --- /dev/null +++ b/content/docs/v2024.12.18/concepts/crds/appbinding/index.md @@ -0,0 +1,207 @@ +--- +title: AppBinding Overview +menu: + docs_v2024.12.18: + identifier: appbinding-overview + name: AppBinding + parent: crds + weight: 45 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: concepts +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +> New to Stash? Please start [here](/docs/v2024.12.18/concepts/README). + +# AppBinding + +## What is AppBinding + +Stash needs to know how to connect with a target database and the credentials necessary to access it. This is done via an `AppBinding`. + +An `AppBinding` is a Kubernetes `CustomResourceDefinition`(CRD) which points to an application using either its URL (usually for a non-Kubernetes resident service instance) or a Kubernetes service object (if self-hosted in a Kubernetes cluster), some optional parameters and a credential secret. To learn more about AppBinding and the problems it solves, please read this blog post: [The case for AppBinding](https://blog.byte.builders/post/the-case-for-appbinding). + +If you deploy a database using [KubeDB](https://kubedb.com/docs/0.11.0/concepts/), `AppBinding` object will be created automatically for it. Otherwise, you have to create an `AppBinding` object manually pointing to your desired database. + +## AppBinding CRD Specification + +Like any official Kubernetes resource, an `AppBinding` has `TypeMeta`, `ObjectMeta` and `Spec` sections. However, unlike other Kubernetes resources, it does not have a `Status` section. + +An `AppBinding` object created by `KubeDB` for PostgreSQL database is shown below, + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: quick-postgres + namespace: demo + labels: + app.kubernetes.io/component: database + app.kubernetes.io/instance: quick-postgres + app.kubernetes.io/managed-by: kubedb.com + app.kubernetes.io/name: postgreses.kubedb.com +spec: + type: kubedb.com/postgres + secret: + name: quick-postgres-auth + clientConfig: + service: + name: quick-postgres + path: / + port: 5432 + query: sslmode=disable + scheme: postgresql + version: "10.2" +``` + +Here, we are going to describe the sections of an `AppBinding` crd that are relevant to Stash. + +### AppBinding `Spec` + +An `AppBinding` object has the following fields in the `spec` section that are relevant to Stash: + +#### spec.type + +`spec.type` is an optional field that indicates the type of the app that this `AppBinding` is pointing to. Stash uses this field to resolve the values of `TARGET_APP_TYPE`, `TARGET_APP_GROUP` and `TARGET_APP_RESOURCE` variables of [BackupBlueprint](/docs/v2024.12.18/concepts/crds/backupblueprint/) object. + +This field follows the following format: `/`. The above AppBinding is pointing to a `postgres` resource under `kubedb.com` group. + +Here, the variables are parsed as follows: + +| Variable | Usage | +| --------------------- | --------------------------------------------------------------------------------------------------------------------------------- | +| `TARGET_APP_GROUP` | Represents the application group where the respective app belongs (i.e: `kubedb.com`). | +| `TARGET_APP_RESOURCE` | Represents the resource under that application group that this appbinding represents (i.e: `postgres`). | +| `TARGET_APP_TYPE` | Represents the complete type of the application. It's simply `TARGET_APP_GROUP/TARGET_APP_RESOURCE` (i.e: `kubedb.com/postgres`). | + +#### spec.secret + +`spec.secret` specifies the name of the secret which contains the credentials that are required to access the database. This secret must be in the same namespace as the `AppBinding`. + +This secret must contain the following keys: + +PostgreSQL : + +| Key | Usage | +| ------------------- | --------------------------------------------------- | +| `POSTGRES_USER` | Username of the target database. | +| `POSTGRES_PASSWORD` | Password for the user specified by `POSTGRES_USER`. | + +MySQL : + +| Key | Usage | +| ---------- | ---------------------------------------------- | +| `username` | Username of the target database. | +| `password` | Password for the user specified by `username`. | + +MongoDB : + +| Key | Usage | +| ---------- | ---------------------------------------------- | +| `username` | Username of the target database. | +| `password` | Password for the user specified by `username`. | + +Elasticsearch: + +| Key | Usage | +| ---------------- | ----------------------- | +| `ADMIN_USERNAME` | Admin username | +| `ADMIN_PASSWORD` | Password for admin user | + +#### spec.clientConfig + +`spec.clientConfig` defines how to communicate with the target database. You can use either an URL or a Kubernetes service to connect with the database. You don't have to specify both of them. + +You can configure following fields in `spec.clientConfig` section: + +- **spec.clientConfig.url** + + `spec.clientConfig.url` gives the location of the database, in standard URL form (i.e. `[scheme://]host:port/[path]`). This is particularly useful when the target database is running outside of the Kubernetes cluster. If your database is running inside the cluster, use `spec.clientConfig.service` section instead. + + > Note that, attempting to use a user or basic auth (e.g. `user:password@host:port`) is not allowed. Stash will insert them automatically from the respective secret. Fragments ("#...") and query parameters ("?...") are not allowed either. + +- **spec.clientConfig.service** + + If you are running the database inside the Kubernetes cluster, you can use Kubernetes service to connect with the database. You have to specify the following fields in `spec.clientConfig.service` section if you manually create an `AppBinding` object. + + - **name :** `name` indicates the name of the service that connects with the target database. + - **scheme :** `scheme` specifies the scheme (i.e. http, https) to use to connect with the database. + - **port :** `port` specifies the port where the target database is running. + +- **spec.clientConfig.insecureSkipTLSVerify** + + `spec.clientConfig.insecureSkipTLSVerify` is used to disable TLS certificate verification while connecting with the database. We strongly discourage to disable TLS verification during backup. You should provide the respective CA bundle through `spec.clientConfig.caBundle` field instead. + +- **spec.clientConfig.caBundle** + + `spec.clientConfig.caBundle` is a PEM encoded CA bundle which will be used to validate the serving certificate of the database. + +## Next Steps + +- Learn how to backup/restore databases using Stash from [here](/docs/v2024.12.18/guides/addons/overview/). diff --git a/content/docs/v2024.12.18/concepts/crds/backupbatch/backupbatch.yaml b/content/docs/v2024.12.18/concepts/crds/backupbatch/backupbatch.yaml new file mode 100644 index 0000000000..405ec665a8 --- /dev/null +++ b/content/docs/v2024.12.18/concepts/crds/backupbatch/backupbatch.yaml @@ -0,0 +1,57 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupBatch +metadata: + name: deploy-backup-batch + namespace: demo +spec: + repository: + name: minio-repo + namespace: demo + schedule: "*/3 * * * *" + members: + - target: + alias: db + ref: + apiVersion: apps/v1 + kind: AppBinding + name: wordpress-mysql + task: + name: mysql-backup-8.0.14 + - target: + alias: app + ref: + apiVersion: apps/v1 + kind: Deployment + name: wordpress + volumeMounts: + - name: wordpress-persistent-storage + mountPath: /var/www/html + paths: + - /var/www/html + exclude: + - /var/www/html/my-file.html + - /var/www/html/*.json + executionOrder: Parallel + hooks: + preBackup: + exec: + command: + - /bin/sh + - -c + - echo "Sample PreBackup hook demo" + containerName: my-database-container + postBackup: + exec: + command: + - /bin/sh + - -c + - echo "Sample PostBackup hook demo" + containerName: my-database-container + retryConfig: + maxRetry: 3 + delay: 10m + timeOut: 1h30m + retentionPolicy: + name: 'keep-last-10' + keepLast: 10 + prune: true diff --git a/content/docs/v2024.12.18/concepts/crds/backupbatch/index.md b/content/docs/v2024.12.18/concepts/crds/backupbatch/index.md new file mode 100644 index 0000000000..ff5426c68f --- /dev/null +++ b/content/docs/v2024.12.18/concepts/crds/backupbatch/index.md @@ -0,0 +1,253 @@ +--- +title: BackupBatch Overview +menu: + docs_v2024.12.18: + identifier: backupbatch-overview + name: BackupBatch + parent: crds + weight: 15 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: concepts +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# BackupBatch + +## What is BackupBatch + +Sometimes, a single component may not meet the requirement for your application. For example, in order to deploy a WordPress, you will need a Deployment for the WordPress and another Deployment for a database to store its contents. Now, you may want to backup both of the deployment and database together as they are parts of a single application. + +A `BackupBatch` is a Kubernetes `CustomResourceDefinition`(CRD) which lets you configure backup for multiple co-related components(workload, database, etc.) together. + +## BackupBatch CRD Specification + +Like any official Kubernetes resource, a `BackupBatch` has `TypeMeta`, `ObjectMeta`, `Spec` and `Status` sections. + +A sample `BackupBatch` object to backup multiple co-related components is shown below: + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupBatch +metadata: + name: deploy-backup-batch + namespace: demo +spec: + repository: + name: minio-repo + namespace: demo + schedule: "*/3 * * * *" + members: + - target: + alias: db + ref: + apiVersion: apps/v1 + kind: AppBinding + name: wordpress-mysql + task: + name: mysql-backup-8.0.14 + - target: + alias: app + ref: + apiVersion: apps/v1 + kind: Deployment + name: wordpress + volumeMounts: + - name: wordpress-persistent-storage + mountPath: /var/www/html + paths: + - /var/www/html + exclude: + - /var/www/html/my-file.html + - /var/www/html/*.json + executionOrder: Parallel + hooks: + preBackup: + exec: + command: + - /bin/sh + - -c + - echo "Sample PreBackup hook demo" + containerName: my-database-container + postBackup: + exec: + command: + - /bin/sh + - -c + - echo "Sample PostBackup hook demo" + containerName: my-database-container + retryConfig: + maxRetry: 3 + delay: 10m + timeOut: 1h30m + retentionPolicy: + name: 'keep-last-10' + keepLast: 10 + prune: true +``` + +Here, we are going to describe the various sections of `BackupBatch` crd. + +### BackupBatch `Spec` + +A `BackupBatch` object has the following fields in the `spec` section. + +#### spec.driver + +`spec.driver` indicates the mechanism used to backup. Currently, Stash supports `Restic` and `VolumeSnapshotter` as drivers. The default value of this field is `Restic`. For more details, please see [here](/docs/v2024.12.18/concepts/crds/backupconfiguration/#specdriver). + +#### spec.repository + +`spec.repository.name` indicates the `Repository` crd name that holds necessary backend information where the backed up data will be stored. + +#### spec.schedule + +`spec.schedule` is a [cron expression](https://en.wikipedia.org/wiki/Cron) that specifies the schedule of backup. Stash creates a Kubernetes [CronJob](https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/) with this schedule. + +#### spec.executionOrder + +`spec.executionOrder` specifies whether Stash should backup the targets sequentially or parallelly. If `spec.executionOrder` is set to `Parallel`, Stash will start backup of all the targets simultaneously. If it is set to `Sequential`, Stash will not start backup of a target until all the previous members have completed their backup process. The default value of this field is `Parallel`. + +#### spec.members + +`spec.members` field specifies a list of targets to backup. Each member consists of the following fields: + +- **target :** Each member has a target specification. The target specification of a member is the same as the target specification of a `BackupConfiguration` explained [here](/docs/v2024.12.18/concepts/crds/backupconfiguration/#spectarget). + +- **task :** `task` specifies the name and parameters of the [Task](/docs/v2024.12.18/concepts/crds/task/) crd to use to backup the target. For more details, please see [here](/docs/v2024.12.18/concepts/crds/backupconfiguration/#spectask). + +- **runtimeSettings :** `runtimeSettings` allows to configure runtime environment for the backup sidecar or job. You can specify runtime settings at both pod level and container level. For more details, please see [here](/docs/v2024.12.18/concepts/crds/backupconfiguration/#specruntimesettings). + +- **tempDir :** Stash mounts an `emptyDir` for holding temporary files. It is also used for `caching` for faster backup performance. You can configure the `emptyDir` using `tempDir` section. You can also disable `caching` using this field. For more details, please see [here](/docs/v2024.12.18/concepts/crds/backupconfiguration/#spectempdir). + +- **interimVolumeTemplate :** For some targets (i.e. some databases), Stash can't directly pipe the dumped data to the uploading process. In this case, it has to store the dumped data temporarily before uploading to the backend. `interimVolumeTemplate` specifies a PVC template for holding those data temporarily. Stash will create a PVC according to the template and use it to store the data temporarily. This PVC will be deleted according to the [backupHistoryLimit](#specbackuphistorylimit). For more details, please see [here](/docs/v2024.12.18/concepts/crds/backupconfiguration/#specinterimvolumetemplate). + +- **hooks :** Each member has its own hook field which allows you to execute member-specific pre-backup or post-backup hooks. For more details about hooks, please visit [here](/docs/v2024.12.18/concepts/crds/backupconfiguration/#spechooks). + +#### spec.hooks + +`spec.hooks` allows performing some global actions before and after the backup process of the members. You can send HTTP requests to a remote server via `httpGet` or `httpPost`. You can check whether a TCP port is open using `tcpSocket` hooks. You can also execute some commands using `exec` hook. + +- **spec.hooks.preBackup:** `spec.hooks.preBackup` hooks are executed on each backup session before taking backup of any of the members. +- **spec.hooks.postBackup:** `spec.hooks.postBackup` hooks are executed on each backup session after taking backup of all the members. + +For more details on how hooks work in Stash and how to configure different types of hook, please visit [here](/docs/v2024.12.18/guides/hooks/overview/). + +#### spec.runtimeSettings + +`spec.runtimeSettings` This runtime settings is applicable for CronJob(used to create `BackupSession`) only. For more details, please see [here](/docs/v2024.12.18/concepts/crds/backupconfiguration/#specruntimesettings). + +#### spec.backupHistoryLimit + +`spec.backupHistoryLimit` specifies the number of `BackupSession` and its associate resources (Job, PVC etc.) to keep for debugging purposes. The default value of this field is 1. Stash will clean up the old `BackupSession` and it's associate resources after each backup session according to `backupHistoryLimit`. + +#### spec.paused + +`spec.paused` can be used as `enable/disable` switch for backup. If it is set `true`, Stash will not take any backup of the target specified by this BackupBatch. + +#### spec.retentionPolicy + +`spec.retentionPolicy` specifies the policy to follow for cleaning old snapshots. For more details, please see [here](/docs/v2024.12.18/concepts/crds/backupconfiguration/#specretentionpolicy). + + +#### spec.retryConfig + +`spec.retryConfig` specifies a retry logic for failed backup. For more details, please see [here](/docs/v2024.12.18/concepts/crds/backupconfiguration/#specretryconfig). + +#### spec.timeOut + +`spec.timeOut` specifies the maximum duration of the backup. For more details, please see [here](/docs/v2024.12.18/concepts/crds/backupconfiguration/#spectimeout). + +### BackupBatch `Status` + +A `BackupBatch` object has the following fields in the `status` section. + +- **observedGeneration :** The most recent generation observed by the `BackupBatch` controller. + +- **conditions :** The `status.conditions` shows current backup setup condition for this BackupBatch. The following conditions are set by the Stash operator: + +| Condition Type | Usage | +| -------------------- | -------------------------------------------------------------------- | +| `RepositoryFound` | Indicates whether the respective Repository object was found or not. | +| `BackendSecretFound` | Indicates whether the respective backend secret was found or not. | +| `CronJobCreated` | Indicates whether the backup triggering CronJob was created or not. | + +- **memberConditions :** Shows current backup setup condition of the members of a `BackupBatch`. Each entry has the following two fields: + - **target :** Points to the respective target whose condition is shown here. + - **conditions:** Shows the current backup setup condition of this member. + +The following conditions are set for the members of a `BackupBatch`. + +| Condition Type | Usage | +| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `BackupTargetFound` | Indicates whether the backup target was found or not. | +| `StashSidecarInjected` | Indicates whether `stash` sidecar was injected into the targeted workload or not. This condition is set only for the target that uses the sidecar model. | + +## Next Steps + +- Learn how to configure `BackupBatch` to backup data from [here](/docs/v2024.12.18/guides/batch-backup/overview/). diff --git a/content/docs/v2024.12.18/concepts/crds/backupblueprint/backupblueprint.yaml b/content/docs/v2024.12.18/concepts/crds/backupblueprint/backupblueprint.yaml new file mode 100644 index 0000000000..e93f1aa854 --- /dev/null +++ b/content/docs/v2024.12.18/concepts/crds/backupblueprint/backupblueprint.yaml @@ -0,0 +1,35 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupBlueprint +metadata: + name: workload-backup-blueprint +spec: + # ============== Blueprint for Repository ========================== + backend: + gcs: + bucket: stash-backup + prefix: stash/${TARGET_NAMESPACE}/${TARGET_KIND}/${TARGET_NAME} + storageSecretName: gcs-secret + wipeOut: false + # backupNamespace: stash + # ============== Blueprint for BackupConfiguration ================= + schedule: "* * * * *" + backupHistoryLimit: 3 + timeOut: 30m + retryConfig: + maxRetry: 3 + delay: 10m + # task: # no task section is required for workload data backup + # name: workload-backup + runtimeSettings: + container: + securityContext: + runAsUser: 2000 + runAsGroup: 2000 + tempDir: + medium: "Memory" + sizeLimit: "1Gi" + disableCaching: false + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/concepts/crds/backupblueprint/index.md b/content/docs/v2024.12.18/concepts/crds/backupblueprint/index.md new file mode 100644 index 0000000000..a5ffcabb43 --- /dev/null +++ b/content/docs/v2024.12.18/concepts/crds/backupblueprint/index.md @@ -0,0 +1,200 @@ +--- +title: BackupBlueprint Overview +menu: + docs_v2024.12.18: + identifier: backupblueprint-overview + name: BackupBlueprint + parent: crds + weight: 40 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: concepts +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +> New to Stash? Please start [here](/docs/v2024.12.18/concepts/README). + +# BackupBlueprint + +## What is BackupBlueprint + +Stash uses 1-1 mapping among `Repository`, `BackupConfiguration` and the target. So, whenever you want to backup a target(workload/PV/PVC/database), you have to create a `Repository` and `BackupConfiguration` object. This could become tiresome when you are trying to backup similar types of target and the `Repository` and `BackupConfiguration` has only slight difference. To mitigate this problem, Stash provides a way to specify a blueprint for these two objects via `BackupBlueprint` crd. + +A `BackupBlueprint` is a Kubernetes `CustomResourceDefinition`(CRD) which specifies a blueprint for `Repository` and `BackupConfiguration` in a Kubernetes native way. + +You have to create only one `BackupBlueprint` for all similar types of workloads (i.e. Deployment, DaemonSet, StatefulSet etc.). Then, you just need to add some annotations in the target workload. Stash will automatically create respective `Repository`, `BackupConfiguration` object using the blueprint. In Stash parlance, we call this process as **auto backup**. + +## BackupBlueprint CRD Specification + +Like any official Kubernetes resource, a `BackupBlueprint` has `TypeMeta`, `ObjectMeta` and `Spec` sections. However, unlike other Kubernetes resources, it does not have a `Status` section. + +A sample `BackupBlueprint` object to auto backup the volumes of a Deployment is shown below, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupBlueprint +metadata: + name: workload-backup-blueprint +spec: + # ============== Blueprint for Repository ========================== + backend: + gcs: + bucket: stash-backup + prefix: stash/${TARGET_NAMESPACE}/${TARGET_KIND}/${TARGET_NAME} + storageSecretName: gcs-secret + wipeOut: false + # backupNamespace: stash + # ============== Blueprint for BackupConfiguration ================= + schedule: "* * * * *" + backupHistoryLimit: 3 + timeOut: 30m + retryConfig: + maxRetry: 3 + delay: 10m + # task: # no task section is required for workload data backup + # name: workload-backup + runtimeSettings: + container: + securityContext: + runAsUser: 2000 + runAsGroup: 2000 + tempDir: + medium: "Memory" + sizeLimit: "1Gi" + disableCaching: false + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +The sample `BackupBlueprint` that has been shown above can be used to backup Deployments, DaemonSets, StatefulSets, ReplicaSets and ReplicationControllers. You only have to add some annotations to these workloads. For more details on how auto backup works in Stash, please visit [here](/docs/v2024.12.18/guides/auto-backup/overview/). + +Here, we are going to describe the various sections of `BackupBlueprint` crd. + +### BackupBlueprint `Spec` + +We can divide BackupBlueprint's `.spec` section into two parts. One part specifies a blueprint for `Repository` object and other specifies a blueprint for `BackupConfiguration` object. + +#### Repository Blueprint + +You can configure `Repository` blueprint using `spec.backend` field and `spec.wipeOut` field. + +- **spec.backend :** `spec.backend` field is backend specification similar to [spec.backend](/docs/v2024.12.18/concepts/crds/repository/#specbackend) field of a `Repository` crd. There is only one difference. You can now templatize `prefix` section (`subPath` for local volume) of the backend to store backed up data of different workloads at different directory. You can use the following variables to templatize `spec.backend` field: + +| Variable | Usage | +| --------------------- | ------------------------------------------------------------------------------------------------------------------------------- | +| `TARGET_API_VERSION` | API version of the target | +| `TARGET_KIND` | Resource kind of the target | +| `TARGET_NAMESPACE` | Namespace of the target | +| `TARGET_NAME` | Name of the target | +| `TARGET_RESOURCE` | Plural form of the target kind. i.e. `deployments`, `statefulsets` etc. | + +The following variables are available only for database backup. + +| Variable | Usage | +| --------------------- | ------------------------------------------------------------------------------------------------------------------------------- | +| `TARGET_APP_GROUP` | Represents the application group where the respective app belongs (i.e: `kubedb.com`). | +| `TARGET_APP_RESOURCE` | Represents the resource kind under that application group that the respective app works with (i.e: `postgres`). | +| `TARGET_APP_TYPE` | Represents the total types of the application. It's simply `TARGET_APP_GROUP/TARGET_APP_RESOURCE` (i.e: `kubedb.com/postgres`). | + + If you use the sample `BackupBlueprint` that has been shown above to backup a Deployment named `my-deploy` of `test` namespace, the backed up data will be stored in `stash/test/deployment/my-deploy` directory of the `stash-backup` bucket. Similarly, if you want to backup a StatefulSet with name `my-sts` of same namespace, the backed up data will be stored in `/stash/test/statefulset/my-sts` directory of the backend. + +- **spec.backend.\.storageSecretName:** specifies the name of the secret that holds the access credentials to the backend. + +>Note: `BackupBlueprint` is a non-namespaced crd. So, you can use a `BackupBlueprint` to backup targets in multiple namespaces. However, Storage Secret is a namespaced object. So, you have to manually create the secret in each namespace where you have a target for backup. + +- **spec.wipeOut :** `spec.wipeOut` indicates whether Stash should delete the respective backed up data from the backend if a user deletes a `Repository` crd. For more details, please visit [here](/docs/v2024.12.18/concepts/crds/repository/#specwipeout). + +#### BackupConfiguration Blueprint + +You can provide a blueprint for the `BackupConfiguration` object that will be created for respective target using the following fields: + +- **spec.schedule :** `spec.schedule` is the schedule that will be used to create `BackupConfiguration` for respective target. For more details, please visit [here](/docs/v2024.12.18/concepts/crds/backupconfiguration/#specschedule). + +- **spec.backupHistoryLimit :** `spec.backupHistoryLimit` specifies a limit for backup history to keep for debugging purposes. For more details, please visit [here](/docs/v2024.12.18/concepts/crds/backupconfiguration/#specbackuphistroylimit). + +- **spec.backupNamespace :** `spec.backupNamespace` specifies the namespace where the backup resources (i.e. BackupConfiguration, BackupSession, Job, Repository etc.) will be created. + +- **spec.retryConfig :** `spec.retryConfig` specifies a retry logic for failed backup. For more details, please visit [here](/docs/v2024.12.18/concepts/crds/backupconfiguration/#specretryconfig). + +- **spec.task :** `spec.task` specifies the name and the parameters of [Task](/docs/v2024.12.18/concepts/crds/task/) to use to backup the target. You can template the name field with `TARGET_APP_VERSION` variable for database backup. Stash will replace this variable with respective database version. This will allow you to backup multiple database versions with the same `BackupBlueprint`. For more details, please check the following [guide](/docs/v2024.12.18/guides/auto-backup/database/). + +- **spec.runtimeSettings :** `spec.runtimeSettings` allows to configure runtime environment for backup sidecar or job. For more details, please visit [here](/docs/v2024.12.18/concepts/crds/backupconfiguration/#specruntimesettings). + +- **spec.tempDir :** `spec.tempDir` specifies the temporary volume setting that will be used to create respective `BackupConfiguration` object. For more details, please visit [here](/docs/v2024.12.18/concepts/crds/backupconfiguration/#spectempdir). + +- **spec.interimVolumeTemplate :** `spec.interimVolumeTemplate` specifies a PVC template for holding data temporarily before uploading to the backend. For more details, please visit [here](/docs/v2024.12.18/concepts/crds/backupconfiguration/#specinterimvolumetemplate). + +- **spec.retentionPolicy :** `spec.retentionPolicy` specifies the retention policies that will be used to create respective `BackupConfiguration` object. For more details, please visit [here](/docs/v2024.12.18/concepts/crds/backupconfiguration/#specretentionpolicy). + +## Next Steps + +- Learn how to use `BackupBlueprint` for auto backup of workloads data from [here](/docs/v2024.12.18/guides/auto-backup/workload/). +- Learn how to use `BackupBlueprint` for auto backup of database from [here](/docs/v2024.12.18/guides/auto-backup/database/). +- Learn how to use `BackupBlueprint` for auto backup of stand-alone PVC from [here](/docs/v2024.12.18/guides/auto-backup/pvc/). diff --git a/content/docs/v2024.12.18/concepts/crds/backupconfiguration/backupconfiguration.yaml b/content/docs/v2024.12.18/concepts/crds/backupconfiguration/backupconfiguration.yaml new file mode 100644 index 0000000000..f8ee28a25a --- /dev/null +++ b/content/docs/v2024.12.18/concepts/crds/backupconfiguration/backupconfiguration.yaml @@ -0,0 +1,77 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: demo-backup + namespace: demo +spec: + driver: Restic + repository: + name: local-repo + namespace: demo + # task: + # name: workload-backup # task field is not required for workload data backup but it is necessary for database backup. + schedule: "* * * * *" # backup at every minutes + paused: false + backupHistoryLimit: 3 + timeOut: 2h + target: + alias: app-data + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + paths: + - /source/data + exclude: + - /source/data/not-important.txt + - /source/data/*.html + - /source/data/tmp/* + volumeMounts: + - name: source-data + mountPath: /source/data + hooks: + preBackup: + exec: + command: + - /bin/sh + - -c + - echo "Sample PreBackup hook demo" + containerName: my-app-container + postBackup: + executionPolicy: Always + exec: + command: + - /bin/sh + - -c + - echo "Sample PostBackup hook demo" + containerName: my-app-container + runtimeSettings: + container: + resources: + requests: + memory: 256M + limits: + memory: 256M + securityContext: + runAsUser: 2000 + runAsGroup: 2000 + nice: + adjustment: 5 + ionice: + class: 2 + classData: 4 + pod: + imagePullSecrets: + - name: my-private-registry-secret + serviceAccountName: my-backup-svc + tempDir: + medium: "Memory" + sizeLimit: "2Gi" + disableCaching: false + retryConfig: + maxRetry: 3 + delay: 10m + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/concepts/crds/backupconfiguration/index.md b/content/docs/v2024.12.18/concepts/crds/backupconfiguration/index.md new file mode 100644 index 0000000000..f04c69d054 --- /dev/null +++ b/content/docs/v2024.12.18/concepts/crds/backupconfiguration/index.md @@ -0,0 +1,363 @@ +--- +title: BackupConfiguration Overview +menu: + docs_v2024.12.18: + identifier: backupconfiguration-overview + name: BackupConfiguration + parent: crds + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: concepts +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +> New to Stash? Please start [here](/docs/v2024.12.18/concepts/README). + +# BackupConfiguration + +## What is BackupConfiguration + +A `BackupConfiguration` is a Kubernetes `CustomResourceDefinition`(CRD) which specifies the backup target, parameters(schedule, retention policy etc.) and a `Repository` object that holds snapshot storage information in a Kubernetes native way. + +You have to create a `BackupConfiguration` object for each backup target. A backup target can be a workload, database or a PV/PVC. + +## BackupConfiguration CRD Specification + +Like any official Kubernetes resource, a `BackupConfiguration` has `TypeMeta`, `ObjectMeta` and `Spec` sections. However, unlike other Kubernetes resources, it does not have a `Status` section. + +A sample `BackupConfiguration` object to backup the volumes of a Deployment is shown below: + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: demo-backup + namespace: demo +spec: + driver: Restic + repository: + name: local-repo + namespace: demo + # task: + # name: workload-backup # task field is not required for workload data backup but it is necessary for database backup. + schedule: "* * * * *" # backup at every minutes + paused: false + backupHistoryLimit: 3 + timeOut: 2h + target: + alias: app-data + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + paths: + - /source/data + exclude: + - /source/data/not-important.txt + - /source/data/*.html + - /source/data/tmp/* + volumeMounts: + - name: source-data + mountPath: /source/data + hooks: + preBackup: + exec: + command: + - /bin/sh + - -c + - echo "Sample PreBackup hook demo" + containerName: my-app-container + postBackup: + executionPolicy: Always + exec: + command: + - /bin/sh + - -c + - echo "Sample PostBackup hook demo" + containerName: my-app-container + runtimeSettings: + container: + resources: + requests: + memory: 256M + limits: + memory: 256M + securityContext: + runAsUser: 2000 + runAsGroup: 2000 + nice: + adjustment: 5 + ionice: + class: 2 + classData: 4 + pod: + imagePullSecrets: + - name: my-private-registry-secret + serviceAccountName: my-backup-svc + tempDir: + medium: "Memory" + sizeLimit: "2Gi" + disableCaching: false + retryConfig: + maxRetry: 3 + delay: 10m + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Here, we are going to describe the various sections of `BackupConfiguration` crd. + +### BackupConfiguration `Spec` + +A `BackupConfiguration` object has the following fields in the `spec` section. + +#### spec.driver + +`spec.driver` indicates the mechanism used to backup a target. Currently, Stash supports `Restic` and `VolumeSnapshotter` as drivers. The default value of this field is `Restic`. + +| Driver | Usage | +| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `Restic` | Used to backup workload data, persistent volumes data and databases. It uses [restic](https://restic.net) to backup the target. | +| `VolumeSnapshotter` | Used to take snapshot of PersistentVolumeClaims of a targeted workload. It leverages Kubernetes [VolumeSnapshot](https://kubernetes.io/docs/concepts/storage/volume-snapshots/) crd and CSI driver to snapshot the PVCs. | + +#### spec.target + +`spec.target` field indicates the target for backup runs. This field consists of the following sub-fields: + +- **spec.target.alias :** The alias is used as an identifer of the backed up data in the backend. This is particularly useful for `BackupBatch` where multiple targets are backed up into a single repository. + +- **spec.target.ref :** `spec.target.ref` refers to the target of backup. You have to specify `apiVersion`, `kind` and `name` of the target. Stash will use this information to inject a sidecar to the target or to create a backup job for it. + +- **spec.target.paths :** `spec.target.paths` specifies list of file paths to backup. + +- **spec.target.exclude :** Specifies a list of pattern for the files that should be ignored during backup. Stash will not backup the files that matches these patterns. + +- **spec.target.volumeMounts :** `spec.target.volumeMounts` are the list of volumes and their `mountPath`s that contain the target file paths. Stash will mount these volumes inside a sidecar container or a backup job. + +- **spec.target.snapshotClassName:** `spec.target.snapshotClassName` indicates the [VolumeSnapshotClass](https://kubernetes.io/docs/concepts/storage/volume-snapshot-classes/) to use for volume snasphotting. Use this field only if `spec.driver` is set to `VolumeSnapshotter`. + +#### spec.repository + +`spec.repository` specifies the name and namespace of the Repository CR that holds the necessary backend information where the backed up data will be stored. + +- `spec.repository.name` specifies the name of the Repository CR. +- `spec.repository.namespace` specifies the namespace of the Repository. If you don't provide this field, Stash will look for the Repository CR in the same namespace as the BackupConfiguration. + +#### spec.schedule + +`spec.schedule` is a [cron expression](https://en.wikipedia.org/wiki/Cron) that specifies the schedule of backup. Stash creates a Kubernetes [CronJob](https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/) with this schedule. + +#### spec.backupHistoryLimit + +`spec.backupHistoryLimit` specifies the number of `BackupSession` and its associate resources (Job, PVC etc.) to keep for debugging purposes. The default value of this field is 1. Stash will cleanup the old `BackupSession` and it's associate resources after each backup session according to `backupHistoryLimit`. Stash will always keep the last completed BackupSession when `backuphistorylimit>0`. It will keep the last completed BackupSession even if it exceeds the history limit. This will help to keep the backup history when a backup gets skipped due to another running backup. + +#### spec.timeOut + +`spec.timeOut` specifies the maximum amount of time to wait for the backup to complete. If the backup doesn't complete within this time limit, Stash will mark the respective BackupSession as `Failed`. You can specify the timeout in the following format: + +- Seconds `30s` +- Minutes `10m` +- Hours `1h` +- Combination of seconds, minutes, and hours `10m30s`, `1h30m` etc. + +Stash does not support providing days (`d`) in the `timeOut` field. Use the equivalent hours instead. + +#### spec.task + +`spec.task` specifies the name and parameters of the [Task](/docs/v2024.12.18/concepts/crds/task/) crd to use to backup the target. + +- **spec.task.name:** `spec.task.name` indicates the name of the `Task` to use for this backup process. +- **spec.task.params:** `spec.task.params` is an array of custom parameters to use to configure the task. + +> `spec.task` section is not required for backing up workload data (i.e. Deployment, DaemonSet, StatefulSet etc.). However, it is necessary for backing up databases and stand-alone PVCs. + +#### spec.paused + +`spec.paused` can be used as `enable/disable` switch for backup. If it is set `true`, Stash will not take any backup of the target specified by this BackupConfiguration. + +#### spec.hooks + +`spec.hooks` allows performing some actions before and after the backup process. You can send HTTP requests to a remote server via `httpGet` or `httpPost` hooks. You can check whether a TCP socket is open using `tcpSocket` hook. You can also execute some commands into your application pod using `exec` hook. + +- **spec.hooks.preBackup:** `spec.hooks.preBackup` hooks are executed before the backup process. +- **spec.hooks.postBackup:** `spec.hooks.postBackup` hooks are executed after the backup process. Unlike the `preBackup` hook, `postBackup` hook has an extra field named `executionPolicy` which let you execute hook based on the backup status. Currently, it support the following values: + - `Always`: The hook will be executed after the backup process no matter the backup has failed or succeeded. This is the default behavior. + - `OnSuccess`: The hook will be executed after the backup process only if the backup has succeeded. + - `OnFailure`: The hook will be executed after the backup process only if the backup has failed. + - `OnFinalRetryFailure`: The hook will be executed after the backup process only if the backup has failed with no more retry attempts left. +For more details on how hooks work in Stash and how to configure different types of hook, please visit [here](/docs/v2024.12.18/guides/hooks/overview/). + +#### spec.runtimeSettings + +`spec.runtimeSettings` allows to configure runtime environment for the backup sidecar or job. You can specify runtime settings at both pod level and container level. + +- **spec.runtimeSettings.container** + + `spec.runtimeSettings.container` is used to configure the backup sidecar/job at container level. You can configure the following container level parameters: + +| Field | Usage | +| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `resources` | Compute resources required by the sidecar container or backup job. To learn how to manage resources for containers, please visit [here](https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/). | +| `livenessProbe` | Periodic probe of backup sidecar/job container's liveness. Container will be restarted if the probe fails. | +| `readinessProbe` | Periodic probe of backup sidecar/job container's readiness. Container will be removed from service endpoints if the probe fails. | +| `lifecycle` | Actions that the management system should take in response to container lifecycle events. | +| `securityContext` | Security options that backup sidecar/job's container should run with. For more details, please visit [here](https://kubernetes.io/docs/concepts/policy/security-context/). | +| `nice` | Set CPU scheduling priority for backup process. For more details about `nice`, please visit [here](https://www.askapache.com/optimize/optimize-nice-ionice/#nice). | +| `ionice` | Set I/O scheduling class and priority for backup process. For more details about `ionice`, please visit [here](https://www.askapache.com/optimize/optimize-nice-ionice/#ionice). | +| `env` | A list of the environment variables to set in the sidecar container or backup job's container. | +| `envFrom` | This allows to set environment variables to the container that will be created for this function from a Secret or ConfigMap. | + +- **spec.runtimeSettings.pod** + + `spec.runtimeSettings.pod` is used to configure backup job in pod level. You can configure the following pod level parameters, + +| Field | Usage | +| ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `serviceAccountName` | Name of the `ServiceAccount` to use for the backup job. Stash sidecar will use the same `ServiceAccount` as the target workload. | +| `nodeSelector` | Selector which must be true for backup job pod to fit on a node. | +| `automountServiceAccountToken` | Indicates whether a service account token should be automatically mounted into the backup pod. | +| `nodeName` | `nodeName` is used to request to schedule backup job's pod onto a specific node. | +| `securityContext` | Security options that backup job's pod should run with. For more details, please visit [here](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/). | +| `imagePullSecrets` | A list of secret names in the same namespace that will be used to pull image from private Docker registry. For more details, please visit [here](https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/). | +| `affinity` | Affinity and anti-affinity to schedule backup job's pod on a desired node. For more details, please visit [here](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity). | +| `schedulerName` | Name of the scheduler that should dispatch the backup job. | +| `tolerations` | Taints and Tolerations to ensure that backup job's pod is not scheduled in inappropriate nodes. For more details about `toleration`, please visit [here](https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/). | +| `priorityClassName` | Indicates the backup job pod's priority class. For more details, please visit [here](https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/). | +| `priority` | Indicates the backup job pod's priority value. | +| `readinessGates` | Specifies additional conditions to be evaluated for Pod readiness. For more details, please visit [here](https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-readiness-gate). | +| `runtimeClassName` | RuntimeClass is used for selecting the container runtime configuration. For more details, please visit [here](https://kubernetes.io/docs/concepts/containers/runtime-class/) | +| `enableServiceLinks` | EnableServiceLinks indicates whether information about services should be injected into pod's environment variables. | + +#### spec.tempDir + +Stash mounts an `emptyDir` for holding temporary files. It is also used for `caching` for faster backup performance. You can configure the `emptyDir` using `spec.tempDir` section. You can also disable `caching` using this field. The following fields are configurable in `spec.tempDir` section: + +- **spec.tempDir.medium :** Specifies the type of storage medium should back this directory. +- **spec.tempDir.sizeLimit :** Maximum limit of storage for this volume. +- **spec.tempDir.disableCaching :** Disable caching while backup. This may negatively impact backup performance. This is set to `false` by default. + +#### spec.interimVolumeTemplate + +For some targets (i.e. some databases), Stash can't directly pipe the dumped data to the uploading process. In this case, it has to store the dumped data temporarily before uploading to the backend. `spec.interimVolumeTemplate` specifies a PVC template for holding those data temporarily. Stash will create a PVC according to the template and use it to store the data temporarily. This PVC will be deleted according to the [spec.backupHistoryLimit](#specbackuphistorylimit). + +>Note that the usage of this field is different than `spec.tempDir` which is used for caching purpose. Stash has introduced this field because the `emptyDir` volume that is used for `spec.tempDir` does not play nice with large databases( i.e. 100Gi database). Also, it provides debugging capability as Stash keeps it until it hits the limit specified in `spec.backupHistoryLimit`. + +#### spec.retryConfig + +`spec.retryConfig` is an optional field the let users to specify a retry logic for failed backup. It has the following fields: + +- `spec.retryConfig.maxRetry` specifies the maximum number of times Stash should retry a failed backup. +- `spec.retryConfig.delay` specifies the amount of time to wait before retrying a failed backup. You can specify the delay in the following format: + - Seconds `30s` + - Minutes `10m` + - Hours `1h` + - Combination of seconds, minutes, and hours `10m30s`, `1h30m` etc. + + Stash does not support providing days (`d`) in the `delay` field. Use the equivalent hours instead. + +#### spec.retentionPolicy + +`spec.retentionPolicy` specifies the policy to follow for cleaning old snapshots. Following options are available to configure retention policy: + +| Policy | Value | `restic` forget command flag | Description | +| ------------- | ------- | ---------------------------- | -------------------------------------------------------------------------------------------------- | +| `name` | string | | Name of retention policy. You can provide any name. | +| `keepLast` | integer | --keep-last n | Never delete the **n** last (most recent) snapshots. | +| `keepHourly` | integer | --keep-hourly n | For the last **n** hours in which a snapshot was made, keep only the last snapshot for each hour. | +| `keepDaily` | integer | --keep-daily n | For the last **n** days which have one or more snapshots, only keep the last one for that day. | +| `keepWeekly` | integer | --keep-weekly n | For the last **n** weeks which have one or more snapshots, only keep the last one for that week. | +| `keepMonthly` | integer | --keep-monthly n | For the last **n** months which have one or more snapshots, only keep the last one for that month. | +| `keepYearly` | integer | --keep-yearly n | For the last **n** years which have one or more snapshots, only keep the last one for that year. | +| `keepTags` | array | --keep-tag | Keep all snapshots which have all tags specified by this option (can be specified multiple times). | +| `prune` | bool | --prune | If set `true`, Stash will cleanup unreferenced data from the backend. | +| `dryRun` | bool | --dry-run | Stash will not remove anything but print which snapshots would be removed. | + + +### BackupConfiguration `Status` + +A `BackupConfiguration` object has the following fields in the `status` section. + +- **observedGeneration :** The most recent generation observed by the `BackupConfiguration` controller. + +- **conditions :** The `spec.conditions` shows current backup setup condition for this BackupConfiguration. The following conditions are set by the Stash operator: + +| Condition Type | Usage | +| -------------------- | -------------------------------------------------------------------- | +| `RepositoryFound` | Indicates whether the respective Repository object was found or not. | +| `BackendSecretFound` | Indicates whether the respective backend secret was found or not. | +| `CronJobCreated` | Indicates whether the backup triggering CronJob was created or not. | +| `ValidationPassed` | Indicates whether the resource has passed validation checks or not. | + +## Next Steps + +- Learn how to configure `BackupConfiguration` to backup workloads data from [here](/docs/v2024.12.18/guides/workloads/overview/). +- Learn how to configure `BackupConfiguration` to backup databases from [here](/docs/v2024.12.18/guides/addons/overview/). +- Learn how to configure `BackupConfiguration` to backup stand-alone PVC from [here](/docs/v2024.12.18/guides/volumes/overview/). diff --git a/content/docs/v2024.12.18/concepts/crds/backupsession/backupsession.yaml b/content/docs/v2024.12.18/concepts/crds/backupsession/backupsession.yaml new file mode 100644 index 0000000000..a244b93fc7 --- /dev/null +++ b/content/docs/v2024.12.18/concepts/crds/backupsession/backupsession.yaml @@ -0,0 +1,90 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupSession +metadata: + creationTimestamp: "2020-07-25T17:41:28Z" + labels: + app: stash + stash.appscode.com/invoker-name: wordpress-backup + stash.appscode.com/invoker-type: BackupBatch + name: wordpress-backup-1578458376 + namespace: demo +spec: + invoker: + apiGroup: stash.appscode.com + kind: BackupBatch + name: wordpress-backup + retryLeft: 2 +status: + conditions: + - lastTransitionTime: "2020-07-25T17:41:31Z" + message: Repository exist in the backend. + reason: BackendRepositoryFound + status: "True" + type: BackendRepositoryInitialized + - lastTransitionTime: "2020-07-25T17:41:48Z" + message: Successfully applied retention policy. + reason: SuccessfullyAppliedRetentionPolicy + status: "True" + type: RetentionPolicyApplied + - lastTransitionTime: "2020-07-25T17:41:50Z" + message: Repository integrity verification succeeded. + reason: SuccessfullyVerifiedRepositoryIntegrity + status: "True" + type: RepositoryIntegrityVerified + - lastTransitionTime: "2020-07-25T17:41:50Z" + message: Successfully pushed repository metrics. + reason: SuccessfullyPushedRepositoryMetrics + status: "True" + type: RepositoryMetricsPushed + phase: Succeeded + sessionDuration: 22.575920065s + sessionDeadline: "2020-07-25T17:46:28Z" + targets: + - phase: Succeeded + preBackupActions: + - InitializeBackendRepository + ref: + apiVersion: apps/v1 + kind: Deployment + name: wordpress + stats: + - duration: 831.018039ms + hostname: app + phase: Succeeded + snapshots: + - fileStats: + modifiedFiles: 0 + newFiles: 1 + totalFiles: 1 + unmodifiedFiles: 0 + name: b54ee4a0 + path: /var/www/html + processingTime: "0:00" + totalSize: 0 B + uploaded: 711 B + totalHosts: 1 + - phase: Succeeded + postBackupActions: + - ApplyRetentionPolicy + - VerifyRepositoryIntegrity + - SendRepositoryMetrics + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: wordpress-mysql + stats: + - duration: 1.147010638s + hostname: db + phase: Succeeded + snapshots: + - fileStats: + modifiedFiles: 0 + newFiles: 1 + totalFiles: 1 + unmodifiedFiles: 0 + name: b30beb44 + path: dumpfile.sql + processingTime: "0:00" + totalSize: 0 B + uploaded: 3.408 MiB + totalHosts: 1 diff --git a/content/docs/v2024.12.18/concepts/crds/backupsession/index.md b/content/docs/v2024.12.18/concepts/crds/backupsession/index.md new file mode 100644 index 0000000000..4c6015b076 --- /dev/null +++ b/content/docs/v2024.12.18/concepts/crds/backupsession/index.md @@ -0,0 +1,326 @@ +--- +title: BackupSession Overview +menu: + docs_v2024.12.18: + identifier: backupsession-overview + name: BackupSession + parent: crds + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: concepts +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +> New to Stash? Please start [here](/docs/v2024.12.18/concepts/README). + +# BackupSession + +## What is BackupSession + +A `BackupSession` is a Kubernetes `CustomResourceDefinition`(CRD) which represents a backup run of the respective target(s) referenced by a `BackupConfiguration`/`BackupBatch` in a Kubernetes native way. + +Stash operator creates a Kubernetes `CronJob` according to the schedule defined in a `BackupConfiguration`/`BackupBatch`. On each backup schedule, this `CronJob` creates a `BackupSession` object. It points to the respective `BackupConfiguration`/`BackupBatch`. The controller that runs inside backup sidecar (in case of backup via jobs, it is stash operator itself) watches this `BackupSession` object and starts taking backup instantly. + +You can also create a `BackupSession` object manually to trigger backup at any time. + +## BackupSession CRD Specification + +Like any official Kubernetes resource, a `BackupSession` has `TypeMeta`, `ObjectMeta` and `Spec` , `Status` sections. + +A sample `BackupSession` created for backing up a WordPress Application and it's components' is shown below, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupSession +metadata: + creationTimestamp: "2020-07-25T17:41:28Z" + labels: + app: stash + stash.appscode.com/invoker-name: wordpress-backup + stash.appscode.com/invoker-type: BackupBatch + name: wordpress-backup-1578458376 + namespace: demo +spec: + invoker: + apiGroup: stash.appscode.com + kind: BackupBatch + name: wordpress-backup + retryLeft: 2 +status: + conditions: + - lastTransitionTime: "2020-07-25T17:41:31Z" + message: Repository exist in the backend. + reason: BackendRepositoryFound + status: "True" + type: BackendRepositoryInitialized + - lastTransitionTime: "2020-07-25T17:41:48Z" + message: Successfully applied retention policy. + reason: SuccessfullyAppliedRetentionPolicy + status: "True" + type: RetentionPolicyApplied + - lastTransitionTime: "2020-07-25T17:41:50Z" + message: Repository integrity verification succeeded. + reason: SuccessfullyVerifiedRepositoryIntegrity + status: "True" + type: RepositoryIntegrityVerified + - lastTransitionTime: "2020-07-25T17:41:50Z" + message: Successfully pushed repository metrics. + reason: SuccessfullyPushedRepositoryMetrics + status: "True" + type: RepositoryMetricsPushed + phase: Succeeded + sessionDuration: 22.575920065s + sessionDeadline: "2020-07-25T17:46:28Z" + targets: + - phase: Succeeded + preBackupActions: + - InitializeBackendRepository + ref: + apiVersion: apps/v1 + kind: Deployment + name: wordpress + stats: + - duration: 831.018039ms + hostname: app + phase: Succeeded + snapshots: + - fileStats: + modifiedFiles: 0 + newFiles: 1 + totalFiles: 1 + unmodifiedFiles: 0 + name: b54ee4a0 + path: /var/www/html + processingTime: "0:00" + totalSize: 0 B + uploaded: 711 B + totalHosts: 1 + - phase: Succeeded + postBackupActions: + - ApplyRetentionPolicy + - VerifyRepositoryIntegrity + - SendRepositoryMetrics + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: wordpress-mysql + stats: + - duration: 1.147010638s + hostname: db + phase: Succeeded + snapshots: + - fileStats: + modifiedFiles: 0 + newFiles: 1 + totalFiles: 1 + unmodifiedFiles: 0 + name: b30beb44 + path: dumpfile.sql + processingTime: "0:00" + totalSize: 0 B + uploaded: 3.408 MiB + totalHosts: 1 +``` + +Here, we are going to describe the various sections of a `BackupSession` object. + +### BackupSession `Metadata` + +#### metadata.name + +`metadata.name` indicates the name of the `BackupSession`. This name is automatically generated by respective `CronJob` and it follows the following pattern: `-`. + +#### metadata.namespace + +`metadata.namespace` indicates the name of the `BackupSession`. It is the same as the namespace of respective `BackupConfiguration`/`BackupBatch` object. + +#### metadata.labels + +`metadata.labels` holds respective `BackupConfiguration`/`BackupBatch` kind and name as a label. The stash backup sidecar container use this label to watch only the BackupSessions of that `BackupConfiguration`/`BackupBatch`. + +>If you create `BackupSession` manually to trigger a backup instantly, make sure that you have added `stash.appscode.com/invoker-type: ` and `stash.appscode.com/invoker-name: ` label to your `BackupSession`. Otherwise, it will not trigger backup for workloads (those resources that are backed up using sidecar). + +### BackupSession `Spec` + +A `BackupSession` object has the following fields in the `spec` section: + +#### spec.invoker + +`spec.invoker` specifies the `apiGroup`, `kind`, and `name` of the respective object which is responsible for invoking this backup session. + +#### spec.retryLeft + +`spec.retryLeft` specifies the number of retry attempt left for this backup session. + +### BackupSession `Status` + +`.status` section of `BackupSession` shows stats and progress of backup process in this session.A backup sidecar container or job updates the respective fields under `.status` section after it completes its task. `.status` section consists of the following fields: + +#### status.phase + +`status.phase` indicates the overall phase of the backup process for this BackupSession. `status.phase` will be `Succeeded` only if the phase of all targets is `Succeeded`. If any of the targets fail to complete its backup, `status.phase` will be `Failed`. + +#### status.sessionDuration + +`status.sessionDuration` indicates the total time taken to complete the backup of all targets in this session. + +#### status.sessionDeadline + +`status.sessionDeadline` indicates the the deadline of the backup process. `BackupSession` will be considered `Failed` if the backup does not complete within this deadline. + +#### status.retried + +`status.retried` is a boolean field which specifies whether this session was retried or not in case of failed backup. + +#### status.nextRetry + +`status.nextRetry` specifies the timestamp when this backup will be retried if it has failed. + +#### status.conditions + +`status.conditions` shows the conditions of different operations/steps of the backup process. The following conditions are set by the Stash operator on a BackupSession. + +| Condition Type | Usage | +| ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | +| `BackendRepositoryInitialized` | Indicates whether the backend repository was initialized or not. | +| `RetentionPolicyApplied` | Indicates whether the retention policies were applied or not. | +| `RepositoryIntegrityVerified` | Indicates whether the repository integrity check succeeded or not. | +| `RepositoryMetricsPushed` | Indicates whether the Repository metrics for this backup session were pushed or not. | +| `GlobalPreBackupHookSucceeded` | Indicates whether the global PreBackupHook was executed successfully or not. Only available during backup using BackupBatch. | +| `GlobalPostBackupHookSucceeded` | Indicates whether the global PostBackupHook was executed successfully or not. Only available during backup BackupBatch. | +| `DeadlineExceeded` | Indicates whether the session deadline was exceeded or not.| + +#### status.targets + +`status.targets` field contains an array of the status of the individual target for a backup run. Each target's status field consists of the following sub-fields: + +- **totalHosts :** Not every pod or replica of a target is subject to backup. Thus, we refer those entities that are subject to backup as a host. `totalHosts` specifies the total number of hosts of the target that will be backed up for this BackupSession. For more details on how many hosts will be backed up for which types of workload, please visit [here](#hosts-of-a-backup-process). + +- **preBackupActions :** Specifies a list of actions that the backup process should execute before taking backup. For example, the backend repository must be initialized by one of the targets before taking backup. Stash automatically assigned which target should execute this action. The `preBackupActions` should not be confused with `preBackup` hook. The hooks are meant to be configured by the users where the `preBackupActions` are meant to be configured by Stash itself. + +- **postBackupActions :** Similar to `preBackupActions`, it specifies a list of actions that a backup process should execute after taking the backup. For example, when all the targets complete their backup, one target must apply retention policy into the repository. Stash automatically selects which target should execute these `postBackupActions`. + +- **ref :** `ref` refers to the target whose backup stats has been presented by this array entry. + +- **phase :** `phase` indicates the backup phase of the target. `phase` will be `Succeeded` only if the phase of all hosts are `Succeeded`. If any of the hosts fail to complete its backup, `phase` will be `Failed`. + +- **stats :** `stats` section is an array of backup statistics about individual hosts of the target. Each host adds its statistics in this array after completing its backup process. +Each stats entry consists of the following fields: + + - **hostname:** `hostname` indicates the name of the host. + - **phase:** `phase` indicates the backup phase of this host. + - **duration:** `duration` indicates the total time taken to complete backup for this host. + - **snapshots:** Stash creates one snapshot for each targeted file paths specified in `spec.target.paths` field of `BackupConfiguration` object. The `snapshots` field holds statistics of each of these individual snapshots. Each snapshot statistics has the following fields: + - **name:** `name` indicates the name of the snapshot. + - **path:** `path` indicates the file path that was backed up in this snapshot. + - **totalSize:** `totalSize` indicates the size of data to backup from this path. + - **uploaded:** `uploaded` indicates the size of the data that was uploaded to the backend for this snapshot. This could be much smaller than `size` if some data was already uploaded in the backend in previous backup sessions. + - **processingTime:** `processingTime` indicates the time taken to process the data of the target path. + - **fileStats:** `fileStats` field show statics of files that were backed up in this snapshot. + - **totalFiles:** `totalFiles` shows the total number of files that were backed up in this snapshot. + - **newFiles:** `newFiles` shows the number of new files that were backed up in this snapshot. + - **modifiedFiles:** `modifiedFiles` shows the number of files that were modified since last backup of this directory. + - **unmodifiedFiles:** `unmodifiedFiles` shows the number of files that haven't changed since the last backup of this path. + - **error:** `error` shows the reason for failure if the backup process failed for this host. + +### Hosts of a backup process + +Stash uses two different models for backup depending on the target type. It uses **sidecar model** for Kubernetes workloads and **job model** for the rest of the targets. In the sidecar model, Stash injects a sidecar inside the targeted workload and the sidecar is responsible for taking backup. In the job model, Stash launches a job to take a backup of the target. + +Stash uses an identifier called **host** to separate the backed up data of different subjects in the backed. This host identification process depends on the backup model and the target types. The backup strategy and host identification strategy for different types of the target is explained below. + +**Kubernetes Workloads:** + +Stash uses the sidecar model to backup Kubernetes workloads. However, not every sidecar takes backup. How many sidecars will take backup depends on the type of the workload. We can divide them into the following categories: + +- **Deployment, ReplicaSet, and ReplicationController:** For these types of stateless workloads, all the replicas mount the same volumes. So, taking backup from only one replica is enough. In this case, Stash uses a leader election to elect the leader pod. Only the sidecar of the leader pod takes backup. The `alias` provided in the BackupConfiguration/BackupBatch is used as a host identifier. If the `alias` was not provided, then it defaults to `host-0`. The total number of hosts for these types of workload is 1. +- **StatefulSet:** Every replica of a StatefulSet mount different volumes. So, taking a backup from each replica is necessary. In this case, sidecar inside each replica takes backup. Stash identifies **pod-0** as **\-0**, **pod-1** as **\-1**, **pod-2** as **\-2** and so on. If the `alias` was not provided in the BackupConfiguration/BackupBatch, then the host identifiers are generated as `host-0`, `host-1`, and `host-2` etc. The total number of hosts for a StatefulSet is the number of replicas. +- **DaemonSet:** Daemon replicas on every node may contain different data. So, taking a backup of each daemon pod is necessary. In this case, sidecar inside each daemon pod takes backup. Stash considers the individual daemon pod as a separate host and the host identifiers are generated as **\-\**. The total number of hosts for a DaemonSet is the number of daemon pod running in the cluster. + +**Stand-alone PVC:** + +Stash uses the job model to backup a stand-alone PVC. Stash launches a job to backup the targeted PVC. The `alias` provided in the BackupConfiguration/BackupBatch is used as the host identifier. If the `alias` was not provided, it defaults to `host-0`. The total number of hosts for a stand-alone PVC backup is 1. + +**Databases:** + +Stash uses the job model to backup a database. Stash launches a job to backup the targeted database. In this case, the number of hosts depends on the database type. + +- **Stand-alone database:** For stand-alone database, the backup target is identified by the `alias` and the total number of hosts is 1. +- **Replicated cluster:** For replicated clustered databases such as MongoDB ReplicaSet, all the replicas contain the same data. In this case, taking a backup of only one replica is enough. This replica is identified by the `alias` and the total number of hosts is 1. +- **Sharded cluster:** For the sharded database cluster, Stash takes a backup of all shards. Hence, the number of hosts for a sharded database is the number of shards and they are identified as **\-0**, **\-1**, **\-2**, etc. However, the number of hosts may increase based on the database type. + +**VolumeSnapshot:** + +Stash uses the job model for taking volume snapshots. Each volume is considered as different hosts and they are identified by their name. Hence, the number of total hosts for VolumeSnapshot is the number of targeted volumes. However, since VolumeSnapshot is handled by the respective CSI driver, the host identifier does not play any role to separate their data. + +## Next Steps + +- Learn how backup of workloads data works from [here](/docs/v2024.12.18/guides/workloads/overview/). +- Learn how backup of databases works from [here](/docs/v2024.12.18/guides/addons/overview/). +- Learn how backup stand alone PVC works from [here](/docs/v2024.12.18/guides/volumes/overview/). diff --git a/content/docs/v2024.12.18/concepts/crds/function/function.yaml b/content/docs/v2024.12.18/concepts/crds/function/function.yaml new file mode 100644 index 0000000000..3e25274211 --- /dev/null +++ b/content/docs/v2024.12.18/concepts/crds/function/function.yaml @@ -0,0 +1,74 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: Function +metadata: + name: postgres-backup-11.2 +spec: + image: stashed/postgres-stash:11.2 + args: + - backup-pg + # setup information + - --provider=${REPOSITORY_PROVIDER:=} + - --bucket=${REPOSITORY_BUCKET:=} + - --endpoint=${REPOSITORY_ENDPOINT:=} + - --region=${REPOSITORY_REGION:=} + - --path=${REPOSITORY_PREFIX:=} + - --secret-dir=/etc/repository/secret + - --scratch-dir=/tmp + - --enable-cache=${ENABLE_CACHE:=true} + - --max-connections=${MAX_CONNECTIONS:=0} # 0 indicates use default connection limit + - --hostname=${HOSTNAME:=} + - --backup-cmd=${backupCMD:=} # can specify dump command with either pg_dump or pg_dumpall + - --pg-args=${args:=} # optional arguments pass to pgdump command + - --wait-timeout=${waitTimeout:=} + # target information + - --namespace=${NAMESPACE:=default} + - --appbinding=${TARGET_NAME:=} + - --backupsession=${BACKUP_SESSION:=} + # cleanup information + - --retention-keep-last=${RETENTION_KEEP_LAST:=0} + - --retention-prune=${RETENTION_PRUNE:=false} + # output & metric information + - --output-dir=${outputDir:=} + volumeMounts: + - name: ${secretVolume} + mountPath: /etc/repository/secret + runtimeSettings: + resources: + requests: + memory: 256M + limits: + memory: 256M + securityContext: + runAsUser: 5000 + runAsGroup: 5000 +--- +apiVersion: stash.appscode.com/v1beta1 +kind: Function +metadata: + name: update-status +spec: + image: appscode/stash:0.10.0 + args: + - update-status + - --provider=${REPOSITORY_PROVIDER:=} + - --bucket=${REPOSITORY_BUCKET:=} + - --endpoint=${REPOSITORY_ENDPOINT:=} + - --path=${REPOSITORY_PREFIX:=} + - --secret-dir=/etc/repository/secret + - --scratch-dir=/tmp + - --enable-cache=${ENABLE_CACHE:=true} + - --max-connections=${MAX_CONNECTIONS:=0} + - --namespace=${NAMESPACE:=default} + - --backupsession=${BACKUP_SESSION:=} + - --repository=${REPOSITORY_NAME:=} + - --invoker-kind=${INVOKER_KIND:=} + - --invoker-name=${INVOKER_NAME:=} + - --target-kind=${TARGET_KIND:=} + - --target-name=${TARGET_NAME:=} + - --output-dir=${outputDir:=} + - --metrics-enabled=true + - --metrics-pushgateway-url=http://stash.kube-system.svc:56789 + - --prom-job-name=${PROMETHEUS_JOB_NAME:=} + volumeMounts: + - mountPath: /etc/repository/secret + name: ${secretVolume} diff --git a/content/docs/v2024.12.18/concepts/crds/function/index.md b/content/docs/v2024.12.18/concepts/crds/function/index.md new file mode 100644 index 0000000000..e6779a700b --- /dev/null +++ b/content/docs/v2024.12.18/concepts/crds/function/index.md @@ -0,0 +1,293 @@ +--- +title: Function Overview +menu: + docs_v2024.12.18: + identifier: function-overview + name: Function + parent: crds + weight: 30 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: concepts +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +> New to Stash? Please start [here](/docs/v2024.12.18/concepts/README). + +# Function + +## What is Function + +A complete backup or restore process may consist of several steps. For example, in order to backup a PostgreSQL database we first need to dump the database and upload the dumped file to a backend. Then we need to update the respective`Repository` and `BackupSession` status and send Prometheus metrics. In Stash, we call such individual steps a `Function`. + +A `Function` is a Kubernetes `CustomResourceDefinition`(CRD) which basically specifies a template for a container that performs only a specific action. For example, `postgres-backup-*` function only dumps and uploads the dumped file into the backend where `update-status` function updates the status of respective `BackupSession` and `Repository` and sends Prometheus metrics to pushgateway based on the output of `postgres-backup-*` function. + +When you install Stash, some `Function`s will be pre-installed for supported targets like databases, etc. However, you can create your own function to customize or extend the backup/restore process. + +## Function CRD Specification + +Like any official Kubernetes resource, a `Function` has `TypeMeta`, `ObjectMeta` and `Spec` sections. However, unlike other Kubernetes resources, it does not have a `Status` section. + +A sample `Function` object to backup a PostgreSQL is shown below, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: Function +metadata: + name: postgres-backup-11.2 +spec: + image: stashed/postgres-stash:11.2 + args: + - backup-pg + # setup information + - --provider=${REPOSITORY_PROVIDER:=} + - --bucket=${REPOSITORY_BUCKET:=} + - --endpoint=${REPOSITORY_ENDPOINT:=} + - --region=${REPOSITORY_REGION:=} + - --path=${REPOSITORY_PREFIX:=} + - --secret-dir=/etc/repository/secret + - --scratch-dir=/tmp + - --enable-cache=${ENABLE_CACHE:=true} + - --max-connections=${MAX_CONNECTIONS:=0} # 0 indicates use default connection limit + - --hostname=${HOSTNAME:=} + - --backup-cmd=${backupCMD:=} # can specify dump command with either pg_dump or pg_dumpall + - --pg-args=${args:=} # optional arguments pass to pgdump command + - --wait-timeout=${waitTimeout:=} + # target information + - --namespace=${NAMESPACE:=default} + - --appbinding=${TARGET_NAME:=} + - --backupsession=${BACKUP_SESSION:=} + # cleanup information + - --retention-keep-last=${RETENTION_KEEP_LAST:=0} + - --retention-prune=${RETENTION_PRUNE:=false} + # output & metric information + - --output-dir=${outputDir:=} + volumeMounts: + - name: ${secretVolume} + mountPath: /etc/repository/secret + runtimeSettings: + resources: + requests: + memory: 256M + limits: + memory: 256M + securityContext: + runAsUser: 5000 + runAsGroup: 5000 +``` + +A sample `Function` that updates `BackupSession` and `Repository` status and sends metrics to Prometheus pushgateway is shown below, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: Function +metadata: + name: update-status +spec: + image: appscode/stash:0.10.0 + args: + - update-status + - --provider=${REPOSITORY_PROVIDER:=} + - --bucket=${REPOSITORY_BUCKET:=} + - --endpoint=${REPOSITORY_ENDPOINT:=} + - --path=${REPOSITORY_PREFIX:=} + - --secret-dir=/etc/repository/secret + - --scratch-dir=/tmp + - --enable-cache=${ENABLE_CACHE:=true} + - --max-connections=${MAX_CONNECTIONS:=0} + - --namespace=${NAMESPACE:=default} + - --backupsession=${BACKUP_SESSION:=} + - --repository=${REPOSITORY_NAME:=} + - --invoker-kind=${INVOKER_KIND:=} + - --invoker-name=${INVOKER_NAME:=} + - --target-kind=${TARGET_KIND:=} + - --target-name=${TARGET_NAME:=} + - --output-dir=${outputDir:=} + - --metrics-enabled=true + - --metrics-pushgateway-url=http://stash.kube-system.svc:56789 + - --prom-job-name=${PROMETHEUS_JOB_NAME:=} + volumeMounts: + - mountPath: /etc/repository/secret + name: ${secretVolume} +``` + +Here, we are going to describe the various sections of a `Function` crd. + +### Function `Spec` + +A `Function` object has the following fields in the `spec` section: + +#### spec.image + +`spec.image` specifies the docker image to use to create a container using the template specified in this `Function`. + +#### spec.command + +`spec.command` specifies the commands to be executed by the container. Docker image's `ENTRYPOINT` will be executed if no commands are specified. + +#### spec.args + +`spec.args` specifies a list of arguments that will be passed to the entrypoint. You can templatize this section using `envsubst` style variables. Stash will resolve all the variables before creating the respective container. A variable should follow the following patterns: + +- ${VARIABLE_NAME:=default-value} +- ${VARIABLE_NAME:=} + +In the first case, if Stash can't resolve the variable, the default value will be used in place of this variable. In the second case, if Stash can't resolve the variable, an empty string will be used to replace the variable. + +##### Stash Provided Variables + +Stash operator provides the following built-in variables based on `BackupConfiguration`, `BackupSession`, `RestoreSession`, `Repository`, `Task`, `Function`, `BackupBlueprint` etc. + +| Environment Variable | Usage | +| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `NAMESPACE` | Namespace of backup or restore job/workload | +| `BACKUP_SESSION` | Name of the respective BackupSession object | +| `RESTORE_SESSION` | Name of the respective RestoreSession object | +| `REPOSITORY_NAME` | Name of the Repository object that holds respective backend information | +| `REPOSITORY_PROVIDER` | Type of storage provider. i.e. gcs, s3, aws, local etc. | +| `REPOSITORY_SECRET_NAME` | Name of the secret that holds the credentials to access the backend | +| `REPOSITORY_BUCKET` | Name of the bucket where backed up data will be stored | +| `REPOSITORY_PREFIX` | A prefix of the directory inside bucket where backed up data will be stored | +| `REPOSITORY_ENDPOINT` | URL of S3 compatible Minio/Rook server | +| `REPOSITORY_URL` | URL of the REST server for REST backend | +| `HOSTNAME` | An identifier for the backed up data. If multiple pods backup in same Repository (i.e. StatefulSet or DaemonSet) this host name is to used identify data of the individual host. | +| `SOURCE_HOSTNAME` | An identifier of the host whose backed up data will be restored | +| `TARGET_NAME` | Name of the target of backup or restore | +| `TARGET_API_VERSION` | API version of the target of backup or restore | +| `TARGET_KIND` | Kind of the target of backup or restore | +| `TARGET_NAMESPACE` | Namespace of the target object for backup or restore | +| `TARGET_MOUNT_PATH` | Directory where target PVC will be mounted in stand-alone PVC backup or restore | +| `TARGET_PATHS` | Array of file paths that are subject to backup | +| `RESTORE_PATHS` | Array of file paths that are subject to restore | +| `RESTORE_SNAPSHOTS` | Name of the snapshot that will be restored | +| `TARGET_APP_VERSION` | Version of the application pointed by an AppBinding | +| `TARGET_APP_GROUP` | The application group where the app pointed by an AppBinding belongs | +| `TARGET_APP_RESOURCE` | The resource kind under an application group that the app pointed by an AppBinding works with | +| `TARGET_APP_TYPE` | The total types of the application. It's simply `TARGET_APP_GROUP/TARGET_APP_RESOURCE` | +| `TARGET_APP_REPLICAS` | Number of replicas of an application targeted for backup or restore | +| `RETENTION_KEEP_LAST` | Number of latest snapshots to keep | +| `RETENTION_KEEP_HOURLY` | Number of hourly snapshots to keep | +| `RETENTION_KEEP_DAILY` | Number of daily snapshots to keep | +| `RETENTION_KEEP_WEEKLY` | Number of weekly snapshots to keep | +| `RETENTION_KEEP_MONTHLY` | Number of monthly snapshots to keep | +| `RETENTION_KEEP_YEARLY` | Number of yearly snapshots to keep | +| `RETENTION_KEEP_TAGS` | Keep only those snapshots that have these tags | +| `RETENTION_PRUNE` | Specify whether to remove data of old snapshot completely from the backend | +| `RETENTION_DRY_RUN` | Specify whether to run cleanup in test mode | +| `ENABLE_CACHE` | Specify whether to use cache while backup or restore | +| `MAX_CONNECTIONS` | Specifies number of parallel connections to upload/download data to/from backend | +| `NICE_ADJUSTMENT` | Adjustment value to configure `nice` to throttle the load on cpu. | +| `IONICE_CLASS` | Name of the `ionice` class | +| `IONICE_CLASS_DATA` | Value of the `ionice` class data | +| `ENABLE_STATUS_SUBRESOURCE` | Specifies whether crd has subresource enabled | +| `PROMETHEUS_PUSHGATEWAY_URL` | URL of the Prometheus pushgateway that collects the backup/restore metrics | +| `INTERIM_DATA_DIR` | Directory to store backed up or restored data temporarily before uploading to the backend or injecting into the target | + +If you want to use a variable that is not present this table, you have to provide its value in `spec.task.params` section of `BackupConfiguration` crd. + +#### spec.workDir + +`spec.workDir` specifies the container's working directory. If this field is not specified, the container's runtime default will be used. + +#### spec.ports + +`spec.ports` specifies a list of the ports to expose from the respective container that will be created for this function. + +#### spec.volumeMounts + +`spec.volumeMounts` specifies a list of volume names and their `mountPath` that will be mounted into the container that will be created for this function. + +#### spec.volumeDevices + +`spec.volumeDevices` specifies a list of the block devices to be used by the container that will be created for this function. + +#### spec.runtimeSettings + +`spec.runtimeSettings.container` allows to configure runtime environment of a backup job at container level. You can configure the following container level parameters: + +| Field | Usage | +| ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `resources` | Compute resources required by sidecar container or backup job. To know how to manage resources for containers, please visit [here](https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/). | +| `livenessProbe` | Periodic probe of backup sidecar/job container's liveness. Container will be restarted if the probe fails. | +| `readinessProbe` | Periodic probe of backup sidecar/job container's readiness. Container will be removed from service endpoints if the probe fails. | +| `lifecycle` | Actions that the management system should take in response to container lifecycle events. | +| `securityContext` | Security options that backup sidecar/job's container should run with. For more details, please visit [here](https://kubernetes.io/docs/concepts/policy/security-context/). | +| `nice` | Set CPU scheduling priority for the backup process. For more details about `nice`, please visit [here](https://www.askapache.com/optimize/optimize-nice-ionice/#nice). | +| `ionice` | Set I/O scheduling class and priority for the backup process. For more details about `ionice`, please visit [here](https://www.askapache.com/optimize/optimize-nice-ionice/#ionice). | +| `env` | A list of the environment variables to set in the container that will be created for this function. | +| `envFrom` | This allows to set environment variables to the container that will be created for this function from a Secret or ConfigMap. | + +#### spec.podSecurityPolicyName + +If you are using a [PSP enabled cluster](https://kubernetes.io/docs/concepts/policy/pod-security-policy/) and the function needs any specific permission then you can specify the PSP name using `spec.podSecurityPolicyName` field. Stash will add this PSP in the respective RBAC roles that will be created for this function. + +>Note that Stash operator can't give permission to use a PSP to a backup job if the operator itself does not have permission to use it. So, if you want to specify PSP name in this section, make sure to add that in `stash-operator` ClusterRole too. + +## Next Steps + +- Learn how to use `Function` to create a `Task` from [here](/docs/v2024.12.18/concepts/crds/task/). diff --git a/content/docs/v2024.12.18/concepts/crds/repository/index.md b/content/docs/v2024.12.18/concepts/crds/repository/index.md new file mode 100644 index 0000000000..c9fdb9dfd6 --- /dev/null +++ b/content/docs/v2024.12.18/concepts/crds/repository/index.md @@ -0,0 +1,240 @@ +--- +title: Repository Overview +menu: + docs_v2024.12.18: + identifier: repository-overview + name: Repository + parent: crds + weight: 5 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: concepts +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +> New to Stash? Please start [here](/docs/v2024.12.18/concepts/README). + +# Repository + +## What is Repository + +A `Repository` is a Kubernetes `CustomResourceDefinition`(CRD) which represents [backend](/docs/v2024.12.18/guides/backends/overview/) information in a Kubernetes native way. + +You have to create a `Repository` object for each backup target. Since v1beta1 api, a `Repository` object has 1-1 mapping with a target. Thus, only one target can be backed up into one `Repository`. + +## Repository CRD Specification + +Like any official Kubernetes resource, a `Repostiory` object has `TypeMeta`, `ObjectMeta`, `Spec` and `Status` sections. + +A sample `Repository` object that uses Google Cloud Storage(GCS) bucket as backend is shown below: + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-demo-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-demo-backup + prefix: demo + storageSecretName: gcs-secret + usagePolicy: + allowedNamespaces: + from: Same + wipeOut: false +status: + firstBackupTime: "2019-04-15T06:08:16Z" + integrity: true + lastBackupTime: "2019-04-15T06:14:15Z" + totalSize: 2.567 KiB + snapshotCount: 5 + snapshotsRemovedOnLastCleanup: 1 +``` + +Here, we are going to describe the various sections of the `Repository` crd. + +### Repository `Spec` + +`Repository` CRD has the following fields in the `.spec` section. + +- **spec.backend** +`spec.backend` specifies the storage location where the backed up snapshots will be stored. To learn how to configure `Repository` crd for various backends, please visit [here](/docs/v2024.12.18/guides/backends/overview/). + +- **backend prefix/subPath** +`prefix` of any backend denotes the directory inside the backend where the backed up snapshots will be stored. In case of **Local** backend, `subPath` is used for this purpose. + +- **spec.wipeOut** +As the name implies, `spec.wipeOut` field indicates whether Stash operator should delete backed up files from the backend when `Repository` crd is deleted. The default value of this field is `false` which tells Stash to not delete backed up data when a user deletes a `Repository` crd. + +- **spec.usagePolicy** +This lets you control which namespaces are allowed to use the Repository and which are not. If you refer to a Repository from a restricted namespace, Stash will reject creating the respective BackupConfiguration/RestoreSession from validating webhook. You can use the `usagePolicy` to allow only the same namespace, a subset of namespaces, or all the namespaces to refer to the Repository. If you don't specify any `usagePolicy`, Stash will allow referencing the Repository only from the namespace where the Repository has been created. + + +Here is an example of `spec.usagePolicy` that limits referencing the Repository only from the same namespace, +```yaml +spec: + usagePolicy: + allowedNamespaces: + from: Same +``` + +Here is an example of `spec.usagePolicy` that allows referencing it from all namespaces, +```yaml +spec: + usagePolicy: + allowedNamespaces: + from: All +``` + +Here is an example of `spec.usagePolicy` that allows referencing it from only `prod` and `staging` namespace, +```yaml +spec: + usagePolicy: + allowedNamespaces: + from: Selector + selector: + matchExpressions: + - key: "kubernetes.io/metadata.name" + operator: In + values: ["prod","staging"] +``` + +### Repository `Status` + +Stash operator updates `.status` of a Repository crd every time a backup operation is completed. `Repository` crd shows the following statistics in status section: + +- **status.firstBackupTime** +`status.firstBackupTime` indicates the timestamp when the first backup was taken. + +- **status.lastBackupTime** +`status.lastBackupTime` indicates the timestamp when the latest backup was taken. + +- **status.integrity** +Stash checks the integrity of backed up files after each backup. `status.integrity` shows the result of the integrity check. + +- **status.totalSize** +`status.totalSize` shows the total size of a repository after last backup. + +- **status.snapshotCount** +`status.SnapshotCount` shows the number of snapshots stored in the Repository. + +- **status.snapshotsRemovedOnLastCleanup** +`status.snapshotsRemovedOnLastCleanup` shows the number of old snapshots that has been cleaned up according to retention policy on last backup session. + + +## Deleting Repository + +Stash allows users to delete **only `Repository` crd** or **`Repository` crd along with respective backed up data**. Here, we are going to show how to perform these operations. + +**Delete only `Repository` keeping backed up data :** + + You can delete only `Repository` crd by, + +```bash +$ kubectl delete repository + +# Example +$ kubectl delete repository gcs-demo-repo +repository "gcs-demo-repo" deleted +``` + +This will delete only `Repository` crd. It won't delete any backed up data from the backend. You can recreate the `Repository` object later to reuse existing data as long as your restic password in unchanged. + +>If you delete `Repository` crd while respective stash sidecar still exists on the workload, it will fail to take further backup. + +**Delete `Repository` along with backed up data :** + +In order to prevent the users from accidentally deleting backed up data, Stash uses a special `wipeOut` flag in `spec` section of `Repository` crd. By default, this flag is set to `wipeOut: false`. If you want to delete respective backed up data from backend while deleting `Repository` crd, you must set this flag to `wipeOut: true`. + +> Currently, Stash does not support wiping out backed up data for local backend. If you want to cleanup backed up data from local backend, you must do it manually. + +Here, is an example of deleting backed up data from GCS backend, + +- First, set `wipeOut: true` by patching `Repository` crd. + + ```bash + $ kubectl patch repository gcs-demo-repo --type="merge" --patch='{"spec": {"wipeOut": true}}' + repository "gcs-demo-repo" patched + ``` + +- Finally, delete `Repository` object. It will delete backed up data from the backend. + + ```bash + $ kubectl delete repository gcs-demo-repo + repository "gcs-demo-repo" deleted + ``` + +You can browse your backend storage bucket to verify that the backed up data has been wiped out. + +## Next Steps + +- Learn how to create `Repository` crd for different backends from [here](/docs/v2024.12.18/guides/backends/overview/). +- Learn how Stash backup workloads data from [here](/docs/v2024.12.18/guides/workloads/overview/). +- Learn how Stash backup databases from [here](/docs/v2024.12.18/guides/addons/overview/). diff --git a/content/docs/v2024.12.18/concepts/crds/repository/repository.yaml b/content/docs/v2024.12.18/concepts/crds/repository/repository.yaml new file mode 100644 index 0000000000..511f0c2e90 --- /dev/null +++ b/content/docs/v2024.12.18/concepts/crds/repository/repository.yaml @@ -0,0 +1,19 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-demo-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-demo-backup + prefix: demo + storageSecretName: gcs-secret + wipeOut: false +status: + firstBackupTime: "2019-04-15T06:08:16Z" + integrity: true + lastBackupTime: "2019-04-15T06:14:15Z" + totalSize: 2.567 KiB + snapshotCount: 5 + snapshotsRemovedOnLastCleanup: 1 diff --git a/content/docs/v2024.12.18/concepts/crds/restorebatch/index.md b/content/docs/v2024.12.18/concepts/crds/restorebatch/index.md new file mode 100644 index 0000000000..28ab53996c --- /dev/null +++ b/content/docs/v2024.12.18/concepts/crds/restorebatch/index.md @@ -0,0 +1,270 @@ +--- +title: RestoreBatch Overview +menu: + docs_v2024.12.18: + identifier: restorebatch-overview + name: RestoreBatch + parent: crds + weight: 27 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: concepts +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# RestoreBatch + +## What is RestoreBatch + +A `RestoreBatch` is a Kubernetes `CustomResourceDefinition`(CRD) which allows you to restore multiple co-related components( eg, workloads, databases, etc.) together that were backed up via a `BackupBatch`. + +## RestoreBatch CRD Specification + +Like any official Kubernetes resource, a `RestoreBatch` has `TypeMeta`, `ObjectMeta`, `Spec` and `Status` sections. A sample `RestoreBatch` object to restore multiple co-related components is shown below: + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreBatch +metadata: + name: batch-restore + namespace: demo +spec: + driver: Restic + repository: + name: minio-repo + namespace: demo + executionOrder: Parallel + members: + - target: + alias: app + ref: + apiVersion: apps/v1 + kind: Deployment + name: wordpress + rules: + - paths: + - /var/www/html + volumeMounts: + - mountPath: /var/www/html + name: wordpress-persistent-storage + - target: + alias: db + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: wordpress-mysql + rules: + - snapshots: + - latest + task: + name: mysql-restore-8.0.14 + timeOut: 30m +status: + phase: Succeeded + sessionDuration: 15.145032437s + conditions: + - lastTransitionTime: "2020-07-25T17:41:52Z" + message: Repository demo/minio-repo exist. + reason: RepositoryAvailable + status: "True" + type: RepositoryFound + - lastTransitionTime: "2020-07-25T17:41:52Z" + message: Backend Secret demo/minio-secret exist. + reason: BackendSecretAvailable + status: "True" + type: BackendSecretFound + members: + - conditions: + - lastTransitionTime: "2020-07-25T17:41:52Z" + message: Restore target apps/v1 deployment/wordpress + found. + reason: TargetAvailable + status: "True" + type: RestoreTargetFound + - lastTransitionTime: "2020-07-25T17:41:52Z" + message: Successfully injected stash init-container. + reason: InitContainerInjectionSucceeded + status: "True" + type: StashInitContainerInjected + phase: Succeeded + ref: + apiVersion: apps/v1 + kind: Deployment + name: wordpress + stats: + - duration: 822.861322ms + hostname: app + phase: Succeeded + totalHosts: 1 + - conditions: + - lastTransitionTime: "2020-07-25T17:41:52Z" + message: Restore target appcatalog.appscode.com/v1alpha1 appbinding/wordpress-mysql + found. + reason: TargetAvailable + status: "True" + type: RestoreTargetFound + - lastTransitionTime: "2020-07-25T17:41:52Z" + message: Successfully created restore job. + reason: RestoreJobCreationSucceeded + status: "True" + type: RestoreJobCreated + phase: Succeeded + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: wordpress-mysql + stats: + - duration: 4.597812876s + hostname: db + phase: Succeeded + totalHosts: 1 +``` + +Here, we are going to describe the various sections of `RestoreBatch` crd. + +### RestoreBatch `Spec` + +A `RestoreBatch` object has the following fields in the `spec` section. + +#### spec.driver + +`spec.driver` indicates the mechanism used to restore. Currently, Stash supports `Restic` and `VolumeSnapshotter` as drivers. The default value of this field is `Restic`. For more details, please see [here](/docs/v2024.12.18/concepts/crds/restoresession/#specdriver). + +#### spec.repository + +`spec.repository.name` indicates the `Repository` crd name that holds necessary backend information from where data will be restored. + +#### spec.executionOrder + +`spec.executionOrder` specifies whether Stash should restore the targets sequentially or parallelly. If `spec.executionOrder` is set to `Parallel`, Stash will start to restore of all the targets simultaneously. If it is set to `Sequential`, Stash will not start restoring a target until all the previous members have completed their restore process. The default value of this field is `Parallel`. + +#### spec.members + +`spec.members` field specifies a list of targets to restore. Each member consists of the following fields: + +- **target :** Each member has a target specification. The target specification of a member is the same as the target specification of a `RestoreSession` explained [here](/docs/v2024.12.18/concepts/crds/restoresession/#spectarget). + +- **task :** `task` specifies the name and parameters of the [Task](/docs/v2024.12.18/concepts/crds/task/) crd to use to restore the member. For more details, please see [here](/docs/v2024.12.18/concepts/crds/restoresession/#spectask). + +- **runtimeSettings :** `runtimeSettings` allows to configure runtime environment for the restore init-container or job. You can specify runtime settings at both pod level and container level. For more details, please see [here](/docs/v2024.12.18/concepts/crds/restoresession/#specruntimesettings). + +- **tempDir :** Stash mounts an `emptyDir` for holding temporary files. It is also used for `caching` for faster restore performance. You can configure the `emptyDir` using `tempDir` section. You can also disable `caching` using this field. For more details, please see [here](/docs/v2024.12.18/concepts/crds/restoresession/#spectempdir). + +- **interimVolumeTemplate :** For some targets (i.e. some databases), Stash can't directly pipe the restored data into the target. In this case, it has to store the restored data temporarily before injecting into the target. `spec.interimVolumeTemplate` specifies a PVC template for holding those data temporarily. Stash will create a PVC according to the template and use it to store the data temporarily. This PVC will be deleted automatically if you delete the `RestoreBatch`. + +- **hooks :** Each member has it's own `hooks` field which allows you to execute member-specific pre-restore or post-restore hooks. For more details about hooks, please visit [here](/docs/v2024.12.18/concepts/crds/restoresession/#spechooks). + +#### spec.hooks + +`spec.hooks` allows performing some global actions before and after the restoration process. You can send HTTP requests to a remote server via `httpGet` or `httpPost`. You can check whether a TCP port is open using `tcpSocket` hooks. You can also execute some commands using `exec` hook. + +- **spec.hooks.preRestore:** `spec.hooks.preRestore` hooks are executed before restoring any of the members. +- **spec.hooks.postRestore:** `spec.hooks.postRestore` hooks are executed after restoring all the members. + +For more details on how hooks work in Stash and how to configure different types of hook, please visit [here](/docs/v2024.12.18/guides/hooks/overview/). + +#### spec.timeOut + +`spec.timeOut` specifies the amount of time to wait for the restore to complete. For more details, please visit [here](/docs/v2024.12.18/concepts/crds/restoresession/#spectimeout). +### RestoreBatch `Status` + +A `RestoreBatch` object has the following fields in the `status` section. + +- **phase :** `phase` shows the overall phase of the restore process. It will be `Succeeded` only if all the targets are restored successfully. + +- **sessionDuration :** `sessionDuration` shows the total time taken to complete the entire restoration process. + +- **sessionDeadline :** `sessionDeadline` indicates the the deadline of the restore process. `RestoreBatch` will be considered `Failed` if the restore does not complete within this deadline. + +- **conditions :** The `conditions` field shows conditions of different steps of the restore process. The following conditions are set by the Stash operator for a RestoreBatch: + +| Condition Type | Usage | +| -------------------------------- | ----------------------------------------------------------------------------- | +| `RepositoryFound` | Indicates whether the respective Repository object was found or not. | +| `BackendSecretFound` | Indicates whether the respective backend secret was found or not. | +| `GlobalPreRestoreHookSucceeded` | Indicates whether the global PreRestoreHook was executed successfully or not. | +| `GlobalPostRestoreHookSucceeded` | Indicates whether the global PostRestoreHook was executed successfully or no. | +| `DeadlineExceeded` | Indicates whether the session deadline was exceeded or not.| + +- **members :** `members` section shows the restore status of the individual members. Each entry has the following fields: + - **ref :** `ref` points to the respective target whose status is shown here. + - **phase :** `phase` shows the restore phase of the member. + - **conditions:** `conditions` shows the conditions of different steps of restoring this member. Stash set the following conditions for each restore members. + +| Condition Type | Usage | +| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | +| `RestoreTargetFound` | Indicates whether the restore target was found or not. | +| `StashInitContainerInjected` | Indicates whether stash init-container was injected into the targeted workload. This condition is applicable only for the sidecar model. | +| `RestoreJobCreated` | Indicates whether the restore job was created or not. This condition is only applicable in the job model. | + + - **totalHosts :** `totalHosts` field specifies the total number of hosts that will be restored for this member. + - **stats :** `stats` section is an array of restore statistics of individual hosts. Individual host stats entry consists of the following fields: + - **hostname :** `hostname` indicates the name of the host. Usually it is the `alias` or `alias-`. For more details, please visit [here](/docs/v2024.12.18/concepts/crds/backupsession/#hosts-of-a-backup-process). + - **phase :** `phase` indicates the restore phase of this host. + - **duration :** `duration` indicates the total time taken to complete the restore process for this host. + - **error :** `error` shows the reason for failure if the restore process fails for this host. diff --git a/content/docs/v2024.12.18/concepts/crds/restorebatch/restorebatch.yaml b/content/docs/v2024.12.18/concepts/crds/restorebatch/restorebatch.yaml new file mode 100644 index 0000000000..d715285007 --- /dev/null +++ b/content/docs/v2024.12.18/concepts/crds/restorebatch/restorebatch.yaml @@ -0,0 +1,95 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreBatch +metadata: + name: batch-restore + namespace: demo +spec: + driver: Restic + repository: + name: minio-repo + namespace: demo + executionOrder: Parallel + members: + - target: + alias: app + ref: + apiVersion: apps/v1 + kind: Deployment + name: wordpress + rules: + - paths: + - /var/www/html + volumeMounts: + - mountPath: /var/www/html + name: wordpress-persistent-storage + - target: + alias: db + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: wordpress-mysql + rules: + - snapshots: + - latest + task: + name: mysql-restore-8.0.14 + timeOut: 30m +status: + phase: Succeeded + sessionDuration: 15.145032437s + conditions: + - lastTransitionTime: "2020-07-25T17:41:52Z" + message: Repository demo/minio-repo exist. + reason: RepositoryAvailable + status: "True" + type: RepositoryFound + - lastTransitionTime: "2020-07-25T17:41:52Z" + message: Backend Secret demo/minio-secret exist. + reason: BackendSecretAvailable + status: "True" + type: BackendSecretFound + members: + - conditions: + - lastTransitionTime: "2020-07-25T17:41:52Z" + message: Restore target apps/v1 deployment/wordpress + found. + reason: TargetAvailable + status: "True" + type: RestoreTargetFound + - lastTransitionTime: "2020-07-25T17:41:52Z" + message: Successfully injected stash init-container. + reason: InitContainerInjectionSucceeded + status: "True" + type: StashInitContainerInjected + phase: Succeeded + ref: + apiVersion: apps/v1 + kind: Deployment + name: wordpress + stats: + - duration: 822.861322ms + hostname: app + phase: Succeeded + totalHosts: 1 + - conditions: + - lastTransitionTime: "2020-07-25T17:41:52Z" + message: Restore target appcatalog.appscode.com/v1alpha1 appbinding/wordpress-mysql + found. + reason: TargetAvailable + status: "True" + type: RestoreTargetFound + - lastTransitionTime: "2020-07-25T17:41:52Z" + message: Successfully created restore job. + reason: RestoreJobCreationSucceeded + status: "True" + type: RestoreJobCreated + phase: Succeeded + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: wordpress-mysql + stats: + - duration: 4.597812876s + hostname: db + phase: Succeeded + totalHosts: 1 diff --git a/content/docs/v2024.12.18/concepts/crds/restoresession/index.md b/content/docs/v2024.12.18/concepts/crds/restoresession/index.md new file mode 100644 index 0000000000..eb37308107 --- /dev/null +++ b/content/docs/v2024.12.18/concepts/crds/restoresession/index.md @@ -0,0 +1,408 @@ +--- +title: RestoreSession Overview +menu: + docs_v2024.12.18: + identifier: restoresession-overview + name: RestoreSession + parent: crds + weight: 25 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: concepts +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +> New to Stash? Please start [here](/docs/v2024.12.18/concepts/README). + +# RestoreSession + +## What is RestoreSession + +A `RestoreSession` is a Kubernetes `CustomResourceDefinition`(CRD) which specifies a target to restore and the source of data that will be restored in a Kubernetes native way. + +You have to create a `RestoreSession` object whenever you want to restore. When a `RestoreSession` object is created, Stash injects an `init-container` into the target workload and restarts it. The `init-container` restores the desired data. If the target is a database or a stand-alone PVC, Stash launches a job to perform the restore process. + +## RestoreSession CRD Specification + +Like any official Kubernetes resource, a `RestoreSession` has `TypeMeta`, `ObjectMeta`, `Spec` and `Status` sections. + +A sample `RestoreSession` object to restore backed up data of a StatefulSet is shown below: + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: statefulset-restore + namespace: demo +spec: + driver: Restic + repository: + name: minio-repo + namespace: demo + # task: + # name: workload-restore # task field is not required for workload data backup but it is necessary for database backup. + target: + alias: my-sts + ref: + apiVersion: apps/v1 + kind: StatefulSet + name: recovered-statefulset + volumeMounts: + - mountPath: /source/data + name: source-data + rules: + - targetHosts: ["my-sts-3","my-sts-4"] # "pod-3" and "pod-4" will have restored data of backed up host "pod-1" + sourceHost: "my-sts-1" # source host + paths: + - /source/data + include: + - /source/data/*.json + - targetHosts: [] # empty host match all hosts + sourceHost: "" # no source host indicates that the host is pod itself + paths: + - /source/data + exclude: + - /source/data/tmp.json + - /source/data/*.txt + hooks: + preRestore: + exec: + command: + - /bin/sh + - -c + - echo "Sample PreRestore hook demo" + containerName: stash-init + postRestore: + executionPolicy: Always + exec: + command: + - /bin/sh + - -c + - echo "Sample PostRestore hook demo" + containerName: stash-init + runtimeSettings: + container: + resources: + limits: + memory: 256M + requests: + memory: 256M + securityContext: + runAsGroup: 2000 + runAsUser: 2000 + ionice: + class: 2 + classData: 4 + nice: + adjustment: 5 + pod: + imagePullSecrets: + - name: my-private-registry-secret + serviceAccountName: my-backup-sa + tempDir: + disableCaching: false + medium: Memory + sizeLimit: 2Gi + timeOut: 30m +status: + totalHosts: 5 + phase: Succeeded + sessionDuration: 2m40.595857548s + conditions: + - lastTransitionTime: "2020-07-25T17:55:56Z" + message: Repository demo/minio-repo exist. + reason: RepositoryAvailable + status: "True" + type: RepositoryFound + - lastTransitionTime: "2020-07-25T17:55:56Z" + message: Backend Secret demo/minio-secret exist. + reason: BackendSecretAvailable + status: "True" + type: BackendSecretFound + - lastTransitionTime: "2020-07-25T17:55:56Z" + message: Restore target apps/v1 statefulset/recovered-statefulset found. + reason: TargetAvailable + status: "True" + type: RestoreTargetFound + - lastTransitionTime: "2020-07-25T17:55:56Z" + message: Successfully injected stash init-container. + reason: InitContainerInjectionSucceeded + status: "True" + type: StashInitContainerInjected + stats: + - duration: 884.431745ms + hostname: host-1 + phase: Succeeded + - duration: 769.924342ms + hostname: host-2 + phase: Succeeded + - duration: 868.694738ms + hostname: host-3 + phase: Succeeded + - duration: 792.097784ms + hostname: host-4 + phase: Succeeded + - duration: 833.139795ms + hostname: host-0 + phase: Succeeded +``` + +Here, we are going to describe the various sections of a `RestoreSession` object. + +### RestoreSession `Spec` + +A `RestoreSession` object has the following fields in the `spec` section. + +#### spec.driver + +`spec.driver` indicates the mechanism used to restore a target. Currently, Stash supports `Restic` and `VolumeSnapshotter` as drivers. The default value of this field is `Restic`. + +| Driver | Usage | +| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `Restic` | Used to restore workload data, persistent volumes data and databases. It uses [restic](https://restic.net) to restore the target. | +| `VolumeSnapshotter` | Used to initialize PersistentVolumeClaim from VolumeSnapshot. It leverages Kubernetes [VolumeSnapshot](https://kubernetes.io/docs/concepts/storage/volume-snapshots/) crd and CSI driver to initialize the target PVCs from respective snapshots. Currently, it can restore only in the new PVC. | + +#### spec.target + +`spec.target` field indicates the target where data will be restored. This section consists of the following fields: + +- **spec.target.alias :** `spec.target.alias` field specifies the alias that was used as the identifier of the backed up data. It must match with the alias used during backup. + +- **spec.target.ref :** `spec.target.ref` refers to the restore target. You have to specify `apiVersion`, `kind`, and `name` of the target. Stash will use this information to inject an `init-container` or to create a restore job. + +- **spec.target.volumeMounts :** `spec.target.volumeMounts` specifies a list of volumes and their `mountPath` where the data will be restored. Stash will mount these volumes inside the `init-container` or restore job. + +> Note: Stash stores the absolute path of the backed up files. Hence, your restored volume must be mounted on the same `mountPath` as the original volume. Otherwise, the backed up files will not be restored into your desired volume. + +- **spec.target.volumeClaimTemplates :** You can specify a list of PVC template using `spec.target.volumeClaimTemplates` field. Stash will create those PVCs then it will restore the desired data into them. Then, you can use those PVCs to deploy your desired workload. + +- **spec.target.replicas :** If you want to restore the volumes of a StatefulSet through `spec.target.volumeClaimTemplate` field, you can specify the number of replicas of the StatefulSet using `spec.target.replicas`. In this case, you have to use `${POD_ORDINAL}` variable suffix in the claim name. Stash will replace that variable with respective ordinal and it will create the volumes for each replica. For more details, please visit [here](/docs/v2024.12.18/guides/use-cases/clone-pvc/#clone-the-volumes-of-a-satefulset). + +- **spec.target.rules :** `spec.target.rules` is an array of restore rules that specify how Stash should restore data for each host. For example, Stash runs the restore process in all pods of a StatefulSet. You can configure this `spec.target.rules` section to control what data will be restored into which pod. Each restore rule has the following fields: + + - **targetHosts :** `targetHosts` field contains a list of host names that are subject to this rule. If `targetHosts` field is empty, this rule applies to all hosts for which there is no specific rule. In the sample `RestoreSession` given above, the first rule applies to only `pod-3` and `pod-4` and the second rule is applicable to all hosts. + - **sourceHost :** `sourceHost` specifies the name of host whose backed up data will be restored by this rule. In the sample `RestoreSession`, the first rule specifies that backed up data of `pod-0` will be restored into `pod-3` and `pod-4`. If you keep `sourceHost` field empty as the second rule of the above example, data from a similar backup host will be restored on the respective restore host. That means, backed up data of `pod-0` will be restored into `pod-0`, backed up data of `pod-1` will be restored into `pod-1` and so on. + - **paths :** `paths` specifies a list of file paths that will be restored into the hosts who are subject to this rule. + - **snapshots :** `snapshots` specifies the list of snapshots that will be restored into the hosts who are subject to this rule. If you don't specify the snapshot field, the latest snapshot of the file paths specified in the `paths` section will be restored. + - **include :** `include` field specifies a list of patterns for the files that should be restored. Stash only restore the files that match these patterns. + - **exclude :** `exclude` field specifies a list of patterns for the files that should be ignored during. Stash will not restore the files that match these patterns. + + Restore rules comply with the following conditions: + + - There could be at most one rule with an empty `targetHosts` field. + - No two rules with non-empty `targetHosts` can't be matched for a single host. + - Stash restore only one file path in a single snapshot. So, if you specify `snapshots` field in a rule, you can't specify `paths` field as it may cause restore failure if a file path wasn't backed up in the snapshot specified in the `snapshots` field. + - If no rule matches for a host, no data will be restored on that host. + - The order of the rules does not have any effect on the restoration process. + +#### spec.repository + +`spec.repository` specifies the name and namespace of the Repository CR that holds the necessary backend information where the backed up data has been stored. + +- `spec.repository.name` specifies the name of the Repository CR. +- `spec.repository.namespace` specifies the namespace of the Repository. If you don't provide this field, Stash will look for the Repository CR in the same namespace as the RestoreSession. + +#### spec.task + +`spec.task` specifies the name and parameters of the [Task](/docs/v2024.12.18/concepts/crds/task/) crd to use to restore the target data. + +- **spec.task.name:** `spec.task.name` indicates the name of the `Task` template to use for this restore process. +- **spec.task.params:** `spec.task.params` is an array of custom parameters to use to configure the task. + +> `spec.task` section is not necessary for restoring workload data (i.e. Deployment, DaemonSet, StatefulSet, etc.). However, it is necessary for restoring the database and stand-alone PVC. + +#### spec.hooks + +`spec.hooks` allows performing some actions before and after the restoration process. You can send HTTP requests to a remote server via `httpGet` or `httpPost` hooks. You can check whether a TCP socket is open using `tcpSocket` hook. You can also execute some commands into your application pod using `exec` hook. + +- **spec.hooks.preRestore:** `spec.hooks.preRestore` hooks are executed before the restore process. +- **spec.hooks.postRestore:** `spec.hooks.postRestore` hooks are executed after the restore process. Unlike the `preRestore` hook, `postRestore` hook has an extra field named `executionPolicy` which let you execute hook based on the restore status. Currently, it support the following values: + - `Always`: The hook will be executed after the restore process no matter the restore has failed or succeeded. This is the default behavior. + - `OnSuccess`: The hook will be executed after the restore process only if the restore has succeeded. + - `OnFailure`: The hook will be executed after the restore process only if the restore has failed. + +For more details on how hooks work in Stash and how to configure different types of hook, please visit [here](/docs/v2024.12.18/guides/hooks/overview/). + +#### spec.runtimeSettings + +`spec.runtimeSettings` allows to configure runtime environment for restore `init-container` or job. You can specify runtime settings in both the pod level and container level. + +- **spec.runtimeSettings.container** + + `spec.runtimeSettings.container` is used to configure restore init-container/job in container level. You can configure the following container level parameters, + +| Field | Usage | +| :---------------: | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `resources` | Compute resources required by restore init-container or restore job. To know how to manage resources for containers, please visit [here](https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/). | +| `livenessProbe` | Periodic probe of restore init-container/job's container liveness. The container will be restarted if the probe fails. | +| `readinessProbe` | Periodic probe of restore init-container/job's container readiness. The container will be removed from service endpoints if the probe fails. | +| `lifecycle` | Actions that the management system should take in response to container lifecycle events. | +| `securityContext` | Security options that restore init-container/job's container should run with. For more details, please visit [here](https://kubernetes.io/docs/concepts/policy/security-context/). | +| `nice` | Set CPU scheduling priority for the restore process. For more details about `nice`, please visit [here](https://www.askapache.com/optimize/optimize-nice-ionice/#nice). | +| `ionice` | Set I/O scheduling class and priority for the restore process. For more details about `ionice`, please visit [here](https://www.askapache.com/optimize/optimize-nice-ionice/#ionice). | +| `env` | A list of the environment variables to set in the restore init-container/job's container. | +| `envFrom` | This allows to set environment variables to the restore init-container/job's container from a Secret or ConfigMap. | + +- **spec.runtimeSettings.pod** + + `spec.runtimeSettings.pod` is used to configure restore job in pod level. You can configure following pod level parameters, + +| Field | Usage | +| ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `serviceAccountName` | Name of the `ServiceAccount` to use for restore job. Stash init-container will use the same `ServiceAccount` as the target. | +| `nodeSelector` | Selector which must be true for restore job pod to fit on a node. | +| `automountServiceAccountToken` | Indicates whether a service account token should be automatically mounted into the restore job's pod. | +| `nodeName` | NodeName is used to request to schedule restore job's pod onto a specific node. | +| `securityContext` | Security options that restore job's pod should run with. For more details, please visit [here](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/). | +| `imagePullSecrets` | A list of secret names in the same namespace that will be used to pull images from the private docker registry. For more details, please visit [here](https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/). | +| `affinity` | Affinity and anti-affinity to schedule restore job's pod in the desired node. For more details, please visit [here](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity). | +| `schedulerName` | Name of the scheduler that should dispatch the restore job. | +| `tolerations` | Taints and Tolerations to ensure that restore job's pod is not scheduled in inappropriate nodes. For more details about `toleration`, please visit [here](https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/). | +| `priorityClassName` | Indicates the restore job pod's priority class. For more details, please visit [here](https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/). | +| `priority` | Indicates the restore job pod's priority value. | +| `readinessGates` | Specifies additional conditions to be evaluated for Pod readiness. For more details, please visit [here](https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-readiness-gate). | +| `runtimeClassName` | RuntimeClass is used for selecting the container runtime configuration. For more details, please visit [here](https://kubernetes.io/docs/concepts/containers/runtime-class/) | +| `enableServiceLinks` | EnableServiceLinks indicates whether information about services should be injected into pod's environment variables. | + +#### spec.tempDir + +Stash mounts an `emptyDir` for holding temporary files. It is also used for `caching` for faster restore performance. You can configure the `emptyDir` using `spec.tempDir` section. You can also disable `caching` using this field. The following fields are configurable in `spec.tempDir` section: + +- **spec.tempDir.medium :** Specifies the type of storage medium should back this file path. +- **spec.tempDir.sizeLimit :** Maximum limit of storage for this volume. +- **spec.tempDir.disableCaching :** Disable caching while restoring. This may negatively impact restore performance. This field is set to `false` by default. + +#### spec.timeOut + +`spec.timeOut` specifies the maximum amount of time to wait for the restore to complete. If the restore doesn't complete within this time limit, Stash will mark the respective RestoreSession as `Failed`. You can specify the timeout in the following format: + +- Seconds `30s` +- Minutes `10m` +- Hours `1h` +- Combination of seconds, minutes, and hours `10m30s`, `1h30m` etc. + +Stash does not support providing days (`d`) in the `timeOut` field. Use the equivalent hours instead. + +#### spec.interimVolumeTemplate + +For some targets (i.e. some databases), Stash can't directly pipe the restored data into the target. In this case, it has to store the restored data temporarily before injecting into the target. `spec.interimVolumeTemplate` specifies a PVC template for holding those data temporarily. Stash will create a PVC according to the template and use it to store the data temporarily. This PVC will be deleted automatically if you delete the `RestoreSession`. + +>Note that the usage of this field is different from `spec.tempDir` which is used for caching purpose. Stash has introduced this field because the `emptyDir` volume that is used for `spec.tempDir` does not play nice with large databases( i.e. 100Gi database). Also, it provides debugging capability as Stash keeps it until you delete the `RestoreSession`. + +### RestoreSession `Status` + +`.status` section of `RestoreSession` shows progress, stats, and overall phase of the restore process. The restore init-container or job adds its respective stats in `.status` section after it completes its task. `.status` section consists of the following fields: + +#### status.totalHosts + +Not every pod or replica of the target will run the restore process. Thus, we refer those entities that run the restore process as a host. `status.totalHosts` specifies the total number of hosts that will run the restore process for this RestoreSession. For more details on how many hosts will run restore process for which types of workload, please visit [here](#hosts-of-a-restore-process). + +#### status.phase + +`status.phase` indicates the overall phase of the restore process for this RestoreSession. `status.phase` will be `Succeeded` only if the phase of all hosts are `Succeeded`. If any of the hosts fail to complete restore, `status.phase` will be `Failed`. + +#### status.sessionDuration + +`status.sessionDuration` indicates the total time taken to complete the restoration of all hosts. + +#### status.sessionDeadline + +`status.sessionDeadline` indicates the the deadline of the restore process. `RestoreSession` will be considered `Failed` if the restore does not complete within this deadline. + + +#### status.conditions + +`status.conditions` shows the conditions of various steps of the restore process. Stash sets the following conditions for a RestoreSession: + +| Condition Type | Usage | +| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | +| `RepositoryFound` | Indicates whether the respective Repository object was found or not. | +| `BackendSecretFound` | Indicates whether the respective backend secret was found or not. | +| `RestoreTargetFound` | Indicates whether the restore target was found or not. | +| `StashInitContainerInjected` | Indicates whether stash init-container was injected into the targeted workload or not. This condition is applicable only in the sidecar model. | +| `RestorerEnsured` | Indicates whether the Restorer job/init-container was created or not. | +| `ValidationPassed` | Indicates whether the resource has passed validation checks or not. | +| ` MetricsPushed` | Indicates whether the metrics have been pushed to the Pushgateway or not. | +| `DeadlineExceeded` | Indicates whether the session deadline was exceeded or not.| + +#### status.stats + +`status.stats` section is an array of restore statistics of individual hosts. Each host adds their statistics in this array after completing their restore process. This field is only available for the `Restic` driver but not available for the `VolumeSnapshotter` driver. The default value of the driver is `Restic`. + +Individual host stats entry consists of the following fields: + +- **hostname :** `hostname` indicates the name of the host. Usually, it is the `alias` or `alias-`. For more details, please visit [here](/docs/v2024.12.18/concepts/crds/backupsession/#hosts-of-a-backup-process). +- **phase :** `phase` indicates the restore phase of this host. +- **duration :** `duration` indicates the total time taken to complete the restore process for this host. +- **error :** `error` shows the reason for failure if the restore process fails for this host. + +## Next Steps + +- Learn how restore of workloads data works from [here](/docs/v2024.12.18/guides/workloads/overview/). +- Learn how restore of databases works from [here](/docs/v2024.12.18/guides/addons/overview/). +- Learn how restore stand-alone PVC works from [here](/docs/v2024.12.18/guides/volumes/overview/). diff --git a/content/docs/v2024.12.18/concepts/crds/restoresession/restoresession.yaml b/content/docs/v2024.12.18/concepts/crds/restoresession/restoresession.yaml new file mode 100644 index 0000000000..9ac033e18e --- /dev/null +++ b/content/docs/v2024.12.18/concepts/crds/restoresession/restoresession.yaml @@ -0,0 +1,116 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: statefulset-restore + namespace: demo +spec: + driver: Restic + repository: + name: minio-repo + namespace: demo + # task: + # name: workload-restore # task field is not required for workload data backup but it is necessary for database backup. + target: + alias: my-sts + ref: + apiVersion: apps/v1 + kind: StatefulSet + name: recovered-statefulset + volumeMounts: + - mountPath: /source/data + name: source-data + rules: + - targetHosts: ["my-sts-3","my-sts-4"] # "pod-3" and "pod-4" will have restored data of backed up host "pod-1" + sourceHost: "my-sts-1" # source host + paths: + - /source/data + include: + - /source/data/*.json + - targetHosts: [] # empty host match all hosts + sourceHost: "" # no source host indicates that the host is pod itself + paths: + - /source/data + exclude: + - /source/data/tmp.json + - /source/data/*.txt + hooks: + preRestore: + exec: + command: + - /bin/sh + - -c + - echo "Sample PreRestore hook demo" + containerName: stash-init + postRestore: + executionPolicy: Always + exec: + command: + - /bin/sh + - -c + - echo "Sample PostRestore hook demo" + containerName: stash-init + runtimeSettings: + container: + resources: + limits: + memory: 256M + requests: + memory: 256M + securityContext: + runAsGroup: 2000 + runAsUser: 2000 + ionice: + class: 2 + classData: 4 + nice: + adjustment: 5 + pod: + imagePullSecrets: + - name: my-private-registry-secret + serviceAccountName: my-backup-sa + tempDir: + disableCaching: false + medium: Memory + sizeLimit: 2Gi + timeOut: 30m +status: + totalHosts: 5 + phase: Succeeded + sessionDuration: 2m40.595857548s + conditions: + - lastTransitionTime: "2020-07-25T17:55:56Z" + message: Repository demo/minio-repo exist. + reason: RepositoryAvailable + status: "True" + type: RepositoryFound + - lastTransitionTime: "2020-07-25T17:55:56Z" + message: Backend Secret demo/minio-secret exist. + reason: BackendSecretAvailable + status: "True" + type: BackendSecretFound + - lastTransitionTime: "2020-07-25T17:55:56Z" + message: Restore target apps/v1 statefulset/recovered-statefulset found. + reason: TargetAvailable + status: "True" + type: RestoreTargetFound + - lastTransitionTime: "2020-07-25T17:55:56Z" + message: Successfully injected stash init-container. + reason: InitContainerInjectionSucceeded + status: "True" + type: StashInitContainerInjected + stats: + - duration: 884.431745ms + hostname: host-1 + phase: Succeeded + - duration: 769.924342ms + hostname: host-2 + phase: Succeeded + - duration: 868.694738ms + hostname: host-3 + phase: Succeeded + - duration: 792.097784ms + hostname: host-4 + phase: Succeeded + - duration: 833.139795ms + hostname: host-0 + phase: Succeeded diff --git a/content/docs/v2024.12.18/concepts/crds/snapshot/index.md b/content/docs/v2024.12.18/concepts/crds/snapshot/index.md new file mode 100644 index 0000000000..827363e38f --- /dev/null +++ b/content/docs/v2024.12.18/concepts/crds/snapshot/index.md @@ -0,0 +1,216 @@ +--- +title: Snapshot Overview +menu: + docs_v2024.12.18: + identifier: snapshot-overview + name: Snapshot + parent: crds + weight: 50 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: concepts +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +> New to Stash? Please start [here](/docs/v2024.12.18/concepts/README). + +# Snapshot + +## What is Snapshot + +A `Snapshot` is a representation of backup snapshot in a Kubernetes native way. Stash uses an [Aggregated API Server](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/aggregated-api-servers.md) to provide `get` and `list` capabilities for snapshots from the backend. + +This enables you to view some useful information such as `creationTimestamp`, `snapshot id`, `backed up path` etc of a snapshot. This also provides the capability to restore a specific snapshot. + +## Snapshot structure + +Like other official Kuberentes resources, a `Snapshot` has `TypeMeta`, `ObjectMeta` and `Status` sections. However, unlike other Kubernetes resources, it does not have a `Spec` section. + +A sample `Snapshot` object is shown below, + +```yaml +apiVersion: repositories.stash.appscode.com/v1alpha1 +kind: Snapshot +metadata: + creationTimestamp: "2020-07-25T17:41:31Z" + labels: + hostname: app + repository: minio-repo + name: minio-repo-b54ee4a0 + namespace: demo + uid: b54ee4a0e9c9084696dc976f125c4fd0e6b1a31abfd82cfc857b3bc9e559fa2f +status: + gid: 0 + hostname: app + paths: + - /var/lib/html + repository: minio-repo + tree: 11527d99281bf3725d58cd637d1f3c19ab9d397d6cff1887a1cd1f9c8c5ebb80 + uid: 0 + username: "" +``` + +Here, we are going to describe the various sections of a `Snapshot` object. + +### Snapshot `Metadata` + +- **metadata.name** + + `metadata.name` specifies the name of the `Snapshot` object. It follows the following pattern, `-`. + +- **metadata.uid** + + `metadata.uid` specifies the complete id of the respective restic snapshot in the backend. + +- **metadata.creationTimestamp** + + `metadata.creationTimestamp` represents the time when the snapshot was created. + +- **metadata.labels** + + A `Snapshot` object holds `repository` and `hostname` as a label in `metadata.labels` section. This helps a user to query the snapshots of a particular repository and/or a particular host. + +### Snapshot `Status` + +`Snapshot` object has the following fields in `.status` section: + +- **status.gid** +`status.gid` indicates the group identifier of the user who took this backup. + +- **status.hostname** +`status.hostname` indicates the host identifier whose data has been backed up in this snapshot. In order to know how this host identifier are generated, please visit [here](/docs/v2024.12.18/concepts/crds/backupsession/#hosts-of-a-backup-process). + +- **status.paths** +`status.paths` indicates the paths that have been backed up in this snapshot. + +- **status.repository** +`status.repository` indicates the name of the Repository crd where this Snapshot came from. + +- **status.tree** +`status.tree` indicates `tree` of the restic snapshot. For more details, please visit [here](https://restic.readthedocs.io/en/stable/100_references.html#trees-and-data). + +- **status.uid** +`status.uid` indicates `uid` of the user who took this backup. For `root` user it is 0. + +- **status.username** +`status.username` indicates the name of the user who runs the backup process that took the backup. + +- **status.tags** +`status.tags` indicates the tags of the snapshot. + +## Working with Snapshot + +In this section, we are going to show different types of operations you can perform on the Snapshots. + +**Listing Snapshots:** + +Stash lists Snapshots directly from the backend. This operation can take more time than the default request timeout of `kubectl`. So, we are going to increase the request timeout through the `--request-timeout` flag for get/list commands. + +```bash +# List Snapshots of all Repositories in the current namespace +$ kubectl get snapshot --request-timeout=300s + +# List Snapshots of all Repositories of all namespaces +$ kubectl get snapshot --all-namespaces --request-timeout=300s + +# List Snapshots of all Repositories of a particular namespace +$ kubectl get snapshot -n demo --request-timeout=300s + +# List Snapshots of a particular Repository +$ kubectl get snapshot -l repository=local-repo --request-timeout=300s + +# List Snapshots from multiple Repositories +$ kubectl get snapshot -l 'repository in (local-repo,gcs-repo)' --request-timeout=300s + +# List Snapshots of a particular host +$ kubectl get snapshot -l hostname=db --request-timeout=300s + +# List Snapshots of a particular Repository and particular host +$ kubectl get snapshot -l repository=local-repo,hostname=db --request-timeout=300s +``` + +**Viewing information of a particular Snapshot:** + +```bash +$ kubectl get snapshot [-n ] -o yaml + +# Example: +$ kubectl get snapshot -n demo local-repo-02b0ed42 -o yaml +``` + +## Preconditions for Snapshot + +1. Stash provides `Snapshots` listing facility with the help of an Aggregated API Server. Your cluster must support Aggregated API Server. Otherwise, you won't be able to perform `get` or `list` operation on `Snapshot`. + +2. If you are using [local](/docs/v2024.12.18/guides/backends/local/) backend, the respective pod that took the backup must be in `Running` state. It is not necessary if you use cloud backends. + +## Next Steps + +- Learn how to configure `BackupConfiguration` to backup workloads data from [here](/docs/v2024.12.18/guides/workloads/overview/). +- Learn how to configure `BackupConfiguration` to backup databases from [here](/docs/v2024.12.18/guides/addons/overview/). +- Learn how to configure `BackupConfiguration` to backup stand-alone PVC from [here](/docs/v2024.12.18/guides/volumes/overview/). diff --git a/content/docs/v2024.12.18/concepts/crds/snapshot/snapshot.yaml b/content/docs/v2024.12.18/concepts/crds/snapshot/snapshot.yaml new file mode 100644 index 0000000000..2903474b9f --- /dev/null +++ b/content/docs/v2024.12.18/concepts/crds/snapshot/snapshot.yaml @@ -0,0 +1,19 @@ +apiVersion: repositories.stash.appscode.com/v1alpha1 +kind: Snapshot +metadata: + creationTimestamp: "2020-07-25T17:41:31Z" + labels: + hostname: app + repository: minio-repo + name: minio-repo-b54ee4a0 + namespace: demo + uid: b54ee4a0e9c9084696dc976f125c4fd0e6b1a31abfd82cfc857b3bc9e559fa2f +status: + gid: 0 + hostname: app + paths: + - /var/lib/html + repository: minio-repo + tree: 11527d99281bf3725d58cd637d1f3c19ab9d397d6cff1887a1cd1f9c8c5ebb80 + uid: 0 + username: "" diff --git a/content/docs/v2024.12.18/concepts/crds/task/index.md b/content/docs/v2024.12.18/concepts/crds/task/index.md new file mode 100644 index 0000000000..f01446aceb --- /dev/null +++ b/content/docs/v2024.12.18/concepts/crds/task/index.md @@ -0,0 +1,163 @@ +--- +title: Task Overview +menu: + docs_v2024.12.18: + identifier: task-overview + name: Task + parent: crds + weight: 35 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: concepts +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +> New to Stash? Please start [here](/docs/v2024.12.18/concepts/README). + +# Task + +## What is Task + +An entire backup or restore process needs an ordered execution of one or more steps. A [Function](/docs/v2024.12.18/concepts/crds/function/) represents a step of a backup or restore process. A `Task` is a Kubernetes `CustomResourceDefinition`(CRD) which specifies a sequence of functions along with their parameters in a Kubernetes native way. + +When you install Stash, some `Task`s will be pre-installed for supported targets like databases, etc. However, you can create your own `Task` to customize or extend the backup/restore process. Stash will execute these steps in the order you have specified. + +## Task CRD Specification + +Like any official Kubernetes resource, a `Task` has `TypeMeta`, `ObjectMeta` and `Spec` sections. However, unlike other Kubernetes resources, it does not have a `Status` section. + +A sample `Task` object to backup a PostgreSQL database is shown below: + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: Task +metadata: + name: postgres-backup-11.2 +spec: + steps: + - name: postgres-backup-11.2 + params: + - name: outputDir # specifies where to write output file + value: /tmp/output + - name: secretVolume # specifies where backend secret has been mounted + value: secret-volume + - name: update-status + params: + - name: outputDir + value: /tmp/output + - name: secretVolume + value: secret-volume + volumes: + - name: secret-volume + secret: + secretName: ${REPOSITORY_SECRET_NAME} +``` + +This `Task` uses two functions to backup a PostgreSQL database. The first step uses `postgres-backup-11.2` function that dumps PostgreSQL database and uploads the dumped file. The second step uses `update-status` function which updates the status of the `BackupSession` and `Repository` crd for respective backup. + +Here, we are going to describe the various sections of a `Task` crd. + +### Task `Spec` + +A `Task` object has the following fields in the `spec` section: + +#### spec.steps + +`spec.steps` section specifies a list of functions and their parameters in the order they should be executed. You can also templatize this section using the [variables](/docs/v2024.12.18/concepts/crds/function/#stash-provided-variables) that Stash can resolve itself. Stash will resolve all the variables and create a pod definition with a container specification for each `Function` specified in `steps` section. + +Each `step` consists of the following fields: + +- **name :** `name` specifies the name of the `Function` that will be executed at this step. +- **params :** `params` specifies an optional list of variables names and their values that Stash should use to resolve the respective `Function`. If you use a variable in a `Function` specification whose value Stash cannot provide, you can pass the value of that variable using this `params` section. You have to specify the following fields for a variable: + - **name :** `name` of the variable. + - **value :** value of the variable. + +In the above example `Task`, we have used `outputDir` variable in `postgres-backup-11.2` function that Stash can't resolve automatically. So, we have passed the value using the `params` section in the `Task` object. + +>Stash executes the `Functions` in the order they appear in `spec.steps` section. All the functions except the last one will be used to create `init-container` specification and the last function will be used to create `container` specification for respective backup job. This guarantees an ordered execution of the steps. + +#### spec.volumes + +`spec.volumes` specifies a list of volumes that should be mounted in the respective job created for this `Task`. In the sample we have shown above, we need to mount storage secret for the backup job. So, we have added the secret volume in `spec.volumes` section. Note that, we have used `REPOSITORY_SECRET_NAME` variable as secret name. This variable will be resolved by Stash from `Repository` specification. + +## Why Function and Task? + +You might be wondering why we have introduced `Function` and `Task` crd. We have designed `Function-Task` model for the following reasons: + +- **Customizability:** `Function` and `Task` enables you to customize backup/recovery process. For example, currently we use [mysqldump](https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html) in `mysql-backup` Function to backup MySQL database. You can build a custom `Function` using Percona's [xtrabackup](https://www.percona.com/software/mysql-database/percona-xtrabackup) tool instead of `mysqldump`. Then you can write a `Task` with this custom `Function` and use it to backup your target MySQL database. + + You can also customize backup/restore process by executing hooks before or after the backup/restore process. For example, if you want to execute some logic to prepare your apps for backup or you want to send an email notification after each backup, you just need to add `Function` with your custom logic and respective `Task` to execute them. + +- **Extensibility:** Currently, Stash supports backup of MySQL, MongoDB and PostgreSQL databases. You can easily backup the databases that are not officially supported by Stash. You just need to create a `Function` and a `Task` for your desired database. + +- **Re-usability:** `Function`'s are self-sufficient and independent of Stash. So, you can reuse them in any application that uses `Function-Task` model. + +## Next Steps + +- Learn how Stash backup databases using `Function-Task` model from [here](/docs/v2024.12.18/guides/addons/overview/). +- Learn how Stash backup stand-alone PVC using `Function-Task` model from [here](/docs/v2024.12.18/guides/volumes/overview/). diff --git a/content/docs/v2024.12.18/concepts/crds/task/task.yaml b/content/docs/v2024.12.18/concepts/crds/task/task.yaml new file mode 100644 index 0000000000..375a9f6ed5 --- /dev/null +++ b/content/docs/v2024.12.18/concepts/crds/task/task.yaml @@ -0,0 +1,22 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: Task +metadata: + name: postgres-backup-11.2 +spec: + steps: + - name: postgres-backup-11.2 + params: + - name: outputDir # specifies where to write output file + value: /tmp/output + - name: secretVolume # specifies where backend secret has been mounted + value: secret-volume + - name: update-status + params: + - name: outputDir + value: /tmp/output + - name: secretVolume + value: secret-volume + volumes: + - name: secret-volume + secret: + secretName: ${REPOSITORY_SECRET_NAME} diff --git a/content/docs/v2024.12.18/concepts/what-is-stash/_index.md b/content/docs/v2024.12.18/concepts/what-is-stash/_index.md new file mode 100644 index 0000000000..2f299c403c --- /dev/null +++ b/content/docs/v2024.12.18/concepts/what-is-stash/_index.md @@ -0,0 +1,78 @@ +--- +title: What is Stash +description: What is Stash +menu: + docs_v2024.12.18: + identifier: what-is-stash + parent: concepts + name: What is Stash + weight: 10 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/concepts/what-is-stash/architecture/images/stash_architecture.svg b/content/docs/v2024.12.18/concepts/what-is-stash/architecture/images/stash_architecture.svg new file mode 100644 index 0000000000..04fae9a129 --- /dev/null +++ b/content/docs/v2024.12.18/concepts/what-is-stash/architecture/images/stash_architecture.svg @@ -0,0 +1,924 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/concepts/what-is-stash/architecture/index.md b/content/docs/v2024.12.18/concepts/what-is-stash/architecture/index.md new file mode 100644 index 0000000000..f4a7b9bb92 --- /dev/null +++ b/content/docs/v2024.12.18/concepts/what-is-stash/architecture/index.md @@ -0,0 +1,160 @@ +--- +title: Stash Architecture +description: Stash Architecture +menu: + docs_v2024.12.18: + identifier: architecture-concepts + name: Architecture + parent: what-is-stash + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: concepts +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash Architecture + +Stash is a Kubernetes operator for [restic](https://restic.net/). At the heart of Stash, it is a Kubernetes [controller](https://book.kubebuilder.io/cronjob-tutorial/controller-overview.html). It uses [Custom Resource Definition(CRD)](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/) to specify targets and behaviors of backup and restore process in a Kubernetes native way. A simplified architecture of Stash is shown below: + +
+  Stash Architecture +
Fig: Stash Architecture
+
+ +## Components + +Stash consists of various components that implement backup and restore logic. This section will give you a brief overview of such components. + +### Stash Operator + +When a user installs Stash, it creates a Kubernetes [Deployment](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) typically named `stash-operator`. This deployment controls the entire backup and restore process. `stash-operator` deployment runs two containers. One of them is called `operator` which performs the core functionality of Stash and the other one is `pushgateway` which is a Prometheus [pushgateway](https://github.com/prometheus/pushgateway). + +#### Operator + +`operator` container runs all the controllers as well as an [Aggregated API Server](https://kubernetes.io/docs/tasks/access-kubernetes-api/setup-extension-api-server/). + +##### Controllers + +Controllers watch various Kubernetes resources as well as the custom resources introduced by Stash. It applies the backup or restore logic for a target resource when requested by users. + +##### Aggregated API Server + +Aggregated API Server self-hosts validating and mutating [webhooks](https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/) and runs an Extension API Server for Snapshot resource. + +- **Mutating Webhook:** Stash uses Mutating Webhook to inject backup `sidecar` or restore `init-container` into a workload if any backup or restore process is configured for it. It is also used for defaulting custom resources. + +- **Validating Webhook:** Validating Webhook is used to validate the custom resource objects. + +- **Snapshot Server:** Stash uses Kubernetes Extended API Server to provide `view` and `list` capability of backed up snapshots. When a user requests for Snapshot objects, Snapshot server reads respective information directly from backend repository and returns object representation in a Kubernetes native way. + +#### Pushgateway + +`pushgateway` container runs Prometheus [pushgateway](https://github.com/prometheus/pushgateway). All the backup sidecars/jobs and restore init-containers/jobs send Prometheus metrics to this pushgateway after completing their backup or restore process. Prometheus server can scrape those metrics from this pushgateway. + +### Backend + +Backend is the storage where Stash stores backed up files. It can be a cloud storage like GCS bucket, AWS S3, Azure Blob Storage etc. or a Kubernetes persistent volume like [NFS](https://kubernetes.io/docs/concepts/storage/volumes/#nfs), [PersistentVolumeClaim](https://kubernetes.io/docs/concepts/storage/volumes/#persistentvolumeclaim), etc. To learn more about backend, please visit [here](/docs/v2024.12.18/guides/backends/overview/). + +### CronJob + +When a user creates a [BackupConfiguration](#backupconfiguration) object, Stash creates a CronJob with the schedule specified in it. At each scheduled slot, this CronJob triggers a backup for the targeted workload. + +### Backup Sidecar / Backup Job + +When a user creates a [BackupConfiguration](#backupconfiguration) object, Stash injects a `sidecar` to the target if it is a workload (i.e. `Deployment`, `DaemonSet`, `StatefulSet` etc.). This `sidecar` takes backup when the respective CronJob triggers a backup. If the target is a database or stand-alone volume, Stash creates a job to take backup at each trigger. + +### Restore Init-Container / Restore Job + +When a user creates a [RestoreSession](#restoresession) object, Stash injects an `init-container` to the target if it is a workload (i.e. `Deployment`, `DaemonSet`, `StatefulSet` etc.). This `init-container` performs restore process on restart. If the target is a database or stand-alone volume, Stash creates a job to restore the target. + +### Custom Resources + +Stash uses [Custom Resource Definition(CRD)](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/) to specify targets and behaviors of backup and restore process in a Kubernetes native way. This section will give you a brief overview of the custom resources used by Stash. + +- **Repository:** A `Repository` specifies the backend storage system where the backed up data will be stored. A user has to create `Repository` object for each backup target. Only one target can be backed up into one `Repository`. For details about `Repository`, please visit [here](/docs/v2024.12.18/concepts/crds/repository/). + +- **BackupConfiguration:** A `BackupConfiguration` specifies the backup target, behaviors (schedule, retention policy etc.), `Repository` object that holds backend information etc. A user has to create one `BackupConfiguration` object for each backup target. When a user creates a `BackupConfiguration`, Stash creates a CronJob for it and injects backup sidecar to the target if it is a workload (i.e. Deployment, DaemonSet, StatefulSet etc.). For more details about `BackupConfiguration`, please visit [here](/docs/v2024.12.18/concepts/crds/backupconfiguration/). + +- **BackupSession:** A `BackupSession` object represents a backup run of a target. It is created by respective CronJob at each scheduled time slot. It refers to a `BackupConfiguration` object for necessary configuration. Controller that runs inside backup sidecar (in case of backup via job, it is stash operator itself) will watch this `BackupSession` object and start taking the backup instantly. A user can also create a `BackupSession` object manually to trigger instant backups. For more details about `BackupSession`s, please visit [here](/docs/v2024.12.18/concepts/crds/backupsession/). + +- **RestoreSession:** A `RestoreSession` specifies what to restore and the source of data. A user has to create a `RestoreSession` object when s/he wants to restore a target. When s/he creates a `RestoreSession`, Stash injects an `init-container` into the target workload (launches a job if the target is not a workload) to restore. For more details about `RestoreSession`, please visit [here](/docs/v2024.12.18/concepts/crds/restoresession/). + +- **Function:** A `Function` is a template for a container that performs only a specific action. For example, `pg-backup` function only dumps and uploads the dumped file into the backend, whereas `update-status` function updates the status of the respective `BackupSession` and `Repository` and sends Prometheus metrics to `pushgateway` based on the output of another function. For more details about `Function`, please visit [here](/docs/v2024.12.18/concepts/crds/function/). + +- **Task:** A complete backup or restore process may consist of several steps. For example, in order to backup a PostgreSQL database we first need to dump the database, upload the dumped file to backend and then we need to update `Repository` and `BackupSession` status and send Prometheus metrics. We represent such individual steps via `Function` objects. An entire backup or restore process needs an ordered execution of one or more functions. A `Task` specifies an ordered collection of functions along with their parameters. `Function` and `Task` enables users to extend or customize the backup/restore process. For more details about `Task`, please visit [here](/docs/v2024.12.18/concepts/crds/task/). + +- **BackupBlueprint:** A `BackupBlueprint` enables users to provide a blueprint for `Repository` and `BackupConfiguration` object. Then, s/he just needs to add some annotations to the workload s/he wants to backup. Stash will automatically create respective `Repository` and `BackupConfiguration` according to the blueprint. In this way, users can create a single blueprint for all similar types of workloads and backup them only by applying some annotations on them. In Stash parlance, we call this process **Auto Backup**. For more details about `BackupBlueprint`, please visit [here](/docs/v2024.12.18/concepts/crds/backupblueprint/). + +- **BackupBatch:** Sometimes, a single stateful component may not meet the requirements of your application. For example, in order to deploy a WordPress, you will need a Deployment for the WordPress and another Deployment for database to store it's contents. Now, you may want to backup both of the deployment and database together as they are parts of a single application. A `BackupBatch` is a Kubernetes `CustomResourceDefinition`(CRD) which lets you configure backup for multiple co-related stateful components(workload, database etc.) together. For more details, please visit [here](/docs/v2024.12.18/concepts/crds/backupbatch/). + +- **RestoreBatch:** A `RestoreBatch` allows restoring of multiple co-related targets together that were backed up using a `BackupBatch`. For more details, please visit [here](/docs/v2024.12.18/concepts/crds/restorebatch/). + +- **AppBinding:** An `AppBinding` holds necessary information to connect with an application. For more details about `AppBinding`, please visit [here](/docs/v2024.12.18/concepts/crds/appbinding/). + +- **Snapshot:** A `Snapshot` is a representation of a backup snapshot in a Kubernetes native way. Stash uses Kuberentes Extended API Server for handling `Snapshot`s. For more details about `Snapshot`s, please visit [here](/docs/v2024.12.18/concepts/crds/snapshot/). diff --git a/content/docs/v2024.12.18/concepts/what-is-stash/overview/index.md b/content/docs/v2024.12.18/concepts/what-is-stash/overview/index.md new file mode 100644 index 0000000000..7244a0a8f2 --- /dev/null +++ b/content/docs/v2024.12.18/concepts/what-is-stash/overview/index.md @@ -0,0 +1,112 @@ +--- +title: Stash Overview +description: Stash Overview +menu: + docs_v2024.12.18: + identifier: overview-concepts + name: Overview + parent: what-is-stash + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: concepts +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash + +[Stash](https://stash.run) by AppsCode is a cloud native data backup and recovery solution for Kubernetes workloads. If you are running production workloads in Kubernetes, you might want to take backup of your disks, databases etc. Traditional tools are too complex to setup and maintain in a dynamic compute environment like Kubernetes. Stash is a Kubernetes operator that uses [restic](https://github.com/restic/restic) or Kubernetes CSI Driver VolumeSnapshotter functionality to address these issues. Using Stash, you can backup Kubernetes volumes mounted in workloads, stand-alone volumes and databases. User may even extend Stash via [addons](https://stash.run/docs/{{< param "info.version" >}}/guides/addons/overview/) for any custom workload. + +## Features + +| Features | Community Edition | Enterprise Edition | Scope | +| --------------------------------------------------------------------------------------- | :---------------: | :----------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| | Open source Stash Free for everyone | Open Core Stash for production Enterprise workloads | | +| Backup & Restore Stand-alone Volume (PVC) | ✓ | ✓ | PersistentVolumeClaim, PersistentVolume | +| Schedule Backup, Instant Backup | ✓ | ✓ | Schedule through [cron expression](https://en.wikipedia.org/wiki/Cron) or trigger instant backup using Stash Kubernetes plugin | +| Pause Backup | ✓ | ✓ | No new backup when paused. | +| Backup & Restore subset of files | ✓ | ✓ | Only backup/restore the files that matches the provided patterns | +| Cleanup old snapshots automatically | ✓ | ✓ | Cleanup old snapshots according to different [retention policies](https://restic.readthedocs.io/en/stable/060_forget.html#removing-snapshots-according-to-a-policy) | +| Encryption, Deduplication (send only diff) | ✓ | ✓ | Encrypt backed up data with AES-256. Stash only sends the changes since last backup. | +| [CSI Driver Integration](https://kubernetes.io/docs/concepts/storage/volume-snapshots/) | ✓ | ✓ | VolumeSnapshot for Kubernetes workloads. Supported for Kubernetes v1.17.0+. | +| Prometheus Metrics | ✓ | ✓ | Rich backup metrics, restore metrics and Stash operator metrics. | +| Security | ✓ | ✓ | Built-in support for RBAC, PSP and Network Policy | +| CLI | ✓ | ✓ | `kubectl` plugin (for Kubernetes 1.12+) | +| Extensibility and Customizability | ✓ | ✓ | Write addons for bespoke applications and customize currently supported workloads | +| Hooks | ✓ | ✓ | Execute `httpGet`, `httpPost`, `tcpSocket` and `exec` hooks before and after of backup or restore process. | +| Cloud Storage as Backend | ✓ | ✓ | Stores backup data in AWS S3, Minio, Rook, GCS, Azure, OpenStack Swift, Backblaze B2 and Rest Server | +| On-prem Storage as Backend | ✗ | ✓ | Stores backup data in any locally mounted Kubernetes Volumes such as NFS, etc. | +| Backup & Restore databases | ✗ | ✓ | PostgreSQL, MySQL, MongoDB, Elasticsearch, Redis, MariaDB, Percona XtraDB | +| Auto Backup | ✗ | ✓ | Share backup configuration across workloads using templates. Enable backup for a target application via annotation. | +| Batch Backup & Batch Restore | ✗ | ✓ | Backup and restore co-related applications (eg, WordPress server and its database) together | +| Point-In-Time Recovery (PITR) | ✗ | Planned | Restore a set of files from a time in the past. | +| Role Based Access Control (RBAC) | ✓ | ✓ | | +| Open Policy Agent (OPA) | ✓ | ✓ | | +| Pod Security Policy (PSP) | ✓ | ✓ | | +| Network Policy | ✓ | ✓ | | +| GDPR | ✗ | Planned | | \ No newline at end of file diff --git a/content/docs/v2024.12.18/design.md b/content/docs/v2024.12.18/design.md new file mode 100644 index 0000000000..717061745b --- /dev/null +++ b/content/docs/v2024.12.18/design.md @@ -0,0 +1,902 @@ +# Stash Design Overview + +We are going to make a design overhaul of Stash to simplify backup and recovery process and support some most requested features. This doc will discuss what features stash is going to support and how these features may work. + +We have introduced some new crd such as [Function](#function), [Task](#action) etc. and made whole process more modular. This will make easy to add support for new features and the users will also be able to customize backup process. Furthermore, this will make stash resources inter-operable between different tools and even might allow to use stash resources as function in serverless concept. + +**We are hoping this design will graduate to GA. So, we are taking security seriously. We are going to make sure that nobody can bypass clusters security using Stash. This might requires to remove some existing features (for example, restore from different namespace). However, we are going to provide an alternate way to cover those use cases.** + +## Goal + +Goal of this new design to support following features: +- [Schedule Backup and Restore Workload Data](#schedule-backup-and-restore-workload-data) +- [Schedule Backup and Restore PVC](#schedule-backup-and-restore-pvc) +- [Schedule Backup and Restore Database](#schedule-backup-and-restore-database) +- [Schedule Backup Cluster YAMLs](#schedule-backup-cluster-yamls) +- [Trigger Backup Instantly](#trigger-backup-instantly) +- [Default Backup](#default-backup) +- [Auto Restore](#auto-restore) +- [Stash cli/kubectl-plugin](#stash-clikubectl-plugin) +- [Function](#function) +- [Task](#task) + +## Schedule Backup and Restore Workload Data + +### Backup Workload Data + +User will be able to backup data from a running workload. + +**What user have to do?** + +- Create a `Repository` crd. +- Create a `BackupConfiguration` crd pointing to targeted workload. + +Sample `Repository` crd: + +```yaml +apiVersion: stash.appscode.com/v1alpha2 +kind: Repository +metadata: + name: stash-backup-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-backup-repo + prefix: default/deployment/stash-demo + storageSecretName: gcs-secret +``` + +Sample `BackupConfiguration` crd: + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: workload-data-backup + namespace: demo +spec: + schedule: '@every 1h' + # + # repository refers to the Repository crd that hold backend information + repository: + name: stash-backup-repo + # target indicate the target workload that we want to backup + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + # directories indicates the directories inside the workload we want to backup + directories: + - /source/data + # retentionPolicies specify the policy to follow to clean old backup snapshots + retentionPolicy: + keepLast: 5 + prune: true +``` + +**How it will work?** + +- Stash will watch for `BackupCofiguration` crd. When it will find a `BackupConfiguration` crd, it will inject a `sidecar` container to the workload and start a `cron` for scheduled backup. +- In each schedule, the `cron` will create `BackupSession` crd. +- The `sidecar` container watches for `BackupSession` crd. If it finds one, it will take backup instantly and update `BackupSession` status accordingly. + +Sample `BackupSession` crd: + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupSession +metadata: + name: demo-volume-backup-session + namespace: demo +spec: + # backupConfiguration indicates the BackupConfiguration crd of respective target that we want to backup + backupConfiguration: + name: backup-volume-demo +status: + observedGeneration: 239844#2 + phase: Succeed + stats: + - direcotry: /source/data + snapshot: 40dc1520 + totalSize: 1.720 GiB + uploaded: 1.200 GiB # upload size can be smaller than original file size if there are some duplicate files + fileStats: + new: 5307 + changed: 0 + unmodified: 0 +``` + +### Restore Workload Data + +User will be able to restore backed up data either into a separate volume or into the same workload from where the backup was taken. Here, is an example for recovering into same workload. + +**What user have to do?** + +- Create a `RestoreSession` crd pointing `target` field to the workload. + +Sample `RestoreSession` crd to restore into same workload: + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: recovery-database-demo + namespace: demo +spec: + repository: + name: stash-backup-repo + target: # target indicates where the recovered data will be stored + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + directories: # indicates which directories will be recovered + - /source/data +``` + +**How it will work?** + +- When Stash will find a `RestoreSession` crd created to restore into a workload, it will inject a `init-container` to the targeted workload. +- Then, it will restart the workload. +- The `init-container` will restore data inside the workload. + +> **Warning:** Restore in same workload require to restart the workload. So, there will be downtime of the workload. + +## Schedule Backup and Restore PVC + +### Backup PVC + +User will be also able to backup stand-alone pvc. This is useful for `ReadOnlyMany` or `ReadWriteMany` type pvc. + +**What user have to do?** + +- Create a `Repository` crd for respective backend. + +- Create a `BackupConfiguration` crd pointing `target` field to the volume. + +Sample `BackupConfiguration` crd to backup a PVC: + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: volume-backup-demo + namespace: demo +spec: + schedule: '@every 1h' + # task indicates Task crd that specifies the steps to backup a volume. + # stash will create some default Task crd while install to backup/restore various resources. + # user can also crate their own Task to customize backup/recovery + task: + name: volumeBackup + # repository refers to the Repository crd that hold backend information + repository: + name: stash-backup-repo + # target indicate the target workload that we want to backup + target: + ref: + apiVersion: v1 + kind: PersistentVolumeClaim + name: demo-pvc + mountPath: /source/data + # retentionPolicies specify the policy to follow to clean old backup snapshots + retentionPolicy: + keepLast: 5 + prune: true +``` + +**How it will work?** + +1. Stash will create a `CronJob` using information of respective `Task` crd specified by `task` field. +2. The `CronJob` will take periodic backup of the target volume. + +### Restore PVC + +User will be able to restore backed up data into a volume. + +**What user have to do?** + +- Create a `RestoreSession` crd pointing `target` field to the target volume where the recovered data will be stored. + +Sample `RestoreSession` crd to restore into a volume: + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: recovery-volume-demo + namespace: demo +spec: + repository: + name: stash-backup-repo + # task indicates Task crd that specifies steps to restore a volume + task: + name: volumeRecovery + target: # target indicates where the recovered data will be stored + ref: + apiVersion: v1 + kind: PersistentVolumeClaim + name: demo-pvc + mountPath: /source/data + directories: # indicates which directories will be recovered + - /source/data +``` + +**How it will work?** + +- When Stash will find a `RestoreSession` crd created to restore into a volume, it will launch a Job to restore into that volume. +- The recovery Job will restore and store recovered data to the specified volume. + +## Schedule Backup and Restore Database + +### Backup Database + +User will be able to backup database using Stash. + +**What user have to do?** + +- Create a `Repository` crd for respective backend. +- Create an `AppBinding` crd which holds connection information for the database. If the database is deployed with [KubeDB](https://kubedb.com/docs/0.9.0/welcome/), `AppBinding` crd will be created automatically for each database. +- Create a `BackupConfiguration` crd pointing to the `AppBinding` crd. + +Sample `AppBinding` crd: + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: quick-postgres + namespace: demo + labels: + app.kubernetes.io/name: postgreses.kubedb.com + app.kubernetes.io/instance: quick-postgres +spec: + clientConfig: + insecureSkipTLSVerify: true + service: + name: quick-postgres + port: 5432 + scheme: "http" + secret: + name: quick-postgres-auth + type: kubedb.com/postgres +``` + +Sample `BackupConfiguration` crd for database backup: + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: database-backup-demo + namespace: demo +spec: + schedule: '@every 1h' + # task indicates Task crd that specifies the steps to backup postgres database + task: + name: pgBackup + inputs: + database: my-postgres # specify this field if you want to backup a particular database. + # repository refers to the Repository crd that hold backend information + repository: + name: stash-backup-repo + # target indicates the respective AppBinding crd for target database + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: quick-postgres + # retentionPolicies specify the policy to follow to clean old backup snapshots + retentionPolicy: + keepLast: 5 + prune: true +``` + +**How it will work?** + +- When Stash will see a `BackupConfiguration` crd for database backup, it will launch a `CronJob` to take periodic backup of this database. + +### Restore Database + +User will be able to initialize a database from backed up snapshot. + +**What user have to do?** + +- Create a `RestoreSession` crd with `target` field pointing to respective `AppBinding` crd of the target database. + +Sample `RestoreSession` crd to restore database: + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: database-recovery-demo + namespace: demo +spec: + repository: + name: stash-backup-repo + # task indicates Task crd that specifies the steps to restore Postgres database + task: + name: pgRecovery + target: # target indicates where to restore + # indicates the respective AppBinding crd for target database that we want to initialize from backup + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: quick-postgres +``` + +**How it will work?:** + +- Stash will launch a Job to restore the backed up database and initialize target with this recovered data. + +## Schedule Backup Cluster YAMLs + +User will be able to backup yaml of the cluster resources. However, currently stash will not provide automatic restore cluster from the YAMLs. So, user will have to create them manually. + +In future, Stash might be able to backup and restore not only YAMLs but also entire cluster. + +**What user have to do?** + +- Create a `Repository` crd for respective backend. +- Create a `BackupConfiguration` crd with `task` field point to a `Task` crd that backup cluster. + +Sample `BackupConfiguration` crd to backup YAMLs of cluster resources: + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: cluster-backup-demo + namespace: demo +spec: + schedule: '@every 1h' + # task indicates Task crd that specifies the steps of backup cluster yamls + task: + name: clusterBackup + # repository refers to the Repository crd that hold backend information + repository: + name: stash-backup-repo + # + # retentionPolicies specify the policy to follow to clean old backup snapshots + retentionPolicy: + keepLast: 5 + prune: true +``` + +**How it will work?** + +- Stash will launch a `CronJob` using informations of the `Task` crd specified through `task` filed. +- The `CronJob` will take periodic backup of the cluster. + +## Trigger Backup Instantly + +User will be able to trigger a scheduled backup instantly. + +**What user have to do?** + +- Create a `BackupSession` crd pointing to the target `BackupConfiguration` crd. + +Sample `BackupSession` crd for triggering instant backup: + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupSession +metadata: + name: demo-volume-backup-session + namespace: demo +spec: + # backupConfiguration indicates the BackupConfiguration crd of respective target that we want to backup + backupConfiguration: + name: volume-backup-demo +``` + +**How it will work?** + +- For scheduled backup through `sidecar` container, the `sidecar` container will take instant backup as it watches for `BackupSession` crd. +- For scheduled backup through `CronJob`, Stash will launch another job to take instant backup of the target. + +## Default Backup + +User will also be able to configure a `default` backup for the cluster. So, user will no longer need to create `Repository` and `BackupConfiguration` crd for every workload he want to backup. Instead, she will need to add some annotations to the target workload. + +**What user have to do?** + +- Create a `BackupTemplate` crd which will hold backend information and backup information. +- Add some annotations to the target. If the target is a database then add the annotations to respective `AppBinding` crd. + +### Default Backup of Workload Data + +Sample `BackupTemplate` crd to backup workload data: + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupTemplate +metadata: + name: workload-data-backup-template +spec: + backend: + gcs: + bucket: stash-backup-repo + prefix: ${target.namespace}/${target.name} # this prefix template will be used to initialize repository in different directory in backend. + storageSecretName: gcs-secret # users must ensure this secret is present in respective namespace + schedule: '@every 1h' + # < no task required > + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Sample workload with annotations for default backup: + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: stash-demo + namespace: demo + labels: + app: stash-demo + # if stash find bellow annotations, it will take backup of it. + annotations: + stash.appscode.com/backuptemplate: "workload-data-backup-template" + stash.appscode.com/targetDirectories: "[/source/data]" +spec: + replicas: 1 + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - args: + - sleep + - "3600" + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + configMap: + name: stash-sample-data +``` + +### Default Backup of a PVC + +Sample `BackupTemplate` crd for stand-alone pvc backup: + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupTemplate +metadata: + name: volume-backup-template +spec: + backend: + gcs: + bucket: stash-backup-repo + prefix: ${target.namespace}/${target.name} # this prefix template will be used to initialize repository in different directory in backend. + storageSecretName: gcs-secret # users must ensure this secret is present in respective namespace + schedule: '@every 1h' + task: + name: volumeBackup + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Sample PVC with annotation for default backup: + +```yaml +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: demo-pvc + namespace: demo + # if stash find bellow annotations, it will take backup of it. + annotations: + stash.appscode.com/backuptemplate: "volume-backup-template" +spec: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 1Gi +``` + +### Default Backup of Database + +Sample `BackupTemplate` crd for database backup: + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupTemplate +metadata: + name: pgdb-backup-template +spec: + backend: + gcs: + bucket: stash-backup-repo + prefix: ${target.namespace}/${target.name} # this prefix template will be used to initialize repository in different directory in backend. + storageSecretName: gcs-secret # users must ensure this secret is present in respective namespace + schedule: '@every 1h' + task: + name: pgBackup + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Sample `AppBinding` crd with annotations for default backup: + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: quick-postgres + namespace: demo + labels: + app.kubernetes.io/name: postgreses.kubedb.com + app.kubernetes.io/instance: quick-postgres + # if stash find bellow annotations, it will take backup of it. + annotations: + stash.appscode.com/backuptemplate: "pgdb-backup-template" +spec: + clientConfig: + insecureSkipTLSVerify: true + service: + name: quick-postgres + port: 5432 + scheme: "http" + secret: + name: quick-postgres-auth + type: kubedb.com/postgres +``` + +**How it will work?** + +- Stash will watch the workloads, volume and `AppBinding` crds. When Stash will find an workload/volume/AppBinding crd with these annotations, it will create a `Repository` crd and a `BackupConfiguration` crd using the information from respective `Task`. +- Then, Stash will take normal backup as discussed earlier. + +## Auto Restore + +User will be also able to configure an automatic recovery for a particular workload. Each time the workload restart, at first it will perform restore data from backup then original workload's container will start. + +**What user have to do?** + +- User will have to provide some annotations in the workload. + +Sample workload wit annotation to restore on restart: + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: stash-demo + namespace: demo + labels: + app: stash-demo + # This annotations indicates that data should be recovered on each restart of the workload + annotations: + stash.appscode.com/restorepolicy: "OnRestart" + stash.appscode.com/repository: "demo-backup-repo" + stash.appscode.com/directories: "[/source/data]" +spec: + replicas: 1 + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - args: + - sleep + - "3600" + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + configMap: + name: stash-sample-data +``` + +**How it will work?** + +- When Stash will see a `RestoreSession` crd configured for auto recovery, it will inject an `init-container` to the target. +- The `init-container` will perform recovery on each restart. + +## Stash cli/kubectl-plugin + +We are going to provide a Stash plugin for `kubectl`. This will help to perform following operations: + +- Restore into local machine instead of cluster (necessary for testing purpose). +- Restore into a different namespace from a repository: copy repository + secret into the desired namespace and then create `RestoreSession` object. +- Backup PV: creates matching PVC from PV (ensures that user has permission to read PV) +- Trigger instant backup. + +## Function + +`Function` are independent single-containered workload specification that perform only single task. For example, [pgBackup](#pgbackup) takes backup a PostgreSQL database and [clusterBackup](#clusterbackup) takes backup of YAMLs of cluster resources. `Function` crd has some variable fields with `$` prefix which hast be resolved while creating respective workload. You can consider these variable fields as input for an `Function`. + +Some example `Function` definition is given below: + +#### clusterBackup + +```yaml +# clusterBackup function backup yamls of all resources of the cluster +apiVersion: stash.appscode.com/v1beta1 +kind: Function +metadata: + name: clusterBackup +spec: + image: appscodeci/cluster-tool:v1 + name: cluster-tool + args: + - backup + - --sanitize=${sanitize} + - --provider=${provider} + - --hostname=${hostname} + - --path=${repoDir} + - --output-dir=${outputDir} + - --retention-policy.policy=${policy} + - --retention-policy.value=${retentionValue} + - --metrics.enabled=${enableMetric} + - --metrics.pushgateway-url=${pushgatewayURL} + - --metrics.labels="workload-kind=${workloadKind},workload-name=${workloadName}" + volumeMounts: + - name: ${tempVolumeName} + mountPath: /tmp/restic + - name: ${storageSecretName} + mountPath: /etc/secrets/storage-secret +``` + +#### pgBackup + +```yaml +# pgBackup function backup a PostgreSQL database +apiVersion: stash.appscode.com/v1beta1 +kind: Function +metadata: + name: pgBackup +spec: + image: appscodeci/postgresql-tool:v1 + name: postgres-tool + args: + - backup + - --database=${databases} + - --provider=${provider} + - --hostname=${hostname} + - --path=${repoDir} + - --output-dir=${outputDir} + - --retention-policy.policy=${policy} + - --retention-policy.value=${retentionValue} + - --metrics.enabled=${enableMetric} + - --metrics.pushgateway-url=${pushgatewayURL} + - --metrics.labels="workload-kind=${workloadKind},workload-name=${workloadName}" + runtimeSettings: + env: + - name: PGPASSWORD + valueFrom: + secretKeyRef: + name: $(databaseSecret) + key: "POSTGRES_PASSWORD" + - name: DB_USER + valueFrom: + secretKeyRef: + name: $(databaseSecret) + key: "POSTGRES_USER" + - name: DB_HOST + value: $(host) + volumeMounts: + - name: ${tempVolumeName} + mountPath: /tmp/restic + - name: ${storageSecretName} + mountPath: /etc/secrets/storage-secret + +``` + +#### pgRecovery + +```yaml +# pgRecovery function restore a PostgreSQL database +apiVersion: stash.appscode.com/v1beta1 +kind: Function +metadata: + name: pgRecovery +spec: + image: appscodeci/postgresql-tool:v1 + name: postgres-tool + args: + - restore + - --provider=${provider} + - --hostname=${hostname} + - --path=${repoDir} + - --output-dir=${outputDir} + - --metrics.enabled=${enableMetric} + - --metrics.pushgateway-url=${pushgatewayURL} + - --metrics.labels="workload-kind=${workloadKind},workload-name=${workloadName}" + runtimeSettings: + env: + - name: PGPASSWORD + valueFrom: + secretKeyRef: + name: $(databaseSecret) + key: "POSTGRES_PASSWORD" + - name: DB_USER + valueFrom: + secretKeyRef: + name: $(databaseSecret) + key: "POSTGRES_USER" + - name: DB_HOST + value: $(host) + volumeMounts: + - name: ${tempVolumeName} + mountPath: /tmp/restic + - name: ${storageSecretName} + mountPath: /etc/secrets/storage-secret +``` + +#### stashPostBackup + +```yaml +# stashPostBackup update Repository and BackupSession status for respective backup +apiVersion: stash.appscode.com/v1beta1 +kind: Function +metadata: + name: stashPostBackup +spec: + image: appscode/stash:0.9.0 + name: stash-post-backup + args: + - post-backup-update + - --repository=${repoName} + - --backupsession=${backupSessionName} + - --output-json-dir=${outputJsonDir} + volumeMounts: + - name: ${outputVolumeName} + mountPath: /tmp/restic +``` + +## stashPostRecovery + +```yaml +# stashPostRecovery update RestoreSession status for respective recovery +apiVersion: stash.appscode.com/v1beta1 +kind: Function +metadata: + name: stashPostRecovery +spec: + image: appscode/stash:0.9.0 + name: stash-post-recovery + args: + - post-recovery-update + - --recoveryconfiguration=${recoveryConfigurationName} + - --output-json-dir=${outputJsonDir} + volumeMounts: + - name: ${outputVolumeName} + mountPath: /tmp/restic +``` + +## Task + +A complete backup process may need to perform multiple function. For example, if you want to backup a PostgreSQL database, we need to initialize a `Repository`, then backup the database and finally update `Repository` and `BackupSession` status to inform backup is completed or push backup metrics to a `pushgateway` . `Task` specifies these functions sequentially along with their inputs. + +We have chosen to break complete backup process into several independent steps so that those individual functions can be used with other tool than Stash. It also make easy to add support for new feature. For example, to add support new database backup, we are going to just require to add a `Function` and `Task` crd. We are going to no longer need change anything in Stash operator code. This will also helps users to backup databases that are not officially supported by stash. + +Some sample `Task` is given below: + +#### pgBackup + +```yaml +# pgBackup specifies required functions and their inputs to backup PostgreSQL database +apiVersion: stash.appscode.com/v1beta1 +kind: Task +metadata: + name: pgBackup +spec: + functions: + - name: pgBackup + inputs: + database: ${databases} + provider: ${provider} + hostname: ${hostname} + repoDir: ${prefix} + outputDir: ${outputDir} + policy: ${retentionPolicyName} + retentionValue: ${retentionPolicyValue} + enableMetric: ${enableMetric} + pushgatewayURL: ${pushgatewayURL} + workloadKind: ${kind} + workloadName: ${name} + tempVolumeName: ${tmpVolumeName} + storageSecretName: ${secretName} + - name: stashPostBackup + inputs: + repoName: ${repoName} + backupSession: ${backupSessionName} + outputJsonDir: ${output-dir} + outputVolumeName: ${output-volume-name} +``` + +#### pgRecovery + +```yaml +# pgRecovery specifies required functions and their inputs to restore PostgreSQL database +apiVersion: stash.appscode.com/v1beta1 +kind: Task +metadata: + name: pgRecovery +spec: + functions: + - name: pgRecovery + inputs: + provider: ${provider} + hostname: ${hostname} + repoDir: ${prefix} + outputDir: ${outputDir} + enableMetric: ${enableMetric} + pushgatewayURL: ${pushgatewayURL} + workloadKind: ${kind} + workloadName: ${name} + tempVolumeName: ${tmpVolumeName} + storageSecretName: ${secretName} + - name: stashPostRecovery + inputs: + recoveryConfigurationName: ${recoveryConfigurationName} + outputJsonDir: ${output-dir} + outputVolumeName: ${output-volume-name} +``` + +#### clusterBackup + +```yaml +# clusterBackup specifies required functions and their inputs to backup cluster yaml +apiVersion: stash.appscode.com/v1beta1 +kind: Task +metadata: + name: clusterBackup +spec: + functions: + - name: clusterBackup + inputs: + sanitize: ${sanitize} + provider: ${provider} + hostname: ${hostname} + repoDir: ${prefix} + outputDir: ${outputDir} + policy: ${retentionPolicyName} + retentionValue: ${retentionPolicyValue} + enableMetric: ${enableMetric} + pushgatewayURL: ${pushgatewayURL} + workloadKind: ${kind} + workloadName: ${name} + tempVolumeName: ${tmpVolumeName} + storageSecretName: ${secretName} + - name: stashPostBackup + inputs: + repoName: ${repoName} + backupSession: ${backupSessionName} + outputJsonDir: ${output-dir} + outputVolumeName: ${output-volume-name} +``` diff --git a/content/docs/v2024.12.18/guides/README.md b/content/docs/v2024.12.18/guides/README.md new file mode 100644 index 0000000000..c1254038f1 --- /dev/null +++ b/content/docs/v2024.12.18/guides/README.md @@ -0,0 +1,116 @@ +--- +title: Table of Contents | Guides +description: Table of Contents | Guides +menu: + docs_v2024.12.18: + identifier: guides-readme + name: Readme + parent: guides + weight: -1 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +url: /docs/v2024.12.18/guides/ +aliases: +- /docs/v2024.12.18/guides/README/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Guides + +Guides show how to perform different operations with Stash. We have divided guides section into the following sub-sections: + +- [Supported Backends](/docs/v2024.12.18/guides/backends/overview/): Describes how to configure different storage for storing backed up data. +- [Workload Volume Backup](/docs/v2024.12.18/guides/workloads/overview/): Shows how to use Stash to backup and restore volumes of a workload (i.e. `Deployment`, `StatefulSet`, `DaemonSet`, etc). +- [Stand-alone Volume Backup](/docs/v2024.12.18/guides/volumes/overview/): Shows how to use Stash to backup and restore stand-alone volumes(i.e. `PersistentVolumeClaim`). +- [Batch Backup](/docs/v2024.12.18/guides/batch-backup/overview/): Shows how to backup multiple co-related components using a single configuration known as `BackupBatch`. +- [Auto Backup](/docs/v2024.12.18/guides/auto-backup/overview/): Shows how to configure automatic backup of any stateful workload in your cluster. +- [Volume Snapshot](/docs/v2024.12.18/guides/volumesnapshot/overview/): Shows how Stash takes snapshot of `PersistentVolumeClaim`s and restore them from snapshot using Kubernetes `VolumeSnapshot` API. + +- **Different Use Cases:** +Shows different uses cases of Stash like instant backup, pause backup, cross-namespace backup and restore etc. + + - [Instant Backup](/docs/v2024.12.18/guides/use-cases/instant-backup/): Shows you how to take an instant backup in Stash. + - [Exclude/Include Files](/docs/v2024.12.18/guides/use-cases/exclude-include-files/): Shows how to exclude/include subset of files during backup/restore process. + - [Pause Backup](/docs/v2024.12.18/guides/use-cases/pause-backup/): Shows how to pause a backup temporarily. + - [Clone Data Volumes](/docs/v2024.12.18/guides/use-cases/clone-pvc/): Shows how to clone data volumes of a workload into a different namespace in a cluster using Stash. + - [File Ownership](/docs/v2024.12.18/guides/use-cases/ownership/): Explains when and how ownership of the restored files can be changed. + - [Cross-Cluster Backup and Restore](/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/): Shows how to take backup and restore across clusters using Stash. + - [Customize Backup and Restore](/docs/v2024.12.18/guides/use-cases/customize-backup-restore/): Shows how to customize backup and restore processes in Stash according to your needs. + +- **Managed Backup** +Shows how backup and restore can be managed in some specific scenerios. + - [Dedicated Backup Namespace](/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace/): Shows you how to manage backup and restore from a dedicated namespace for targets of different namespaces using Stash. + - [Dedicated Storage Namespace](/docs/v2024.12.18/guides/managed-backup/dedicated-storage-namespace/): Shows you how to take backup and restore by keeping the storage resources (Repository and backend Secret) in a dedicated namespace using Stash. + +- [Platforms](/docs/v2024.12.18/guides/platforms/eks-irsa/): Shows how to use Stash to backup and restore volumes of a Kubernetes workload running in different platforms. +- [Monitoring](/docs/v2024.12.18/guides/monitoring/overview/): Shows how Prometheus monitoring works with Stash, what metrics Stash exports, and how to enable monitoring. +- [Hooks](/docs/v2024.12.18/guides/hooks/overview/): Shows how to execute different actions before/after the backup/restore process. +- [CLI](/docs/v2024.12.18/guides/cli/kubectl-plugin/): Shows how to manage Stash objects quickly and easily using Stash `kubectl` plugin. +- [Troubleshooting](/docs/v2024.12.18/guides/troubleshooting/how-to-troubleshoot/): Gives an overview of how you can gather the necessary information to identify the issue that causes the backup/restore failure. +- [Security](/docs/v2024.12.18/guides/security/rbac/): Describes different built-in cluster security support by Stash. diff --git a/content/docs/v2024.12.18/guides/_index.md b/content/docs/v2024.12.18/guides/_index.md new file mode 100644 index 0000000000..205a35bade --- /dev/null +++ b/content/docs/v2024.12.18/guides/_index.md @@ -0,0 +1,76 @@ +--- +title: Guides | Stash +menu: + docs_v2024.12.18: + identifier: guides + name: Guides + weight: 40 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/guides/addons/_index.md b/content/docs/v2024.12.18/guides/addons/_index.md new file mode 100644 index 0000000000..255eac1888 --- /dev/null +++ b/content/docs/v2024.12.18/guides/addons/_index.md @@ -0,0 +1,77 @@ +--- +title: Addons | Stash +menu: + docs_v2024.12.18: + identifier: addons + name: Addons + parent: guides + weight: 110 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/guides/addons/overview/images/addon_overview.svg b/content/docs/v2024.12.18/guides/addons/overview/images/addon_overview.svg new file mode 100644 index 0000000000..2cd2053c94 --- /dev/null +++ b/content/docs/v2024.12.18/guides/addons/overview/images/addon_overview.svg @@ -0,0 +1,433 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/guides/addons/overview/index.md b/content/docs/v2024.12.18/guides/addons/overview/index.md new file mode 100644 index 0000000000..9180ff0f59 --- /dev/null +++ b/content/docs/v2024.12.18/guides/addons/overview/index.md @@ -0,0 +1,109 @@ +--- +title: Addons | Stash +menu: + docs_v2024.12.18: + identifier: addons-overview + name: Overview + parent: addons + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash Addons + +Stash 0.9.0+ supports extending its functionality through addons. This guide will give you an overview of what is an addon, how addons work and a list of Stash addons. + +## What is an Addon + +Stash 0.9.0+ uses two different models for backup/restore based on target types. One of them is **sidecar model** where Stash injects a `sidecar`/`init-container` into the targeted workload for backup/restore. Another is **job model** where backup or restore is done via an external job. + +The job model is further divided into two categories. In the first category, the targeted resource is well known to Stash (example, a PVC). Hence, the Stash operator itself can create the required job to backup/restore the target. In the second category, Stash follows `Function-Task` model where the targeted resource is not known to Stash. In this case, the user creates some [Function](/docs/v2024.12.18/concepts/crds/function/) which resembles a step of backup/restore process and a [Task](/docs/v2024.12.18/concepts/crds/task/) which specifies the order of execution of these steps. Stash uses these `Function` and `Task` to generate the required job definition to backup/restore the target. + +The `Function-Task` model enables Stash to backup/restore the resources that the operator itself is not aware of. Users can extend Stash by creating respective `Function`, `Task`, and docker images for respective `Function` to backup their desired resources. + +A Stash addon is a collection of [Functions](/docs/v2024.12.18/concepts/crds/function/) and a [Task](/docs/v2024.12.18/concepts/crds/task/) to backup & restore a specific resource. + +## How Addons Work + +When a user installs a Stash addon, it creates some `Function` and `Task` definitions. Then, when he creates a `BackupConfiguration` or `RestoreSession` object to backup/restore his desired resource, Stash operator resolves the `Function` and `Task` to create a Job to backup/restore the target. The following diagram shows how addons works in Stash: + +
+  Stash Addon Overview +
Fig: Stash Addon Overview
+
+ +A `Function` is fundamentally a container specification and `Task` specifies the execution order of the containers. Stash operator injects all the containers except last one resolved from the `Function` specified in `Task` as `init-container` into the job in the same order they appear in the `Task`. Then, it injects the last container as the main container of the Job. + +## Available Addons + +The following addons are available for [Stash](/docs/v2024.12.18/setup/install/stash/): + +{{< catalogtable "elasticsearch" "mariadb" "mongodb" "mysql" "percona-xtradb" "postgres" >}} diff --git a/content/docs/v2024.12.18/guides/auto-backup/_index.md b/content/docs/v2024.12.18/guides/auto-backup/_index.md new file mode 100644 index 0000000000..d4d0982adf --- /dev/null +++ b/content/docs/v2024.12.18/guides/auto-backup/_index.md @@ -0,0 +1,77 @@ +--- +title: Auto Backup | Stash +menu: + docs_v2024.12.18: + identifier: auto-backup + name: Auto Backup + parent: guides + weight: 60 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/guides/auto-backup/database/index.md b/content/docs/v2024.12.18/guides/auto-backup/database/index.md new file mode 100644 index 0000000000..b29521df0a --- /dev/null +++ b/content/docs/v2024.12.18/guides/auto-backup/database/index.md @@ -0,0 +1,148 @@ +--- +title: Auto Backup Databases | Stash +description: Stash auto-backup for databases. +menu: + docs_v2024.12.18: + identifier: auto-backup-database + name: Auto Backup for Databases + parent: auto-backup + weight: 40 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Auto Backup for Database + +This tutorial will give you an overview of how you can configure Stash auto-backup of the databases and the available configurable options for database auto-backup. + +## Configuring auto-backup for databases + +To configure auto-backup for a database, you have to follow the following steps: + +- **Create BackupBlueprint:** At first, you have to create a `BackupBlueprint` with the template for `Repository` and `BackupConfiguration`. Use the appropriate `Task` in the `task` section. +- **Create Storage Secret:** Then, you have to create a storage Secret in the same namespace as your database with the access credential to your backend. You can re-use this secret to backup the other databases in that namespace. +- **Add auto-backup annotations:** Finally, add the auto-backup annotations to your database object or the respective `AppBinding` object. + +## Where to put auto-backup annotations + +If you are using KubeDB to manage your databases, you can add the annotations to your database object. KubeDB will automatically pass those annotations to the respective `AppBinding`. + +If you are not managing your database using KubeDB, you have to add the annotation in the respective `AppBinding` that you have created for your database. + +## Available Auto-Backup Annotations for Database + +The following auto-backup annotations are available for the databases: + +- **BackupBlueprint Name:** You have to specify the `BackupBlueprint` name that holds the template for `Repository` and `BackupConfiguration` in the following annotation: + +```yaml +stash.appscode.com/backup-blueprint: +``` + +You can also specify multiple BackupBlueprint name separated by comma (`,`). For example: + +```yaml +stash.appscode.com/backup-blueprint: daily-gcs-backup,weekly-s3-backup +``` + +- **Schedule:** You can specify a custom schedule for a target to overwrite the schedule of the BackupBlueprint through this annotation. + +```yaml + stash.appscode.com/schedule: +``` + +- **Task Parameters:** You can also pass some parameters to the respective backup `Task` through annotations. Use following format to pass parameters via annotations: + +```yaml +params.stash.appscode.com/key1: value1 +params.stash.appscode.com/key2: value2,value3 +params.stash.appscode.com/key3: ab=123,bc=234 +``` + +The above parameters will be added in the `spec.task.params` section as bellow, + +```yaml +task: + name: postgres-backup-13.1-v1 + params: + - name: key1 + value: value1 + - name: key2 + value: value3,value3 + - name: key3 + value: ab=123,bc=234 +``` + +## Database Auto-backup Examples + +You can find auto-backup examples for the databases here: + +- [Backup PostgreSQL using Stash Auto-Backup](/docs/v2024.12.18/addons/postgres/auto-backup/) +- [Backup Elasticsearch using Stash Auto-Backup](/docs/v2024.12.18/addons/elasticsearch/auto-backup/) diff --git a/content/docs/v2024.12.18/guides/auto-backup/overview/images/auto_backup_overview.svg b/content/docs/v2024.12.18/guides/auto-backup/overview/images/auto_backup_overview.svg new file mode 100644 index 0000000000..af9643ef73 --- /dev/null +++ b/content/docs/v2024.12.18/guides/auto-backup/overview/images/auto_backup_overview.svg @@ -0,0 +1,557 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/guides/auto-backup/overview/index.md b/content/docs/v2024.12.18/guides/auto-backup/overview/index.md new file mode 100644 index 0000000000..202b02d2a7 --- /dev/null +++ b/content/docs/v2024.12.18/guides/auto-backup/overview/index.md @@ -0,0 +1,134 @@ +--- +title: Auto Backup Overview | Stash +description: An overview on how auto backup works in Stash. +menu: + docs_v2024.12.18: + identifier: auto-backup-overview + name: What is Auto Backup? + parent: auto-backup + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Auto Backup with Stash + +Stash can be configured to automatically backup of any stateful workloads in your cluster. Stash enables cluster administrators to deploy backup blueprints ahead of time so that application owners can easily backup any types of workload with a few annotations. This allows Enterprises to stay prepared for disaster scenarios and recover from offsite secure backups in case of a disaster on public cloud and on-premises datacenters. + +## What is Auto Backup + +Stash uses 1-1 mapping among `Repository`, `BackupConfiguration` and the target. So, whenever you want to backup a target(workload/PVC/database), you have to create a `Repository` and `BackupConfiguration` object. This could become tiresome when you are trying to backup similar types of target and the `Repository` and `BackupConfiguration` have only a slight difference. To mitigate this problem, Stash provides a way to specify a blueprint for these two objects via `BackupBlueprint` crd. In Stash parlance, we call this process as **Auto Backup**. + +You have to create only one `BackupBlueprint` for all similar types of target. For example, you need only one `BackupBlueprint` for Deployment, DaemonSet, StatefulSet etc. Similarly, you have to create only one `BackupBlueprint` for all PostgreSQL databases. Then, you just need to add some annotations in the target. Stash will automatically create respective `Repository` and `BackupConfiguration` objects using the blueprint and perform backups on pre-defined schedule. + +## How Auto Backup Works? + +The following diagram shows how automatic backup works in Stash. Open the image in a new tab to see the enlarged version. + +
+  Auto Backup Overview +
Fig: Auto Backup Overview
+
+ +The automatic backup process consists of the following steps: + +1. A user creates a storage secret with necessary credentials of the backend where the backed up data will be stored. +2. Then, he creates a `BackupBlueprint` crd that specifies a blueprint for `Repository` and `BackupConfiguration` object. +3. Then, he creates a workload with some specific annotations for automatic backup. +4. Stash operator watches for workloads. When it finds a workload with annotations for automatic backup, it finds out the respective `BackupBlueprint`. +5. Then, Stash operator resolves the blueprint by replacing variable fields of the blueprint with respective information from the workload. +6. Then, it creates a `Repository` and a `BackupConfiguration` object for the workload according to the resolved blueprint. +7. Finally, Stash starts rest of the standard backup process as discussed in [here](/docs/v2024.12.18/guides/workloads/overview/). + +> Note: `BackupBlueprint` is a non-namespaced crd. So, you can use a `BackupBlueprint` to backup targets in multiple namespaces. However, Storage Secret is a namespaced object. So, you have to manually create the secret in each namespace where you have a target for backup. Please give us your feedback on how to improve the ux of this aspect of Stash on [GitHub](https://github.com/stashed/stash/issues/842). + +## Frequently Asked Question regarding Auto-backup + +In this guide, we are going to answer some frequently asked questions regarding Stash auto-backup. If your query isn't answer here, feel free to open an issue [here](https://github.com/stashed/stash/issues). + +#### What will happen if I remove the auto-backup annotations? + +If you remove the auto-backup annotation, the respective `BackupConfiguration` will be deleted. If you are taking backup of workload volume, the respective sidecar will be removed and your workload will restart. The backup will stop immediately. If there is any running `BackupSession`, it will be deleted and the backup may terminate in incomplete state. + +The respective `Repository` object will be preserved as well as the backed up data. If you add the auto-backup annotation again, the previous `Repository` will be used until you modify/change the respective `BackupBlueprint`. + +#### What if different target require different runtime settings? + +Currently, you can't pass runtime settings via annotation. So, if different target needs different runtime settings, you have to create separate `BackupBlueprint` for them. + +#### What if I want to have different retention policy for different targets? + +Currently, you can't pass retention policy via annotation. So, if different target needs different retention policy, you have to create separate `BackupBlueprint` for them. + +## Next Step + +- Learn how to configure automatic backup for workloads from [here](/docs/v2024.12.18/guides/auto-backup/workload/). +- Learn how to configure automatic backup for PVCs from [here](/docs/v2024.12.18/guides/auto-backup/pvc/). +- Learn how to configure automatic backup for databases from [here](/docs/v2024.12.18/guides/auto-backup/database/). diff --git a/content/docs/v2024.12.18/guides/auto-backup/pvc/examples/backupblueprint.yaml b/content/docs/v2024.12.18/guides/auto-backup/pvc/examples/backupblueprint.yaml new file mode 100644 index 0000000000..773f9fa7bc --- /dev/null +++ b/content/docs/v2024.12.18/guides/auto-backup/pvc/examples/backupblueprint.yaml @@ -0,0 +1,19 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupBlueprint +metadata: + name: pvc-backup-blueprint +spec: + # ============== Blueprint for Repository ========================== + backend: + gcs: + bucket: appscode-qa + prefix: stash-backup/${TARGET_NAMESPACE}/${TARGET_KIND}/${TARGET_NAME} + storageSecretName: gcs-secret + # ============== Blueprint for BackupConfiguration ================= + task: + name: pvc-backup + schedule: "*/5 * * * *" + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/guides/auto-backup/pvc/examples/nfs_pv.yaml b/content/docs/v2024.12.18/guides/auto-backup/pvc/examples/nfs_pv.yaml new file mode 100644 index 0000000000..582bb70467 --- /dev/null +++ b/content/docs/v2024.12.18/guides/auto-backup/pvc/examples/nfs_pv.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: PersistentVolume +metadata: + name: nfs-pv + labels: + app: nfs-demo +spec: + capacity: + storage: 1Gi + accessModes: + - ReadWriteMany + nfs: + server: "nfs-service.storage.svc.cluster.local" + path: "/" diff --git a/content/docs/v2024.12.18/guides/auto-backup/pvc/examples/nfs_pvc.yaml b/content/docs/v2024.12.18/guides/auto-backup/pvc/examples/nfs_pvc.yaml new file mode 100644 index 0000000000..5203a8033e --- /dev/null +++ b/content/docs/v2024.12.18/guides/auto-backup/pvc/examples/nfs_pvc.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: nfs-pvc + namespace: demo +spec: + accessModes: + - ReadWriteMany + storageClassName: "" + resources: + requests: + storage: 1Gi + selector: + matchLabels: + app: nfs-demo diff --git a/content/docs/v2024.12.18/guides/auto-backup/pvc/examples/pod-1.yaml b/content/docs/v2024.12.18/guides/auto-backup/pvc/examples/pod-1.yaml new file mode 100644 index 0000000000..2c0929e070 --- /dev/null +++ b/content/docs/v2024.12.18/guides/auto-backup/pvc/examples/pod-1.yaml @@ -0,0 +1,18 @@ +kind: Pod +apiVersion: v1 +metadata: + name: demo-pod-1 + namespace: demo +spec: + containers: + - name: busybox + image: busybox + command: ["/bin/sh", "-c","echo 'hello from pod 1.' > /sample/data/hello.txt && sleep 3000"] + volumeMounts: + - name: my-volume + mountPath: /sample/data + subPath: pod-1/data + volumes: + - name: my-volume + persistentVolumeClaim: + claimName: nfs-pvc diff --git a/content/docs/v2024.12.18/guides/auto-backup/pvc/examples/pod-2.yaml b/content/docs/v2024.12.18/guides/auto-backup/pvc/examples/pod-2.yaml new file mode 100644 index 0000000000..b8a0ec7bae --- /dev/null +++ b/content/docs/v2024.12.18/guides/auto-backup/pvc/examples/pod-2.yaml @@ -0,0 +1,18 @@ +kind: Pod +apiVersion: v1 +metadata: + name: demo-pod-2 + namespace: demo +spec: + containers: + - name: busybox + image: busybox + command: ["/bin/sh", "-c","echo 'hello from pod 2.' > /sample/data/hello.txt && sleep 3000"] + volumeMounts: + - name: my-volume + mountPath: /sample/data + subPath: pod-2/data + volumes: + - name: my-volume + persistentVolumeClaim: + claimName: nfs-pvc diff --git a/content/docs/v2024.12.18/guides/auto-backup/pvc/images/pvc_repo.png b/content/docs/v2024.12.18/guides/auto-backup/pvc/images/pvc_repo.png new file mode 100644 index 0000000000..a7efdacdd2 Binary files /dev/null and b/content/docs/v2024.12.18/guides/auto-backup/pvc/images/pvc_repo.png differ diff --git a/content/docs/v2024.12.18/guides/auto-backup/pvc/index.md b/content/docs/v2024.12.18/guides/auto-backup/pvc/index.md new file mode 100644 index 0000000000..82a697e76c --- /dev/null +++ b/content/docs/v2024.12.18/guides/auto-backup/pvc/index.md @@ -0,0 +1,579 @@ +--- +title: Auto Backup PVC | Stash +description: An step by step guide on how to configure automatic backup for PVCs. +menu: + docs_v2024.12.18: + identifier: auto-backup-pvc + name: Auto Backup for PVCs + parent: auto-backup + weight: 30 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Auto Backup for PVC + +This tutorial will show you how to configure automatic backup for PersistentVolumeClaims. Here, we are going to backup a PVC provisioned from an NFS server using auto-backup. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). +- Install `Stash` in your cluster following the steps [here](/docs/v2024.12.18/setup/README). +- You will need to have a PVC with `ReadWriteMany` access permission. Here, we are going to use an NFS server to provision a PVC with `ReadWriteMany` access. If you don't have an NFS server running, deploy one by following the guide [here](https://github.com/appscode/third-party-tools/blob/master/storage/nfs/README.md). +- You should be familiar with the following `Stash` concepts: + - [BackupBlueprint](/docs/v2024.12.18/concepts/crds/backupblueprint/) + - [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) + - [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) + - [Repository](/docs/v2024.12.18/concepts/crds/repository/) + - [Function](/docs/v2024.12.18/concepts/crds/function/) + - [Task](/docs/v2024.12.18/concepts/crds/task/) + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +>**Note:** YAML files used in this tutorial are stored in [docs/guides/auto-backup/pvc/examples](/docs/v2024.12.18/guides/auto-backup/pvc/examples) directory of [stashed/docs](https://github.com/stashed/docs) repository. + +**Verify necessary Function and Task:** + +Stash uses a `Function-Task` model to automatically backup PVC. When you install Stash, it creates the necessary `Function` and `Task`. + +Let's verify that Stash has created the necessary `Function` to backup/restore PVC by the following command, + +```bash +$ kubectl get function +NAME AGE +pvc-backup 6h55m +pvc-restore 6h55m +update-status 6h55m +``` + +Also, verify that the necessary `Task` has been created, + +```bash +$ kubectl get task +NAME AGE +pvc-backup 6h55m +pvc-restore 6h55m +``` + +## Prepare Backup Blueprint + +We are going to use [GCS Backend](/docs/v2024.12.18/guides/backends/gcs/) to store the backed up data. You can use any supported backend you prefer. You just have to configure Storage Secret and `spec.backend` section of `BackupBlueprint` to match your backend. To learn which backends are supported by Stash and how to configure them, please visit [here](/docs/v2024.12.18/guides/backends/overview/). + +> For GCS backend, if the bucket does not exist, Stash needs `Storage Object Admin` role permissions to create the bucket. For more details, please check the following [guide](/docs/v2024.12.18/guides/backends/gcs/). + +**Create Storage Secret:** + +At first, let's create a Storage Secret for the GCS backend, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ mv downloaded-sa-json.key GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create BackupBlueprint:** + +Now, we have to create a `BackupBlueprint` crd with a blueprint for `Repository` and `BackupConfiguration` object. + +Below is the YAML of the `BackupBlueprint` object that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupBlueprint +metadata: + name: pvc-backup-blueprint +spec: + # ============== Blueprint for Repository ========================== + backend: + gcs: + bucket: appscode-qa + prefix: stash-backup/${TARGET_NAMESPACE}/${TARGET_KIND}/${TARGET_NAME} + storageSecretName: gcs-secret + # ============== Blueprint for BackupConfiguration ================= + task: + name: pvc-backup + schedule: "*/5 * * * *" + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Here, + +- `spec.task.name` specifies the `Task` crd name that will be used to backup the targeted PVC. + +Note that we have used some variables (format: `${}`) in `backend.gcs.prefix` field. Stash will substitute these variables with values from the respective target. To know which variable you can use in this `prefix` field, please visit [here](/docs/v2024.12.18/concepts/crds/backupblueprint/#repository-blueprint). + +Let's create the `BackupBlueprint` that we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/auto-backup/pvc/examples/backupblueprint.yaml +backupblueprint.stash.appscode.com/pvc-backup-blueprint created +``` + +Now, automatic backup is configured for PVC. We just have to add some annotations to the targeted PVC to enable backup. + +**Available Auto-Backup Annotations for PVC:** + +You have to add the auto-backup annotations to the PVC that you want to backup. The following auto-backup annotations are available for a PVC: + +- **BackupBlueprint Name:** You have to specify the `BackupBlueprint` name that holds the template for `Repository` and `BackupConfiguration` in the following annotation: + +```yaml +stash.appscode.com/backup-blueprint: +``` + +You can also specify multiple BackupBlueprint name separated by comma (`,`). For example: + +```yaml +stash.appscode.com/backup-blueprint: daily-gcs-backup,weekly-s3-backup +``` + +- **Schedule:** You can specify a schedule to backup this target through this annotation. If you don't specify this annotation, schedule from the `BackupBlueprint` will be used. + +```yaml + stash.appscode.com/schedule: +``` + +## Prepare PVC + +At first, let's prepare our desired PVC. Here, we are going to create a [PersistentVolume](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) (PV) that will use an NFS server as storage. Then, we are going to create a PVC that will bind with the PV. Then, we are going to mount this PVC into a pod. This pod will generate a sample file into the PVC. + +**Create PersistentVolume:** + +We have deployed an NFS server in `storage` namespace and it is accessible through a Service named `nfs-service`. Now, we are going to create a PV that uses the NFS server as storage. + +Below is the YAML of the PV that we are going to create, + +```yaml +apiVersion: v1 +kind: PersistentVolume +metadata: + name: nfs-pv + labels: + app: nfs-demo +spec: + capacity: + storage: 1Gi + accessModes: + - ReadWriteMany + nfs: + server: "nfs-service.storage.svc.cluster.local" + path: "/" +``` + +Notice the `metadata.labels` section. Here, we have added `app: nfs-demo` label. We are going to use this label as selector in PVC so that the PVC binds with this PV. + +Let's create the PV we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/auto-backup/pvc/examples/nfs_pv.yaml +persistentvolume/nfs-pv created +``` + +**Create PersistentVolumeClaim:** + +Now, create a PVC to bind with the PV we have just created. Below, is the YAML of the PVC that we are going to create, + +```yaml +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: nfs-pvc + namespace: demo +spec: + accessModes: + - ReadWriteMany + storageClassName: "" + resources: + requests: + storage: 1Gi + selector: + matchLabels: + app: nfs-demo +``` + +Notice the `spec.accessModes` section. We are using `ReadWriteMany` access mode so that multiple pods can use this PVC simultaneously. Without this access mode, Stash will fail to backup the volume if any other pod mounts it during backup. + +Also, notice the `spec.selector` section. We have specified `app: nfs-demo` labels as a selector so that it binds with the PV that we have created earlier. + +Let's create the PVC we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/auto-backup/pvc/examples/nfs_pvc.yaml +persistentvolumeclaim/nfs-pvc created +``` + +Verify that the PVC has bounded with our desired PV, + +```bash +$ kubectl get pvc -n demo nfs-pvc +NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE +nfs-pvc Bound nfs-pv 1Gi RWX 61s +``` + +Here, we can see that the PVC `nfs-pvc` has been bounded with PV `nfs-pv`. + +**Generate Sample Data:** + +Now, we are going to deploy two sample pods `demo-pod-1` and `demo-pod-2` that will mount `pod-1/data` and `pod-2/data` [subPath](https://kubernetes.io/docs/concepts/storage/volumes/#using-subpath) of the `nfs-pvc` respectively. Each of the pods will generate a sample file named `hello.txt` with some demo data. We are going to backup the entire PVC that contains the sample files using auto-backup. + +Below, is the YAML of the first pod that we are going to deploy, + +```yaml +kind: Pod +apiVersion: v1 +metadata: + name: demo-pod-1 + namespace: demo +spec: + containers: + - name: busybox + image: busybox + command: ["/bin/sh", "-c","echo 'hello from pod 1.' > /sample/data/hello.txt && sleep 3000"] + volumeMounts: + - name: my-volume + mountPath: /sample/data + subPath: pod-1/data + volumes: + - name: my-volume + persistentVolumeClaim: + claimName: nfs-pvc +``` + +Here, we have mounted `pod-1/data` directory of the `nfs-pvc` into `/sample/data` directory of this pod. + +Let's deploy the pod we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/auto-backup/pvc/examples/pod-1.yaml +pod/demo-pod-1 created +``` + +Verify that the sample data has been generated into `/sample/data/` directory, + +```bash +$ kubectl exec -n demo demo-pod-1 cat /sample/data/hello.txt +hello from pod 1. +``` + +Below is the YAML of the second pod that we are going to deploy, + +```yaml +kind: Pod +apiVersion: v1 +metadata: + name: demo-pod-2 + namespace: demo +spec: + containers: + - name: busybox + image: busybox + command: ["/bin/sh", "-c","echo 'hello from pod 2.' > /sample/data/hello.txt && sleep 3000"] + volumeMounts: + - name: my-volume + mountPath: /sample/data + subPath: pod-2/data + volumes: + - name: my-volume + persistentVolumeClaim: + claimName: nfs-pvc +``` + +Now, we have mounted `pod-2/data` directory of the `nfs-pvc` into `/sample/data` directory of this pod. + +Let's create the pod we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/auto-backup/pvc/examples/pod-2.yaml +pod/demo-pod-2 created +``` + +Verify that the sample data has been generated into `/sample/data/` directory, + +```bash +$ kubectl exec -n demo demo-pod-2 cat /sample/data/hello.txt +hello from pod 2. +``` + +## Backup + +Now, we are going to add auto backup specific annotation to the PVC. Stash watches for PVC with auto-backup annotations. Once it finds a PVC with auto-backup annotations, it will create a `Repository` and a `BackupConfiguration` crd according to respective `BackupBlueprint`. Then, rest of the backup process will proceed as normal backup of a stand-alone PVC as describe [here](/docs/v2024.12.18/guides/volumes/pvc/). + +**Add Annotations:** + +Let's add the auto backup specific annotation to the PVC, + +```bash +$ kubectl annotate pvc nfs-pvc -n demo --overwrite \ + stash.appscode.com/backup-blueprint=pvc-backup-blueprint \ + stash.appscode.com/schedule="*/15 * * * *" +``` + +Verify that the annotations has been added successfully, + +```bash +$ kubectl get pvc -n demo nfs-pvc -o yaml +``` + +```yaml +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + annotations: + kubectl.kubernetes.io/last-applied-configuration: | + {"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{},"name":"nfs-pvc","namespace":"demo"},"spec":{"accessModes":["ReadWriteMany"],"resources":{"requests":{"storage":"1Gi"}},"selector":{"matchLabels":{"app":"nfs-demo"}},"storageClassName":""}} + pv.kubernetes.io/bind-completed: "yes" + pv.kubernetes.io/bound-by-controller: "yes" + stash.appscode.com/backup-blueprint: pvc-backup-blueprint + stash.appscode.com/schedule: "*/15 * * * *" + creationTimestamp: "2019-08-19T09:08:44Z" + finalizers: + - kubernetes.io/pvc-protection + name: nfs-pvc + namespace: demo + resourceVersion: "64082" + selfLink: /api/v1/namespaces/demo/persistentvolumeclaims/nfs-pvc + uid: 7c9dca87-8577-466a-bf2d-2fa7a83f85b7 +spec: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 1Gi + selector: + matchLabels: + app: nfs-demo + storageClassName: "" + volumeMode: Filesystem + volumeName: nfs-pv +status: + accessModes: + - ReadWriteMany + capacity: + storage: 1Gi + phase: Bound +``` + +Now, Stash will create a `Repository` crd and a `BackupConfiguration` crd according to the blueprint. + +**Verify Repository:** + +Verify that the `Repository` has been created successfully by the following command, + +```bash +$ kubectl get repository -n demo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +persistentvolumeclaim-nfs-pvc +``` + +If we view the YAML of this `Repository`, we are going to see that the variables `${TARGET_NAMESPACE}`, `${TARGET_KIND}` and `${TARGET_NAME}` has been replaced by `demo`, `presistentvolumeclaim` and `nfs-pvc` respectively. + +```bash +$ kubectl get repository -n demo persistentvolumeclaim-nfs-pvc -o yaml +``` + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + creationTimestamp: "2019-08-19T09:18:55Z" + finalizers: + - stash + generation: 1 + name: persistentvolumeclaim-nfs-pvc + namespace: demo + resourceVersion: "64084" + selfLink: /apis/stash.appscode.com/v1beta1/namespaces/demo/repositories/persistentvolumeclaim-nfs-pvc + uid: a991373f-9d7a-4d02-a812-16f901497ebd +spec: + backend: + gcs: + bucket: appscode-qa + prefix: stash-backup/demo/persistentvolumeclaim/nfs-pvc + storageSecretName: gcs-secret +``` + +**Verify BackupConfiguration:** +If everything goes well, Stash should create a `BackupConfiguration` for our Pvc and the phase of that `BackupConfiguration` should be `Ready`. Verify the `BackupConfiguration` crd by the following command, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +persistentvolumeclaim-nfs-pvc pvc-backup */15 * * * * Ready 119s +``` + +Now, let's check the YAML of the `BackupConfiguration`. +```bash +$ kubectl get backupconfiguration -n demo persistentvolumeclaim-nfs-pvc -o yaml +``` + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + creationTimestamp: "2019-08-20T13:01:54Z" + finalizers: + - stash.appscode.com + generation: 1 + name: persistentvolumeclaim-nfs-pvc + namespace: demo + ownerReferences: + - apiVersion: v1 + blockOwnerDeletion: false + kind: PersistentVolumeClaim + name: nfs-pvc + uid: 7c9dca87-8577-466a-bf2d-2fa7a83f85b7 + resourceVersion: "124087" + selfLink: /apis/stash.appscode.com/v1beta1/namespaces/demo/backupconfigurations/persistentvolumeclaim-nfs-pvc + uid: 6270ab3f-c967-431b-8e4c-c19fafa44a64 +spec: + repository: + name: persistentvolumeclaim-nfs-pvc + retentionPolicy: + keepLast: 5 + name: keep-last-5 + prune: true + runtimeSettings: {} + schedule: '*/15 * * * *' + target: + ref: + apiVersion: v1 + kind: PersistentVolumeClaim + name: nfs-pvc + task: + name: pvc-backup + tempDir: {} +``` + +Notice that the `spec.target.ref` is pointing to the `nfs-pvc` PVC. + +**Wait for BackupSession:** + +Now, wait for the next backup schedule. Run the following command to watch `BackupSession` crd: + +```bash +$ watch -n 1 kubectl get backupsession -n demo -l=stash.appscode.com/backup-configuration=persistentvolumeclaim-nfs-pvc + +Every 1.0s: kubectl get backupsession -n demo ... workstation: Thu Jul 18 15:18:42 2019 + +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +persistentvolumeclaim-nfs-pvc-1563441309 BackupConfiguration persistentvolumeclaim-nfs-pvc Succeeded 3m33s +``` + +>Note: Respective CronJob creates `BackupSession` crd with the following label `stash.appscode.com/backup-configuration=`. We can use this label to watch only the `BackupSession` of our desired `BackupConfiguration`. + +**Verify Backup:** + +When backup session is completed, Stash will update the respective `Repository` to reflect the latest state of backed up data. + +Run the following command to check if a snapshot has been sent to the backend, + +```bash +$ kubectl get repository -n demo persistentvolumeclaim-nfs-pvc +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +persistentvolumeclaim-nfs-pvc true 41 B 1 3m37s 5m11s +``` + +> Stash creates one snapshot for each targeted file path. Since we are taking backup of two file paths, two snapshots have been created for this BackupSession. + +If we navigate to `stash-backup/demo/persistentvolumeclaim/nfs-pvc` directory of our GCS bucket, we are going to see that the snapshot has been stored there. + +
+  Backup data of PVC 'nfs-pvc' in GCS backend +
Fig: Backup data of PVC "nfs-pvc" in GCS backend
+
+ +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo backupBlueprint/pvc-backup-blueprint +kubectl delete -n demo repository/persistentvolumeclaim-nfs-pvc +kubectl delete -n demo backupconfiguration/persistentvolumeclaim-nfs-pvc + +kubectl delete -n demo pod/demo-pod +kubectl delete -n demo pvc/nfs-pvc +kubectl delete -n demo pv/nfs-pv +``` + +If you would like to uninstall Stash operator, please follow the steps [here](/docs/v2024.12.18/setup/README). diff --git a/content/docs/v2024.12.18/guides/auto-backup/workload/examples/backupblueprint.yaml b/content/docs/v2024.12.18/guides/auto-backup/workload/examples/backupblueprint.yaml new file mode 100644 index 0000000000..fd8d1b7f7c --- /dev/null +++ b/content/docs/v2024.12.18/guides/auto-backup/workload/examples/backupblueprint.yaml @@ -0,0 +1,17 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupBlueprint +metadata: + name: workload-backup-blueprint +spec: + # ============== Blueprint for Repository ========================== + backend: + gcs: + bucket: appscode-qa + prefix: stash-backup/${TARGET_NAMESPACE}/${TARGET_KIND}/${TARGET_NAME} + storageSecretName: gcs-secret + # ============== Blueprint for BackupConfiguration ================= + schedule: "*/5 * * * *" + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/guides/auto-backup/workload/examples/daemonset.yaml b/content/docs/v2024.12.18/guides/auto-backup/workload/examples/daemonset.yaml new file mode 100644 index 0000000000..08aef1b82b --- /dev/null +++ b/content/docs/v2024.12.18/guides/auto-backup/workload/examples/daemonset.yaml @@ -0,0 +1,45 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: my-daemon-config + namespace: demo +data: + config-file-1.txt: "This is first config file" + config-file-2.txt: "This is second config file" +--- +apiVersion: apps/v1 +kind: DaemonSet +metadata: + labels: + app: stash-demo + name: dmn-demo + namespace: demo + annotations: + stash.appscode.com/backup-blueprint: workload-backup-blueprint + stash.appscode.com/target-paths: "/etc/config" + stash.appscode.com/volume-mounts: "dmn-config:/etc/config" +spec: + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - name: busybox + args: + - sleep + - "3600" + image: busybox + imagePullPolicy: IfNotPresent + volumeMounts: + - mountPath: /etc/config + name: dmn-config + restartPolicy: Always + volumes: + - name: dmn-config + configMap: + name: my-daemon-config diff --git a/content/docs/v2024.12.18/guides/auto-backup/workload/examples/deployment.yaml b/content/docs/v2024.12.18/guides/auto-backup/workload/examples/deployment.yaml new file mode 100644 index 0000000000..8be38eefb4 --- /dev/null +++ b/content/docs/v2024.12.18/guides/auto-backup/workload/examples/deployment.yaml @@ -0,0 +1,59 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: stash-sample-data-1 + namespace: demo +data: + file1.txt: "Data from ConfigMap 'stash-sample-data-1'" +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: stash-sample-data-2 + namespace: demo +data: + file2.txt: "Data from ConfigMap 'stash-sample-data-2'" +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-demo + name: stash-demo + namespace: demo + annotations: + stash.appscode.com/backup-blueprint: workload-backup-blueprint + stash.appscode.com/target-paths: "/source/data-1,/source/data-2" + stash.appscode.com/volume-mounts: "source-data-1:/source/data-1,source-data-2:/source/data-2" + stash.appscode.com/schedule: "*/15 * * * *" +spec: + replicas: 3 + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - args: + - sleep + - "3600" + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data-1 + name: source-data-1 + - mountPath: /source/data-2 + name: source-data-2 + restartPolicy: Always + volumes: + - name: source-data-1 + configMap: + name: stash-sample-data-1 + - name: source-data-2 + configMap: + name: stash-sample-data-2 diff --git a/content/docs/v2024.12.18/guides/auto-backup/workload/examples/statefulset.yaml b/content/docs/v2024.12.18/guides/auto-backup/workload/examples/statefulset.yaml new file mode 100644 index 0000000000..9447494b40 --- /dev/null +++ b/content/docs/v2024.12.18/guides/auto-backup/workload/examples/statefulset.yaml @@ -0,0 +1,64 @@ +apiVersion: v1 +kind: Service +metadata: + name: headless + namespace: demo +spec: + ports: + - name: http + port: 80 + targetPort: 0 + selector: + app: stash-demo + clusterIP: None +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: sts-demo + namespace: demo + labels: + app: stash-demo + annotations: + stash.appscode.com/backup-blueprint: workload-backup-blueprint + stash.appscode.com/target-paths: "/source/data-1,/source/data-2" + stash.appscode.com/volume-mounts: "source-data-1:/source/data-1,source-data-2:/source/data-2" +spec: + replicas: 3 + selector: + matchLabels: + app: stash-demo + serviceName: headless + template: + metadata: + labels: + app: stash-demo + spec: + containers: + - name: busybox + image: busybox + command: ["/bin/sh", "-c"] + args: ["touch /source/data-1/sample-file-1.txt && touch /source/data-2/sample-file-2.txt && sleep 3000"] + imagePullPolicy: IfNotPresent + volumeMounts: + - mountPath: /source/data-1 + name: source-data-1 + - mountPath: /source/data-2 + name: source-data-2 + volumeClaimTemplates: + - metadata: + name: source-data-1 + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + - metadata: + name: source-data-2 + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi diff --git a/content/docs/v2024.12.18/guides/auto-backup/workload/images/daemon_repo.png b/content/docs/v2024.12.18/guides/auto-backup/workload/images/daemon_repo.png new file mode 100644 index 0000000000..4a92b24d1c Binary files /dev/null and b/content/docs/v2024.12.18/guides/auto-backup/workload/images/daemon_repo.png differ diff --git a/content/docs/v2024.12.18/guides/auto-backup/workload/images/deployment_repo.png b/content/docs/v2024.12.18/guides/auto-backup/workload/images/deployment_repo.png new file mode 100644 index 0000000000..68e4ebecc2 Binary files /dev/null and b/content/docs/v2024.12.18/guides/auto-backup/workload/images/deployment_repo.png differ diff --git a/content/docs/v2024.12.18/guides/auto-backup/workload/images/statefulset_repo.png b/content/docs/v2024.12.18/guides/auto-backup/workload/images/statefulset_repo.png new file mode 100644 index 0000000000..fa0700e8a0 Binary files /dev/null and b/content/docs/v2024.12.18/guides/auto-backup/workload/images/statefulset_repo.png differ diff --git a/content/docs/v2024.12.18/guides/auto-backup/workload/index.md b/content/docs/v2024.12.18/guides/auto-backup/workload/index.md new file mode 100644 index 0000000000..4671be057f --- /dev/null +++ b/content/docs/v2024.12.18/guides/auto-backup/workload/index.md @@ -0,0 +1,796 @@ +--- +title: Auto Backup Workload | Stash +description: An step by step guide on how to configure automatic backup for workloads. +menu: + docs_v2024.12.18: + identifier: auto-backup-workload + name: Auto Backup for Workloads + parent: auto-backup + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Auto Backup for Workloads + +This tutorial will show you how to configure automatic backup for Kubernetes workloads. Here, we are going to show a demo on how we can backup Deployments, StatefulSets, and DaemonSets using a common blueprint. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). + +- Install `Stash` in your cluster following the steps [here](/docs/v2024.12.18/setup/README). + +- You should be familiar with the following Stash concepts: + - [Repository](/docs/v2024.12.18/concepts/crds/repository/) + - [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) + - [BackupBlueprint](/docs/v2024.12.18/concepts/crds/backupblueprint/) + - [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) + +To keep things isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create namespace demo +namespace/demo created +``` + +## Prepare Backup Blueprint + +We are going to use [GCS Backend](/docs/v2024.12.18/guides/backends/gcs/) to store the backed up data. You can use any supported backend you prefer. You just have to configure Storage Secret and `spec.backend` section of `BackupBlueprint` to match your backend. To learn which backends are supported by Stash and how to configure them, please visit [here](/docs/v2024.12.18/guides/backends/overview/). + +> For GCS backend, if the bucket does not exist, Stash needs `Storage Object Admin` role permissions to create the bucket. For more details, please check the following [guide](/docs/v2024.12.18/guides/backends/gcs/). + +**Create Storage Secret:** + +At first, let's create a Storage Secret for the GCS backend, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ mv downloaded-sa-json.key GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create BackupBlueprint:** + +Now, we have to create a `BackupBlueprint` crd with a blueprint for `Repository` and `BackupConfiguration` object. + +Below is the YAML of the `BackupBlueprint` object that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupBlueprint +metadata: + name: workload-backup-blueprint +spec: + # ============== Blueprint for Repository ========================== + backend: + gcs: + bucket: appscode-qa + prefix: stash-backup/${TARGET_NAMESPACE}/${TARGET_KIND}/${TARGET_NAME} + storageSecretName: gcs-secret + # ============== Blueprint for BackupConfiguration ================= + schedule: "*/5 * * * *" + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Note that we have used some variables (format: `${}`) in `backend.gcs.prefix` field. Stash will substitute these variables with values from the respective target. Since the resolved prefix will be different for different workload, the backed up data will be stored in different directory inside the bucket. To know which variable you can use in this `prefix` field, please visit [here](/docs/v2024.12.18/concepts/crds/backupblueprint/#repository-blueprint). + +Let's create the `BackupBlueprint` that we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/auto-backup/workload/examples/backupblueprint.yaml +backupblueprint.stash.appscode.com/workload-backup-blueprint created +``` + +Now, automatic backup is configured for Kubernetes workloads (`Deployment`, `StatefulSet`, `DaemonSet` etc.). We just have to add some annotations to the targeted workload to enable periodic backup. + +**Available Auto-Backup Annotations for Workloads:** + +You have to add the auto-backup annotations to the workload that you want to backup. The following auto-backup annotations are available for a workload: + +- **BackupBlueprint Name:** You have to specify the `BackupBlueprint` name that holds the template for `Repository` and `BackupConfiguration` in the following annotation: + +```yaml +stash.appscode.com/backup-blueprint: +``` + +You can also specify multiple BackupBlueprint name separated by comma (`,`). For example: + +```yaml +stash.appscode.com/backup-blueprint: daily-gcs-backup,weekly-s3-backup +``` + +- **Schedule:** You can specify a schedule to backup this target through this annotation. If you don't specify this annotation, schedule from the `BackupBlueprint` will be used. + +```yaml + stash.appscode.com/schedule: +``` + +- **Target Paths:** You have to specify a list of paths that you want to backup through this annotation. Use comma (`,`) to separate multiple file paths. For example, `"/my/target/dir-1,/my/target/dir-2"`. + +```yaml +stash.appscode.com/target-paths: "" +``` + +- **Volume Mounts:** You have to also specify a list of Volumes and their MountPath and SubPath where the targeted paths are located. Use `"::"` format to specify the volumes. The `:` part is optional. Use comma (`,`) to specify multiple volumes and mount path. For example, `"vol-1:/mount/path-1:sub/path-1,vol-2:/mount/path-2"`. + +```yaml +stash.appscode.com/volume-mounts: "::" +``` + +## Backup Deployment + +Now, we are going to backup a Deployment using the blueprint we have configured earlier. We are going to mount two ConfigMap volume in two different directories of the Deployment. Then, we are going to backup those directories using automatic backup. + +**Create Deployment:** + +Below is the YAML of the Deployment and respective ConfigMaps that we are going to create, + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: stash-sample-data-1 + namespace: demo +data: + file1.txt: "Data from ConfigMap 'stash-sample-data-1'" +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: stash-sample-data-2 + namespace: demo +data: + file2.txt: "Data from ConfigMap 'stash-sample-data-2'" +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-demo + name: stash-demo + namespace: demo + annotations: + stash.appscode.com/backup-blueprint: workload-backup-blueprint + stash.appscode.com/target-paths: "/source/data-1,/source/data-2" + stash.appscode.com/volume-mounts: "source-data-1:/source/data-1,source-data-2:/source/data-2" + stash.appscode.com/schedule: "*/15 * * * *" +spec: + replicas: 3 + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - args: + - sleep + - "3600" + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data-1 + name: source-data-1 + - mountPath: /source/data-2 + name: source-data-2 + restartPolicy: Always + volumes: + - name: source-data-1 + configMap: + name: stash-sample-data-1 + - name: source-data-2 + configMap: + name: stash-sample-data-2 +``` + +Notice the `metadata.annotations` field. We have specified the automatic backup specific annotations to backup `/source/data-1` and `/source/data-2` directories of the `source-data-1` and `source-data-2` volumes respectively. We have also specified to use `workload-backup-blueprint` BackupBlueprint for creating `Repository` and `BackupConfiguration` for this Deployment. BackupBlueprint is a non-namespaced resource, so we just need to specify the name of the blueprint. + +Let's create the above Deployment, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/auto-backup/workload/examples/deployment.yaml +configmap/stash-sample-data-1 created +configmap/stash-sample-data-2 created +deployment.apps/stash-demo created +``` + +If everything goes well, Stash will create a `Repository` and a `BackupConfiguration` with the name in the following format: `-`. + +**Verify Repository:** + +Verify that the Repository has been created successfully by the following command, + +```bash +$ kubectl get repository -n demo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +deployment-stash-demo 9s +``` + +If we view the YAML of this Repository, we are going to see that the variables `${TARGET_NAMESPACE}`, `${TARGET_KIND}` and `${TARGET_NAME}` has been replaced by `demo`, `deployment` and `stash-demo` respectively. + +```bash +$ kubectl get repository -n demo deployment-stash-demo -o yaml +``` + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: deployment-stash-demo + namespace: demo + ... +spec: + backend: + gcs: + bucket: appscode-qa + prefix: stash-backup/demo/deployment/stash-demo + storageSecretName: gcs-secret +``` + +**Verify BackupConfiguratoin:** + +If everything goes well, Stash should create a `BackupConfiguration` for our Deployment and the phase of that `BackupConfiguration` should be `Ready`. Verify that the `BackupConfiguration` has been created by the following command, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +deployment-stash-demo */15 * * * * Ready 19s +``` + +Let's check the YAML of this `BackupConfiguration`, + +```bash +$ kubectl get backupconfiguration -n demo deployment-stash-demo -o yaml +``` + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-stash-demo + namespace: demo + ... +spec: + repository: + name: deployment-stash-demo + retentionPolicy: + keepLast: 5 + name: keep-last-5 + prune: true + runtimeSettings: {} + schedule: '*/15 * * * *' + target: + paths: + - /source/data-1 + - /source/data-2 + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - mountPath: /source/data-1 + name: source-data-1 + - mountPath: /source/data-2 + name: source-data-2 + task: {} + tempDir: {} +``` + +Notice that the `spec.target.ref` is pointing to the `stash-demo` Deployment. Also, notice that the `spec.target.paths` and `spec.target.volumeMounts` fields have been populated with the information we had provided as annotation of the Deployment. + +**Wait for BackupSession:** + +Now, wait for the next backup schedule. Run the following command to watch `BackupSession` crd: + +```bash +$ watch -n 1 kubectl get backupsession -n demo -l=stash.appscode.com/backup-configuration=deployment-stash-demo + +Every 1.0s: kubectl get backupsession -n demo workstation: Wed Jun 26 12:20:31 2019 +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +deployment-stash-demo-1561530008 BackupConfiguration deployment-stash-demo Succeeded 61s +``` + +>Note: Respective CronJob creates `BackupSession` crd with the following label `stash.appscode.com/backup-configuration=`. We can use this label to watch only the `BackupSession` of our desired `BackupConfiguration`. + +**Verify Backup:** + +When backup session is completed, Stash will update the respective `Repository` to reflect the latest state of backed up data. + +Run the following command to check if the snapshots are stored in the backend, + +```bash +$ kubectl get repository -n demo deployment-stash-demo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +deployment-stash-demo true 246 B 2 70s 5m +``` + +> Stash creates one snapshot for each targeted file path. Since we are taking backup of two file paths, two snapshots have been created for this BackupSession. + +If we navigate to `stash-backup/demo/deployment/stash-demo` directory of our GCS bucket, we are going to see that the snapshot has been stored there. + +
+  Backup data in GCS backend +
Fig: Backup data in GCS backend
+
+ +>Stash keeps all backup data encrypted. So, snapshot files in the bucket will not contain any meaningful data until they are decrypted. + +## Backup StatefulSet + +Now, we are going to backup a StatefulSet with the same blueprint we have used to backup Deployment in the previous section. + +**Create StatefulSet:** + +We are going to create a StatefulSet with 3 replicas. We are going to configure the StatefulSet to generate sample data in each replica. + +Below is the YAML of the StatefulSet that we are going to create, + +```yaml +apiVersion: v1 +kind: Service +metadata: + name: headless + namespace: demo +spec: + ports: + - name: http + port: 80 + targetPort: 0 + selector: + app: stash-demo + clusterIP: None +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: sts-demo + namespace: demo + labels: + app: stash-demo + annotations: + stash.appscode.com/backup-blueprint: workload-backup-blueprint + stash.appscode.com/target-paths: "/source/data-1,/source/data-2" + stash.appscode.com/volume-mounts: "source-data-1:/source/data-1,source-data-2:/source/data-2" +spec: + replicas: 3 + selector: + matchLabels: + app: stash-demo + serviceName: headless + template: + metadata: + labels: + app: stash-demo + spec: + containers: + - name: busybox + image: busybox + command: ["/bin/sh", "-c"] + args: ["touch /source/data-1/sample-file-1.txt && touch /source/data-2/sample-file-2.txt && sleep 3000"] + imagePullPolicy: IfNotPresent + volumeMounts: + - mountPath: /source/data-1 + name: source-data-1 + - mountPath: /source/data-2 + name: source-data-2 + volumeClaimTemplates: + - metadata: + name: source-data-1 + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + - metadata: + name: source-data-2 + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi +``` + +Notice the `metadata.annotations` field. We have specified automatic backup specific annotations similarly as we had specified in the Deployment in the previous section. + +Let's create the StatefulSet we have created above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/auto-backup/workload/examples/statefulset.yaml +service/headless created +statefulset.apps/sts-demo created +``` + +**Verify Repository:** + +Verify that a Repository has been created for this StatefulSet using the following command, + +```bash +$ kubectl get repository -n demo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +deployment-stash-demo true 410 B 10 14s 39m +statefulset-sts-demo 31s +``` + +Here, `statefulset-sts-demo` Repository has been created for our `sts-demo` StatefulSet. + +Let's view the YAML of the Repository, + +```bash +$ kubectl get repository -n demo statefulset-sts-demo -o yaml +``` + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: statefulset-sts-demo + namespace: demo + ... +spec: + backend: + gcs: + bucket: appscode-qa + prefix: stash-backup/demo/statefulset/sts-demo + storageSecretName: gcs-secret +``` + +Notice that the variables of the `prefix` field of `BackupBlueprint` is now replaced with `demo`, `statefulset` and `sts-demo` respectively. + +**Verify BackupConfiguratoin:** + +Verify that a `BackupConfiguration` has been created and in `Ready` Phase for this StatefulSet using the following command, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +deployment-stash-demo */5 * * * * Ready 40m +statefulset-sts-demo */5 * * * * Ready 105s +``` + +Here, `statefulset-sts-demo` has been created for the StatefulSet `sts-demo`. You can check the YAML of this `BackupConfiguration` to see that the target field is pointing to this StatefulSet. + +```bash +$ kubectl get backupconfiguration -n demo statefulset-sts-demo -o yaml +``` + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: statefulset-sts-demo + namespace: demo + ... +spec: + repository: + name: statefulset-sts-demo + retentionPolicy: + keepLast: 5 + name: keep-last-5 + prune: true + runtimeSettings: {} + schedule: '*/5 * * * *' + target: + paths: + - /source/data-1 + - /source/data-2 + ref: + apiVersion: apps/v1 + kind: StatefulSet + name: sts-demo + volumeMounts: + - mountPath: /source/data-1 + name: source-data-1 + - mountPath: /source/data-2 + name: source-data-2 + task: {} + tempDir: {} +``` + +**Wait for BackupSession:** + +Now, wait for the next backup schedule. Watch the `BackupSession` of the BackupConfiguration `statefulset-sts-demo` using the following command, + +```bash +$ watch -n 1 kubectl get backupsession -n demo -l=stash.appscode.com/backup-configuration=statefulset-sts-demo +Every 1.0s: kubectl get backupsession -n demo -l=stash.appscode.com/backup-... workstation: Wed Jun 26 13:01:22 2019 + +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +statefulset-sts-demo-1561532403 BackupConfiguration statefulset-sts-demo Succeeded 2m21s +``` + +**Verify Backup:** + +Once the backup session is completed, verify that the `Repository` has been updated to reflect the backup using the following command, + +```bash +$ kubectl get repository -n demo statefulset-sts-demo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +statefulset-sts-demo true 0 B 6 32s 7m29s +``` + +>For StatfulSet, Stash takes backup from every replica. Since we are using a StatefulSet with 3 replicas and we are taking backup of 2 file paths, total 6 snapshots have been created for this BackupSession. + +If we navigate to `stash-backup/demo/statefulset/sts-demo` directory of our GCS bucket, we are going to see that the snapshot been stored there. + +
+  Backup data of `sts-demo` StatefulSet in GCS backend +
Fig: Backup data of StatefulSet "sts-demo" in GCS backend
+
+ +## Backup DaemonSet + +Now, we are going to use the same blueprint to backup a DaemonSet. We are going to mount a ConfigMap in `/etc/config` directory. Then, we are going to backup this directory using automatic backup. + +**Create DaemonSet:** + +Below is the YAML of the DaemonSet that we are going to create, + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: my-daemon-config + namespace: demo +data: + config-file-1.txt: "This is first config file" + config-file-2.txt: "This is second config file" +--- +apiVersion: apps/v1 +kind: DaemonSet +metadata: + labels: + app: stash-demo + name: dmn-demo + namespace: demo + annotations: + stash.appscode.com/backup-blueprint: workload-backup-blueprint + stash.appscode.com/target-paths: "/etc/config" + stash.appscode.com/volume-mounts: "dmn-config:/etc/config" +spec: + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - name: busybox + args: + - sleep + - "3600" + image: busybox + imagePullPolicy: IfNotPresent + volumeMounts: + - mountPath: /etc/config + name: dmn-config + restartPolicy: Always + volumes: + - name: dmn-config + configMap: + name: my-daemon-config +``` + +Notice the `metadata.annotations` field. We have specified automatic backup specific annotations to backup our desired file path. + +Let's create the DaemonSet we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/auto-backup/workload/examples/daemonset.yaml +configmap/my-daemon-config created +daemonset.apps/dmn-demo created +``` + +**Verify Repository:** + +Verify that a `Repository` has been created for this DaemonSet using the following command, + +```bash +$ kubectl get repository -n demo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +daemonset-dmn-demo 28s +deployment-stash-demo true 410 B 10 6m3s 70m +statefulset-sts-demo true 0 B 26 6m6s 31m +``` + +Here, `daemonset-dmn-demo` Repository has been created for our `dmn-demo` DaemonSet. + +Let's view the YAML of the Repository, + +```bash +$ kubectl get repository -n demo daemonset-dmn-demo -o yaml +``` + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: daemonset-dmn-demo + namespace: demo + ... +spec: + backend: + gcs: + bucket: appscode-qa + prefix: stash-backup/demo/daemonset/dmn-demo + storageSecretName: gcs-secret +``` + +**Verify BackupConfiguratoin:** +If everything goes well, Stash should create a `BackupConfiguration` for our DaemonSet and the phase of that `BackupConfiguration` should be `Ready`. Verify the `BackupConfiguration` crd by the following command, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +daemonset-dmn-demo */5 * * * * Ready 90s +deployment-stash-demo */5 * * * * Ready 71m +statefulset-sts-demo */5 * * * * Ready 32m +``` + +Here, `daemonset-dmn-demo` has been created for the DaemonSet `dmn-demo`. You can check the YAML of this `BackupConfiguration` to see that the target field is pointing to this DaemonSet. + +```bash +$ kubectl get backupconfiguration -n demo daemonset-dmn-demo -o yaml +``` + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: daemonset-dmn-demo + namespace: demo + ... +spec: + repository: + name: daemonset-dmn-demo + retentionPolicy: + keepLast: 5 + name: keep-last-5 + prune: true + runtimeSettings: {} + schedule: '*/5 * * * *' + target: + paths: + - /etc/config + ref: + apiVersion: apps/v1 + kind: DaemonSet + name: dmn-demo + volumeMounts: + - mountPath: /etc/config + name: dmn-config + task: {} + tempDir: {} +``` + +**Wait for BackupSession:** + +Now, wait for the next backup schedule. Watch the `BackupSession` of the BackupConfiguration `daemonset-dmn-demo` using the following command, + +```bash +$ watch -n 1 kubectl get backupsession -n demo -l=stash.appscode.com/backup-configuration=daemonset-dmn-demo + +Every 1.0s: kubectl get backupsession -n demo -l=stash.appscode.com/backup-... workstation: Wed Jun 26 13:30:14 2019 + +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +daemonset-dmn-demo-1561534208 BackupConfiguration daemonset-dmn-demo Succeeded 45s +``` + +**Verify Backup:** + +Once the backup session is completed, verify that the `Repository` has been updated to reflect the backup using the following command, + +```bash +$ kubectl get repository -n demo daemonset-dmn-demo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +daemonset-dmn-demo true 51 B 1 5s 4m27s +``` + +>For DaemonSet, Stash takes backup from every daemon pod running on different nodes. Since we are using a single node cluster (Minikube), only 1 snapshot has been created for this BackupSession. + +If we navigate to `stash-backup/demo/daemonset/dmn-demo` directory of our GCS bucket, we are going to see that the snapshot been stored there. + +
+  Backup data of `dmn-demo` DaemonSet in GCS backend +
Fig: Backup data of DaemonSet "dmn-demo" in GCS backend
+
+ +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo deployment/stash-demo +kubectl delete -n demo statefulset/sts-demo +kubectl delete -n demo daemonset/dmn-demo + +kubectl delete -n demo repository --all +kubectl delete -n demo secret/gcs-secret +kubectl delete -n demo backupblueprint/workload-backup-blueprint +``` + +If you would like to uninstall Stash operator, please follow the steps [here](/docs/v2024.12.18/setup/README). diff --git a/content/docs/v2024.12.18/guides/backends/_index.md b/content/docs/v2024.12.18/guides/backends/_index.md new file mode 100644 index 0000000000..fac0cdf374 --- /dev/null +++ b/content/docs/v2024.12.18/guides/backends/_index.md @@ -0,0 +1,77 @@ +--- +title: Backends | Stash +menu: + docs_v2024.12.18: + identifier: backend + name: Supported Backends + parent: guides + weight: 10 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/guides/backends/azure/examples/azure.yaml b/content/docs/v2024.12.18/guides/backends/azure/examples/azure.yaml new file mode 100644 index 0000000000..ef092cfb86 --- /dev/null +++ b/content/docs/v2024.12.18/guides/backends/azure/examples/azure.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: azure-repo + namespace: demo +spec: + backend: + azure: + container: stash-backup + prefix: /demo/deployment/my-deploy + storageSecretName: azure-secret diff --git a/content/docs/v2024.12.18/guides/backends/azure/index.md b/content/docs/v2024.12.18/guides/backends/azure/index.md new file mode 100644 index 0000000000..950cdd2343 --- /dev/null +++ b/content/docs/v2024.12.18/guides/backends/azure/index.md @@ -0,0 +1,151 @@ +--- +title: Azure Backend | Stash +description: Configure Stash to use Microsoft Azure Storage as Backend. +menu: + docs_v2024.12.18: + identifier: backend-azure + name: Azure Blob Storage + parent: backend + weight: 40 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Microsoft Azure Storage + +Stash supports Microsoft's [Azure Blob Storage](https://azure.microsoft.com/en-us/services/storage/blobs/) as a backend. This tutorial will show you how to use this backend. + +In order to use Azure Blob Storage as backend, you have to create a `Secret` and a `Repository` object pointing to the desired blob container. + +#### Create Storage Secret + +To configure storage secret for this backend, following secret keys are needed: + +| Key | Type | Description | +| -------------------- | ---------- | ---------------------------------------------------------- | +| `RESTIC_PASSWORD` | `Required` | Password that will be used to encrypt the backup snapshots | +| `AZURE_ACCOUNT_NAME` | `Required` | Azure Storage account name | +| `AZURE_ACCOUNT_KEY` | `Required` | Azure Storage account key | + +Create storage secret as below, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > AZURE_ACCOUNT_NAME +$ echo -n '' > AZURE_ACCOUNT_KEY +$ kubectl create secret generic -n demo azure-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./AZURE_ACCOUNT_NAME \ + --from-file=./AZURE_ACCOUNT_KEY +secret/azure-secret created +``` + +### Create Repository + +Now, you have to create a `Repository` crd. You have to provide the storage secret that we have created earlier in `spec.backend.storageSecretName` field. + +Following parameters are available for `azure` backend. + +| Parameter | Type | Description | +| ---------------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------- | +| `azure.container` | `Required` | Name of Storage container. | +| `azure.prefix` | `Optional` | Path prefix inside the container where backed up data will be stored. | +| `azure.maxConnections` | `Optional` | Maximum number of parallel connections to use for uploading backup data. By default, Stash will use maximum 5 parallel connections. | + +Below, the YAML of a sample `Repository` crd that uses an Azure Blob container as a backend. + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: azure-repo + namespace: demo +spec: + backend: + azure: + container: stash-backup + prefix: /demo/deployment/my-deploy + storageSecretName: azure-secret +``` + +Create the `Repository` we have shown above using the following command, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/backends/azure/examples/azure.yaml +repository/azure-repo created +``` + +Now, we are ready to use this backend to backup our desired data using Stash. + +## Next Steps + +- Learn how to use Stash to backup workloads data from [here](/docs/v2024.12.18/guides/workloads/overview/). +- Learn how to use Stash to backup databases from [here](/docs/v2024.12.18/guides/addons/overview/). +- Learn how to use Stash to backup stand-alone PVC from [here](/docs/v2024.12.18/guides/volumes/overview/). diff --git a/content/docs/v2024.12.18/guides/backends/b2/examples/b2.yaml b/content/docs/v2024.12.18/guides/backends/b2/examples/b2.yaml new file mode 100644 index 0000000000..e03411c56c --- /dev/null +++ b/content/docs/v2024.12.18/guides/backends/b2/examples/b2.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: b2-repo + namespace: demo +spec: + backend: + b2: + bucket: stash-backup + prefix: /demo/deployment/my-deploy + storageSecretName: b2-secret diff --git a/content/docs/v2024.12.18/guides/backends/b2/index.md b/content/docs/v2024.12.18/guides/backends/b2/index.md new file mode 100644 index 0000000000..47772b9a31 --- /dev/null +++ b/content/docs/v2024.12.18/guides/backends/b2/index.md @@ -0,0 +1,153 @@ +--- +title: Backblaze B2 Backend | Stash +description: Configure Stash to use Backblaze B2 as Backend. +menu: + docs_v2024.12.18: + identifier: backend-b2 + name: Backblaze B2 + parent: backend + weight: 70 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backblaze B2 + +Stash supports Backblaze's [B2 Cloud Storage](https://www.backblaze.com/b2/cloud-storage.html) as a backend. This tutorial will show you how to use this backend. + +In order to use Backblaze B2 Cloud Storage as backend, you have to create a `Secret` and a `Repository` object pointing to the desired B2 bucket. + +>If the bucket does not exist yet and the credentials you have provided have the privilege to create bucket, it will be created automatically during the first backup. In this case, you have to make sure that the bucket name is unique across all B2 buckets. + +#### Create Storage Secret + +To configure storage secret for this backend, following secret keys are needed: + +| Key | Type | Description | +| ----------------- | ---------- | ----------------------------------------------------------- | +| `RESTIC_PASSWORD` | `Required` | Password that will be used to encrypt the backup snapshots. | +| `B2_ACCOUNT_ID` | `Required` | Backblaze B2 account id. | +| `B2_ACCOUNT_KEY` | `Required` | Backblaze B2 account key. | + +Create storage secret as below, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > B2_ACCOUNT_ID +$ echo -n '' > B2_ACCOUNT_KEY +$ kubectl create secret generic -n demo b2-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./B2_ACCOUNT_ID \ + --from-file=./B2_ACCOUNT_KEY +secret/b2-secret created +``` + +### Create Repository + +Now, you have to create a `Repository` crd. You have to provide the storage secret that we have created earlier in `spec.backend.storageSecretName` field. + +Following parameters are available for `b2` backend, + +| Parameter | Type | Description | +| ------------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------- | +| `b2.bucket` | `Required` | Name of the B2 bucket. | +| `b2.prefix` | `Optional` | Path prefix inside the bucket where the backed up data will be stored. | +| `b2.maxConnections` | `Optional` | Maximum number of parallel connections to use for uploading backup data. By default, Stash will use maximum 5 parallel connections. | + +Below, the YAML of a sample `Repository` crd that uses a B2 bucket as a backend. + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: b2-repo + namespace: demo +spec: + backend: + b2: + bucket: stash-backup + prefix: /demo/deployment/my-deploy + storageSecretName: b2-secret +``` + +Create the `Repository` we have shown above using the following command, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/backends/b2/examples/b2.yaml +repository/b2-repo created +``` + +Now, we are ready to use this backend to backup our desired data using Stash. + +## Next Steps + +- Learn how to use Stash to backup workloads data from [here](/docs/v2024.12.18/guides/workloads/overview/). +- Learn how to use Stash to backup databases from [here](/docs/v2024.12.18/guides/addons/overview/). +- Learn how to use Stash to backup stand-alone PVC from [here](/docs/v2024.12.18/guides/volumes/overview/). diff --git a/content/docs/v2024.12.18/guides/backends/gcs/examples/gcs.yaml b/content/docs/v2024.12.18/guides/backends/gcs/examples/gcs.yaml new file mode 100644 index 0000000000..8dadcee219 --- /dev/null +++ b/content/docs/v2024.12.18/guides/backends/gcs/examples/gcs.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-backup + prefix: /demo/deployment/my-deploy + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/guides/backends/gcs/index.md b/content/docs/v2024.12.18/guides/backends/gcs/index.md new file mode 100644 index 0000000000..2302f03035 --- /dev/null +++ b/content/docs/v2024.12.18/guides/backends/gcs/index.md @@ -0,0 +1,153 @@ +--- +title: GCS Backend | Stash +description: Configure Stash to use Google Cloud Storage (GCS) as Backend. +menu: + docs_v2024.12.18: + identifier: backend-gcs + name: Google Cloud Storage + parent: backend + weight: 50 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Google Cloud Storage (GCS) + +Stash supports [Google Cloud Storage(GCS)](https://cloud.google.com/storage/) as a backend. This tutorial will show you how to use this backend. + +In order to use Google Cloud Storage as backend, you have to create a `Secret` and a `Repository` object pointing to the desired GCS bucket. + +> If the bucket already exists, the Google Cloud service account you provide to Stash only needs `Storage Object Creator` role permission. However, if the bucket does not exist, Stash will create the bucket during the first backup. In this case, the Google Cloud service account key used for Stash must have `Storage Object Admin` role permission. To avoid giving this elevated level of permission to Stash, create the bucket manually (either from GCP console or gcloud cli) ahead of time. + +#### Create Storage Secret + +To configure storage secret for this backend, following secret keys are needed: + +| Key | Type | Description | +| --------------------------------- | ---------- | ----------------------------------------------------------- | +| `RESTIC_PASSWORD` | `Required` | Password that will be used to encrypt the backup snapshots. | +| `GOOGLE_PROJECT_ID` | `Required` | Google Cloud project ID. | +| `GOOGLE_SERVICE_ACCOUNT_JSON_KEY` | `Required` | Google Cloud service account json key. | + +Create storage secret as below, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ mv downloaded-sa-json.key GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +### Create Repository + +Now, you have to create a `Repository` crd. You have to provide the storage secret that we have created earlier in `spec.backend.storageSecretName` field. + +Following parameters are available for `gcs` backend. + +| Parameter | Type | Description | +| -------------------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `gcs.bucket` | `Required` | Name of Bucket. If the bucket does not exist yet, it will be created in the default location (US). It is not possible at the moment for Stash to create a new bucket in a different location, so you need to create it using Google cloud console. | +| `gcs.prefix` | `Optional` | Path prefix inside the bucket where backed up data will be stored. | +| `gcs.maxConnections` | `Optional` | Maximum number of parallel connections to use for uploading backup data. By default, Stash will use maximum 5 parallel connections. | + +Below, the YAML of a sample `Repository` crd that uses a GCS bucket as a backend. + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-backup + prefix: /demo/deployment/my-deploy + storageSecretName: gcs-secret +``` + +Create the `Repository` we have shown above using the following command, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/backends/gcs/examples/gcs.yaml +repository/gcs-repo created +``` + +Now, we are ready to use this backend to backup our desired data using Stash. + +## Next Steps + +- Learn how to use Stash to backup workloads data from [here](/docs/v2024.12.18/guides/workloads/overview/). +- Learn how to use Stash to backup databases from [here](/docs/v2024.12.18/guides/addons/overview/). +- Learn how to use Stash to backup stand-alone PVC from [here](/docs/v2024.12.18/guides/volumes/overview/). diff --git a/content/docs/v2024.12.18/guides/backends/local/examples/awsElasticBolckStore.yaml b/content/docs/v2024.12.18/guides/backends/local/examples/awsElasticBolckStore.yaml new file mode 100644 index 0000000000..b561256d15 --- /dev/null +++ b/content/docs/v2024.12.18/guides/backends/local/examples/awsElasticBolckStore.yaml @@ -0,0 +1,13 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: local-repo-with-awsebs + namespace: demo +spec: + backend: + local: + mountPath: /safe/data + awsElasticBlockStore: # This AWS EBS volume must already exist. + volumeID: + fsType: ext4 + storageSecretName: local-secret diff --git a/content/docs/v2024.12.18/guides/backends/local/examples/azureDisk.yaml b/content/docs/v2024.12.18/guides/backends/local/examples/azureDisk.yaml new file mode 100644 index 0000000000..fb4a839923 --- /dev/null +++ b/content/docs/v2024.12.18/guides/backends/local/examples/azureDisk.yaml @@ -0,0 +1,13 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: local-repo-with-azuredisk + namespace: demo +spec: + backend: + local: + mountPath: /safe/data + azureDisk: + diskName: stash.vhd + diskURI: https://someaccount.blob.microsoft.net/vhds/stash.vhd + storageSecretName: local-secret diff --git a/content/docs/v2024.12.18/guides/backends/local/examples/emptyDir.yaml b/content/docs/v2024.12.18/guides/backends/local/examples/emptyDir.yaml new file mode 100644 index 0000000000..cac13c8e64 --- /dev/null +++ b/content/docs/v2024.12.18/guides/backends/local/examples/emptyDir.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: local-repo-with-emptydir + namespace: demo +spec: + backend: + local: + mountPath: /safe/data + emptyDir: {} + storageSecretName: local-secret diff --git a/content/docs/v2024.12.18/guides/backends/local/examples/gcePersistentDisk.yaml b/content/docs/v2024.12.18/guides/backends/local/examples/gcePersistentDisk.yaml new file mode 100644 index 0000000000..9409337d53 --- /dev/null +++ b/content/docs/v2024.12.18/guides/backends/local/examples/gcePersistentDisk.yaml @@ -0,0 +1,13 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: local-repo-with-gcepersistentdisk + namespace: demo +spec: + backend: + local: + mountPath: /safe/data + gcePersistentDisk: + pdName: stash-repo + fsType: ext4 + storageSecretName: local-secret diff --git a/content/docs/v2024.12.18/guides/backends/local/examples/hostPath.yaml b/content/docs/v2024.12.18/guides/backends/local/examples/hostPath.yaml new file mode 100644 index 0000000000..aad97167b8 --- /dev/null +++ b/content/docs/v2024.12.18/guides/backends/local/examples/hostPath.yaml @@ -0,0 +1,12 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: local-repo-with-hostpath + namespace: demo +spec: + backend: + local: + mountPath: /safe/data + hostPath: + path: /data/stash-test/repo + storageSecretName: local-secret diff --git a/content/docs/v2024.12.18/guides/backends/local/examples/nfs.yaml b/content/docs/v2024.12.18/guides/backends/local/examples/nfs.yaml new file mode 100644 index 0000000000..5d2bdb5f40 --- /dev/null +++ b/content/docs/v2024.12.18/guides/backends/local/examples/nfs.yaml @@ -0,0 +1,13 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: local-repo-with-nfs + namespace: demo +spec: + backend: + local: + mountPath: /safe/data + nfs: + server: "nfs-service.storage.svc.cluster.local" # use you own NFS server address + path: "/" # this path is relative to "/exports" path of NFS server + storageSecretName: local-secret diff --git a/content/docs/v2024.12.18/guides/backends/local/examples/pvc.yaml b/content/docs/v2024.12.18/guides/backends/local/examples/pvc.yaml new file mode 100644 index 0000000000..aa1d9f393a --- /dev/null +++ b/content/docs/v2024.12.18/guides/backends/local/examples/pvc.yaml @@ -0,0 +1,12 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: local-repo-with-pvc + namespace: demo +spec: + backend: + local: + mountPath: /safe/data + persistentVolumeClaim: + claimName: repo-pvc + storageSecretName: local-secret diff --git a/content/docs/v2024.12.18/guides/backends/local/examples/storageOS.yaml b/content/docs/v2024.12.18/guides/backends/local/examples/storageOS.yaml new file mode 100644 index 0000000000..2905a5c32c --- /dev/null +++ b/content/docs/v2024.12.18/guides/backends/local/examples/storageOS.yaml @@ -0,0 +1,13 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: local-repo-with-storageos + namespace: demo +spec: + backend: + local: + mountPath: /safe/data + storageos: + volumeName: stash-vol01 # The `stash-vol01` volume must already exist within StorageOS in the `demo` namespace. + fsType: ext4 + storageSecretName: local-secret diff --git a/content/docs/v2024.12.18/guides/backends/local/index.md b/content/docs/v2024.12.18/guides/backends/local/index.md new file mode 100644 index 0000000000..463863e3a7 --- /dev/null +++ b/content/docs/v2024.12.18/guides/backends/local/index.md @@ -0,0 +1,343 @@ +--- +title: Local Backend | Stash +description: Configure Stash to Use Local Backend. +menu: + docs_v2024.12.18: + identifier: backend-local + name: Kubernetes Volumes + parent: backend + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Local Backend + +`Local` backend refers to a local path inside `stash` sidecar container. Any Kubernetes supported [persistent volume](https://kubernetes.io/docs/concepts/storage/volumes/) such as [PersistentVolumeClaim](https://kubernetes.io/docs/concepts/storage/volumes/#persistentvolumeclaim), [HostPath](https://kubernetes.io/docs/concepts/storage/volumes/#hostpath), [EmptyDir](https://kubernetes.io/docs/concepts/storage/volumes/#emptydir) (for testing only), [NFS](https://kubernetes.io/docs/concepts/storage/volumes/#nfs), [gcePersistentDisk](https://kubernetes.io/docs/concepts/storage/volumes/#gcepersistentdisk) etc. can be used as local backend. + +In order to use Kubernetes volumes as backend, you have to create a `Secret` and a `Repository` object pointing to the desired volume. + +### Create Storage Secret + +To configure storage secret for local backend, following secret keys are needed: + +| Key | Type | Description | +| ----------------- | ---------- | ---------------------------------------------------------- | +| `RESTIC_PASSWORD` | `Required` | Password that will be used to encrypt the backup snapshots | + +Create storage secret as below, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ kubectl create secret generic -n demo local-secret --from-file=./RESTIC_PASSWORD +secret/local-secret created +``` + +### Create Repository + +Now, you have to create a `Repository` crd that uses Kubernetes volume as a backend. You have to provide the storage secret that we have created earlier in `spec.backend.storageSecretName` field. + +Following parameters are available for `Local` backend. + +| Parameter | Type | Description | +| -------------------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `local.mountPath` | `Required` | Path where this volume will be mounted inside the sidecar container. Example: `/safe/data`.
We have put `stash` binary in the root directory. Hence, you can not use `/stash` or `/stash/*` as `local.mountPath` | +| `local.subPath` | `Optional` | Sub-path inside the referenced volume where the backed up snapshot will be stored instead of its root. | +| `local.VolumeSource` | `Required` | Any Kubernetes volume. Can be specified inlined. Example: `hostPath`. | + +Here, we are going to show some sample `Repository` crds that uses different Kubernetes volume as a backend. + +##### HostPath volume as Backend + +Below, the YAML of a sample `Repository` crd that uses a `hostPath` volume as a backend. + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: local-repo-with-hostpath + namespace: demo +spec: + backend: + local: + mountPath: /safe/data + hostPath: + path: /data/stash-test/repo + storageSecretName: local-secret +``` + +Create the `Repository` we have shown above using the following command, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/backends/local/examples/hostPath.yaml +repository/local-repo-with-hostpath created +``` + +>Note that by default, Stash runs as `non-root` user. `hostPath` volume is writable only for `root` user. So, in order to use `hostPath` volume as backend, either you have to run Stash as `root` user using securityContext or you have to change the permission of the `hostPath` to make it writable for `non-root` users. + +##### PersistentVolumeClaim as Backend + +Below, the YAML of a sample `Repository` crd that uses a `PersistentVolumeClaim` as a backend. + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: local-repo-with-pvc + namespace: demo +spec: + backend: + local: + mountPath: /safe/data + persistentVolumeClaim: + claimName: repo-pvc + storageSecretName: local-secret +``` + +Create the `Repository` we have shown above using the following command, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/backends/local/examples/pvc.yaml +repository/local-repo-with-pvc created +``` + +##### NFS volume as Backend + +Below, the YAML of a sample `Repository` crd that uses an `NFS` volume as a backend. + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: local-repo-with-nfs + namespace: demo +spec: + backend: + local: + mountPath: /safe/data + nfs: + server: "nfs-service.storage.svc.cluster.local" # use you own NFS server address + path: "/" # this path is relative to "/exports" path of NFS server + storageSecretName: local-secret +``` + +Create the `Repository` we have shown above using the following command, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/backends/local/examples/nfs.yaml +repository/local-repo-with-nfs created +``` + +>For NFS backend, Stash may have to run the network volume accessor deployments in privileged mode to provide Snapshot listing facility. In this case, please configure network volume accessors by following the instruction [here](/docs/v2024.12.18/setup/install/troubleshooting/#configuring-network-volume-accessor). + +##### GCE PersitentDisk as Backend + +Below, the YAML of a sample `Repository` crd that uses a [gcePersistentDisk](https://kubernetes.io/docs/concepts/storage/volumes/#gcepersistentdisk) as a backend. + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: local-repo-with-gcepersistentdisk + namespace: demo +spec: + backend: + local: + mountPath: /safe/data + gcePersistentDisk: + pdName: stash-repo + fsType: ext4 + storageSecretName: local-secret +``` + +Create the `Repository` we have shown above using the following command, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/backends/local/examples/gcePersistentDisk.yaml +repository/local-repo-with-gcepersistentdisk created +``` + +>In order to use `gcePersistentDisk` volume as backend, the node where stash container is running must be a GCE VM and the VM must be in same GCE project and zone as the Persistent Disk. + +##### AWS EBS volume as Backend + +Below, the YAML of a sample `Repository` crd that uses an [awsElasticBlockStore](https://kubernetes.io/docs/concepts/storage/volumes/#awselasticblockstore) as a backend. + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: local-repo-with-awsebs + namespace: demo +spec: + backend: + local: + mountPath: /safe/data + awsElasticBlockStore: # This AWS EBS volume must already exist. + volumeID: + fsType: ext4 + storageSecretName: local-secret +``` + +Create the `Repository` we have shown above using the following command, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/backends/local/examples/awsElasticBlockStore.yaml +repository/local-repo-with-awsebs created +``` + +>In order to use `awsElasticBlockStore` volume as backend, the pod where stash container is running must be running on an AWS EC2 instance and the instance must be in the same region and availability-zone as the EBS volume. + +##### Azure Disk as Backend + +Below, the YAML of a sample `Repository` crd that uses an [azureDisk](https://kubernetes.io/docs/concepts/storage/volumes/#azuredisk) as a backend. + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: local-repo-with-azuredisk + namespace: demo +spec: + backend: + local: + mountPath: /safe/data + azureDisk: + diskName: stash.vhd + diskURI: https://someaccount.blob.microsoft.net/vhds/stash.vhd + storageSecretName: local-secret +``` + +Create the `Repository` we have shown above using the following command, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/backends/local/examples/azureDisk.yaml +repository/local-repo-with-azuredisk created +``` + +##### StorageOS as Backend + +Below, the YAML of a sample `Repository` crd that uses a [storageOS](https://kubernetes.io/docs/concepts/storage/volumes/#storageos) volume as a backend. + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: local-repo-with-storageos + namespace: demo +spec: + backend: + local: + mountPath: /safe/data + storageos: + volumeName: stash-vol01 # The `stash-vol01` volume must already exist within StorageOS in the `demo` namespace. + fsType: ext4 + storageSecretName: local-secret +``` + +Create the `Repository` we have shown above using the following command, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/backends/local/examples/storageOS.yaml +repository/local-repo-with-storageos created +``` + +##### EmptyDir volume as Backend + +Below, the YAML of a sample `Repository` crd that uses an [emptyDir](https://kubernetes.io/docs/concepts/storage/volumes/#emptydir) as a backend. + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: local-repo-with-emptydir + namespace: demo +spec: + backend: + local: + mountPath: /safe/data + emptyDir: {} + storageSecretName: local-secret +``` + +Create the `Repository` we have shown above using the following command, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/backends/local/examples/emptyDir.yaml +repository/local-repo-with-emptydir created +``` + +>**Warning:** Data of an `emptyDir` volume is not persistent. If you delete the pod that runs the respective stash container, you will lose all the backed up data. You should use this kind of volumes only to test backup process. + +## Next Steps + +- Learn how to use Stash to backup workloads data from [here](/docs/v2024.12.18/guides/workloads/overview/). +- Learn how to use Stash to backup databases from [here](/docs/v2024.12.18/guides/addons/overview/). +- Learn how to use Stash to backup stand-alone PVC from [here](/docs/v2024.12.18/guides/volumes/overview/). diff --git a/content/docs/v2024.12.18/guides/backends/overview/images/backend_overview.svg b/content/docs/v2024.12.18/guides/backends/overview/images/backend_overview.svg new file mode 100644 index 0000000000..7106b39b3b --- /dev/null +++ b/content/docs/v2024.12.18/guides/backends/overview/images/backend_overview.svg @@ -0,0 +1,527 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/guides/backends/overview/images/s3_repository.png b/content/docs/v2024.12.18/guides/backends/overview/images/s3_repository.png new file mode 100644 index 0000000000..47cdab9c97 Binary files /dev/null and b/content/docs/v2024.12.18/guides/backends/overview/images/s3_repository.png differ diff --git a/content/docs/v2024.12.18/guides/backends/overview/index.md b/content/docs/v2024.12.18/guides/backends/overview/index.md new file mode 100644 index 0000000000..ecb2f3ebc0 --- /dev/null +++ b/content/docs/v2024.12.18/guides/backends/overview/index.md @@ -0,0 +1,117 @@ +--- +title: Backend Overview | Stash +description: An overview of the backends used by Stash to store backed up data. +menu: + docs_v2024.12.18: + identifier: backend-overview + name: What is Backend? + parent: backend + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +> New to Stash? Please start [here](/docs/v2024.12.18/concepts/README). + +# Stash Backends + +Stash supports various backends for storing data snapshots. It can be a cloud storage like GCS bucket, AWS S3, Azure Blob Storage etc. or a Kubernetes persistent volume like [HostPath](https://kubernetes.io/docs/concepts/storage/volumes/#hostpath), [PersistentVolumeClaim](https://kubernetes.io/docs/concepts/storage/volumes/#persistentvolumeclaim), [NFS](https://kubernetes.io/docs/concepts/storage/volumes/#nfs) etc. + +The following diagram shows how Stash sidecar container accesses and backs up data into a backend. + +
+  Stash Backend Overview +
Fig: Stash Backend Overview
+
+ +You have to create a [Repository](/docs/v2024.12.18/concepts/crds/repository/) object which contains backend information and a `Secret` which contains necessary credentials to access the backend. + +Stash sidecar/backup job reads backend information from the `Repository` and retrieves access credentials from the `Secret`. Then on the first backup session, Stash will initialize a repository in the backend. + +Below, a screenshot that shows a repository created in AWS S3 bucket named `stash-qa`: + +
+  Repository in AWS S3 Backend +
Fig: Repository in AWS S3 Backend
+
+ +You will see all snapshots taken by Stash at `/snapshot` directory of this repository. + +> Note: Stash stores data encrypted at rest. So, snapshot files in the bucket will not contain any meaningful data until they are decrypted. + +## Next Steps + +- Learn how to configure `Kubernetes Volume` as backend from [here](/docs/v2024.12.18/guides/backends/local/). +- Learn how to configure `AWS S3/Minio/Rook` backend from [here](/docs/v2024.12.18/guides/backends/s3/). +- Learn how to configure `Google Cloud Storage (GCS)` backend from [here](/docs/v2024.12.18/guides/backends/gcs/). +- Learn how to configure `Microsoft Azure Storage` backend from [here](/docs/v2024.12.18/guides/backends/azure/). +- Learn how to configure `OpenStack Swift` backend from [here](/docs/v2024.12.18/guides/backends/swift/). +- Learn how to configure `Backblaze B2` backend from [here](/docs/v2024.12.18/guides/backends/b2/). +- Learn how to configure `REST` backend from [here](/docs/v2024.12.18/guides/backends/rest/). diff --git a/content/docs/v2024.12.18/guides/backends/rest/examples/rest.yaml b/content/docs/v2024.12.18/guides/backends/rest/examples/rest.yaml new file mode 100644 index 0000000000..de74aae945 --- /dev/null +++ b/content/docs/v2024.12.18/guides/backends/rest/examples/rest.yaml @@ -0,0 +1,10 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: rest-repo + namespace: demo +spec: + backend: + rest: + url: http://rest-server.demo.svc:8000/stash-backup-demo + storageSecretName: rest-secret diff --git a/content/docs/v2024.12.18/guides/backends/rest/index.md b/content/docs/v2024.12.18/guides/backends/rest/index.md new file mode 100644 index 0000000000..ade2d0d1e7 --- /dev/null +++ b/content/docs/v2024.12.18/guides/backends/rest/index.md @@ -0,0 +1,149 @@ +--- +title: REST Backend | Stash +description: Configure Stash to REST Server as Backend. +menu: + docs_v2024.12.18: + identifier: backend-rest + name: REST Server + parent: backend + weight: 80 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# REST Backend + +Stash supports restic's [REST Server](https://github.com/restic/rest-server) as a backend. This tutorial will show you how to use this backend. + +In order to use REST Server as backend, you have to create a `Secret` and a `Repository` object pointing to the desired REST Server address. + +#### Create Storage Secret + +To configure storage secret for this backend, following secret keys are needed: + +| Key | Type | Description | +| ---------------------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `RESTIC_PASSWORD` | `Required` | Password that will be used to encrypt the backup snapshots. | +| `REST_SERVER_USERNAME` | `Optional` | Username for basic authentication in the REST server. | +| `REST_SERVER_PASSWORD` | `Optional` | Password for basic authentication in the REST Server | +| `CA_CERT_DATA` | `optional` | CA certificate used by storage backend. This can be used to pass the root certificate that has been used to sign the server certificate of a TLS secured REST Server. | + +Create storage secret as below, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > REST_SERVER_USERNAME +$ echo -n '' > REST_SERVER_PASSWORD +$ kubectl create secret generic -n demo rest-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./REST_SERVER_USERNAME \ + --from-file=./REST_SERVER_PASSWORD +secret/rest-secret created +``` + +### Create Repository + +Now, you have to create a `Repository` crd. You have to provide the storage secret that we have created earlier in `spec.backend.storageSecretName` field. + +Following parameters are available for `rest` backend, + +| Parameter | Type | Description | +| ---------- | ---------- | ------------------------------------------------------------------------------------------------------------- | +| `rest.url` | `Required` | URL of the REST Server along with an optional path inside the server where backed up snapshot will be stored. | + +Below, the YAML of a sample `Repository` crd that uses a REST Server as a backend. + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: rest-repo + namespace: demo +spec: + backend: + rest: + url: http://rest-server.demo.svc:8000/stash-backup-demo + storageSecretName: rest-secret +``` + +Create the `Repository` we have shown above using the following command, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/backends/rest/examples/rest.yaml +repository/rest-repo created +``` + +Now, we are ready to use this backend to backup our desired data using Stash. + +## Next Steps + +- Learn how to use Stash to backup workloads data from [here](/docs/v2024.12.18/guides/workloads/overview/). +- Learn how to use Stash to backup databases from [here](/docs/v2024.12.18/guides/addons/overview/). +- Learn how to use Stash to backup stand-alone PVC from [here](/docs/v2024.12.18/guides/volumes/overview/). diff --git a/content/docs/v2024.12.18/guides/backends/s3/examples/minio.yaml b/content/docs/v2024.12.18/guides/backends/s3/examples/minio.yaml new file mode 100644 index 0000000000..b8ccb26706 --- /dev/null +++ b/content/docs/v2024.12.18/guides/backends/s3/examples/minio.yaml @@ -0,0 +1,12 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: minio-repo + namespace: demo +spec: + backend: + s3: + endpoint: https://my-minio-service.minio-namespace.svc + bucket: stash-demo + prefix: /backup/demo/deployment/stash-demo + storageSecretName: minio-secret diff --git a/content/docs/v2024.12.18/guides/backends/s3/examples/s3.yaml b/content/docs/v2024.12.18/guides/backends/s3/examples/s3.yaml new file mode 100644 index 0000000000..ec4559c4d5 --- /dev/null +++ b/content/docs/v2024.12.18/guides/backends/s3/examples/s3.yaml @@ -0,0 +1,13 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: s3-repo + namespace: demo +spec: + backend: + s3: + endpoint: s3.amazonaws.com # use server URL for s3 compatible other storage service + bucket: stash-demo + region: us-west-1 + prefix: /backup/demo/deployment/stash-demo + storageSecretName: s3-secret diff --git a/content/docs/v2024.12.18/guides/backends/s3/index.md b/content/docs/v2024.12.18/guides/backends/s3/index.md new file mode 100644 index 0000000000..794d89b2cf --- /dev/null +++ b/content/docs/v2024.12.18/guides/backends/s3/index.md @@ -0,0 +1,192 @@ +--- +title: AWS S3/Minio/Rook Backend | Stash +description: Configure Stash to use AWS S3/Minio/Rook as Backend. +menu: + docs_v2024.12.18: + identifier: backend-s3 + name: AWS S3/Minio/Rook + parent: backend + weight: 30 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# AWS S3 + +Stash supports AWS S3 or S3 compatible storage services like [Minio](https://minio.io/) servers, [Rook Object Store](https://rook.io/docs/rook/v0.9/ceph-object.html), [DigitalOceans Space](https://www.digitalocean.com/products/spaces/) as a backend. This tutorial will show you how to use this backend. + +In order to use S3 or S3 compatible storage service as backend, you have to create a `Secret` and a `Repository` object pointing to the desired bucket. + +>If the bucket does not exist yet, Stash will create it automatically in the default region (`us-east-1`) during the first backup. In this case, you have to make sure that the bucket name is unique across all S3 buckets. Currently, it is not possible for Stash to create bucket in different region. You have to create the bucket in your desired region before using it in Stash. + +#### Create Storage Secret + +To configure storage secret for this backend, following secret keys are needed: + +| Key | Type | Description | +| ----------------------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `RESTIC_PASSWORD` | `Required` | Password that will be used to encrypt the backup snapshots. | +| `AWS_ACCESS_KEY_ID` | `Required` | AWS / Minio / Rook / DigitalOcean Spaces access key ID | +| `AWS_SECRET_ACCESS_KEY` | `Required` | AWS / Minio / Rook / DigitalOcean Spaces secret access key | +| `CA_CERT_DATA` | `optional` | CA certificate used by storage backend. This can be used to pass the root certificate that has been used to sign the server certificate of a TLS secured Minio server. | + +Create storage secret as below, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > AWS_ACCESS_KEY_ID +$ echo -n '' > AWS_SECRET_ACCESS_KEY +$ kubectl create secret generic -n demo s3-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./AWS_ACCESS_KEY_ID \ + --from-file=./AWS_SECRET_ACCESS_KEY +secret/s3-secret created +``` + +For TLS secured Minio Server, create secret as below, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > AWS_ACCESS_KEY_ID +$ echo -n '' > AWS_SECRET_ACCESS_KEY +$ cat ./directory/of/root/certificate/ca.crt > CA_CERT_DATA +$ kubectl create secret generic -n demo minio-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./AWS_ACCESS_KEY_ID \ + --from-file=./AWS_SECRET_ACCESS_KEY \ + --from-file=./CA_CERT_DATA +secret/minio-secret created +``` + +{{< notice type="warning" message="If you are using a Minio backend, make sure that you are using `AWS_ACCESS_KEY_ID` instead of `MINIO_ACCESS_KEY` and `AWS_SECRET_ACCESS_KEY` instead of `MINIO_SECRET_KEY`." >}} + +### Create Repository + +Now, you have to create a `Repository` crd. You have to provide the storage secret that we have created earlier in `spec.backend.storageSecretName` field. + +Following parameters are available for `S3` backend. + +| Parameter | Type | Description | +|------------------| ---------- |------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `s3.endpoint` | `Required` | For S3, use `s3.amazonaws.com`. If your bucket is in a different location, S3 server (s3.amazonaws.com) will redirect Stash to the correct endpoint. For DigitalOCean, use `nyc3.digitaloceanspaces.com` etc. depending on your bucket region. For S3-compatible other storage services like Minio / Rook use URL of the server. | +| `s3.bucket` | `Required` | Name of Bucket. If the bucket does not exist yet it will be created in the default location (`us-east-1` for S3). It is not possible at the moment for Stash to create a new bucket in a different location, so you need to create it using a different program. | +| `s3.region` | `Optional` | Specify the region of your bucket. | +| `s3.prefix` | `Optional` | Path prefix inside the bucket where the backed up data will be stored. | +| `s3.insecureTLS` | `Optional` | Specify whether to skip TLS certificate verification. Setting this field to `true` disables verification, which might be necessary in cases where the server uses self-signed certificates or certificates from an untrusted CA. Use this option with caution, as it can expose the client to man-in-the-middle attacks and other security risks. Only use it when absolutely necessary. | + +Below, the YAML of a sample `Repository` crd that uses an `S3` bucket as a backend. + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: s3-repo + namespace: demo +spec: + backend: + s3: + endpoint: s3.amazonaws.com # use server URL for s3 compatible other storage service + bucket: stash-demo + region: us-west-1 + prefix: /backup/demo/deployment/stash-demo + storageSecretName: s3-secret +``` + +For S3 compatible Minio and other storage services, specify the endpoint with connection scheme (`http`, or `https`), + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: minio-repo + namespace: demo +spec: + backend: + s3: + endpoint: https://my-minio-service.minio-namespace.svc + bucket: stash-demo + prefix: /backup/demo/deployment/stash-demo + storageSecretName: s3-secret +``` + +Create the `s3-repo` Repository we have shown above using the following command, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/backends/s3/examples/s3.yaml +repository/s3-repo created +``` + +Now, we are ready to use this backend to backup our desired data using Stash. + +## Next Steps + +- Learn how to use Stash to backup workloads data from [here](/docs/v2024.12.18/guides/workloads/overview/). +- Learn how to use Stash to backup databases from [here](/docs/v2024.12.18/guides/addons/overview/). +- Learn how to use Stash to backup stand-alone PVC from [here](/docs/v2024.12.18/guides/volumes/overview/). diff --git a/content/docs/v2024.12.18/guides/backends/swift/examples/swift.yaml b/content/docs/v2024.12.18/guides/backends/swift/examples/swift.yaml new file mode 100644 index 0000000000..9a817f31dd --- /dev/null +++ b/content/docs/v2024.12.18/guides/backends/swift/examples/swift.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: swift-repo + namespace: demo +spec: + backend: + swift: + container: stash-backup + prefix: /demo/deployment/my-deploy + storageSecretName: swift-secret diff --git a/content/docs/v2024.12.18/guides/backends/swift/index.md b/content/docs/v2024.12.18/guides/backends/swift/index.md new file mode 100644 index 0000000000..a9b8b45272 --- /dev/null +++ b/content/docs/v2024.12.18/guides/backends/swift/index.md @@ -0,0 +1,224 @@ +--- +title: Swift Backend | Stash +description: Configure Stash to use OpenStack Swift as Backend. +menu: + docs_v2024.12.18: + identifier: backend-swift + name: OpenStack Swift + parent: backend + weight: 60 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# OpenStack Swift + +Stash supports [OpenStack Swift](https://docs.openstack.org/swift/latest/) as a backend. This tutorial will show you how to use this backend. + +In order to use OpenStack Swift as backend, you have to create a `Secret` and a `Repository` object pointing to the desired Swift container. + +>If the Swift container does not exist yet, Stash will automatically create it during the first backup. + +#### Create Storage Secret + +Stash supports Swift's Keystone v1, v2, v3 authentication as well as token-based authentication. + +**Keystone v1 authentication:** + +For keystone v1 authentication, following secret keys are needed: + +| Key | Description | +|--------------------------|------------------------------------------------------------| +| `RESTIC_PASSWORD` | Password used that will be used to encrypt the backup snapshots.| +| `ST_AUTH` | URL of the Keystone server. | +| `ST_USER` | Username. | +| `ST_KEY` | Password. | + +**Keystone v2 authentication:** + +For keystone v2 authentication, following secret keys are needed: + +| Key | Description | +|--------------------------|------------------------------------------------------------| +| `RESTIC_PASSWORD` | Password used that will be used to encrypt the backup snapshots.| +| `OS_AUTH_URL` | URL of the Keystone server. | +| `OS_REGION_NAME` | Storage region name | +| `OS_USERNAME` | Username | +| `OS_PASSWORD` | Password | +| `OS_TENANT_ID` | Tenant ID | +| `OS_TENANT_NAME` | Tenant Name | + +**Keystone v3 authentication:** + +For keystone v3 authentication, following secret keys are needed: + +| Key | Description | +|--------------------------|------------------------------------------------------------| +| `RESTIC_PASSWORD` | Password used that will be used to encrypt the backup snapshots.| +| `OS_AUTH_URL` | URL of the Keystone server. | +| `OS_REGION_NAME` | Storage region name | +| `OS_USERNAME` | Username | +| `OS_PASSWORD` | Password | +| `OS_USER_DOMAIN_NAME` | User domain name | +| `OS_PROJECT_NAME` | Project name | +| `OS_PROJECT_DOMAIN_NAME` | Project domain name | + +For keystone v3 application credential authentication (application credential id): + +| Key | Description | +|--------------------------|------------------------------------------------------------| +| `RESTIC_PASSWORD` | Password used that will be used to encrypt the backup snapshots.| +| `OS_AUTH_URL` | URL of the Keystone server. | +| `OS_APPLICATION_CREDENTIAL_ID` | The ID of the application credential used for authentication. If not provided, the application credential must be identified by its name and its owning user.| +| `OS_APPLICATION_CREDENTIAL_SECRET` | The secret for authenticating the application credential. | + +For keystone v3 application credential authentication (application credential name): + +| Key | Description | +|--------------------------|------------------------------------------------------------| +| `RESTIC_PASSWORD` | Password used that will be used to encrypt the backup snapshots.| +| `OS_AUTH_URL` | URL of the Keystone server. | +| `OS_USERNAME` | User name| +| `OS_USER_DOMAIN_NAME` | User domain name| +| `OS_APPLICATION_CREDENTIAL_NAME` | The name of the application credential used for authentication. If provided, must be accompanied by a user object. | +| `OS_APPLICATION_CREDENTIAL_SECRET` | The secret for authenticating the application credential. | + +**Token-based authentication:** + +For token-based authentication, following secret keys are needed: + +| Key | Description | +|--------------------------|------------------------------------------------------------| +| `RESTIC_PASSWORD` | Password used that will be used to encrypt the backup snapshots.| +| `OS_STORAGE_URL` | Storage URL | +| `OS_AUTH_TOKEN` | Authentication token | + +A sample storage secret creation for keystone v2 authentication is shown below, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > OS_AUTH_URL +$ echo -n '' > OS_TENANT_ID +$ echo -n '' > OS_TENANT_NAME +$ echo -n '' > OS_USERNAME +$ echo -n '' > OS_PASSWORD +$ echo -n '' > OS_REGION_NAME +$ kubectl create secret generic swift-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./OS_AUTH_URL \ + --from-file=./OS_TENANT_ID \ + --from-file=./OS_TENANT_NAME \ + --from-file=./OS_USERNAME \ + --from-file=./OS_PASSWORD \ + --from-file=./OS_REGION_NAME +secret/swift-secret created +``` + +### Create Repository + +Now, you have to create a `Repository` crd. You have to provide the storage secret that we have created earlier in `spec.backend.storageSecretName` field. + +Following parameters are available for `Swift` backend. + +| Parameter | Description | +| ----------------- | ------------------------------------------------------------------------------ | +| `swift.container` | `Required`. Name of Storage container | +| `swift.prefix` | `Optional`. Path prefix inside the container where backed up data will be stored. | + +Below, the YAML of a sample `Repository` crd that uses a Swift container as a backend. + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: swift-repo + namespace: demo +spec: + backend: + swift: + container: stash-backup + prefix: /demo/deployment/my-deploy + storageSecretName: swift-secret +``` + +Create the `Repository` we have shown above using the following command, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/backends/swift/examples/swift.yaml +repository/swift-repo created +``` + +Now, we are ready to use this backend to backup our desired data using Stash. + +## Next Steps + +- Learn how to use Stash to backup workloads data from [here](/docs/v2024.12.18/guides/workloads/overview/). +- Learn how to use Stash to backup databases from [here](/docs/v2024.12.18/guides/addons/overview/). +- Learn how to use Stash to backup stand-alone PVC from [here](/docs/v2024.12.18/guides/volumes/overview/). diff --git a/content/docs/v2024.12.18/guides/batch-backup/_index.md b/content/docs/v2024.12.18/guides/batch-backup/_index.md new file mode 100644 index 0000000000..c329e77f6d --- /dev/null +++ b/content/docs/v2024.12.18/guides/batch-backup/_index.md @@ -0,0 +1,77 @@ +--- +title: Batch Backup | Stash +menu: + docs_v2024.12.18: + identifier: batch-backup + name: Batch Backup + parent: guides + weight: 40 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/guides/batch-backup/overview/images/batch-restore.svg b/content/docs/v2024.12.18/guides/batch-backup/overview/images/batch-restore.svg new file mode 100644 index 0000000000..141438c7d6 --- /dev/null +++ b/content/docs/v2024.12.18/guides/batch-backup/overview/images/batch-restore.svg @@ -0,0 +1,1128 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/guides/batch-backup/overview/images/batchbackup_overview.svg b/content/docs/v2024.12.18/guides/batch-backup/overview/images/batchbackup_overview.svg new file mode 100644 index 0000000000..a7d32e4a4d --- /dev/null +++ b/content/docs/v2024.12.18/guides/batch-backup/overview/images/batchbackup_overview.svg @@ -0,0 +1,1326 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/guides/batch-backup/overview/index.md b/content/docs/v2024.12.18/guides/batch-backup/overview/index.md new file mode 100644 index 0000000000..6024e01886 --- /dev/null +++ b/content/docs/v2024.12.18/guides/batch-backup/overview/index.md @@ -0,0 +1,138 @@ +--- +title: Batch Backup & Restore Overview | Stash +description: An overview on how batch backup & restore works in Stash. +menu: + docs_v2024.12.18: + identifier: batch-backup-overview + name: How Batch Backup & Restore works? + parent: batch-backup + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Batch Backup and Restore Overview + +Sometimes, an application may consist of multiple co-related components. For example, to deploy a WordPress, you will need a Deployment for the WordPress and another Deployment for the database. Now, it is sensible to want to backup or restore both of the deployments using a single configuration as they are parts of the same application. + +Stash 0.9.0+ supports taking backup multiple co-related components using a single configuration known as [BackupBatch](/docs/v2024.12.18/concepts/crds/backupbatch/). Stash 0.10.0+ supports restoring multiple co-related components together known as [RestoreBatch](/docs/v2024.12.18/concepts/crds/restorebatch/) This guide will give you an overview of how batch backup and restore works in Stash. + +## How Batch Backup Works + +The following diagram shows how Stash takes backup of multiple co-related components in a single application. Open the image in a new tab to see the enlarged version. + +
+ Stash Batch Backup Flow +
Fig: Batch backup flow in Stash
+
+ +The backup process consists of the following steps: + +1. At first, a user creates a backend Secret. This secret holds the credentials to access the backend where the backed up data will be stored. + +2. Then, she creates a `Repository` crd which represents the original repository in the backend. + +3. Then, she creates a `BackupBatch` crd which specifies multiple targets(workload, volume, and database). It also specifies the `Repository` object that holds the backend information where the backed up data will be stored. + +4. Stash operator watches for `BackupBatch` objects. + +5. When it finds a `BackupBatch` object, it checks if there is any workload as a target. If there any, it injects a sidecar named `stash` into the workloads. + +6. It also creates a `CronJob` to trigger backups periodically. + +7. The`CronJob` triggers backup on each scheduled slot by creating a `BackupSession` crd. + +8. The BackupSession controller (inside sidecar for sidecar model or inside the operator itself for job model) watches for `BackupSession` crd. + +9. When it finds a `BackupSession` it starts the backup process immediately(for job model a job is created for taking backup) for the individual targets. Stash operator enforces the backup order if the `executionOrder` is set to `Sequential`. + +10. The individual targets complete their backup process independently and update their respective fields in `BackupSession` status. + +## How Batch Restore Works + +The following diagram shows the batch restore process. Please, open image in new tab to view the enlarged image. + +
+ Stash Batch Restore Flow +
Fig: Batch restore flow in Stash
+
+ +The batch restore process consists of the following steps: + +1. At first, the user creates a `RestoreBatch` CR specifying the targets and the respective Repository where the backed up data has been stored. +2. The Stash operator watches for the `RestoreBatch` CR. +3. When the Stash operator finds a `RestoreBatch` CR, it executes the global `PreRestore` hooks. If there is no global `PreRestore` hook, Stash will skip this step. +4. Then, it injects an init-container into the target that follows the sidecar model and creates a restore job for the targets that follow the job model. Stash operator enforces the restore order in this step if the `executionOrder` is set to `Sequential`. +5. The restore init-container/job first execute their local `PreRestore` hooks. Then, restore their data and finally execute their `PostRestore` hooks. +6. Finally, Stash operator executes the global `PostRestore` hooks. If there is not global `PostRestore` hook configured for this RestoreBatch, Stash will skip this step. + +## Next Steps + +- See a step by step guide to backup application with multiple co-related components [here](/docs/v2024.12.18/guides/batch-backup/wordpress-backup/). diff --git a/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/examples/appbinding.yaml b/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/examples/appbinding.yaml new file mode 100644 index 0000000000..69866f47d1 --- /dev/null +++ b/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/examples/appbinding.yaml @@ -0,0 +1,15 @@ +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: wordpress-db + namespace: demo +spec: + type: mysql + version: 8.0.27 + clientConfig: + service: + name: wordpress-db + port: 3306 + scheme: mysql + secret: + name: mysql-pass diff --git a/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/examples/backupbatch.yaml b/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/examples/backupbatch.yaml new file mode 100644 index 0000000000..5d71744219 --- /dev/null +++ b/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/examples/backupbatch.yaml @@ -0,0 +1,34 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupBatch +metadata: + name: wordpress-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/5 * * * *" + executionOrder: Parallel + members: + - target: + alias: db + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: wordpress-db + task: + name: mysql-backup-8.0.14 + - target: + alias: app + ref: + apiVersion: apps/v1 + kind: Deployment + name: wordpress-app + volumeMounts: + - name: storage + mountPath: /var/www/html + paths: + - /var/www/html + retentionPolicy: + name: 'keep-last-10' + keepLast: 10 + prune: true diff --git a/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/examples/mysql.yaml b/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/examples/mysql.yaml new file mode 100644 index 0000000000..9b748a47e6 --- /dev/null +++ b/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/examples/mysql.yaml @@ -0,0 +1,75 @@ +apiVersion: v1 +kind: Service +metadata: + name: wordpress-db + namespace: demo + labels: + app: wordpress-db +spec: + ports: + - port: 3306 + selector: + app: wordpress-db +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: wordpress-db + namespace: demo + labels: + app: wordpress-db +spec: + selector: + matchLabels: + app: wordpress-db + strategy: + type: Recreate + template: + metadata: + labels: + app: wordpress-db + spec: + containers: + - image: mysql:8.0.14 + name: mysql + args: + - --default-authentication-plugin=mysql_native_password + env: + - name: MYSQL_ROOT_PASSWORD + valueFrom: + secretKeyRef: + name: mysql-pass + key: password + - name: MYSQL_USER + valueFrom: + secretKeyRef: + name: mysql-pass + key: username + ports: + - containerPort: 3306 + name: mysql + volumeMounts: + - name: storage + mountPath: /var/lib/mysql + - name: config-volume + mountPath: /etc/mysql/conf.d + volumes: + - name: storage + persistentVolumeClaim: + claimName: mysql-pvc + - name: config-volume + emptyDir: {} +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: mysql-pvc + namespace: demo + labels: + app: wordpress-db +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi diff --git a/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/examples/repository.yaml b/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/examples/repository.yaml new file mode 100644 index 0000000000..8708c70ccd --- /dev/null +++ b/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stashed-ci + prefix: /wordpress/backup + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/examples/restorebatch.yaml b/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/examples/restorebatch.yaml new file mode 100644 index 0000000000..b2771a51c2 --- /dev/null +++ b/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/examples/restorebatch.yaml @@ -0,0 +1,33 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreBatch +metadata: + name: wordpress-restore + namespace: demo +spec: + driver: Restic + repository: + name: gcs-repo + executionOrder: Sequential + members: + - target: + alias: db + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: wordpress-db + rules: + - snapshots: [latest] + task: + name: mysql-restore-8.0.14 + - target: + alias: app + ref: + apiVersion: apps/v1 + kind: Deployment + name: wordpress-app + rules: + - paths: + - /var/www/html + volumeMounts: + - name: storage + mountPath: /var/www/html diff --git a/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/examples/restoresession.yaml b/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/examples/restoresession.yaml new file mode 100644 index 0000000000..f39036ebf7 --- /dev/null +++ b/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/examples/restoresession.yaml @@ -0,0 +1,18 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: wordpress-db-restore + namespace: demo +spec: + task: + name: mysql-restore-8.0.14 + repository: + name: gcs-repo + target: + alias: db + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: wordpress-db + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/examples/wordpress.yaml b/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/examples/wordpress.yaml new file mode 100644 index 0000000000..b5dfc55389 --- /dev/null +++ b/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/examples/wordpress.yaml @@ -0,0 +1,71 @@ +apiVersion: v1 +kind: Service +metadata: + name: wordpress-app + namespace: demo + labels: + app: wordpress-app +spec: + ports: + - port: 80 + selector: + app: wordpress-app +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: wordpress-app + namespace: demo + labels: + app: wordpress-app +spec: + selector: + matchLabels: + app: wordpress-app + strategy: + type: Recreate + template: + metadata: + labels: + app: wordpress-app + spec: + containers: + - image: wordpress:5.3.2-apache + name: wordpress + env: + - name: WORDPRESS_DB_HOST + value: wordpress-db + - name: WORDPRESS_DB_PASSWORD + valueFrom: + secretKeyRef: + name: mysql-pass + key: password + - name: WORDPRESS_DB_USER + valueFrom: + secretKeyRef: + name: mysql-pass + key: username + ports: + - containerPort: 80 + name: wordpress + volumeMounts: + - name: storage + mountPath: /var/www/html + volumes: + - name: storage + persistentVolumeClaim: + claimName: wordpress-pvc +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: wordpress-pvc + namespace: demo + labels: + app: wordpress-app +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi diff --git a/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/images/backup-data.png b/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/images/backup-data.png new file mode 100644 index 0000000000..8876082a19 Binary files /dev/null and b/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/images/backup-data.png differ diff --git a/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/images/sample-post.png b/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/images/sample-post.png new file mode 100644 index 0000000000..8f4e560039 Binary files /dev/null and b/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/images/sample-post.png differ diff --git a/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/images/wordpress-setup.png b/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/images/wordpress-setup.png new file mode 100644 index 0000000000..ba5fec4d45 Binary files /dev/null and b/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/images/wordpress-setup.png differ diff --git a/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/images/wp_missing.png b/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/images/wp_missing.png new file mode 100644 index 0000000000..a1dc99489b Binary files /dev/null and b/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/images/wp_missing.png differ diff --git a/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/images/wp_restored.png b/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/images/wp_restored.png new file mode 100644 index 0000000000..9aa8daced0 Binary files /dev/null and b/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/images/wp_restored.png differ diff --git a/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/index.md b/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/index.md new file mode 100644 index 0000000000..e9d908d1a8 --- /dev/null +++ b/content/docs/v2024.12.18/guides/batch-backup/wordpress-backup/index.md @@ -0,0 +1,1020 @@ +--- +title: Batch Backup | Stash +description: A step by step guide showing how to backup and restore an application with multiple co-related components. +menu: + docs_v2024.12.18: + identifier: batch-backup-guide + name: Backup a WordPress Site + parent: batch-backup + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup & Restore a WordPress Site Using Batch Backup + +This tutorial will demonstrate how to use Stash to take backup of an application with multiple co-related components. Here, we are going to take backup of a [WordPress Site](https://kubernetes.io/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/). + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). +- Install `Stash` in your cluster following the steps [here](/docs/v2024.12.18/setup/README). +- Install MySQL addon for Stash following the steps [here](https://stash.run/docs/v0.9.0-rc.2/addons/mysql/guides/8.0.14/mysql/). +- If you are not familiar with how Stash backup and restore MySQL databases, please check the following guide [here](https://stash.run/docs/v0.9.0-rc.2/addons/mysql/overview/). + +- You should be familiar with the following `Stash` concepts: + - [Appbinding](/docs/v2024.12.18/concepts/crds/appbinding/) + - [Function](/docs/v2024.12.18/concepts/crds/function/) + - [Task](/docs/v2024.12.18/concepts/crds/task/) + - [BackupBatch](/docs/v2024.12.18/concepts/crds/backupbatch/) + - [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) + - [Repository](/docs/v2024.12.18/concepts/crds/repository/) + - [RestoreBatch](/docs/v2024.12.18/concepts/crds/restorebatch/) + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> **Note:** YAML files used in this tutorial are stored in [docs/guides/batch-backup/wordpress-backup/examples](/docs/v2024.12.18/guides/batch-backup/wordpress-backup/examples) directory of [stashed/docs](https://github.com/stashed/docs) repository. + +## Deploy WordPress Site + +At first, we are going to deploy a WordPress site with a MySQL database and generate some sample data in it. Then, we are going to backup this site's data and database into a GCS bucket. Finally, we are going to show how we can restore the site form the backed up data. + +### Deploy Database + +We are going to use MySQL as the database for our WordPress site. So, let's deploy the database first. + +Let's create a secret for the MySQL database, + +```bash +$ kubectl create secret -n demo generic mysql-pass \ + --from-literal=username=root \ + --from-literal=password=mysqlpass +secret/mysql-pass created +``` + +Now, let's create a MySQL deployment with this secret. Below are the YAML of the MySQL Deployment along with its Service and PVC, + +```yaml +apiVersion: v1 +kind: Service +metadata: + name: wordpress-db + namespace: demo + labels: + app: wordpress-db +spec: + ports: + - port: 3306 + selector: + app: wordpress-db +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: wordpress-db + namespace: demo + labels: + app: wordpress-db +spec: + selector: + matchLabels: + app: wordpress-db + strategy: + type: Recreate + template: + metadata: + labels: + app: wordpress-db + spec: + containers: + - image: mysql:8.0.14 + name: mysql + args: + - --default-authentication-plugin=mysql_native_password + env: + - name: MYSQL_ROOT_PASSWORD + valueFrom: + secretKeyRef: + name: mysql-pass + key: password + - name: MYSQL_USER + valueFrom: + secretKeyRef: + name: mysql-pass + key: username + ports: + - containerPort: 3306 + name: mysql + volumeMounts: + - name: storage + mountPath: /var/lib/mysql + - name: config-volume + mountPath: /etc/mysql/conf.d + volumes: + - name: storage + persistentVolumeClaim: + claimName: mysql-pvc + - name: config-volume + emptyDir: {} +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: mysql-pvc + namespace: demo + labels: + app: wordpress-db +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi +``` + +Let's create the above MySQL Deployment, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/batch-backup/wordpress-backup/examples/mysql.yaml +service/wordpress-db created +deployment.apps/wordpress-db created +persistentvolumeclaim/mysql-pvc created +``` + +Now, wait for the MySQL pod to go into running state, + +```bash +$ kubectl get pod -n demo -l app=wordpress-db +NAME READY STATUS RESTARTS AGE +wordpress-db-58657b89b9-kgt76 1/1 Running 0 104s +``` + +Let's check if the MySQL database is ready to accept connections, + +```bash +$ kubectl logs -n demo -f wordpress-db-58657b89b9-kgt76 +Initializing database +.... +.... +2020-01-07T12:33:23.242350Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.14' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL. +2020-01-07T12:33:23.325316Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060 +``` + +From the last line, we can see the database is ready to accept connections. + +### Deploy WordPress + +Now, we are going to deploy our WordPress app in another Deployment. This going to use the MySQL database through the `wordpress-db` Service that we have created earlier. + +Below is the YAML of the WordPress Deployment along with its PVC and Service: + +```yaml +apiVersion: v1 +kind: Service +metadata: + name: wordpress-app + namespace: demo + labels: + app: wordpress-app +spec: + ports: + - port: 80 + selector: + app: wordpress-app +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: wordpress-app + namespace: demo + labels: + app: wordpress-app +spec: + selector: + matchLabels: + app: wordpress-app + strategy: + type: Recreate + template: + metadata: + labels: + app: wordpress-app + spec: + containers: + - image: wordpress:5.3.2-apache + name: wordpress + env: + - name: WORDPRESS_DB_HOST + value: wordpress-db + - name: WORDPRESS_DB_PASSWORD + valueFrom: + secretKeyRef: + name: mysql-pass + key: password + - name: WORDPRESS_DB_USER + valueFrom: + secretKeyRef: + name: mysql-pass + key: username + ports: + - containerPort: 80 + name: wordpress + volumeMounts: + - name: storage + mountPath: /var/www/html + volumes: + - name: storage + persistentVolumeClaim: + claimName: wordpress-pvc +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: wordpress-pvc + namespace: demo + labels: + app: wordpress-app +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi +``` + +Let's create the above Deployment, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/batch-backup/wordpress-backup/examples/wordpress.yaml +service/wordpress-app created +deployment.apps/wordpress-app created +persistentvolumeclaim/wordpress-pvc created +``` + +Now, wait for the wordpress pod to go into running state, + +```bash +$ kubectl get pod -n demo -l app=wordpress-app +NAME READY STATUS RESTARTS AGE +wordpress-app-59b69858f9-48phf 1/1 Running 0 3m40s +``` + +So, we can see that our WordPress site is running. Now, its time to insert some sample data. + +#### Insert Sample Data + +At first, lets port-forward the `wordpress-app` Service that we have created with the WordPress deployment. + +```bash +$ kubectl port-forward -n demo service/wordpress-app 8080:80 +Forwarding from 127.0.0.1:8080 -> 80 +Forwarding from [::1]:8080 -> 80 +``` + +Now, we can access our site through a browser at `localhost:8080`. Let's complete the initial setup. + +
+ WordPress Setup Wizard +
Fig: WordPress Setup Wizard
+
+ +Once we have completed the setup, let's create some sample blog posts. Here, I have created a sample post titled **Stash Batch Backup Test**. + +
+ Sample Post +
Fig: A sample blog post
+
+ +When we save the post, WordPress will store it into the database. If we exec into the database pod, we will see the post has been stored there. + +```bash +$ kubectl exec -it -n demo wordpress-db-58657b89b9-kgt76 -- mysql --user=root --password=mysqlpass +... +mysql> show databases; ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| mysql | +| performance_schema | +| sys | +| wordpress | ++--------------------+ +5 rows in set (0.01 sec) + +mysql> show tables in wordpress; ++-----------------------+ +| Tables_in_wordpress | ++-----------------------+ +| wp_commentmeta | +| wp_comments | +| wp_links | +| wp_options | +| wp_postmeta | +| wp_posts | +| wp_term_relationships | +| wp_term_taxonomy | +| wp_termmeta | +| wp_terms | +| wp_usermeta | +| wp_users | ++-----------------------+ +12 rows in set (0.00 sec) + +mysql> use wordpress; +Reading table information for completion of table and column names +You can turn off this feature to get a quicker startup with -A + +Database changed + +mysql> select post_name from wp_posts; ++-------------------------+ +| post_name | ++-------------------------+ +| hello-world | +| sample-page | +| privacy-policy | +| | +| stash-batch-backup-test | +| 5-revision-v1 | ++-------------------------+ +6 rows in set (0.00 sec) + +mysql> exit +Bye +``` + +So, we can see that our post has been stored with `stash-batch-backup-test` name. + +Also, WordPress pod write some files in its `/var/www/html` directory. Let's see whats file has been written there: + +```bash +$ kubectl exec -it -n demo wordpress-app-59b69858f9-48phf -- ls /var/www/html +index.php wp-blog-header.php wp-cron.php wp-mail.php +license.txt wp-comments-post.php wp-includes wp-settings.php +readme.html wp-config-sample.php wp-links-opml.php wp-signup.php +wp-activate.php wp-config.php wp-load.php wp-trackback.php +wp-admin wp-content wp-login.php xmlrpc.php +``` + +Notice the `wp-content` directory. We will work with this directory later in this tutorial. + +Now, our wordpress site is running and we have created some post into it. Now, its time to setup a backup for our site. + +### Backup + +Here, we are going to backup the `/var/www/html` directory of the WordPress pod and the MySQL database into a GCS bucket using `BackupBatch`. + +#### Create AppBinding + +At first, let's create an `AppBinding` CR that holds the connection information of the MySQL database. Stash uses this `AppBinding` to connect with the database. + +Here, is the `AppBinding` CR holding connection information of our MySQL database, + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + name: wordpress-db + namespace: demo +spec: + type: mysql + version: 8.0.27 + clientConfig: + service: + name: wordpress-db + port: 3306 + scheme: mysql + secret: + name: mysql-pass +``` + +Here, + +- `.spec.clientConfig.service.name` specifies the name of the Service that connects to the MySQL database. +- `.spec.clientConfig.service.port` specifies the port where the target database is running. +- `.spec.secret` specifies the name of the Secret that holds the necessary credentials to access the database. +- `spec.type` specifies the types of the database it pointing to. + +Let's create the above AppBinding, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/batch-backup/wordpress-backup/examples/appbinding.yaml +appbinding.appcatalog.appscode.com/wordpress-db +``` + +#### Prepare Backend + +We are going to store our backed up data into a GCS bucket. We have to create a Secret with the necessary credentials and a Repository CR to use this backend. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +> For GCS backend, if the bucket does not exist, Stash needs `Storage Object Admin` role permissions to create the bucket. For more details, please check the following [guide](/docs/v2024.12.18/guides/backends/gcs/). + +**Create Secret:** + +Let's create a Secret called `gcs-secret` with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat /path/to/downloaded-sa-key.json > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create Repository:** + +Now, let's create a `Repository` with our GCS bucket information. Below is the YAML of `Repository` CR we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stashed-ci + prefix: /wordpress/backup + storageSecretName: gcs-secret +``` + +Let's create the Repository we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/batch-backup/wordpress-backup/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our WordPress site into this backend. + +#### Backup + +Now, we are going to create a `BackupBatch` CR targeting the MySQL database and the WordPress deployment. + +**Create BackupBatch:** + +Below is the YAML of the `BackupBatch` CR that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupBatch +metadata: + name: wordpress-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/5 * * * *" + executionOrder: Parallel + members: + - target: + alias: db + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: wordpress-db + task: + name: mysql-backup-8.0.14 + - target: + alias: app + ref: + apiVersion: apps/v1 + kind: Deployment + name: wordpress-app + volumeMounts: + - name: storage + mountPath: /var/www/html + paths: + - /var/www/html + retentionPolicy: + name: 'keep-last-10' + keepLast: 10 + prune: true +``` + +Here, + +- `spec.repository` refers to the `Repository` that holds the information of our GCS backend. +- `spec.schedule` is a cron expression that indicates that backup will take at every 5 minutes interval. +- `spec.executionOrder` specifies that we want to take backup both of the components in parallel. +- `spec.members` specifies a list of targets that are subject to backup. In our case, we are going to specify the `AppBinding` of our MySQL database and the WordPress deployment as members. Each of the members may have the following sub-fields: + - `target.alias` specify the host identifier that will be used to separate data of this member in the backend. + - `target.ref` refers to the target that will be backed up. + - `target.paths` specifies a list of file paths to backup for the target. + - `target.volumeMounts` specifies a list of volumes and their mountPath that contain the target paths. + - `task.name` refers to the `Task` object that specifies the `Function` and their execution order to perform the backup in the Function-Task model. + +Let's create the `BackupBatch` crd we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/batch-backup/wordpress-backup/examples/backupbatch.yaml +backupbatch.stash.appscode.com/wordpress-backup created +``` + +**Verify CronJob:** + +Stash will also create a `CronJob` with the schedule specified in `spec.schedule` field of `BackupBatch` CR. + +Verify that the CronJob has been created successfully, + +```bash +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-wordpress-backup */5 * * * * False 0 32s +``` + +**Wait for BackupSession:** + +The CronJob will trigger a backup on each scheduled slot by creating a `BackupSession` CR. Let's wait for a `BackupSession` to complete, + +```bash +$ kubectl get backupsession -n demo -w +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +wordpress-backup-1597245602 BackupBatch wordpress-backup 0s +wordpress-backup-1597245602 BackupBatch wordpress-backup Running 0s +wordpress-backup-1597245602 BackupBatch wordpress-backup Succeeded 40s +``` + +We can see from the above output that the BackupSession has `Succeeded`. It means Stash has backed up our database and the `/var/www/html` directory of the WordPress deployment successfully. + +**Verify Backup:** + +When a backup session is completed, Stash will update the respective `Repository` to reflect the latest state of backed up data. + +Run the following command to check if a backup snapshot has been stored in the backend, + +```bash +$ kubectl get repository -n demo gcs-repo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo true 183.5Mi 2 3s 38m +``` + +From the output above, we can see that 2 snapshots have been stored in the backend. + +Now, if we navigate to our GCS bucket, we are going to see that the backed up data has been stored in `/wordpress/backup` directory as specified by the `prefix` field of the Repository. + +
+ Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +> **Note:** Stash keeps all the backed up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Restore + +In the previous section, we have successfully backed up the database and `/var/www/html` directory our WordPress deployment into a GCS bucket. Now, it is time to see the restore process in action. + +Here, we are going to see two different restore scenarios: + +- **Batch Restore:** In this scenario, we will assume that both of the components (database and wordpress deployment) our WordPress site has been damaged. In this case, we will restore the backed up data of both components using a `RestoreBatch` object. + +- **Individual Restore:** In this scenario, we will assume that only the database has been damaged. So, restoring only the database is sufficient. In this case, we are going to restore the database using a `RestoreSession` object. + +**Pause Backup:** + +At first, let stop the backup so that no new backup happens during the restore process. Let's set `spec.paused` section of `BackupBatch` to `true` which will stop taking further scheduled backup. + +```bash +$ kubectl patch backupbatch -n demo wordpress-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupbatch.stash.appscode.com/wordpress-backup patched +``` + +It should suspend the respective CronJob which is responsible for triggering backup at a scheduled slot. Let's verify that the CronJob has been suspended. + +```bash +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-wordpress-backup */5 * * * * True 0 12h 13h +``` + +### Batch Restore + +In this section, we are going to simulate a disaster scenario where we will damage both the database and the wordpress deployment's data. Then, we will restore them from the backup. + +**Simulate Disaster:** + +At first, let's corrupt the database. Here, we are going to delete the sample post we have created earlier. + +```bash +$ kubectl exec -it -n demo wordpress-db-58657b89b9-kgt76 -- mysql --user=root --password=mysqlpass +.... +mysql> show tables from wordpress; ++-----------------------+ +| Tables_in_wordpress | ++-----------------------+ +| wp_commentmeta | +| wp_comments | +| wp_links | +| wp_options | +| wp_postmeta | +| wp_posts | +| wp_term_relationships | +| wp_term_taxonomy | +| wp_termmeta | +| wp_terms | +| wp_usermeta | +| wp_users | ++-----------------------+ +12 rows in set (0.01 sec) + +mysql> use wordpress; +Reading table information for completion of table and column names +You can turn off this feature to get a quicker startup with -A + +Database changed +mysql> show tables; ++-----------------------+ +| Tables_in_wordpress | ++-----------------------+ +| wp_commentmeta | +| wp_comments | +| wp_links | +| wp_options | +| wp_postmeta | +| wp_posts | +| wp_term_relationships | +| wp_term_taxonomy | +| wp_termmeta | +| wp_terms | +| wp_usermeta | +| wp_users | ++-----------------------+ +12 rows in set (0.00 sec) + +mysql> select post_name from wp_posts; ++-------------------------+ +| post_name | ++-------------------------+ +| hello-world | +| sample-page | +| privacy-policy | +| | +| stash-batch-backup-test | +| 5-revision-v1 | ++-------------------------+ +6 rows in set (0.00 sec) + +mysql> delete from wp_posts where post_name='stash-batch-backup-test'; +Query OK, 1 row affected (0.01 sec) + +mysql> select post_name from wp_posts; ++----------------+ +| post_name | ++----------------+ +| hello-world | +| sample-page | +| privacy-policy | +| | +| 5-revision-v1 | ++----------------+ +5 rows in set (0.00 sec) + +mysql> exit; +Bye +``` + +We have deleted the `stash-batch-backup-test` post from the database. Now, if you go to our WordPress site through a browser, you will see that the sample post that we had created is missing now. + +
+ Missing Sample Post +
Fig: Missing Sample Post
+
+ +So, we can see that the sample post is gone. Only, the `Hello World!` post is now available. + +Now, let's do some damage to our WordPress deployment too. Here, we are going to remove the `wp-content` directory from `/var/www/html` directory of our WordPress pod. + +```bash +$ kubectl exec -n demo wordpress-app-5b778b446-gtd6d -c wordpress -- rm -r /var/www/html/wp-content +``` + +Verify that the `wp-content` directory has been removed. + +```bash +$ kubectl exec -n demo wordpress-app-5b778b446-gtd6d -c wordpress -- ls /var/www/html +index.php +license.txt +readme.html +wp-activate.php +wp-admin +wp-blog-header.php +wp-comments-post.php +wp-config-sample.php +wp-config.php +wp-cron.php +wp-includes +wp-links-opml.php +wp-load.php +wp-login.php +wp-mail.php +wp-settings.php +wp-signup.php +wp-trackback.php +xmlrpc.php +``` + +So, we can see from the above that the `wp-content` directory is no longer present in `/var/www/html` directory. + +**Create RestoreBatch:** + +Now, we are going to restore both of the components using a RestoreBatch. Here, is the YAML of the RestoreBatch CR that we are going to use: + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreBatch +metadata: + name: wordpress-restore + namespace: demo +spec: + driver: Restic + repository: + name: gcs-repo + executionOrder: Sequential + members: + - target: + alias: db + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: wordpress-db + rules: + - snapshots: [latest] + task: + name: mysql-restore-8.0.14 + - target: + alias: app + ref: + apiVersion: apps/v1 + kind: Deployment + name: wordpress-app + rules: + - paths: + - /var/www/html + volumeMounts: + - name: storage + mountPath: /var/www/html +``` + +Here, + +- `spec.repository` specifies that we are restoring from the `gcs-repo` Repository. +- `spec.executionOrder` specify that we want Stash to restore the component sequentially. Here, we want to restore the database first then we want to restore the wordpress deployment's data. +- `spec.members` specify the targets to be restored. Each member may have the following sub-fields. + - `target.alias` specify the host identifier of the backed up data for this member. It must be the same as the `alias` used during backup. + - `target.ref` refers to the target to restore. + - `target.rules` specify the rules for restoring the data of this member. Here, we want to restore the `latest` snapshot for the database and the latest state of `/var/www/html` path for our WordPress deployment. + - `target.volumeMounts` specifies the volume mounts where the data will be restored. + - `task.name` refers to the `Task` object to use to restore the member in the Function-Task model. + +Let's create the above `RestoreBatch` object, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/batch-backup/wordpress-backup/examples/restorebatch.yaml +restorebatch.stash.appscode.com/wordpress-restore created +``` + +Now, wait for the `RestoreBatch` phase to go into `Succeeded` state. + +```bash +$ kubectl get restorebatch -n demo -w +NAME REPOSITORY PHASE AGE +wordpress-restore gcs-repo Running 7s +wordpress-restore gcs-repo Succeeded 2m +``` + +We can see from above that Stash has successfully restored both components. Now, it's time to verify whether data has been restored or not. + +**Verify Restored Data :** + +Let's verify that `sample-batch-backup-test` post that we had deleted from the database has been restored. + +```bash +$ kubectl exec -n demo wordpress-db-58657b89b9-kgt76 -- mysql --user=root --password=mysqlpass -e "SELECT post_name FROM wordpress.wp_posts;" +mysql: [Warning] Using a password on the command line interface can be insecure. +post_name +hello-world +sample-page +privacy-policy + +stash-batch-backup-test +5-revision-v1= +``` + +We can see that the `stash-batch-backup-test` post is now present in the database. + +Again, let verify whether the `wp-content` directory that we had removed from the WordPress deployment's pod has been restored or not. + +```bash +$ kubectl exec -n demo wordpress-app-684b577c89-wpsqs -c wordpress -- ls /var/www/html +index.php +license.txt +readme.html +wp-activate.php +wp-admin +wp-blog-header.php +wp-comments-post.php +wp-config-sample.php +wp-config.php +wp-content +wp-cron.php +wp-includes +wp-links-opml.php +wp-load.php +wp-login.php +wp-mail.php +wp-settings.php +wp-signup.php +wp-trackback.php +xmlrpc.php +``` + +We can see from the above that the `wp-content` has been restored successfully. + +Now, if you go to the WordPress site through a browser, you will see that the `Stash Batch Backup Test` post is present now. + +
+ Restored Sample Post +
Fig: Restored Sample Post
+
+ +### Individual Restore + +In this section, we are going to simulate a disaster scenario where the data of only one component get damaged. So, restoring only the damaged component is sufficient. + +Here, we are going to delete the sample post again from the database and then restore it using a RestoreSession. + +**Simulate Disaster Scenario :** + +Let's delete the sample post from the database: + +```bash +$ kubectl exec -n demo wordpress-db-58657b89b9-kgt76 -- mysql --user=root --password=mysqlpass -e "DELETE FROM wordpress.wp_posts WHERE post_name='stash-batch-backup-test';" +``` + +Verify that the sample post has been removed: + +```bash +$ kubectl exec -n demo wordpress-db-58657b89b9-kgt76 -- mysql --user=root --password=mysqlpass -e "SELECT post_name FROM wordpress.wp_posts;" +mysql: [Warning] Using a password on the command line interface can be insecure. +post_name +hello-world +sample-page +privacy-policy + +5-revision-v1 +``` + +We can see from the above output that `stash-batch-backup-test` entry no longer presents in the database. + +**Create RestoreSession:** + +Now, let's create a `RestoreSession` object targeting the `AppBinding` of our MySQL database. Here, is the YAML of the `RestoreSession` that we are going to create: + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: wordpress-db-restore + namespace: demo +spec: + task: + name: mysql-restore-8.0.14 + repository: + name: gcs-repo + target: + alias: db + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: wordpress-db + rules: + - snapshots: [latest] +``` + +Let's create the above `RestoreSession` object, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/batch-backup/wordpress-backup/examples/restoresession.yaml +restoresession.stash.appscode.com/wordpress-db-restore created +``` + +Now, wait for the `RestoreSession` phase to go into `Succeeded` state, + +```bash +$ kubectl get restoresession -n demo -w +NAME REPOSITORY PHASE AGE +wordpress-db-restore gcs-repo Running 10s +wordpress-db-restore gcs-repo Succeeded 89s +``` + +So, we can see that Stash has successfully restored the database. + +**Verify Restored Data :** + +Let's verify whether the sample post has been restored or not, + +```bash +$ kubectl exec -n demo wordpress-db-58657b89b9-kgt76 -- mysql --user=root --password=mysqlpass -e "SELECT post_name FROM wordpress.wp_posts;" +mysql: [Warning] Using a password on the command line interface can be insecure. +post_name +hello-world +sample-page +privacy-policy + +stash-batch-backup-test +5-revision-v1 +``` + +We can see from the above output that the `stash-batch-backup-test` post has been restored. Now, if you navigate to the WordPress site in a browser, you should see the post again. + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo backupbatch wordpress-backup +kubectl delete -n demo restorebatch wordpress-restore +kubectl delete -n demo restoresession wordpress-db-restore + +kubectl delete -n demo deployment wordpress-db +kubectl delete -n demo deployment wordpress-app +kubectl delete -n demo repository gcs-repo +kubectl delete -n demo pvc --all +kubectl delete -n demo service --all +``` diff --git a/content/docs/v2024.12.18/guides/cli/_index.md b/content/docs/v2024.12.18/guides/cli/_index.md new file mode 100644 index 0000000000..3718e4d9dd --- /dev/null +++ b/content/docs/v2024.12.18/guides/cli/_index.md @@ -0,0 +1,77 @@ +--- +title: kubectl plugin | Stash +menu: + docs_v2024.12.18: + identifier: cli + name: CLI + parent: guides + weight: 120 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/guides/cli/kubectl-plugin/index.md b/content/docs/v2024.12.18/guides/cli/kubectl-plugin/index.md new file mode 100644 index 0000000000..b11a2b4dd1 --- /dev/null +++ b/content/docs/v2024.12.18/guides/cli/kubectl-plugin/index.md @@ -0,0 +1,664 @@ +--- +title: kubectl Plugin | Stash +menu: + docs_v2024.12.18: + identifier: stash-cli + name: Stash kubectl Plugin + parent: cli + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +> New to Stash? Please start [here](/docs/v2024.12.18/concepts/README). + +# Stash kubectl Plugin + +Stash gives you kubectl plugin support named `kubectl stash` cli. `kubectl stash` cli can be used to manage Stash objects quickly and easily. It performs various operations like creating Stash objects, coping Stash objects, cloning PVC, unlock Repository, triggering an instant backup, etc. To install Stash kubectl plugin on your workstation, follow the steps [here](/docs/v2024.12.18/setup/README). + +## Available Command + +Available command for `kubectl stash` cli are: + +| Main Command | Uses | +|----------------------------------------------------|----------------------------------------------------------------------------| +| [create repository](#create-repository) | Create a new `Repository`. | +| [create backupconfig](#create-backupconfiguration) | Create a new `BackupConfiguration`. | +| [create restoresession](#create-restoresession) | Create a new `RestoreSession`. | +| [cp secret](#copy-secret) | Copy `Secret` from source namespace to destination namespace. | +| [cp repository](#copy-repository) | Copy `Repository` from source namespace to destination namespace. | +| [copy backupconfig](#copy-backupconfiguration) | Copy `BackupConfiguration` from source namespace to destination namespace. | +| [copy volumesnapshot](#copy-volumesnapshot) | Copy `VolumeSnapshot` from source namespace to destination namespace. | +| [clone pvc](#clone-pvc) | Clone a PVC from source namespace to destination namespace. | +| [download](#download-snapshots) | Download backup snapshots from backend into your local repository. | +| [trigger](#trigger-an-instant-backup) | Take an instant backup. | +| [pause backup](#pause-backup) | Pause Stash backup. | +| [resume backup](#resume-backup) | Resume Stash backup. | +| [debug backup](#debug-backup) | Debug Stash backup issues. | +| [debug restore](#debug-restore) | Debug Stash restore issues. | +| [debug operator](#debug-operator) | Debug Stash operator issues. | +| [key list](#key-list) | List the keys (passwords) of a restic repository. | +| [key add](#key-add) | Add a new key (password) to a restic repository. | +| [key update](#key-update) | Update current key (password) of a restic repository. | +| [key remove](#key-remove) | Remove a key (password) of a restic repository. | +| [gen rules](#generate-rules) | Generate restore rules from nearest snapshots at a specific time. | +| [check](#check-repository) | Test the restic repository for errors and reports any errors it finds. | +| [rebuild-index](#rebuild-index) | Create a new index based on the pack files in the restic repository | + +## Create Command + +`kubectl stash create` command is used to create stash objects. It creates various objects like `Repository`, `BackupConfiguration` and `RestoreSession` etc. + +### Create Repository + +To create a `Repository`, you need to provide a `Repository` name and backend information and credential. You will provide the information and credential by using flags. The available flags are: + +| Flag | Description | +|---------------------|-------------------------------------------------------------------------------| +| `--namespace` | Indicates the namespace where the Repository will be created | +| `--secret` | Specify the name of the storage secret that will be used to create Repository | +| `--bucket` | Specify the name of the cloud bucket/container. | +| `--prefix` | Prefix denotes the directory inside the backend. | +| `--provider` | Specify backend provider (i.e. gcs, s3, azure etc) | +| `--endpoint` | Endpoint for s3/s3 compatible backend | +| `--max-connections` | Specify maximum concurrent connections for GCS, Azure and B2 backend. | + +**Format:** + +```bash +kubectl stash create [flags] +``` + +**Example:** + +```bash +$ kubectl stash create repository gcs-repo --namespace=demo --secret=gcs-secret --bucket=appscode-qa --prefix=/source/data --provider=gcs +``` + +### Create BackupConfiguration + +To create a `BackupConfiguration`, you need to provide `BackupConfiguration` name, `Repository` name, Target, and RetentionPolicy, etc. You will provide the `Repository` name, Target, RetentionPolicy by using flags. The available flags are: + +| Flag | Description | +|-------------------------|------------------------------------------------------------------------------------------------| +| `--namespace` | Indicates the namespace where the `BackupConfiguration` will be created | +| `--target-apiversion` | Specify API-Version of the target resource. | +| `--target-kind` | Specify kind of the target resource. | +| `--target-name` | Specify name of the target resource. | +| `--repo-name` | Specify name of the `Repository` that will be created. | +| `--repo-namespace` | Specify namespace of the `Repository` that will be created. | +| `--schedule` | Specify schedule of the backup. | +| `--driver` | `Driver` indicates the mechanism used to backup (i.e. VolumeSnapshotter, Restic) | +| `--task` | Specify name of a `Task` | +| `--volumesnpashotclass` | Specify name of the `VolumeSnapshotClass`. | +| `--replica` | Replica specifies the number of replicas whose data should be backed up. | +| `--paths` | A list of path that will be backed up | +| `--volume-mounts` | Specify a list of volumes and their mountPaths | +| `--keep-last` | Never delete the n last (most recent) snapshots. | +| `--keep-hourly` | For the last n hours in which a snapshot was made, keep only the last snapshot for each hour. | +| `--keep-daily` | For the last n days which have one or more snapshots, only keep the last one for that day. | +| `--keep-weekly` | For the last n weeks which have one or more snapshots, only keep the last one for that week. | +| `--keep-monthly` | For the last n months which have one or more snapshots, only keep the last one for that month. | +| `--keep-yearly` | For the last n years which have one or more snapshots, only keep the last one for that year. | +| `--prune` | If set `true`, Stash will cleanup unreferenced data from the backend. | +| `--dry-run` | Stash will not remove anything but print which snapshots would be removed. | + +> Note: You must provide `::` in the `--volume-mounts` flag to specify the volumes and their mountPath and subPath. The `:` part is optional. + +**Format:** + +```bash +kubectl stash create [flags] +``` + +**Example:** + +```bash +$ kubectl stash create backupconfig ss-backup --namespace=demo --repo-name=gcs-repo --schedule="*/4 * * * *" --target-apiversion=apps/v1 --target-kind=StatefulSet --target-name=stash-demo --paths=/source/data --volume-mounts=source-data:/source/data --keep-last=5 --prune=true +``` + +### Create RestoreSession + +To create a `RestoreSession`, you need to provide a `Repository` name, Target or `VolumeClaimTemplate`, etc. You will provide the `Repository` name, Target or `VolumeClaimTemplate` by using flags. The available flags are: + +| Flag | Description | +|------------------------|--------------------------------------------------------------------------------| +| `--namespace` | Indicates the namespace where the `RestoreSession` will be created | +| `--target-apiversion` | API-Version of the target resource. | +| `--target-kind` | Specify kind of the target resource. | +| `--target-name` | Specify name of the target resource. | +| `--repo-name` | specify name of the `Repository`. | +| `--repo-namespace` | specify namespace of the `Repository` | +| `--driver` | Driver indicates the mechanism used to backup (i.e. VolumeSnapshotter, Restic) | +| `--task` | Name of the Task | +| `--replica` | Replica specifies the number of replicas whose data should be backed up. | +| `--paths` | A list of path that will be backed up | +| `--volume-mounts` | A list of volumes and their mountPaths | +| `--snapshots` | Specify the name of the Snapshot(single) | +| `--host` | Specify the name of the Source host | +| `--claim.name` | Specify the name of the `VolumeClaimTemplate` | +| `--claim.access-modes` | Access mode of the VolumeClaimTemplates | +| `--claim.storageclass` | Specify the name of the Storage secret for VolumeClaimTemplate | +| `--claim.size` | Total requested size of the VolumeClaimTemplate | +| `--claim.datasource` | DataSource of the VolumeClaimTemplate | + +> Note: You must provide `::` in the `--volume-mounts` flag to specify the volumes and their mountPath and subPath. The `:` part is optional. + +**Format:** + +```bash +kubectl stash create restoresession [flags] +``` + +**Example:** + +```bash +$ kubectl stash create restoresession ss-restore --namespace=demo --repo-name=gcs-repo --target-apiversion=apps/v1 --target-kind=StatefulSet --target-name=stash-recovered --paths=/source/data --volume-mounts=source-data:/source/data +``` + +## Copy Command + +`kubectl stash cp` command is used to copy stash objects from one namespace to another namespace. It copies various objects like `Secret`, `Repository`, `BackupConfiguration` and `VolumeSnapshot` etc. + +### Copy Secret + +To copy a Secret, you need to provide Secret name and destination namespace. You will provide the destination namespace by using flag. The available flags are: + +| Flag | Description | +|------------------|------------------------------------------------------------------------| +| `--namespace` | Indicates the namespace of the respective `Secret`. | +| `--to-namespace` | Indicates the destination namespace where the `Secret` will be copied. | + +**Format:** + +```bash +kubectl stash cp secret [flags] +``` + +**Example:** + +```bash +$ kubectl stash cp secret my-secret --namespace=demo --to-namespace=demo1 +``` + +### Copy Repository + +To copy a Repository, you need to provide a Repository name and destination namespace. When we run the command the coping process consists of the following steps: + +- At first, the cli copies Secret from source namespace to destination namespace. +- Then it copies Repository from source namespace to destination namespace. + +You will provide the destination namespace by using flag. The available flags are: + +| Flag | Description | +|------------------|----------------------------------------------------------------------------| +| `--namespace` | Indicates the namespace of the respective `Repository`. | +| `--to-namespace` | Indicates the destination namespace where the `Repository` will be copied. | + +**Format:** + +```bash +kubectl stash cp repository [flags] +``` + +**Example:** + +```bash +$ kubectl stash cp repository my-repo --namespce=demo --to-namespace=demo1 +``` + +### Copy BackupConfiguration + +To copy a BackupConfiguration, you need to provide BackupConfiguration name and destination namespace. When we run the command the coping process consists of the following steps: + +- At first, the cli copies Secret from source namespace to destination namespace. +- Then it copies Repository from source namespace to destination namespace. +- finally it copies BackupConfiguration from source namespace to destination namespace. + +You will provide the destination namespace by using flags. The available flags are: + +| Flag | Description | +|------------------|-------------------------------------------------------------------------------------| +| `--namespace` | Indicates the namespace of the respective `BackupConfiguration`. | +| `--to-namespace` | Indicates the destination namespace where the `BackupConfiguration` will be copied. | + +**Format:** + +```bash +kubectl stash cp backupconfig [flags] +``` + +**Example:** + +```bash +$ kubectl stash cp backupconfig my-backupconfig --namespace=demo --to-namespace=demo1 +``` + +### Copy VolumeSnapshot + +To copy a VolumeSnapshot, you need to provide `VolumeSnapshot` name and destination namespace. You will provide the destination namespace by using flag. The available flags are: + +| Flag | Description | +|------------------|--------------------------------------------------------------------------------| +| `--namespace` | Indicates the namespace of the respective `VolumeSnapshot`. | +| `--to-namespace` | Indicates the destination namespace where the `VolumeSnapshot` will be copied. | + +**Example:** + +```bash +$ kubectl stash cp volumesnapshot my-vol-snap --namespace=demo --to-namespace=demo1 +``` + +## Clone PVC + +`kubectl stash clone pvc` command is used to clone PVC from one namespace to another namespace. When we run the command the cloning process consists of the following steps: + +- At first, It creates a Repository in the source namespace. +- Using this repository, it creates a BackupConfiguration targeting the PVC to take backup. +- After the backup process succeeded, It copies Repository to the destination namespace +- finally, It restores the backed up data into VolumeClaimTemplate in the destination namespace. + +To clone a PVC, you need to provide backend credentials for creating Repository. +You will provide the backend credential by using flags. The available flags are: + +| Flag | Description | +|---------------------|-------------------------------------------------------------------------------| +| `--namespace` | Indicates namespace of the respective pvc. | +| `--to-namespace` | Indicates the destination namespace where the PVC will be cloned. | +| `--secret` | Specify the name of the storage secret that will be used to create Repository | +| `--bucket` | Specify the name of the cloud bucket/container. | +| `--prefix` | Prefix denotes the directory inside the backend. | +| `--provider` | Specify backend provider (i.e. gcs, s3, azure etc) | +| `--endpoint` | Endpoint for s3/s3 compatible backend | +| `--max-connections` | Specify maximum concurrent connections for GCS, Azure and B2 backend. | + +**Format:** + +```bash +kubectl stash clone pvc [flags] +``` + +**Example:** + +```bash +$ kubectl stash clone pvc my-pvc -n demo --to-namespace=demo-1 --secret= --bucket= --prefix= --provider= +``` + +## Download Snapshots + +`kubectl stash download` command is used to download the snapshots from backend repository into your local machine. +To download the snapshots you have to provide `Repository` name, download directory and snapshot list. You will provide the download directory and snapshot list using flags. The available flags are: + +| Flag | Description | +|-----------------|-----------------------------------------------------------------------| +| `--namespace` | Indicates the namespace of the respective `Repository`. | +| `--destination` | Indicates the local directory where the snapshots will be downloaded. | | +| `--snapshots` | Specifies the list of snapshots. (Provide a list of snapshot ID) | + +**Format:** + +```bash +kubectl stash download [flags] +``` + +**Example:** + +```bash +$ kubectl stash download gcs-repo --namespace=demo --destination=/home/downloads/ --snapshots="19eb4793,b7244d52" + +``` +Use `kubectl get snapshots` to get the available snapshots. + +## Trigger an Instant Backup + +`kubectl stash trigger` command is used to take an instant backup in stash. +To trigger an instant backup, you need to have a BackupConfiguration in your cluster. You need to provide the BackupConfiguration name. You can also provide the namespace by using the `--namespace` flag. This flag indicates the namespace where the trigger backup will be occurred. + +**Format:** + +```bash +$ kubectl stash trigger [flags] +``` + +**Example:** + +```bash +$ kubectl stash trigger my-config --namespace=demo +``` + +## Unlock Repository + +`kubectl stash unlock` are used to remove lock from the backend repository. +To unlock the Repository, you need to provide a Repository name. You can also provide the namespace by using the `--namespace` flag. This flag indicates the Repository namespace. + +**Format:** + +```bash +kubectl stash unlock [flags] +``` + +**Example:** + +```bash +$ kubectl stash unlock my-repo --namespace=demo +``` + +## Pause Backup +`kubectl stash pause` command is used to pause Stash backup temporarily. To pause a backup you have to provide the `BackupConfiguration` name or `BackupBatch` name by using flags. The available flags are: + +| Flag | Description | +|------------------|-----------------------------------------------------------------------------------| +| `--namespace` | Indicates the namespace of the respective `BackupConfiguration` or `BackupBatch`. | +| `--backupconfig` | Name of the `BackupConfiguration`. | +| `--backupbatch` | Name of the `BackupBatch`. | + +**Format:** + +```bash +kubectl stash pause backup [flags] +``` + +**Example:** + +```bash +$ kubectl stash pause backup --namespace=demo --backupconfig=my-config +``` + +## Resume Backup + +`kubectl stash pause` comand is used to resume a backup. To resume a backup you have to provide the `BackupConfiguration` name or `BackupBatch` name by using flags. The available flags are: + +| Flag | Description | +|------------------|-----------------------------------------------------------------------------------| +| `--namespace` | Indicates the namespace of the respective `BackupConfiguration` or `BackupBatch`. | +| `--backupconfig` | Name of the `BackupConfiguration`. | +| `--backupbatch` | Name of the `BackupBatch`. | + +**Format:** + +```bash +kubectl stash resume backup [flags] +``` + +**Example:** + +```bash +$ kubectl stash resume backup --namespace=demo --backupconfig==my-config +``` + +## Debug Command +`kubectl stash debug` command is used to debug stash resources. This command describes the necessary resources and shows logs from the related pods which makes the debugging process quicker and easier. + +### Debug Backup +This command is used to debug a backup. You have to provide the BackupConfiguration name or BackupBatch name by using flags. The available flags are: + +| Flag | Description | +|------------------|-----------------------------------------------------------------------------------| +| `--namespace` | Indicates the namespace of the respective `BackupConfiguration` or `BackupBatch`. | +| `--backupconfig` | Name of the `BackupConfiguration`. | +| `--backupbatch` | Name of the `BackupBatch`. | + + +**Format:** + +```bash +kubectl stash debug backup [flags] +``` + +**Example:** + +```bash +$ kubectl stash debug backup --namespace=demo --backupconfig=my-config +``` + +### Debug Restore + +This command is used to debug a restore. You have to provide the `RestoreSession` name or `RestoreBatch` name by using flags. The available flags are: + +| Flag | Description | +|--------------------|-------------------------------------------------------------------------------| +| `--namespace` | Indicates the namespace of the respective `RestoreSession` or `RestoreBatch`. | +| `--restoresession` | Name of the `RestoreSession`. | +| `--restorebatch` | Name of the `RestoreBatch`. | + + +**Format:** + +```bash +kubectl stash debug restore [flags] +``` + +**Example:** + +```bash +$ kubectl stash debug restore --namespace=demo --restoresession=my-restore +``` + +### Debug Operator + +This command is used to show version related information and operator logs. + +**Example:** + +```bash +$ kubectl stash debug operator +``` + +## Key Command + +`kubectl stash key` command is used to manage keys (passwords) of a restic repository. + +### Key List + +This command is used to list restic keys (passwords) of a restic repository. + +**Format:** + +```bash +kubectl stash key list [flags] +``` + +**Example:** + +```bash +$ kubectl stash key list my-repo --namespace=demo +``` + +### Key Add + +This command is used to add a new key (password) to a restic repository. You have to provide the information of the new key by using flags. The available flags are: + +| Flag | Description | +|-----------------------|---------------------------------------------------------| +| `--namespace` | Indicates the namespace of the respective `Repository`. | +| `--host` | Host of the new key. | +| `--user` | User of the new key. | +| `--new-password-file` | File from which to read the new password file. | + +**Format:** + +```bash +kubectl stash key add [flags] +``` + +**Example:** + +```bash +$ kubectl stash key list my-repo --namespace=demo --user root --host my-host --new-password-file password.txt +``` + +### Key Update + +This command is used to update the current key (password) of a restic repository. The available flags for this command are: + +| Flag | Description | +|-----------------------|---------------------------------------------------------| +| `--namespace` | Indicates the namespace of the respective `Repository`. | +| `--new-password-file` | File from which to read the new password file. | + +**Format:** + +```bash +kubectl stash key update [flags] +``` + +**Example:** + +```bash +$ kubectl stash key list my-repo --namespace=demo --new-password-file password.txt +``` + +### Key Remove + +This command is used to remove a key (password) of a restic repository. The available flags for this command are: + +| Flag | Description | +|---------------|---------------------------------------------------------| +| `--namespace` | Indicates the namespace of the respective `Repository`. | +| `--id` | ID of the restic key. | + +**Format:** + +```bash +kubectl stash key remove [flags] +``` + +**Example:** + +```bash +$ kubectl stash key remove my-repo --namespace=demo --id cdc89a7d +``` + +## Generate Rules + +`kubectl stash gen rules` command is used to create rules for a RestoreSession to recover the database and application +backups. This command finds the nearest repository snapshots for a given timestamp and generates two rules: one for the snapshots just before the specified timestamp and another for those at or after the specified timestamp. The available flags for this command are: + +| Flag | Description | +|----------------------|-------------------------------------------------------------| +| `--namespace` | Indicates the namespace of the respective `Repository`. | +| `--timestamp` | Timestamp to find the closest snapshots. | +| `--group-interval` | Specifies the time gap between batches of backup snapshots. | +| `--request-timeout` | Request timeout duration for the kubectl command. | + +**Format:** + +```bash +kubectl stash gen rules [flags] +``` +**Example:** + +```bash +$ kubectl stash gen rules my-repo --namespace=demo --timestamp 2023-10-05T05:16:11Z +``` + +## Check Repository + +`kubectl stash check` command is used to test the restic repository for errors and reports any errors it finds. It can also be used to read all data and therefore simulate a restore. By default, the command will always load all data directly from the repository and not use a local cache. The available flags for this command are: + +| Flag | Description | +|----------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `--namespace` | Indicates the namespace of the respective `Repository`. | +| `--read-data` | Read all data blobs. | +| `--with-cache` | Use existing cache, only read uncached data from repository. | +| `--read-data-subset` | Read a subset of data packs, specified as 'n/t' for specific part, or either 'x%' or 'x.y%' or a size in bytes with suffixes k/K, m/M, g/G, t/T for a random subset | + +**Format** + +```bash +kubectl stash check [flags] +``` + +**Example** + +```bash +$ kubectl stash check my-repo --namespace=demo --read-data +``` + +## Rebuild Index + +`kubectl stash rebuild-index` command is used to create a new index based on the pack files in the restic repository. + +| Flag | Description | +|--------------------|---------------------------------------------------------| +| `--namespace` | Indicates the namespace of the respective `Repository`. | +| `--read-all-packs` | Read all pack files to generate new index from scratch. | + +**Format** + +```bash +kubectl stash rebuild-index [flags] +``` + +**Example** + +```bash +$ kubectl stash rebuild-index my-repo --namespace=demo --read-all-packs +``` \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/hooks/_index.md b/content/docs/v2024.12.18/guides/hooks/_index.md new file mode 100644 index 0000000000..61d67cc648 --- /dev/null +++ b/content/docs/v2024.12.18/guides/hooks/_index.md @@ -0,0 +1,77 @@ +--- +title: Backup and Restore Hooks | Stash +menu: + docs_v2024.12.18: + identifier: hooks + name: Hooks + parent: guides + weight: 115 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/guides/hooks/backup-and-restore-hooks/examples/post_backup_hook_demo.yaml b/content/docs/v2024.12.18/guides/hooks/backup-and-restore-hooks/examples/post_backup_hook_demo.yaml new file mode 100644 index 0000000000..32cb2842a6 --- /dev/null +++ b/content/docs/v2024.12.18/guides/hooks/backup-and-restore-hooks/examples/post_backup_hook_demo.yaml @@ -0,0 +1,35 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: backup-hook-demo + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: mysql-backup-8.0.14 + repository: + name: gcs-repo + hooks: + preBackup: + exec: + command: + - /bin/sh + - -c + - mysql -u root --password=$MYSQL_ROOT_PASSWORD -e "SET GLOBAL super_read_only = ON;" + containerName: mysql # KubeDB uses "mysql" name for MySQL database container. If you haven't used KubeDB, change this according to your setup. + postBackup: + exec: + command: + - /bin/sh + - -c + - mysql -u root --password=$MYSQL_ROOT_PASSWORD -e "SET GLOBAL super_read_only = OFF;" + containerName: mysql + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mysql + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/guides/hooks/backup-and-restore-hooks/examples/post_restore_hook_demo.yaml b/content/docs/v2024.12.18/guides/hooks/backup-and-restore-hooks/examples/post_restore_hook_demo.yaml new file mode 100644 index 0000000000..ff392303c2 --- /dev/null +++ b/content/docs/v2024.12.18/guides/hooks/backup-and-restore-hooks/examples/post_restore_hook_demo.yaml @@ -0,0 +1,25 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: post-restore-hook-demo + namespace: demo +spec: + task: + name: mysql-restore-8.0.14 + repository: + name: gcs-repo + hooks: + postRestore: + exec: + command: + - /bin/sh + - -c + - mysql -u root --password=$MYSQL_ROOT_PASSWORD -e "RENAME TABLE companyRecord.employee TO companyRecord.salaryRecord;" + containerName: mysql + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mysql + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/guides/hooks/backup-and-restore-hooks/examples/pre_backup_hook_demo.yaml b/content/docs/v2024.12.18/guides/hooks/backup-and-restore-hooks/examples/pre_backup_hook_demo.yaml new file mode 100644 index 0000000000..c444b5d338 --- /dev/null +++ b/content/docs/v2024.12.18/guides/hooks/backup-and-restore-hooks/examples/pre_backup_hook_demo.yaml @@ -0,0 +1,28 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: backup-hook-demo + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: mysql-backup-8.0.14 + repository: + name: gcs-repo + hooks: + preBackup: + exec: + command: + - /bin/sh + - -c + - mysql -u root --password=$MYSQL_ROOT_PASSWORD -e "SET GLOBAL super_read_only = ON;" + containerName: mysql # KubeDB uses "mysql" name for MySQL database container. If you haven't used KubeDB, change this according to your setup. + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mysql + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/guides/hooks/backup-and-restore-hooks/examples/pre_restore_hook_demo.yaml b/content/docs/v2024.12.18/guides/hooks/backup-and-restore-hooks/examples/pre_restore_hook_demo.yaml new file mode 100644 index 0000000000..4b66781c8f --- /dev/null +++ b/content/docs/v2024.12.18/guides/hooks/backup-and-restore-hooks/examples/pre_restore_hook_demo.yaml @@ -0,0 +1,25 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: pre-restore-hook-demo + namespace: demo +spec: + task: + name: mysql-restore-8.0.14 + repository: + name: gcs-repo + hooks: + preRestore: + exec: + command: + - /bin/sh + - -c + - mysql -u root --password=$MYSQL_ROOT_PASSWORD -e "DROP DATABASE companyRecord;" + containerName: mysql + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mysql + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/guides/hooks/backup-and-restore-hooks/examples/repository.yaml b/content/docs/v2024.12.18/guides/hooks/backup-and-restore-hooks/examples/repository.yaml new file mode 100644 index 0000000000..00327bdc05 --- /dev/null +++ b/content/docs/v2024.12.18/guides/hooks/backup-and-restore-hooks/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: /demo/mysql/hook-example + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/guides/hooks/backup-and-restore-hooks/examples/sample-mysql.yaml b/content/docs/v2024.12.18/guides/hooks/backup-and-restore-hooks/examples/sample-mysql.yaml new file mode 100644 index 0000000000..c20ed4cf73 --- /dev/null +++ b/content/docs/v2024.12.18/guides/hooks/backup-and-restore-hooks/examples/sample-mysql.yaml @@ -0,0 +1,16 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MySQL +metadata: + name: sample-mysql + namespace: demo +spec: + version: 8.0.27 + replicas: 1 + storageType: Durable + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: WipeOut diff --git a/content/docs/v2024.12.18/guides/hooks/backup-and-restore-hooks/index.md b/content/docs/v2024.12.18/guides/hooks/backup-and-restore-hooks/index.md new file mode 100644 index 0000000000..7e5059e428 --- /dev/null +++ b/content/docs/v2024.12.18/guides/hooks/backup-and-restore-hooks/index.md @@ -0,0 +1,796 @@ +--- +title: Backup & Restore Hooks | Stash +menu: + docs_v2024.12.18: + identifier: backup-and-restore-hooks + name: Backup & Restore Hooks + parent: hooks + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup & Restore Hooks + +Stash hooks let you perform some actions before and after the backup or restore process. This is particularly helpful when you want to prepare your application before backup or restore. + +Here, we are going to demonstrate how you can perform different actions before and after backup and restore a MySQL database. Some of the examples might not reflect the real-world use cases but it serves the sole purpose of demonstrating what is possible. + +> Note that, this is an advanced concept. If you haven't tried the normal backup restore processes yet, we will recommend to try them first. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). +- Install Stash in your cluster following the steps [here](/docs/v2024.12.18/setup/install/stash/). +- Install [KubeDB](https://kubedb.com) in your cluster following the steps [here](https://kubedb.com/docs/latest/setup/). This step is optional. You can deploy your database using any method you want. We are using KubeDB because KubeDB simplifies many of the difficult or tedious management tasks of running production-grade databases on private and public clouds. +- If you are not familiar with how Stash backup and restore MySQL databases, please check the following guide [here](/docs/v2024.12.18/addons/mysql/overview/). +- Also, if you haven't read about how hooks work in Stash, please check it from [here](/docs/v2024.12.18/guides/hooks/overview/). + +You should be familiar with the following `Stash` concepts: + +- [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) +- [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) +- [Repository](/docs/v2024.12.18/concepts/crds/repository/) +- [Function](/docs/v2024.12.18/concepts/crds/function/) +- [Task](/docs/v2024.12.18/concepts/crds/task/) +- [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +## Prepare Database + +At first, let's deploy a MySQL database. Here, we are going to deploy MySQL `8.0.14` using KubeDB. We are going to insert some sample data into the database so that we can verify that the backup and restore process is working properly. + +**Deploy Database:** + +Below is the `MySQL` CR(Custom Resource) that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MySQL +metadata: + name: sample-mysql + namespace: demo +spec: + version: 8.0.27 + replicas: 1 + storageType: Durable + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: WipeOut +``` + +Let's create the above `MySQL` CR, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/hooks/backup-and-restore-hooks/examples/sample-mysql.yaml +mysql.kubedb.com/sample-mysql created +``` + +KubeDB will deploy a MySQL database according to the above specification. It will also create the necessary Secrets and Services to access the database. + +Wait for the database to go into `Running` state, + +```bash +$ kubectl get mysql -n demo -w +NAME VERSION STATUS AGE +sample-mysql 8.0.14 Creating 5s +sample-mysql 8.0.14 Running 2m7s +``` + +**Verify Database Secret:** + +Verify that KubeDB has created a Secret for the database. + +```bash +$ kubectl get secret -n demo -l=app.kubernetes.io/instance=sample-mysql +NAME TYPE DATA AGE +sample-mysql-auth Opaque 2 5m7s +``` + +**Verify AppBinding:** + +KubeDB creates an `AppBinding` CR that holds the necessary information to connect with the database. Verify that the `AppBinding` has been created for the above database: + +```bash +$ kubectl get appbindings -n demo -l=app.kubernetes.io/instance=sample-mysql +NAME TYPE VERSION AGE +sample-mysql kubedb.com/mysql 8.0.14 66s +``` + +If you check the YAML of the `AppBinding`, you will see the connection information and respective Secret reference to access the database is presents in `spec` section. + +```bash +$ kubectl get appbindings sample-mysql -n demo -o yaml +``` + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + creationTimestamp: "2020-01-16T10:28:00Z" + generation: 1 + labels: + app.kubernetes.io/component: database + app.kubernetes.io/instance: sample-mysql + app.kubernetes.io/managed-by: kubedb.com + app.kubernetes.io/name: mysql + app.kubernetes.io/version: 8.0.14 + kubedb.com/kind: MySQL + app.kubernetes.io/instance: sample-mysql + name: sample-mysql + namespace: demo +spec: + clientConfig: + service: + name: sample-mysql + path: / + port: 3306 + scheme: mysql + url: tcp(sample-mysql:3306)/ + secret: + name: sample-mysql-auth + type: kubedb.com/mysql + version: 8.0.14 +``` + +**Insert Sample Data:** + +Now, let's insert some sample data into the above database. Here, we are going to `exec` into the database pod and create a database named `companyRecord`. Then, we are going to create a table named `employee` which will store employee's id, name and salary information. Then, we are going to insert a sample row in the table. + +At first, let's export the database credentials as environment variables in our current shell so that we can use those variables to access the database instead of typing username and password every time. + +```bash +# export username from the database secret +$ export MYSQL_USER=$(kubectl get secret -n demo sample-mysql-auth -o jsonpath='{.data.username}'| base64 -d) + +# verify that the username has been exported properly +$ echo $MYSQL_USER +root + +# export the password from the database secret +$ export MYSQL_PASSWORD=$(kubectl get secret -n demo sample-mysql-auth -o jsonpath='{.data.password}'| base64 -d) + +# verify that the password has been exported properly +$ echo $MYSQL_PASSWORD +CWg2hru8b0Yu7dzS +``` + +Now, let's identify the database pod, + +```bash +$ kubectl get pods -n demo --selector="app.kubernetes.io/instance=sample-mysql" +NAME READY STATUS RESTARTS AGE +sample-mysql-0 1/1 Running 0 6m50s +``` + +Let's `exec` into the database pod and insert sample data, + +```bash +$ kubectl exec -it -n demo sample-mysql-0 -- mysql --user=$MYSQL_USER --password=$MYSQL_PASSWORD + +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 131 +Server version: 8.0.14 MySQL Community Server - GPL + +Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +# create database named "companyRecord" +mysql> CREATE DATABASE companyRecord; +Query OK, 1 row affected (0.01 sec) + +# verify that the database has been created +mysql> SHOW DATABASES; ++--------------------+ +| Database | ++--------------------+ +| companyRecord | +| information_schema | +| mysql | +| performance_schema | +| sys | ++--------------------+ +5 rows in set (0.00 sec) + +# create a table called "employee" in "companyRecord" database +mysql> CREATE TABLE companyRecord.employee (id INT, name VARCHAR(50), salary INT, PRIMARY KEY(id)); +Query OK, 0 rows affected (0.05 sec) + +# insert a demo data into the table +mysql> INSERT INTO companyRecord.employee (id, name, salary) VALUES (1, "John Doe", 5000); +Query OK, 1 row affected (0.01 sec) + +# verify that the data has been inserted +mysql> SELECT * FROM companyRecord.employee; ++----+----------+--------+ +| id | name | salary | ++----+----------+--------+ +| 1 | John Doe | 5000 | ++----+----------+--------+ +1 row in set (0.00 sec) + +mysql> exit +Bye +``` + +### Prepare Backend + +We are going to store our backed up data into a GCS bucket. At first, we need to create a secret with GCS credentials then we need to create a `Repository` CR. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +**Create Storage Secret:** + +Let's create a secret called `gcs-secret` with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat /path/to/downloaded-sa-key.json > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create Repository:** + +Now, create a `Repository` using this secret. Below is the YAML of Repository CR we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: /demo/mysql/hook-example + storageSecretName: gcs-secret +``` + +Let's create the `Repository` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/hooks/backup-and-restore-hooks/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our database into our desired backend. + +## Backup + +In this section, we are going to demonstrate `preBackup` hook and `postBackup` hook. We are going to make MySQL database read-only in `preBackup` hook so that no write operation happens in the database during backup. Then, we are going to make the database writable in `postBackup` hook so that the application can write again into the database. + +### PreBackup Hook + +At first, we are going to set `super_read_only` flag `ON` in `preBackup` hook which will make the database read-only. However, we won't set this flag `OFF` in `postBackup` so that we can verify that the hook has been executed. + +**Create BackupConfiguration:** + +Below is the YAML of the `BackupConfiguration` CR with `preBackup` hook configured to make the database read-only before backup, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: backup-hook-demo + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: mysql-backup-8.0.14 + repository: + name: gcs-repo + hooks: + preBackup: + exec: + command: + - /bin/sh + - -c + - mysql -u root --password=$MYSQL_ROOT_PASSWORD -e "SET GLOBAL super_read_only = ON;" + containerName: mysql # KubeDB uses "mysql" name for MySQL database container. If you haven't used KubeDB, change this according to your setup. + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mysql + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +Let's create the above `BackupConfiguration`, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/hooks/backup-and-restore-hooks/examples/pre_backup_hook_demo.yaml +backupconfiguration.stash.appscode.com/backup-hook-demo created +``` + +**Verify CronJob:** + +If everything goes well, Stash will create a CronJob with the schedule specified in `spec.schedule` field of the `BackupConfiguration` CR. + +```bash +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-backup-hook-demo */5 * * * * False 0 74s +``` + +**Wait for BackupSession:** + +The `stash-backup-backup-hook-demo` CronJob will trigger a backup on each scheduled slot by creating a `BackupSession` CR. + +Wait for a schedule to appear. Run the following command to watch `BackupSession` CR, + +```bash +$ kubectl get backupsession -n demo -w + +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +backup-hook-demo-1579179002 BackupConfiguration backup-hook-demo Running 10s +backup-hook-demo-1579179002 BackupConfiguration backup-hook-demo Running 52s +backup-hook-demo-1579179002 BackupConfiguration backup-hook-demo Succeeded 86s +``` + +Here, the phase `Succeeded` means that the backup process has been completed successfully. + +**Verify Backup:** + +Once a backup is completed, Stash will update the respective `Repository` CR to reflect the backup completion. Check that the repository `gcs-repo` has been updated by the following command, + +```bash +$ kubectl get repository -n demo gcs-repo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo true 1 75s 55m +``` + +Here, `SNAPSHOT-COUNT` 1 indicates that one snapshot has been taken for the targeted database. + +**Verify PreBackup Hook Executed:** + +If the `preBackup` hook executes successfully, the database will be marked as read-only. In this situation, if we try to make a write operation into the database, it should reject the operation. However, the database should serve the read operations without any problem. + +Let's verify that the database is read-only by trying to execute a write operation, + +```bash +$ kubectl exec -it -n demo sample-mysql-0 -- mysql --user=$MYSQL_USER --password=$MYSQL_PASSWORD -e "CREATE DATABASE read-OnlyTest;" +mysql: [Warning] Using a password on the command line interface can be insecure. +ERROR 1290 (HY000) at line 1: The MySQL server is running with the --super-read-only option so it cannot execute this statement +command terminated with exit code 1 +``` + +Here, the error message clearly states the database is now read-only. Let's try to execute a read operation. + +```bash +$ kubectl exec -it -n demo sample-mysql-0 -- mysql --user=$MYSQL_USER --password=$MYSQL_PASSWORD -e "SELECT * FROM companyRecord.employee;" +mysql: [Warning] Using a password on the command line interface can be insecure. ++----+----------+--------+ +| id | name | salary | ++----+----------+--------+ +| 1 | John Doe | 5000 | ++----+----------+--------+ +``` + +So, we can see that the database can serve read-only queries without any problem. + +### PostBackup Hook + +Now, let's update the `BackupConfiguration` CR and add a `postBackup` hook that set `super_read_only` flag to `OFF`. So, the database should be writable again from the next backup. + +**Update BackupConfiguration:** + +Below is the YAML for the updated `BackupConfiguration` CR with `postBackup` hook. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: backup-hook-demo + namespace: demo +spec: + schedule: "*/5 * * * *" + task: + name: mysql-backup-8.0.14 + repository: + name: gcs-repo + hooks: + preBackup: + exec: + command: + - /bin/sh + - -c + - mysql -u root --password=$MYSQL_ROOT_PASSWORD -e "SET GLOBAL super_read_only = ON;" + containerName: mysql # KubeDB uses "mysql" name for MySQL database container. If you haven't used KubeDB, change this according to your setup. + postBackup: + exec: + command: + - /bin/sh + - -c + - mysql -u root --password=$MYSQL_ROOT_PASSWORD -e "SET GLOBAL super_read_only = OFF;" + containerName: mysql + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mysql + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +Let's apply the update, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/hooks/backup-and-restore-hooks/examples/post_backup_hook_demo.yaml +backupconfiguration.stash.appscode.com/backup-hook-demo configured +``` + +**Wait for Next BackupSession:** + +Now, wait for the next backup slot, + +```bash +$ kubectl get backupsession -n demo -w + +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +backup-hook-demo-1579179002 BackupConfiguration backup-hook-demo Succeeded 7m8s +backup-hook-demo-1579179905 BackupConfiguration backup-hook-demo Running 12s +backup-hook-demo-1579179905 BackupConfiguration backup-hook-demo Running 8s +backup-hook-demo-1579179905 BackupConfiguration backup-hook-demo Succeeded 63s +``` + +**Verify PostBackup Hook Executed:** + +If the `postBackup` hook has been executed successfully, the database should be writable again. Let's try to execute a write operation to verify that the database writable, + +```bash +$ kubectl exec -it -n demo sample-mysql-0 -- mysql --user=$MYSQL_USER --password=$MYSQL_PASSWORD -e "CREATE DATABASE postBackupHookTest;" +mysql: [Warning] Using a password on the command line interface can be insecure. +``` + +Verify the test database has been created successfully, + +```bash +$ kubectl exec -it -n demo sample-mysql-0 -- mysql --user=$MYSQL_USER --password=CWg2hru8b0Yu7dzS -e "SHOW DATABASES;" + +mysql: [Warning] Using a password on the command line interface can be insecure. ++--------------------+ +| Database | ++--------------------+ +| companyRecord | +| information_schema | +| mysql | +| performance_schema | +| postBackupHookTest | +| sys | ++--------------------+ +``` + +So, we can see the database is writable again after the backup. + +## Restore + +In this section, we are going to demonstrate `preRestore` and `postRestore` hooks. Here, we are going to delete corrupted data in `preRestore` hook and apply some migration on the database in `postRestore` hook. + +**Pause Backup:** + +At first, let stop the backup so that no new backup happens during the restore process. Let's set `spec.paused` section of `BackupConfiguration` to `true` which will stop taking further scheduled backup. + +```bash +$ kubectl patch backupconfiguration -n demo backup-hook-demo --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/backup-hook-demo patched +``` + +It should suspend the respective CronJob which is responsible for triggering backup at a scheduled slot. Let's verify that the CronJob has been suspended. + +```bash +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-backup-hook-demo */5 * * * * True 0 5m13s 29m +``` + +**Simulate Disaster Scenario:** + +Now, let's simulate a disaster scenario. Here, we are going to delete the `companyRecord` database before restoring so that we can verify that the data has been restored from backup. + +```bash +$ kubectl exec -it -n demo sample-mysql-0 -- mysql --user=$MYSQL_USER --password=$MYSQL_PASSWORD -e "DROP DATABASE companyRecord;" +mysql: [Warning] Using a password on the command line interface can be insecure. +``` + +Verify that the database has been deleted, + +```bash +$ kubectl exec -it -n demo sample-mysql-0 -- mysql --user=$MYSQL_USER --password=$MYSQL_PASSWORD -e "SHOW DATABASES;" +mysql: [Warning] Using a password on the command line interface can be insecure. ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| mysql | +| performance_schema | +| postBackupHookTest | +| sys | ++--------------------+ +``` + +So, we can see from the above output that the database `companyRecord` has been deleted from the MySQL server. + +### PreRestore Hook + +Here, we are going to configure `preRestore` hook to delete the corrupted database. Stash will remove the corrupted database first, then it will restore the database from the backup. + +**Create RestoreSession:** + +Below is the YAML for `RestoreSession` with `preRestore` hook configured to drop the `companyRecord` database before restoring from backup. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: pre-restore-hook-demo + namespace: demo +spec: + task: + name: mysql-restore-8.0.14 + repository: + name: gcs-repo + hooks: + preRestore: + exec: + command: + - /bin/sh + - -c + - mysql -u root --password=$MYSQL_ROOT_PASSWORD -e "DROP DATABASE companyRecord;" + containerName: mysql + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mysql + rules: + - snapshots: [latest] +``` + +Let's create the above `RestoreSession`, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/hooks/backup-and-restore-hooks/examples/pre_restore_hook_demo.yaml +restoresession.stash.appscode.com/pre-restore-hook-demo created +``` + +**Wait for Restore to Complete:** + +Now, wait for the restore process to complete, + +```bash +$ kubectl get restoresession -n demo -w +NAME REPOSITORY PHASE AGE +pre-restore-hook-demo gcs-repo Running 10s +pre-restore-hook-demo gcs-repo Running 42s +pre-restore-hook-demo gcs-repo Succeeded 42s +``` + +Here, `RestoreSession` phase `Succeeded` means the restore process has been completed successfully. + +**Verify Restored Data:** + +Verify that the data has been restored successfully, + +```bash +$ kubectl exec -it -n demo sample-mysql-0 -- mysql --user=$MYSQL_USER --password=$MYSQL_PASSWORD -e "SELECT * FROM companyRecord.employee;" +mysql: [Warning] Using a password on the command line interface can be insecure. ++----+----------+--------+ +| id | name | salary | ++----+----------+--------+ +| 1 | John Doe | 5000 | ++----+----------+--------+ +``` + +So, we can see that the data we had deleted from the `employee` table has been restored. + +### PostRestore Hook + +Now, let's consider that you want to perform some migration on the database during the restore process. You want to rename the `employee` table into `salaryRecord` as it holds the employee's salary information. You can configure a `postRestore` hook to perform the task automatically. + +**Drop Old Database:** + +Let's delete the old database `companyRecord` before restoring so that we can verify that the data has been restored from backup. + +```bash +$ kubectl exec -it -n demo sample-mysql-0 -- mysql --user=$MYSQL_USER --password=$MYSQL_PASSWORD -e "DROP DATABASE companyRecord;" +mysql: [Warning] Using a password on the command line interface can be insecure. +``` + +Verify that the database has been deleted, + +```bash +$ kubectl exec -it -n demo sample-mysql-0 -- mysql --user=$MYSQL_USER --password=$MYSQL_PASSWORD -e "SHOW DATABASES;" +mysql: [Warning] Using a password on the command line interface can be insecure. ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| mysql | +| performance_schema | +| postBackupHookTest | +| sys | ++--------------------+ +``` + +**Create RestoreSession:** + +Below is the YAML of the `RestoreSession` with `postRestore` hook configured to rename the `employee` table into `salaryRecord`. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: post-restore-hook-demo + namespace: demo +spec: + task: + name: mysql-restore-8.0.14 + repository: + name: gcs-repo + hooks: + postRestore: + exec: + command: + - /bin/sh + - -c + - mysql -u root --password=$MYSQL_ROOT_PASSWORD -e "RENAME TABLE companyRecord.employee TO companyRecord.salaryRecord;" + containerName: mysql + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mysql + rules: + - snapshots: [latest] +``` + +Let's create the above `RestoreSession`, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/hooks/backup-and-restore-hooks/examples/post_restore_hook_demo.yaml +restoresession.stash.appscode.com/post-restore-hook-demo created +``` + +**Wait for Restore process to Complete:** + +Now, wait for the restore process to complete, + +```bash +$ kubectl get restoresession -n demo post-restore-hook-demo -w +NAME REPOSITORY PHASE AGE +post-restore-hook-demo gcs-repo Running 12s +post-restore-hook-demo gcs-repo Running 29s +post-restore-hook-demo gcs-repo Succeeded 29s +``` + +**Verify Restored Data:** + +Verify that the `companyRecord` database has been restored and the `employee` table has been renamed to `salaryRecord`. + +```bash +$ kubectl exec -it -n demo sample-mysql-0 -- mysql --user=$MYSQL_USER --password=$MYSQL_PASSWORD -e "SHOW TABLES IN companyRecord;" +mysql: [Warning] Using a password on the command line interface can be insecure. ++-------------------------+ +| Tables_in_companyRecord | ++-------------------------+ +| salaryRecord | ++-------------------------+ +``` + +Let's check `salaryRecord` table contains the original data of the `employee` table, + +```bash +$ kubectl exec -it -n demo sample-mysql-0 -- mysql --user=$MYSQL_USER --password=$MYSQL_PASSWORD -e "SELECT * FROM companyRecord.salaryRecord;" +mysql: [Warning] Using a password on the command line interface can be insecure. ++----+----------+--------+ +| id | name | salary | ++----+----------+--------+ +| 1 | John Doe | 5000 | ++----+----------+--------+ +``` + +So, we can see that the `postRestore` hook successfully performed migration on the restored database. + +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo restoresession pre-restore-hook-demo post-restore-hook-demo +kubectl delete -n demo backupconfiguration backup-hook-demo +kubectl delete -n demo repository gcs-repo +kubectl delete -n demo secret gcs-secret +kubectl delete -n demo mysql sample-mysql +``` diff --git a/content/docs/v2024.12.18/guides/hooks/batch-backup/examples/repository.yaml b/content/docs/v2024.12.18/guides/hooks/batch-backup/examples/repository.yaml new file mode 100644 index 0000000000..7354160da4 --- /dev/null +++ b/content/docs/v2024.12.18/guides/hooks/batch-backup/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: /demo/batch-backup/hook-example + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/guides/hooks/batch-backup/examples/wordpress-backup.yaml b/content/docs/v2024.12.18/guides/hooks/batch-backup/examples/wordpress-backup.yaml new file mode 100644 index 0000000000..a8995a297c --- /dev/null +++ b/content/docs/v2024.12.18/guides/hooks/batch-backup/examples/wordpress-backup.yaml @@ -0,0 +1,77 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupBatch +metadata: + name: wordpress-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/3 * * * *" + members: + - target: + alias: db + ref: + apiVersion: apps/v1 + kind: AppBinding + name: wordpress-mysql + task: + name: mysql-backup-8.0.14 + - target: + alias: app + ref: + apiVersion: apps/v1 + kind: Deployment + name: wordpress-deployment + volumeMounts: + - name: web + mountPath: /var/www/html + paths: + - /var/www/html + hooks: + preBackup: + httpPost: + host: hooks.slack.com + path: /services/TXXXXX/BXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXX + port: 443 + scheme: HTTPS + httpHeaders: + - name: Content-Type + value: application/json + body: '{ + "blocks": [ + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "Backup started for *wordpress-backup*.\n *Targets:*\n- deployment/wordpress-deployment\n- mysql/wordpress-mysql" + } + } + ] + }' + postBackup: + httpPost: + host: hooks.slack.com + path: /services/TXXXXX/BXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXX + port: 443 + scheme: HTTPS + httpHeaders: + - name: Content-Type + value: application/json + body: '{ + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "Backup has been completed for *wordpress-backup*." + } + } + ] + }' + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/guides/hooks/batch-backup/examples/wordpress-deployment.yaml b/content/docs/v2024.12.18/guides/hooks/batch-backup/examples/wordpress-deployment.yaml new file mode 100644 index 0000000000..8fb48e262f --- /dev/null +++ b/content/docs/v2024.12.18/guides/hooks/batch-backup/examples/wordpress-deployment.yaml @@ -0,0 +1,60 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: wordpress-pvc + namespace: demo + labels: + app: wordpress +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: wordpress-deployment + namespace: demo + labels: + app: wordpress +spec: + selector: + matchLabels: + app: wordpress + tier: frontend + strategy: + type: Recreate + template: + metadata: + labels: + app: wordpress + tier: frontend + spec: + containers: + - image: wordpress:5.3.2-apache + name: wordpress + env: + - name: WORDPRESS_DB_HOST + value: wordpress-mysql + - name: WORDPRESS_DB_PASSWORD + valueFrom: + secretKeyRef: + name: wordpress-mysql-auth + key: password + - name: WORDPRESS_DB_USER + valueFrom: + secretKeyRef: + name: wordpress-mysql-auth + key: username + ports: + - containerPort: 80 + name: wordpress + volumeMounts: + - name: web + mountPath: /var/www/html + volumes: + - name: web + persistentVolumeClaim: + claimName: wordpress-pvc diff --git a/content/docs/v2024.12.18/guides/hooks/batch-backup/examples/wordpress-mysql.yaml b/content/docs/v2024.12.18/guides/hooks/batch-backup/examples/wordpress-mysql.yaml new file mode 100644 index 0000000000..99f8057a1d --- /dev/null +++ b/content/docs/v2024.12.18/guides/hooks/batch-backup/examples/wordpress-mysql.yaml @@ -0,0 +1,20 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MySQL +metadata: + name: wordpress-mysql + namespace: demo +spec: + version: 8.0.27 + replicas: 1 + storageType: Durable + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + podTemplate: + spec: + args: + - --default-authentication-plugin=mysql_native_password # without this flag the wordpress will not connect with newer version of MySQL + terminationPolicy: WipeOut diff --git a/content/docs/v2024.12.18/guides/hooks/batch-backup/images/notification.png b/content/docs/v2024.12.18/guides/hooks/batch-backup/images/notification.png new file mode 100644 index 0000000000..64a3ab4d4d Binary files /dev/null and b/content/docs/v2024.12.18/guides/hooks/batch-backup/images/notification.png differ diff --git a/content/docs/v2024.12.18/guides/hooks/batch-backup/index.md b/content/docs/v2024.12.18/guides/hooks/batch-backup/index.md new file mode 100644 index 0000000000..15399b8203 --- /dev/null +++ b/content/docs/v2024.12.18/guides/hooks/batch-backup/index.md @@ -0,0 +1,476 @@ +--- +title: Hooks in Batch Backup | Stash +menu: + docs_v2024.12.18: + identifier: backup-batch-hooks + name: BackupBatch Hooks + parent: hooks + weight: 30 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Hooks in Batch Backup + +Stash 0.9.0+ supports taking backup of multiple co-related stateful workloads using a single configuration named `BackupBatch`. Combining with backup hooks, this can be very powerful. For example, you can prepare your application stack before backup to ensure backup integrity or you can send a notification to a webhook (i.e. in a Slack channel via slack incoming webhook) before or after the backup of all the resources of your application stack. + +Here, we are going to demonstrate how to send a notification to a Slack channel before and after the backup of a WordPress application. WordPress application consists of two different workloads. One is for WordPress itself and another for a MySQL database. + +> Note that, this is an advanced concept. If you haven't tried the normal backup restore processes yet, we will recommend to try them first. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). +- Install Stash in your cluster following the steps [here](/docs/v2024.12.18/setup/install/stash/). +- Install [KubeDB](https://kubedb.com) in your cluster following the steps [here](https://kubedb.com/docs/latest/setup/). This step is optional. You can deploy your database using any method you want. We are using KubeDB because KubeDB simplifies many of the difficult or tedious management tasks of running production-grade databases on private and public clouds. +- If you are not familiar with how Stash backup and restore MySQL databases, please check the following guide [here](/docs/v2024.12.18/addons/mysql/overview/). +- Also, if you haven't read about how hooks work in Stash, please check it from [here](/docs/v2024.12.18/guides/hooks/overview/). + +You should be familiar with the following `Stash` concepts: + +- [BackupBatch](/docs/v2024.12.18/concepts/crds/backupbatch/) +- [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) +- [Repository](/docs/v2024.12.18/concepts/crds/repository/) +- [Function](/docs/v2024.12.18/concepts/crds/function/) +- [Task](/docs/v2024.12.18/concepts/crds/task/) +- [AppBinding](/docs/v2024.12.18/concepts/crds/appbinding/) + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +## Prepare Application + +At first, let's deploy a WordPress application. Here, we are going to deploy WordPress `5.3.2` with MySQL `8.0.14`. We are going to deploy the database first. Then, we are going to deploy the Deployment for WordPress once the database is ready. + +### Deploy Database + +Here, we are using KubeDB to deploy MySQL `8.0.14`. You can deploy the database without KubeDB but you have to create some resources manually to ensure it works with Stash. + +**Create MySQL:** + +Below is the YAML of the `MySQL` CR that we are going to create. + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MySQL +metadata: + name: wordpress-mysql + namespace: demo +spec: + version: 8.0.27 + replicas: 1 + storageType: Durable + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + podTemplate: + spec: + args: + - --default-authentication-plugin=mysql_native_password # without this flag wordpress will not connect with newer version of MySQL + terminationPolicy: WipeOut +``` + +>Notice the `spec.podTemplate` part. We are providing `--default-authentication-plugin=mysql_native_password` flag to `mysqd`. Otherwise, WordPress won't be able to connect with this database. + +Let's create the above database, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/hooks/batch-backup/examples/wordpress-mysql.yaml +mysql.kubedb.com/wordpress-mysql created +``` + +KubeDB will deploy a MySQL database according to the above specification. It will also create the necessary Secrets and Services to access the database. + +Wait for the database to go into `Running` state, + +```bash +$ kubectl get mysql -n demo -w +NAME VERSION STATUS AGE +wordpress-mysql 8.0.14 Creating 17s +wordpress-mysql 8.0.14 Running 3m10s +``` + +**Verify Database Secret:** + +Verify that KubeDB has created a Secret for the database. + +```bash +$ kubectl get secret -n demo -l=app.kubernetes.io/instance=wordpress-mysql +NAME TYPE DATA AGE +wordpress-mysql-auth Opaque 2 4m1s +``` + +**Verify AppBinding:** + +KubeDB creates an `AppBinding` CR that holds the necessary information to connect with the database. Verify that the `AppBinding` has been created for the above database: + +```bash +$ kubectl get appbindings -n demo -l=app.kubernetes.io/instance=wordpress-mysql +NAME TYPE VERSION AGE +wordpress-mysql kubedb.com/mysql 8.0.14 2m10s +``` + +### Deploy Wordpress + +Now, let's deploy WordPress itself. Below is the YAML of the respective resources that we are going to create for WordPress. + +```yaml +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: wordpress-pvc + namespace: demo + labels: + app: wordpress +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: wordpress-deployment + namespace: demo + labels: + app: wordpress +spec: + selector: + matchLabels: + app: wordpress + tier: frontend + strategy: + type: Recreate + template: + metadata: + labels: + app: wordpress + tier: frontend + spec: + containers: + - image: wordpress:5.3.2-apache + name: wordpress + env: + - name: WORDPRESS_DB_HOST + value: wordpress-mysql + - name: WORDPRESS_DB_PASSWORD + valueFrom: + secretKeyRef: + name: wordpress-mysql-auth + key: password + - name: WORDPRESS_DB_USER + valueFrom: + secretKeyRef: + name: wordpress-mysql-auth + key: username + ports: + - containerPort: 80 + name: wordpress + volumeMounts: + - name: web + mountPath: /var/www/html + volumes: + - name: web + persistentVolumeClaim: + claimName: wordpress-pvc +``` + +Let's create the above resources, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/hooks/batch-backup/examples/wordpress-deployment.yaml + +persistentvolumeclaim/wordpress-pvc created +deployment.apps/wordpress-deployment created +``` + +Verify that WordPress pod ready + +```bash +$ kubectl get pod -n demo -l=app=wordpress,tier=frontend +NAME READY STATUS RESTARTS AGE +wordpress-deployment-586f94487c-nm8p5 1/1 Running 0 2m26s +``` + +## Prepare for Backup + +Now, let's prepare for the backup. Here, we are going to prepare the backend where we will store our backed up data and we are going to setup a [Slack Incoming Webhook](https://api.slack.com/messaging/webhooks) where we will send the notifications for backup. Configure a Slack incoming webhook following the guides from [here](/docs/v2024.12.18/guides/hooks/slack-notification/). + +### Prepare Backend + +We are going to store our backed up data into a GCS bucket. At first, we need to create a secret with GCS credentials then we need to create a `Repository` CR. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +**Create Storage Secret:** + +Let's create a secret called `gcs-secret` with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat /path/to/downloaded-sa-key.json > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create Repository:** + +Now, create a `Repository` using this secret. Below is the YAML of `Repository` CR we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: /demo/batch-backup/hook-example + storageSecretName: gcs-secret +``` + +Let's create the `Repository` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/hooks/batch-backup/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +## Backup + +Let's schedule a backup for our WordPress application stack. Here, we are going to configure a `preBackup` hook of a `BatchBackup` CR to send a notification when the backup starts and a `postBackup` hook to send another notification when the backup ends. + +**Create BackupBatch:** + +Below is the YAML of the `BackupBatch` CR with `preBackup` and `postBackup` hooks configured to send a notification into a slack channel before and after a backup respectively. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupBatch +metadata: + name: wordpress-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/3 * * * *" + members: + - target: + alias: db + ref: + apiVersion: apps/v1 + kind: AppBinding + name: wordpress-mysql + task: + name: mysql-backup-8.0.14 + - target: + alias: app + ref: + apiVersion: apps/v1 + kind: Deployment + name: wordpress-deployment + volumeMounts: + - name: web + mountPath: /var/www/html + paths: + - /var/www/html + hooks: + preBackup: + httpPost: + host: hooks.slack.com + path: /services/TXXXXX/BXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXX + port: 443 + scheme: HTTPS + httpHeaders: + - name: Content-Type + value: application/json + body: '{ + "blocks": [ + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "Backup started for *wordpress-backup*.\n *Targets:*\n- deployment/wordpress-deployment\n- mysql/wordpress-mysql" + } + } + ] + }' + postBackup: + httpPost: + host: hooks.slack.com + path: /services/TXXXXX/BXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXX + port: 443 + scheme: HTTPS + httpHeaders: + - name: Content-Type + value: application/json + body: '{ + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "Backup has been completed for *wordpress-backup*." + } + } + ] + }' + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Here, we have used `hooks.slack.com` part of the webhook URL in `host` field and the rest of the path in `path` field. + +You can customize the `body` section of `httpPost` hook to change the visual representation of your notification. You can use slack's official [Block Kit Builder](https://api.slack.com/tools/block-kit-builder) to build a beautiful notification layout. + +Let's create the above `BackupBatch` object, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/hooks/batch-backup/examples/wordpress-backup.yaml +backupbatch.stash.appscode.com/wordpress-backup created +``` + +### Verify CronJob + +If everything goes well, Stash will create a CronJob with the schedule specified in `spec.schedule` field of the `BackupBatch` CR. + +```bash +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-wordperss-backup */3 * * * * False 0 27s +``` + +### Wait for BackupSession + +The `stash-backup-wordpress-backup` CronJob will trigger a backup on each scheduled slot by creating a `BackupSession` CR. + +Wait for a schedule to appear. Run the following command to watch `BackupSession` CR, + +```bash +$ kubectl get backupsession -n demo -w +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +wordpress-backup-1579526461 BackupBatch wordpress-backup Running 0s +wordpress-backup-1579526461 BackupBatch wordpress-backup Running 24s +wordpress-backup-1579526461 BackupBatch wordpress-backup Running 37s +wordpress-backup-1579526461 BackupBatch wordpress-backup Succeeded 38s +``` + +Here, the phase `Succeeded` means that the backup process has been completed successfully. + +### Verify Backup + +Once a backup is completed, Stash will update the respective `Repository` CR to reflect the backup completion. Check that the repository `gcs-repo` has been updated by the following command, + +```bash +$ kubectl get repository -n demo gcs-repo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo true 2 72s 18m +``` + +Here, `SNAPSHOT-COUNT` 2 indicates that one snapshot for each target has been taken successfully. + +### Verify Backup Hooks Executed + +Now, go to your slack channel. You should see that Stash has sent notification before and after the backup of WordPress application. + +
+  Backup Notification +
+ +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl -n demo delete backupbatch wordpress-backup +kubectl -n demo delete repository gcs-repo +kubectl -n demo delete secret gcs-secret + +kubectl -n demo delete deployment wordpress-deployment +kubectl -n demo delete mysql wordpress-mysql +``` diff --git a/content/docs/v2024.12.18/guides/hooks/configuring-hooks/index.md b/content/docs/v2024.12.18/guides/hooks/configuring-hooks/index.md new file mode 100644 index 0000000000..520b6a2bfc --- /dev/null +++ b/content/docs/v2024.12.18/guides/hooks/configuring-hooks/index.md @@ -0,0 +1,282 @@ +--- +title: Hooks Examples | Stash +menu: + docs_v2024.12.18: + identifier: configuring-hooks + name: Configuring Hooks + parent: hooks + weight: 40 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Configuring Different Types of Hooks + +In this guide, we are going to discuss how to configure different types of hooks. Here, we will give some examples of different configurations. + +## HTTPGet + +`httpGet` hook allows sending an HTTP GET request to an HTTP server before and after the backup/restore process. The following configurable fields are available for `httpGet` hook. + +| Field | Field Type | Data Type | Usage | +| ------------- | ---------- | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `host` | `Optional` | `String` | Specify the name of the host where the GET request will be sent. If you don't specify this field, Stash will use the hook executor Pod IP as host. | +| `port` | `Required` | `Integer` or `String` | Specify the port where the HTTP server is listening. You can specify a numeric port or the name of the port in case of the HTTP server is running in the same pod where the hook will be executed. If you specify the port name, you must specify the `containerName` field of the hook. | +| `path` | `Required` | `String` | Specify the path to access on the HTTP server. | +| `scheme` | `Required` | `String` | Specify the scheme to use to connect with the host. | +| `httpHeaders` | `Optional` | Array of Objects | Specify a list of custom headers to set in the request. | + +**Examples:** + +- Hook with `host` and `port` are specified: + +```yaml +preBackup: + httpGet: + host: my-host.demo.svc + port: 8080 + path: "/" + scheme: HTTP +``` + +- Hook to extract `host` and `port` from the hook executor pod: + +```yaml +preBackup: + httpGet: + port: my-port + path: "/" + scheme: HTTP + containerName: my-container +``` + +- Hook for sending custom header in the HTTP request: + +```yaml +preBackup: + httpGet: + host: my-host.demo.svc + port: 8080 + path: "/" + scheme: HTTP + httpHeaders: + - name: "User-Agent" + value: "stash/0.9.x" +``` + +## HTTPPost + +`httpPost` hook allows sending an HTTP POST request to an HTTP server before and after the backup/restore process. The following configurable fields are available for `httpPost` hook. + +| Field | Field Type | Data Type | Usage | +| ------------- | ---------- | --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `host` | `Optional` | `String` | Specify the name of the host where the POST request will be sent. If you don't specify this field, Stash will use the hook executor Pod IP as host. | +| `port` | `Required` | `Integer` or `String` | Specify the port where the HTTP server is listening. You can specify a numeric port or the name of the port if your HTTP server is running in the same pod where the hook will be executed. If you specify the port name, you must specify the `containerName` field of the hook. | +| `path` | `Required` | `String` | Specify the path to access on the HTTP server. | +| `scheme` | `Required` | `String` | Specify the scheme to use to connect with the host. | +| `httpHeaders` | `Optional` | Array of Objects | Specify a list of custom headers to set in the request. | +| `body` | `Optional` | `String` | Specify the data to send in the request body. | +| `form` | `Optional` | Array of Objects | Specify the data to send as URL encoded form with the request. | + +**Examples:** + +- Send JSON data in the request body: + +```yaml +preBackup: + httpPost: + host: my-service.mynamespace.svc + path: /demo + port: 8080 + scheme: HTTP + httpHeaders: + - name: Content-Type + value: application/json + body: '{ + "name": "john doe", + "age": "28" + }' +``` + +- Send URL encoded form in the request: + +```yaml +preBackup: + httpPost: + host: my-service.mynamespace.svc + path: /demo + port: 8080 + scheme: HTTP + form: + - key: "name" + values: ["john doe"] + - key: "age" + values: ["28"] +``` + +## TCPSocket + +`tcpSocket` hook allows running a check against a TCP port to verify whether it is open or not. The following configurable fields are available for `tcpSocket` hook. + +| Field | Field Type | Data Type | Usage | +| ------ | ---------- | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `host` | `Optional` | `String` | Specify the name of the host where the server is running. If you don't specify this field, Stash will use the hook executor Pod IP as host. | +| `port` | `Required` | `Integer` or `String` | Specify the port to check. You can specify a numeric port or the name of the port when your server is running in the same pod where the hook will be executed. If you specify the port name, you must specify the `containerName` field of the hook. | + +**Examples:** + +- Hook with `host` and `port` field specified. + +```yaml +preBackup: + tcpSocket: + host: my-host.demo.svc + port: 8080 +``` + +- Hook to extract `host` and `port` from the hook executor pod. + +```yaml +preBackup: + tcpSocket: + port: my-port + containerName: my-container +``` + +## Exec + +`exec` hook allows running commands inside a container before or after the backup/restore process. The following configurable fields are available for `exec` hook. + +| Field | Field Type | Data Type | Usage | +| --------- | ---------- | ---------------- | -------------------------------------- | +| `command` | `Required` | Array of Strings | Specify a list of commands to execute. | + +> If you don't specify `containerName` for `exec` hook, the command will be executed into the 0th container of the respective pod. + +**Examples:** + +- Hook to remove old corrupted data before restore: + +```yaml +preRestore: + exec: + command: ["/bin/sh","-c","rm -rf /corrupted/data/directory"] + containerName: my-container +``` + +- Hook to make a MySQL database read-only before backup: + +```yaml +preBackup: + exec: + command: + - /bin/sh + - -c + - mysql -u root --password=$MYSQL_ROOT_PASSWORD -e "SET GLOBAL super_read_only = ON;" + containerName: mysql +``` + +- Hook to make a MySQL database writable after backup: + +```yaml +postBackup: + exec: + command: + - /bin/sh + - -c + - mysql -u root --password=$MYSQL_ROOT_PASSWORD -e "SET GLOBAL super_read_only = OFF;" + containerName: mysql +``` + +- Hook to remove corrupted MySQL database before restoring: + +```yaml +preRestore: + exec: + command: + - /bin/sh + - -c + - mysql -u root --password=$MYSQL_ROOT_PASSWORD -e "DROP DATABASE companyRecord;" + containerName: mysql +``` + +- Hook to apply some migration after restoring a MySQL database: + +```yaml +postRestore: + exec: + command: + - /bin/sh + - -c + - mysql -u root --password=$MYSQL_ROOT_PASSWORD -e "RENAME TABLE companyRecord.employee TO companyRecord.salaryRecord;" + containerName: mysql +``` + +If the above hooks do not cover your use cases or you have any questions regarding the hooks, please feel free to open an issue [here](https://github.com/stashed/stash/issues). diff --git a/content/docs/v2024.12.18/guides/hooks/overview/images/batch-backup.svg b/content/docs/v2024.12.18/guides/hooks/overview/images/batch-backup.svg new file mode 100644 index 0000000000..c9c8b9d23c --- /dev/null +++ b/content/docs/v2024.12.18/guides/hooks/overview/images/batch-backup.svg @@ -0,0 +1,721 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/guides/hooks/overview/images/job-model.svg b/content/docs/v2024.12.18/guides/hooks/overview/images/job-model.svg new file mode 100644 index 0000000000..d198f850a3 --- /dev/null +++ b/content/docs/v2024.12.18/guides/hooks/overview/images/job-model.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/hooks/overview/images/sidecar-model.svg b/content/docs/v2024.12.18/guides/hooks/overview/images/sidecar-model.svg new file mode 100644 index 0000000000..8f1a9fdbe5 --- /dev/null +++ b/content/docs/v2024.12.18/guides/hooks/overview/images/sidecar-model.svg @@ -0,0 +1,290 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/guides/hooks/overview/index.md b/content/docs/v2024.12.18/guides/hooks/overview/index.md new file mode 100644 index 0000000000..2214c1312d --- /dev/null +++ b/content/docs/v2024.12.18/guides/hooks/overview/index.md @@ -0,0 +1,237 @@ +--- +title: Hooks Overview | Stash +menu: + docs_v2024.12.18: + identifier: hooks-overview + name: Overview + parent: hooks + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash Backup and Restore Hooks + +Stash `v0.9.0+` supports executing custom commands before and after backup or restore process. This is called `hook` in Stash. This guide will give you an overview of what kind of hooks you can execute, how the hooks get executed, and how the hooks behave in different scenarios. + +## Types of Hooks + +We can categorize Stash backup and restore hooks based on the action they perform and based on their execution order. + +### Based on Action + +Based on the action of a hook, we can categorize them into four different categories. These are the followings: + +- **HTTPGet:** Executes an HTTP GET request before/after the backup/restore process. The hook is considered successful if the return code is between `200` and `400`. + +- **HTTPPost:** Executes an HTTP POST request before/after the backup/restore process. Like `HTTPGet`, the hook is considered successful if the return code is between `200` and `400`. + +- **TCPSocket:** Performs a TCP check against the provided URL on a specific port before/after the backup/restore process. The hook is considered successful if the targeted port is open. + +- **Exec:** Executes commands inside a targeted container before/after the backup/restore process. The hook is considered successful if the command executes with exit code 0. + +### Execution Phases + +Based on the execution order, we can categorize the hooks into two different phases. These are the followings: + +- **Pre-Task Hook:** Pre task hooks are executed before the backup or restore process. `preBackup` and `preRestore` are the pre-task hooks. + +- **Post-Task Hook:** Post task hooks are executed after the backup or restore process. `postBackup` and `postRestore` are the post-task hooks. + +However, there is one more type of hooks for [BackupBatch](/docs/v2024.12.18/concepts/crds/backupbatch/) object. We call them **Global Hooks**. They get executed before any other individual target's hooks get executed (for the pre-task hooks) or after all the individual target's hooks has executed (for the post-task hooks). + +## Who Executes the Hooks + +You might be familiar that Stash uses two different models to take backup of the target based on their type. For Kubernetes workloads (i.e. Deployment, DaemonSet, StatefulSet etc.), Stash injects a sidecar into the workload that takes backup. However, for databases and standalone PVC backup, Stash creates a job for the task. The hooks are executed differently for these two different models. + +Furthermore, we have introduced [BackupBatch](/docs/v2024.12.18/concepts/crds/backupbatch/) which allows to specify multiple target simultaneously. The individual targets may follow the sidecar model or the job model. The `BackupBatch` object allows specifying a global hook for all the targets as well as some local hooks for individual targets. This type of hooks also handled differently. + +Here, we are going to discuss how Stash executes the hooks in different scenarios. + +- **Sidecar Model:** In sidecar model, hooks are executed by the backup sidecar or restore init-container. The hook execution flow by sidecar/init-container is shown in the following diagram: + +
+   Hook Execution flow in sidecar model +
Fig: Hook Execution flow in sidecar model
+
+ +- **Job Model:** In the Job model, the hooks are run by the backup/restore job. For the `exec` hook, the command is executed inside the targeted application pod. In order to determine the targeted application pod, Stash uses the `Service` specified in the respective `AppBinding` CRD. It first determines the endpoints of the Service. Then, it executes the hook into one of the pod pointed by those endpoints. Hence, if the `AppBinding` points to an external URL, it is not possible for Stash to execute the hook. The hook execution flow in job model is shown in the following diagram: + +
+   Hook Execution flow in job model +
Fig: Hook Execution flow in job model
+
+ +> Note: If the postBackup hook doesn't run (e.g., because of a timeout, backup disruption, etc.), the Stash operator will handle it instead of the backup job. However, if the preBackup hook is configured but doesn’t execute or fails the postBackup hook will not be run. + +- **Batch Backup:** In batch backup using `BackupBatch` object, the global hooks are executed by the Stash operator itself. When Stash operator completes executing the global pre-task hook, the individual targets start executing their local pre-task hook. Then, they complete their backup process and executes their local post-task hook. Finally, the Stash operator executes global post-task hooks. The hook execution flow in batch backup is shown in the following diagram: + +
+  Hook Execution flow in batch backup +
Fig: Hook Execution flow in batch backup
+
+ +## Hook's Behaviors + +Now, we are going to discuss what will happen when a hook fails or backup/restore process fails. + +### `preBackup` or `preRestore` hook + +If a `preBackup` or `preRestore` hook fails to execute, the rest of the backup/restore process will be skipped and the respective `BackupSession`/`RestoreSession` will be marked as `Failed`. You may see the following things happen in addition to skipping the backup process: + +- **Backup Sidecar:** If the `preBackup` hook fails in the backup sidecar, the sidecar will just log the failure and continue watching for `BackupSession` for the next backup. +- **Restore Init-Container:** If the `preRestore` hook fails in restore init-container, the container will crash. Hence, your workload will be stuck in the initialization phase. +- **Backup or Restore Job:** If the `preBackup` or `preRestore` hook fails in backup/restore job, the container will fail. Hence, the job will never go into completed stage. You may see the job creating multiple pods to retry. + +### `postBackup` or `postRestore` hook + +If the backup or restore process fails then the respective `postBackup` or `postRestore` hook will be executed according to the policy specified in the `executionPolicy` field of the respective hook. The current acceptable values and behaviors are: + +- `Always`: The hook will be executed after the backup/restore process no matter the backup/restore has failed or succeeded. This is the default behavior. +- `OnSuccess`: The hook will be executed after the backup/restore process only if the backup/restore has succeeded. +- `OnFailure`: The hook will be executed after the backup/restore process only if the backup/restore has failed. +- `OnFinalRetryFailure`: The hook will be executed after the backup process only if the backup has failed with no more retry attempts left. + +In case of backup job, if the postBackup hook container doesn't run for any reason, the postBackup hook is executed by the Stash operator instead of the backup job (if targeted application is not `AppBinding`). For `AppBinding`, hook is executed in the targeted application pod. + +If the `postBackup` or `postRestore` hook fails, the respective BackupSession or RestoreSession will be marked as `Failed`. + +## Templating Support in Hook + +Stash support [Go template](https://pkg.go.dev/text/template) in hook. This is particularly helpful when you want to send custom message to a Slack webhook with information about the backup/restore session. + +Stash exposes a summary for a backup/restore process. The Go template variables are then resolved from the summary. Here, is an example of a summary exposed by Stash: + +```json +{ + "name": "deployment-backup-1646741400", + "namespace": "demo", + "invoker":{ + "apiGroup": "stash.appscode.com", + "kind": "BackupConfiguration", + "name": "deployment-backup" + }, + "target":{ + "apiVersion": "apps/v1", + "kind": "Deployment", + "name": "stash-demo" + }, + "status":{ + "phase": "Failed", + "duration": "10s", + "error": "failed to backup host-0. Reason: path not found" + } +} +``` + +The summary contains the following fields: + +- **name:** Name of the respective BackupSession or RestoreSession. You can access it in your template as `.Name` variable. +- **namespace:** Namespace of the respective BackupSession or RestoreSession. You can access it in your template as `.Namespace` variable. +- **invoker:** Contains the respective BackupConfiguration or RestoreSession information which is responsible for triggering this backup or restore process. It has the following fields: + - **apiVersion:** API version of the invoker. You can access it in your template as `.Invoker.ApiVersion` variable. + - **kind:** Kind of the invoker. You can access it in your template as `.Invoker.Kind` variable. + - **name:** Name of the invoker. You can access it in your template as `.Invoker.Name` variable. + +- **target:** Contains respective backup/restore target information. It has the following fields: + - **apiVersion:** API version of the target. You can access it in your template as `.Target.ApiVersion` variable. + - **kind:** Kind of the target. You can access it in your template as `.Target.Kind` variable. + - **name:** Name of the target. You can access it in your template as `.Target.Name` variable. + +- **status:** Specifies the backup/restore status. It has the following fields: + - **phase:** Phase of the backup/restore process. You can access it in your template as `.Status.Phase` variable. + - **duration:** Specifies how long it took to complete the backup/restore process. You can access it in your template as `Status.Duration` variable. + - **error:** If the backup/restore process fail, this field contains the reason why it failed. You can access it in your template as `.Status.Error` variable. + +Below is an example of using Go template in hook. Here, we are sending a message to a slack incoming webhook if the backup process fails. + +```yaml +hooks: + postBackup: + executionPolicy: OnFailure + httpPost: + host: hooks.slack.com + path: /services/XX/XXX/XXXX + port: 443 + scheme: HTTPS + httpHeaders: + - name: Content-Type + value: application/json + body: | + {{- $msg := dict "type" "mrkdwn" "text" (printf ":x: Backup failed for %s/%s Reason: %s." .Namespace .Target.Name .Status.Error) -}} + { + "blocks": [ + { + "type": "section", + "text": {{ toJson $msg }} + } + ] + } +``` diff --git a/content/docs/v2024.12.18/guides/hooks/slack-notification/examples/all_backup_notification.yaml b/content/docs/v2024.12.18/guides/hooks/slack-notification/examples/all_backup_notification.yaml new file mode 100644 index 0000000000..61c6ebba8d --- /dev/null +++ b/content/docs/v2024.12.18/guides/hooks/slack-notification/examples/all_backup_notification.yaml @@ -0,0 +1,44 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + hooks: + postBackup: + executionPolicy: Always + httpPost: + host: hooks.slack.com + path: /services/XX/XXX/XXXX + port: 443 + scheme: HTTPS + httpHeaders: + - name: Content-Type + value: application/json + body: | + {{- $msg := dict "type" "mrkdwn" "text" (printf "Backup completed for %s/%s Status: %s." .Namespace .Target.Name .Status.Phase) -}} + { + "blocks": [ + { + "type": "section", + "text": {{ toJson $msg }} + } + ] + } + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/guides/hooks/slack-notification/examples/deployment.yaml b/content/docs/v2024.12.18/guides/hooks/slack-notification/examples/deployment.yaml new file mode 100644 index 0000000000..c6d57ee0b1 --- /dev/null +++ b/content/docs/v2024.12.18/guides/hooks/slack-notification/examples/deployment.yaml @@ -0,0 +1,44 @@ +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: stash-sample-data + namespace: demo +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-demo + name: stash-demo + namespace: demo +spec: + replicas: 1 + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - args: ["sleep 3000"] + command: ["/bin/sh", "-c"] + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + persistentVolumeClaim: + claimName: stash-sample-data diff --git a/content/docs/v2024.12.18/guides/hooks/slack-notification/examples/failed_backup_notification.yaml b/content/docs/v2024.12.18/guides/hooks/slack-notification/examples/failed_backup_notification.yaml new file mode 100644 index 0000000000..9a4968f0c9 --- /dev/null +++ b/content/docs/v2024.12.18/guides/hooks/slack-notification/examples/failed_backup_notification.yaml @@ -0,0 +1,44 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /path/does/not/exist + hooks: + postBackup: + executionPolicy: OnFailure + httpPost: + host: hooks.slack.com + path: /services/XX/XXX/XXXX + port: 443 + scheme: HTTPS + httpHeaders: + - name: Content-Type + value: application/json + body: | + {{- $msg := dict "type" "mrkdwn" "text" (printf ":x: Backup failed for %s/%s Reason: %s." .Namespace .Target.Name .Status.Error) -}} + { + "blocks": [ + { + "type": "section", + "text": {{ toJson $msg }} + } + ] + } + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/guides/hooks/slack-notification/examples/repository.yaml b/content/docs/v2024.12.18/guides/hooks/slack-notification/examples/repository.yaml new file mode 100644 index 0000000000..af2c76e664 --- /dev/null +++ b/content/docs/v2024.12.18/guides/hooks/slack-notification/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /webinar/slack-notification + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/guides/hooks/slack-notification/examples/restoresession.yaml b/content/docs/v2024.12.18/guides/hooks/slack-notification/examples/restoresession.yaml new file mode 100644 index 0000000000..bbb7cf87f4 --- /dev/null +++ b/content/docs/v2024.12.18/guides/hooks/slack-notification/examples/restoresession.yaml @@ -0,0 +1,41 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: deployment-restore + namespace: demo +spec: + repository: + name: gcs-repo + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + rules: + - paths: + - /source/data/ + # - /path/does/not/exist + hooks: + postRestore: + executionPolicy: OnFailure + httpPost: + host: hooks.slack.com + path: /services/XX/XXX/XXXX + port: 443 + scheme: HTTPS + httpHeaders: + - name: Content-Type + value: application/json + body: | + {{- $msg := dict "type" "mrkdwn" "text" (printf ":x: Restore failed for %s/%s Reason: %s." .Namespace .Target.Name .Status.Error) -}} + { + "blocks": [ + { + "type": "section", + "text": {{ toJson $msg }} + } + ] + } diff --git a/content/docs/v2024.12.18/guides/hooks/slack-notification/images/all_notification.png b/content/docs/v2024.12.18/guides/hooks/slack-notification/images/all_notification.png new file mode 100644 index 0000000000..44d5bb6ac3 Binary files /dev/null and b/content/docs/v2024.12.18/guides/hooks/slack-notification/images/all_notification.png differ diff --git a/content/docs/v2024.12.18/guides/hooks/slack-notification/images/failed_notification.png b/content/docs/v2024.12.18/guides/hooks/slack-notification/images/failed_notification.png new file mode 100644 index 0000000000..592f75f787 Binary files /dev/null and b/content/docs/v2024.12.18/guides/hooks/slack-notification/images/failed_notification.png differ diff --git a/content/docs/v2024.12.18/guides/hooks/slack-notification/images/step_1.png b/content/docs/v2024.12.18/guides/hooks/slack-notification/images/step_1.png new file mode 100644 index 0000000000..13561b88af Binary files /dev/null and b/content/docs/v2024.12.18/guides/hooks/slack-notification/images/step_1.png differ diff --git a/content/docs/v2024.12.18/guides/hooks/slack-notification/images/step_2.png b/content/docs/v2024.12.18/guides/hooks/slack-notification/images/step_2.png new file mode 100644 index 0000000000..85c79b4f56 Binary files /dev/null and b/content/docs/v2024.12.18/guides/hooks/slack-notification/images/step_2.png differ diff --git a/content/docs/v2024.12.18/guides/hooks/slack-notification/images/step_3.png b/content/docs/v2024.12.18/guides/hooks/slack-notification/images/step_3.png new file mode 100644 index 0000000000..6b34ffd028 Binary files /dev/null and b/content/docs/v2024.12.18/guides/hooks/slack-notification/images/step_3.png differ diff --git a/content/docs/v2024.12.18/guides/hooks/slack-notification/images/step_4.png b/content/docs/v2024.12.18/guides/hooks/slack-notification/images/step_4.png new file mode 100644 index 0000000000..079c877355 Binary files /dev/null and b/content/docs/v2024.12.18/guides/hooks/slack-notification/images/step_4.png differ diff --git a/content/docs/v2024.12.18/guides/hooks/slack-notification/images/step_5.png b/content/docs/v2024.12.18/guides/hooks/slack-notification/images/step_5.png new file mode 100644 index 0000000000..4609e57df8 Binary files /dev/null and b/content/docs/v2024.12.18/guides/hooks/slack-notification/images/step_5.png differ diff --git a/content/docs/v2024.12.18/guides/hooks/slack-notification/images/step_6.png b/content/docs/v2024.12.18/guides/hooks/slack-notification/images/step_6.png new file mode 100644 index 0000000000..ef981ffc2d Binary files /dev/null and b/content/docs/v2024.12.18/guides/hooks/slack-notification/images/step_6.png differ diff --git a/content/docs/v2024.12.18/guides/hooks/slack-notification/images/step_7.png b/content/docs/v2024.12.18/guides/hooks/slack-notification/images/step_7.png new file mode 100644 index 0000000000..0a85361d30 Binary files /dev/null and b/content/docs/v2024.12.18/guides/hooks/slack-notification/images/step_7.png differ diff --git a/content/docs/v2024.12.18/guides/hooks/slack-notification/images/step_8.png b/content/docs/v2024.12.18/guides/hooks/slack-notification/images/step_8.png new file mode 100644 index 0000000000..40bac914be Binary files /dev/null and b/content/docs/v2024.12.18/guides/hooks/slack-notification/images/step_8.png differ diff --git a/content/docs/v2024.12.18/guides/hooks/slack-notification/index.md b/content/docs/v2024.12.18/guides/hooks/slack-notification/index.md new file mode 100644 index 0000000000..c237526c61 --- /dev/null +++ b/content/docs/v2024.12.18/guides/hooks/slack-notification/index.md @@ -0,0 +1,470 @@ +--- +title: Sending Backup Notification to Slack | Stash +menu: + docs_v2024.12.18: + identifier: hoooks-slack-notification + name: Slack Notification + parent: hooks + weight: 25 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Sending Backup Notification to Slack Channel + +In this guide, we are going to show you how to send backup notifications to a Slack channel. Here, we are going to use [Slack Incoming Webook](https://api.slack.com/messaging/webhooks) to send the notification. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). +- Install Stash in your cluster following the steps [here](/docs/v2024.12.18/setup/install/stash/). +- If you haven't read about how hooks work in Stash, please check it from [here](/docs/v2024.12.18/guides/hooks/overview/). + +You should be familiar with the following `Stash` concepts: + +- [BackupBatch](/docs/v2024.12.18/concepts/crds/backupbatch/) +- [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) +- [Repository](/docs/v2024.12.18/concepts/crds/repository/) +- [Function](/docs/v2024.12.18/concepts/crds/function/) +- [Task](/docs/v2024.12.18/concepts/crds/task/) + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +## Configure Slack Incoming Webhook + +At first, let's configure a Slack incoming webhook. We are going to send the notifications to a channel named `notification-test`. Now, follow the steps below: + +- Go to https://api.slack.com/messaging/webhooks and click the `Create an app` button as highlighted in the red rectangle in the following image. + +
+ Step 1 +
+ +- We are going to build a new app. So, select the `From scratch` option as below. + +
+ Step 2 +
+ +- Now, give your app a name and select your workspace. + +
+ Step 3 +
+ +- Then, select your application type as `Incoming Webhooks`. + +
+ Step 4 +
+ +- Now, activate your incoming webhook. + +
+ Step 5 +
+ +- Scroll down and click on the `Add New Webhook to Workspace` button. + +
+ Step 6 +
+ +- Now, select your desired Slack channel where you want to send the notifications. Then, click on the `Allow` button. + +
+ Step 7 +
+ +- Finally, copy the webhook path starting from `/service/****`. We will use this path in our hook specification. + +
+ Step 8 +
+ +Our Slack incoming webhook is ready to receive notifications. In the next section, we are going to configure a Stash webhook to send backup notifications to this incoming webhook. + +## Prepare Application + +Now, let's deploy a sample application and generate some sample data for it. Here, is the YAML of a Deployment along with its PVC that we are going to deploy: + +```yaml +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: stash-sample-data + namespace: demo +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-demo + name: stash-demo + namespace: demo +spec: + replicas: 1 + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - args: ["sleep 3000"] + command: ["/bin/sh", "-c"] + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + persistentVolumeClaim: + claimName: stash-sample-data +``` + +Let's deploy the above deployment. + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/hooks/slack-notification/examples/deployment.yaml +persistentvolumeclaim/stash-sample-data created +deployment.apps/stash-demo created +``` + +Once the deployment is running, lets exec into its pod and create some sample file in `/source/data` directory. + +```bash +❯ kubectl exec -n demo stash-demo-669d77dfc4-nhdgg -- touch /source/data/file-1.txt +❯ kubectl exec -n demo stash-demo-669d77dfc4-nhdgg -- touch /source/data/file-2.txt +❯ kubectl exec -n demo stash-demo-669d77dfc4-nhdgg -- touch /source/data/file-3.txt +``` + +Let's verify that the files have been created successfully: + +```bash +❯ kubectl exec -n demo stash-demo-669d77dfc4-nhdgg -- ls /source/data +file-1.txt +file-2.txt +file-3.txt +``` + +Our application is ready with some sample data. In the next section, we are going to setup a backup for this application. + +## Prepare Backend + +We are going to store our backed-up data into a GCS bucket. At first, we need to create a secret with GCS credentials then we need to create a `Repository` CR. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +**Create Storage Secret:** + +Let's create a secret called `gcs-secret` with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat /path/to/downloaded-sa-key.json > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create Repository:** + +Now, create a `Repository` using this secret. Below is the YAML of Repository CR we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /webinar/slack-notification + storageSecretName: gcs-secret +``` + +Let's create the `Repository` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/hooks/slack-notification/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our application into our desired backend. + +## Backup + +In this section, we are going to setup a backup for the application we deployed earlier. We are going to configure a `postBackup` hook to send a notification to our Slack incoming webhook when a backup session completes. + +Here, is the YAML of the BackupConfiguration that we are going to create: + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + hooks: + postBackup: + executionPolicy: Always + httpPost: + host: hooks.slack.com + path: /services/XX/XXX/XXXX + port: 443 + scheme: HTTPS + httpHeaders: + - name: Content-Type + value: application/json + body: | + {{- $msg := dict "type" "mrkdwn" "text" (printf "Backup completed for %s/%s Status: %s." .Namespace .Target.Name .Status.Phase) -}} + { + "blocks": [ + { + "type": "section", + "text": {{ toJson $msg }} + } + ] + } + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Notice the `hooks` section. We have setup a `postBackup` hook which sends an HTTP POST request. In the `path` field of the `httpPost` section, we have specified the Slack incoming webhook path that we copied in the last step of configuring Slack incoming webhook. + +Also, notice the `body` field of the `httpPost` section. We have used Go template to include information about the backup target and status. + +Let's create the BackupConfiguration we have shown above, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/hooks/slack-notification/examples/all_backup_notification.yaml +backupconfiguration.stash.appscode.com/deployment-backup created +``` + +**Wait for BackupSession:** + +Now, let's wait for a BackupSession. Run the following command to watch for BackupSession. + +```bash +❯ kubectl get backupsession --all-namespaces -w +NAMESPACE NAME INVOKER-TYPE INVOKER-NAME PHASE DURATION AGE +demo deployment-backup-1650277200 BackupConfiguration deployment-backup 0s +demo deployment-backup-1650277200 BackupConfiguration deployment-backup Pending 0s +demo deployment-backup-1650277200 BackupConfiguration deployment-backup Running 0s +demo deployment-backup-1650277200 BackupConfiguration deployment-backup Succeeded 31s 30s +``` + +We can see from the above output that the backup session has succeeded. + +**Verify Notification:** + +Now, if we go to the Slack channel we have configured for notification. We should see a notification similar to this: + +
+ Successfull backup notification +
+ +### Sending Only Backup Failure Notification + +We can also use the `executionPolicy` to send notification only for the failed backups. Check the following BackupConfiguration: + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /path/does/not/exist + hooks: + postBackup: + executionPolicy: OnFailure + httpPost: + host: hooks.slack.com + path: /services/XX/XXX/XXXX + port: 443 + scheme: HTTPS + httpHeaders: + - name: Content-Type + value: application/json + body: | + {{- $msg := dict "type" "mrkdwn" "text" (printf ":x: Backup failed for %s/%s Reason: %s." .Namespace .Target.Name .Status.Error) -}} + { + "blocks": [ + { + "type": "section", + "text": {{ toJson $msg }} + } + ] + } + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Here, we have provided an invalid path in the `paths` field of the `target` section. This will force the backup to fail. + +Notice that, this time we have specified the `executionPolicy` field to `OnFailure`. This will tell Stash to send the notification only if the backup fail. In the message body, we have included information about target and reason of failure. + +Let's apply the above BackupConfiguration: + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/hooks/slack-notification/examples/failed_backup_notification.yaml +backupconfiguration.stash.appscode.com/deployment-backup configured +``` + +**Wait for BackupSession:** + +Again, let's wait for a scheduled backup. Run the following command to watch for a BackupSession: + +```bash +❯ kubectl get backupsession --all-namespaces -w +NAMESPACE NAME INVOKER-TYPE INVOKER-NAME PHASE DURATION AGE +demo deployment-backup-1650277554 BackupConfiguration deployment-backup 0s +demo deployment-backup-1650277554 BackupConfiguration deployment-backup Pending 0s +demo deployment-backup-1650277554 BackupConfiguration deployment-backup Running 5s +demo deployment-backup-1650277554 BackupConfiguration deployment-backup Failed 6s 5s +``` + +As we can see that the backup has failed this time. Let's verify the failure notification. + +**Verify Notification:** + +If we go to the Slack channel, we should see a new notification has been sent. This time it indicates a failure and also contains the failure reason. + +
+ Failed backup notification +
+ +## Cleanup + +To clean up the test resources we have created throughout this tutorial, run the following commands: + +```bash +# Delete BackupConfiguration +kubectl delete backupconfiguration -n demo deployment-backup +# Delete Repository +kubectl delete repository -n demo gcs-repo +# Delete storage Secret +kubectl delete secret -n demo gcs-secret + +# Delete Deployment and it's PVC +kubectl delete deployment -n demo stash-demo +kubectl delete pvc -n demo stash-sample-data +``` diff --git a/content/docs/v2024.12.18/guides/managed-backup/_index.md b/content/docs/v2024.12.18/guides/managed-backup/_index.md new file mode 100644 index 0000000000..9bc4b73d42 --- /dev/null +++ b/content/docs/v2024.12.18/guides/managed-backup/_index.md @@ -0,0 +1,77 @@ +--- +title: Managed Backup | Stash +menu: + docs_v2024.12.18: + identifier: managed-backup + name: Managed Backup + parent: guides + weight: 85 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace-auto-backup/examples/backup-bluprint.yaml b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace-auto-backup/examples/backup-bluprint.yaml new file mode 100644 index 0000000000..85e318c720 --- /dev/null +++ b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace-auto-backup/examples/backup-bluprint.yaml @@ -0,0 +1,21 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupBlueprint +metadata: + name: mysql-backup +spec: + backupNamespace: backup + # ============== Blueprint for Repository ========================== + backend: + gcs: + bucket: stash-testing + prefix: stash-backup/${TARGET_NAMESPACE}/${TARGET_NAME} + storageSecretName: gcs-secret + # ============== Blueprint for BackupConfiguration ================= + schedule: "*/5 * * * *" + retentionPolicy: + name: "keep-last-5" + keepLast: 5 + prune: true + runtimeSettings: + pod: + serviceAccountName: cross-namespace-target-reader diff --git a/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace-auto-backup/examples/clusterrole_clusterrolebinding.yaml b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace-auto-backup/examples/clusterrole_clusterrolebinding.yaml new file mode 100644 index 0000000000..4ad52fe5b6 --- /dev/null +++ b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace-auto-backup/examples/clusterrole_clusterrolebinding.yaml @@ -0,0 +1,24 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: cross-namespace-target-reader +rules: + - apiGroups: [""] + resources: ["secrets","pods","endpoints"] + verbs: ["get", "list"] + - apiGroups: ["appcatalog.appscode.com"] + resources: ["appbindings"] + verbs: ["get", "list"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: cross-namespace-target-reader +subjects: + - kind: ServiceAccount + name: cross-namespace-target-reader + namespace: backup +roleRef: + kind: ClusterRole + name: cross-namespace-target-reader + apiGroup: rbac.authorization.k8s.io diff --git a/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace-auto-backup/examples/mysql.yaml b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace-auto-backup/examples/mysql.yaml new file mode 100644 index 0000000000..62245c13df --- /dev/null +++ b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace-auto-backup/examples/mysql.yaml @@ -0,0 +1,56 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MySQL +metadata: + name: sample-mysql-1 + namespace: prod-1 + annotations: + stash.appscode.com/backup-blueprint: mysql-backup +spec: + version: "8.0.27" + replicas: 1 + storageType: Durable + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 50Mi + terminationPolicy: WipeOut +--- +apiVersion: kubedb.com/v1alpha2 +kind: MySQL +metadata: + name: sample-mysql-2 + namespace: prod-2 + annotations: + stash.appscode.com/backup-blueprint: mysql-backup +spec: + version: "8.0.27" + replicas: 1 + storageType: Durable + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 50Mi + terminationPolicy: WipeOut +--- +apiVersion: kubedb.com/v1alpha2 +kind: MySQL +metadata: + name: sample-mysql-3 + namespace: prod-3 + annotations: + stash.appscode.com/backup-blueprint: mysql-backup +spec: + version: "8.0.27" + replicas: 1 + storageType: Durable + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 50Mi + terminationPolicy: WipeOut diff --git a/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace-auto-backup/examples/serviceaccount.yaml b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace-auto-backup/examples/serviceaccount.yaml new file mode 100644 index 0000000000..0a3e3f8934 --- /dev/null +++ b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace-auto-backup/examples/serviceaccount.yaml @@ -0,0 +1,5 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: cross-namespace-target-reader + namespace: backup diff --git a/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace-auto-backup/images/gcs-prod-1.png b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace-auto-backup/images/gcs-prod-1.png new file mode 100644 index 0000000000..a4133ffdac Binary files /dev/null and b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace-auto-backup/images/gcs-prod-1.png differ diff --git a/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace-auto-backup/images/gcs-prod-2.png b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace-auto-backup/images/gcs-prod-2.png new file mode 100644 index 0000000000..b7aaa07bc1 Binary files /dev/null and b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace-auto-backup/images/gcs-prod-2.png differ diff --git a/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace-auto-backup/images/gcs-prod-3.png b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace-auto-backup/images/gcs-prod-3.png new file mode 100644 index 0000000000..bb360f6331 Binary files /dev/null and b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace-auto-backup/images/gcs-prod-3.png differ diff --git a/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace-auto-backup/index.md b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace-auto-backup/index.md new file mode 100644 index 0000000000..8330fa9572 --- /dev/null +++ b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace-auto-backup/index.md @@ -0,0 +1,481 @@ +--- +title: Define Cluster Wide Backup Policy using Stash Auto-backup +description: A guide on how to define cluster wide backup policy using Stash auto-backup. +menu: + docs_v2024.12.18: + identifier: managed-backup-auto-backup + name: Managed Auto-Backup + parent: managed-backup + weight: 30 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Define Cluster Wide Backup Policy using Stash Auto-backup + +This guide will show you how you can define cluster wide backup policy using Stash Auto-backup. Here, we are going to define a backup policy for MySQL databases. Then, we will demonstrate how users from different namespaces can use that policy to backup their own MySQL instances. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). + +- Install `Stash` in your cluster following the steps [here](/docs/v2024.12.18/setup/README). + +- You should be familiar with the following `Stash` concepts: + - [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) + - [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) + - [Repository](/docs/v2024.12.18/concepts/crds/repository/) + +We are going to take backup from the `prod-1`, `prod-2` and `prod-3` namespaces. We want to create our backup resources in `backup` namespace. + +Let's create the above mentioned namespaces, + +```bash +$ kubectl create ns prod-1 +namespace/prod-1 created + +$ kubectl create ns prod-2 +namespace/prod-2 created + +$ kubectl create ns prod-3 +namespace/prod-3 created + +$ kubectl create ns backup +namespace/backup created + +``` + +>**Note:** YAML files used in this tutorial can be found [here](https://github.com/stashed/docs/guides/managed-backup/dedicated-backup-namespace-auto-backup/examples). + +## Prepare Backup Blueprint + +Stash allows defining a backup template using `BackupBlueprint` CR. In this section, we are going to configure a `BackupBlueprint` for taking backup of MySQL databases. + +### Prepare Backend + +We are going to use [GCS Backend](/docs/v2024.12.18/guides/backends/gcs/) to store the backed up data. You can use any supported backend you prefer. You just have to configure Storage Secret and `spec.backend` section of `BackupBlueprint` to match your backend. To learn which backends are supported by Stash and how to configure them, please visit [here](/docs/v2024.12.18/guides/backends/overview/). + +> For GCS backend, if the bucket does not exist, Stash needs `Storage Object Admin` role permissions to create the bucket. For more details, please check the following [guide](/docs/v2024.12.18/guides/backends/gcs/). + +**Create Storage Secret:** + +At first, let's create a Storage Secret for the GCS backend in the `backup` namespace, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ mv downloaded-sa-json.key GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n backup gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +### Prepare RBAC + +Stash does not grant necessary RBAC permissions to the backup job for taking backup from a different namespace. In this case, we have to provide the RBAC permissions manually. This helps to prevent unauthorized namespaces from getting access to a database via Stash. + +**Create ServiceAccount:** + +At first, we are going to create a `ServiceAccount` in the `backup` namespace. We will grant necessary RBAC permissions to this ServiceAccount and use it in the backup job. Here is the YAML of the ServiceAccount, + +```yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: cross-namespace-target-reader + namespace: backup +``` + +Let's create the ServiceAccount, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/managed-backup/dedicated-backup-namespace-auto-backup/examples/serviceaccount.yaml +serviceaccount/cross-namespace-target-reader created +``` + +**Create ClusterRole and ClusterRoleBinding** + +We are going to create a ClusterRole and ClusterRoleBinding with the necessary permissions to perform the backup. Here are the YAMLs of the ClusterRole and ClusterRoleBinding, + +```yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: cross-namespace-target-reader +rules: +- apiGroups: [""] + resources: ["secrets","pods","endpoints"] + verbs: ["get","list"] +- apiGroups: ["appcatalog.appscode.com"] + resources: ["appbindings"] + verbs: ["get","list"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: cross-namespace-target-reader +subjects: +- kind: ServiceAccount + name: cross-namespace-target-reader + namespace: backup +roleRef: + kind: ClusterRole + name: cross-namespace-target-reader + apiGroup: rbac.authorization.k8s.io +``` + +Let's create the ClusterRole and ClusterRoleBinding we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/managed-backup/dedicated-backup-namespace-auto-backup/examples/clusterrole_clusterrolebinding.yaml +clusterrole.rbac.authorization.k8s.io/cross-namespace-target-reader created +clusterrolebinding.rbac.authorization.k8s.io/cross-namespace-target-reader created +``` + +The above RBAC permissions will allow the ServiceAccounts to perform backup of targets from any namespace. + +Alternatively, you can create Role and RoleBinding with the same permissions in case you want to restrict the ServiceAccounts to backup targets from only a specific namespace. + +### Create BackupBlueprint + +Now, we have to create a `BackupBlueprint` crd with a blueprint for `Repository` and `BackupConfiguration` object. + +Below is the YAML of the `BackupBlueprint` object that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupBlueprint +metadata: + name: mysql-backup +spec: + backupNamespace: backup + # ============== Blueprint for Repository ========================== + backend: + gcs: + bucket: stash-testing + prefix: stash-backup/${TARGET_NAMESPACE}/${TARGET_NAME} + storageSecretName: gcs-secret + # ============== Blueprint for BackupConfiguration ================= + schedule: "*/5 * * * *" + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true + runtimeSettings: + pod: + serviceAccountName: cross-namespace-target-reader +``` + +Here, + +- `spec.backupNamespace` refers to the namepspace where the backup resources will be created. +- `spec.runtimeSettings.pod.serviceAccountName` refers to the name of the `ServiceAccount` to use in the backup pod. + +Note that we have used some variables (format: `${}`) in `spec.backend.gcs.prefix` field. Stash will substitute these variables with values from the respective target. Since the resolved prefix will be different for different target, the backed up data will be stored in different directory inside the bucket. To know which variable you can use in this `prefix` field, please visit [here](/docs/v2024.12.18/concepts/crds/backupblueprint/#repository-blueprint). + +Let's create the `BackupBlueprint` that we have shown above, + +```bash +kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/managed-backup/dedicated-backup-namespace-auto-backup/examples/backupblueprint.yaml +backupblueprint.stash.appscode.com/mysql-backup created +``` + +Now, automatic backup is configured for MySQL database. We just have to add some annotations to the targeted databases to enable periodic backup. + +## Backup + +In this section, we are going to backup three MySQL databases from the `prod-1`, `prod-2`, and `prod-3` namespaces. + +### Deploy MySQL Databases + +We are going to use KubeDB for deploying sample MySQL Databases. Let's deploy three different MySQL databases in `prod-1`, `prod-2`, and `prod-3` namespaces, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MySQL +metadata: + name: sample-mysql-1 + namespace: prod-1 + annotations: + stash.appscode.com/backup-blueprint: mysql-backup +spec: + version: "8.0.27" + replicas: 1 + storageType: Durable + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 50Mi + terminationPolicy: WipeOut +--- +apiVersion: kubedb.com/v1alpha2 +kind: MySQL +metadata: + name: sample-mysql-2 + namespace: prod-2 + annotations: + stash.appscode.com/backup-blueprint: mysql-backup +spec: + version: "8.0.27" + replicas: 1 + storageType: Durable + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 50Mi + terminationPolicy: WipeOut +--- +apiVersion: kubedb.com/v1alpha2 +kind: MySQL +metadata: + name: sample-mysql-3 + namespace: prod-3 + annotations: + stash.appscode.com/backup-blueprint: mysql-backup +spec: + version: "8.0.27" + replicas: 1 + storageType: Durable + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 50Mi + terminationPolicy: WipeOut + +``` + +Notice the `metadata.annotations` field. We have specified to use `mysql-backup` BackupBlueprint for creating `Repository` and `BackupConfiguration` for the MySQL databases. BackupBlueprint is a non-namespaced resource, so we just need to specify the name of the blueprint. + +Let's create the above `MySQL` objects, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/managed-backup/dedicated-backup-namespace-auto-backup/examples/mysql.yaml +mysql.kubedb.com/sample-mysql-1 created +mysql.kubedb.com/sample-mysql-2 created +mysql.kubedb.com/sample-mysql-3 created +``` + +If everything goes well, Stash will create a Repository and a BackupConfiguration for each MySQL database with the name in the following format: + +```bash +-- +```` + +**Verify Repository:** + +Verify that the Repositories has been created successfully by the following command, + +```bash +$ kubectl get repository -n backup +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +prod-1-app-sample-mysql-1 31s +prod-2-app-sample-mysql-2 31s +prod-3-app-sample-mysql-3 30s +``` + +**Verify BackupConfiguratoin:** + +If everything goes well, Stash should create a `BackupConfiguration` for each of the MySQL database and the phase of the `BackupConfiguration` should be `Ready`. Verify that the `BackupConfiguration`s have been created by the following command, + +```bash +$ kubectl get backupconfiguration -n backup +NAME TASK SCHEDULE PAUSED PHASE AGE +prod-1-app-sample-mysql-1 */5 * * * * Ready 11m +prod-2-app-sample-mysql-2 */5 * * * * Ready 11m +prod-3-app-sample-mysql-3 */5 * * * * Ready 11m +``` + +Let's check the YAML of one of these `BackupConfiguration`s, + +```bash +$ kubectl get backupconfiguration -n backup prod-1-app-sample-mysql-1 -o yaml +``` + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: prod-1-app-sample-mysql-1 + namespace: backup + ... +spec: + driver: Restic + repository: + name: prod-1-app-sample-mysql-1 + namespace: backup + retentionPolicy: + keepLast: 5 + name: keep-last-5 + prune: true + runtimeSettings: + pod: + serviceAccountName: cross-namespace-target-reader + schedule: '*/5 * * * *' + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mysql-1 + namespace: prod-1 + task: {} + tempDir: {} +``` + +Notice that the `spec.target.ref` is pointing to the AppBinding of the database `sample-mysql-1` in the `prod-1` namespace. + +**Wait for BackupSession:** + +Run the following command to watch `BackupSession` crd: + +```bash +$ watch -n 1 kubectl get backupsession -n backup +NAME INVOKER-TYPE INVOKER-NAME PHASE DURATION AGE +prod-1-app-sample-mysql-1-1650885602 BackupConfiguration prod-1-app-sample-mysql-1 Succeeded 45s 5m25s +prod-1-app-sample-mysql-1-1650885906 BackupConfiguration prod-1-app-sample-mysql-1 Running 21s +prod-2-app-sample-mysql-2-1650885310 BackupConfiguration prod-2-app-sample-mysql-2 Succeeded 40s 10m +prod-2-app-sample-mysql-2-1650885602 BackupConfiguration prod-2-app-sample-mysql-2 Succeeded 41s 5m25s +prod-2-app-sample-mysql-2-1650885906 BackupConfiguration prod-2-app-sample-mysql-2 Running 21s +prod-3-app-sample-mysql-3-1650885310 BackupConfiguration prod-3-app-sample-mysql-3 Succeeded 38s 10m +prod-3-app-sample-mysql-3-1650885602 BackupConfiguration prod-3-app-sample-mysql-3 Succeeded 41s 5m25s + +``` + +Here, the phase `Succeeded` means that the backup process has been completed successfully. + +**Verify Backup:** + +When backup session is completed, Stash will update the respective `Repository` to reflect the latest state of backed up data. + +Run the following command to check if the snapshots are stored in the backend, + +```bash +$ kubectl get repository -n backup +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +prod-1-app-sample-mysql-1 true 4.174 MiB 5 2m50s 50m +prod-2-app-sample-mysql-2 true 7.283 MiB 5 2m50s 50m +prod-3-app-sample-mysql-3 true 4.701 MiB 5 2m50s 50m +``` + +If we navigate to `stash-backup/prod-1/sample-mysql-1`, `stash-backup/prod-2/sample-mysql-2`, and `stash-backup/prod-3/sample-mysql-3` directories of our GCS bucket, we are going to see that the snapshots of the databases `sample-mysql-1`, `sample-mysql-2` and`sample-mysql-3` have been stored there respectively. + +
+  Backup data of sample-mysql-1 GCS backend +
Fig: Backup data of sample-mysql-1 in GCS backend
+
+ +
+  Backup data of sample-mysql-2 GCS backend +
Fig: Backup data of sample-mysql-2 in GCS backend
+
+ +
+  Backup data of sample-mysql-3 GCS backend +
Fig: Backup data of sample-mysql-3 in GCS backend
+
+ + +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +$ kubectl delete backupblueprint mysql-backup +backupblueprint.stash.appscode.com "mysql-backup" deleted +$ kubectl delete backupconfiguration -n backup --all +backupconfiguration.stash.appscode.com "prod-1-app-sample-mysql-1" deleted +backupconfiguration.stash.appscode.com "prod-2-app-sample-mysql-2" deleted +backupconfiguration.stash.appscode.com "prod-3-app-sample-mysql-3" deleted +$ kubectl delete repository -n backup --all +repository.stash.appscode.com "prod-1-app-sample-mysql-1" deleted +repository.stash.appscode.com "prod-2-app-sample-mysql-2" deleted +repository.stash.appscode.com "prod-3-app-sample-mysql-3" deleted +$ kubectl delete secret -n backup gcs-secret +secret "gcs-secret" deleted +$ kubectl delete sa -n backup cross-namespace-target-reader +serviceaccount "mysql-sa" deleted +$ kubectl delete clusterrole cross-namespace-target-reader +role.rbac.authorization.k8s.io "mysql-role" deleted +$ kubectl delete clusterrolebinding cross-namespace-target-reader +rolebinding.rbac.authorization.k8s.io "mysql-rolebinding" deleted +$ kubectl delete my -n prod-1 sample-mysql-1 +mysql.kubedb.com "sample-mysql-1" deleted +$ kubectl delete my -n prod-2 sample-mysql-2 +mysql.kubedb.com "sample-mysql-2" deleted +$ kubectl delete my -n prod-3 sample-mysql-3 +mysql.kubedb.com "sample-mysql-3" deleted +``` diff --git a/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..6a5c3e60fb --- /dev/null +++ b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace/examples/backupconfiguration.yaml @@ -0,0 +1,22 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mysql-backup + namespace: backup +spec: + schedule: "*/5 * * * *" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mysql + namespace: prod + runtimeSettings: + pod: + serviceAccountName: cross-namespace-target-reader + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace/examples/clusterrole_clusterrolebinding.yaml b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace/examples/clusterrole_clusterrolebinding.yaml new file mode 100644 index 0000000000..7128b45e76 --- /dev/null +++ b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace/examples/clusterrole_clusterrolebinding.yaml @@ -0,0 +1,24 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: cross-namespace-target-clusterrole +rules: +- apiGroups: [""] + resources: ["secrets","pods","endpoints"] + verbs: ["get","list"] +- apiGroups: ["appcatalog.appscode.com"] + resources: ["appbindings"] + verbs: ["get","list"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: cross-namespace-target-clusterrolebinding +subjects: +- kind: ServiceAccount + name: cross-namespace-target-reader + namespace: backup +roleRef: + kind: ClusterRole + name: cross-namespace-target-clusterrole + apiGroup: rbac.authorization.k8s.io \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace/examples/mysql.yaml b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace/examples/mysql.yaml new file mode 100644 index 0000000000..5f44852e15 --- /dev/null +++ b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace/examples/mysql.yaml @@ -0,0 +1,17 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MySQL +metadata: + name: sample-mysql + namespace: prod +spec: + version: "8.0.27" + replicas: 1 + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: WipeOut \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace/examples/mysql_recovery.yaml b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace/examples/mysql_recovery.yaml new file mode 100644 index 0000000000..a13bbe30ac --- /dev/null +++ b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace/examples/mysql_recovery.yaml @@ -0,0 +1,17 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MySQL +metadata: + name: mysql-recovery + namespace: staging +spec: + version: "8.0.27" + replicas: 1 + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: WipeOut \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace/examples/repository.yaml b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace/examples/repository.yaml new file mode 100644 index 0000000000..9ce1f7a85c --- /dev/null +++ b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: backup +spec: + backend: + gcs: + bucket: stash-testing + prefix: /cross-namespace-target/data/sample-mysql + storageSecretName: gcs-secret \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace/examples/restoresession.yaml b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace/examples/restoresession.yaml new file mode 100644 index 0000000000..2c54f28116 --- /dev/null +++ b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace/examples/restoresession.yaml @@ -0,0 +1,21 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mysql-restore + namespace: backup +spec: + task: + name: mysql-restore-8.0.21 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: mysql-recovery + namespace: staging + runtimeSettings: + pod: + serviceAccountName: cross-namespace-target-reader + rules: + - snapshots: [latest] \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace/examples/serviceaccount.yaml b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace/examples/serviceaccount.yaml new file mode 100644 index 0000000000..70a991220c --- /dev/null +++ b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace/examples/serviceaccount.yaml @@ -0,0 +1,5 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: cross-namespace-target-reader + namespace: backup \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace/index.md b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace/index.md new file mode 100644 index 0000000000..d7c6ba8961 --- /dev/null +++ b/content/docs/v2024.12.18/guides/managed-backup/dedicated-backup-namespace/index.md @@ -0,0 +1,661 @@ +--- +title: Dedicated Backup Namespace | Stash +description: A guide on how to manage backup and restore from a dedicated namespace for targets of different namespaces using Stash. +menu: + docs_v2024.12.18: + identifier: managed-backup-dedicated-backup-namespace + name: Dedicated Backup Namespace + parent: managed-backup + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Manage Backup and Restore from a Dedicated Namespace + +This guide will show you how you can use a dedicated backup namespace to keep your backup resources isolated from your workloads. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). + +- Install `Stash` in your cluster following the steps [here](/docs/v2024.12.18/setup/README). + +- You should be familiar with the following `Stash` concepts: + - [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) + - [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) + - [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + - [Repository](/docs/v2024.12.18/concepts/crds/repository/) + +Here, we are going to take a backup from the `prod` namespace and restore it to the `staging` namespace. We are going to manage the backup and restore from a separate `backup` namespace. + +Let's create the above-mentioned namespaces, + +```bash +$ kubectl create ns prod +namespace/prod created + +$ kubectl create ns backup +namespace/backup created + +$ kubectl create ns staging +namespace/staging created +``` + +>**Note:** YAML files used in this tutorial can be found [here](https://github.com/stashed/docs/guides/managed-backup/dedicated-backup-namespace/examples). + +## Backup + +In this section, we are going to backup a MySQL database from the `prod` namespace. We are going to use `backup` namespace for our backup resources. + +### Deploy Sample MySQL Database + +We are going to use KubeDB for deploying a sample MySQL Database. Let's deploy the following sample MySQL database in `prod` namespace, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MySQL +metadata: + name: sample-mysql + namespace: prod +spec: + version: "8.0.27" + replicas: 1 + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: WipeOut +``` + +To create the above `MySQL` object, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/managed-backup/dedicated-backup-namespace/examples/mysql.yaml +mysql.kubedb.com/sample-mysql created +``` + +KubeDB will deploy a MySQL database according to the above specification. It will also create the necessary Secrets and Services to access the database. + +Let's check if the database is ready to use, + +```bash +$ kubectl get my -n prod sample-mysql +NAME VERSION STATUS AGE +sample-mysql 8.0.27 Ready 3m32s +``` +We can see that the database is `Ready`. + +**Verify AppBinding:** + +Verify that the AppBinding has been created successfully using the following command, + +```bash +$ kubectl get appbindings -n prod +NAME TYPE VERSION AGE +sample-mysql kubedb.com/mysql 8.0.27 11m +``` +Stash uses the AppBinding CRD to connect with the target database. + +> If you are not using KubeDB to deploy the database, create the AppBinding manually. + +**Insert Sample Data:** + +Now, we are going to exec into the database pod and create some sample data. At first, find out the database Pod using the following command, + +```bash +$ kubectl get pods -n prod --selector="app.kubernetes.io/instance=sample-mysql" +NAME READY STATUS RESTARTS AGE +sample-mysql-0 1/1 Running 0 33m +``` + +And copy the user name and password of the `root` user to access the `mysql` shell. + +```bash +$ kubectl get secret -n prod sample-mysql-auth -o jsonpath='{.data.username}'| base64 -d +root⏎ + +$ kubectl get secret -n prod sample-mysql-auth -o jsonpath='{.data.password}'| base64 -d +vTSh3ZQxDBRm7dzl⏎ +``` + +Now, let's exec into the Pod to enter into `mysql` shell and create a database and a table, + +```bash +$ kubectl exec -it -n prod sample-mysql-0 -- mysql --user=root --password="vTSh3ZQxDBRm7dzl" +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 10 +Server version: 8.0.14 MySQL Community Server - GPL + +Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> CREATE DATABASE playground; +Query OK, 1 row affected (0.01 sec) + +mysql> SHOW DATABASES; ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| mysql | +| performance_schema | +| playground | +| sys | ++--------------------+ +5 rows in set (0.00 sec) + +mysql> CREATE TABLE playground.equipment ( id INT NOT NULL AUTO_INCREMENT, type VARCHAR(50), quant INT, color VARCHAR(25), PRIMARY KEY(id)); +Query OK, 0 rows affected (0.01 sec) + +mysql> SHOW TABLES IN playground; ++----------------------+ +| Tables_in_playground | ++----------------------+ +| equipment | ++----------------------+ +1 row in set (0.01 sec) + +mysql> INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue"); +Query OK, 1 row affected (0.01 sec) + +mysql> SELECT * FROM playground.equipment; ++----+-------+-------+-------+ +| id | type | quant | color | ++----+-------+-------+-------+ +| 1 | slide | 2 | blue | ++----+-------+-------+-------+ +1 row in set (0.00 sec) + +mysql> exit +Bye +``` + +Now, we are ready to backup the database. + +### Prepare Backend + +We are going to store our backed-up data into a GCS bucket. We have to create a Secret with the necessary credentials and a Repository CRD to use this backend. + +If you want to use a different backend, please read the doc [here](/docs/v2024.12.18/guides/backends/overview/). + +> For the GCS backend, if the bucket does not exist, Stash needs `Storage Object Admin` role permissions to create the bucket. For more details, please check the following [guide](/docs/v2024.12.18/guides/backends/gcs/). + +**Create Secret:** + +Let's create a Secret called `gcs-secret` in `backup` namespace with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat /path/to/downloaded-sa-key.json > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n backup gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create Repository:** + +Now, create a Repository using this Secret. Below is the YAML of Repository object we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: backup +spec: + backend: + gcs: + bucket: stash-testing + prefix: /cross-namespace-target/data/sample-mysql + storageSecretName: gcs-secret +``` + +Let's create the Repository we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/managed-backup/dedicated-backup-namespace/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` +Now, we are ready to backup our sample data into this backend. + +### Configure Backup + +We are going to create a `BackupConfiguration` object in the `backup` namespace targetting the `sample-mysql` database of the `prod` namespace. Stash does not grant necessary RBAC permissions to the backup job for taking backup from a different namespace. In this case, we have to provide the RBAC permissions manually. This helps to prevent unauthorized namespaces from getting access to a database via Stash. + +**Create ServiceAccount:** + +At first, we are going to create a ServiceAccount in the `backup` namespace. We will grant necessary RBAC permissions to this ServiceAccount and use it in the backup job. + +```yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: cross-namespace-target-reader + namespace: backup +``` + +Let's create the ServiceAccount, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/managed-backup/dedicated-backup-namespace/examples/serviceaccount.yaml +serviceaccount/cross-namespace-target-reader created +``` + +**Create ClusterRole and ClusterRoleBinding** + +We are going to create a ClusterRole and ClusterRoleBinding with the necessary permissions to perform the backup. Here are the YAMLs of the ClusterRole and ClusterRoleBinding, + +```yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: cross-namespace-target-reader +rules: +- apiGroups: [""] + resources: ["secrets","pods","endpoints"] + verbs: ["get","list"] +- apiGroups: ["appcatalog.appscode.com"] + resources: ["appbindings"] + verbs: ["get","list"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: cross-namespace-target-reader +subjects: +- kind: ServiceAccount + name: cross-namespace-target-reader + namespace: backup +roleRef: + kind: ClusterRole + name: cross-namespace-target-reader + apiGroup: rbac.authorization.k8s.io +``` + +Let's create the ClusterRole and ClusterRoleBinding we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/managed-backup/dedicated-backup-namespace/examples/clusterrole_clusterrolebinding.yaml +clusterrole.rbac.authorization.k8s.io/cross-namespace-target-reader created +clusterrolebinding.rbac.authorization.k8s.io/cross-namespace-target-reader created +``` + +The above RBAC permissions will allow the ServiceAccounts to perform backup targets from any namespace. + +Alternatively, you can create Role and RoleBinding with the same permissions in case you want to restrict the ServiceAccounts to backup targets from only a specific namespace. + +**Create BackupConfiguration:** + +Now, we are going to create the BackupConfiguration to backup our MySQL database of `prod` namespace. Below is the YAML of the `BackupConfiguration` object, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mysql-backup + namespace: backup +spec: + schedule: "*/5 * * * *" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mysql + namespace: prod + runtimeSettings: + pod: + serviceAccountName: cross-namespace-target-reader + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` +Note that, we have mentioned the ServiceAccount name we have created earlier in the `spec.runtimeSettings.pod.serviceAccountName` field of the BackupConfiguration object. + +Let's create the `BackupConfiguration` object we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/managed-backup/dedicated-backup-namespace/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/sample-mysql-backup +``` + +**Verify BackupConfiguration Ready:** + +If everything goes well, the phase of the BackupConfiguration should be `Ready`. Let's check the BackupConfiguration Phase, + +```bash +❯ kubectl get backupconfiguration -n backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-mysql-backup */5 * * * * Ready 13s +``` + +### Verify Backup + +The `sample-mysql-backup` BackupConfiguration will create a CronJob in the `dev` namespace and that will trigger a backup on each scheduled slot by creating a `BackupSession` object. + +Wait for the next schedule for the backup. Run the following command to watch the `BackupSession` object, + +```bash +$ kubectl get backupsession -n backup -w + +NAME INVOKER-TYPE INVOKER-NAME PHASE DURATION AGE +sample-mysql-backup-1650452100 BackupConfiguration sample-mysql-backup Running 0s +sample-mysql-backup-1650452100 BackupConfiguration sample-mysql-backup Running 16s +sample-mysql-backup-1650452100 BackupConfiguration sample-mysql-backup Running 32s +sample-mysql-backup-1650452100 BackupConfiguration sample-mysql-backup Succeeded 33s 32s +``` + +We can see from the above that the Phase of the BackupSession is Succeeded. It indicates that Stash has successfully taken a backup of our target. + +## Restore + +In this section, we are going to restore the database into the `staging` namespace from the backup we have taken in the previous section. + +**Stop Taking Backup of the Old Database:** + +At first, let's stop taking any further backup of the old database so that no backup is taken during the restore process. + +Let's pause the `sample-mysql-backup` BackupConfiguration, + +```bash +$ kubectl patch backupconfiguration -n backup sample-mysql-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/sample-mysql-backup patched +``` + +Verify that the BackupConfiguration has been paused, + +```bash +$ kubectl get backupconfiguration -n backup sample-mysql-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-mysql-backup mysql-backup-8.0.21 */5 * * * * true Ready 26m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the BackupConfiguration has been paused. + +### Deploy Recovery MySQL Database + +Now, we are going to deploy a new MySQL database in the `staging` namespace. + +Below is the YAML for the MySQL database, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MySQL +metadata: + name: mysql-recovery + namespace: staging +spec: + version: "8.0.27" + replicas: 1 + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: WipeOut +``` + +Let's create the above database, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/managed-backup/dedicated-backup-namespace/examples/mysql_recovery.yaml +mysql.kubedb.com/mysql-recovery created +``` + +Let's check the database status, + +```bash +$ kubectl get my -n staging mysql-recovery +NAME VERSION STATUS AGE +mysql-recovery 8.0.27 Ready 36s +``` + +**Verify AppBinding:** + +Check that the AppBinding object has been created for the `mysql-recovery` database, + +```bash +$ kubectl get appbindings -n staging +NAME TYPE VERSION AGE +mysql-recovery kubedb.com/mysql 8.0.27 2m +``` + +> If you are not using KubeDB to deploy database, create the AppBinding manually. + +### Configure Restore + +We are going to create a `RestoreSession` object in the `backup` namespace targeting the `mysql-recovery` database of `staging` namespace. Similar to BackupConfiguration, we need to grant the necessary RBAC permissions through a ServiceAccount to the RestoreSession as well. + +**Create RestoreSession:** + +Here is the YAML of the RestoreSession, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mysql-restore + namespace: backup +spec: + task: + name: mysql-restore-8.0.21 + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: mysql-recovery + namespace: staging + runtimeSettings: + pod: + serviceAccountName: cross-namespace-target-reader + rules: + - snapshots: [latest] +``` + +Note that, similarly to the BackupConfiguration we have mentioned the ServiceAccount here in the `spec.runtimeSettings.pod.serviceAccountName` field to grant necessary RBAC permissions to the RestoreSession. + +Let's create the RestoreSession object, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/managed-backup/dedicated-backup-namespace/examples/restoresession.yaml +restoresession.stash.appscode.com/sample-mysql-restore created +``` + +Let's run the following command to watch the phase of the RestoreSession object, + +```bash +$ kubectl get restoresession -n backup sample-mysql-restore -w + +NAME REPOSITORY PHASE DURATION AGE +sample-mysql-restore gcs-repo Running 2s +sample-mysql-restore gcs-repo Running 20s +sample-mysql-restore gcs-repo Succeeded 20s 20s +``` + +Here, we can see that the restore process has succeeded. + +**Verify Restored Data:** + +In this section, we are going to verify whether the desired data has been restored successfully. + +Let's find out the database Pod by the following command, + +```bash +$ kubectl get pods -n staging --selector="app.kubernetes.io/instance=mysql-recovery" +NAME READY STATUS RESTARTS AGE +mysql-recovery-0 1/1 Running 0 39m +``` + +Copy the username and password of the `root` user to access into `mysql` shell. + +```bash +$ kubectl get secret -n staging mysql-recovery-auth -o jsonpath='{.data.username}'| base64 -d +root⏎ + +$ kubectl get secret -n staging mysql-recovery-auth -o jsonpath='{.data.password}'| base64 -d +XLy)x86brw)oVy0N⏎ +``` + +Now, let's exec into the Pod to enter into `mysql` shell and create a database and a table, + +```bash +$ kubectl exec -it -n staging mysql-recovery-0 -- mysql --user=root --password="XLy)x86brw)oVy0N" +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 9 +Server version: 8.0.14 MySQL Community Server - GPL + +Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> SHOW DATABASES; ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| mysql | +| performance_schema | +| playground | +| sys | ++--------------------+ +5 rows in set (0.00 sec) + +mysql> SHOW TABLES IN playground; ++----------------------+ +| Tables_in_playground | ++----------------------+ +| equipment | ++----------------------+ +1 row in set (0.00 sec) + +mysql> SELECT * FROM playground.equipment; ++----+-------+-------+-------+ +| id | type | quant | color | ++----+-------+-------+-------+ +| 1 | slide | 2 | blue | ++----+-------+-------+-------+ +1 row in set (0.00 sec) + +mysql> exit +Bye +``` + +So, from the above output, we can see that the `playground` database and the `equipment` table we created earlier are restored in the `mysql-recovery` database successfully. + +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +$ kubectl delete backupconfiguration -n backup sample-mysql-backup +backupconfiguration.stash.appscode.com "sample-mysql-backup" deleted +$ kubectl delete restoresession -n backup sample-mysql-restore +restoresession.stash.appscode.com "sample-mysql-restore" deleted +$ kubectl delete repository -n backup gcs-repo +repository.stash.appscode.com "gcs-repo" deleted +$ kubectl delete secret -n backup gcs-secret +secret "gcs-secret" deleted +$ kubectl delete sa -n backup cross-namespace-target-reader +serviceaccount "cross-namespace-target-reader" deleted +$ kubectl delete clusterrole cross-namespace-target-reader +role.rbac.authorization.k8s.io "cross-namespace-target-reader" deleted +$ kubectl delete clusterrolebinding cross-namespace-target-reader +rolebinding.rbac.authorization.k8s.io "cross-namespace-target-reader" deleted +$ kubectl delete my -n staging mysql-recovery +mysql.kubedb.com "mysql-recovery" deleted +$ kubectl delete my -n prod sample-mysql +mysql.kubedb.com "sample-mysql" deleted +``` diff --git a/content/docs/v2024.12.18/guides/managed-backup/dedicated-storage-namespace/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/guides/managed-backup/dedicated-storage-namespace/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..4cd6c39548 --- /dev/null +++ b/content/docs/v2024.12.18/guides/managed-backup/dedicated-storage-namespace/examples/backupconfiguration.yaml @@ -0,0 +1,24 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: ss-backup + namespace: prod +spec: + repository: + name: gcs-repo + namespace: demo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: StatefulSet + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/managed-backup/dedicated-storage-namespace/examples/repository.yaml b/content/docs/v2024.12.18/guides/managed-backup/dedicated-storage-namespace/examples/repository.yaml new file mode 100644 index 0000000000..e599abd4d3 --- /dev/null +++ b/content/docs/v2024.12.18/guides/managed-backup/dedicated-storage-namespace/examples/repository.yaml @@ -0,0 +1,14 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /cross-namespace/data/sample-statefulset + storageSecretName: gcs-secret + usagePolicy: + allowedNamespaces: + from: All \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/managed-backup/dedicated-storage-namespace/examples/restoresession.yaml b/content/docs/v2024.12.18/guides/managed-backup/dedicated-storage-namespace/examples/restoresession.yaml new file mode 100644 index 0000000000..848c7c62b6 --- /dev/null +++ b/content/docs/v2024.12.18/guides/managed-backup/dedicated-storage-namespace/examples/restoresession.yaml @@ -0,0 +1,20 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: ss-restore + namespace: staging +spec: + repository: + name: gcs-repo + namespace: demo + target: + ref: + apiVersion: apps/v1 + kind: StatefulSet + name: stash-recovered + volumeMounts: + - name: source-data + mountPath: /source/data + rules: + - paths: + - /source/data \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/managed-backup/dedicated-storage-namespace/examples/statefulset.yaml b/content/docs/v2024.12.18/guides/managed-backup/dedicated-storage-namespace/examples/statefulset.yaml new file mode 100644 index 0000000000..569054369c --- /dev/null +++ b/content/docs/v2024.12.18/guides/managed-backup/dedicated-storage-namespace/examples/statefulset.yaml @@ -0,0 +1,54 @@ +apiVersion: v1 +kind: Service +metadata: + name: headless + namespace: prod +spec: + ports: + - name: http + port: 80 + targetPort: 0 + selector: + app: stash-demo + clusterIP: None +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: stash-demo + namespace: prod + labels: + app: stash-demo +spec: + replicas: 3 + selector: + matchLabels: + app: stash-demo + serviceName: headless + template: + metadata: + labels: + app: stash-demo + spec: + containers: + - name: busybox + image: busybox + command: ["/bin/sh", "-c","echo $(POD_NAME) > /source/data/data.txt && sleep 3000"] + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + volumeMounts: + - name: source-data + mountPath: "/source/data" + imagePullPolicy: IfNotPresent + volumeClaimTemplates: + - metadata: + name: source-data + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/managed-backup/dedicated-storage-namespace/examples/statefulset_recovered.yaml b/content/docs/v2024.12.18/guides/managed-backup/dedicated-storage-namespace/examples/statefulset_recovered.yaml new file mode 100644 index 0000000000..5a1552d120 --- /dev/null +++ b/content/docs/v2024.12.18/guides/managed-backup/dedicated-storage-namespace/examples/statefulset_recovered.yaml @@ -0,0 +1,51 @@ +apiVersion: v1 +kind: Service +metadata: + name: re-headless + namespace: staging +spec: + ports: + - name: http + port: 80 + targetPort: 0 + selector: + app: stash-recovered + clusterIP: None +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: stash-recovered + namespace: staging + labels: + app: stash-recovered +spec: + replicas: 3 + selector: + matchLabels: + app: stash-recovered + serviceName: re-headless + template: + metadata: + labels: + app: stash-recovered + spec: + containers: + - name: busybox + image: busybox + command: + - sleep + - '3600' + volumeMounts: + - name: source-data + mountPath: "/source/data" + imagePullPolicy: IfNotPresent + volumeClaimTemplates: + - metadata: + name: source-data + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/managed-backup/dedicated-storage-namespace/index.md b/content/docs/v2024.12.18/guides/managed-backup/dedicated-storage-namespace/index.md new file mode 100644 index 0000000000..17e9d5cb6d --- /dev/null +++ b/content/docs/v2024.12.18/guides/managed-backup/dedicated-storage-namespace/index.md @@ -0,0 +1,554 @@ +--- +title: Dedicated Storage Namespace | Stash +description: A guide on how to use backup and restore by keeping the storage resources in a separate namespace in Stash. +menu: + docs_v2024.12.18: + identifier: managed-backup-dedicated-storage-namespace + name: Dedicated Storage Namespace + parent: managed-backup + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Using Dedicated Namespace for Storage + +This guide will show you how to take backup and restore by keeping the storage resources (Repository and backend Secret) in a dedicated namespace using Stash. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). + +- Install `Stash` in your cluster following the steps [here](/docs/v2024.12.18/setup/README). + +- You should be familiar with the following `Stash` concepts: + - [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) + - [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) + - [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + - [Repository](/docs/v2024.12.18/concepts/crds/repository/) + +We are going to take a backup from the `prod` namespace and restore it to the `staging` namespace. We are going to keep our Repository and the backend Secret in the `storage` namespace. + +Let's create the above-mentioned namespaces, + +```bash +$ kubectl create ns prod +namespace/prod created + +$ kubectl create ns staging +namespace/staging created + +$ kubectl create ns storage +namespace/storage created +``` + +>**Note:** YAML files used in this tutorial can be found [here](https://github.com/stashed/docs/guides/managed-backup/dedicated-storage-namespace/examples). + +## Backup from `prod` Namespace + +This section will demonstrate taking backup of the volumes of a StatefulSet from the `prod` namespace using Stash. + +### Deploy Workload + +Let's deploy a StatefulSet in the `prod` namespace at the beginning. This StatefulSet will automatically generate sample data in the `/source/data` directory. + +Here is the YAML of the StatefulSet that we are going to create, + +```yaml +apiVersion: v1 +kind: Service +metadata: + name: headless + namespace: prod +spec: + ports: + - name: http + port: 80 + targetPort: 0 + selector: + app: stash-demo + clusterIP: None +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: stash-demo + namespace: prod + labels: + app: stash-demo +spec: + replicas: 3 + selector: + matchLabels: + app: stash-demo + serviceName: headless + template: + metadata: + labels: + app: stash-demo + spec: + containers: + - name: busybox + image: busybox + command: ["/bin/sh", "-c","echo $(POD_NAME) > /source/data/data.txt && sleep 3000"] + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + volumeMounts: + - name: source-data + mountPath: "/source/data" + imagePullPolicy: IfNotPresent + volumeClaimTemplates: + - metadata: + name: source-data + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi +``` + +Let's create the StatefulSet we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/managed-backup/dedicated-storage-namespace/examples/statefulset.yaml +service/headless created +statefulset.apps/stash-demo created +``` + +Now, wait for the pods of the StatefulSet to go into the `Running` state. You can verify the `Status` of the pods by executing the following command, + +```bash +$ kubectl get pod -n prod +NAME READY STATUS RESTARTS AGE +stash-demo-0 1/1 Running 0 42s +stash-demo-1 1/1 Running 0 40s +stash-demo-2 1/1 Running 0 36s +``` + +Verify that the sample data has been generated in `/source/data` directory for `stash-demo-0` , `stash-demo-1` and `stash-demo-2` pod respectively using the following commands, + +```bash +$ kubectl exec -n prod stash-demo-0 -- cat /source/data/data.txt +stash-demo-0 +$ kubectl exec -n prod stash-demo-1 -- cat /source/data/data.txt +stash-demo-1 +$ kubectl exec -n prod stash-demo-2 -- cat /source/data/data.txt +stash-demo-2 +``` + +### Prepare Backend + +We are going to store our backed-up data into a GCS bucket. We have to create a Secret with the necessary credentials and a Repository object to use this backend. + +If you want to use a different backend, please read the doc [here](/docs/v2024.12.18/guides/backends/overview/). + +> For the GCS backend, if the bucket does not exist, Stash needs `Storage Object Admin` role permissions to create the bucket. For more details, please check the following [guide](/docs/v2024.12.18/guides/backends/gcs/). + +**Create Secret:** + +Let's create a secret called `gcs-secret` in `storage` namespace with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat /path/to/downloaded-sa-key.json > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n storage gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create Repository:** + +Now, create a Repository using the above Secret in the `storage` namespace. Below is the YAML of Repository object we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: storage +spec: + backend: + gcs: + bucket: stash-testing + prefix: /cross-namespace/data/sample-statefulset + storageSecretName: gcs-secret + usagePolicy: + allowedNamespaces: + from: All +``` + +Notice the `spec.usagePolicy` section. Here, we are allowing all namespaces to refer to this repository. You can restrict this capability to a particular namespace or a group of namespaces. For more details, please follow the guide from [here](/docs/v2024.12.18/concepts/crds/repository/). + +Let's create the Repository we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/managed-backup/dedicated-storage-namespace/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our sample data into this backend. + +### Configure Backup + +We are going to create a `BackupConfiguration` object in the `prod` namespace targeting the `stash-demo` StatefulSet. This `BackupConfiguration` will refer to the `gcs-repo` repository of the `storage` namespace. Stash will inject a sidecar container into the target. It will also create a `CronJob` to take periodic backup of the `/source/data` directory of the target. + +**Create BackupConfiguration:** + +Below is the YAML of the `BackupConfiguration` object that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: ss-backup + namespace: prod +spec: + repository: + name: gcs-repo + namespace: storage + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: StatefulSet + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Here, + +- `spec.repository.name` refers to the Repository object that holds backend information. +- `spec.repository.namespace` refers to the namespace of the Repository object. +- `spec.schedule` is a cron expression that indicates BackupSession will be created at 5 minutes intervals. +- `spec.target.ref` refers to the `stash-demo` StatefulSet. +- `spec.target.volumeMounts` specifies a list of volumes and their mountPath that contain the target paths. +- `spec.target.paths` specifies list of file paths to backup. + +Let's create the `BackupConfiguration` crd we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/managed-backup/dedicated-storage-namespace/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/ss-backup created +``` + +**Verify BackupConfiguration Ready:** + +If everything goes well, the phase of the BackupConfiguration should be `Ready`. Let's check the BackupConfiguration Phase, + +```bash +❯ kubectl get backupconfiguration -n prod +NAME TASK SCHEDULE PAUSED PHASE AGE +ss-backup */5 * * * * Ready 13s +``` + +**Verify CronJob:** + +Stash will also create a `CronJob` with the schedule specified in the `spec.schedule` field of the `BackupConfiguration` object. + +Verify that the `CronJob` has been created using the following command, + +```bash +$ kubectl get cronjob -n prod +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-trigger-ss-backup */5 * * * * False 0 4m55s 3m14s +``` + +### Verify Backup + +The `stash-trigger-ss-backup` CronJob will trigger a backup on each scheduled slot by creating a `BackupSession` object. The sidecar container watches for the `BackupSession` object. When it finds one, it will take backup immediately. + +Wait for the next schedule for the backup. Run the following command to watch the `BackupSession` object, + +```bash +$ kubectl get backupsession -n prod -w + +NAME INVOKER-TYPE INVOKER-NAME PHASE DURATION AGE +ss-backup-1644562803 BackupConfiguration ss-backup Running 18s +ss-backup-1644562803 BackupConfiguration ss-backup Running 34s +ss-backup-1644562803 BackupConfiguration ss-backup Succeeded 1m21s 81s +``` + +We can see from the above output that the backup session has succeeded. + +## Restore into `staging` Namespace + +This section will demonstrate restoring the backed-up volumes into the `staging` namespace using Stash. + +**Stop Taking Backup of the Old StatefulSet:** + +At first, let's stop taking any further backup of the old StatefulSet. We are going to pause the `BackupConfiguration` that we created earlier. You can learn more how to pause a scheduled backup [here](/docs/v2024.12.18/guides/use-cases/pause-backup/) + +Let's pause the `ss-backup` BackupConfiguration, + +```bash +$ kubectl patch backupconfiguration -n prod ss-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/ss-backup patched +``` + +You can also use the Stash kubectl plugin to pause the backup like the following, + +```bash +$ kubectl stash pause backup --backupconfig=ss-backup -n prod +BackupConfiguration demo/deployment-backup has been paused successfully. +``` + +Verify that the BackupConfiguration has been paused, + +```bash +$ kubectl get backupconfiguration -n prod +NAME TASK SCHEDULE PAUSED PHASE AGE +ss-backup */5 * * * * true Ready 53m +``` + +Notice the `PAUSED` column. Value `true` indicates that the BackupConfiguration has been paused. + +### Deploy Restore Workload + +We are going to create a new StatefulSet named `stash-recovered` and restore the backed-up data inside it. + +Below is the YAML of the StatefulSet that we are going to create, + +```yaml +apiVersion: v1 +kind: Service +metadata: + name: re-headless + namespace: staging +spec: + ports: + - name: http + port: 80 + targetPort: 0 + selector: + app: stash-recovered + clusterIP: None +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: stash-recovered + namespace: staging + labels: + app: stash-recovered +spec: + replicas: 3 + selector: + matchLabels: + app: stash-recovered + serviceName: re-headless + template: + metadata: + labels: + app: stash-recovered + spec: + containers: + - name: busybox + image: busybox + command: + - sleep + - '3600' + volumeMounts: + - name: source-data + mountPath: "/source/data" + imagePullPolicy: IfNotPresent + volumeClaimTemplates: + - metadata: + name: source-data + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi +``` + +Let's create the StatefulSet we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/managed-backup/dedicated-storage-namespace/examples/statefulset_recovered.yaml +service/re-headless created +statefulset.apps/stash-recovered created +``` + +### Configure Restore + +Now, we need to create a `RestoreSession` object targeting the `stash-recovered` StatefulSet to restore the backed-up data inside it. Similar to the BackupConfiguration, we will use the Repository of `storage` namespace here. + +**Create RestoreSession:** + +Below is the YAML of the `RestoreSesion` object that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: ss-restore + namespace: staging +spec: + repository: + name: gcs-repo + namespace: storage + target: + ref: + apiVersion: apps/v1 + kind: StatefulSet + name: stash-recovered + volumeMounts: + - name: source-data + mountPath: /source/data + rules: + - paths: + - /source/data +``` + +Here, + +- `spec.repository.name` specifies the name of the Repository. +- `spec.repository.namespace` refers to the namespace of the Repository. +- `spec.target.ref` refers to the target workload where the recovered data will be stored. +- `spec.target.volumeMounts` specifies a list of volumes and their mountPath where the data will be restored. + - `mountPath` must be the same mountPath as the original volume because Stash stores the absolute path of the backed-up files. If you use a different mountPath for the restored volume the backed up files will not be restored into your desired volume. + +Let's create the `RestoreSession` object we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/managed-backup/dedicated-storage-namespace/examples/restoresession.yaml +restoresession.stash.appscode.com/ss-restore created +``` + +Now, wait for the RestoreSession phase to go into the `Succeeded` state. + +**Wait for RestoreSession to Succeeded:** + +Run the following command to watch the RestoreSession phase, + +```bash +$ kubectl get restoresession -n staging -w + +NAME REPOSITORY PHASE DURATION AGE +ss-restore gcs-repo Succeeded 3m6s 4m +``` + +So, we can see from the output of the above command that the restore process succeeded. + +### Verify Restored Data + +In this section, we are going to verify that the desired data has been restored successfully. + +Get the pods of the `stash-recovered` StatefulSet, + +```bash +$ kubectl get pod -n staging +NAME READY STATUS RESTARTS AGE +stash-recovered-0 1/1 Running 0 10m +stash-recovered-1 1/1 Running 0 11m +stash-recovered-2 1/1 Running 0 12m +``` + +Verify that the backed-up data has been restored in `/source/data` directory of the `stash-recovered` pods of a StatefulSet using the following commands, + +```bash +$ kubectl exec -n staging stash-recovered-0 -- cat /source/data/data.txt +stash-demo-0 +$ kubectl exec -n staging stash-recovered-1 -- cat /source/data/data.txt +stash-demo-1 +$ kubectl exec -n staging stash-recovered-2 -- cat /source/data/data.txt +stash-demo-2 +``` + +## Cleaning Up + +To clean up the resources created by this tutorial, run: + +```bash +kubectl delete -n prod statefulset stash-demo +kubectl delete -n prod backupconfiguration ss-backup +kubectl delete -n prod pvc --all +kubectl delete -n staging statefulset stash-recovered +kubectl delete -n staging restoresession ss-restore +kubectl delete -n staging pvc --all +kubectl delete -n storage repository gcs-repo +kubectl delete -n storage secret gcs-secret +``` \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/monitoring/_index.md b/content/docs/v2024.12.18/guides/monitoring/_index.md new file mode 100644 index 0000000000..995bca9ace --- /dev/null +++ b/content/docs/v2024.12.18/guides/monitoring/_index.md @@ -0,0 +1,77 @@ +--- +title: Monitoring | Stash +menu: + docs_v2024.12.18: + identifier: monitoring + name: Monitoring + parent: guides + weight: 100 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/guides/monitoring/grafana/images/import_dashboard_1.png b/content/docs/v2024.12.18/guides/monitoring/grafana/images/import_dashboard_1.png new file mode 100644 index 0000000000..1a26acec1b Binary files /dev/null and b/content/docs/v2024.12.18/guides/monitoring/grafana/images/import_dashboard_1.png differ diff --git a/content/docs/v2024.12.18/guides/monitoring/grafana/images/import_dashboard_2.png b/content/docs/v2024.12.18/guides/monitoring/grafana/images/import_dashboard_2.png new file mode 100644 index 0000000000..11d2020579 Binary files /dev/null and b/content/docs/v2024.12.18/guides/monitoring/grafana/images/import_dashboard_2.png differ diff --git a/content/docs/v2024.12.18/guides/monitoring/grafana/images/import_dashboard_3.png b/content/docs/v2024.12.18/guides/monitoring/grafana/images/import_dashboard_3.png new file mode 100644 index 0000000000..9e9c3257ef Binary files /dev/null and b/content/docs/v2024.12.18/guides/monitoring/grafana/images/import_dashboard_3.png differ diff --git a/content/docs/v2024.12.18/guides/monitoring/grafana/images/stash_grafana_dashboard.png b/content/docs/v2024.12.18/guides/monitoring/grafana/images/stash_grafana_dashboard.png new file mode 100644 index 0000000000..d62118aa5c Binary files /dev/null and b/content/docs/v2024.12.18/guides/monitoring/grafana/images/stash_grafana_dashboard.png differ diff --git a/content/docs/v2024.12.18/guides/monitoring/grafana/index.md b/content/docs/v2024.12.18/guides/monitoring/grafana/index.md new file mode 100644 index 0000000000..1ed6306a7f --- /dev/null +++ b/content/docs/v2024.12.18/guides/monitoring/grafana/index.md @@ -0,0 +1,169 @@ +--- +title: Stash Grafana Dashboard | Stash +description: Using Stash Grafana Dashboard +menu: + docs_v2024.12.18: + identifier: monitoring-grafana-dashboard + name: Grafana Dashboard + parent: monitoring + weight: 30 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash Grafana Dashboard + +Grafana provides an elegant graphical user interface to visualize data. You can create a beautiful dashboard easily with a meaningful representation of your Prometheus metrics. + +We provide a pre-built Grafana dashboard to our **Stash** users. In this guide, we are going to show you how you can import this dashboard from your Grafana UI. + +>Some basic metrics are also available for Stash Community Edition. You can create your dashboard using those metrics. + +## Before You Begin + +- At first, you need to setup a Prometheus monitoring stack in your cluster. Please, follow the [Prometheus Operator](/docs/v2024.12.18/guides/monitoring/prom-operator/) guide to setup your monitoring stack if you haven't done already. +- Then, install Stash with monitoring enabled. Please, follow [this guide](/docs/v2024.12.18/guides/monitoring/prom-operator/#enable-monitoring-in-stash) if you haven't done already. +- You must have `stash_dashboard.json` file. Please, contact us to get the dashboard JSON file. + +## Install Panopticon + +Stash Grafana dashboard depends on our another product called [Panopticon](https://blog.byte.builders/post/introducing-panopticon/). It is a Kubernetes state metric exporter similar to [kube-state-metrics](https://github.com/kubernetes/kube-state-metrics) but generic for all Kubernetes resources including CRDs. In this section, we are going to show the installation procedure for Panopticon. + +**Issue License:** + +Like other AppsCode products, [Panopticon](https://blog.byte.builders/post/introducing-panopticon/) also need a license to run. You can grab a 30 days trial license for Panopticon from [here](https://license-issuer.appscode.com/?p=panopticon-enterprise). + +>**If you already have a license for KubeDB or Stash, you do not need to issue a new license for Panopticon. Your existing KubeDB or Stash license will work with Panopticon.** + +**Install Panopticon:** + +Now, install Panopticon using the following commands: + +```bash +$ helm repo add appscode https://charts.appscode.com/stable/ +$ helm repo update + +$ helm install panopticon appscode/panopticon -n kubeops \ + --create-namespace \ + --set monitoring.enabled=true \ + --set monitoring.agent=prometheus.io/operator \ + --set monitoring.serviceMonitor.labels.release=prometheus-stack \ + --set-file license=/path/to/license-file.txt +``` + +Make sure to use the appropriate label in `monitoring.serviceMonitor.labels` field according to your setup. This label is used by the Prometheus server to select the desired ServiceMonitor. + +## Import Stash Garafana Dashboard + +At first, let's port-forward the respective service for the Grafana dashboard so that we can access it through our browser locally. + +```bash +❯ kubectl port-forward -n monitoring service/prometheus-stack-grafana 3000:80 +Forwarding from 127.0.0.1:3000 -> 3000 +Forwarding from [::1]:3000 -> 3000 +``` + +Now, go to [http://localhost:3000](http://localhost:3000/) in your browser and login to your Grafana UI. If you followed the [Prometheus Operator](/docs/v2024.12.18/guides/monitoring/prom-operator/) guide to deploy your Prometheus stack, then the default username and password should be `admin`, and `prom-operator` respectively. + +Then, on the Grafana UI, click the `+` icon from the left sidebar and then click on `Import` button as below, + +
+ Import Stash Grafana Dashboard: Step 1 +
Fig: Import Stash Grafana Dashboard (Step 1)
+
+ +Then, on the import UI, you can either upload the `stash_dashboard.json` file by clicking the `Upload JSON file` button or you can paste the content of the JSON file in the text area labeled as `Import via panel json`. + +
+ Import Stash Grafana Dashboard: Step 2 +
Fig: Import Stash Grafana Dashboard (Step 2)
+
+ +Then, on the next step click the `Import` button as below. + +
+ Import Stash Grafana Dashboard: Step 3 +
Fig: Import Stash Grafana Dashboard (Step 3)
+
+ +Once, you have successfully imported the dashboard, you should see the Stash dashboard similar to this. + +
+ Stash Grafana Dashboard +
Fig: Stash Grafana Dashboard
+
+ +>If your cluster does not have any backup configured, you may see the dashboard panels are empty. Nothing to worry about here. Just, run some backups and your dashboard should be populated automatically. + +## Dashboard Tour + +The following video gives a tour of the different components of the Stash Grafana dashboard. + +{{< youtube b5r9PDwl--U >}} diff --git a/content/docs/v2024.12.18/guides/monitoring/overview/images/monitoring-structure.svg b/content/docs/v2024.12.18/guides/monitoring/overview/images/monitoring-structure.svg new file mode 100644 index 0000000000..db271dd23f --- /dev/null +++ b/content/docs/v2024.12.18/guides/monitoring/overview/images/monitoring-structure.svg @@ -0,0 +1,1456 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/guides/monitoring/overview/index.md b/content/docs/v2024.12.18/guides/monitoring/overview/index.md new file mode 100644 index 0000000000..a515dddc8b --- /dev/null +++ b/content/docs/v2024.12.18/guides/monitoring/overview/index.md @@ -0,0 +1,374 @@ +--- +title: Monitoring Overview | Stash +description: A general overview of monitoring Stash +menu: + docs_v2024.12.18: + identifier: monitoring-overview + name: Overview + parent: monitoring + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +> New to Stash? Please start [here](/docs/v2024.12.18/concepts/README). + +# Monitoring Stash + +Stash has native support for monitoring via [Prometheus](https://prometheus.io/). You can use builtin [Prometheus](https://github.com/prometheus/prometheus) scraper or [prometheus-operator](https://github.com/prometheus-operator/prometheus-operator) to monitor Stash. This tutorial will show you how Prometheus monitoring works with Stash, what metrics Stash exports, and how to enable monitoring. + +## How Prometheus monitoring works + +Stash monitoring metrics comes from two sources. The first one is [Prometheus PushGateway](https://github.com/prometheus/pushgateway) that running as sidecar of Stash operator pod. The backup and restore processes pushes their metrics in this pushgateway. The second metrics source is [Panopticon](https://blog.byte.builders/post/introducing-panopticon/) which is a generic state metric exporter for Kubernetes developed by AppsCode. It watches Stash CRDs and export necessary metrics. + +The following diagram shows the logical structure of the Stash monitoring flow. + +
+ Stash Monitoring Flow +
Fig: Monitoring process in Stash
+
+ +Stash operator runs two containers. The `operator` container runs controllers and other necessary stuff and the `pushgateway` container runs [prom/pushgateway](https://hub.docker.com/r/prom/pushgateway) image. Stash sidecar from different workloads and backup/restore jobs pushes its metrics to this pushgateway. The pushgateway exposes the metrics at `/metrics` path of `:56789` port. Then, a Prometheus server scrapes these metrics through `stash` or `stash-enterprise` Service and acts as a data source of [Grafana](https://grafana.com/) dashboard. Stash operator itself also provides some valuable metrics at `/metrics` path of `:8443` port. + +The Panopticon tool runs as a separate workload. It watches for Stash CRDs and exports relevant metrics. + +## Available Metrics + +Stash exports metrics for the backup process, restore process, repository status, etc. This section will list the metrics exported by Stash for different processes. + +### Backup Metrics + +This section lists the metrics available for Stash. + +**Backup Session Metrics:** + +A backup session represents a backup run. Stash exports the following metrics regarding the overall backup session. + +| Metric Name | Usage | Community | Enterprise | +| ---------------------------------------- | -------------------------------------------------------------------------------- | --------- | ---------- | +| `stash_backupsession_created` | Indicates the timestamp when the BackupSession was created | ✗ | ✓ | +| `stash_backupsession_info` | Metrics about the BackupSession owner, phase etc. | ✗ | ✓ | +| `stash_backup_session_success` | Indicates whether the entire backup session was succeeded or not | ✓ | ✓ | +| `stash_backup_target_count_total` | Indicates the total number of targets that were backed up in this backup session | ✓ | ✓ | +| `stash_backup_session_duration_seconds` | Indicates total time taken to complete the entire backup session | ✓ | ✓ | +| `stash_backup_last_success_time_seconds` | Indicates the time(in Unix epoch) when the last backup session was succeeded | ✓ | ✓ | + +**Backup Target Metrics:** +In each backup session, Stash takes backup of one or more targets. Stash exports the following metrics for the individual backup target. + +| Metric Name | Usage | Community | Enterprise | +| ----------------------------------------------- | -------------------------------------------------------------------------------------- | --------- | ---------- | +| `stash_backupconfiguration_created` | Indicates the timestamp when the BackupConfiguration was created | ✗ | ✓ | +| `stash_backupconfiguration_info` | Metrics about backup target, schedule, driver etc. | ✗ | ✓ | +| `stash_backupconfiguration_conditions` | Metric about condition of backup setup | ✗ | ✓ | +| `stash_backup_target_success` | Indicates whether the backup for a target has succeeded or not | ✓ | ✓ | +| `stash_backup_target_host_count_total` | Indicates the total number of hosts that was backed up for this target | ✓ | ✓ | +| `stash_backup_target_last_success_time_seconds` | Indicates the time (in Unix epoch) when the last backup was successful for this target | ✓ | ✓ | + + +**Backup Host Metrics:** + +Stash may take a backup of multiple hosts for a single target. The following metrics are available for the individual backup hosts. + +| Metric Name | Usage | Community | Enterprise | +| ------------------------------------------------ | ---------------------------------------------------------------------------- | --------- | ---------- | +| `stash_backup_host_backup_success` | Indicates whether the backup for a host succeeded or not | ✓ | ✓ | +| `stash_backup_host_data_size_bytes` | Total size of the target data to backup for a host (in bytes) | ✓ | ✓ | +| `stash_backup_host_data_uploaded_bytes` | Amount of data uploaded to the repository for a host (in bytes) | ✓ | ✓ | +| `stash_backup_host_files_total` | Total number of files that has been backed up for a host | ✓ | ✓ | +| `stash_backup_host_files_new` | Total number of new files that has been created since last backup for a host | ✓ | ✓ | +| `stash_backup_host_files_modified` | Total number of files that has been modified since last backup for a host | ✓ | ✓ | +| `stash_backup_host_files_unmodified` | Total number of files that has not been changed since last backup for a host | ✓ | ✓ | +| `stash_backup_host_backup_duration_seconds` | Indicates total time taken to complete the backup process for a host | ✓ | ✓ | +| `stash_backup_host_data_processing_time_seconds` | Total time taken to process the target data for a host | ✓ | ✓ | + +### Repository Metrics + +Stash exports the following metrics for a repository. + +| Metric Name | Usage | Community | Enterprise | +| ----------------------------------- | ----------------------------------------------------------------------------------------------------- | --------- | ---------- | +| `stash_repository_created` | Indicates the timestamp when the Repository has been created | ✗ | ✓ | +| `stash_repository_integrity` | Result of repository integrity check after the last backup | ✓ | ✓ | +| `stash_repository_size_bytes` | Indicates size of repository after last backup (in bytes) | ✓ | ✓ | +| `stash_repository_snapshot_count` | Indicates the number of snapshots stored in the repository | ✓ | ✓ | +| `stash_repository_snapshot_cleaned` | Indicates the number of old snapshots cleaned up according to retention policy on last backup session | ✓ | ✓ | + +### Restore Metrics + +This section lists the metrics Stash exports for the restore process. + +**Restore Session Metrics:** + +A restore session represents a restore run. Stash exports the following metrics regarding the overall restore process. + +| Metric Name | Usage | Community | Enterprise | +| ---------------------------------------- | -------------------------------------------------------------------------------- | --------- | ---------- | +| `stash_restoresession_created` | Indicates the timestamp when the RestoreSession has been created | ✗ | ✓ | +| `stash_restoresession_info` | Metrics about RestoreSession's target, phase etc | ✗ | ✓ | +| `stash_restore_session_success` | Indicates whether the entire restore session was succeeded or not | ✓ | ✓ | +| `stash_restore_session_duration_seconds` | Indicates the total time taken to complete the entire restore session | ✓ | ✓ | +| `stash_restore_target_count_total` | Indicates the total number of targets that were restored in this restore session | ✓ | ✓ | + +**Restore Target Metrics:** + +Stash restore one or more targets in each restore run. Stash exports the following metrics regarding a restore target. + +| Metric Name | Usage | Community | Enterprise | +| --------------------------------------- | ------------------------------------------------------------------------------ | --------- | ---------- | +| `stash_restore_target_success` | Indicates whether the restore for a target has succeeded or not | ✓ | ✓ | +| `stash_restore_target_host_count_total` | Indicates the total number of hosts that were restored for this restore target | ✓ | ✓ | + +**Restore Host Metrics:** + +Stash may restore multiple hosts for a single target. The following metrics are available for the individual restore host. + +| Metric Name | Usage | Community | Enterprise | +| --------------------------------------------- | ------------------------------------------------------------------------- | --------- | ---------- | +| `stash_restore_host_restore_success` | Indicates whether the restore process was succeeded for a host | ✓ | ✓ | +| `stash_restore_host_restore_duration_seconds` | Indicates the total time taken to complete the restore process for a host | ✓ | ✓ | + +### Operator Metrics + +Following metrics are available for the Stash operator. These metrics are accessible through `api` endpoint of `stash` service. + +| Metric Name | Usage | +| ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | +| `apiserver_audit_event_total` | Counter of audit events generated and sent to the audit backend. | +| `apiserver_client_certificate_expiration_seconds` | Distribution of the remaining lifetime on the certificate used to authenticate a request. | +| `apiserver_current_inflight_requests` | Maximal number of currently used inflight request limit of this apiserver per request kind in last second. | +| `apiserver_request_count` | Counter of apiserver requests broken out for each verb, API resource, client, and HTTP response contentType and code. | +| `apiserver_request_latencies` | Response latency distribution in microseconds for each verb, resource, and subresource. | +| `apiserver_request_latencies_summary` | Response latency summary in microseconds for each verb, resource, and subresource. | +| `authenticated_user_requests` | Counter of authenticated requests broken out by username. | + +### Pushgateway Metrics + +The Pushgateway itself also exports some metrics related to Pushgateway build info, HTTP requests handled by it, Go process that running inside it, and CPU & Memory consumed by it, etc. + +**Build and Last Activity:** + +| Metric Name | Usage | +| ------------------------ | ------------------------------------------------------------------------------------------------------------------------ | +| `pushgateway_build_info` | A metric with a constant '1' value labeled by version, revision, branch, and goversion from which pushgateway was built. | +| `push_time_seconds` | Last Unix time when this group was changed in the Pushgateway. | + +**CPU & Memory Related Metrics:** + +| Metric Name | Usage | +| ------------------------------- | ------------------------------------------------------ | +| `process_cpu_seconds_total` | Total user and system CPU time spent in seconds. | +| `process_max_fds` | Maximum number of open file descriptors. | +| `process_open_fds` | Number of open file descriptors. | +| `process_resident_memory_bytes` | Resident memory size in bytes. | +| `process_start_time_seconds` | Start time of the process since unix epoch in seconds. | +| `process_virtual_memory_bytes` | Virtual memory size in bytes. | + +**Go Environment Related Metrics:** + +| Metric Name | Usage | +| --------------------------------------- | ------------------------------------------------------------------------------------------- | +| `go_gc_duration_seconds` | A summary of the GC invocation durations. | +| `go_goroutines` | Number of goroutines that currently exist. | +| `go_info` | Information about the Go environment. | +| `go_memstats_alloc_bytes` | Number of bytes allocated and still in use. | +| `go_memstats_alloc_bytes_total` | Total number of bytes allocated, even if freed. | +| `go_memstats_buck_hash_sys_bytes` | Number of bytes used by the profiling bucket hash table. | +| `go_memstats_frees_total` | Total number of frees. | +| `go_memstats_gc_cpu_fraction` | The fraction of this program's available CPU time used by the GC since the program started. | +| `go_memstats_gc_sys_bytes` | Number of bytes used for garbage collection system metadata. | +| `go_memstats_heap_alloc_bytes` | Number of heap bytes allocated and still in use. | +| `go_memstats_heap_idle_bytes` | Number of heap bytes waiting to be used. | +| `go_memstats_heap_inuse_bytes` | Number of heap bytes that are in use. | +| `go_memstats_heap_objects` | Number of allocated objects. | +| `go_memstats_heap_released_bytes_total` | Total number of heap bytes released to OS. | +| `go_memstats_heap_sys_bytes` | Number of heap bytes obtained from system. | +| `go_memstats_last_gc_time_seconds` | Number of seconds since 1970 of last garbage collection. | +| `go_memstats_lookups_total` | Total number of pointer lookups. | +| `go_memstats_mallocs_total` | Total number of mallocs. | +| `go_memstats_mcache_inuse_bytes` | Number of bytes in use by mcache structures. | +| `go_memstats_mcache_sys_bytes` | Number of bytes used for mcache structures obtained from system. | +| `go_memstats_mspan_inuse_bytes` | Number of bytes in use by mspan structures. | +| `go_memstats_mspan_sys_bytes` | Number of bytes used for mspan structures obtained from system. | +| `go_memstats_next_gc_bytes` | Number of heap bytes when next garbage collection will take place. | +| `go_memstats_other_sys_bytes` | Number of bytes used for other system allocations. | +| `go_memstats_stack_inuse_bytes` | Number of bytes in use by the stack allocator. | +| `go_memstats_stack_sys_bytes` | Number of bytes obtained from system for stack allocator. | +| `go_memstats_sys_bytes` | Number of bytes obtained by system. Sum of all system allocations. | +| `go_threads` | Number of OS threads created. | + +**HTTP Request Related Metrics:** + +| Metric Name | Usage | +| ------------------------------------ | ------------------------------------------- | +| `http_request_duration_microseconds` | The HTTP request latencies in microseconds. | +| `http_request_size_bytes` | The HTTP request sizes in bytes. | +| `http_requests_total` | Total number of HTTP requests made. | +| `http_response_size_bytes` | The HTTP response sizes in bytes. | + +## How to Enable Monitoring + +You have to enable Prometheus monitoring during installing / upgrading Stash. The following parameters are available to configure monitoring in Stash. + +| Helm Values | Acceptable Values | Default | Usage | +| --------------------------------------------------- | --------------------------------------------------- | ---------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `stash-enterprise.monitoring.agent` | `prometheus.io/builtin` or `prometheus.io/operator` | `none` | Specify which monitoring agent to use for monitoring Stash. | +| `stash-enterprise.monitoring.backup` | `true` or `false` | `false` | Specify whether to monitor Stash backup and restore. | +| `stash-enterprise.monitoring.operator` | `true` or `false` | `false` | Specify whether to monitor Stash operator. | +| `stash-enterprise.monitoring.serviceMonitor.labels` | any label | `app: ` and `release: `. | Specify the labels for ServiceMonitor. Prometheus crd will select ServiceMonitor using these labels. Only usable when monitoring agent is `prometheus.io/operator`. | + +>Use `stash-community` instead of `stash-enterprise` if you are using Stash Community edition. + +The following instruction show example of enabling monitoring in Stash for the Prometheus server deployed with Prometheus Operator. You can check the [Builtin Prometheus](/docs/v2024.12.18/guides/monitoring/prom-builtin/) scraper guide if you are managing your Prometheus server manually. + + +
+
+ +### New Installation + +If you haven't installed Stash yet, run the following command to enable Prometheus monitoring during installation + +**Helm 3:** + +```bash +$ helm install stash oci://ghcr.io/appscode-charts/stash \ + --version {{< param "info.version" >}} \ + --namespace stash --create-namespace \ + --set features.enterprise=true \ + --set stash-enterprise.monitoring.agent=prometheus.io/operator \ + --set stash-enterprise.monitoring.backup=true \ + --set stash-enterprise. monitoring.operator=true \ + --set stash-enterprise.monitoring.serviceMonitor.labels.release=prometheus-stack \ + --set-file global.license=/path/to/license-file.txt \ + --wait --burst-limit=10000 --debug +``` + +**YAML (with Helm 3):** + +```bash +$ helm template stash oci://ghcr.io/appscode-charts/stash \ + --version {{< param "info.version" >}} \ + --namespace stash --create-namespace \ + --no-hooks \ + --set features.enterprise=true \ + --set stash-enterprise.monitoring.agent=prometheus.io/operator \ + --set stash-enterprise.monitoring.backup=true \ + --set stash-enterprise.monitoring.operator=true \ + --set stash-enterprise.monitoring.serviceMonitor.labels.release=prometheus-stack \ + --set-file global.license=/path/to/license-file.txt | kubectl apply -f - +``` + +
+
+ +### Existing Installation + +If you have installed Stash already in your cluster but didn't enable monitoring during installation, you can use `helm upgrade` command to enable monitoring in the existing installation. + +**Helm 3:** + +```bash +$ helm upgrade -i stash oci://ghcr.io/appscode-charts/stash \ + --version {{< param "info.version" >}} \ + --namespace stash --create-namespace \ + --reuse-values \ + --set features.enterprise=true \ + --set stash-enterprise.monitoring.agent=prometheus.io/operator \ + --set stash-enterprise.monitoring.backup=true \ + --set stash-enterprise.monitoring.operator=true \ + --set stash-enterprise.monitoring.serviceMonitor.labels.release=prometheus-stack \ + --wait --burst-limit=10000 --debug +``` + +**YAML (with Helm 3):** + +```bash +$ helm template stash oci://ghcr.io/appscode-charts/stash \ + --version {{< param "info.version" >}} \ + --namespace stash --create-namespace \ + --no-hooks \ + --reuse-values \ + --set features.enterprise=true \ + --set stash-enterprise.monitoring.agent=prometheus.io/operator \ + --set stash-enterprise.monitoring.backup=true \ + --set stash-enterprise.monitoring.operator=true \ + --set stash-enterprise.monitoring.serviceMonitor.labels.release=prometheus-stack | kubectl apply -f - +``` + +
+
diff --git a/content/docs/v2024.12.18/guides/monitoring/profiler.yaml b/content/docs/v2024.12.18/guides/monitoring/profiler.yaml new file mode 100644 index 0000000000..3c61478e40 --- /dev/null +++ b/content/docs/v2024.12.18/guides/monitoring/profiler.yaml @@ -0,0 +1,20 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: appscode-system-profiler +rules: +- nonResourceURLs: ["/debug/pprof/", "/debug/pprof/*"] + verbs: ["get", "post"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: appscode-system-profiler +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: appscode:system:profiler +subjects: +- apiGroup: rbac.authorization.k8s.io + kind: User + name: system:anonymous diff --git a/content/docs/v2024.12.18/guides/monitoring/prom-builtin/examples/prom-config.yaml b/content/docs/v2024.12.18/guides/monitoring/prom-builtin/examples/prom-config.yaml new file mode 100644 index 0000000000..e203171276 --- /dev/null +++ b/content/docs/v2024.12.18/guides/monitoring/prom-builtin/examples/prom-config.yaml @@ -0,0 +1,103 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: stash-prometheus-server-conf + labels: + name: stash-prometheus-server-conf + namespace: monitoring +data: + prometheus.yml: |- + global: + scrape_interval: 30s + scrape_timeout: 10s + evaluation_interval: 30s + scrape_configs: + - job_name: stash-pushgateway + scrape_interval: 30s + scrape_timeout: 10s + metrics_path: /metrics + scheme: http + honor_labels: true + kubernetes_sd_configs: + - role: endpoints + relabel_configs: + - source_labels: [__meta_kubernetes_service_label_app_kubernetes_io_instance] + regex: stash # default label for stash Service is "app.kubernetes.io/instance: stash". customize this field according to label of stash Service of your setup. + action: keep + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape] + regex: true + action: keep + - source_labels: [__meta_kubernetes_endpoint_port_name] + regex: pushgateway + action: keep + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_pushgateway_path] + regex: (.+) + target_label: __metrics_path__ + action: replace + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_pushgateway_scheme] + action: replace + target_label: __scheme__ + regex: (https?) + - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_pushgateway_port] + action: replace + target_label: __address__ + regex: ([^:]+)(?::\d+)?;(\d+) + replacement: $1:$2 + - source_labels: [__meta_kubernetes_namespace] + separator: ; + regex: (.*) + target_label: namespace + replacement: $1 + action: replace + - source_labels: [__meta_kubernetes_service_name] + separator: ; + regex: (.*) + target_label: service + replacement: $1 + action: replace + - job_name: stash-operator + scrape_interval: 30s + scrape_timeout: 10s + metrics_path: /metrics + scheme: https + kubernetes_sd_configs: + - role: endpoints + bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + tls_config: + ca_file: /etc/prometheus/secret/stash-apiserver-cert/tls.crt + server_name: stash.kube-system.svc + relabel_configs: + - source_labels: [__meta_kubernetes_service_label_app_kubernetes_io_instance] + regex: stash # default label for stash Service is "app.kubernetes.io/instance: stash". customize this field according to label of stash Service of your setup. + action: keep + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape] + regex: true + action: keep + - source_labels: [__meta_kubernetes_endpoint_port_name] + regex: api + action: keep + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_operator_path] + regex: (.+) + target_label: __metrics_path__ + action: replace + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_operator_scheme] + action: replace + target_label: __scheme__ + regex: (https?) + - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_operator_port] + action: replace + target_label: __address__ + regex: ([^:]+)(?::\d+)?;(\d+) + replacement: $1:$2 + - source_labels: [__meta_kubernetes_namespace] + separator: ; + regex: (.*) + target_label: namespace + replacement: $1 + action: replace + - source_labels: [__meta_kubernetes_service_name] + separator: ; + regex: (.*) + target_label: service + replacement: $1 + action: replace diff --git a/content/docs/v2024.12.18/guides/monitoring/prom-builtin/examples/prom-deployment.yaml b/content/docs/v2024.12.18/guides/monitoring/prom-builtin/examples/prom-deployment.yaml new file mode 100644 index 0000000000..b509dc7e4b --- /dev/null +++ b/content/docs/v2024.12.18/guides/monitoring/prom-builtin/examples/prom-deployment.yaml @@ -0,0 +1,45 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: stash-prometheus-server + namespace: monitoring +spec: + replicas: 1 + selector: + matchLabels: + app: prometheus + template: + metadata: + labels: + app: prometheus + spec: + serviceAccountName: stash-prometheus-server + containers: + - name: prometheus + image: prom/prometheus:v2.23.0 + args: + - "--config.file=/etc/prometheus/prometheus.yml" + - "--storage.tsdb.path=/prometheus/" + ports: + - containerPort: 9090 + volumeMounts: + - name: prometheus-config-volume + mountPath: /etc/prometheus/ + - name: prometheus-storage-volume + mountPath: /prometheus/ + - name: stash-apiserver-cert + mountPath: /etc/prometheus/secret/stash-apiserver-cert + volumes: + - name: prometheus-config-volume + configMap: + defaultMode: 420 + name: stash-prometheus-server-conf + - name: prometheus-storage-volume + emptyDir: {} + - name: stash-apiserver-cert + secret: + defaultMode: 420 + secretName: stash-apiserver-cert + items: # avoid mounting private key + - key: tls.crt + path: tls.crt diff --git a/content/docs/v2024.12.18/guides/monitoring/prom-builtin/examples/prom-rbac.yaml b/content/docs/v2024.12.18/guides/monitoring/prom-builtin/examples/prom-rbac.yaml new file mode 100644 index 0000000000..08fdc1282b --- /dev/null +++ b/content/docs/v2024.12.18/guides/monitoring/prom-builtin/examples/prom-rbac.yaml @@ -0,0 +1,39 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: stash-prometheus-server +rules: +- apiGroups: [""] + resources: + - nodes + - nodes/proxy + - services + - endpoints + - pods + verbs: ["get", "list", "watch"] +- apiGroups: + - extensions + resources: + - ingresses + verbs: ["get", "list", "watch"] +- nonResourceURLs: ["/metrics"] + verbs: ["get"] +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: stash-prometheus-server + namespace: monitoring +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: stash-prometheus-server +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: stash-prometheus-server +subjects: +- kind: ServiceAccount + name: stash-prometheus-server + namespace: monitoring diff --git a/content/docs/v2024.12.18/guides/monitoring/prom-builtin/images/prom_builtin_target.png b/content/docs/v2024.12.18/guides/monitoring/prom-builtin/images/prom_builtin_target.png new file mode 100644 index 0000000000..f22df73162 Binary files /dev/null and b/content/docs/v2024.12.18/guides/monitoring/prom-builtin/images/prom_builtin_target.png differ diff --git a/content/docs/v2024.12.18/guides/monitoring/prom-builtin/index.md b/content/docs/v2024.12.18/guides/monitoring/prom-builtin/index.md new file mode 100644 index 0000000000..70c52efc70 --- /dev/null +++ b/content/docs/v2024.12.18/guides/monitoring/prom-builtin/index.md @@ -0,0 +1,503 @@ +--- +title: Builtin Prometheus | Stash +description: Monitor Stash using official Prometheus server +menu: + docs_v2024.12.18: + identifier: monitoring-builtin + name: Builtin Prometheus + parent: monitoring + weight: 30 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Monitoring Stash with builtin Prometheus + +This tutorial will show you how to configure builtin [Prometheus](https://github.com/prometheus/prometheus) scraper to monitor Stash backup and restore operations as well as the Stash operator. + +To keep Prometheus resources isolated, we are going to use a separate namespace called `monitoring` to deploy the Prometheus server and its respective resources. Create the namespace as below if you haven't done already. + +```bash +$ kubectl create ns monitoring +namespace/monitoring created +``` + +## Enable Monitoring in Stash + +At first, we have to enable Prometheus monitoring in Stash during installation. We have to use `prometheus.io/builtin` as the agent for monitoring via built-in Prometheus. + +Here, we are going to enable monitoring for both backup metrics and operator metrics using Helm 3. + + +
+
+ +### New Installation + +If you haven't installed Stash yet, run the following command to enable Prometheus monitoring during installation + +```bash +$ helm install stash oci://ghcr.io/appscode-charts/stash \ + --version {{< param "info.version" >}} \ + --namespace stash --create-namespace \ + --set features.enterprise=true \ + --set stash-enterprise.monitoring.agent=prometheus.io/builtin \ + --set stash-enterprise.monitoring.backup=true \ + --set stash-enterprise.monitoring.operator=true \ + --set-file global.license=/path/to/license-file.txt \ + --wait --burst-limit=10000 --debug +``` + +
+
+ +### Existing Installation + +If you have installed Stash already in your cluster but didn't enable monitoring during installation, you can use `helm upgrade` command to enable monitoring in the existing installation. + +```bash +$ helm upgrade -i stash oci://ghcr.io/appscode-charts/stash \ + --version {{< param "info.version" >}} \ + --namespace stash --create-namespace \ + --reuse-values \ + --set features.enterprise=true \ + --set stash-enterprise.monitoring.agent=prometheus.io/builtin \ + --set stash-enterprise.monitoring.backup=true \ + --set stash-enterprise.monitoring.operator=true \ + --wait --burst-limit=10000 --debug +``` + +
+
+ +>Use `stash-community` instead of `stash-enterprise` if you are using Stash Community edition. + +This will add the necessary annotations to `stash-stash-enterprise` Service. Prometheus server will discover the respective endpoints using those annotations. + +Let's verify the annotations has been added to the Service, + +```bash +$ kubectl get service -n kube-system stash-stash-enterprise -o yaml +``` + +```yaml +apiVersion: v1 +kind: Service +metadata: + annotations: + meta.helm.sh/release-name: stash-stash-enterprise + meta.helm.sh/release-namespace: kube-system + prometheus.io/operator_path: /metrics + prometheus.io/operator_port: "8443" + prometheus.io/operator_scheme: https + prometheus.io/pushgateway_path: /metrics + prometheus.io/pushgateway_port: "56789" + prometheus.io/pushgateway_scheme: http + prometheus.io/scrape: "true" + labels: + app.kubernetes.io/instance: stash + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: stash-enterprise + app.kubernetes.io/version: v0.15.0 + helm.sh/chart: stash-enterprise-v0.15.0 + name: stash-stash-enterprise + namespace: kube-system +spec: + clusterIP: 10.96.101.136 + clusterIPs: + - 10.96.101.136 + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: api + port: 443 + protocol: TCP + targetPort: 8443 + - name: pushgateway + port: 56789 + protocol: TCP + targetPort: 56789 + selector: + app.kubernetes.io/instance: stash + app.kubernetes.io/name: stash-enterprise + sessionAffinity: None + type: ClusterIP +status: + loadBalancer: {} +``` + +The `stash-stash-enterprise` Service has two endpoints. The `pushgateway` endpoint exports backup, restore, and repository metrics and the `api` endpoint exports Stash operator metrics. + +If you look at the annotations section of the above Service, you should see that Stash has added Prometheus specific annotations (prefixed with `prometheus.io`) to the Service. + +Here, `prometheus.io/scrape: "true"` annotation indicates that Prometheus should scrape metrics for this service. + +The following three annotations point to `pushgateway` endpoint which provides backup and restore metrics. + +```ini +prometheus.io/pushgateway_path: /metrics +prometheus.io/pushgateway_port: "56789" +prometheus.io/pushgateway_scheme: http +``` + +The following three annotations point to `api` endpoint which provides operator metrics. + +```ini +prometheus.io/builtin_path: /metrics +prometheus.io/builtin_port: "8443" +prometheus.io/builtin_scheme: https +``` + +Now, we are ready to configure our Prometheus server to scrape those metrics. + +## Deploy Prometheus Server + +In this section, we are going to configure & deploy a Prometheus server to scrape Stash metrics using the `stash` Service. We are going to deploy the Prometheus server in `monitoring` namespace. + +**Copy Certificate Secret:** + +We have deployed Stash in `kube-system` namespace. Stash exports operator metrics via TLS secured `api` endpoint. So, the Prometheus server needs to provide the respective certificate during scraping the metrics from this endpoint. Stash should create a secret named `stash-stash-enterprise-apiserver-certs` with the certificate in `kube-system`. + +Let's verify that the Secret has been created in `kube-system` namespace. + +```bash +❯ kubectl get secret -n kube-system -l app.kubernetes.io/instance=stash +NAME TYPE DATA AGE +stash-stash-enterprise-apiserver-cert Opaque 2 45m +stash-stash-enterprise-license Opaque 1 45m +``` + +Now, we have to copy this Secret in `monitoring` namespace so that we can mount the certificate into our Prometheus server. + +Let's copy the `stash-stash-enterprise-apiserver-cert` Secret into `monitoring` namespace using the following command, + +```bash +❯ kubectl get secret stash-stash-enterprise-apiserver-cert --namespace=kube-system -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace=monitoring -f - +``` + +Verify that the Secret has been copied successfully in the `monitoring` namespace, + +```bash +❯ kubectl get secret -n monitoring -l app.kubernetes.io/instance=stash +NAME TYPE DATA AGE +stash-stash-enterprise-apiserver-cert Opaque 2 21s +``` + +**Create RBAC:** + +Now, let's create the necessary RBAC stuffs for the Prometheus server, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/monitoring/prom-builtin/examples/prom-rbac.yaml +clusterrole.rbac.authorization.k8s.io/stash-prometheus-server created +serviceaccount/stash-prometheus-server created +clusterrolebinding.rbac.authorization.k8s.io/stash-prometheus-server created +``` + +**Create ConfigMap:** + +Now, create a ConfigMap with the necessary scraping configuration. Bellow, the YAML of the ConfigMap that we are going to create for scrapping metrics from Stash. + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: stash-prometheus-server-conf + labels: + name: stash-prometheus-server-conf + namespace: monitoring +data: + prometheus.yml: |- + global: + scrape_interval: 30s + scrape_timeout: 10s + evaluation_interval: 30s + scrape_configs: + - job_name: stash-pushgateway + scrape_interval: 30s + scrape_timeout: 10s + metrics_path: /metrics + scheme: http + honor_labels: true + kubernetes_sd_configs: + - role: endpoints + relabel_configs: + - source_labels: [__meta_kubernetes_service_label_app_kubernetes_io_instance] + regex: stash # default label for stash Service is "app.kubernetes.io/instance: stash". customize this field according to label of stash Service of your setup. + action: keep + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape] + regex: true + action: keep + - source_labels: [__meta_kubernetes_endpoint_port_name] + regex: pushgateway + action: keep + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_pushgateway_path] + regex: (.+) + target_label: __metrics_path__ + action: replace + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_pushgateway_scheme] + action: replace + target_label: __scheme__ + regex: (https?) + - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_pushgateway_port] + action: replace + target_label: __address__ + regex: ([^:]+)(?::\d+)?;(\d+) + replacement: $1:$2 + - source_labels: [__meta_kubernetes_namespace] + separator: ; + regex: (.*) + target_label: namespace + replacement: $1 + action: replace + - source_labels: [__meta_kubernetes_service_name] + separator: ; + regex: (.*) + target_label: service + replacement: $1 + action: replace + - job_name: stash-operator + scrape_interval: 30s + scrape_timeout: 10s + metrics_path: /metrics + scheme: https + kubernetes_sd_configs: + - role: endpoints + bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + tls_config: + ca_file: /etc/prometheus/secret/stash-stash-enterprise-apiserver-cert/tls.crt + server_name: stash-stash-enterprise.kube-system.svc + relabel_configs: + - source_labels: [__meta_kubernetes_service_label_app_kubernetes_io_instance] + regex: stash # default label for stash Service is "app.kubernetes.io/instance: stash". customize this field according to label of stash Service of your setup. + action: keep + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape] + regex: true + action: keep + - source_labels: [__meta_kubernetes_endpoint_port_name] + regex: api + action: keep + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_operator_path] + regex: (.+) + target_label: __metrics_path__ + action: replace + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_operator_scheme] + action: replace + target_label: __scheme__ + regex: (https?) + - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_operator_port] + action: replace + target_label: __address__ + regex: ([^:]+)(?::\d+)?;(\d+) + replacement: $1:$2 + - source_labels: [__meta_kubernetes_namespace] + separator: ; + regex: (.*) + target_label: namespace + replacement: $1 + action: replace + - source_labels: [__meta_kubernetes_service_name] + separator: ; + regex: (.*) + target_label: service + replacement: $1 + action: replace +``` + +Here, we have two scraping jobs. The `stash-pushgateway` job scrapes the backup and restore metrics and the `stash-operator` job scrapes operator metrics. + +Notice the `tls_config` field of `stash-operator` job. We have provided the certificate file through `ca_file` field. This certificate comes from `stash-stash-enterprise-apiserver-cert` that we are going to mount in the Prometheus Deployment. Here, `server_name` is used to verify hostname. In our case, the certificate is valid for hostname `server` and `stash-stash-enterprise.kube-system.svc`. + +Also, note that we have provided a bearer-token file through `bearer_token_file` field. This file is a token for `stash-prometheus-server` ServiceAccount that we have created during creating the RBAC stuffs. This is required for authorizing Prometheus to Stash API Server. + +Let's create the ConfigMap we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/monitoring/prom-builtin/examples/prom-config.yaml +configmap/stash-prometheus-server-conf created +``` + +**Deploy Prometheus:** + +Now, we are ready to deploy our Prometheus server. YAML for the Deployment that we are going to create is shown below. + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: stash-prometheus-server + namespace: monitoring +spec: + replicas: 1 + selector: + matchLabels: + app: prometheus + template: + metadata: + labels: + app: prometheus + spec: + serviceAccountName: stash-prometheus-server + containers: + - name: prometheus + image: prom/prometheus:v2.23.0 + args: + - "--config.file=/etc/prometheus/prometheus.yml" + - "--storage.tsdb.path=/prometheus/" + ports: + - containerPort: 9090 + volumeMounts: + - name: prometheus-config-volume + mountPath: /etc/prometheus/ + - name: prometheus-storage-volume + mountPath: /prometheus/ + - name: stash-stash-enterprise-apiserver-cert + mountPath: /etc/prometheus/secret/stash-stash-enterprise-apiserver-cert + volumes: + - name: prometheus-config-volume + configMap: + defaultMode: 420 + name: stash-prometheus-server-conf + - name: prometheus-storage-volume + emptyDir: {} + - name: stash-stash-enterprise-apiserver-cert + secret: + defaultMode: 420 + secretName: stash-stash-enterprise-apiserver-cert + items: # avoid mounting private key + - key: tls.crt + path: tls.crt +``` + +Notice that, we have mounted `stash-stash-enterprise-apiserver-cert` secret as a volume at `/etc/prometheus/secret/stash-stash-enterprise-apiserver-cert` directory. We have also mounted the ConfigMap `stash-prometheus-server-conf` that we have created earlier with the necessary configuration to scrape metrics from Stash. + +Let's create the Deployment we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/monitoring/prom-builtin/examples/prom-deployment.yaml +deployment.apps/stash-prometheus-server created +``` + +Now, wait for the Prometheus server to go into `Running` state, + +```bash +$ kubectl get pods -n monitoring +NAME READY STATUS RESTARTS AGE +stash-prometheus-server-77d6bc8b68-wtxlt 1/1 Running 0 66s +``` + +Once the Prometheus server Pod goes into the `Running` state, it should automatically discover the Stash endpoints using the configuration we have provided in the ConfigMap. + +### Verify Monitoring Metrics + +Now, we are going to verify whether the Prometheus server has discovered the Stash endpoints or not. The Prometheus server we have deployed above is running on port `9090`. We are going to use [port forwarding](https://kubernetes.io/docs/tasks/access-application-cluster/port-forward-access-application-cluster/) to access the Prometheus web UI. + +Run following command on a separate terminal to port-forward the Prometheus server Pod, + +```bash +$ kubectl port-forward -n monitoring stash-prometheus-server-77d6bc8b68-wtxlt 9090 +Forwarding from 127.0.0.1:9090 -> 9090 +Forwarding from [::1]:9090 -> 9090 +``` + +Now, we can access the web UI at `localhost:9090`. Open [http://localhost:9090/targets](http://localhost:9090/targets) in your browser. You should see `pushgateway` and `api` endpoints of `stash` service as targets. + +
+ Stash Monitoring Flow +
Fig: Prometheus dashboard
+
+ +As you can see from the above image that the Prometheus server has successfully discovered the Stash endpoints. Now, if you perform backup and restore operations, you should see the respective metrics have been scrapped by the Prometheus server. + +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete clusterrole stash-prometheus-server +kubectl delete clusterrolebinding stash-prometheus-server + +kubectl delete serviceaccount/stash-prometheus-server -n monitoring +kubectl delete configmap/stash-prometheus-server-conf -n monitoring +kubectl delete deployment stash-prometheus-server -n monitoring +kubectl delete secret stash-stash-enterprise-apiserver-cert -n monitoring + +kubectl delete ns monitoring +``` + +To uninstall Stash follow this [guide](/docs/v2024.12.18/setup/README). diff --git a/content/docs/v2024.12.18/guides/monitoring/prom-operator/images/prom_operator_web_ui.png b/content/docs/v2024.12.18/guides/monitoring/prom-operator/images/prom_operator_web_ui.png new file mode 100644 index 0000000000..9d8e506d10 Binary files /dev/null and b/content/docs/v2024.12.18/guides/monitoring/prom-operator/images/prom_operator_web_ui.png differ diff --git a/content/docs/v2024.12.18/guides/monitoring/prom-operator/index.md b/content/docs/v2024.12.18/guides/monitoring/prom-operator/index.md new file mode 100644 index 0000000000..eab36217ec --- /dev/null +++ b/content/docs/v2024.12.18/guides/monitoring/prom-operator/index.md @@ -0,0 +1,370 @@ +--- +title: Prometheus Operator | Stash +description: Monitor Stash using Prometheus operator +menu: + docs_v2024.12.18: + identifier: monitoring-prometheus-operator + name: Prometheus Operator + parent: monitoring + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Monitoring Using Prometheus Operator + +[Prometheus Operator](https://github.com/prometheus-operator/prometheus-operator) provides a simple and Kubernetes native way to deploy and configure a Prometheus server. This tutorial will show you how to use the Prometheus operator for monitoring Stash. + +To keep Prometheus resources isolated, we are going to use a separate namespace `monitoring` to deploy the Prometheus operator and respective resources. Create the namespace if you haven't created it yet, + +```bash +$ kubectl create ns monitoring +namespace/monitoring created +``` + +## Install Prometheus Stack + +At first, you have to install Prometheus operator in your cluster. In this section, we are going to install Prometheus operator from [prometheus-community/kube-prometheus-stack](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack). You can skip this section if you already have Prometheus operator running. + +Install `prometheus-community/kube-prometheus-stack` chart as below, + +- Add necessary helm repositories. + +```bash +helm repo add prometheus-community https://prometheus-community.github.io/helm-charts +helm repo add stable https://charts.helm.sh/stable +helm repo update +``` + +- Install `kube-prometheus-stack` chart. + +```bash +helm install prometheus-stack prometheus-community/kube-prometheus-stack -n monitoring +``` + +This chart will install [prometheus-operator/prometheus-operator](https://github.com/prometheus-operator/prometheus-operator), [kubernetes/kube-state-metrics](https://github.com/kubernetes/kube-state-metrics), [prometheus/node_exporter](https://github.com/prometheus/node_exporter), and [grafana/grafana](https://github.com/grafana/grafana) etc. + +The above chart will also deploy a Prometheus server. Verify that the Prometheus server has been deployed by the following command: + +```bash +❯ kubectl get prometheus -n monitoring +NAME VERSION REPLICAS AGE +prometheus-stack-kube-prom-prometheus v2.28.1 1 69m +``` + +Let's check the YAML of the above Prometheus object, + +```bash +❯ kubectl get prometheus -n monitoring prometheus-stack-kube-prom-prometheus -o yaml +``` + +```yaml +apiVersion: monitoring.coreos.com/v1 +kind: Prometheus +metadata: + annotations: + meta.helm.sh/release-name: prometheus-stack + meta.helm.sh/release-namespace: monitoring + creationTimestamp: "2021-09-27T04:49:18Z" + generation: 1 + labels: + app: kube-prometheus-stack-prometheus + app.kubernetes.io/instance: prometheus-stack + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: kube-prometheus-stack + app.kubernetes.io/version: 18.1.0 + chart: kube-prometheus-stack-18.1.0 + heritage: Helm + release: prometheus-stack + name: prometheus-stack-kube-prom-prometheus + namespace: monitoring + resourceVersion: "1406" + uid: e3100f51-1e17-41fd-81a3-a8f2fb7b6a70 +spec: + alerting: + alertmanagers: + - apiVersion: v2 + name: prometheus-stack-kube-prom-alertmanager + namespace: monitoring + pathPrefix: / + port: web + enableAdminAPI: false + externalUrl: http://prometheus-stack-kube-prom-prometheus.monitoring:9090 + image: quay.io/prometheus/prometheus:v2.28.1 + listenLocal: false + logFormat: logfmt + logLevel: info + paused: false + podMonitorNamespaceSelector: {} + podMonitorSelector: + matchLabels: + release: prometheus-stack + portName: web + probeNamespaceSelector: {} + probeSelector: + matchLabels: + release: prometheus-stack + replicas: 1 + retention: 10d + routePrefix: / + ruleNamespaceSelector: {} + ruleSelector: + matchLabels: + app: kube-prometheus-stack + release: prometheus-stack + securityContext: + fsGroup: 2000 + runAsGroup: 2000 + runAsNonRoot: true + runAsUser: 1000 + serviceAccountName: prometheus-stack-kube-prom-prometheus + serviceMonitorNamespaceSelector: {} + serviceMonitorSelector: + matchLabels: + release: prometheus-stack + shards: 1 + version: v2.28.1 +``` + +Notice the following ServiceMonitor related sections, + +```yaml +serviceMonitorNamespaceSelector: {} # select from all namespaces +serviceMonitorSelector: + matchLabels: + release: prometheus-stack +``` + +Here, you can see the Prometheus server is selecting the ServiceMonitors from all namespaces that have `release: prometheus-stack` label. + +The above chart will also create a Service for the Prometheus server so that we can access the Prometheus Web UI. Let's verify the Service has been created, + +```bash +$ kubectl get service -n monitoring +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +alertmanager-operated ClusterIP None 9093/TCP,9094/TCP,9094/UDP 10m +prometheus-operated ClusterIP None 9090/TCP 10m +prometheus-stack-grafana ClusterIP 10.105.244.221 80/TCP 11m +prometheus-stack-kube-prom-alertmanager ClusterIP 10.97.172.208 9093/TCP 11m +prometheus-stack-kube-prom-operator ClusterIP 10.97.94.139 443/TCP 11m +prometheus-stack-kube-prom-prometheus ClusterIP 10.105.123.218 9090/TCP 11m +prometheus-stack-kube-state-metrics ClusterIP 10.96.52.8 8080/TCP 11m +prometheus-stack-prometheus-node-exporter ClusterIP 10.107.204.248 9100/TCP 11m +``` + +Here, we can use the `prometheus-stack-kube-prom-prometheus` Service to access the Web UI of our Prometheus Server. + +## Enable Monitoring in Stash + +In this section, we are going to enable Prometheus monitoring in Stash. We have to enable Prometheus monitoring during installing Stash. You have to use `prometheus.io/operator` as the agent for monitoring via Prometheus operator. + +Here, we are going to enable monitoring for both backup metrics and operator metrics using Helm 3. We are going to tell Stash to create ServiceMonitor with `release: prometheus-stack` label so that the Prometheus server we have deployed in the previous section can collect Stash metrics without any further configuration. + + +
+
+ +### New Installation + +If you haven't installed Stash yet, run the following command to enable Prometheus monitoring during installation + +```bash +$ helm install stash oci://ghcr.io/appscode-charts/stash \ + --version {{< param "info.version" >}} \ + --namespace stash --create-namespace \ + --set features.enterprise=true \ + --set stash-enterprise.monitoring.agent=prometheus.io/operator \ + --set stash-enterprise.monitoring.backup=true \ + --set stash-enterprise.monitoring.operator=true \ + --set stash-enterprise.monitoring.serviceMonitor.labels.release=prometheus-stack \ + --set-file global.license=/path/to/license-file.txt \ + --wait --burst-limit=10000 --debug +``` + +
+
+ +### Existing Installation + +If you have installed Stash already in your cluster but didn't enable monitoring during installation, you can use `helm upgrade` command to enable monitoring in the existing installation. + +```bash +$ helm upgrade -i stash oci://ghcr.io/appscode-charts/stash \ + --version {{< param "info.version" >}} \ + --namespace stash --create-namespace \ + --reuse-values \ + --set features.enterprise=true \ + --set stash-enterprise.monitoring.agent=prometheus.io/operator \ + --set stash-enterprise.monitoring.backup=true \ + --set stash-enterprise.monitoring.operator=true \ + --set stash-enterprise.monitoring.serviceMonitor.labels.release=prometheus-stack \ + --wait --burst-limit=10000 --debug +``` + +
+
+ +>Use `stash-community` instead of `stash-enterprise` if you are using Stash Community edition. + +This will create a `ServiceMonitor` object with the same name and namespace as the Stash operator. The `ServiceMonitor` will have the label `release: prometheus-stack` as we have provided it through the `--set monitoring.serviceMonitor.labels` parameter. + +Let's verify that the ServiceMonitor has been created in the Stash operator namespace. + +```bash +❯ kubectl get servicemonitor -n kube-system +NAME AGE +stash-stash-enterprise 94s +``` + +Let's check the YAML of the `ServiceMonitor` object, + +```bash +❯ kubectl get servicemonitor -n kube-system stash-stash-enterprise -o yaml +``` + +```yaml +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + annotations: + meta.helm.sh/release-name: stash + meta.helm.sh/release-namespace: kube-system + creationTimestamp: "2021-09-27T05:49:05Z" + generation: 1 + labels: + app.kubernetes.io/managed-by: Helm + release: prometheus-stack + name: stash-stash-enterprise + namespace: kube-system + resourceVersion: "8312" + uid: 6b51920d-9cf2-4604-ba2b-b77c30d8f0d3 +spec: + endpoints: + - honorLabels: true + port: pushgateway + - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token + port: api + scheme: https + tlsConfig: + ca: + secret: + key: tls.crt + name: stash-stash-enterprise-apiserver-cert + serverName: stash-stash-enterprise.kube-system.svc + namespaceSelector: + matchNames: + - kube-system + selector: + matchLabels: + app.kubernetes.io/instance: stash + app.kubernetes.io/name: stash-enterprise +``` + +Here, we have two endpoints in `spec.endpoints` section. The `pushgateway` endpoint exports backup and recovery metrics and the `api` endpoint exports the operator metrics. + +## Verify Monitoring + +As soon as the Stash operator pod goes into the `Running` state, the Prometheus server we have deployed in the first section should discover the endpoints exposed by Stash for metrics. + +Now, we are going to [forward port](https://kubernetes.io/docs/tasks/access-application-cluster/port-forward-access-application-cluster/) of `prometheus-stack-kube-prom-prometheus` Service to access the Prometheus web UI. Run the following command on a separate terminal, + +```bash +$ kubectl port-forward -n monitoring service/prometheus-stack-kube-prom-prometheus 9090 +Forwarding from 127.0.0.1:9090 -> 9090 +Forwarding from [::1]:9090 -> 9090 +``` + +Now, you can access the Web UI at `localhost:9090`. Open [http://localhost:9090/targets](http://localhost:9090/targets) in your browser. You should see `pushgateway` and `api` endpoints of the Stash operator are among the targets. This verifies that the Prometheus server is scrapping Stash metrics. + +
+ Stash Monitoring Flow +
Fig: Prometheus Web UI
+
+ +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +# cleanup Prometheus resources +helm delete prometheus-stack -n monitoring + +# delete namespace +kubectl delete ns monitoring +``` + +To uninstall Stash follow this [guide](/docs/v2024.12.18/setup/README). diff --git a/content/docs/v2024.12.18/guides/platforms/_index.md b/content/docs/v2024.12.18/guides/platforms/_index.md new file mode 100644 index 0000000000..58ffd34e9d --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/_index.md @@ -0,0 +1,77 @@ +--- +title: Platforms | Stash +menu: + docs_v2024.12.18: + identifier: platforms + name: Platforms + parent: guides + weight: 90 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/guides/platforms/aks/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/guides/platforms/aks/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..859039c0c8 --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/aks/examples/backupconfiguration.yaml @@ -0,0 +1,23 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup + namespace: demo +spec: + repository: + name: azure-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/guides/platforms/aks/examples/deployment.yaml b/content/docs/v2024.12.18/guides/platforms/aks/examples/deployment.yaml new file mode 100644 index 0000000000..bd465037e8 --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/aks/examples/deployment.yaml @@ -0,0 +1,32 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-demo + name: stash-demo + namespace: demo +spec: + replicas: 3 + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - args: ["echo sample_data > /source/data/data.txt && sleep 3000"] + command: ["/bin/sh", "-c"] + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + persistentVolumeClaim: + claimName: stash-sample-data diff --git a/content/docs/v2024.12.18/guides/platforms/aks/examples/pvc.yaml b/content/docs/v2024.12.18/guides/platforms/aks/examples/pvc.yaml new file mode 100644 index 0000000000..41e2ef50a3 --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/aks/examples/pvc.yaml @@ -0,0 +1,12 @@ +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: stash-sample-data + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: standard + resources: + requests: + storage: 1Gi diff --git a/content/docs/v2024.12.18/guides/platforms/aks/examples/recovered_deployment.yaml b/content/docs/v2024.12.18/guides/platforms/aks/examples/recovered_deployment.yaml new file mode 100644 index 0000000000..ae126526fe --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/aks/examples/recovered_deployment.yaml @@ -0,0 +1,46 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: restore-pvc + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: standard + resources: + requests: + storage: 1Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-recovered + name: stash-recovered + namespace: demo +spec: + replicas: 3 + selector: + matchLabels: + app: stash-recovered + template: + metadata: + labels: + app: stash-recovered + name: busybox + spec: + containers: + - args: + - sleep + - "3600" + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /restore/data + name: restore-data + restartPolicy: Always + volumes: + - name: restore-data + persistentVolumeClaim: + claimName: restore-pvc diff --git a/content/docs/v2024.12.18/guides/platforms/aks/examples/repository.yaml b/content/docs/v2024.12.18/guides/platforms/aks/examples/repository.yaml new file mode 100644 index 0000000000..4c8fdbe9ee --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/aks/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: azure-repo + namespace: demo +spec: + backend: + azure: + container: stashqa + prefix: /source/data + storageSecretName: azure-secret diff --git a/content/docs/v2024.12.18/guides/platforms/aks/examples/restoresession.yaml b/content/docs/v2024.12.18/guides/platforms/aks/examples/restoresession.yaml new file mode 100644 index 0000000000..866d75dd58 --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/aks/examples/restoresession.yaml @@ -0,0 +1,19 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: deployment-restore + namespace: demo +spec: + repository: + name: azure-repo + target: # target indicates where the recovered data will be stored + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-recovered + volumeMounts: + - name: restore-data + mountPath: /source/data + rules: + - paths: + - /source/data/ diff --git a/content/docs/v2024.12.18/guides/platforms/aks/images/aks.png b/content/docs/v2024.12.18/guides/platforms/aks/images/aks.png new file mode 100644 index 0000000000..b4293304af Binary files /dev/null and b/content/docs/v2024.12.18/guides/platforms/aks/images/aks.png differ diff --git a/content/docs/v2024.12.18/guides/platforms/aks/index.md b/content/docs/v2024.12.18/guides/platforms/aks/index.md new file mode 100644 index 0000000000..0b3e3f03ea --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/aks/index.md @@ -0,0 +1,742 @@ +--- +title: AKS | Stash +description: Using Stash in Azure Kubernetes Service +menu: + docs_v2024.12.18: + identifier: platforms-aks + name: AKS + parent: platforms + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Using Stash with Azure Kubernetes Service (AKS) + +This guide will show you how to use Stash to backup and restore volumes of a Kubernetes workload running in [Azure Kubernetes Service (AKS)](https://azure.microsoft.com/en-us/services/kubernetes-service/). Here, we are going to backup a volume of a Deployment into [Azure Blob Storage](https://azure.microsoft.com/en-us/services/storage/blobs/). Then, we are going to show how to restore this backed up data into a volume of another Deployment. + +## Before You Begin + +- At first, you need to have an AKS cluster. If you don't already have a cluster, create one from [here](https://azure.microsoft.com/en-us/services/kubernetes-service/). + +- Install `Stash` in your cluster following the steps [here](/docs/v2024.12.18/setup/README). + +- You should be familiar with the following `Stash` concepts: + - [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) + - [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) + - [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + - [Repository](/docs/v2024.12.18/concepts/crds/repository/) +- You will need access to [Azure Blob Storage](https://azure.microsoft.com/en-us/services/storage/blobs/) to store the backup snapshots. + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +**Choosing StorageClass:** + +Stash works with any `StorageClass`. Check available `StorageClass` in your cluster using the following command: + +```bash +$ kubectl get storageclass -n demo +NAME PROVISIONER AGE +standard kubernetes.io/azure-disk 3m +``` + +Here, we have `standard` StorageClass in our cluster. + +> **Note:** YAML files used in this tutorial are stored in [docs/guides/platforms/aks/examples](/docs/v2024.12.18/guides/platforms/aks/examples) directory of [stashed/docs](https://github.com/stashed/docs) repository. + +## Backup the Volume of a Deployment + +Here, we are going to deploy a Deployment with a PVC. This Deployment will automatically generate some sample data into the PVC. Then, we are going to backup this sample data using Stash. + +### Prepare Workload + +At first, let's deploy the workload whose volumes we are going to backup. Here, we are going create a PVC and deploy a Deployment with this PVC. + +**Create PVC:** + +Below is the YAML of the sample PVC that we are going to create, + +```yaml +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: stash-sample-data + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: standard + resources: + requests: + storage: 1Gi +``` + +Let's create the PVC we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/aks/examples/pvc.yaml +persistentvolumeclaim/stash-sample-data created +``` + +**Deploy Deployment:** + +Now, we are going to deploy a Deployment that uses the above PVC. This Deployment will automatically generate sample data (`data.txt` file) in `/source/data` directory where we have mounted the PVC. + +Below is the YAML of the Deployment that we are going to create, + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-demo + name: stash-demo + namespace: demo +spec: + replicas: 3 + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - args: ["echo sample_data > /source/data/data.txt && sleep 3000"] + command: ["/bin/sh", "-c"] + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + persistentVolumeClaim: + claimName: stash-sample-data +``` + +Let's create the Deployment we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/aks/examples/deployment.yaml +deployment.apps/stash-demo created +``` + +Now, wait for the pods of the Deployment to go into the `Running` state. + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-demo-8685fb5478-4psw8 1/1 Running 0 4m47s +stash-demo-8685fb5478-89flr 1/1 Running 0 4m47s +stash-demo-8685fb5478-fjggh 1/1 Running 0 4m47s +``` + +To verify that the sample data has been created in `/source/data` directory, use the following command: + +```bash +$ kubectl exec -n demo stash-demo-8685fb5478-4psw8 -- cat /source/data/data.txt +sample_data +``` + +### Prepare Backend + +We are going to store our backed up data into an [Azure Blob Container](https://azure.microsoft.com/en-us/services/storage/blobs/). At first, we need to create a secret with the access credentials to our Azure blob storage account. Then, we have to create a `Repository` crd that will hold the information about our backend storage. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +**Create Secret:** + +Let's create a secret called `azure-secret` with access credentials to our desired [Azure Blob Container](https://azure.microsoft.com/en-us/services/storage/blobs/), + +```bash +$ echo -n 'changeit' >RESTIC_PASSWORD +$ echo -n '' > AZURE_ACCOUNT_NAME +$ echo -n '' > AZURE_ACCOUNT_KEY +$ kubectl create secret generic -n demo azure-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./AZURE_ACCOUNT_NAME \ + --from-file=./AZURE_ACCOUNT_KEY +secret/azure-secret created +``` + +Verify that the secret has been created successfully, + +```bash +$ kubectl get secret -n demo azure-secret -o yaml +``` + +```yaml +apiVersion: v1 +data: + AZURE_ACCOUNT_KEY: dXNlIHlvdXIgb3duIGNyZWRlbnRpYWxz # + AZURE_ACCOUNT_NAME: dXNlIHlvdXIgb3duIGNyZWRlbnRpYWxz # + RESTIC_PASSWORD: Y2hhbmdlaXQ= +kind: Secret +metadata: + creationTimestamp: "2019-07-18T04:22:58Z" + name: azure-secret + namespace: demo + resourceVersion: "68336" + selfLink: /api/v1/namespaces/demo/secrets/azure-secret + uid: b8c0685d-a913-11e9-9330-ea541341590e +type: Opaque +``` + +**Create Repository:** + +Now, let's create a `Repository` with the information of our desired blob container. Below is the YAML of `Repository` crd we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: azure-repo + namespace: demo +spec: + backend: + azure: + container: stashqa + prefix: /source/data + storageSecretName: azure-secret +``` + +Let's create the Repository we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/aks/examples/repository.yaml +repository.stash.appscode.com/azure-repo created +``` + +Now, we are ready to backup our sample data into this backend. + +### Backup + +We have to create a `BackupConfiguration` crd targeting the `stash-demo` Deployment that we have deployed earlier. Stash will inject a sidecar container into the target. It will also create a `CronJob` to take a periodic backup of `/source/data` directory of the target. + +**Create BackupConfiguration:** + +Below is the YAML of the `BackupConfiguration` crd that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup + namespace: demo +spec: + repository: + name: azure-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Here, + +- `spec.repository` refers to the `Repository` object `azure-repo` that holds backend [Azure Blob Container](https://azure.microsoft.com/en-us/services/storage/blobs/) information. +- `spec.target.ref` refers to the `stash-demo` Deployment for backup target. +- `spec.target.volumeMounts` specifies a list of volumes and their mountPath that contain the target paths. +- `spec.target.paths` specifies list of file paths to backup. + +Let's create the `BackupConfiguration` crd we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/aks/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/deployment-backup created +``` + +**Verify Sidecar:** + +If everything goes well, Stash will inject a sidecar container into the `stash-demo` Deployment to take backup of `/source/data` directory. Let’s check that the sidecar has been injected successfully, + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-demo-5bdc545845-45smg 2/2 Running 0 45s +stash-demo-5bdc545845-dw4dn 2/2 Running 0 54s +stash-demo-5bdc545845-ncrhw 2/2 Running 0 61s +``` + +Look at the pod. It now has 2 containers. If you view the resource definition of this pod, you will see that there is a container named `stash` which is running `run-backup` command. + +```yaml +$ kubectl get pod -n demo stash-demo-5bdc545845-45smg -o yaml +apiVersion: v1 +kind: Pod +metadata: + labels: + app: stash-demo + pod-template-hash: 5bdc545845 + name: stash-demo-5bdc545845-45smg + namespace: demo +... +spec: + containers: + - args: + - echo sample_data > /source/data/data.txt && sleep 3000 + command: + - /bin/sh + - -c + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /source/data + name: source-data + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: default-token-h6sqd + readOnly: true + - args: + - run-backup + - --backup-configuration=deployment-backup + - --secret-dir=/etc/stash/repository/secret + - --enable-cache=true + - --max-connections=0 + - --metrics-enabled=true + - --pushgateway-url=http://stash-operator.kube-system.svc:56789 + - --enable-status-subresource=true + - --use-kubeapiserver-fqdn-for-aks=true + - --logtostderr=true + - --alsologtostderr=false + - --v=3 + - --stderrthreshold=0 + env: + - name: NODE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName + - name: POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + image: suaas21/stash:volumeTemp_linux_amd64 + imagePullPolicy: IfNotPresent + name: stash + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /etc/stash + name: stash-podinfo + - mountPath: /etc/stash/repository/secret + name: stash-secret-volume + - mountPath: /tmp + name: tmp-dir + - mountPath: /source/data + name: source-data + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: default-token-h6sqd + readOnly: true + dnsPolicy: ClusterFirst + nodeName: aks-agentpool-72468344-0 + priority: 0 + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + serviceAccount: default + serviceAccountName: default + terminationGracePeriodSeconds: 30 + ... +... +``` + +**Verify CronJob:** + +It will also create a `CronJob` with the schedule specified in `spec.schedule` field of `BackupConfiguration` crd. + +Verify that the `CronJob` has been created using the following command, + +```bash +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +deployment-backup */1 * * * * False 0 35s 64s +``` + +**Wait for BackupSession:** + +The `deployment-backup` CronJob will trigger a backup on each schedule by creating a `BackupSession` crd. The sidecar container will watch for the `BackupSession` crd. When it finds one, it will take backup immediately. + +Wait for the next schedule for backup. Run the following command to watch `BackupSession` crd, + +```bash +$ watch -n 2 kubectl get backupsession -n demo +Every 1.0s: kubectl get backupsession -n demo suaas-appscode: Mon Jun 24 10:23:08 2019 + +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +deployment-backup-1561350125 BackupConfiguration deployment-backup Succeeded 63s +``` + +We can see from the above output that the backup session has succeeded. Now, we are going to verify whether the backed up data has been stored in the backend. + +**Verify Backup:** + +Once a backup is complete, Stash will update the respective `Repository` crd to reflect the backup. Check that the repository `azure-repo` has been updated by the following command, + +```bash +$ kubectl get repository -n demo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +azure-repo true 8 B 1 2s 1m10s +``` + +Now, if we navigate to the Azure blob container, we are going to see backed up data has been stored in `/source/data` directory as specified by `spec.backend.azure.prefix` field of `Repository` crd. + +
+  Backup data in Azure Blob Storage Container +
Fig: Backup data in Azure Blob Storage Container
+
+ +> **Note:** Stash keeps all the backed up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Restore the Backed up Data + +This section will show you how to restore the backed up data from [Azure Blob Storage](https://azure.microsoft.com/en-us/services/storage/blobs/) we have taken in the earlier section. + +**Stop Taking Backup of the Old Deployment:** + +At first, let's stop taking any further backup of the old Deployment so that no backup is taken during the restore process. We are going to pause the `BackupConfiguration` that we created to backup the `stash-demo` Deployment. Then, Stash will stop taking any further backup for this Deployment. You can learn more how to pause a scheduled backup [here](/docs/v2024.12.18/guides/use-cases/pause-backup/) + +Let's pause the `deployment-backup` BackupConfiguration, + +```bash +$ kubectl patch backupconfiguration -n demo deployment-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/deployment-backup patched +``` + +Now, wait for a moment. Stash will pause the BackupConfiguration. Verify that the BackupConfiguration has been paused, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED AGE +deployment-backup */1 * * * * true 26m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the BackupConfiguration has been paused. + +**Deploy Deployment:** + +We are going to create a new Deployment named `stash-recovered` with a new PVC and restore the backed up data inside it. + +Below are the YAMLs of the Deployment and PVC that we are going to create, + +```yaml +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: restore-pvc + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: standard + resources: + requests: + storage: 1Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-recovered + name: stash-recovered + namespace: demo +spec: + replicas: 3 + selector: + matchLabels: + app: stash-recovered + template: + metadata: + labels: + app: stash-recovered + name: busybox + spec: + containers: + - args: + - sleep + - "3600" + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /restore/data + name: restore-data + restartPolicy: Always + volumes: + - name: restore-data + persistentVolumeClaim: + claimName: restore-pvc +``` + +Let's create the Deployment and PVC we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/aks/examples/recovered_deployment.yaml +persistentvolumeclaim/restore-pvc created +deployment.apps/stash-recovered created +``` + +**Create RestoreSession:** + +Now, we need to create a `RestoreSession` crd targeting the `stash-recovered` Deployment. + +Below is the YAML of the `RestoreSesion` crd that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: deployment-restore + namespace: demo +spec: + repository: + name: azure-repo + target: # target indicates where the recovered data will be stored + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-recovered + volumeMounts: + - name: restore-data + mountPath: /source/data + rules: + - paths: + - /source/data/ +``` + +Here, + +- `spec.repository.name` specifies the `Repository` crd that holds the backend information where our backed up data has been stored. + +- `spec.target.ref` refers to the target workload where the recovered data will be stored. +- `spec.target.volumeMounts` specifies a list of volumes and their mountPath where the data will be restored. + - `mountPath` must be same `mountPath` as the original volume because Stash stores absolute path of the backed up files. If you use different `mountPath` for the restored volume the backed up files will not be restored into your desired volume. + +Let's create the `RestoreSession` crd we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/aks/examples/restoresession.yaml +restoresession.stash.appscode.com/deployment-restore created +``` + +Once, you have created the `RestoreSession` crd, Stash will inject `init-container` into `stash-recovered` Deployment. The Deployment will restart and the `init-container` will restore the desired data on start-up. + +**Verify Init-Container:** + +Wait until the `init-container` has been injected into the `stash-recovered` Deployment. Let’s describe the Deployment to verify that the `init-container` has been injected successfully. + +```yaml +$ kubectl describe deployment -n demo stash-recovered +Name: stash-recovered +Namespace: demo +CreationTimestamp: Thu, 18 Jul 2019 11:59:41 +0600 +Labels: app=stash-recovered +Selector: app=stash-recovered +Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable +Pod Template: + Labels: app=stash-recovered + Annotations: stash.appscode.com/last-applied-restoresession-hash: 15483804576325149444 + Init Containers: + stash-init: + Image: suaas21/stash:volumeTemp_linux_amd64 + Port: + Host Port: + Args: + restore + --restore-session=deployment-restore + --secret-dir=/etc/stash/repository/secret + --enable-cache=true + --max-connections=0 + --metrics-enabled=true + --pushgateway-url=http://stash-operator.kube-system.svc:56789 + --enable-status-subresource=true + --use-kubeapiserver-fqdn-for-aks=true + --logtostderr=true + --alsologtostderr=false + --v=3 + --stderrthreshold=0 + Environment: + NODE_NAME: (v1:spec.nodeName) + POD_NAME: (v1:metadata.name) + Mounts: + /etc/stash/repository/secret from stash-secret-volume (rw) + /source/data from restore-data (rw) + /tmp from tmp-dir (rw) + Containers: + busybox: + Image: busybox + Port: + Host Port: + Args: + sleep + 3600 + Environment: + Mounts: + /restore/data from restore-data (rw) + Volumes: + restore-data: + Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace) + ClaimName: restore-pvc + ReadOnly: false + tmp-dir: + Type: EmptyDir (a temporary directory that shares a pod's lifetime) + Medium: + SizeLimit: + stash-podinfo: + Type: DownwardAPI (a volume populated by information about the pod) + Items: + metadata.labels -> labels + stash-secret-volume: + Type: Secret (a volume populated by a Secret) + SecretName: azure-secret + Optional: false + ... +``` + +Notice the `Init-Containers` section. We can see that the init-container `stash-init` has been injected which is running `restore` command. + +**Wait for RestoreSession to Succeeded:** + +Now, wait for the restore process to complete. You can watch the `RestoreSession` phase using the following command, + +```bash +$ watch -n 2 kubectl get restoresession -n demo +Every 3.0s: kubectl get restore -n demo suaas-appscode: Thu Jul 18 12:02:10 2019 + +NAME REPOSITORY-NAME PHASE AGE +deployment-restore azure-repo Succeeded 1m +``` + +So, we can see from the output of the above command that the restore process has succeeded. + +> **Note:** If you want to restore the backed up data inside the same Deployment whose volumes were backed up, you have to remove the corrupted data from the Deployment. Then, you have to create a RestoreSession targeting the Deployment. + +**Verify Restored Data:** + +In this section, we are going to verify that the desired data has been restored successfully. At first, check if the `stash-recovered` pod of the Deployment has gone into `Running` state by the following command, + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-recovered-6669c8bcfd-7pz9m 1/1 Running 0 76s +stash-recovered-6669c8bcfd-dfppw 1/1 Running 0 85s +stash-recovered-6669c8bcfd-qkllx 1/1 Running 0 51s +``` + +Verify that the sample data has been restored in `/restore/data` directory of the `stash-recovered` pod of the Deployment using the following command, + +```bash +$ kubectl exec -n demo stash-recovered-6669c8bcfd-7pz9m -- cat /restore/data/data.txt +sample_data +``` + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo deployment stash-demo +kubectl delete -n demo deployment stash-recovered +kubectl delete -n demo backupconfiguration deployment-backup +kubectl delete -n demo restoresession deployment-restore +kubectl delete -n demo repository azure-repo +kubectl delete -n demo secret azure-secret +kubectl delete -n demo pvc --all +``` + +## Next Steps + +1. See a step by step guide to backup/restore volumes of a StatefulSet [here](/docs/v2024.12.18/guides/workloads/statefulset/). +2. See a step by step guide to backup/restore volumes of a DaemonSet [here](/docs/v2024.12.18/guides/workloads/daemonset/). +3. See a step by step guide to Backup/restore Stand-alone PVC [here](/docs/v2024.12.18/guides/volumes/pvc/) diff --git a/content/docs/v2024.12.18/guides/platforms/eks-irsa/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/guides/platforms/eks-irsa/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..8f161e5dfe --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/eks-irsa/examples/backupconfiguration.yaml @@ -0,0 +1,21 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mariadb-backup + namespace: demo +spec: + runtimeSettings: + pod: + serviceAccountName: bucket-user + schedule: "*/5 * * * *" + repository: + name: s3-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/guides/platforms/eks-irsa/examples/mariadb.yaml b/content/docs/v2024.12.18/guides/platforms/eks-irsa/examples/mariadb.yaml new file mode 100644 index 0000000000..be5cbc2045 --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/eks-irsa/examples/mariadb.yaml @@ -0,0 +1,18 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MariaDB +metadata: + name: sample-mariadb + namespace: demo +spec: + version: "10.5.8" + replicas: 1 + storageType: Durable + storage: + storageClassName: "gp2" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + cpu: 100m + terminationPolicy: WipeOut diff --git a/content/docs/v2024.12.18/guides/platforms/eks-irsa/examples/repository.yaml b/content/docs/v2024.12.18/guides/platforms/eks-irsa/examples/repository.yaml new file mode 100644 index 0000000000..4ba7c7d365 --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/eks-irsa/examples/repository.yaml @@ -0,0 +1,13 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: s3-repo + namespace: demo +spec: + backend: + s3: + endpoint: "s3.amazonaws.com" + bucket: stash-qa + region: us-east-1 + prefix: /demo/mariadb + storageSecretName: s3-secret diff --git a/content/docs/v2024.12.18/guides/platforms/eks-irsa/examples/restoresession.yaml b/content/docs/v2024.12.18/guides/platforms/eks-irsa/examples/restoresession.yaml new file mode 100644 index 0000000000..3eb36b3d6f --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/eks-irsa/examples/restoresession.yaml @@ -0,0 +1,18 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mariadb-restore + namespace: demo +spec: + runtimeSettings: + pod: + serviceAccountName: bucket-user + repository: + name: s3-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/guides/platforms/eks-irsa/images/create-bucket-policy-1.png b/content/docs/v2024.12.18/guides/platforms/eks-irsa/images/create-bucket-policy-1.png new file mode 100644 index 0000000000..327522f7ad Binary files /dev/null and b/content/docs/v2024.12.18/guides/platforms/eks-irsa/images/create-bucket-policy-1.png differ diff --git a/content/docs/v2024.12.18/guides/platforms/eks-irsa/images/create-bucket-policy-2.png b/content/docs/v2024.12.18/guides/platforms/eks-irsa/images/create-bucket-policy-2.png new file mode 100644 index 0000000000..31f60dee59 Binary files /dev/null and b/content/docs/v2024.12.18/guides/platforms/eks-irsa/images/create-bucket-policy-2.png differ diff --git a/content/docs/v2024.12.18/guides/platforms/eks-irsa/images/eks.png b/content/docs/v2024.12.18/guides/platforms/eks-irsa/images/eks.png new file mode 100644 index 0000000000..ea92b06171 Binary files /dev/null and b/content/docs/v2024.12.18/guides/platforms/eks-irsa/images/eks.png differ diff --git a/content/docs/v2024.12.18/guides/platforms/eks-irsa/images/gcs.png b/content/docs/v2024.12.18/guides/platforms/eks-irsa/images/gcs.png new file mode 100644 index 0000000000..8ec12b62b6 Binary files /dev/null and b/content/docs/v2024.12.18/guides/platforms/eks-irsa/images/gcs.png differ diff --git a/content/docs/v2024.12.18/guides/platforms/eks-irsa/index.md b/content/docs/v2024.12.18/guides/platforms/eks-irsa/index.md new file mode 100644 index 0000000000..3cd36970f3 --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/eks-irsa/index.md @@ -0,0 +1,713 @@ +--- +title: Using IRSA with Stash on Amazon EKS +description: A guide on how to use EKS IRSA with Stash +menu: + docs_v2024.12.18: + identifier: platforms-eks-irsa + name: EKS IRSA + parent: platforms + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Using IRSA with Stash on Amazon EKS + +This guide will show you how to use IRSA(IAM Roles for Service Accounts) of [Amazon Elastic Kubernetes Service (Amazon EKS)](https://aws.amazon.com/eks/) with Stash. Here, we are going to backup a MariaDB database and store the backed up data into a [AWS S3 bucket](https://aws.amazon.com/s3/).Then, we are going to show how to restore this backed up data. + +## Before You Begin + +- At first, you need to have an EKS cluster with [IRSA](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/setting-up-enable-IAM.html) enabled. If you don't already have a cluster, create one from [here](https://aws.amazon.com/eks/). +- Install `Stash` in your cluster following the steps [here](/docs/v2024.12.18/setup/README). +- Install `KubeDB` operator in your cluster following the steps [here](https://kubedb.com/docs/latest/setup/). +- You should be familiar with the following `Stash` concepts: + - [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) + - [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) + - [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + - [Repository](/docs/v2024.12.18/concepts/crds/repository/) +- You will need a [AWS S3 Bucket](https://aws.amazon.com/s3/) to store the backup snapshots. +- Install `eksctl` following the steps [here](https://docs.aws.amazon.com/eks/latest/userguide/eksctl.html). + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +## Prepare MariaDB + +In this section, we are going to deploy a MariaDB database using KubeDB. Then, we are going to insert some sample data into it. + +### Deploy MariaDB using KubeDB + +At first, let’s deploy a MariaDB standalone database named `sample-mariadb` using KubeDB, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MariaDB +metadata: + name: sample-mariadb + namespace: demo +spec: + version: "10.5.8" + replicas: 1 + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: WipeOut +``` + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/eks-irsa/examples/mariadb.yaml +mariadb.kubedb.com/sample-mariadb created +``` + +Now, wait for the database pod `sample-mariadb-0` to go into Running state, + +```bash +$ kubectl get pod -n demo sample-mariadb-0 +NAME READY STATUS RESTARTS AGE +sample-mariadb-0 1/1 Running 0 29m +``` + +Once the database pod is in Running state, verify that the database is ready to accept the connections. + +```bash +$ kubectl logs -n demo sample-mariadb-0 +2021-02-22 9:41:37 0 [Note] Reading of all Master_info entries succeeded +2021-02-22 9:41:37 0 [Note] Added new Master_info '' to hash table +2021-02-22 9:41:37 0 [Note] mysqld: ready for connections. +Version: '10.5.8-MariaDB-1:10.5.8+maria~focal' socket: '/run/mysqld/mysqld.sock' port: 3306 mariadb.org binary distribution +``` + +From the above log, we can see the database is ready to accept connections. + +### Insert Sample Data + +Now, we are going to exec into the database pod and create some sample data. The sample-mariadb object creates a secret containing the credentials of MariaDB and set them as pod’s Environment varibles `MYSQL_ROOT_USERNAME` and `MYSQL_ROOT_PASSWORD`. + +Here, we are going to use the root user (`MYSQL_ROOT_USERNAME`) credential `MYSQL_ROOT_PASSWORD` to insert the sample data. Let’s exec into the database pod and insert some sample data, + +```bash +$ kubectl exec -it -n demo sample-mariadb-0 -- bash +root@sample-mariadb-0:/ mysql -u${MYSQL_ROOT_USERNAME} -p${MYSQL_ROOT_PASSWORD} +Welcome to the MariaDB monitor. Commands end with ; or \g. +Your MariaDB connection id is 341 +Server version: 10.5.8-MariaDB-1:10.5.8+maria~focal mariadb.org binary distribution + +Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +# Let's create a database named "company" +MariaDB [(none)]> create database company; +Query OK, 1 row affected (0.000 sec) + +# Verify that the database has been created successfully +MariaDB [(none)]> show databases; ++--------------------+ +| Database | ++--------------------+ +| company | +| information_schema | +| mysql | +| performance_schema | ++--------------------+ +4 rows in set (0.001 sec) + +# Now, let's create a table called "employee" in the "company" table +MariaDB [(none)]> create table company.employees ( name varchar(50), salary int); +Query OK, 0 rows affected (0.018 sec) + +# Verify that the table has been created successfully +MariaDB [(none)]> show tables in company; ++-------------------+ +| Tables_in_company | ++-------------------+ +| employees | ++-------------------+ +1 row in set (0.007 sec) + +# Now, let's insert a sample row in the table +MariaDB [(none)]> insert into company.employees values ('John Doe', 5000); +Query OK, 1 row affected (0.003 sec) + +# Insert another sample row +MariaDB [(none)]> insert into company.employees values ('James William', 7000); +Query OK, 1 row affected (0.002 sec) + +# Verify that the rows have been inserted into the table successfully +MariaDB [(none)]> select * from company.employees; ++---------------+--------+ +| name | salary | ++---------------+--------+ +| John Doe | 5000 | +| James William | 7000 | ++---------------+--------+ +2 rows in set (0.001 sec) + +MariaDB [(none)]> exit +Bye +``` + +We have successfully deployed a MariaDB database and inserted some sample data into it. + +## Prepare Backup + +In this section, we are going to prepare the necessary resources (i.e. database connection information, backend information, etc.) before backup. + +### Verify Stash MariaDB Addon Installed + +When you install the Stash, it automatically installs all the official database addons. Verify that it has installed the MariaDB addons using the following command. + +```bash +$ kubectl get tasks.stash.appscode.com | grep mariadb +mariadb-backup-10.5.8 35s +mariadb-restore-10.5.8 35s +``` + +### Ensure AppBinding + +Stash needs to know how to connect with the database. An `AppBinding` exactly provides this information. It holds the Service and Secret information of the database. You have to point to the respective `AppBinding` as a target of backup instead of the database itself. + +Stash expect your database Secret to have `username` and `password` keys. If your database secret does not have them, the `AppBinding` can also help here. You can specify a `secretTransforms` section with the mapping between the current keys and the desired keys. + +You don’t need to worry about appbindings if you are using KubeDB. It creates an appbinding containing the necessary informations when you deploy the database. Let’s ensure the appbinding create by `KubeDB` operator. + +```bash +$ kubectl get appbinding -n demo +NAME TYPE VERSION AGE +sample-mariadb kubedb.com/mariadb 10.5.8 62m +``` + +We have a appbinding named same as database name sample-mariadb. We will use this later for connecting into this database. + +### Prepare Backend + +We are going to store our backed up data into a [S3 bucket](https://aws.amazon.com/s3/). As we are using IRSA, we don't need the `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` to access the S3 bucket. + +At first, we need to create a secret with a Restic password. Then, we have to create a `Repository` crd that will hold the information about our backend storage. + +**Create Secret:** + +Let's create a secret called `encryption-secret` with the Restic password, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ kubectl create secret generic -n demo encryption-secret \ + --from-file=./RESTIC_PASSWORD \ +secret "encryption-secret" created +``` + +**Create Repository:** + +Now, let's create a `Repository` with the information of our desired S3 bucket. Below is the YAML of `Repository` crd we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: s3-repo + namespace: demo +spec: + backend: + s3: + endpoint: 's3.amazonaws.com' + bucket: stash-qa + region: us-east-1 + prefix: /demo/mariadb + storageSecretName: encryption-secret + +``` + +Let's create the `Repository` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/eks-irsa/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our sample data into this backend. + +### Create IAM Policy + +We need a IAM policy for accessing S3 buckets. Below is the `JSON`of the IAM policy we are going to create, + +```bash +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "VisualEditor0", + "Effect": "Allow", + "Action": "s3:*", + "Resource": "*" + } + ] +} +``` + +Let's navigate to the IAM management console to create a policy `bucket-accessor` with full access permission to S3 bucket. + +
+  Create IAM policy (Step: 1) +
Fig: Create IAM policy (Step: 1)
+
+ +
+  Create IAM policy (Step: 2) +
Fig: Create IAM policy (Step: 2
+
+ +### Create ServiceAccount + +We need a IAM role with the policy `bucket-accessor` attached and a Kubernetes service account annotated with that IAM role. Use the following command to do all these steps at once. + +```bash +eksctl create iamserviceaccount \ + --name bucket-user \ + --namespace demo \ + --cluster irsa-demo \ + --attach-policy-arn arn:aws:iam::452618475015:policy/bucket-accessor\ + --approve +``` + +This command will create a IAM role with the `bucket-accessor` policy attaced and a service account `bucket-acessor-ksa` annotated with that IAM role in the demo namespace. We will use the service account in the `BackupConfiguration` and `RestoreSession` to enable backup and restore using IRSA. + +## Backup + +To schedule a backup, we have to create a `BackupConfiguration` object targeting the respective AppBinding of our desired database. Then Stash will create a CronJob to periodically backup the database. + +**Create BackupConfiguration:** + +Below is the `YAML` for BackupConfiguration object we are going to use to backup the sample-mariadb database we have deployed earlier, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mariadb-backup + namespace: demo +spec: + runtimeSettings: + pod: + serviceAccountName: bucket-user + schedule: "*/5 * * * *" + repository: + name: s3-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +Here, + +- `spec.runtimeSettins.pod.serviceAccountName` refers to the name of the `ServiceAccount` to use in the backup pod. +- `spec.repository` refers to the `Repository` object `gcs-repo` that holds backend [GCS bucket](https://cloud.google.com/storage/) information. +- `spec.target.ref`refers to the AppBinding object that holds the connection information of our targeted database. + +Let's create the `BackupConfiguration` crd we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/eks-irsa/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/sample-mariadb-backup created +``` + +**Verify Backup Setup Successful:** + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. Let’s verify the Phase of the `BackupConfiguration`, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-mariadb-backup mariadb-backup-10.5.8 */5 * * * * Ready 11s +``` + +**Verify CronJob:** + +Stash will create a CronJob with the schedule specified in `spec.schedule` field of `BackupConfiguration` object. + +Verify that the CronJob has been created using the following command, + +```bash +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-mariadb-backup */5 * * * * False 0 15s 17s +``` + +**Wait for BackupSession:** + +The `sample-mariadb-backup` CronJob will trigger a backup on each scheduled slot by creating a `BackupSession` object. + +Now, wait for a schedule to appear. Run the following command to watch for a `BackupSession` object, + +```bash +$ kubectl get backupsession -n demo -w +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +sample-mariadb-backup-1606994706 BackupConfiguration sample-mariadb-backup Running 24s +sample-mariadb-backup-1606994706 BackupConfiguration sample-mariadb-backup Running 75s +sample-mariadb-backup-1606994706 BackupConfiguration sample-mariadb-backup Succeeded 103s + +``` + +Here, the phase `Succeeded` means that the backup process has been completed successfully. + +**Verify Backup:** + +Now, we are going to verify whether the backed up data is present in the backend or not. Once a backup is completed, Stash will update the respective `Repository` object to reflect the backup completion. Check that the repository `gcs-repo` has been updated by the following command, + +```bash +$ kubectl get repository -n demo gcs-repo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo true 1.327 MiB 1 60s 8m +``` + +Now, if we navigate to the GCS bucket, we will see the backed up data has been stored in `demo/mariadb/sample-mariadb` directory as specified by `.spec.backend.gcs.prefix` field of the Repository object. + +
+  Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +> **Note:** Stash keeps all the backed up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Restore + +In this section, we are going to show you how to restore in the same database which may be necessary when you have accidentally deleted any data from the running database. + +**Temporarily Pause Backup:** + +At first, let's stop taking any further backup of the database so that no backup runs after we delete the sample data. We are going to pause the `BackupConfiguration` object. Stash will stop taking any further backup when the `BackupConfiguration` is paused. + +Let's pause the `sample-mariadb-backup` BackupConfiguration, + +```bash +$ kubectl patch backupconfiguration -n demo sample-mariadb-backup--type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/sample-mgo-rs-backup patched +``` + +Or you can use the Stash `kubectl` plugin to pause the `BackupConfiguration`, + +```bash +$ kubectl stash pause backup -n demo --backupconfig=sample-mariadb-backup +BackupConfiguration demo/sample-mariadb-backup has been paused successfully. +``` + +Verify that the `BackupConfiguration` has been paused, + +```bash +$ kubectl get backupconfiguration -n demo sample-mariadb-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-mariadb-backup mariadb-backup-10.5.8 */5 * * * * true Ready 26m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the `BackupConfiguration` has been paused. + +Stash will also suspend the respective CronJob. + +```bash +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-mariadb-backup */5 * * * * True 0 2m59s 20m +``` + +**Simulate Disaster:** + +Now, let's simulate an accidental deletion scenario. Here, we are going to exec into the database pod and delete the `company` database we had created earlier. + +```bash +$ kubectl exec -it -n demo sample-mariadb-0 -c mariadb -- bash +root@sample-mariadb-0:/ mysql -u${MYSQL_ROOT_USERNAME} -p${MYSQL_ROOT_PASSWORD} +Welcome to the MariaDB monitor. Commands end with ; or \g. +Your MariaDB connection id is 341 +Server version: 10.5.8-MariaDB-1:10.5.8+maria~focal mariadb.org binary distribution + +Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +# View current databases +MariaDB [(none)]> show databases; ++--------------------+ +| Database | ++--------------------+ +| company | +| information_schema | +| mysql | +| performance_schema | ++--------------------+ +4 rows in set (0.001 sec) + +# Let's delete the "company" database +MariaDB [(none)]> drop database company; +Query OK, 1 row affected (0.268 sec) + +# Verify that the "company" database has been deleted +MariaDB [(none)]> show databases; ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| mysql | +| performance_schema | ++--------------------+ +3 rows in set (0.000 sec) + +MariaDB [(none)]> exit +Bye +``` + +**Create RestoreSession:** + +To restore the database, you have to create a `RestoreSession` object pointing to the `AppBinding` of the targeted database. + +Here, is the `YAML` of the `RestoreSession` object that we are going to use for restoring our `sample-mariadb` database. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mariadb-restore + namespace: demo +spec: + runtimeSettings: + pod: + serviceAccountName: bucket-user + repository: + name: s3-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + rules: + - snapshots: [latest] + +``` + +Here, + +- `spec.runtimeSettins.pod.serviceAccountName` refers to the name of the `ServiceAccount` to use in the restore pod. +- `spec.repository.name` specifies the Repository object that holds the backend information where our backed up data has been stored. +- `spec.target.ref` refers to the respective AppBinding of the `sample-mariadb` database. +- `spec.rules` specifies that we are restoring data from the latest backup snapshot of the database. + +Let's create the `RestoreSession` object object we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/eks-irsa/examples/restoresession.yaml +restoresession.stash.appscode.com/sample-mariadb-restore created +``` + +Once, you have created the `RestoreSession` object, Stash will create a restore Job. Run the following command to watch the phase of the `RestoreSession` object, + +```bash +$ kubectl get restoresession -n demo -w +NAME REPOSITORY PHASE AGE +sample-mariadb-restore gcs-repo Running 15s +sample-mariadb-restore gcs-repo Succeeded 18s +``` + +The `Succeeded` phase means that the restore process has been completed successfully. + +**Verify Restored Data:** + +Now, let's exec into the database pod and verify whether data actual data was restored or not, + +```bash +$ kubectl exec -it -n demo sample-mariadb-0 -c mariadb -- bash +root@sample-mariadb-0:/ mysql -u${MYSQL_ROOT_USERNAME} -p${MYSQL_ROOT_PASSWORD} +Welcome to the MariaDB monitor. Commands end with ; or \g. +Your MariaDB connection id is 341 +Server version: 10.5.8-MariaDB-1:10.5.8+maria~focal mariadb.org binary distribution + +Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +# Verify that the "company" database has been restored +MariaDB [(none)]> show databases; ++--------------------+ +| Database | ++--------------------+ +| company | +| information_schema | +| mysql | +| performance_schema | ++--------------------+ +4 rows in set (0.001 sec) + +# Verify that the tables of the "company" database have been restored +MariaDB [(none)]> show tables from company; ++-------------------+ +| Tables_in_company | ++-------------------+ +| employees | ++-------------------+ +1 row in set (0.000 sec) + +# Verify that the sample data of the "employees" table has been restored +MariaDB [(none)]> select * from company.employees; ++---------------+--------+ +| name | salary | ++---------------+--------+ +| John Doe | 5000 | +| James William | 7000 | ++---------------+--------+ +2 rows in set (0.000 sec) + +MariaDB [(none)]> exit +Bye +``` + +Hence, we can see from the above output that the deleted data has been restored successfully from the backup. + +**Resume Backup** + +Since our data has been restored successfully we can now resume our usual backup process. Resume the `BackupConfiguration` using following command, + +```bash +$ kubectl patch backupconfiguration -n demo sample-mariadb-backup --type="merge" --patch='{"spec": {"paused": false}}' +backupconfiguration.stash.appscode.com/sample-mariadb-backup patched +``` + +Or you can use the Stash `kubectl` plugin to resume the `BackupConfiguration`, + +```bash +$ kubectl stash resume -n demo --backupconfig=sample-mariadb-backup +BackupConfiguration demo/sample-mariadb-backup has been resumed successfully. +``` + +Verify that the `BackupConfiguration` has been resumed, + +```bash +$ kubectl get backupconfiguration -n demo sample-mariadb-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-mariadb-backup mariadb-backup-10.5.8 */5 * * * * false Ready 29m +``` + +Here, `false` in the `PAUSED` column means the backup has been resume successfully. The CronJob also should be resumed now. + +```bash +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-mariadb-backup */5 * * * * False 0 2m59s 29m +``` + +Here, `False` in the `SUSPEND` column means the CronJob is no longer suspended and will trigger in the next schedule. + +## Allow Operator to List Snapshots + +When you list Snapshots using `kubectl get snapshot` command, Stash operator itself read the Snapshots directly from the backend. So, the operator needs permission to access the bucket. Stash operator has it own's `ServiceAccount`. Therefore, this `ServiceAccount` should be binded with a IAM role with access to S3 as well. + +Run the following command to get the service account used by the Stash operator, + +```bash +$ kubectl get serviceaccount -n stash stash-stash-enterprise +NAME SECRETS AGE +stash-stash-enterprise 1 9m52s +``` + +Run the following command to create a IAM role bound to the operator service account, + +```bash +eksctl create iamserviceaccount \ + --name stash-stash-enterprise \ + --namespace stash \ + --cluster irsa-demo \ + --attach-policy-arn arn:aws:iam::452618475015:policy/bucket-accessor\ + --approve + --override-existing-serviceaccounts +``` + +### Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo backupconfiguration sample-mariadb-backup +kubectl delete -n demo restoresession sample-mariadb-restore +kubectl delete -n demo secret encryption-secret +kubectl delete -n demo repository gcs-repo +kubectl delete -n demo mariadb sample-mariadb +kubectl delete ns demo +``` diff --git a/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..0d167e8e2c --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/examples/backupconfiguration.yaml @@ -0,0 +1,22 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mariadb-backup + namespace: demo +spec: + runtimeSettings: + pod: + podAnnotations: + iam.amazonaws.com/role: arn:aws:iam::452618475015:role/bucket-accessor + schedule: "*/5 * * * *" + repository: + name: s3-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/examples/kube2iam.yaml b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/examples/kube2iam.yaml new file mode 100644 index 0000000000..0cdd17f4fc --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/examples/kube2iam.yaml @@ -0,0 +1,80 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: kube2iam +rules: + - apiGroups: + - "" + resources: + - namespaces + - pods + verbs: + - get + - watch + - list +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: kube2iam +subjects: + - kind: ServiceAccount + name: kube2iam + namespace: default +roleRef: + kind: ClusterRole + name: kube2iam + apiGroup: rbac.authorization.k8s.io +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: kube2iam + namespace: default +--- +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: kube2iam + namespace: default + labels: + app: kube2iam +spec: + selector: + matchLabels: + name: kube2iam + updateStrategy: + type: RollingUpdate + template: + metadata: + labels: + name: kube2iam + spec: + serviceAccountName: kube2iam + hostNetwork: true + containers: + - image: jtblin/kube2iam:0.10.7 + imagePullPolicy: Always + name: kube2iam + args: + - "--auto-discover-base-arn" + - "--auto-discover-default-role=true" + - "--iptables=true" + - "--host-ip=$(HOST_IP)" + - "--node=$(NODE_NAME)" + - "--host-interface=eni+" + env: + - name: HOST_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + ports: + - containerPort: 8181 + hostPort: 8181 + name: http + securityContext: + privileged: true diff --git a/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/examples/mariadb.yaml b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/examples/mariadb.yaml new file mode 100644 index 0000000000..be5cbc2045 --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/examples/mariadb.yaml @@ -0,0 +1,18 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MariaDB +metadata: + name: sample-mariadb + namespace: demo +spec: + version: "10.5.8" + replicas: 1 + storageType: Durable + storage: + storageClassName: "gp2" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + cpu: 100m + terminationPolicy: WipeOut diff --git a/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/examples/repository.yaml b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/examples/repository.yaml new file mode 100644 index 0000000000..4ba7c7d365 --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/examples/repository.yaml @@ -0,0 +1,13 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: s3-repo + namespace: demo +spec: + backend: + s3: + endpoint: "s3.amazonaws.com" + bucket: stash-qa + region: us-east-1 + prefix: /demo/mariadb + storageSecretName: s3-secret diff --git a/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/examples/restoresession.yaml b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/examples/restoresession.yaml new file mode 100644 index 0000000000..1391145be1 --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/examples/restoresession.yaml @@ -0,0 +1,19 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mariadb-restore + namespace: demo +spec: + runtimeSettings: + pod: + podAnnotations: + iam.amazonaws.com/role: "arn:aws:iam::452618475015:role/bucket-accessor" + repository: + name: s3-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/attach-policy-1.png b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/attach-policy-1.png new file mode 100644 index 0000000000..adfd9efa91 Binary files /dev/null and b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/attach-policy-1.png differ diff --git a/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/attach-policy-2.png b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/attach-policy-2.png new file mode 100644 index 0000000000..5f8cb17a71 Binary files /dev/null and b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/attach-policy-2.png differ diff --git a/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/create-assume-policy-1.png b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/create-assume-policy-1.png new file mode 100644 index 0000000000..282a76dd28 Binary files /dev/null and b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/create-assume-policy-1.png differ diff --git a/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/create-assume-policy-2.png b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/create-assume-policy-2.png new file mode 100644 index 0000000000..3a3a86c2b5 Binary files /dev/null and b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/create-assume-policy-2.png differ diff --git a/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/create-bucket-policy-1.png b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/create-bucket-policy-1.png new file mode 100644 index 0000000000..327522f7ad Binary files /dev/null and b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/create-bucket-policy-1.png differ diff --git a/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/create-bucket-policy-2.png b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/create-bucket-policy-2.png new file mode 100644 index 0000000000..31f60dee59 Binary files /dev/null and b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/create-bucket-policy-2.png differ diff --git a/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/create-role-1.png b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/create-role-1.png new file mode 100644 index 0000000000..4086b973fd Binary files /dev/null and b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/create-role-1.png differ diff --git a/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/create-role-2.png b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/create-role-2.png new file mode 100644 index 0000000000..0b1008ebd5 Binary files /dev/null and b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/create-role-2.png differ diff --git a/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/create-role-3.png b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/create-role-3.png new file mode 100644 index 0000000000..d0417ccea2 Binary files /dev/null and b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/create-role-3.png differ diff --git a/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/eks.png b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/eks.png new file mode 100644 index 0000000000..ea92b06171 Binary files /dev/null and b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/eks.png differ diff --git a/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/gcs.png b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/gcs.png new file mode 100644 index 0000000000..8ec12b62b6 Binary files /dev/null and b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/gcs.png differ diff --git a/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/trust-policy-1.png b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/trust-policy-1.png new file mode 100644 index 0000000000..cbba8595a3 Binary files /dev/null and b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/trust-policy-1.png differ diff --git a/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/trust-policy-2.png b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/trust-policy-2.png new file mode 100644 index 0000000000..360322eb8a Binary files /dev/null and b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/images/trust-policy-2.png differ diff --git a/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/index.md b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/index.md new file mode 100644 index 0000000000..92d633d28e --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/eks-kube2iam/index.md @@ -0,0 +1,795 @@ +--- +title: Using Kube2iam with Stash on Amazon EKS +description: A guide on how to use EKS Kube2iam with Stash +menu: + docs_v2024.12.18: + identifier: platforms-eks-kube2iam + name: EKS Kub2iam + parent: platforms + weight: 15 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Using Kube2iam with Stash on Amazon EKS + +This guide will show you how to use Kube2iam of [Amazon Elastic Kubernetes Service (Amazon EKS)](https://aws.amazon.com/eks/) with Stash. Here, we are going to backup a MariaDB database and store the backed up data into a [AWS S3 bucket](https://aws.amazon.com/s3/).Then, we are going to show how to restore this backed up data. + +## Before You Begin + +- At first, you need to have an EKS cluster. If you don't already have a cluster, create one from [here](https://aws.amazon.com/eks/). +- Install `Stash` in your cluster following the steps [here](/docs/v2024.12.18/setup/README). +- Install `KubeDB` operator in your cluster following the steps [here](https://kubedb.com/docs/latest/setup/). +- Install [Kube2iam](https://github.com/jtblin/kube2iam) in your cluster. +- You should be familiar with the following `Stash` concepts: + - [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) + - [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) + - [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + - [Repository](/docs/v2024.12.18/concepts/crds/repository/) +- You will need a [AWS S3 Bucket](https://aws.amazon.com/s3/) to store the backup snapshots. +- Install `eksctl` following the steps [here](https://docs.aws.amazon.com/eks/latest/userguide/eksctl.html). + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +## Setting up the Roles and Policies in AWS + +### Create IAM Policy + +We need an IAM policy for accessing S3 buckets. Below is the `JSON`of the IAM policy we are going to create, + +```bash +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "VisualEditor0", + "Effect": "Allow", + "Action": "s3:*", + "Resource": "*" + } + ] +} +``` + +Let's navigate to the IAM management console to create a policy `bucket-accessor` with full access permission to S3 buckets. + +
+  Create IAM policy +
Fig: Create IAM policy
+
+ +
+  Review IAM policy +
Fig: Review IAM policy
+
+ +### Create Role + +Now, let's create an IAM role `bucket-accessor` attaching the above IAM policy, + +
+  Create IAM role (Step: 1) +
Fig: Create IAM Role (Step: 1)
+
+ +
+  Create IAM role (Step: 2) +
Fig: Create IAM Role (Step: 2)
+
+ +
+  Create IAM role (Step: 3) +
Fig: Create IAM Role (Step: 3)
+
+ +### Configure Roles + +We need to add the policy to allow our Kubernete worker nodes to assume roles that are not in their default role. We are going to create a new IAM policy `assume-policy` and attach it with the existing node role so that it can assume the role for accessing the bucket. Below is the `JSON` of the IAM policy we are going to create, + +```bash +{ + "Version": "2012-10-17", + "Statement": [ + { + "Action": [ + "sts:AssumeRole" + ], + "Effect": "Allow", + "Resource": "arn:aws:iam::123456789012:role/bucket-accessor" + } + ] +} +``` + +Let's navigate to the IAM management console to create `assume-policy`, + +
+  Create IAM policy (Step: 1) +
Fig: Create IAM policy (Step: 1)
+
+ +
+  Create IAM policy(Step: 2) +
Fig: Create IAM policy (Step: 2)
+
+ +Now, let's attach the IAM policy to our exisiting node role, +
+  Attach IAM policy(Step: 1 +
Fig: Attach Policy (Step: 1)
+
+ +
+  Attach IAM policy(Step: 2 +
Fig: Attach Policy (Step: 2)
+
+ +The `bucket-accessor` role needs the trust policy to trust the node role. Below is the `JSON` of the trust policy we are going to use, + +```bash +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "Service": "ec2.amazonaws.com" + }, + "Action": "sts:AssumeRole" + }, + { + "Sid": "", + "Effect": "Allow", + "Principal": { + "AWS": "arn:aws:iam::123456789012:role/kubernetes-node" + }, + "Action": "sts:AssumeRole" + } + ] +} +``` + +Lets update the trust policy of `bucket-accessor` role, + +
+  Update Trust policy(Step: 1 +
Fig: Update Trust Policy (Step: 1)
+
+ +
+  Update Trust policy(Step: 2 +
Fig: Update Trust Policy (Step: 2)
+
+ +## Prepare MariaDB + +In this section, we are going to deploy a MariaDB database using KubeDB. Then, we are going to insert some sample data into it. + +### Deploy MariaDB using KubeDB + +At first, let’s deploy a MariaDB standalone database named `sample-mariadb` using KubeDB, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MariaDB +metadata: + name: sample-mariadb + namespace: demo +spec: + version: "10.5.8" + replicas: 1 + storageType: Durable + storage: + storageClassName: "gp2" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: WipeOut +``` + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/eks-kube2iam/examples/mariadb.yaml +mariadb.kubedb.com/sample-mariadb created +``` + +Now, wait for the database pod `sample-mariadb-0` to go into Running state, + +```bash +$ kubectl get pod -n demo sample-mariadb-0 +NAME READY STATUS RESTARTS AGE +sample-mariadb-0 1/1 Running 0 29m +``` + +Once the database pod is in Running state, verify that the database is ready to accept the connections. + +```bash +$ kubectl logs -n demo sample-mariadb-0 +2021-02-22 9:41:37 0 [Note] Reading of all Master_info entries succeeded +2021-02-22 9:41:37 0 [Note] Added new Master_info '' to hash table +2021-02-22 9:41:37 0 [Note] mysqld: ready for connections. +Version: '10.5.8-MariaDB-1:10.5.8+maria~focal' socket: '/run/mysqld/mysqld.sock' port: 3306 mariadb.org binary distribution +``` + +From the above log, we can see the database is ready to accept connections. + +### Insert Sample Data + +Now, we are going to exec into the database pod and create some sample data. The sample-mariadb object creates a secret containing the credentials of MariaDB and set them as pod’s Environment varibles `MYSQL_ROOT_USERNAME` and `MYSQL_ROOT_PASSWORD`. + +Here, we are going to use the root user (`MYSQL_ROOT_USERNAME`) credential `MYSQL_ROOT_PASSWORD` to insert the sample data. Let’s exec into the database pod and insert some sample data, + +```bash +$ kubectl exec -it -n demo sample-mariadb-0 -- bash +root@sample-mariadb-0:/ mysql -u${MYSQL_ROOT_USERNAME} -p${MYSQL_ROOT_PASSWORD} +Welcome to the MariaDB monitor. Commands end with ; or \g. +Your MariaDB connection id is 341 +Server version: 10.5.8-MariaDB-1:10.5.8+maria~focal mariadb.org binary distribution + +Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +# Let's create a database named "company" +MariaDB [(none)]> create database company; +Query OK, 1 row affected (0.000 sec) + +# Verify that the database has been created successfully +MariaDB [(none)]> show databases; ++--------------------+ +| Database | ++--------------------+ +| company | +| information_schema | +| mysql | +| performance_schema | ++--------------------+ +4 rows in set (0.001 sec) + +# Now, let's create a table called "employee" in the "company" table +MariaDB [(none)]> create table company.employees ( name varchar(50), salary int); +Query OK, 0 rows affected (0.018 sec) + +# Verify that the table has been created successfully +MariaDB [(none)]> show tables in company; ++-------------------+ +| Tables_in_company | ++-------------------+ +| employees | ++-------------------+ +1 row in set (0.007 sec) + +# Now, let's insert a sample row in the table +MariaDB [(none)]> insert into company.employees values ('John Doe', 5000); +Query OK, 1 row affected (0.003 sec) + +# Insert another sample row +MariaDB [(none)]> insert into company.employees values ('James William', 7000); +Query OK, 1 row affected (0.002 sec) + +# Verify that the rows have been inserted into the table successfully +MariaDB [(none)]> select * from company.employees; ++---------------+--------+ +| name | salary | ++---------------+--------+ +| John Doe | 5000 | +| James William | 7000 | ++---------------+--------+ +2 rows in set (0.001 sec) + +MariaDB [(none)]> exit +Bye +``` + +We have successfully deployed a MariaDB database and inserted some sample data into it. + +## Prepare Backup + +In this section, we are going to prepare the necessary resources (i.e. database connection information, backend information, etc.) before backup. + +### Verify Stash MariaDB Addon Installed + +When you install the Stash, it automatically installs all the official database addons. Verify that it has installed the MariaDB addons using the following command. + +```bash +$ kubectl get tasks.stash.appscode.com | grep mariadb +mariadb-backup-10.5.8 35s +mariadb-restore-10.5.8 35s +``` + +### Ensure AppBinding + +Stash needs to know how to connect with the database. An `AppBinding` exactly provides this information. It holds the Service and Secret information of the database. You have to point to the respective `AppBinding` as a target of backup instead of the database itself. + +Stash expect your database Secret to have `username` and `password` keys. If your database secret does not have them, the `AppBinding` can also help here. You can specify a `secretTransforms` section with the mapping between the current keys and the desired keys. + +You don’t need to worry about appbindings if you are using KubeDB. It creates an appbinding containing the necessary informations when you deploy the database. Let’s ensure the appbinding create by `KubeDB` operator. + +```bash +$ kubectl get appbinding -n demo +NAME TYPE VERSION AGE +sample-mariadb kubedb.com/mariadb 10.5.8 62m +``` + +We have a appbinding named same as database name sample-mariadb. We will use this later for connecting into this database. + +### Prepare Backend + +We are going to store our backed up data into a [S3 bucket](https://aws.amazon.com/s3/). As we are using Kube2iam, we don't need the `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` to access the S3 bucket. + +At first, we need to create a secret with a Restic password. Then, we have to create a `Repository` crd that will hold the information about our backend storage. + +**Create Secret:** + +Let's create a secret called `encryption-secret` with the Restic password, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ kubectl create secret generic -n demo encryption-secret \ + --from-file=./RESTIC_PASSWORD \ +secret "encryption-secret" created +``` + +**Create Repository:** + +Now, let's create a `Repository` with the information of our desired S3 bucket. Below is the YAML of `Repository` crd we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: s3-repo + namespace: demo +spec: + backend: + s3: + endpoint: 's3.amazonaws.com' + bucket: stash-qa + region: us-east-1 + prefix: /demo/mariadb + storageSecretName: encryption-secret + +``` + +Let's create the `Repository` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/eks-kube2iam/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our sample data into this backend. + +## Backup + +To schedule a backup, we have to create a `BackupConfiguration` object targeting the respective AppBinding of our desired database. Then Stash will create a CronJob to periodically backup the database. + +**Create BackupConfiguration:** + +Below is the `YAML` for BackupConfiguration object we are going to use to backup the sample-mariadb database we have deployed earlier, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mariadb-backup + namespace: demo +spec: + runtimeSettings: + pod: + podAnnotations: + iam.amazonaws.com/role: arn:aws:iam::452618475015:role/bucket-accessor + schedule: "*/5 * * * *" + repository: + name: s3-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +Here, + +- `spec.runtimeSettins.pod.podAnnotations` refers to the annotations that will be attached with the respective pod. +- `spec.repository` refers to the `Repository` object `gcs-repo` that holds backend [GCS bucket](https://cloud.google.com/storage/) information. +- `spec.target.ref`refers to the AppBinding object that holds the connection information of our targeted database. + +> Notice the `spec.runtimeSettings.pod` section. We are now passing the respective IAM annotation via `podAnnotations` field. Stash will pass this annotation to the respective backup pod. + +Let's create the `BackupConfiguration` crd we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/eks-kube2iam/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/sample-mariadb-backup created +``` + +**Verify Backup Setup Successful:** + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. Let’s verify the Phase of the `BackupConfiguration`, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-mariadb-backup mariadb-backup-10.5.8 */5 * * * * Ready 11s +``` + +**Verify CronJob:** + +Stash will create a CronJob with the schedule specified in `spec.schedule` field of `BackupConfiguration` object. + +Verify that the CronJob has been created using the following command, + +```bash +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-mariadb-backup */5 * * * * False 0 15s 17s +``` + +**Wait for BackupSession:** + +The `sample-mariadb-backup` CronJob will trigger a backup on each scheduled slot by creating a `BackupSession` object. + +Now, wait for a schedule to appear. Run the following command to watch for a `BackupSession` object, + +```bash +$ kubectl get backupsession -n demo -w +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +sample-mariadb-backup-1606994706 BackupConfiguration sample-mariadb-backup Running 24s +sample-mariadb-backup-1606994706 BackupConfiguration sample-mariadb-backup Running 75s +sample-mariadb-backup-1606994706 BackupConfiguration sample-mariadb-backup Succeeded 103s + +``` + +Here, the phase `Succeeded` means that the backup process has been completed successfully. + +**Verify Backup:** + +Now, we are going to verify whether the backed up data is present in the backend or not. Once a backup is completed, Stash will update the respective `Repository` object to reflect the backup completion. Check that the repository `gcs-repo` has been updated by the following command, + +```bash +$ kubectl get repository -n demo gcs-repo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo true 1.327 MiB 1 60s 8m +``` + +Now, if we navigate to the GCS bucket, we will see the backed up data has been stored in `demo/mariadb/sample-mariadb` directory as specified by `.spec.backend.gcs.prefix` field of the Repository object. + +
+  Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +> **Note:** Stash keeps all the backed up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Restore + +In this section, we are going to show you how to restore in the same database which may be necessary when you have accidentally deleted any data from the running database. + +**Temporarily Pause Backup:** + +At first, let's stop taking any further backup of the database so that no backup runs after we delete the sample data. We are going to pause the `BackupConfiguration` object. Stash will stop taking any further backup when the `BackupConfiguration` is paused. + +Let's pause the `sample-mariadb-backup` BackupConfiguration, + +```bash +$ kubectl patch backupconfiguration -n demo sample-mariadb-backup--type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/sample-mgo-rs-backup patched +``` + +Or you can use the Stash `kubectl` plugin to pause the `BackupConfiguration`, + +```bash +$ kubectl stash pause backup -n demo --backupconfig=sample-mariadb-backup +BackupConfiguration demo/sample-mariadb-backup has been paused successfully. +``` + +Verify that the `BackupConfiguration` has been paused, + +```bash +$ kubectl get backupconfiguration -n demo sample-mariadb-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-mariadb-backup mariadb-backup-10.5.8 */5 * * * * true Ready 26m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the `BackupConfiguration` has been paused. + +Stash will also suspend the respective CronJob. + +```bash +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-mariadb-backup */5 * * * * True 0 2m59s 20m +``` + +**Simulate Disaster:** + +Now, let's simulate an accidental deletion scenario. Here, we are going to exec into the database pod and delete the `company` database we had created earlier. + +```bash +$ kubectl exec -it -n demo sample-mariadb-0 -c mariadb -- bash +root@sample-mariadb-0:/ mysql -u${MYSQL_ROOT_USERNAME} -p${MYSQL_ROOT_PASSWORD} +Welcome to the MariaDB monitor. Commands end with ; or \g. +Your MariaDB connection id is 341 +Server version: 10.5.8-MariaDB-1:10.5.8+maria~focal mariadb.org binary distribution + +Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +# View current databases +MariaDB [(none)]> show databases; ++--------------------+ +| Database | ++--------------------+ +| company | +| information_schema | +| mysql | +| performance_schema | ++--------------------+ +4 rows in set (0.001 sec) + +# Let's delete the "company" database +MariaDB [(none)]> drop database company; +Query OK, 1 row affected (0.268 sec) + +# Verify that the "company" database has been deleted +MariaDB [(none)]> show databases; ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| mysql | +| performance_schema | ++--------------------+ +3 rows in set (0.000 sec) + +MariaDB [(none)]> exit +Bye +``` + +**Create RestoreSession:** + +To restore the database, you have to create a `RestoreSession` object pointing to the `AppBinding` of the targeted database. + +Here, is the `YAML` of the `RestoreSession` object that we are going to use for restoring our `sample-mariadb` database. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mariadb-restore + namespace: demo +spec: + runtimeSettings: + pod: + podAnnotations: + iam.amazonaws.com/role: "arn:aws:iam::452618475015:role/bucket-accessor" + repository: + name: s3-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + rules: + - snapshots: [latest] + +``` + +> Notice the `spec.runtimeSettings.pod` section. We are now passing the respective IAM annotation via `podAnnotations` field. Stash will pass this annotation to the respective backup pod. + +Here, + +- `spec.runtimeSettins.pod.podAnnotations` refers to the annotations that will be attached with the respective pod. +- `spec.repository.name` specifies the Repository object that holds the backend information where our backed up data has been stored. +- `spec.target.ref` refers to the respective AppBinding of the `sample-mariadb` database. +- `spec.rules` specifies that we are restoring data from the latest backup snapshot of the database. + +Let's create the `RestoreSession` object object we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/eks-kube2iam/examples/restoresession.yaml +restoresession.stash.appscode.com/sample-mariadb-restore created +``` + +Once, you have created the `RestoreSession` object, Stash will create a restore Job. Run the following command to watch the phase of the `RestoreSession` object, + +```bash +$ kubectl get restoresession -n demo -w +NAME REPOSITORY PHASE AGE +sample-mariadb-restore gcs-repo Running 15s +sample-mariadb-restore gcs-repo Succeeded 18s +``` + +The `Succeeded` phase means that the restore process has been completed successfully. + +**Verify Restored Data:** + +Now, let's exec into the database pod and verify whether data actual data was restored or not, + +```bash +$ kubectl exec -it -n demo sample-mariadb-0 -c mariadb -- bash +root@sample-mariadb-0:/ mysql -u${MYSQL_ROOT_USERNAME} -p${MYSQL_ROOT_PASSWORD} +Welcome to the MariaDB monitor. Commands end with ; or \g. +Your MariaDB connection id is 341 +Server version: 10.5.8-MariaDB-1:10.5.8+maria~focal mariadb.org binary distribution + +Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +# Verify that the "company" database has been restored +MariaDB [(none)]> show databases; ++--------------------+ +| Database | ++--------------------+ +| company | +| information_schema | +| mysql | +| performance_schema | ++--------------------+ +4 rows in set (0.001 sec) + +# Verify that the tables of the "company" database have been restored +MariaDB [(none)]> show tables from company; ++-------------------+ +| Tables_in_company | ++-------------------+ +| employees | ++-------------------+ +1 row in set (0.000 sec) + +# Verify that the sample data of the "employees" table has been restored +MariaDB [(none)]> select * from company.employees; ++---------------+--------+ +| name | salary | ++---------------+--------+ +| John Doe | 5000 | +| James William | 7000 | ++---------------+--------+ +2 rows in set (0.000 sec) + +MariaDB [(none)]> exit +Bye +``` + +Hence, we can see from the above output that the deleted data has been restored successfully from the backup. + +**Resume Backup** + +Since our data has been restored successfully we can now resume our usual backup process. Resume the `BackupConfiguration` using following command, + +```bash +$ kubectl patch backupconfiguration -n demo sample-mariadb-backup --type="merge" --patch='{"spec": {"paused": false}}' +backupconfiguration.stash.appscode.com/sample-mariadb-backup patched +``` + +Or you can use the Stash `kubectl` plugin to resume the `BackupConfiguration`, + +```bash +$ kubectl stash resume -n demo --backupconfig=sample-mariadb-backup +BackupConfiguration demo/sample-mariadb-backup has been resumed successfully. +``` + +Verify that the `BackupConfiguration` has been resumed, + +```bash +$ kubectl get backupconfiguration -n demo sample-mariadb-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-mariadb-backup mariadb-backup-10.5.8 */5 * * * * false Ready 29m +``` + +Here, `false` in the `PAUSED` column means the backup has been resume successfully. The CronJob also should be resumed now. + +```bash +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-mariadb-backup */5 * * * * False 0 2m59s 29m +``` + +Here, `False` in the `SUSPEND` column means the CronJob is no longer suspended and will trigger in the next schedule. + +## Allow Operator to List Snapshots + +When you list Snapshots using `kubectl get snapshot` command, Stash operator itself read the Snapshots directly from the backend. So, the operator needs permission to access the bucket. Therefore, stash operator pod should be annotated with the IAM Role. Run the following command to annotate the Stash operator pod using Helm, + +```bash +$ helm upgrade -i stash oci://ghcr.io/appscode-charts/stash \ + --version {{< param "info.version" >}} \ + --namespace stash --create-namespace \ + --set features.enterprise=true \ + --set-file global.license=/home/sayem/Downloads/stash.txt \ + --set stash-enterprise.podAnnotations.'iam\.amazonaws\.com/role'=arn:aws:iam::452618475015:role/bucket-accessor \ + --wait --burst-limit=10000 --debug +``` + +### Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo backupconfiguration sample-mariadb-backup +kubectl delete -n demo restoresession sample-mariadb-restore +kubectl delete -n demo secret encryption-secret +kubectl delete -n demo repository gcs-repo +kubectl delete -n demo mariadb sample-mariadb +kubectl delete ns demo +``` diff --git a/content/docs/v2024.12.18/guides/platforms/gke/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/guides/platforms/gke/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..9a57e3214b --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/gke/examples/backupconfiguration.yaml @@ -0,0 +1,21 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mariadb-backup + namespace: demo +spec: + runtimeSettings: + pod: + serviceAccountName: bucket-user + schedule: "*/5 * * * *" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/guides/platforms/gke/examples/mariadb.yaml b/content/docs/v2024.12.18/guides/platforms/gke/examples/mariadb.yaml new file mode 100644 index 0000000000..e2fa2b4d69 --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/gke/examples/mariadb.yaml @@ -0,0 +1,17 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MariaDB +metadata: + name: sample-mariadb + namespace: demo +spec: + version: "10.5.8" + replicas: 1 + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: WipeOut diff --git a/content/docs/v2024.12.18/guides/platforms/gke/examples/repository.yaml b/content/docs/v2024.12.18/guides/platforms/gke/examples/repository.yaml new file mode 100644 index 0000000000..58b383a307 --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/gke/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: demo/mariadb/sample-mariadb + storageSecretName: encryption-secret diff --git a/content/docs/v2024.12.18/guides/platforms/gke/examples/restoresession.yaml b/content/docs/v2024.12.18/guides/platforms/gke/examples/restoresession.yaml new file mode 100644 index 0000000000..790186bed9 --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/gke/examples/restoresession.yaml @@ -0,0 +1,18 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mariadb-restore + namespace: demo +spec: + runtimeSettings: + pod: + serviceAccountName: bucket-user + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + rules: + - snapshots: [latest] diff --git a/content/docs/v2024.12.18/guides/platforms/gke/images/gke.png b/content/docs/v2024.12.18/guides/platforms/gke/images/gke.png new file mode 100644 index 0000000000..8ec12b62b6 Binary files /dev/null and b/content/docs/v2024.12.18/guides/platforms/gke/images/gke.png differ diff --git a/content/docs/v2024.12.18/guides/platforms/gke/index.md b/content/docs/v2024.12.18/guides/platforms/gke/index.md new file mode 100644 index 0000000000..0d4212b7c3 --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/gke/index.md @@ -0,0 +1,716 @@ +--- +title: Using Workload Idenity with Stash on GKE +description: A guide on how to use GKE workload identity with Stash +menu: + docs_v2024.12.18: + identifier: platforms-gke + name: GKE Workload Identity + parent: platforms + weight: 18 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Using Workload Identity with Stash on Google Kubernetes Engine (GKE) + +This guide will show you how to use workload identity of [Google Kubernetes Engine (GKE)](https://cloud.google.com/kubernetes-engine/) with Stash. Here, we are going to backup a MariaDB database and store the backed up data into a [GCS Bucket](https://cloud.google.com/storage/). Then, we are going to show how to restore this backed up data. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster in the Google Cloud Platform with [Workload Identity](https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity) enabled. If you don’t already have a cluster, create one from [here](https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity#console). + +- Install `Stash` in your cluster following the steps [here](/docs/v2024.12.18/setup/README). +- Install `KubeDB` operator in your cluster following the steps [here](https://kubedb.com/docs/latest/setup/). +- You should be familiar with the following `Stash` concepts: + - [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) + - [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) + - [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + - [Repository](/docs/v2024.12.18/concepts/crds/repository/) +- Install Google Cloud CLI following the steps [here](https://cloud.google.com/sdk/downloads). +- You will need a [GCS Bucket](https://console.cloud.google.com/storage/). + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +## Prepare IAM Service Account + +At first, let's create a IAM service account which will contain the roles for accessing GCS Bucket, + +```bash +$ gcloud iam service-accounts create bucket-accessor \ + --project=sample-project +``` + +Let's add the required roles to this service account for accessing the GCS bucket. + +```bash +$ gcloud projects add-iam-policy-binding sample-project \ + --member "serviceAccount:bucket-accessor@sample-project.iam.gserviceaccount.com" \ + --role "roles/storage.objectAdmin" +``` + +```bash +$ gcloud projects add-iam-policy-binding sample-project \ + --member "serviceAccount:bucket-accessor@sample-project.iam.gserviceaccount.com" \ + --role "roles/storage.admin" +``` + +> For GCS backend, if the bucket does not exist, Stash needs `Storage Object Admin` role permissions to create the bucket. For more details, please check the following [guide](/docs/v2024.12.18/guides/backends/gcs/). + +## Prepare MariaDB + +In this section, we are going to deploy a MariaDB database using KubeDB. Then, we are going to insert some sample data into it. + +### Deploy MariaDB using KubeDB + +At first, let’s deploy a MariaDB standalone database named `sample-mariadb` using KubeDB, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MariaDB +metadata: + name: sample-mariadb + namespace: demo +spec: + version: "10.5.8" + replicas: 1 + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + terminationPolicy: WipeOut +``` + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/gke/examples/mariadb.yaml +mariadb.kubedb.com/sample-mariadb created +``` + +Now, wait for the database pod `sample-mariadb-0` to go into Running state, + +```bash +$ kubectl get pod -n demo sample-mariadb-0 +NAME READY STATUS RESTARTS AGE +sample-mariadb-0 1/1 Running 0 29m +``` + +Once the database pod is in Running state, verify that the database is ready to accept the connections. + +```bash +$ kubectl logs -n demo sample-mariadb-0 +2021-02-22 9:41:37 0 [Note] Reading of all Master_info entries succeeded +2021-02-22 9:41:37 0 [Note] Added new Master_info '' to hash table +2021-02-22 9:41:37 0 [Note] mysqld: ready for connections. +Version: '10.5.8-MariaDB-1:10.5.8+maria~focal' socket: '/run/mysqld/mysqld.sock' port: 3306 mariadb.org binary distribution +``` + +From the above log, we can see the database is ready to accept connections. + +### Insert Sample Data + +Now, we are going to exec into the database pod and create some sample data. The sample-mariadb object creates a secret containing the credentials of MariaDB and set them as pod’s Environment varibles `MYSQL_ROOT_USERNAME` and `MYSQL_ROOT_PASSWORD`. + +Here, we are going to use the root user (`MYSQL_ROOT_USERNAME`) credential `MYSQL_ROOT_PASSWORD` to insert the sample data. Let’s exec into the database pod and insert some sample data, + +```bash +$ kubectl exec -it -n demo sample-mariadb-0 -- bash +root@sample-mariadb-0:/ mysql -u${MYSQL_ROOT_USERNAME} -p${MYSQL_ROOT_PASSWORD} +Welcome to the MariaDB monitor. Commands end with ; or \g. +Your MariaDB connection id is 341 +Server version: 10.5.8-MariaDB-1:10.5.8+maria~focal mariadb.org binary distribution + +Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +# Let's create a database named "company" +MariaDB [(none)]> create database company; +Query OK, 1 row affected (0.000 sec) + +# Verify that the database has been created successfully +MariaDB [(none)]> show databases; ++--------------------+ +| Database | ++--------------------+ +| company | +| information_schema | +| mysql | +| performance_schema | ++--------------------+ +4 rows in set (0.001 sec) + +# Now, let's create a table called "employee" in the "company" table +MariaDB [(none)]> create table company.employees ( name varchar(50), salary int); +Query OK, 0 rows affected (0.018 sec) + +# Verify that the table has been created successfully +MariaDB [(none)]> show tables in company; ++-------------------+ +| Tables_in_company | ++-------------------+ +| employees | ++-------------------+ +1 row in set (0.007 sec) + +# Now, let's insert a sample row in the table +MariaDB [(none)]> insert into company.employees values ('John Doe', 5000); +Query OK, 1 row affected (0.003 sec) + +# Insert another sample row +MariaDB [(none)]> insert into company.employees values ('James William', 7000); +Query OK, 1 row affected (0.002 sec) + +# Verify that the rows have been inserted into the table successfully +MariaDB [(none)]> select * from company.employees; ++---------------+--------+ +| name | salary | ++---------------+--------+ +| John Doe | 5000 | +| James William | 7000 | ++---------------+--------+ +2 rows in set (0.001 sec) + +MariaDB [(none)]> exit +Bye +``` + +We have successfully deployed a MariaDB database and inserted some sample data into it. + +## Prepare Backup + +In this section, we are going to prepare the necessary resources (i.e. database connection information, backend information, etc.) before backup. + +### Verify Stash MariaDB Addon Installed + +When you install the Stash, it automatically installs all the official database addons. Verify that it has installed the MariaDB addons using the following command. + +```bash +$ kubectl get tasks.stash.appscode.com | grep mariadb +mariadb-backup-10.5.8 35s +mariadb-restore-10.5.8 35s +``` + +### Ensure AppBinding + +Stash needs to know how to connect with the database. An `AppBinding` exactly provides this information. It holds the Service and Secret information of the database. You have to point to the respective `AppBinding` as a target of backup instead of the database itself. + +Stash expect your database Secret to have `username` and `password` keys. If your database secret does not have them, the `AppBinding` can also help here. You can specify a `secretTransforms` section with the mapping between the current keys and the desired keys. + +You don’t need to worry about appbindings if you are using KubeDB. It creates an appbinding containing the necessary informations when you deploy the database. Let’s ensure the appbinding create by `KubeDB` operator. + +```bash +$ kubectl get appbinding -n demo +NAME TYPE VERSION AGE +sample-mariadb kubedb.com/mariadb 10.5.8 62m +``` + +We have a appbinding named same as database name sample-mariadb. We will use this later for connecting into this database. + +### Prepare Backend + +We are going to store our backed up data into a [GCS bucket](https://cloud.google.com/storage/). As we are using workload identity enabled cluster, we don't need the `GOOGLE_PROJECT_ID` and `GOOGLE_SERVICE_ACCOUNT_JSON_KEY` to access the GCS bucket. + +At first, we need to create a secret with a Restic password. Then, we have to create a `Repository` crd that will hold the information about our backend storage. + +**Create Secret:** + +Let's create a secret called `encryption-secret` with the Restic password, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ kubectl create secret generic -n demo encryption-secret \ + --from-file=./RESTIC_PASSWORD \ +secret "encryption-secret" created +``` + +**Create Repository:** + +Now, let's create a `Repository` with the information of our desired GCS bucket. Below is the YAML of `Repository` crd we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /demo/mariadb/sample-mariadb + storageSecretName: encryption-secret +``` + +Let's create the `Repository` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/gke/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our sample data into this backend. + +### Prepare ServiceAccount + +Now we are going create a Kubernetes service account and bind it with the IAM service account `bucket-accessor` that we have created earlier. This binding allows the Kubernetes service account to act as the IAM service account. + +Lets create a `ServiceAccount`, + +```bash +$ kubectl create serviceaccount -n demo bucket-user +``` + +Let's add the IAM annotations to the `ServiceAccount`, + +```bash +$ kubectl annotate sa -n demo bucket-user iam.gke.io/gcp-service-account="bucket-accessor@appscode-testing.iam.gserviceaccount.com" +``` + +Now Let's bind it with the IAM service account, + +```bash +$ gcloud iam service-accounts add-iam-policy-binding bucket-accessor@sample-project.iam.gserviceaccount.com \ + --role roles/iam.workloadIdentityUser \ + --member "serviceAccount:sample-project.svc.id.goog[demo/bucket-user]" +``` + +## Backup + +To schedule a backup, we have to create a `BackupConfiguration` object targeting the respective AppBinding of our desired database. Then Stash will create a CronJob to periodically backup the database. + +**Create BackupConfiguration:** + +Below is the `YAML` for BackupConfiguration object we are going to use to backup the sample-mariadb database we have deployed earlier, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mariadb-backup + namespace: demo +spec: + runtimeSettings: + pod: + serviceAccountName: bucket-user + schedule: "*/5 * * * *" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +Here, + +- `spec.runtimeSettins.pod.serviceAccountName` refers to the name of the `ServiceAccount` to use in the backup pod. +- `spec.repository` refers to the `Repository` object `gcs-repo` that holds backend [GCS bucket](https://cloud.google.com/storage/) information. +- `spec.target.ref`refers to the AppBinding object that holds the connection information of our targeted database. + +Let's create the `BackupConfiguration` crd we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/gke/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/sample-mariadb-backup created +``` + +**Verify Backup Setup Successful:** + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. Let’s verify the Phase of the `BackupConfiguration`, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-mariadb-backup mariadb-backup-10.5.8 */5 * * * * Ready 11s +``` + +**Verify CronJob:** + +Stash will create a CronJob with the schedule specified in `spec.schedule` field of `BackupConfiguration` object. + +Verify that the CronJob has been created using the following command, + +```bash +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-mariadb-backup */5 * * * * False 0 15s 17s +``` + +**Wait for BackupSession:** + +The `sample-mariadb-backup` CronJob will trigger a backup on each scheduled slot by creating a `BackupSession` object. + +Now, wait for a schedule to appear. Run the following command to watch for a `BackupSession` object, + +```bash +$ kubectl get backupsession -n demo -w +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +sample-mariadb-backup-1606994706 BackupConfiguration sample-mariadb-backup Running 24s +sample-mariadb-backup-1606994706 BackupConfiguration sample-mariadb-backup Running 75s +sample-mariadb-backup-1606994706 BackupConfiguration sample-mariadb-backup Succeeded 103s + +``` + +Here, the phase `Succeeded` means that the backup process has been completed successfully. + +**Verify Backup:** + +Now, we are going to verify whether the backed up data is present in the backend or not. Once a backup is completed, Stash will update the respective `Repository` object to reflect the backup completion. Check that the repository `gcs-repo` has been updated by the following command, + +```bash +$ kubectl get repository -n demo gcs-repo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo true 1.327 MiB 1 60s 8m +``` + +Now, if we navigate to the GCS bucket, we will see the backed up data has been stored in `demo/mariadb/sample-mariadb` directory as specified by `.spec.backend.gcs.prefix` field of the Repository object. + +
+  Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +> **Note:** Stash keeps all the backed up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Restore + +In this section, we are going to show you how to restore in the same database which may be necessary when you have accidentally deleted any data from the running database. + +**Temporarily Pause Backup:** + +At first, let's stop taking any further backup of the database so that no backup runs after we delete the sample data. We are going to pause the `BackupConfiguration` object. Stash will stop taking any further backup when the `BackupConfiguration` is paused. + +Let's pause the `sample-mariadb-backup` BackupConfiguration, + +```bash +$ kubectl patch backupconfiguration -n demo sample-mariadb-backup--type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/sample-mgo-rs-backup patched +``` + +Or you can use the Stash `kubectl` plugin to pause the `BackupConfiguration`, + +```bash +$ kubectl stash pause backup -n demo --backupconfig=sample-mariadb-backup +BackupConfiguration demo/sample-mariadb-backup has been paused successfully. +``` + +Verify that the `BackupConfiguration` has been paused, + +```bash +$ kubectl get backupconfiguration -n demo sample-mariadb-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-mariadb-backup mariadb-backup-10.5.8 */5 * * * * true Ready 26m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the `BackupConfiguration` has been paused. + +Stash will also suspend the respective CronJob. + +```bash +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-mariadb-backup */5 * * * * True 0 2m59s 20m +``` + +**Simulate Disaster:** + +Now, let's simulate an accidental deletion scenario. Here, we are going to exec into the database pod and delete the `company` database we had created earlier. + +```bash +$ kubectl exec -it -n demo sample-mariadb-0 -c mariadb -- bash +root@sample-mariadb-0:/ mysql -u${MYSQL_ROOT_USERNAME} -p${MYSQL_ROOT_PASSWORD} +Welcome to the MariaDB monitor. Commands end with ; or \g. +Your MariaDB connection id is 341 +Server version: 10.5.8-MariaDB-1:10.5.8+maria~focal mariadb.org binary distribution + +Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +# View current databases +MariaDB [(none)]> show databases; ++--------------------+ +| Database | ++--------------------+ +| company | +| information_schema | +| mysql | +| performance_schema | ++--------------------+ +4 rows in set (0.001 sec) + +# Let's delete the "company" database +MariaDB [(none)]> drop database company; +Query OK, 1 row affected (0.268 sec) + +# Verify that the "company" database has been deleted +MariaDB [(none)]> show databases; ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| mysql | +| performance_schema | ++--------------------+ +3 rows in set (0.000 sec) + +MariaDB [(none)]> exit +Bye +``` + +**Create RestoreSession:** + +To restore the database, you have to create a `RestoreSession` object pointing to the `AppBinding` of the targeted database. + +Here, is the YAML of the `RestoreSession` object that we are going to use for restoring our `sample-mariadb` database. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mariadb-restore + namespace: demo +spec: + runtimeSettings: + pod: + serviceAccountName: bucket-user + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mariadb + rules: + - snapshots: [latest] +``` + +Here, + +- `spec.runtimeSettins.pod.serviceAccountName` refers to the name of the `ServiceAccount` to use in the restore pod. +- `spec.repository.name` specifies the Repository object that holds the backend information where our backed up data has been stored. +- `spec.target.ref` refers to the respective AppBinding of the `sample-mariadb` database. +- `spec.rules` specifies that we are restoring data from the latest backup snapshot of the database. + +Let's create the `RestoreSession` object object we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/gke/examples/restoresession.yaml +restoresession.stash.appscode.com/sample-mariadb-restore created +``` + +Once, you have created the `RestoreSession` object, Stash will create a restore Job. Run the following command to watch the phase of the `RestoreSession` object, + +```bash +$ kubectl get restoresession -n demo -w +NAME REPOSITORY PHASE AGE +sample-mariadb-restore gcs-repo Running 15s +sample-mariadb-restore gcs-repo Succeeded 18s +``` + +The `Succeeded` phase means that the restore process has been completed successfully. + +**Verify Restored Data:** + +Now, let's exec into the database pod and verify whether data actual data was restored or not, + +```bash +$ kubectl exec -it -n demo sample-mariadb-0 -c mariadb -- bash +root@sample-mariadb-0:/ mysql -u${MYSQL_ROOT_USERNAME} -p${MYSQL_ROOT_PASSWORD} +Welcome to the MariaDB monitor. Commands end with ; or \g. +Your MariaDB connection id is 341 +Server version: 10.5.8-MariaDB-1:10.5.8+maria~focal mariadb.org binary distribution + +Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +# Verify that the "company" database has been restored +MariaDB [(none)]> show databases; ++--------------------+ +| Database | ++--------------------+ +| company | +| information_schema | +| mysql | +| performance_schema | ++--------------------+ +4 rows in set (0.001 sec) + +# Verify that the tables of the "company" database have been restored +MariaDB [(none)]> show tables from company; ++-------------------+ +| Tables_in_company | ++-------------------+ +| employees | ++-------------------+ +1 row in set (0.000 sec) + +# Verify that the sample data of the "employees" table has been restored +MariaDB [(none)]> select * from company.employees; ++---------------+--------+ +| name | salary | ++---------------+--------+ +| John Doe | 5000 | +| James William | 7000 | ++---------------+--------+ +2 rows in set (0.000 sec) + +MariaDB [(none)]> exit +Bye +``` + +Hence, we can see from the above output that the deleted data has been restored successfully from the backup. + +**Resume Backup** + +Since our data has been restored successfully we can now resume our usual backup process. Resume the `BackupConfiguration` using following command, + +```bash +$ kubectl patch backupconfiguration -n demo sample-mariadb-backup --type="merge" --patch='{"spec": {"paused": false}}' +backupconfiguration.stash.appscode.com/sample-mariadb-backup patched +``` + +Or you can use the Stash `kubectl` plugin to resume the `BackupConfiguration`, + +```bash +$ kubectl stash resume -n demo --backupconfig=sample-mariadb-backup +BackupConfiguration demo/sample-mariadb-backup has been resumed successfully. +``` + +Verify that the `BackupConfiguration` has been resumed, + +```bash +$ kubectl get backupconfiguration -n demo sample-mariadb-backup +NAME TASK SCHEDULE PAUSED PHASE AGE +sample-mariadb-backup mariadb-backup-10.5.8 */5 * * * * false Ready 29m +``` + +Here, `false` in the `PAUSED` column means the backup has been resume successfully. The CronJob also should be resumed now. + +```bash +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-backup-sample-mariadb-backup */5 * * * * False 0 2m59s 29m +``` + +Here, `False` in the `SUSPEND` column means the CronJob is no longer suspended and will trigger in the next schedule. + +## Allow Operator to List Snapshots + +When you list Snapshots using `kubectl get snapshot` command, Stash operator itself read the Snapshots directly from the backend. So, the operator needs permission to access the bucket. +Stash operator has it own's `ServiceAccount`. Therefore, this `ServiceAccount` should be binded with the IAM service account as well. Run the following command to get the service account used by the Stash operator, + +```bash +$ kubectl get serviceaccount -n stash stash-stash-enterprise +NAME SECRETS AGE +stash-stash-enterprise 1 9m52s +``` + +Let's add the IAM annotations to the `ServiceAccount`, + +```bash +$ kubectl annotate sa -n stash stash-stash-enterprise iam.gke.io/gcp-service-account="bucket-accessor@appscode-testing.iam.gserviceaccount.com" +``` + +Now Let's bind it with the IAM service account, + +```bash +$ gcloud iam service-accounts add-iam-policy-binding bucket-accessor@sample-project.iam.gserviceaccount.com \ + --role roles/iam.workloadIdentityUser \ + --member "serviceAccount:sample-project.svc.id.goog[stash/stash-stash-enterprise]" +``` + +### Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo backupconfiguration sample-mariadb-backup +kubectl delete -n demo restoresession sample-mariadb-restore +kubectl delete -n demo sa bucket-user +kubectl delete -n demo secret encryption-secret +kubectl delete -n demo repository gcs-repo +kubectl delete -n demo mariadb sample-mariadb +kubectl delete ns demo +``` diff --git a/content/docs/v2024.12.18/guides/platforms/minio/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/guides/platforms/minio/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..1a075b8f89 --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/minio/examples/backupconfiguration.yaml @@ -0,0 +1,23 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup + namespace: demo +spec: + repository: + name: minio-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/guides/platforms/minio/examples/deployment.yaml b/content/docs/v2024.12.18/guides/platforms/minio/examples/deployment.yaml new file mode 100644 index 0000000000..b919066312 --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/minio/examples/deployment.yaml @@ -0,0 +1,32 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-demo + name: stash-demo + namespace: demo +spec: + replicas: 3 + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - args: ["echo sample_data > /source/data/data.txt && sleep 3000"] + command: ["/bin/sh", "-c"] + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + persistentVolumeClaim: + claimName: source-pvc diff --git a/content/docs/v2024.12.18/guides/platforms/minio/examples/minio-deployment.yaml b/content/docs/v2024.12.18/guides/platforms/minio/examples/minio-deployment.yaml new file mode 100644 index 0000000000..8e700e5a8f --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/minio/examples/minio-deployment.yaml @@ -0,0 +1,58 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: minio-deployment + namespace: storage + labels: + app: minio +spec: + selector: + matchLabels: + app: minio + template: + metadata: + labels: + app: minio + spec: + containers: + - name: minio + image: minio/minio + args: + - server + - --address + - ":443" + - /storage + env: + # credentials to access minio server. use from secret "minio-server-secret" + - name: MINIO_ACCESS_KEY + valueFrom: + secretKeyRef: + name: minio-server-secret + key: MINIO_ACCESS_KEY + - name: MINIO_SECRET_KEY + valueFrom: + secretKeyRef: + name: minio-server-secret + key: MINIO_SECRET_KEY + ports: + - name: https + containerPort: 443 + volumeMounts: + - name: storage # mount the "storage" volume into the pod + mountPath: "/storage" + - name: minio-certs # mount the certificates in "/root/.minio/certs" directory + mountPath: "/root/.minio/certs" + volumes: + - name: storage # use "minio-pvc" to store data + persistentVolumeClaim: + claimName: minio-pvc + - name: minio-certs # use secret "minio-server-secret" as volume to mount the certificates + secret: + secretName: minio-server-secret + items: + - key: public.crt + path: public.crt + - key: private.key + path: private.key + - key: public.crt + path: CAs/public.crt # mark self signed certificate as trusted diff --git a/content/docs/v2024.12.18/guides/platforms/minio/examples/minio-nodeport-svc.yaml b/content/docs/v2024.12.18/guides/platforms/minio/examples/minio-nodeport-svc.yaml new file mode 100644 index 0000000000..cdb26bff6b --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/minio/examples/minio-nodeport-svc.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + name: minio-nodeport-svc + namespace: storage +spec: + type: NodePort + ports: + - name: https + port: 443 + targetPort: https + protocol: TCP + selector: + app: minio # must match with the label used in minio deployment diff --git a/content/docs/v2024.12.18/guides/platforms/minio/examples/minio-pvc.yaml b/content/docs/v2024.12.18/guides/platforms/minio/examples/minio-pvc.yaml new file mode 100644 index 0000000000..84b796e1b1 --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/minio/examples/minio-pvc.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: minio-pvc + namespace: storage +spec: + storageClassName: standard + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 5Gi diff --git a/content/docs/v2024.12.18/guides/platforms/minio/examples/pvc.yaml b/content/docs/v2024.12.18/guides/platforms/minio/examples/pvc.yaml new file mode 100644 index 0000000000..5c526ee424 --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/minio/examples/pvc.yaml @@ -0,0 +1,12 @@ +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: source-pvc + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: standard + resources: + requests: + storage: 1Gi diff --git a/content/docs/v2024.12.18/guides/platforms/minio/examples/recovered_deployment.yaml b/content/docs/v2024.12.18/guides/platforms/minio/examples/recovered_deployment.yaml new file mode 100644 index 0000000000..ae126526fe --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/minio/examples/recovered_deployment.yaml @@ -0,0 +1,46 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: restore-pvc + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: standard + resources: + requests: + storage: 1Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-recovered + name: stash-recovered + namespace: demo +spec: + replicas: 3 + selector: + matchLabels: + app: stash-recovered + template: + metadata: + labels: + app: stash-recovered + name: busybox + spec: + containers: + - args: + - sleep + - "3600" + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /restore/data + name: restore-data + restartPolicy: Always + volumes: + - name: restore-data + persistentVolumeClaim: + claimName: restore-pvc diff --git a/content/docs/v2024.12.18/guides/platforms/minio/examples/repository.yaml b/content/docs/v2024.12.18/guides/platforms/minio/examples/repository.yaml new file mode 100644 index 0000000000..fa0d958075 --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/minio/examples/repository.yaml @@ -0,0 +1,12 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: minio-repo + namespace: demo +spec: + backend: + s3: + endpoint: 'https://minio-nodeport-svc.storage.svc' + bucket: minio-bucket + prefix: /source/data + storageSecretName: minio-secret diff --git a/content/docs/v2024.12.18/guides/platforms/minio/examples/restoresession.yaml b/content/docs/v2024.12.18/guides/platforms/minio/examples/restoresession.yaml new file mode 100644 index 0000000000..ac8613ec72 --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/minio/examples/restoresession.yaml @@ -0,0 +1,19 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: deployment-restore + namespace: demo +spec: + repository: + name: minio-repo + target: # target indicates where the recovered data will be stored + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-recovered + volumeMounts: + - name: restore-data + mountPath: /source/data + rules: + - paths: + - /source/data/ diff --git a/content/docs/v2024.12.18/guides/platforms/minio/images/minio.png b/content/docs/v2024.12.18/guides/platforms/minio/images/minio.png new file mode 100644 index 0000000000..9a2507942d Binary files /dev/null and b/content/docs/v2024.12.18/guides/platforms/minio/images/minio.png differ diff --git a/content/docs/v2024.12.18/guides/platforms/minio/index.md b/content/docs/v2024.12.18/guides/platforms/minio/index.md new file mode 100644 index 0000000000..954546e114 --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/minio/index.md @@ -0,0 +1,774 @@ +--- +title: Minio | Stash +description: Using Stash with TLS secured Minio Server +menu: + docs_v2024.12.18: + identifier: platforms-minio + name: Minio + parent: platforms + weight: 40 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Using Stash with TLS secured Minio Server + +Minio is an open-source object storage server compatible with [AWS S3](https://aws.amazon.com/s3/) cloud storage service. This guide will show you how to use Stash to backup and restore volumes of a Kubernetes workload in [Minio](https://min.io/) backend. Here, we are going to backup a volume of a Deployment into a Minio bucket. Then, we are going to show how to restore this backed up data into a volume of another Deployment. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster. If you don't already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). + +- Install `Stash` in your cluster following the steps [here](/docs/v2024.12.18/setup/README). + +- You should be familiar with the following `Stash` concepts: + - [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) + - [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) + - [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + - [Repository](/docs/v2024.12.18/concepts/crds/repository/) +- You will need a TLS secured Minio server to store backed up data. If you already do not have a Minio server running, deploy one following the tutorial from [here](https://github.com/appscode/third-party-tools/blob/master/storage/minio/README.md). For this tutorial, we have deployed Minio server in `storage` namespace and it is accessible through `minio.storage.svc` dns. + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +**Choosing StorageClass:** + +Stash works with any `StorageClass`. Check available `StorageClass` in your cluster using the following command: + +```bash +$ kubectl get storageclass -n demo +NAME PROVISIONER AGE +standard (default) k8s.io/minikube-hostpath 130m +``` + +Here, we have `standard` StorageClass in our cluster. + +> **Note:** YAML files used in this tutorial are stored in [docs/guides/platforms/minio/examples](/docs/v2024.12.18/guides/platforms/minio/examples) directory of [stashed/docs](https://github.com/stashed/docs) repository. + +## Backup the Volume of a Deployment + +Here, we are going to deploy a Deployment with a PVC. This Deployment will automatically generate some sample data into the PVC. Then, we are going to backup this sample data using Stash. + +### Prepare Workload + +At first, let's deploy the workload whose volumes we are going to backup. Here, we are going create a PVC and deploy a Deployment with this PVC. + +**Create PVC:** + +Below is the YAML of the sample PVC that we are going to create, + +```yaml +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: source-pvc + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: standard + resources: + requests: + storage: 1Gi +``` + +Let's create the PVC we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/minio/examples/pvc.yaml +persistentvolumeclaim/source-pvc created +``` + +**Deploy Deployment:** + +Now, we are going to deploy a Deployment that uses the above PVC. This Deployment will automatically generate sample data (`data.txt` file) in `/source/data` directory where we have mounted the PVC. + +Below is the YAML of the Deployment that we are going to create, + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-demo + name: stash-demo + namespace: demo +spec: + replicas: 3 + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - args: ["echo sample_data > /source/data/data.txt && sleep 3000"] + command: ["/bin/sh", "-c"] + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + persistentVolumeClaim: + claimName: source-pvc +``` + +Let's create the Deployment we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/minio/examples/deployment.yaml +deployment.apps/stash-demo created +``` + +Now, wait for the pods of the Deployment to go into the `Running` state. + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-demo-69f9ffbbf7-6wwtr 1/1 Running 0 60s +stash-demo-69f9ffbbf7-88kgj 1/1 Running 0 60s +stash-demo-69f9ffbbf7-q8qld 1/1 Running 0 60s +``` + +To verify that the sample data has been created in `/source/data` directory, use the following command: + +```bash +$ kubectl exec -n demo stash-demo-69f9ffbbf7-6wwtr -- cat /source/data/data.txt +sample_data +``` + +### Prepare Backend + +We are going to store our backed up data into an [Minio Bucket](https://min.io/). At first, we need to create a secret with the access credentials to our Minio bucket. Then, we have to create a `Repository` crd that will hold the information about our backend storage. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +**Create Secret:** + +Let's create a secret called `minio-secret` with access credentials to our desired [Minio bucket](https://min.io/), + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > AWS_ACCESS_KEY_ID +$ echo -n '' > AWS_SECRET_ACCESS_KEY +$ cat ./directory/of/root/certificate/ca.crt > CA_CERT_DATA +$ kubectl create secret generic -n demo minio-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./AWS_ACCESS_KEY_ID \ + --from-file=./AWS_SECRET_ACCESS_KEY \ + --from-file=./CA_CERT_DATA +secret/minio-secret created +``` + +Verify that the secret has been created successfully, + +```bash +$ kubectl get secret -n demo minio-secret -o yaml +``` + +```yaml +apiVersion: v1 +data: + AWS_ACCESS_KEY_ID: YWRtaW4= + AWS_SECRET_ACCESS_KEY: Y2hhbmdlaXQ= + CA_CERT_DATA: dXNlIHlvdXIgb3duIGNyZWRlbnRpYWxz # + RESTIC_PASSWORD: Y2hhbmdlaXQ= +kind: Secret +metadata: + creationTimestamp: "2019-07-23T05:32:40Z" + name: minio-secret + namespace: demo + resourceVersion: "7824" + selfLink: /api/v1/namespaces/demo/secrets/minio-secret + uid: 31c9310d-dc31-42a3-bc42-f9318290b091 +type: Opaque +``` + +**Create Repository:** + +Now, let's create a `Repository` with the information of our desired Minio bucket. Below is the YAML of `Repository` crd we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: minio-repo + namespace: demo +spec: + backend: + s3: + endpoint: 'https://minio-nodeport-svc.storage.svc' + bucket: minio-bucket + prefix: /source/data + storageSecretName: minio-secret +``` + +Let's create the `Repository` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/minio/examples/repository.yaml +repository.stash.appscode.com/minio-repo created +``` + +Now, we are ready to backup our sample data into this backend. + +### Backup + +We have to create a `BackupConfiguration` crd targeting the `stash-demo` Deployment that we have deployed earlier. Stash will inject a sidecar container into the target. It will also create a `CronJob` to take a periodic backup of `/source/data` directory of the target. + +**Create BackupConfiguration:** + +Below is the YAML of the `BackupConfiguration` crd that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup + namespace: demo +spec: + repository: + name: minio-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Here, + +- `spec.repository` refers to the `Repository` object `minio-repo` that holds backend [Minio bucket](https://min.io/) information. +- `spec.target.ref` refers to the `stash-demo` Deployment for backup target. +- `spec.target.volumeMounts` specifies a list of volumes and their mountPath that contain the target paths. +- `spec.target.paths` specifies list of file paths to backup. + +Let's create the `BackupConfiguration` crd we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/minio/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/deployment-backup created +``` + +**Verify Sidecar:** + +If everything goes well, Stash will inject a sidecar container into the `stash-demo` Deployment to take backup of `/source/data` directory. Let’s check that the sidecar has been injected successfully, + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-demo-6548cf5cc-7qx9d 2/2 Running 0 42s +stash-demo-6548cf5cc-d26sx 2/2 Running 0 37s +stash-demo-6548cf5cc-f2xbl 2/2 Running 0 40s +``` + +Look at the pod. It now has 2 containers. If you view the resource definition of this pod, you will see that there is a container named `stash` which is running `run-backup` command. + +```yaml +$ kubectl get pod -n demo stash-demo-6548cf5cc-7qx9d -o yaml +apiVersion: v1 +kind: Pod +metadata: + annotations: + stash.appscode.com/last-applied-backupconfiguration-hash: "17185792379662025862" + creationTimestamp: "2019-07-23T08:52:42Z" + generateName: stash-demo-6548cf5cc- + labels: + app: stash-demo + pod-template-hash: 6548cf5cc + name: stash-demo-6548cf5cc-7qx9d + namespace: demo + ... +spec: + containers: + - args: + - echo sample_data > /source/data/data.txt && sleep 3000 + command: + - /bin/sh + - -c + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /source/data + name: source-data + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: default-token-95xvp + readOnly: true + - args: + - run-backup + - --backup-configuration=deployment-backup + - --secret-dir=/etc/stash/repository/secret + - --enable-cache=true + - --max-connections=0 + - --metrics-enabled=true + - --pushgateway-url=http://stash-operator.kube-system.svc:56789 + - --enable-status-subresource=true + - --use-kubeapiserver-fqdn-for-aks=true + - --logtostderr=true + - --alsologtostderr=false + - --v=3 + - --stderrthreshold=0 + env: + - name: NODE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName + - name: POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + image: suaas21/stash:volumeTemp_linux_amd64 + imagePullPolicy: IfNotPresent + name: stash + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /etc/stash + name: stash-podinfo + - mountPath: /etc/stash/repository/secret + name: stash-secret-volume + - mountPath: /tmp + name: tmp-dir + - mountPath: /source/data + name: source-data + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: default-token-95xvp + readOnly: true + dnsPolicy: ClusterFirst + enableServiceLinks: true + nodeName: minikube + priority: 0 + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + serviceAccount: default + serviceAccountName: default + terminationGracePeriodSeconds: 30 + volumes: + - name: source-data + persistentVolumeClaim: + claimName: source-pvc + - emptyDir: {} + name: tmp-dir + - downwardAPI: + defaultMode: 420 + items: + - fieldRef: + apiVersion: v1 + fieldPath: metadata.labels + path: labels + name: stash-podinfo + - name: stash-secret-volume + secret: + defaultMode: 420 + secretName: minio-secret + - name: default-token-95xvp + secret: + defaultMode: 420 + secretName: default-token-95xvp + ... +... +``` + +**Verify CronJob:** + +It will also create a `CronJob` with the schedule specified in `spec.schedule` field of `BackupConfiguration` crd. + +Verify that the `CronJob` has been created using the following command, + +```bash +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +deployment-backup */1 * * * * False 0 13s 1m50s +``` + +**Wait for BackupSession:** + +The `deployment-backup` CronJob will trigger a backup on each schedule by creating a `BackupSession` crd. The sidecar container will watch for the `BackupSession` crd. When it finds one, it will take backup immediately. + +Wait for the next schedule for backup. Run the following command to watch `BackupSession` crd, + +```bash +$ watch -n 3 kubectl get backupsession -n demo +Every 3.0s: kubectl get backupsession -n demo suaas-appscode: Mon Jul 22 15:01:21 2019 + +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +deployment-backup-1563786061 BackupConfiguration deployment-backup Succeeded 18s +``` + +We can see from the above output that the backup session has succeeded. Now, we are going to verify whether the backed up data has been stored in the backend. + +**Verify Backup:** + +Once a backup is complete, Stash will update the respective `Repository` crd to reflect the backup. Check that the repository `minio-repo` has been updated by the following command, + +```bash +$ kubectl get repository -n demo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +minio-repo true 32 B 2 3m40s 5m18s +``` + +Now, if we navigate to the Minio Bucket, we are going to see backed up data has been stored in `/source/data` directory as specified by `spec.backend.s3.prefix` field of `Repository` crd. + +
+  Backup data in Minio Bucket +
Fig: Backup data in Minio Bucket
+
+ +> **Note:** Stash keeps all the backed up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Restore the Backed up Data + +This section will show you how to restore the backed up data from [Minio bucket](https://min.io/) we have taken in earlier section. + +**Stop Taking Backup of the Old Deployment:** + +At first, let's stop taking any further backup of the old Deployment so that no backup is taken during the restore process. We are going to pause the `BackupConfiguration` that we created to backup the `stash-demo` Deployment. Then, Stash will stop taking any further backup for this Deployment. You can learn more how to pause a scheduled backup [here](/docs/v2024.12.18/guides/use-cases/pause-backup/) + +Let's pause the `deployment-backup` BackupConfiguration, + +```bash +$ kubectl patch backupconfiguration -n demo deployment-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/deployment-backup patched +``` + +Now, wait for a moment. Stash will pause the BackupConfiguration. Verify that the BackupConfiguration has been paused, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED AGE +deployment-backup */1 * * * * true 26m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the BackupConfiguration has been paused. + +**Deploy Deployment:** + +We are going to create a new Deployment named `stash-recovered` with a new PVC and restore the backed up data inside it. + +Below are the YAMLs of the Deployment and PVC that we are going to create, + +```yaml +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: restore-pvc + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: standard + resources: + requests: + storage: 1Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-recovered + name: stash-recovered + namespace: demo +spec: + replicas: 3 + selector: + matchLabels: + app: stash-recovered + template: + metadata: + labels: + app: stash-recovered + name: busybox + spec: + containers: + - args: + - sleep + - "3600" + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /restore/data + name: restore-data + restartPolicy: Always + volumes: + - name: restore-data + persistentVolumeClaim: + claimName: restore-pvc +``` + +Let's create the Deployment and PVC we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/minio/examples/recovered_deployment.yaml +persistentvolumeclaim/restore-pvc created +deployment.apps/stash-recovered created +``` + +**Create RestoreSession:** + +Now, we need to create a `RestoreSession` crd targeting the `stash-recovered` Deployment. + +Below is the YAML of the `RestoreSesion` crd that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: deployment-restore + namespace: demo +spec: + repository: + name: minio-repo + target: # target indicates where the recovered data will be stored + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-recovered + volumeMounts: + - name: restore-data + mountPath: /source/data + rules: + - paths: + - /source/data/ +``` + +Here, + +- `spec.repository.name` specifies the `Repository` crd that holds the backend information where our backed up data has been stored. +- `spec.target.ref` refers to the target workload where the recovered data will be stored. +- `spec.target.volumeMounts` specifies a list of volumes and their mountPath where the data will be restored. + - `mountPath` must be same `mountPath` as the original volume because Stash stores absolute path of the backed up files. If you use different `mountPath` for the restored volume the backed up files will not be restored into your desired volume. + +Let's create the `RestoreSession` crd we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/minio/examples/restoresession.yaml +restoresession.stash.appscode.com/deployment-restore created +``` + +Once, you have created the `RestoreSession` crd, Stash will inject `init-container` into `stash-recovered` Deployment. The Deployment will restart and the `init-container` will restore the desired data on start-up. + +**Verify Init-Container:** + +Wait until the `init-container` has been injected into the `stash-recovered` Deployment. Let’s describe the Deployment to verify that `init-container` has been injected successfully. + +```yaml +$ kubectl describe deployment -n demo stash-recovered +Name: stash-recovered +Namespace: demo +CreationTimestamp: Tue, 23 Jul 2019 15:05:11 +0600 +Labels: app=stash-recovered +Selector: app=stash-recovered +Replicas: 3 desired | 2 updated | 4 total | 3 available | 1 unavailable +StrategyType: RollingUpdate +... +Pod Template: + Labels: app=stash-recovered + Annotations: stash.appscode.com/last-applied-restoresession-hash: 9375001205249667775 + Init Containers: + stash-init: + Image: suaas21/stash:volumeTemp_linux_amd64 + Port: + Host Port: + Args: + restore + --restore-session=deployment-restore + --secret-dir=/etc/stash/repository/secret + --enable-cache=true + --max-connections=0 + --metrics-enabled=true + --pushgateway-url=http://stash-operator.kube-system.svc:56789 + --enable-status-subresource=true + --use-kubeapiserver-fqdn-for-aks=true + --logtostderr=true + --alsologtostderr=false + --v=3 + --stderrthreshold=0 + Environment: + NODE_NAME: (v1:spec.nodeName) + POD_NAME: (v1:metadata.name) + Mounts: + /etc/stash/repository/secret from stash-secret-volume (rw) + /source/data from restore-data (rw) + /tmp from tmp-dir (rw) + Containers: + busybox: + Image: busybox + Port: + Host Port: + Args: + sleep + 3600 + Environment: + Mounts: + /restore/data from restore-data (rw) + Volumes: + restore-data: + Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace) + ClaimName: restore-pvc + ReadOnly: false + tmp-dir: + Type: EmptyDir (a temporary directory that shares a pod's lifetime) + Medium: + SizeLimit: + stash-podinfo: + Type: DownwardAPI (a volume populated by information about the pod) + Items: + metadata.labels -> labels + stash-secret-volume: + Type: Secret (a volume populated by a Secret) + SecretName: minio-secret + Optional: false +... +``` + +Notice the `Init-Containers` section. We can see that the init-container `stash-init` has been injected which is running `restore` command. + +**Wait for RestoreSession to Succeeded:** + +Now, wait for the restore process to complete. You can watch the `RestoreSession` phase using the following command, + +```bash +$ watch -n 2 kubectl get restoresession -n demo +Every 3.0s: kubectl get restoresession --all-namespaces suaas-appscode: Mon Jul 22 18:17:26 2019 + +NAMESPACE NAME REPOSITORY-NAME PHASE AGE +demo deployment-restore minio-repo Succeeded 110s +``` + +So, we can see from the output of the above command that the restore process has succeeded. + +> **Note:** If you want to restore the backed up data inside the same Deployment whose volumes were backed up, you have to remove the corrupted data from the Deployment. Then, you have to create a RestoreSession targeting the Deployment. + +**Verify Restored Data:** + +In this section, we are going to verify that the desired data has been restored successfully. At first, check if the `stash-recovered` pod of the Deployment has gone into `Running` state by the following command, + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-recovered-6f5c46fdbf-lfthv 1/1 Running 0 2m39s +stash-recovered-6f5c46fdbf-s7rrq 1/1 Running 0 2m15s +stash-recovered-6f5c46fdbf-vn2z8 1/1 Running 0 2m35s +``` + +Verify that the sample data has been restored in `/restore/data` directory of the `stash-recovered` pod of the Deployment using the following command, + +```bash +$ kubectl exec -n demo stash-recovered-6f5c46fdbf-s7rrq -- cat /restore/data/data.txt +sample_data +``` + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo deployment stash-demo +kubectl delete -n demo deployment stash-recovered +kubectl delete -n demo backupconfiguration deployment-backup +kubectl delete -n demo restoresession deployment-restore +kubectl delete -n demo repository minio-repo +kubectl delete -n demo secret minio-secret +kubectl delete -n demo pvc --all +``` + +## Next Steps + +1. See a step by step guide to backup/restore volumes of a StatefulSet [here](/docs/v2024.12.18/guides/workloads/statefulset/). +2. See a step by step guide to backup/restore volumes of a DaemonSet [here](/docs/v2024.12.18/guides/workloads/daemonset/). +3. See a step by step guide to Backup/restore Stand-alone PVC [here](/docs/v2024.12.18/guides/volumes/pvc/) diff --git a/content/docs/v2024.12.18/guides/platforms/rook/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/guides/platforms/rook/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..d22931164c --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/rook/examples/backupconfiguration.yaml @@ -0,0 +1,23 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup + namespace: demo +spec: + repository: + name: rook-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/guides/platforms/rook/examples/deployment.yaml b/content/docs/v2024.12.18/guides/platforms/rook/examples/deployment.yaml new file mode 100644 index 0000000000..93f0c38eba --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/rook/examples/deployment.yaml @@ -0,0 +1,36 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-demo + name: stash-demo + namespace: demo +spec: + replicas: 1 + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - args: ["echo sample_data > /source/data/data.txt && sleep 3000"] + command: ["/bin/sh", "-c"] + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + persistentVolumeClaim: + claimName: source-pvc + strategy: + rollingUpdate: + maxSurge: "0%" + maxUnavailable: "100%" diff --git a/content/docs/v2024.12.18/guides/platforms/rook/examples/pvc.yaml b/content/docs/v2024.12.18/guides/platforms/rook/examples/pvc.yaml new file mode 100644 index 0000000000..e917671c5e --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/rook/examples/pvc.yaml @@ -0,0 +1,12 @@ +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: source-pvc + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: "rook-ceph-block" + resources: + requests: + storage: 1Gi diff --git a/content/docs/v2024.12.18/guides/platforms/rook/examples/recovered_deployment.yaml b/content/docs/v2024.12.18/guides/platforms/rook/examples/recovered_deployment.yaml new file mode 100644 index 0000000000..b9ff8b0ae9 --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/rook/examples/recovered_deployment.yaml @@ -0,0 +1,50 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: restore-pvc + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: "rook-ceph-block" + resources: + requests: + storage: 1Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-recovered + name: stash-recovered + namespace: demo +spec: + replicas: 1 + selector: + matchLabels: + app: stash-recovered + template: + metadata: + labels: + app: stash-recovered + name: busybox + spec: + containers: + - args: + - sleep + - "3600" + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /restore/data + name: restore-data + restartPolicy: Always + volumes: + - name: restore-data + persistentVolumeClaim: + claimName: restore-pvc + strategy: + rollingUpdate: + maxSurge: "0%" + maxUnavailable: "100%" diff --git a/content/docs/v2024.12.18/guides/platforms/rook/examples/repository.yaml b/content/docs/v2024.12.18/guides/platforms/rook/examples/repository.yaml new file mode 100644 index 0000000000..60f22f7856 --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/rook/examples/repository.yaml @@ -0,0 +1,12 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: rook-repo + namespace: demo +spec: + backend: + s3: + endpoint: 'http://rook-ceph-rgw-my-store-external.rook-ceph.svc' + bucket: rook-bucket + prefix: /source/data + storageSecretName: rook-secret diff --git a/content/docs/v2024.12.18/guides/platforms/rook/examples/restoresession.yaml b/content/docs/v2024.12.18/guides/platforms/rook/examples/restoresession.yaml new file mode 100644 index 0000000000..3d1bcc509b --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/rook/examples/restoresession.yaml @@ -0,0 +1,19 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: deployment-restore + namespace: demo +spec: + repository: + name: rook-repo + target: # target indicates where the recovered data will be stored + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-recovered + volumeMounts: + - name: restore-data + mountPath: /source/data + rules: + - paths: + - /source/data/ diff --git a/content/docs/v2024.12.18/guides/platforms/rook/index.md b/content/docs/v2024.12.18/guides/platforms/rook/index.md new file mode 100644 index 0000000000..a521334487 --- /dev/null +++ b/content/docs/v2024.12.18/guides/platforms/rook/index.md @@ -0,0 +1,773 @@ +--- +title: Rook | Stash +description: Using Stash with Rook Storage Service +menu: + docs_v2024.12.18: + identifier: platforms-rook + name: Rook + parent: platforms + weight: 50 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Using Stash with Rook Managed Ceph Storage + +This guide will show you how to use Stash to backup and restore volumes of a Kubernetes workload in [Rook](https://rook.io/) managed Ceph storage. Here, we are going to backup a volume of a Deployment into [AWS S3](https://aws.amazon.com/s3/) compatible [Ceph Object Storage](https://rook.io/docs/rook/v1.0/ceph-object.html). Then, we are going to show how to restore this volume into a PersistentVolumeClaim of [Ceph Object Storage](https://rook.io/docs/rook/v1.0/ceph-object.html). We are going to also re-deploy deployment using this recovered volume. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster. If you don't already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). + +- Install `Stash` in your cluster following the steps [here](/docs/v2024.12.18/setup/README). + +- You should be familiar with the following `Stash` concepts: + - [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) + - [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) + - [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + - [Repository](/docs/v2024.12.18/concepts/crds/repository/) +- You will need a [Rook](https://rook.io/docs/rook/v1.7/quickstart.html) deployment with [Ceph Object Storage](https://rook.io/docs/rook/v1.7/ceph-object.html) and [Ceph Block Storage](https://rook.io/docs/rook/v1.7/ceph-block.html) configured. If you do not already have a Rook Storage Service configured, you can create one by following this [quickstart](https://rook.io/docs/rook/v1.7/quickstart.html) guide. + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> **Note:** YAML files used in this tutorial are stored in [docs/guides/platforms/rook/examples](/docs/v2024.12.18/guides/platforms/rook/examples) directory of [stashed/docs](https://github.com/stashed/docs) repository. + +**Choosing StorageClass:** + +[Ceph Block Storage](https://rook.io/docs/rook/v1.0/ceph-block.html) allows mounting Rook storage into pod using a PersistentVolumeClaim. In order to do that, we have to create a PersistentVolumeClaim with `rook-ceph-block`[StorageClass](https://kubernetes.io/docs/concepts/storage/storage-classes/). Verify the StorageClass exist by the following command: + +```bash +$ kubectl get storageclass +NAME PROVISIONER AGE +rook-ceph-block ceph.rook.io/block 89m +standard (default) k8s.io/minikube-hostpath 104m +``` + +## Backup the Volume of a Deployment + +Here, we are going to deploy a Deployment with a PVC. This Deployment will automatically generate some sample data into the PVC. Then, we are going to backup this sample data using Stash. + +### Prepare Workload + +At first, let's deploy the workload whose volumes we are going to backup. Here, we are going create a PVC and deploy a Deployment with this PVC. + +**Create PVC:** + +Below is the YAML of the sample PVC that we are going to create, + +```yaml +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: source-pvc + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: "rook-ceph-block" + resources: + requests: + storage: 1Gi +``` + +Let's create the PVC we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/rook/examples/pvc.yaml +persistentvolumeclaim/source-pvc created +``` + +**Deploy Deployment:** + +Now, we are going to deploy a Deployment that uses the above PVC. This Deployment will automatically generate sample data (`data.txt` file) in `/source/data` directory where we have mounted the PVC. + +Below is the YAML of the Deployment that we are going to create, + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-demo + name: stash-demo + namespace: demo +spec: + replicas: 1 + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - args: ["echo sample_data > /source/data/data.txt && sleep 3000"] + command: ["/bin/sh", "-c"] + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + persistentVolumeClaim: + claimName: source-pvc + strategy: + rollingUpdate: + maxSurge: "0%" + maxUnavailable: "100%" +``` + +Let's create the Deployment we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/rook/examples/deployment.yaml +deployment.apps/stash-demo created +``` + +Now, wait for the pods of the Deployment to go into the `Running` state. + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-demo-69f9ffbbf7-98lth 1/1 Running 0 13s +``` + +To verify that the sample data has been created in `/source/data` directory, use the following command: + +```bash +$ kubectl exec -n demo stash-demo-69f9ffbbf7-98lth -- cat /source/data/data.txt +sample_data +``` + +### Prepare Backend + +We are going to store our backed up data into an [Ceph Storage Bucket](https://rook.io/docs/rook/v1.0/ceph-storage.html). At first, we need to create a secret with the access credentials to our Ceph storage bucket. Then, we have to create a `Repository` crd that will hold the information about our backend storage. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +**Create Secret:** + +Let's create a secret called `rook-secret` with access credentials to our desired [Ceph Storage Bucket](https://rook.io/docs/rook/v1.0/ceph-storage.html), + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > AWS_ACCESS_KEY_ID +$ echo -n '' > AWS_SECRET_ACCESS_KEY +$ kubectl create secret generic -n demo rook-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./AWS_ACCESS_KEY_ID \ + --from-file=./AWS_SECRET_ACCESS_KEY +secret/rook-secret created +``` + +Verify that the secret has been created successfully, + +```bash +$ kubectl get secret -n demo rook-secret -o yaml +``` + +```yaml +apiVersion: v1 +data: + AWS_ACCESS_KEY_ID: Tk5HTkcwUVowS1lVOEhKMEFQVEQ= + AWS_SECRET_ACCESS_KEY: alExVHJFNU9oa2QzUEk0QzlQbkYwTjVaV0hvd2Yycm9BS2U1MEVsdA== + RESTIC_PASSWORD: Y2hhbmdlaXQ= +kind: Secret +metadata: + creationTimestamp: "2019-07-25T10:34:25Z" + name: rook-secret + namespace: demo + resourceVersion: "43037" + selfLink: /api/v1/namespaces/demo/secrets/rook-secret + uid: 49f412a4-f1e7-4eb1-92f5-49c0a96cc18d +type: Opaque +``` + +**Create Repository:** + +Now, let's create a `Repository` with the information of our desired Ceph storage bucket. Below is the YAML of `Repository` crd we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: rook-repo + namespace: demo +spec: + backend: + s3: + endpoint: 'http://rook-ceph-rgw-my-store-external.rook-ceph.svc' + bucket: rook-bucket + prefix: /source/data + storageSecretName: rook-secret +``` + +Let's create the `Repository` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/rook/examples/repository.yaml +repository.stash.appscode.com/rook-repo created +``` + +Now, we are ready to backup our sample data into this backend. + +### Backup + +We have to create a `BackupConfiguration` crd targeting the `stash-demo` Deployment that we have deployed earlier. Stash will inject a sidecar container into the target. It will also create a `CronJob` to take a periodic backup of `/source/data` directory of the target. + +**Create BackupConfiguration:** + +Below is the YAML of the `BackupConfiguration` crd that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup + namespace: demo +spec: + repository: + name: rook-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Here, + +- `spec.repository` refers to the `Repository` object `rook-repo` that holds backend information. +- `spec.target.ref` refers to the `stash-demo` Deployment for backup target. +- `spec.target.volumeMounts` specifies a list of volumes and their mountPath that contain the target paths. +- `spec.target.paths` specifies list of file paths to backup. + +Let's create the `BackupConfiguration` crd we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/rook/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/deployment-backup created +``` + +**Verify Sidecar:** + +If everything goes well, Stash will inject a sidecar container into the `stash-demo` Deployment to take backup of `/source/data` directory. Let’s check that the sidecar has been injected successfully, + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-demo-76d78d8966-nbkrl 2/2 Running 0 39s +``` + +Look at the pod. It now has 2 containers. If you view the resource definition of this pod, you will see that there is a container named `stash` which is running `run-backup` command. + +```yaml +$ kubectl get pod -n demo stash-demo-76d78d8966-nbkrl -o yaml +apiVersion: v1 +kind: Pod +metadata: + generateName: stash-demo-76d78d8966- + labels: + app: stash-demo + pod-template-hash: 76d78d8966 + name: stash-demo-76d78d8966-nbkrl + namespace: demo + ... +spec: + containers: + - args: + - echo sample_data > /source/data/data.txt && sleep 3000 + command: + - /bin/sh + - -c + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /source/data + name: source-data + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: default-token-2njxz + readOnly: true + - args: + - run-backup + - --backup-configuration=deployment-backup + - --secret-dir=/etc/stash/repository/secret + - --enable-cache=true + - --max-connections=0 + - --metrics-enabled=true + - --pushgateway-url=http://stash-operator.kube-system.svc:56789 + - --enable-status-subresource=true + - --use-kubeapiserver-fqdn-for-aks=true + - --logtostderr=true + - --alsologtostderr=false + - --v=3 + - --stderrthreshold=0 + env: + - name: NODE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName + - name: POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + image: suaas21/stash:volumeTemp_linux_amd64 + imagePullPolicy: IfNotPresent + name: stash + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /etc/stash + name: stash-podinfo + - mountPath: /etc/stash/repository/secret + name: stash-secret-volume + - mountPath: /tmp + name: tmp-dir + - mountPath: /source/data + name: source-data + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: default-token-2njxz + readOnly: true + dnsPolicy: ClusterFirst + enableServiceLinks: true + nodeName: minikube + priority: 0 + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + serviceAccount: default + serviceAccountName: default + terminationGracePeriodSeconds: 30 + tolerations: + - effect: NoExecute + key: node.kubernetes.io/not-ready + operator: Exists + tolerationSeconds: 300 + - effect: NoExecute + key: node.kubernetes.io/unreachable + operator: Exists + tolerationSeconds: 300 + volumes: + - name: source-data + persistentVolumeClaim: + claimName: source-pvc + - emptyDir: {} + name: tmp-dir + - downwardAPI: + defaultMode: 420 + items: + - fieldRef: + apiVersion: v1 + fieldPath: metadata.labels + path: labels + name: stash-podinfo + - name: stash-secret-volume + secret: + defaultMode: 420 + secretName: rook-secret + - name: default-token-2njxz + secret: + defaultMode: 420 + secretName: default-token-2njxz + ... +... +``` + +**Verify CronJob:** + +It will also create a `CronJob` with the schedule specified in `spec.schedule` field of `BackupConfiguration` crd. + +Verify that the `CronJob` has been created using the following command, + +```bash +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +deployment-backup */1 * * * * False 0 13s 1m50s +``` + +**Wait for BackupSession:** + +The `deployment-backup` CronJob will trigger a backup on each schedule by creating a `BackupSession` crd. The sidecar container will watch for the `BackupSession` crd. When it finds one, it will take backup immediately. + +Wait for the next schedule for backup. Run the following command to watch `BackupSession` crd, + +```bash +$ watch -n 3 kubectl get backupsession -n demo +Every 3.0s: kubectl get backupsession -n demo suaas-appscode: Mon Jul 22 15:01:21 2019 + +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +deployment-backup-1663786062 BackupConfiguration deployment-backup Succeeded 21s +``` + +We can see from the above output that the backup session has succeeded. Now, we are going to verify whether the backed up data has been stored in the backend. + +**Verify Backup:** + +Once a backup is complete, Stash will update the respective `Repository` crd to reflect the backup. Check that the repository `rook-repo` has been updated by the following command, + +```bash +$ kubectl get repository -n demo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +rook-repo true 30 B 2 3m10s 5m20s +``` + +Here, `BACKUPCOUNT` field indicates the number of backup snapshots has taken in this repository. + +## Restore the Backed up Data + +This section will show you how to restore the backed up data from [Ceph Storage Bucket](https://rook.io/docs/rook/v1.0/ceph-storage.html) we have taken in the earlier section. + +**Stop Taking Backup of the Old Deployment:** + +At first, let's stop taking any further backup of the old Deployment so that no backup is taken during the restore process. We are going to pause the `BackupConfiguration` that we created to backup the `stash-demo` Deployment. Then, Stash will stop taking any further backup for this Deployment. You can learn more how to pause a scheduled backup [here](/docs/v2024.12.18/guides/use-cases/pause-backup/) + +Let's pause the `deployment-backup` BackupConfiguration, + +```bash +$ kubectl patch backupconfiguration -n demo deployment-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/deployment-backup patched +``` + +Now, wait for a moment. Stash will pause the BackupConfiguration. Verify that the BackupConfiguration has been paused, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED AGE +deployment-backup */1 * * * * true 26m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the BackupConfiguration has been paused. + +**Deploy Deployment:** + +We are going to create a new Deployment named `stash-recovered` with a new PVC and restore the backed up data inside it. + +Below are the YAMLs of the Deployment and PVC that we are going to create, + +```yaml +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: restore-pvc + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: "rook-ceph-block" + resources: + requests: + storage: 1Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-recovered + name: stash-recovered + namespace: demo +spec: + replicas: 1 + selector: + matchLabels: + app: stash-recovered + template: + metadata: + labels: + app: stash-recovered + name: busybox + spec: + containers: + - args: + - sleep + - "3600" + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /restore/data + name: restore-data + restartPolicy: Always + volumes: + - name: restore-data + persistentVolumeClaim: + claimName: restore-pvc + strategy: + rollingUpdate: + maxSurge: "0%" + maxUnavailable: "100%" +``` + +Let's create the Deployment and PVC we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/rook/examples/recovered_deployment.yaml +persistentvolumeclaim/restore-pvc created +deployment.apps/stash-recovered created +``` + +**Create RestoreSession:** + +Now, we need to create a `RestoreSession` crd targeting the `stash-recovered` Deployment. + +Below is the YAML of the `RestoreSesion` crd that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: deployment-restore + namespace: demo +spec: + repository: + name: rook-repo + target: # target indicates where the recovered data will be stored + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-recovered + volumeMounts: + - name: restore-data + mountPath: /source/data + rules: + - paths: + - /source/data/ +``` + +Here, + +- `spec.repository.name` specifies the `Repository` crd that holds the backend information where our backed up data has been stored. +- `spec.target.ref` refers to the target workload where the recovered data will be stored. +- `spec.target.volumeMounts` specifies a list of volumes and their mountPath where the data will be restored. + - `mountPath` must be same `mountPath` as the original volume because Stash stores absolute path of the backed up files. If you use different `mountPath` for the restored volume the backed up files will not be restored into your desired volume. + +Let's create the `RestoreSession` crd we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/platforms/rook/examples/restoresession.yaml +restoresession.stash.appscode.com/deployment-restore created +``` + +Once, you have created the `RestoreSession` crd, Stash will inject `init-container` into `stash-recovered` Deployment. The Deployment will restart and the `init-container` will restore the desired data on start-up. + +**Verify Init-Container:** + +Wait until the `init-container` has been injected into the `stash-recovered` Deployment. Let’s describe the Deployment to verify that `init-container` has been injected successfully. + +```yaml +$ kubectl describe deployment -n demo stash-recovered +Name: stash-recovered +Namespace: demo +CreationTimestamp: Thu, 25 Jul 2019 19:14:18 +0600 +Labels: app=stash-recovered +Selector: app=stash-recovered +Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable +StrategyType: RollingUpdate +MinReadySeconds: 0 +RollingUpdateStrategy: 100% max unavailable, 0% max surge +... +Pod Template: + Labels: app=stash-recovered + Annotations: stash.appscode.com/last-applied-restoresession-hash: 10604314699482840900 + Init Containers: + stash-init: + Image: suaas21/stash:volumeTemp_linux_amd64 + Port: + Host Port: + Args: + restore + --restore-session=deployment-restore + --secret-dir=/etc/stash/repository/secret + --enable-cache=true + --max-connections=0 + --metrics-enabled=true + --pushgateway-url=http://stash-operator.kube-system.svc:56789 + --enable-status-subresource=true + --use-kubeapiserver-fqdn-for-aks=true + --logtostderr=true + --alsologtostderr=false + --v=3 + --stderrthreshold=0 + Environment: + NODE_NAME: (v1:spec.nodeName) + POD_NAME: (v1:metadata.name) + Mounts: + /etc/stash/repository/secret from stash-secret-volume (rw) + /source/data from restore-data (rw) + /tmp from tmp-dir (rw) + Containers: + busybox: + Image: busybox + Port: + Host Port: + Args: + sleep + 3600 + Environment: + Mounts: + /restore/data from restore-data (rw) + Volumes: + restore-data: + Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace) + ClaimName: restore-pvc + ReadOnly: false + tmp-dir: + Type: EmptyDir (a temporary directory that shares a pod's lifetime) + Medium: + SizeLimit: + stash-podinfo: + Type: DownwardAPI (a volume populated by information about the pod) + Items: + metadata.labels -> labels + stash-secret-volume: + Type: Secret (a volume populated by a Secret) + SecretName: rook-secret + Optional: false +... +``` + +Notice the `Init-Containers` section. We can see that the init-container `stash-init` has been injected which is running `restore` command. + +**Wait for RestoreSession to Succeeded:** + +Now, wait for the restore process to complete. You can watch the `RestoreSession` phase using the following command, + +```bash +$ watch -n 2 kubectl get restoresession -n demo +Every 3.0s: kubectl get restoresession --all-namespaces suaas-appscode: Mon Jul 28 18:17:22 2019 + +NAMESPACE NAME REPOSITORY-NAME PHASE AGE +demo deployment-restore rook-repo Succeeded 100s +``` + +So, we can see from the output of the above command that the restore process has succeeded. + +> **Note:** If you want to restore the backed up data inside the same Deployment whose volumes were backed up, you have to remove the corrupted data from the Deployment. Then, you have to create a RestoreSession targeting the Deployment. + +**Verify Restored Data:** + +In this section, we are going to verify that the desired data has been restored successfully. At first, check if the `stash-recovered` pod of the Deployment has gone into `Running` state by the following command, + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-recovered-5c59587895-76tsx 1/1 Running 0 73s +``` + +Verify that the sample data has been restored in `/restore/data` directory of the `stash-recovered` pod of the Deployment using the following command, + +```bash +$ kubectl exec -n demo stash-recovered-5c59587895-76tsx -- cat /restore/data/data.txt +sample_data +``` + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo deployment stash-demo +kubectl delete -n demo deployment stash-recovered +kubectl delete -n demo backupconfiguration deployment-backup +kubectl delete -n demo restoresession deployment-restore +kubectl delete -n demo repository rook-repo +kubectl delete -n demo secret rook-secret +kubectl delete -n demo pvc --all +``` + +# Next Steps + +1. See a step by step guide to backup/restore volumes of a StatefulSet [here](/docs/v2024.12.18/guides/workloads/statefulset/). +2. See a step by step guide to backup/restore volumes of a DaemonSet [here](/docs/v2024.12.18/guides/workloads/daemonset/). +3. See a step by step guide to Backup/restore Stand-alone PVC [here](/docs/v2024.12.18/guides/volumes/pvc/) diff --git a/content/docs/v2024.12.18/guides/security/_index.md b/content/docs/v2024.12.18/guides/security/_index.md new file mode 100644 index 0000000000..4f3d87682d --- /dev/null +++ b/content/docs/v2024.12.18/guides/security/_index.md @@ -0,0 +1,77 @@ +--- +title: Security | Stash +menu: + docs_v2024.12.18: + identifier: security + name: Security + parent: guides + weight: 130 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/guides/security/psp/index.md b/content/docs/v2024.12.18/guides/security/psp/index.md new file mode 100644 index 0000000000..eafd489ff4 --- /dev/null +++ b/content/docs/v2024.12.18/guides/security/psp/index.md @@ -0,0 +1,216 @@ +--- +title: PSP | Stash +description: Using Stash in PSP enabled cluster +menu: + docs_v2024.12.18: + identifier: security-psp + name: PSP + parent: security + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash with PSP Enabled Cluster + +Stash comes with built-in support for [Pod Security Policy (PSP)](https://kubernetes.io/docs/concepts/policy/pod-security-policy/) enabled cluster. Stash may use two different [Kubernets recommended PSP](https://kubernetes.io/docs/concepts/security/pod-security-standards) based on your setup. + +### Baseline PSP + + By default Stash uses minimally restrictive [baseline](https://kubernetes.io/docs/concepts/security/pod-security-standards/#baseline-default) PSP. Stash uses baseline PSP. Here, is the YAML of the baseline PSP that uses by Stash operator. + +```yaml +# ref: https://kubernetes.io/docs/concepts/security/pod-security-standards/#policy-instantiation +apiVersion: policy/v1beta1 +kind: PodSecurityPolicy +metadata: + name: baseline + annotations: + "helm.sh/hook": pre-install,pre-upgrade + "helm.sh/hook-delete-policy": before-hook-creation + {{- if .Values.security.apparmor.enabled }} + # Optional: Allow the default AppArmor profile, requires setting the default. + apparmor.security.beta.kubernetes.io/allowedProfileNames: 'runtime/default' + apparmor.security.beta.kubernetes.io/defaultProfileName: 'runtime/default' + {{- end }} + {{- if .Values.security.seccomp.enabled }} + # Optional: Allow the default seccomp profile, requires setting the default. + seccomp.security.alpha.kubernetes.io/allowedProfileNames: 'docker/default,runtime/default,unconfined' + seccomp.security.alpha.kubernetes.io/defaultProfileName: 'unconfined' + {{- end }} +spec: + privileged: false + # The moby default capability set, defined here: + # https://github.com/moby/moby/blob/0a5cec2833f82a6ad797d70acbf9cbbaf8956017/oci/caps/defaults.go#L6-L19 + allowedCapabilities: + - 'CHOWN' + - 'DAC_OVERRIDE' + - 'FSETID' + - 'FOWNER' + - 'MKNOD' + - 'NET_RAW' + - 'SETGID' + - 'SETUID' + - 'SETFCAP' + - 'SETPCAP' + - 'NET_BIND_SERVICE' + - 'SYS_CHROOT' + - 'KILL' + - 'AUDIT_WRITE' + # Allow all volume types except hostpath + volumes: + # 'core' volume types + - 'configMap' + - 'emptyDir' + - 'projected' + - 'secret' + - 'downwardAPI' + # Assume that persistentVolumes set up by the cluster admin are safe to use. + - 'persistentVolumeClaim' + # Allow all other non-hostpath volume types. + - 'awsElasticBlockStore' + - 'azureDisk' + - 'azureFile' + - 'cephFS' + - 'cinder' + - 'csi' + - 'fc' + - 'flexVolume' + - 'flocker' + - 'gcePersistentDisk' + - 'gitRepo' + - 'glusterfs' + - 'iscsi' + - 'nfs' + - 'photonPersistentDisk' + - 'portworxVolume' + - 'quobyte' + - 'rbd' + - 'scaleIO' + - 'storageos' + - 'vsphereVolume' + hostNetwork: false + hostIPC: false + hostPID: false + readOnlyRootFilesystem: false + runAsUser: + rule: 'RunAsAny' + seLinux: + rule: 'RunAsAny' + supplementalGroups: + rule: 'RunAsAny' + fsGroup: + rule: 'RunAsAny' +``` + +### Privileged PSP + +If you are using an NFS server as backend with Stash, you may need to give Stash operator privileged permission. In this case, Stash will use [privileged](https://kubernetes.io/docs/concepts/security/pod-security-standards/#privileged) PSP. Here, is the YAML of privileged PSP that is used by Stash when you uses NFS server as backend, + +```yaml +apiVersion: policy/v1beta1 +kind: PodSecurityPolicy +metadata: + name: privileged + annotations: + seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*' +spec: + privileged: true + allowPrivilegeEscalation: true + allowedCapabilities: + - '*' + volumes: + - '*' + hostNetwork: true + hostPorts: + - min: 0 + max: 65535 + hostIPC: true + hostPID: true + runAsUser: + rule: 'RunAsAny' + seLinux: + rule: 'RunAsAny' + supplementalGroups: + rule: 'RunAsAny' + fsGroup: + rule: 'RunAsAny' +``` + +You can use your own PodSecurityPolicy with Stash. In this case, you have to create the PSP manually and provide the PSP names during installation. You can provide the custom PSP names during installation as below, + +```bash +$ helm install stash oci://ghcr.io/appscode-charts/stash \ + --version {{< param "info.version" >}} \ + --namespace stash --create-namespace \ + --set features.enterprise=true \ + --set podSecurityPolicies[0]=abc \ + --set podSecurityPolicies[1]=xyz +``` diff --git a/content/docs/v2024.12.18/guides/security/rbac/index.md b/content/docs/v2024.12.18/guides/security/rbac/index.md new file mode 100644 index 0000000000..9e01eb4d29 --- /dev/null +++ b/content/docs/v2024.12.18/guides/security/rbac/index.md @@ -0,0 +1,127 @@ +--- +title: RBAC | Stash +description: Using Stash in RBAC enabled cluster +menu: + docs_v2024.12.18: + identifier: security-rbac + name: RBAC + parent: security + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stash with RBAC Enabled Cluster + +Stash comes with built-in support for RBAC enabled cluster. Stash installer create a `ClusterRole` and `RoleBinding` giving necessary permission to the operator. + +## Operator Permissions + +Stash operator needs the following RBAC permissions, + +| API Groups | Resources | Permissions | +| ---------------------------- | -------------------------------------------------------------- | ------------------------------------------- | +| apiextensions.k8s.io | customresourcedefinitions | * | +| apiextensions.k8s.io | apiservices | get, patch, delete | +| admissionregistration.k8s.io | mutatingwebhookconfigurations, validatingwebhookconfigurations | get, list, watch, patch, delete | +| stash.appscode.com | * | * | +| appcatalog.appscode.com | * | * | +| apps | daemonsets, deployments, replicasets, statefulsets | get, list, watch, patch | +| batch | jobs, cronjobs | get, list, watch, create, patch, delete | +| "" | namespaces, replicationcontrollers | get, list, watch, patch | +| "" | configmaps | get, list, watch,create, update, delete | +| "" | persistentvolumeclaims | get, list, watch, create, patch | +| "" | services, endpoints | get | +| "" | secrets, events | get, list, create, patch | +| "" | nodes | list | +| "" | pods, pods/exec | get, list, create, delete, deletecollection | +| "" | serviceaccounts | get, create, patch, delete | +| rbac.authorization.k8s.io | clusterroles, roles, rolebindings, clusterrolebindings | get, create, delete, patch | +| apps.openshift.io | deploymentconfigs | get, list, watch, patch | +| policy | podsecuritypolicies | use | +| snapshot.storage.k8s.io | volumesnapshots, volumesnapshotcontents, volumesnapshotclasses | get, list, watch, create, patch, delete | +| storage.k8s.io | storageclasses | get | + +Here, + +- `""` in API Group column means `core` API groups. +- `*` in Resources colum means all resources. +- `*` in Permission colum means all permissions. + +## User facing ClusterRoles + +Stash introduces custom resources, such as, `BackupConfiguration`,`BackupBatch`, `BackupSession`, `Repository`, `RestoreSession`, `RestoreBatch`, `Function`, and `Task` etc. Stash installer will create 2 user facing cluster roles: + +| ClusterRole | Aggregates To | Desription | +| ------------------- | ------------- | ----------------------------------------------------------------------------------------------------- | +| appscode:stash:edit | admin, edit | Allows edit access to Stash CRDs, intended to be granted within a namespace using a RoleBinding. | +| appscode:stash:view | view | Allows read-only access to Stash CRDs, intended to be granted within a namespace using a RoleBinding. | + +These user facing roles supports [ClusterRole Aggregation](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#aggregated-clusterroles) feature in Kubernetes 1.9 or later clusters. diff --git a/content/docs/v2024.12.18/guides/troubleshooting/_index.md b/content/docs/v2024.12.18/guides/troubleshooting/_index.md new file mode 100644 index 0000000000..8f634bb472 --- /dev/null +++ b/content/docs/v2024.12.18/guides/troubleshooting/_index.md @@ -0,0 +1,77 @@ +--- +title: Troubleshooting | Stash +menu: + docs_v2024.12.18: + identifier: troubleshooting + name: Troubleshooting + parent: guides + weight: 125 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/guides/troubleshooting/ciphertext-verification-failed/images/gcs_lifecycle_policy.png b/content/docs/v2024.12.18/guides/troubleshooting/ciphertext-verification-failed/images/gcs_lifecycle_policy.png new file mode 100644 index 0000000000..5205de1095 Binary files /dev/null and b/content/docs/v2024.12.18/guides/troubleshooting/ciphertext-verification-failed/images/gcs_lifecycle_policy.png differ diff --git a/content/docs/v2024.12.18/guides/troubleshooting/ciphertext-verification-failed/index.md b/content/docs/v2024.12.18/guides/troubleshooting/ciphertext-verification-failed/index.md new file mode 100644 index 0000000000..6aa5923104 --- /dev/null +++ b/content/docs/v2024.12.18/guides/troubleshooting/ciphertext-verification-failed/index.md @@ -0,0 +1,111 @@ +--- +title: Ciphertext Verification Failed| Stash +description: Troubleshooting "ciphertext verification failed" issue +menu: + docs_v2024.12.18: + identifier: troubleshooting-ciphertext-verification-failed + name: Ciphertext verification failed + parent: troubleshooting + weight: 40 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Troubleshooting "ciphertext verification failed" issue + +Sometimes, the backup starts failing after a few days with an error indicating `ciphertext verification failed`. In this guide, we are going to explain what might cause the issue and how to solve it. + +## Identifying the issue + +The backup should run successfully for a few days. Suddenly, it will start failing. Any subsequent backups will fail too. If you describe the respective `BackupSession` or view the log from the respective backup sidecar/job, you should see the following error: + +```bash +Fatal: ciphertext verification failed +``` + +## Possible reasons + +This can happen if the backed-up data get corrupted for any of these reasons. + +- Someone deleted some files/folders from the backend manually. +- The respective bucket has a policy configured to delete the old data automatically. + +## Solution + +At first, check if the bucket has any policy configured to delete the old data automatically. If this is the case, please remove that policy and depend only on the retention policy provided by Stash Repository to cleanup the old data. + +For example, if you are using a GCS bucket, you can check for such policy in the `LIFECYCLE` tab. + +
+ Object deletion policy in GCS +
Fig: Object deletion policy in GCS
+
+ +Unfortunately, there is no known way to fix the corrupted repository. You have to delete all the corrupted data from the backend. Only then, the subsequent backups will succeed again. diff --git a/content/docs/v2024.12.18/guides/troubleshooting/how-to-troubleshoot/index.md b/content/docs/v2024.12.18/guides/troubleshooting/how-to-troubleshoot/index.md new file mode 100644 index 0000000000..11d3a31af4 --- /dev/null +++ b/content/docs/v2024.12.18/guides/troubleshooting/how-to-troubleshoot/index.md @@ -0,0 +1,267 @@ +--- +title: How to Troubleshoot Stash issues | Stash +description: Troubleshooting backup/restore issues +menu: + docs_v2024.12.18: + identifier: troubleshooting-how-to + name: How to Troubleshoot + parent: troubleshooting + weight: 5 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# How to Troubleshoot Stash Issues + +This guide will give you an overview of how you can gather the necessary information to identify the issue that causes the backup/restore failure. + +## Troubleshoot Backup Issues + +In this section, we are going to explain how to troubleshoot backup issues. + +### Backup was Never Triggered + +If you have created the desired `BackupConfiguration` but the respective backup triggering CronJob was never created or any `BackupSession` was not created in the scheduled time, in this case, follow the following steps: + +#### Describe the `BackupConfiguration` + +At first, you should describe the respective `BackupConfiguration` as below: + +```bash +kubectl describe backupconfiguration -n +``` + +Now, check the `Status` section of `BackupConfiguration`. Make sure all the `conditions` are `True`. If there is any issue during backup setup, you should see the error in the respective condition. + +Also, check the event to see if there is any indication of an error. + +#### Check Stash operator log + +If you don't notice any error in the previous step, you should check the Stash operator log. + +Run the following command to view the Stash operator log: + +```bash +# Identify the Stash operator pod +kubectl get pods --all-namespaces | grep stash + +# View log of Stash operator pod +kubectl logs -n -c operator +``` + +Now, inspect the log carefully. You should see the respective error in the log. + +### BackupConfiguration NotReady + +If the phase of the `BackupConfiguration` is `NotReady`, you should describe the respective `BackupConfiguration`, + +```bash +kubectl describe backupconfiguration -n +``` + +Now, check the `Status` section of `BackupConfiguration`. Make sure all the `conditions` are `True`. If there is any issue during backup setup, you should see the error in the respective condition. If any of the conditions is `False`, the backup stays in the `NotReady` phase. The conditions that may cause a `BackupConfiguration` to become `NotReady` are given bellow: + +| Reason | Message | +| ------------------------- | ----------------------------- | +| RepositoryNotAvailable | Repository does not exist | +| BackendSecretNotAvailable | Backend Secret does not exist | +| TargetNotAvailable | Backup target does not exist | + +### Backup Failed + +If a backup fails, follow the following steps to identify the root cause. + +#### Describe the `BackupSession` + +At first, describe the failing `BackupSession`. You should see the respective error in the `Status` section. + +```bash +kubectl describe backupsession -n +``` + +Also, check the `Events` section. Sometimes, it can be helpful to identify the issue. + +#### View Backup Job/Sidecar log + +If you don't see any error in the previous step, you should try checking the log of the respective backup job/sidecar. + +If you are trying to backup a workload, run the following command to inspect the log: + +```bash +kubectl logs -n -c stash +``` + +If you are trying to backup using Stash addons, run the following command to inspect the log: + +```bash +# Identify the backup pod +kubectl get pods -n | grep stash-backup + +# View the log of the backup pod +kubectl logs -n --all-containers +``` + +Inspect the log carefully. You should notice the respective error that leads to backup failure. + +## Troubleshoot Restore Issues + +In this section, we are going to explain how to troubleshoot restore issues. + +### Restore Pending + +If the phase of the `RestoreSession` is `pending`, you should describe the respective `RestoreSession`, + +```bash +kubectl describe restoresession -n +``` + +Now, check the `Status` section of `RestoreSession`. Make sure all the `conditions` are `True`. If there is any issue during restore setup, you should see the error in the respective condition. If any of the conditions is `False`, the `RestoreSession` stays in the `Pending` phase. The conditions that may cause a `RestoreSession` to stay in `Pending` phase are given bellow: + +| Reason | Message | +| ------------------------- | ----------------------------- | +| RepositoryNotAvailable | Repository does not exist | +| BackendSecretNotAvailable | Backend Secret does not exist | +| TargetNotAvailable | Backup target does not exist | + +### Restore Failed + +If a restore fails, follow the following steps to identify the root cause. + +#### Describe the `RestoreSession` + +At first, describe the failing `RestoreSession`. You should see the respective error in the `Status` section. + +```bash +kubectl describe restoresession -n +``` + +Also, check the `Events` section. Sometimes, it can be helpful to identify the issue. + +#### View Restore Job/Init-Container log + +If you don't see any error in the previous step, you should try checking the log of the respective restore job / init-container. + +If you are trying to restore a workload, run the following command to inspect the log: + +```bash +kubectl logs -n -c stash-init +``` + +If you are trying to restore using Stash addons, run the following command to inspect the log: + +```bash +# Identify the restore pod +kubectl get pods -n | grep stash-restore + +# View the log of the restore pod +kubectl logs -n --all-containers +``` + +Inspect the log carefully. You should notice the respective error that leads to restore failure. + +## Debug with Stash `kubectl` Plugin + +You can use the Stash `kubectl` plugin to debug any backup/restore issue. + +### Debug Backup + +Run the following command to inspect any backup issue, + +```bash +kubectl stash debug backup -n --backupconfig +``` + +The above command will: + +- Show version information of Kubernetes and Stash +- Describe relevent `BackupConfiguration`, `BackupSessions`, and `Pods` +- Show logs from the relevent `Pods` + +### Debug Restore + +Run the following command to inspect any restore issue, + +```bash +kubectl stash debug restore -n --restoresession +``` + +The above command will: + +- Show version information of Kubernetes and Stash +- Describe relevent `RestoreSession` and `Pods` +- Show logs from the relevent `Pods` + +### Debug Operator + +Run the following command to view the Stash operator log: + +```bash +kubectl stash debug operator +``` diff --git a/content/docs/v2024.12.18/guides/troubleshooting/permission-denided/index.md b/content/docs/v2024.12.18/guides/troubleshooting/permission-denided/index.md new file mode 100644 index 0000000000..1ad76f5f16 --- /dev/null +++ b/content/docs/v2024.12.18/guides/troubleshooting/permission-denided/index.md @@ -0,0 +1,332 @@ +--- +title: Permission denied | Stash +description: Troubleshooting "Permission denied" issue +menu: + docs_v2024.12.18: + identifier: troubleshooting-permission-denied + name: Permission denied + parent: troubleshooting + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Troubleshooting `"permission denied"` issue + +Sometimes the backup or restore fails due to permission issues. This can happen for various reasons. In this guide, we are going to explain the known scenarios when this issue can arise and what you can do to solve it. + +## Identifying the issue + +If you describe the respective `BackupSession` / `RestoreSession` or view the log from the respective backup/restore sidecar/job, you should see a message pointing to the `permission denied` error. + +## Possible reasons + +The issue can happen during both backup and restore. Here, are a few possible scenarios when you can face the issue. + +### During Backup + +You may see the permission issue during backup in the following cases. + +#### Using Local Backend + +If you are using local volumes such as `NFS`, `hostPath`, `PVC` etc. as your backend, you may face this issue. + +### Using InterimVolume during backup + +If you are using an addon that needs `interimVolume` for storing the data temporarily during backup (i.e. Elasticsearch addon), you may face this issue. + +### During Restore + +You may see the permission issue during the restore process in the following scenarios. + +### Backup was taken as a particular user + +By default, Stash runs the backup as user `nobody`. However, you may need to run the backup as a particular (i.e. `root` user) user in various scenarios. In this case, if the user id of the restore process does not match with the user id that was used during backup, the restore process will fail to read data from the backend repository. + +### Using InterimVolume during restore + +If you are using an addon that needs `interimVolume` for storing the data temporarily during restore (i.e. Elasticsearch addon), you may face this issue. + +## Solutions + +Here, are a few actions you can take to solve the issue in the scenarios mentioned above. + +### For local volume as backend + +If you are facing the issue while using local volume as a backend, you can take any of the following actions to solve the issue. + +#### Run the backup/restore as `root` user + +You can run the backup process as `root` by adding `runtimeSettings.container.securityContext` in the `BackupConfiguration` or `RestoreSession` spec. + +Here, is an example of running backup as `root` user: + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: ss-backup + namespace: demo +spec: + repository: + name: local-repo + schedule: "*/3 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: StatefulSet + name: stash-demo + volumeMounts: + - name: data-volume + mountPath: /my/data + paths: + - /my/data + runtimeSettings: + container: + securityContext: + runAsUser: 0 + runAsGroup: 0 + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Here, is an example of running restores as `root` user: + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-mongodb-restore + namespace: kubedb +spec: + repository: + name: local-repo-with-hostpath + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: restored-mongodb + runtimeSettings: + container: + securityContext: + runAsUser: 0 + runAsGroup: 0 + rules: + - snapshots: [latest] +``` + +#### Provide `fsGroup` during backup/restore + +If you don't want to run the backup/restore as `root` user, you can provide `fsGroup` of Stash default user `65534` in `runtimeSettings.pod.securityContext` section. + +Here, is an example of setting `fsGroup`: + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-mongodb-backup + namespace: kubedb +spec: + schedule: "*/5 * * * *" + repository: + name: local-repo-with-pvc + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-mongodb + runtimeSettings: + pod: + securityContext: + fsGroup: 65534 + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +> If you are taking backup of workload (i.e. StatefulSet, Deployment, etc.) volumes, you have to provide the `fsGroup` in your workload spec instead of `BackupConfiguration` / `RestoreSession`. + +#### Give read, write permissions to all users + +You can also use `chmod` to give read, write permissions to all users for the directory you are using as backend. + +### For using InterimVolume + +If you are facing the issue because of using `interimVolume` in your backup/restore process, you can either run the backup/restore process as `root` user or you can provide the storage access permission to Stash using `fsGroup`. + +Here, is an example of running backup as `root` user: + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-elasticsearch-backup + namespace: demo +spec: + schedule: "*/5 * * * *" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-elasticsearch + interimVolumeTemplate: + metadata: + name: stash-tmp-backup-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + runtimeSettings: + pod: + securityContext: + runAsUser: 0 + runAsGroup: 0 + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +Here, is an example of using `fsGroup`: + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-elasticsearch-backup + namespace: demo +spec: + schedule: "*/2 * * * *" + repository: + name: gcs-repo + target: + ref: + apiVersion: appcatalog.appscode.com/v1alpha1 + kind: AppBinding + name: sample-elasticsearch + interimVolumeTemplate: + metadata: + name: stash-tmp-backup-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + runtimeSettings: + pod: + securityContext: + fsGroup: 65534 + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +### For user id mismatch during restore + +If your restore fails because it does not have the necessary permission to read backed up data from the repository, you have to run the restore process as the same user as the backup process or `root` user using the `runtimeSettings.container.securityContext` section. + +Here, is an example of running restore as a particular user: + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-statefulset-restore + namespace: demo +spec: + repository: + name: gcs-repo + target: + ref: + apiVersion: apps/v1 + kind: StatefulSet + name: stash-recovered + volumeMounts: + - name: source-data + mountPath: /source/data + rules: + - paths: + - /source/data + runtimeSettings: + container: + securityContext: + runAsUser: 2000 + runAsGroup: 2000 +``` diff --git a/content/docs/v2024.12.18/guides/troubleshooting/repo-locked/images/repo_lock.png b/content/docs/v2024.12.18/guides/troubleshooting/repo-locked/images/repo_lock.png new file mode 100644 index 0000000000..8140bec7a9 Binary files /dev/null and b/content/docs/v2024.12.18/guides/troubleshooting/repo-locked/images/repo_lock.png differ diff --git a/content/docs/v2024.12.18/guides/troubleshooting/repo-locked/index.md b/content/docs/v2024.12.18/guides/troubleshooting/repo-locked/index.md new file mode 100644 index 0000000000..2553aaba3c --- /dev/null +++ b/content/docs/v2024.12.18/guides/troubleshooting/repo-locked/index.md @@ -0,0 +1,146 @@ +--- +title: Repository Locked | Stash +description: Troubleshooting "repository is already locked" issue +menu: + docs_v2024.12.18: + identifier: troubleshooting-repo-locked + name: Repository Locked + parent: troubleshooting + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Troubleshooting `"repository is already locked "` issue + +Sometimes, the backend repository gets locked and the subsequent backup fails. In this guide, we are going to explain why this can happen and what you can do to solve the issue. + +## Identifying the issue + +If the repository gets locked, the new backup will fail. If you describe the `BackupSession`, you should see an error message indicating that the repository is already locked by another process. + +```bash +kubectl describe -n backupsession +``` + +You will also see the error message in the backup sidecar/job log. + +```bash +# For backup that uses sidecar (i.e. Deployment, StatefulSet etc.) +kubectl logs -n -c stash + +# For backup that uses job (i.e. Database, PVC, etc.) +kubectl logs -n --all-containers +``` + +## Possible reasons + +A restic process that modifies the repository, creates a lock at the beginning of its operation. When it completes the operation, it removes the lock so that other restic processes can use the repository. Now, if the process is killed unexpectedly, it can not remove the lock. As a result, the repository remains locked and becomes unusable for other processes. + +### Possible scenarios when a repository can get locked + +The repository can get locked in the following scenarios. + +#### 1. The backup job/pod containing the sidecar has been terminated. + +If the workload pod that has the `stash` sidecar or backup job's pod gets terminated while a backup is running, the repository can get locked. In this case, you have to find out why the pod was terminated. + +#### 2. The temp-dir is set too low + +Stash uses an `emptyDir` as a temporary volume where it stores cache for improving backup performance. By default, the `emptyDir` does not have any size limit. However, if you set the limit manually using `spec.tempDir` section of `BackupConfiguration` make sure you have set it to a reasonable size based on your targeted data size. If the `tempDir` limit is too low, cache size may cross the limit resulting in the backup pod getting evicted by Kubernetes. This is a tricky case because you may not notice that the backup pod has been evicted. You can describe the respective workload/job to check if it was the case. + +In such a scenario, make sure that you have set the `tempDir` size to a reasonable amount. You can also disable caching by setting `spec.tempDir.disableCaching: true`. However, this might impact the backup performance significantly. + +## Solutions + +If your repository gets locked, you have to unlock it manually. You can use one of the following methods. + +### Use Stash kubectl plugin + +At first, install the Stash `kubectl` plugin by following the instruction [here](https://stash.run/docs/{{< param "info.version" >}}/setup/install/kubectl-plugin/). + +Then, run the following command to unlock the repository: + +```bash +kubectl stash unlock --namespace= +``` + +### Delete the locks folder from the backend + +If you are using a cloud bucket that provides a UI to browse the storage, you can go to the repository directory and delete the `locks` folder. + +
+ Locks in the backend repository +
Fig: Locks in the backend repository
+
+ +## Further Action + +Once you have found the issue of why the repository got locked in the first place, take the necessary measure to prevent it from occurring in the future. diff --git a/content/docs/v2024.12.18/guides/troubleshooting/source-data-read-failed/index.md b/content/docs/v2024.12.18/guides/troubleshooting/source-data-read-failed/index.md new file mode 100644 index 0000000000..fea0b7826c --- /dev/null +++ b/content/docs/v2024.12.18/guides/troubleshooting/source-data-read-failed/index.md @@ -0,0 +1,134 @@ +--- +title: Source data read failed | Stash +description: Troubleshooting "failed to read all source data" issue +menu: + docs_v2024.12.18: + identifier: troubleshooting-source-data-read-failed + name: Source data read failed + parent: troubleshooting + weight: 30 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Troubleshooting `"failed to read all source data"` issue + +Sometimes, the backup fails due to Stash being unable to read the targeted data. In this guide, we are going to explain the possible scenario when this error can happen and what you can do to solve the issue. + +## Identifying the issue + +If you describe the respective `BackupSession` or view the log from the respective backup sidecar/job, you should see the following error: + +```bash +Warning: failed to read all source data during backup +``` + +## Possible reason + +By default, Stash runs backup as a non-root user. If the target data directory is not readable to all users, then Stash will fail to read the targeted data. + +## Solution + +Run the backup process as the same user as the targeted application or run the backup process as the root user. + +Here is an example of `BackupConfiguration` for running backup as the root user: + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: sample-statefulset-backup + namespace: demo +spec: + repository: + name: s3-repo + schedule: "*/3 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: StatefulSet + name: stash-demo + volumeMounts: + - name: data-volume + mountPath: /my/data + paths: + - /my/data + runtimeSettings: + container: + securityContext: + runAsUser: 0 + runAsGroup: 0 + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +If you don't want to run the backup as root user, then set the `runAsUser` and `runAsGroup` to match with your application user and group id. diff --git a/content/docs/v2024.12.18/guides/use-cases/_index.md b/content/docs/v2024.12.18/guides/use-cases/_index.md new file mode 100644 index 0000000000..9002820e02 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/_index.md @@ -0,0 +1,77 @@ +--- +title: Different Use Cases | Stash +menu: + docs_v2024.12.18: + identifier: use-cases + name: Different Use Cases + parent: guides + weight: 80 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/guides/use-cases/clone-pvc/examples/deployment/dep-backupconfiguration.yaml b/content/docs/v2024.12.18/guides/use-cases/clone-pvc/examples/deployment/dep-backupconfiguration.yaml new file mode 100644 index 0000000000..55fcc0f1cd --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/clone-pvc/examples/deployment/dep-backupconfiguration.yaml @@ -0,0 +1,26 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "* * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + - name: source-config + mountPath: /source/config + paths: + - /source/data + - /source/config + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/guides/use-cases/clone-pvc/examples/deployment/deployment.yaml b/content/docs/v2024.12.18/guides/use-cases/clone-pvc/examples/deployment/deployment.yaml new file mode 100644 index 0000000000..1b47a97bee --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/clone-pvc/examples/deployment/deployment.yaml @@ -0,0 +1,63 @@ +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: source-data + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: standard + resources: + requests: + storage: 2Gi +--- +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: source-config + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: standard + resources: + requests: + storage: 2Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-demo + name: stash-demo + namespace: demo +spec: + replicas: 1 + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - args: ["echo sample_data > /source/data/data.txt; echo config_data > /source/config/config.cfg && sleep 3000"] + command: ["/bin/sh", "-c"] + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + - mountPath: /source/config + name: source-config + restartPolicy: Always + volumes: + - name: source-data + persistentVolumeClaim: + claimName: source-data + - name: source-config + persistentVolumeClaim: + claimName: source-config diff --git a/content/docs/v2024.12.18/guides/use-cases/clone-pvc/examples/deployment/restore-deployment.yaml b/content/docs/v2024.12.18/guides/use-cases/clone-pvc/examples/deployment/restore-deployment.yaml new file mode 100644 index 0000000000..72af01085c --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/clone-pvc/examples/deployment/restore-deployment.yaml @@ -0,0 +1,38 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: restore-demo + name: restore-demo + namespace: demo +spec: + replicas: 1 + selector: + matchLabels: + app: restore-demo + template: + metadata: + labels: + app: restore-demo + name: busybox + spec: + containers: + - args: + - sleep + - "3600" + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /restore/data + name: restore-data + - mountPath: /restore/config + name: restore-config + restartPolicy: Always + volumes: + - name: restore-data + persistentVolumeClaim: + claimName: restore-data + - name: restore-config + persistentVolumeClaim: + claimName: restore-config diff --git a/content/docs/v2024.12.18/guides/use-cases/clone-pvc/examples/deployment/restoresession.yaml b/content/docs/v2024.12.18/guides/use-cases/clone-pvc/examples/deployment/restoresession.yaml new file mode 100644 index 0000000000..1632f23443 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/clone-pvc/examples/deployment/restoresession.yaml @@ -0,0 +1,35 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: restore-deployment + namespace: demo +spec: + repository: + name: gcs-repo + target: + rules: + - paths: + - /source/data + - /source/config + volumeMounts: + - name: restore-data + mountPath: /source/data + - name: restore-config + mountPath: /source/config + volumeClaimTemplates: + - metadata: + name: restore-data + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 2Gi + - metadata: + name: restore-config + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 2Gi diff --git a/content/docs/v2024.12.18/guides/use-cases/clone-pvc/examples/repository.yaml b/content/docs/v2024.12.18/guides/use-cases/clone-pvc/examples/repository.yaml new file mode 100644 index 0000000000..a0f1c42ec4 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/clone-pvc/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: /source/data/restore-pvc-in-temp + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/guides/use-cases/clone-pvc/examples/statefulset/restore-statefulset.yaml b/content/docs/v2024.12.18/guides/use-cases/clone-pvc/examples/statefulset/restore-statefulset.yaml new file mode 100644 index 0000000000..b22f8b840a --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/clone-pvc/examples/statefulset/restore-statefulset.yaml @@ -0,0 +1,64 @@ +apiVersion: v1 +kind: Service +metadata: + name: re-headless + namespace: demo +spec: + ports: + - name: http + port: 80 + targetPort: 0 + selector: + app: restore-demo + clusterIP: None +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: restore-demo + namespace: demo + labels: + app: restore-demo +spec: + replicas: 3 + selector: + matchLabels: + app: restore-demo + serviceName: re-headless + template: + metadata: + labels: + app: restore-demo + spec: + containers: + - command: + - sleep + - '3600' + name: busybox + image: busybox + ports: + - containerPort: 80 + name: http + volumeMounts: + - name: restore-data + mountPath: "/restore/data" + - name: restore-config + mountPath: "/restore/config" + imagePullPolicy: IfNotPresent + volumeClaimTemplates: + - metadata: + name: restore-data + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 2Gi + - metadata: + name: restore-config + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 2Gi diff --git a/content/docs/v2024.12.18/guides/use-cases/clone-pvc/examples/statefulset/restoresession.yaml b/content/docs/v2024.12.18/guides/use-cases/clone-pvc/examples/statefulset/restoresession.yaml new file mode 100644 index 0000000000..69a9f36d3b --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/clone-pvc/examples/statefulset/restoresession.yaml @@ -0,0 +1,36 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: restore-statefulset + namespace: demo +spec: + repository: + name: gcs-repo + target: + rules: + - paths: + - /source/data + - /source/config + replicas: 3 + volumeMounts: + - name: restore-data-restore-demo + mountPath: /source/data + - name: restore-config-restore-demo + mountPath: /source/config + volumeClaimTemplates: + - metadata: + name: restore-data-restore-demo-${POD_ORDINAL} + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 2Gi + - metadata: + name: restore-config-restore-demo-${POD_ORDINAL} + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 2Gi diff --git a/content/docs/v2024.12.18/guides/use-cases/clone-pvc/examples/statefulset/ss-backupconfiguration.yaml b/content/docs/v2024.12.18/guides/use-cases/clone-pvc/examples/statefulset/ss-backupconfiguration.yaml new file mode 100644 index 0000000000..49f10743c6 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/clone-pvc/examples/statefulset/ss-backupconfiguration.yaml @@ -0,0 +1,26 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: ss-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/3 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: StatefulSet + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + - name: source-config + mountPath: /source/config + paths: + - /source/data + - /source/config + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/guides/use-cases/clone-pvc/examples/statefulset/statefulset.yaml b/content/docs/v2024.12.18/guides/use-cases/clone-pvc/examples/statefulset/statefulset.yaml new file mode 100644 index 0000000000..f7e3bc849b --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/clone-pvc/examples/statefulset/statefulset.yaml @@ -0,0 +1,68 @@ +apiVersion: v1 +kind: Service +metadata: + name: headless + namespace: demo +spec: + ports: + - name: http + port: 80 + targetPort: 0 + selector: + app: stash-demo + clusterIP: None +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: stash-demo + namespace: demo + labels: + app: stash-demo +spec: + replicas: 3 + selector: + matchLabels: + app: stash-demo + serviceName: headless + template: + metadata: + labels: + app: stash-demo + spec: + containers: + - args: ["echo $(POD_NAME) > /source/data/data.txt; echo $(POD_NAME) > /source/config/config.cfg && sleep 3000"] + command: ["/bin/sh", "-c"] + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + name: busybox + image: busybox + ports: + - containerPort: 80 + name: http + volumeMounts: + - name: source-data + mountPath: "/source/data" + - name: source-config + mountPath: "/source/config" + imagePullPolicy: IfNotPresent + volumeClaimTemplates: + - metadata: + name: source-data + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 2Gi + - metadata: + name: source-config + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 2Gi diff --git a/content/docs/v2024.12.18/guides/use-cases/clone-pvc/index.md b/content/docs/v2024.12.18/guides/use-cases/clone-pvc/index.md new file mode 100644 index 0000000000..80d4d8493e --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/clone-pvc/index.md @@ -0,0 +1,975 @@ +--- +title: Clone Data Volumes | Stash +description: An step by step guide on how to clone data volumes using Stash. +menu: + docs_v2024.12.18: + identifier: use-cases-clone-pvc + name: Clone Data Volumes + parent: use-cases + weight: 30 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Clone Data Volumes using Stash + +Using Stash you can clone data volumes of a workload into a different namespace in a cluster. You can provide a template for PVC in `RestoreSession`. Stash will create PVCs according to the template, then it will restore data in that PVC. Then you can use the cloned PVCs to deploy your desired workload. This guide will show you how to clone backed up data into new PVCs using Stash. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). + +- Install `Stash` in your cluster following the steps [here](/docs/v2024.12.18/setup/README). + +- You should be familiar with the following `Stash` concepts: + - [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) + - [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) + - [Repository](/docs/v2024.12.18/concepts/crds/repository/) + - [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> **Note:** YAML files used in this tutorial are stored in [/docs/guides/use-cases/clone-pvc/examples](https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/clone-pvc/examples/) directory of [stashed/docs](https://github.com/stashed/docs) repository. + +## Clone the Volumes of a Deployment + +Here we are going to clone the volumes of a Deployment. At first, we are going to back up the volumes of a Deployment, then we are going to restore these volumes into new PVCs. + +### Backup + +We are going to deploy a Deployment with two PVCs and generate some sample data in it. Then, we are going to back up these PVCs. + +**Deploy Deployment:** + +Below is the YAML of the Deployment and PVCs that we are going to create, + +```yaml +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: source-data + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: standard + resources: + requests: + storage: 2Gi +--- +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: source-config + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: standard + resources: + requests: + storage: 2Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-demo + name: stash-demo + namespace: demo +spec: + replicas: 1 + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - args: ["echo sample_data > /source/data/data.txt; echo config_data > /source/config/config.cfg && sleep 3000"] + command: ["/bin/sh", "-c"] + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + - mountPath: /source/config + name: source-config + restartPolicy: Always + volumes: + - name: source-data + persistentVolumeClaim: + claimName: source-data + - name: source-config + persistentVolumeClaim: + claimName: source-config +``` + +The above Deployment will automatically create `data.txt` and `config.cfg` file in `/source/data` and `/source/config` directory respectively and write some sample data in it. + +Let's create the Deployment and PVCs we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/clone-pvc/examples/deployment/deployment.yaml +persistentvolumeclaim/source-data created +persistentvolumeclaim/source-config created +deployment.apps/stash-demo created +``` + +Now, wait for the pod of the Deployment to go into `Running` state. + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-demo-67ccdfbbc7-z97rd 1/1 Running 0 77s +``` + +Verify that the sample data has been created in `/source/data` and `/source/config` directory using the following commands, + +```bash +$ kubectl exec -n demo stash-demo-67ccdfbbc7-z97rd -- cat /source/data/data.txt +sample_data +$ kubectl exec -n demo stash-demo-67ccdfbbc7-z97rd -- cat /source/config/config.cfg +config_data +``` + +**Create Repository:** + +We are going to store our backed up data into a GCS bucket. We have to create a Secret and a Repository object with access credentials and backend information respectively. + +> For GCS backend, if the bucket does not exist, Stash needs `Storage Object Admin` role permissions to create the bucket. For more details, please check the following [guide](/docs/v2024.12.18/guides/backends/gcs/). + +Let's create a secret called `gcs-secret` with access credentials of our desired GCS backend, + + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat /path/to/downloaded/sa_key_file.json > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +Now, create a `Repository` using this secret. Below is the YAML of `Repository` crd we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: /source/data/restore-pvc-in-temp + storageSecretName: gcs-secret +``` + +Let's create the `Repository` object that we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/clone-pvc/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our volumes to our desired backend. + +**Create BackupConfiguration:** + +Now, create a `BackupConfiguration` crd to take periodic backup of the PVCs of `stash-demo` Deployment. + +Below is the YAML of the `BackupConfiguration` object that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "* * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + - name: source-config + mountPath: /source/config + paths: + - /source/data + - /source/config + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Let's create the `BackupConfiguration` object that we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/clone-pvc/examples/deployment/dep-backupconfiguration.yaml +backupconfiguration.stash.appscode.com/deployment-backup created +``` + +If everything goes well, Stash will create a `CronJob` to trigger backup periodically. + +**Verify CronJob:** + +Verify that Stash has created a `CronJob` to trigger a periodic backup of volumes of the Deployment by the following command, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED AGE +deployment-backup * * * * * 36s +``` + +**Wait for BackupSession:** + +Now, wait for the next backup schedule. You can watch for `BackupSession` crd using the following command, + +```bash +$ watch -n 3 kubectl get backupconfiguration -n demo +Every 3.0s: kubectl get backupconfiguration -n demo suaas-appscode: Mon Jul 8 18:20:47 2019 + +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +deployment-backup-1562588351 BackupConfiguration deployment-backup Succeeded 96s +``` + +We can see from the above output that the backup session has succeeded. This indicates that the volumes of the Deployment have been backed up in the backend successfully. + +### Restore + +Now, we are going to clone the volumes that we have backed up in the previous section. To do that, we have to create a `RestoreSession` object with `volumeClaimTemplates`. + +**Stop Taking Backup of the Old Deployment:** + +At first, let's pause the scheduled backup of the old Deployment so that no backup is taken during the restore process. To pause the `deployment-backup` BackupConfiguration, run: + +```bash +$ kubectl patch backupconfiguration -n demo deployment-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/deployment-backup patched +``` + +Now, wait for a moment. Stash will pause the BackupConfiguration. Verify that the BackupConfiguration has been paused, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED AGE +deployment-backup */1 * * * * true 26m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the BackupConfiguration has been paused. + +**Create RestoreSession:** + +Below is the YAML of the `RestoreSession` object that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: restore-deployment + namespace: demo +spec: + repository: + name: gcs-repo + target: + rules: + - paths: + - /source/data + - /source/config + volumeMounts: + - name: restore-data + mountPath: /source/data + - name: restore-config + mountPath: /source/config + volumeClaimTemplates: + - metadata: + name: restore-data + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 2Gi + - metadata: + name: restore-config + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 2Gi +``` + +Here, + +- `spec.target.volumeMounts` specifies the directory where the newly created PVC will be mounted inside the restore job. +- `spec.target.rules[*].paths` specifies the file paths that will be restored from the backed up data. +- `spec.target.volumeClaimTemplates:` a list of PVC templates that will be created by Stash to restore the respective backed up data. + - `name` specifies the name of the volume mountPath. This name must be the same as the volumeClaimTemplate name. + - `mountPath` must be same `mountPath` as the original volume because Stash stores absolute path of the backed up files. If you use different `mountPath` for the restored volume the backed up files will not be restored into your desired volume. + +Let's create the `RestoreSession` object that we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/clone-pvc/examples/deployment/restoresession.yaml +restoresession.stash.appscode.com/restore-deployment created +``` + +**Wait for RestoreSession to Succeed:** + +Once, you have created the `RestoreSession` crd, Stash will create a job to restore PVCs. We can watch the `RestoreSession` phase to check if the restore process has succeeded or not. + +Run the following command to watch RestoreSession phase, + +```bash +$ watch -n 3 kubectl get restoresession -n demo +Every 3.0s: kubectl get restoresession -n demo suaas-appscode: Mon Jul 8 18:39:58 2019 + +NAME REPOSITORY-NAME PHASE AGE +restore-deployment gcs-repo Succeeded 3m27s +``` + +So, we can see from the output of the above command that the restore process has completed successfully. + +**Verify Restored PVC:** + +Once the restore process is complete, we are going to see that new PVCs with the name `restore-data` and `restore-config` have been created. + +Verify that the PVCs have been created by the following command, + +```bash +$ kubectl get pvc -n demo +NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE +restore-config Bound pvc-6aab94dc-10b2-4c36-8768-89b20a7a24ed 2Gi RWO standard 32s +restore-data Bound pvc-8296da99-b813-466a-b9f2-efff1faeee17 2Gi RWO standard 32s +``` + +**Verify Restored Data:** + +Let's create a new Deployment with the restored PVCs to verify whether the backed up data have been restored. + +Below is the YAML of the Deployment that we are going to create, + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: restore-demo + name: restore-demo + namespace: demo +spec: + replicas: 1 + selector: + matchLabels: + app: restore-demo + template: + metadata: + labels: + app: restore-demo + name: busybox + spec: + containers: + - args: + - sleep + - "3600" + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /restore/data + name: restore-data + - mountPath: /restore/config + name: restore-config + restartPolicy: Always + volumes: + - name: restore-data + persistentVolumeClaim: + claimName: restore-data + - name: restore-config + persistentVolumeClaim: + claimName: restore-config +``` + +Create the deployment we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/clone-pvc/examples/deployment/restore-deployment.yaml +deployment.apps/restore-demo created +``` + +Now, wait for the pod of the Deployment to go into the `Running` state. + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +restore-demo-85fbcb5dcf-vpbt8 1/1 Running 0 2m50s +``` + +Verify that the backed up data has been restored in `/source/data` and `/source/config` directory using the following command, + +```bash +$ kubectl exec -n demo restore-demo-85fbcb5dcf-vpbt8 -- cat /restore/data/data.txt +sample_data +$ kubectl exec -n demo restore-demo-85fbcb5dcf-vpbt8 -- cat /restore/config/config.cfg +config_data +``` + +## Clone the Volumes of a SatefulSet + +Here we are going to clone the volumes of a StatefulSet. At first, we are going to back up the volumes of a StatefulSet, then we are going to restore these volumes into new PVCs. + +### Backup + +Now, we are going to deploy a StatefulSet and generate some sample data in its volume. Then, we are going to back up these volumes. + +**Deploy StatefulSet:** + +Below is the YAML of the Statefulset that we are going to create, + +```yaml +apiVersion: v1 +kind: Service +metadata: + name: headless + namespace: demo +spec: + ports: + - name: http + port: 80 + targetPort: 0 + selector: + app: stash-demo + clusterIP: None +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: stash-demo + namespace: demo + labels: + app: stash-demo +spec: + replicas: 3 + selector: + matchLabels: + app: stash-demo + serviceName: headless + template: + metadata: + labels: + app: stash-demo + spec: + containers: + - args: ["echo $(POD_NAME) > /source/data/data.txt; echo $(POD_NAME) > /source/config/config.cfg && sleep 3000"] + command: ["/bin/sh", "-c"] + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + name: busybox + image: busybox + ports: + - containerPort: 80 + name: http + volumeMounts: + - name: source-data + mountPath: "/source/data" + - name: source-config + mountPath: "/source/config" + imagePullPolicy: IfNotPresent + volumeClaimTemplates: + - metadata: + name: source-data + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 2Gi + - metadata: + name: source-config + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 2Gi +``` + +The above StatefulSet will automatically create `data.txt` and `config.cfg` file in `/source/data` and `/source/config` directory respectively and write some sample data in it. + +Let's create the Statefulset we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/clone-pvc/examples/statefulset/statefulset.yaml +service/headless configured +statefulset.apps/stash-demo created +``` + +Now, wait for the pod of the Statefulset to go into the `Running` state. + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-demo-0 1/1 Running 0 47s +stash-demo-1 1/1 Running 0 43s +stash-demo-2 1/1 Running 0 33s +``` + +Verify that the sample data has been created in `/source/data` and `/source/config` directory using the following command, + +```bash +$ kubectl exec -n demo stash-demo-0 -- cat /source/data/data.txt +stash-demo-0 +$ kubectl exec -n demo stash-demo-0 -- cat /source/config/config.cfg +stash-demo-0 +$ kubectl exec -n demo stash-demo-1 -- cat /source/data/data.txt +stash-demo-1 +$ kubectl exec -n demo stash-demo-1 -- cat /source/config/config.cfg +stash-demo-1 +$ kubectl exec -n demo stash-demo-2 -- cat /source/data/data.txt +stash-demo-2 +$ kubectl exec -n demo stash-demo-2 -- cat /source/config/config.cfg +stash-demo-2 +``` + +**Create Repository:** + +We are going to store our backed up data into a GCS bucket. Let’s create a secret called `gcs-secret` with access credentials of our desired GCS backend, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat /path/to/downloaded/sa_key_file.json > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +Now, create a `Repository` using this secret. Below is the YAML of `Repository` crd we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: /source/data/restore-pvc-in-temp + storageSecretName: gcs-secret +``` + +Let’s create the Repository object that we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/clone-pvc/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our volumes to our desired backend. + +**Create BackupConfiguration:** + +Now, create a `BackupConfiguration` crd to take periodic backup of the PVCs of `stash-demo` Statefulset. + +Below is the YAML of the `BackupConfiguration` that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: ss-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/3 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: StatefulSet + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + - name: source-config + mountPath: /source/config + paths: + - /source/data + - /source/config + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Let’s create the `BackupConfiguration` object that we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/clone-pvc/examples/statefulset/ss-backupconfiguration.yaml +backupconfiguration.stash.appscode.com/ss-backup created +``` + +If everything goes well, Stash will create a `CronJob` to trigger backup periodically. + +**Verify CronJob:** + +Verify that Stash has created a `CronJob` to trigger a periodic backup of the volumes of the Statefulset by the following command, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED AGE +ss-backup * * * * * 2m +``` + +**Wait for BackupSession:** + +Now, wait for the next backup schedule. You can watch for `BackupSession` crd using the following command, + +```bash +$ watch -n 3 kubectl get backupsession -n demo +Every 3.0s: kubectl get backupsession -n demo suaas-appscode: Tue Jul 9 17:09:43 2019 + +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +ss-backup-1562670004 BackupConfiguration ss-backup Succeeded 9m39s +``` + +We can see from the above output that the backup session has succeeded. This indicates that the volumes of the Deployment have been backed up in the backend successfully. + +### Restore + +Now, we are going to restore the volumes that we have backed up in the previous section. To do that, we have to create a `RestoreSession` object with `volumeClaimTemplates`. + +**Stop Taking Backup of the Old StatefulSet:** + +At first, let's pause the scheduled backup of the old StatefulSet so that no backup is taken during the restore process. To pause the `ss-backup` BackupConfiguration, run: + +```bash +$ kubectl patch backupconfiguration -n demo ss-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/ss-backup patched +``` + +Now, wait for a moment. Stash will pause the BackupConfiguration. Verify that the BackupConfiguration has been paused, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED AGE +ss-backup */1 * * * * true 26m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the `BackupConfiguration` has been paused. + +**Create RestoreSession:** + +Below is the YAML of the `RestoreSession` object that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: restore-statefulset + namespace: demo +spec: + repository: + name: gcs-repo + target: + rules: + - paths: + - /source/data + - /source/config + replicas: 3 + volumeMounts: + - name: restore-data-restore-demo + mountPath: /source/data + - name: restore-config-restore-demo + mountPath: /source/config + volumeClaimTemplates: + - metadata: + name: restore-data-restore-demo-${POD_ORDINAL} + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 2Gi + - metadata: + name: restore-config-restore-demo-${POD_ORDINAL} + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 2Gi +``` + +- `spec.target.replicas` `spec.target.replicas` specify the number of replicas of a StatefulSet whose volumes were backed up and Stash uses this field to dynamically create the desired number of PVCs and initialize them from respective Volumes. +- `spec.target.volumeMounts` specifies a list of volumes and their mountPath where the data will be restored. + - `name` specifies the name of the volume mountPath. This name must be the same as the volumeClaimTemplate name without the `POD_ORDINAL` part. + - `mountPath` must be same `mountPath` as the original volume because Stash stores absolute path of the backed up files. If you use different `mountPath` for the restored volume the backed up files will not be restored into your desired volume. +- `spec.target.volumeClaimTemplates:` a list of PVC templates that will be created by Stash to restore the respective backed up data. + - `metadata.name` is a template for the name of the restored PVC that will be created by Stash. You have to provide this named template to match with your desired StatefulSet's PVC. For example, if you want to deploy a StatefulSet named `stash-demo` with `volumeClaimTemplate` name `my-volume`, your StatefulSet's PVC will be`my-volume-stash-demo-0`, `my-volume-stash-demo-1` and so on. In this case, you have to provide `volumeClaimTemplate` name in RestoreSession in the following format: + + ```bash + --${POD_ORDINAL} + ``` + + So for the above example, `volumeClaimTemplate` name for `RestoreSession` will be `my-volume-restore-demo-${POD_ORDINAL}`. + The `${POD_ORDINAL}` variable is resolved by Stash. + +Let’s create the `RestoreSession` object that we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/clone-pvc/examples/statefulset/restoresession.yaml +restoresession.stash.appscode.com/restore-statefulset created +``` + +**Wait for RestoreSession to Succeed:** + +Once, you have created the `RestoreSession` crd, Stash will create a job to restore. We can watch the `RestoreSession` phase to check if the restore process has succeeded or not. + +Run the following command to watch `RestoreSession` phase, + +```bash +$ watch -n 3 kubectl get restoresession -n demo +Every 3.0s: kubectl get restoresession -n demo suaas-appscode: Tue Jul 9 18:14:44 2019 + +NAME REPOSITORY-NAME PHASE AGE +restore-statefulset gcs-repo Succeeded 2m2s +``` + +So, we can see from the output of the above command that the restore process succeeded. + +**Verify Restored PVC:** + +Once the restore process is complete, verify that new PVCs have been created successfully by the following command, + +```bash +$ kubectl get pvc -n demo +NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE +restore-config-restore-demo-0 Bound pvc-c575f88a-79c9-4d25-9aab-5f9822ced239 2Gi RWO standard 19s +restore-config-restore-demo-1 Bound pvc-09d8e1dc-9b51-4a74-983e-8ef2ecde88b5 2Gi RWO standard 19s +restore-config-restore-demo-2 Bound pvc-45fe4050-12dc-46cb-a797-63f8ea420e28 2Gi RWO standard 19s +restore-data-restore-demo-0 Bound pvc-d27485e6-5377-4009-b2e2-9ddc2f9afaf3 2Gi RWO standard 19s +restore-data-restore-demo-1 Bound pvc-ae605285-ef6c-4b02-958c-d34352972ff0 2Gi RWO standard 19s +restore-data-restore-demo-2 Bound pvc-bd087508-9d9c-4ee0-955f-4cd822ab85f7 2Gi RWO standard 19s +``` + +**Verify Restored Data:** + +Let's create a new Statefulset with the restored PVCs to verify whether the backed up data have been restored. + +Below is the YAML of the StatefulSet that we are going to create, + +```yaml +apiVersion: v1 +kind: Service +metadata: + name: re-headless + namespace: demo +spec: + ports: + - name: http + port: 80 + targetPort: 0 + selector: + app: restore-demo + clusterIP: None +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: restore-demo + namespace: demo + labels: + app: restore-demo +spec: + replicas: 3 + selector: + matchLabels: + app: restore-demo + serviceName: re-headless + template: + metadata: + labels: + app: restore-demo + spec: + containers: + - command: + - sleep + - '3600' + name: busybox + image: busybox + ports: + - containerPort: 80 + name: http + volumeMounts: + - name: restore-data + mountPath: "/restore/data" + - name: restore-config + mountPath: "/restore/config" + imagePullPolicy: IfNotPresent + volumeClaimTemplates: + - metadata: + name: restore-data + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 2Gi + - metadata: + name: restore-config + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 2Gi +``` + +Create the StatefulSet we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/clone-pvc/examples/statefulset/restore-statefulset.yaml +service/re-headless created +statefulset.apps/restore-demo created +``` + +Now, wait for the pod of the StatefulSet to go into the `Running` state. + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +restore-demo-0 1/1 Running 0 34s +restore-demo-1 1/1 Running 0 31s +restore-demo-2 1/1 Running 0 26s +``` + +Verify that the backed up data has been restored in `/restore/data` and `/restore/config` directory using the following command, + +```bash +$ kubectl exec -n demo restore-demo-0 -- cat /restore/data/data.txt +stash-demo-0 +$ kubectl exec -n demo restore-demo-0 -- cat /restore/config/config.cfg +stash-demo-0 +$ kubectl exec -n demo restore-demo-1 -- cat /restore/data/data.txt +stash-demo-1 +$ kubectl exec -n demo restore-demo-1 -- cat /restore/config/config.cfg +stash-demo-1 +$ kubectl exec -n demo restore-demo-2 -- cat /restore/data/data.txt +stash-demo-2 +$ kubectl exec -n demo restore-demo-2 -- cat /restore/config/config.cfg +stash-demo-2 +``` + +## Cleanup + +To clean up the Kubernetes resources created by this tutorial, run: + +```yaml +kubectl delete -n demo deployment stash-demo +kubectl delete -n demo deployment restore-demo +kubectl delete -n demo statefulset stash-demo +kubectl delete -n demo statefulset restore-demo +kubectl delete -n demo backupconfiguration deployment-backup +kubectl delete -n demo backupconfiguration ss-backup +kubectl delete -n demo restoresession restore-deployment +kubectl delete -n demo restoresession restore-statefulset +kubectl delete -n demo repository gcs-repo +kubectl delete -n demo secret gcs-secret +kubectl delete -n demo pvc --all +``` diff --git a/content/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/examples/backupconfiguration_prod.yaml b/content/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/examples/backupconfiguration_prod.yaml new file mode 100644 index 0000000000..5d6fb8ecb7 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/examples/backupconfiguration_prod.yaml @@ -0,0 +1,23 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/examples/deployment_prod.yaml b/content/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/examples/deployment_prod.yaml new file mode 100644 index 0000000000..147eaf289d --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/examples/deployment_prod.yaml @@ -0,0 +1,45 @@ +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: stash-sample-data + namespace: demo +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi +--- + +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-demo + name: stash-demo + namespace: demo +spec: + replicas: 3 + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - args: ["echo sample_data > /source/data/data.txt && sleep 3000"] + command: ["/bin/sh", "-c"] + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + persistentVolumeClaim: + claimName: stash-sample-data \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/examples/deployment_staging.yaml b/content/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/examples/deployment_staging.yaml new file mode 100644 index 0000000000..a023c9a6ba --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/examples/deployment_staging.yaml @@ -0,0 +1,46 @@ +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: stash-sample-data + namespace: demo +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi +--- + +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-recovered + name: stash-recovered + namespace: demo +spec: + replicas: 3 + selector: + matchLabels: + app: stash-recovered + template: + metadata: + labels: + app: stash-recovered + name: busybox + spec: + containers: + - args: + - sleep + - "3600" + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + persistentVolumeClaim: + claimName: demo-pvc \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/examples/pvc_prod.yaml b/content/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/examples/pvc_prod.yaml new file mode 100644 index 0000000000..aab32219a0 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/examples/pvc_prod.yaml @@ -0,0 +1,11 @@ +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: stash-sample-data + namespace: demo +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/examples/pvc_staging.yaml b/content/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/examples/pvc_staging.yaml new file mode 100644 index 0000000000..19f5e5141d --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/examples/pvc_staging.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: demo-pvc + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: standard + resources: + requests: + storage: 1Gi \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/examples/repository_prod.yaml b/content/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/examples/repository_prod.yaml new file mode 100644 index 0000000000..4340e0e05f --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/examples/repository_prod.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /cross-cluster/deployment/sample-deployment + storageSecretName: gcs-secret \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/examples/repository_staging.yaml b/content/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/examples/repository_staging.yaml new file mode 100644 index 0000000000..4340e0e05f --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/examples/repository_staging.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /cross-cluster/deployment/sample-deployment + storageSecretName: gcs-secret \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/examples/restoresession_staging.yaml b/content/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/examples/restoresession_staging.yaml new file mode 100644 index 0000000000..4355686ccb --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/examples/restoresession_staging.yaml @@ -0,0 +1,19 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: deployment-restore + namespace: demo +spec: + repository: + name: gcs-repo + target: # target indicates where the recovered data will be stored + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-recovered + volumeMounts: + - name: source-data + mountPath: /source/data + rules: + - paths: + - /source/data/ \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/index.md b/content/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/index.md new file mode 100644 index 0000000000..e9cca23f60 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/cross-cluster-backup/index.md @@ -0,0 +1,669 @@ +--- +title: Cross-Cluster Backup and Restore | Stash +description: A guide on how to use backup and restore across clusters using Stash. +menu: + docs_v2024.12.18: + identifier: use-cases-cross-cluster-backup + name: Cross-Cluster Backup and Restore + parent: use-cases + weight: 60 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Cross-Cluster Backup and Restore + +This guide will show you how to take backup and restore across clusters using Stash. + +## Before You Begin + +- At first, you need to have running Kubernetes clusters, and the `kubectl` command-line tool must be configured to communicate with your clusters. We will use kind clusters throughout this tutorial. To know more about kind clusters, follow this doc [here](https://kind.sigs.k8s.io/docs/user/quick-start/). + +- You should be familiar with the following `Stash` concepts: + - [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) + - [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) + - [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + - [Repository](/docs/v2024.12.18/concepts/crds/repository/) + +## Backup from `prod` Cluster + +To demonstrate the cross-clusters backup and restore capabilities, we will use the `prod` cluster for taking backup and restoring the backup into the `staging` cluster. + +### Prepare Cluster + +Let's create a cluster named `prod`, + +```bash +$ kind create cluster --name prod +Creating cluster "prod" ... + ✓ Ensuring node image (kindest/node:v1.23.0) 🖼 + ✓ Preparing nodes 📦 + ✓ Writing configuration 📜 + ✓ Starting control-plane 🕹️ + ✓ Installing CNI 🔌 + ✓ Installing StorageClass 💾 +Set kubectl context to "kind-prod" +You can now use your cluster with: + +kubectl cluster-info --context kind-prod + +Have a nice day! 👋 +``` + +To verify your current cluster, + +```bash +$ kubectl config current-context +kind-prod +``` + +if you are currently not in the `prod` cluster, you can switch your cluster by the following command, + +```bash +$ kubectl config use-context kind-prod +Switched to context "kind-prod". +``` + +We are going to create a namespace named `demo` in the `prod` cluster, + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +>**Note:** YAML files used in this tutorial can be found [here](https://github.com/stashed/docs/guides/use-cases/cross-cluster-backup/examples). + +Install `Stash` in your `prod` cluster following the steps [here](/docs/v2024.12.18/setup/README). + +### Deploy Workload + +Let's deploy a Deployment and an associated PVC in the `prod` cluster at the beginning. This Deployment will automatically generate sample data in the `/source/data` directory. + +Below are the YAMLs of the Deployment and PVC that we are going to create, + +```yaml +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: stash-sample-data + namespace: demo +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi +--- + +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-demo + name: stash-demo + namespace: demo +spec: + replicas: 3 + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - args: ["echo sample_data > /source/data/data.txt && sleep 3000"] + command: ["/bin/sh", "-c"] + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + persistentVolumeClaim: + claimName: stash-sample-data +``` + +Let's create the Deployment and PVC we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/cross-cluster-backup/examples/deployment_prod.yaml +persistentvolumeclaim/stash-sample-data created +deployment.apps/stash-demo created +``` + +Now, wait for the pods of the Deployment to go into the `Running` state. You can verify the `Status` of the pods by executing the following command, + +```bash +$ kubectl get pods -n demo +NAME READY STATUS RESTARTS AGE +stash-demo-7678679bcb-2s927 1/1 Running 0 29s +stash-demo-7678679bcb-b849l 1/1 Running 0 29s +stash-demo-7678679bcb-p62vn 1/1 Running 0 29s +``` + +Verify that the sample data has been created in `/source/data` directory using the following command, + +```bash +$ kubectl exec -n demo stash-demo-7678679bcb-2s927 -- cat /source/data/data.txt +sample_data +``` + +### Prepare Backend + +We are going to store our backed-up data into a GCS bucket. We have to create a Secret with the necessary credentials and a Repository CRD to use this backend. + +If you want to use a different backend, please read the respective backend configuration doc [here](/docs/v2024.12.18/guides/backends/overview/). + +> For GCS backend, if the bucket does not exist, Stash needs `Storage Object Admin` role permissions to create the bucket. For more details, please check the following [guide](/docs/v2024.12.18/guides/backends/gcs/). + +**Create Secret:** + +Let's create a secret called `gcs-secret` in `demo` namespace with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat /path/to/downloaded-sa-key.json > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +Now, we are ready to backup our workload's data to our desired backend. + +**Create Repository:** + +Now, create a `Repository` using this secret. Below is the YAML of the `Repository` object we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /cross-cluster/deployment/sample-deployment + storageSecretName: gcs-secret +``` + +Let's create the Repository we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/cross-cluster-backup/examples/repository_prod.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our sample data into this backend. + +### Configure Backup + +We are going to create a `BackupConfiguration` object in the `demo` namespace targeting the `stash-demo` Deployment that we have deployed earlier. This `BackupConfiguration` will refer to the `gcs-repo` repository. Stash will inject a sidecar container into the target. It will also create a `CronJob` to take periodic backup of the `/source/data` directory of the target. + +**Create BackupConfiguration:** + +Below is the YAML of the `BackupConfiguration` crd that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Here, + +- `spec.repository.name` refers to the Repository object that holds backend information. +- `spec.schedule` is a cron expression that indicates BackupSession will be created at 5 minutes intervals. +- `spec.target.ref` refers to the `stash-demo` Deployment. +- `spec.target.volumeMounts` specifies a list of volumes and their mountPath that contain the target paths. +- `spec.target.paths` specifies list of file paths to backup. + +Let's create the `BackupConfiguration` object we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/cross-cluster-backup/examples/backupconfiguration_prod.yaml +backupconfiguration.stash.appscode.com/deployment-backup created +``` + +**Verify BackupConfiguration Ready:** + +If everything goes well, the Phase of the BackupConfiguration should be `Ready`. Let's check the BackupConfiguration phase, + +```bash +❯ kubectl get backupconfiguration -n demo + +NAME TASK SCHEDULE PAUSED PHASE AGE +deployment-backup */5 * * * * Ready 48s +``` + +**Verify CronJob:** + +Stash will also create a `CronJob` with the schedule specified in the `spec.schedule` field of the `BackupConfiguration` crd. + +Verify that the `CronJob` has been created using the following command, + +```bash +$ kubectl get cronjob -n prod +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +stash-trigger-deployment-backup */5 * * * * False 0 28s 2m14s +``` + +### Verify Backup + +The `stash-trigger-deployment-backup` CronJob will trigger a backup on each scheduled slot by creating a `BackupSession` crd. The sidecar container watches for the `BackupSession` object. When it finds one, it will take backup immediately. + +Wait for the next schedule for the backup. Run the following command to watch `BackupSession` crd, + +```bash +$ kubectl get backupsession -n prod -w + +NAME INVOKER-TYPE INVOKER-NAME PHASE DURATION AGE +deployment-backup-1647238200 BackupConfiguration deployment-backup Running 5s +deployment-backup-1647238200 BackupConfiguration deployment-backup Running 16s +deployment-backup-1647238200 BackupConfiguration deployment-backup Running 27s +deployment-backup-1647238200 BackupConfiguration deployment-backup Succeeded 28s 27s +``` + +We can see from the above output that the backup session has succeeded. + +## Restore into `staging` Cluster + +This section will demonstrate restoring the backed-up data into the `staging` cluster. + +**Stop Taking Backup of the Old Deployment:** + +At first, let's stop taking any further backup of the old Deployment so that no backup is taken during the restore process. We are going to pause the `BackupConfiguration` that we created earlier. Then, Stash will stop taking any further backup for this Deployment. You can learn more how to pause a scheduled backup [here](/docs/v2024.12.18/guides/use-cases/pause-backup/) + +Let's pause the `deployment-backup` BackupConfiguration, + +```bash +$ kubectl patch backupconfiguration -n demo deployment-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/deployment-backup patched +``` + +You can also use the Stash kubectl plugin to pause the backup like the following, + +```bash +$ kubectl stash pause backup --backupconfig=deployment-backup -n demo +BackupConfiguration demo/deployment-backup has been paused successfully. +``` + +Verify that the BackupConfiguration has been paused, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +deployment-backup */5 * * * * true Ready 49m +``` + +Notice the `PAUSED` column. Value `true` indicates that the BackupConfiguration has been paused. + +### Prepare Cluster + +Let's create a cluster named `staging`, + +```bash +$ kind create cluster --name staging +Creating cluster "staging" ... + ✓ Ensuring node image (kindest/node:v1.23.0) 🖼 + ✓ Preparing nodes 📦 + ✓ Writing configuration 📜 + ✓ Starting control-plane 🕹️ + ✓ Installing CNI 🔌 + ✓ Installing StorageClass 💾 +Set kubectl context to "kind-staging" +You can now use your cluster with: + +kubectl cluster-info --context kind-staging + +Have a nice day! 👋 +``` + +To verify the current cluster you are working on, + +```bash +$ kubectl config current-context +kind-staging +``` + +If you are currently not in the `staging` cluster, you can switch your cluster by the following command, + +```bash +$ kubectl config use-context kind-staging +Switched to context "kind-staging". +``` + +We are going to create a namespace named `demo` in the `staging` cluster, + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +Install `Stash` in your `staging` cluster following the steps [here](/docs/v2024.12.18/setup/README). + +### Deploy Restore Workload + +We are going to create a new Deployment named `stash-recovered` and a PVC as a storage of the Deployment. We will restore the backed-up data inside it. + +Here is the YAML of the PVC and the Deployment, + +```yaml +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: demo-pvc + namespace: demo +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi +--- + +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-recovered + name: stash-recovered + namespace: demo +spec: + replicas: 3 + selector: + matchLabels: + app: stash-recovered + template: + metadata: + labels: + app: stash-recovered + name: busybox + spec: + containers: + - args: + - sleep + - "3600" + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + persistentVolumeClaim: + claimName: demo-pvc +``` + +Let's create the Deployment we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/cross-cluster-backup/examples/deployment_staging.yaml +persistentvolumeclaim/demo-pvc created +deployment.apps/stash-recovered created +``` + +### Prepare Backend Info + +We have to re-create the Repository CR and the respective Secret that we have used in the `prod` cluster. + +**Create Secret:** + +Let's create a secret called `gcs-secret` in `demo` namespace with access credentials to our GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat /path/to/downloaded-sa-key.json > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create Repository:** + +Now, create a `Repository` using this secret. Below is the YAML of `Repository` crd we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /cross-cluster/deployment/sample-deployment + storageSecretName: gcs-secret +``` + +Let's create the Repository we have shown above, +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/cross-cluster-backup/examples/repository_prod.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to restore our sample data from this specified backend. + +### Configure Restore + +Now, we need to create a `RestoreSession` object targeting the `stash-recovered` Deployment to restore the backed-up data inside it. + +**Create RestoreSession:** + +Below is the YAML of the `RestoreSesion` object that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: deployment-restore + namespace: demo +spec: + repository: + name: gcs-repo + target: # target indicates where the recovered data will be stored + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-recovered + volumeMounts: + - name: source-data + mountPath: /source/data + rules: + - paths: + - /source/data/ +``` + +Here, + +- `spec.repository.name` specifies the name of the Repository. +- `spec.target.ref` refers to the target workload where the recovered data will be stored. +- `spec.target.volumeMounts` specifies a list of volumes and their mountPath where the data will be restored. + - `mountPath` must be the same mountPath as the original volume because Stash stores the absolute path of the backed-up files. If you use a different mountPath for the restored volume the backed up files will not be restored into your desired volume. + +Let's create the `RestoreSession` crd we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/cross-cluster-backup/examples/restoresession_staging.yaml +restoresession.stash.appscode.com/deployment-restore created +``` + +Now, wait for the RestoreSession phase to go into `Succeeded` state. + +**Wait for RestoreSession to Succeeded:** + +Run the following command to watch the RestoreSession phase, + +```bash +$ kubectl get restoresession -n demo -w + +NAME REPOSITORY PHASE DURATION AGE +deployment-restore gcs-repo Succeeded 10s 35s +``` + +So, we can see from the output of the above command that the restore process succeeded. + +### Verify Restored Data + +In this section, we are going to verify whether the desired data has been restored successfully or not. + +Get the pods of the `stash-recovered` Deployment, +```bash +$ kubectl get pods -n demo -l app='stash-recovered' +NAME READY STATUS RESTARTS AGE +stash-recovered-56547b7b57-scxl4 1/1 Running 0 16m +stash-recovered-56547b7b57-w4rf5 1/1 Running 0 16m +stash-recovered-56547b7b57-zxb2p 1/1 Running 0 16m +``` + +Verify that the backed-up data has been restored in `/source/data` directory of the `stash-recovered` pods of the Deployment using the following commands, + +```bash +$ kubectl exec -n demo stash-recovered-56547b7b57-scxl4 -- cat /source/data/data.txt +sample_data +``` + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial in `prod` and `staging` clusters, run the following commands: + +**Cleanup `prod` Cluster** + +Switch your cluster to `prod`, + +```bash +$ kubectl config use-context kind-prod +Switched to context "kind-prod". +``` + +Clean up the Stash resources in the `prod` cluster, + +```bash +kubectl delete -n demo deployments stash-demo +kubectl delete -n demo pvc stash-sample-data +kubectl delete -n demo backupconfiguration deployment-backup +kubectl delete -n demo repository gcs-repo +kubectl delete -n demo secret gcs-secret +``` + +**Cleanup `staging` Cluster** + +Switch your cluster to `staging`, + +```bash +$ kubectl config use-context kind-staging +Switched to context "kind-staging". +``` + +Clean up the Stash resources in the `staging` cluster, + +```bash +kubectl delete -n demo deployments stash-recovered +kubectl delete -n demo pvc demo-pvc +kubectl delete -n demo restoresession deployment-restore +kubectl delete -n demo repository gcs-repo +kubectl delete -n demo secret gcs-secret +``` \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/use-cases/customize-backup-restore/examples/backup/multiple_retention_policy.yaml b/content/docs/v2024.12.18/guides/use-cases/customize-backup-restore/examples/backup/multiple_retention_policy.yaml new file mode 100644 index 0000000000..261e54ce08 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/customize-backup-restore/examples/backup/multiple_retention_policy.yaml @@ -0,0 +1,27 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + retentionPolicy: + name: sample-deployment-retention + keepLast: 5 + keepDaily: 10 + keepWeekly: 20 + keepMonthly: 50 + keepYearly: 100 + prune: true \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/use-cases/customize-backup-restore/examples/backup/passing_args.yaml b/content/docs/v2024.12.18/guides/use-cases/customize-backup-restore/examples/backup/passing_args.yaml new file mode 100644 index 0000000000..06a43d9bc2 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/customize-backup-restore/examples/backup/passing_args.yaml @@ -0,0 +1,24 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: sample-deployment + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + args: ["--ignore-inode", "--tag=t1,t2"] + retentionPolicy: + name: "keep-last-5" + keepLast: 5 + prune: true \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/use-cases/customize-backup-restore/examples/backup/resource_limit.yaml b/content/docs/v2024.12.18/guides/use-cases/customize-backup-restore/examples/backup/resource_limit.yaml new file mode 100644 index 0000000000..7b5cd02b9d --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/customize-backup-restore/examples/backup/resource_limit.yaml @@ -0,0 +1,32 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: sample-deployment + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + runtimeSettings: + container: + resources: + requests: + cpu: "200m" + memory: "1Gi" + limits: + cpu: "200m" + memory: "1Gi" + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/use-cases/customize-backup-restore/examples/backup/specific_user.yaml b/content/docs/v2024.12.18/guides/use-cases/customize-backup-restore/examples/backup/specific_user.yaml new file mode 100644 index 0000000000..3e3da644bb --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/customize-backup-restore/examples/backup/specific_user.yaml @@ -0,0 +1,28 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: sample-deployment + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + runtimeSettings: + container: + securityContext: + runAsUser: 0 + runAsGroup: 0 + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/use-cases/customize-backup-restore/examples/restore/passing_args.yaml b/content/docs/v2024.12.18/guides/use-cases/customize-backup-restore/examples/restore/passing_args.yaml new file mode 100644 index 0000000000..4a8e90d41b --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/customize-backup-restore/examples/restore/passing_args.yaml @@ -0,0 +1,20 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: deployment-restore + namespace: demo +spec: + repository: + name: gcs-repo + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: sample-deployment + volumeMounts: + - name: source-data + mountPath: /source/data + rules: + - paths: + - /source/data/s + args: ["--tag=t1,t2"] \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/use-cases/customize-backup-restore/examples/restore/resource_limit.yaml b/content/docs/v2024.12.18/guides/use-cases/customize-backup-restore/examples/restore/resource_limit.yaml new file mode 100644 index 0000000000..b4bbc45358 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/customize-backup-restore/examples/restore/resource_limit.yaml @@ -0,0 +1,27 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-deployment + namespace: demo +spec: + repository: + name: gcs-repo + target: # target indicates where the recovered data will be stored + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-recovered + volumeMounts: + - name: source-data + mountPath: /source/data + runtimeSettings: + container: + resources: + requests: + cpu: "200m" + memory: "1Gi" + limits: + cpu: "200m" + memory: "1Gi" + rules: + - snapshots: [latest] \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/use-cases/customize-backup-restore/examples/restore/specific_snapshot.yaml b/content/docs/v2024.12.18/guides/use-cases/customize-backup-restore/examples/restore/specific_snapshot.yaml new file mode 100644 index 0000000000..2ecce35ba2 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/customize-backup-restore/examples/restore/specific_snapshot.yaml @@ -0,0 +1,18 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: deployment-restore + namespace: demo +spec: + repository: + name: gcs-repo + target: # target indicates where the recovered data will be stored + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-recovered + volumeMounts: + - name: source-data + mountPath: /source/data + rules: + - snapshots: [4bc21d6f] \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/use-cases/customize-backup-restore/examples/restore/specific_user.yaml b/content/docs/v2024.12.18/guides/use-cases/customize-backup-restore/examples/restore/specific_user.yaml new file mode 100644 index 0000000000..eb6afee7d6 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/customize-backup-restore/examples/restore/specific_user.yaml @@ -0,0 +1,23 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-deployment + namespace: demo +spec: + repository: + name: gcs-repo + target: # target indicates where the recovered data will be stored + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-recovered + volumeMounts: + - name: source-data + mountPath: /source/data + runtimeSettings: + container: + securityContext: + runAsUser: 0 + runAsGroup: 0 + rules: + - snapshots: [latest] \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/use-cases/customize-backup-restore/index.md b/content/docs/v2024.12.18/guides/use-cases/customize-backup-restore/index.md new file mode 100644 index 0000000000..d135888a42 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/customize-backup-restore/index.md @@ -0,0 +1,371 @@ +--- +title: Backup/Restore Customization | Stash +description: A guide on how to customize backup/restore process in Stash. +menu: + docs_v2024.12.18: + identifier: use-cases-customize-backup-restore + name: Customize Backup/Restore + parent: use-cases + weight: 70 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Customizing the Backup and Restore Process + +This guide will show you how you can customize backup and restore processes in Stash according to your needs. + +> Note: YAML files used in this tutorial are stored [here](https://github.com/stashed/docs/tree/{{< param "info.version" >}}/docs/guides/use-cases/customize-backup-restore/examples). + +## Customizing Backup Process + +In this section, we are going to show you how to customize the backup process. Here, we are going to show some examples of providing arguments to the backup process, running the backup process as a specific user, etc. + +### Passing arguments to the backup process + +Stash uses `restic` during the backup process. You can pass optional arguments to the restic backup process via `spec.target.args` field of BackupConfiguration. + +Here is an example of passing `--ignore-inode` and `--tag=t1,t2` arguments to a Deployment backup process of Stash. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: sample-deployment + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + args: ["--ignore-inode", "--tag=t1,t2"] + retentionPolicy: + name: "keep-last-5" + keepLast: 5 + prune: true +``` + +> **WARNING**: Make sure that you have the specific workload created before taking backup. In this case, Deployment `sample-deployment` should exist before the backup sidecar starts. + +### Running backup Container as a specific user + +If your cluster requires running the backup job as a specific user, you can provide `securityContext` under `runtimeSettings.container` section. The below example shows how you can run the backup sidecar for a Deployment as the root user. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: sample-deployment + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + runtimeSettings: + container: + securityContext: + runAsUser: 0 + runAsGroup: 0 + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +### Specifying Memory/CPU limit/request for the backup + +If you want to specify the Memory/CPU limit/request for your backup process, you can specify `resources` field under `runtimeSettings.container` section. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: sample-deployment + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + runtimeSettings: + container: + resources: + requests: + cpu: "200m" + memory: "1Gi" + limits: + cpu: "200m" + memory: "1Gi" + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +### Using multiple retention policies + +You can also specify multiple retention policies for your backed-up data. For example, you may want to keep few daily snapshots, few weekly snapshots, and few monthly snapshots, etc. You just need to pass the desired number with the respective key under the `retentionPolicy` section. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + retentionPolicy: + name: sample-deployment-retention + keepLast: 5 + keepDaily: 10 + keepWeekly: 20 + keepMonthly: 50 + keepYearly: 100 + prune: true +``` + +To know more about the available options for retention policies, please visit [here](/docs/v2024.12.18/concepts/crds/backupconfiguration/#specretentionpolicy). + +## Customizing Restore Process + +Stash uses `restic` during the restore process also. In this section, we are going to show how you can pass arguments to the restore process, restore a specific snapshot, run restore job as a specific user, etc. + +### Passing arguments to the restore process + +Similar to the backup process, you can pass optional arguments to the restic via `spec.target.args` in the restore process. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: deployment-restore + namespace: demo +spec: + repository: + name: gcs-repo + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: sample-deployment + volumeMounts: + - name: source-data + mountPath: /source/data + rules: + - paths: + - /source/data/s + args: ["--tag=t1,t2"] +``` + +### Restore specific snapshot + +You can also restore a specific snapshot. At first, list the available snapshots as below, + +```bash +❯ kubectl get snapshots -n demo +NAME ID REPOSITORY HOSTNAME CREATED AT +gcs-repo-4bc21d6f 4bc21d6f gcs-repo host-0 2022-01-12T14:54:27Z +gcs-repo-f0ac7cbd f0ac7cbd gcs-repo host-0 2022-01-12T14:56:26Z +gcs-repo-9210ebb6 9210ebb6 gcs-repo host-0 2022-01-12T14:58:27Z +gcs-repo-0aff8890 0aff8890 gcs-repo host-0 2022-01-12T15:00:28Z +``` + +>You can also filter the snapshots as shown in the guide [here](https://stash.run/docs/{{< param "info.version" >}}/concepts/crds/snapshot/#working-with-snapshot). + +You can use the respective ID of the snapshot to restore a specific snapshot. + +The below example shows how you can pass a specific snapshot ID through the `snapshots` field of `spec.target.rules` section. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: deployment-restore + namespace: demo +spec: + repository: + name: gcs-repo + target: # target indicates where the recovered data will be stored + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-recovered + volumeMounts: + - name: source-data + mountPath: /source/data + rules: + - snapshots: [4bc21d6f] +``` + +>Please, do not specify multiple snapshots here. Each snapshot represents a complete backup of your database. Multiple snapshots are only usable during file/directory restore. + +### Running restore init-container as a specific user + +You can provide `securityContext` under `runtimeSettings.container` section to run the restore init-container as a specific user during workload restore. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-deployment + namespace: demo +spec: + repository: + name: gcs-repo + target: # target indicates where the recovered data will be stored + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-recovered + volumeMounts: + - name: source-data + mountPath: /source/data + runtimeSettings: + container: + securityContext: + runAsUser: 0 + runAsGroup: 0 + rules: + - snapshots: [latest] +``` + +### Specifying Memory/CPU limit/request for the restore process + +Similar to the backup process, you can also provide `resources` field under the `runtimeSettings.container` section to limit the Memory/CPU for your restore process. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: sample-deployment + namespace: demo +spec: + repository: + name: gcs-repo + target: # target indicates where the recovered data will be stored + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-recovered + volumeMounts: + - name: source-data + mountPath: /source/data + runtimeSettings: + container: + resources: + requests: + cpu: "200m" + memory: "1Gi" + limits: + cpu: "200m" + memory: "1Gi" + rules: + - snapshots: [latest] +``` diff --git a/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/backupconfiguration-exclude.yaml b/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/backupconfiguration-exclude.yaml new file mode 100644 index 0000000000..5a16e78c94 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/backupconfiguration-exclude.yaml @@ -0,0 +1,27 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup-exclude + namespace: demo +spec: + repository: + name: gcs-repo-exclude + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + exclude: + - /source/data/not-important.txt # exclude only one file + - /source/data/*.html # exclude all the files that has a particular extension + - /source/data/tmp/* # exclude a directory + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/backupconfiguration-full.yaml b/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/backupconfiguration-full.yaml new file mode 100644 index 0000000000..0775d1a5ee --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/backupconfiguration-full.yaml @@ -0,0 +1,23 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup-full + namespace: demo +spec: + repository: + name: gcs-repo-full + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/deployment-recovered.yaml b/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/deployment-recovered.yaml new file mode 100644 index 0000000000..f9aea3d9ec --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/deployment-recovered.yaml @@ -0,0 +1,33 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-recovered + name: stash-recovered + namespace: demo +spec: + replicas: 1 + selector: + matchLabels: + app: stash-recovered + template: + metadata: + labels: + app: stash-recovered + name: busybox + spec: + containers: + - args: + - sleep + - "3600" + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + persistentVolumeClaim: + claimName: recovered-data diff --git a/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/deployment-source.yaml b/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/deployment-source.yaml new file mode 100644 index 0000000000..0bcfbd2ea0 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/deployment-source.yaml @@ -0,0 +1,33 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-demo + name: stash-demo + namespace: demo +spec: + replicas: 1 + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - args: + - sleep + - "3600" + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + persistentVolumeClaim: + claimName: source-data diff --git a/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/pvc-recovered.yaml b/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/pvc-recovered.yaml new file mode 100644 index 0000000000..462600cc09 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/pvc-recovered.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: recovered-data + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: standard + resources: + requests: + storage: 1Gi diff --git a/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/pvc-source.yaml b/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/pvc-source.yaml new file mode 100644 index 0000000000..163672b639 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/pvc-source.yaml @@ -0,0 +1,12 @@ +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: source-data + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: standard + resources: + requests: + storage: 2Gi diff --git a/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/repository-exclude.yaml b/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/repository-exclude.yaml new file mode 100644 index 0000000000..4a173085f9 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/repository-exclude.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo-exclude + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /demo/stash-demo/exclude + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/repository-full.yaml b/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/repository-full.yaml new file mode 100644 index 0000000000..9f5a7d0b79 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/repository-full.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo-full + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /demo/stash-demo/full + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/restoresession-exclude.yaml b/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/restoresession-exclude.yaml new file mode 100644 index 0000000000..18ea000bad --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/restoresession-exclude.yaml @@ -0,0 +1,23 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: deployment-restore-exclude + namespace: demo +spec: + repository: + name: gcs-repo-full + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-recovered + volumeMounts: + - name: source-data + mountPath: /source/data + rules: + - paths: + - /source/data/ + exclude: + - /source/data/not-important.txt # don't restore this file + - /source/data/*.html # don't restore all files with .html extension + - /source/data/tmp/* # don't restore this directory diff --git a/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/restoresession-inlcude.yaml b/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/restoresession-inlcude.yaml new file mode 100644 index 0000000000..213940d122 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/examples/restoresession-inlcude.yaml @@ -0,0 +1,23 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: deployment-restore-include + namespace: demo +spec: + repository: + name: gcs-repo-full + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-recovered + volumeMounts: + - name: source-data + mountPath: /source/data + rules: + - paths: + - /source/data/ + include: + - /source/data/data1.txt # restore this file + - /source/data/*.json # restore all files with .json extension + - /source/data/tmp/* # restore this directory diff --git a/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/index.md b/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/index.md new file mode 100644 index 0000000000..76941e2a16 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/exclude-include-files/index.md @@ -0,0 +1,653 @@ +--- +title: Exclude/Include Files | Stash +description: A guide on how to filter files during backup/restore process. +menu: + docs_v2024.12.18: + identifier: use-cases-exclude-include-files + name: Exclude/Include Files + parent: use-cases + weight: 12 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Filtering Files During Backup/Restore + +This guide will show you how to exclude/include subset of files during backup/restore process. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). +- Install `Stash` in your cluster following the steps [here](/docs/v2024.12.18/setup/README). +- Install Stash `kubectl` plugin following the steps [here](https://stash.run/docs/latest/setup/install/kubectl-plugin/). +- You should be familiar with the following `Stash` concepts: + - [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) + - [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) + - [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + - [Repository](/docs/v2024.12.18/concepts/crds/repository/) + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +❯ kubectl create ns demo +namespace/demo created +``` + +## Prepare Workload + +At first, we are going to create a `PVC` then we are going to create a `Deployment` that will use this `PVC`. + +### Create PVC + +Below is the YAML of the sample PVC that we are going to create, + +```yaml +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: source-data + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: standard + resources: + requests: + storage: 2Gi +``` + +Let’s create the PVC we have shown above, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/exclude-include-files/examples/pvc-source.yaml +persistentvolumeclaim/source-data created +``` + +### Create Deployment + +Now, we are going to deploy a Deployment that uses the above PVC. Below is the YAML of the Deployment that we are going to create, + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-demo + name: stash-demo + namespace: demo +spec: + replicas: 1 + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - args: + - sleep + - "3600" + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + persistentVolumeClaim: + claimName: source-data +``` + +Let’s create the `Deployment` we have shown above, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/exclude-include-files/examples/deployment-source.yaml +deployment.apps/stash-demo created +``` + +Now, wait for the pod of the Deployment to go into `Running` state. + +```bash +❯ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-demo-67576d874-2tj9d 1/1 Running 0 81s +``` + +### Insert Data + +```bash +# create sample data +❯ kubectl exec -n demo -it stash-demo-67576d874-2tj9d -- /bin/sh -c "touch /source/data/data-1.txt" + +❯ kubectl exec -n demo -it stash-demo-67576d874-2tj9d -- /bin/sh -c "touch /source/data/data-2.txt" + +❯ kubectl exec -n demo -it stash-demo-67576d874-2tj9d -- /bin/sh -c "touch /source/data/not-important.txt" + +❯ kubectl exec -n demo -it stash-demo-67576d874-2tj9d -- /bin/sh -c "touch /source/data/index.html" + +❯ kubectl exec -n demo -it stash-demo-67576d874-2tj9d -- /bin/sh -c "touch /source/data/resp.json" + +❯ kubectl exec -n demo -it stash-demo-67576d874-2tj9d -- /bin/sh -c "mkdir /source/data/tmp" + +❯ kubectl exec -n demo -it stash-demo-67576d874-2tj9d -- /bin/sh -c "touch /source/data/tmp/tmp.txt" +``` + +## Prepare Backend + +We are going to store our backed up data into a GCS bucket. We have to create a Secret with necessary credentials and a Repository crd to use this backend. If you want to use a different backend, please read the respective backend configuration doc from [here](https://stash.run/docs/latest/guides/backends/overview/). + +> For GCS backend, if the bucket does not exist, Stash needs Storage Object Admin role permissions to create the bucket. For more details, please check the following guide. + +### Create Secret + +Let’s create a secret called `gcs-secret` with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat /path/to/downloaded-sa-key.json > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +## Full Backup + +Stash automatically takes backup of all the data in the specified path. We are going to create a BackupConfiguration crd targeting the stash-demo Deployment that we have deployed earlier. Then, Stash will inject a sidecar container into the target. It will also create a CronJob to take periodic backup of `/source/data` directory of the target. + +We are going to use the following `Repository` to backup our data, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo-full + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /demo/stash-demo/full + storageSecretName: gcs-secret +``` + +Let’s create the `Repository`, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/exclude-include-files/examples/repository-full.yaml +repository.stash.appscode.com/gcs-repo-full created +``` + +Bellow is the yaml of the `BackupConfiguration` we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup-full + namespace: demo +spec: + repository: + name: gcs-repo-full + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +The above `BackupConfiguration` will backup everything inside the `/source/data` directory. + +Let’s create the `BackupConfiguration` object that we have shown above, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/exclude-include-files/examples/backupconfiguration-full.yaml +backupconfiguration.stash.appscode.com/deployment-backup-full created +``` + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. + +### Trigger a Backup + +Lets trigger a backup using Stash `kubectl` plugin, + +```bash +❯ kubectl stash trigger -n demo deployment-backup-full +``` + +### Wait for BackupSession to Succeed + +Run the following command to watch `BackupSession` phase, + +```bash +❯ watch kubectl get -n demo backupsession -n demo +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +deployment-backup-full-1647347700 BackupConfiguration deployment-backup Succeeded 21s +``` + +### Verify Backup + +Lets download the `latest` snapshot of the `Repository` in `/tmp/full-backup` directory using Stash `kubectl` plugin, + +```bash +❯ mkdir /tmp/full-backup +❯ kubectl stash download gcs-repo-full -n demo --destination=/tmp/full-backup --snapshots="latest" +``` + +List the files in `/tmp/full-backup/latest/source/data` directory to verify the backup data. + +```bash +❯ ls -R /tmp/full-backup/latest/source/data + +/tmp/full-backup/latest/source/data: +data-1.txt data-2.txt index.html not-important.txt resp.json tmp/ + +/tmp/full-backup/latest/source/data/tmp: +tmp.txt +``` + +## Filtering During Backup + +In this section, we are going to show how to filter files during a backup. + +### Exclude Subset of Files + +Here, we are going show how to exclude particular files during a backup. We can exclude a subset of files during backup using the `spec.target.exclude` section in the `BackupConfiguration`. + +We are going to use the following `Repository` to backup our data, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo-exclude + namespace: demo +spec: + backend: + gcs: + bucket: stash-testing + prefix: /demo/stash-demo/exclude + storageSecretName: gcs-secret + +``` + +Let’s create the `Repository` we have shown above, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/exclude-include-files/examples/repository-exclude.yaml +repository.stash.appscode.com/gcs-repo-exclude created +``` + + +Below is the YAML of the `BackupConfiguration` crd that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup-exclude + namespace: demo +spec: + repository: + name: gcs-repo-exclude + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + exclude: + - /source/data/not-important.txt # exclude only one file + - /source/data/*.html # exclude the files with .html extension + - /source/data/tmp/* # exclude a directory + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true + +``` + +The above BackupConfiguration will backup everything inside the `/source/data` directory except the file `source/data/not-important.txt`, all the `html` files, and the directory `source/data/tmp`. + + Let’s create the BackupConfiguration object that we have shown above, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/exclude-include-files/examples/backupconfiguration-exclude.yaml +backupconfiguration.stash.appscode.com/deployment-backup-exclude created +``` + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. + +#### Trigger a Backup + +Lets trigger a backup using Stash `kubectl` plugin, + +```bash +kubectl stash trigger -n demo deployment-backup-exclude +``` + +#### Wait for BackupSession to Succeed + +Run the following command to watch `BackupSession` phase, + +```bash +$ watch kubectl get -n demo backupsession -n demo +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +deployment-backup-exclude-1647347700 BackupConfiguration deployment-backup Succeeded 21s +``` + +### Verify Backup + +Lets download the `latest` snapshot of the `Repository` in `/tmp/partial-backup` directory using Stash `kubectl` plugin, + +```bash +❯ mkdir /tmp/partial-backup +❯ kubectl stash download gcs-repo-full -n demo --destination=/tmp/partial-backup --snapshots="latest" +``` + +List the files in `/tmp/partial-backup/latest/source/data` directory to verify the backup data. + +```bash +❯ ls -R /tmp/partial-backup/latest/source/data + +/tmp/partial-backup/latest/source/data: +data-1.txt data-2.txt resp.json tmp/ + +/tmp/partial-backup/latest/source/data/tmp: +``` + +## Filtering During Restore + +In this section, we are going to show how to filter files during a backup. At first, we are going to deploy a new Deployment with a PVC . Then, we are going to restore the backed up data using Stash. + +### Prepare Workload + +Below is the YAML of the `PVC` that we are going to create, + +```yaml +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: recovered-data + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: standard + resources: + requests: + storage: 1Gi + +``` + +Let’s create the PVC we have shown above, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/exclude-include-files/examples/pvc-recovered.yaml +persistentvolumeclaim/recovered-data created +``` + +Below is the YAML of the `Deployment` that we are going to create, + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-recovered + name: stash-recovered + namespace: demo +spec: + replicas: 1 + selector: + matchLabels: + app: stash-recovered + template: + metadata: + labels: + app: stash-recovered + name: busybox + spec: + containers: + - args: + - sleep + - "3600" + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + persistentVolumeClaim: + claimName: recovered-data + +``` + +Let’s create the `Deployment` we have shown above, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/exclude-include-files/examples/deployment-recovered.yaml +deployment.apps/stash-recovered created +``` + +Now, wait for the pod of the Deployment to go into `Running` state. + +```bash +❯ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-recovered-67576d874-2tj9d 1/1 Running 0 81s +``` + +### Exclude Subset of Files + +Here, we are going show how to exclude particular files during a restore. We can exclude a subset of files during a restore using the `spec.target.rules` section in the `RestoreSession`. + +Below is the YAML of the `RestoreSession` crd that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: deployment-restore-exclude + namespace: demo +spec: + repository: + name: gcs-repo-full + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-recovered + volumeMounts: + - name: source-data + mountPath: /source/data + rules: + - paths: + - /source/data/ + exclude: + - /source/data/not-important.txt # don't restore this file + - /source/data/*.html # don't restore the files with .html extension + - /source/data/tmp/* # don't restore this directory + +``` + +The above `RestoreSession` will restore everything inside the `/source/data` directory except `source/data/not-important.txt`, all the `html` files, and the directory `source/data/tmp`. + +Let’s create the `RestoreSession` object that we have shown above, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/exclude-include-files/examples/restoresession-exclude.yaml +restoresession.stash.appscode.com/deployment-restore-exclude created +``` + +Verify that the files have been restored in `/source/data` directory using the following command, + +```bash +❯ kubectl exec -n demo stash-recovered-67576d874-2tj9d -- ls -R /source/data + +/source/data: +data-1.txt +data-2.txt +resp.json +tmp/ + +/source/data/tmp: +``` + +### Restore Subset of Files + +Previously we have restored the backed up data excluding specific files or directory. You can also restore only the selected files or directory during a restore. + +Below is the YAML of the `RestoreSession` crd that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: deployment-restore-include + namespace: demo +spec: + repository: + name: gcs-repo-full + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-recovered + volumeMounts: + - name: source-data + mountPath: /source/data + rules: + - paths: + - /source/data/ + include: + - /source/data/data1.txt # restore this file + - /source/data/*.json # restore the files with .json extension + - /source/data/tmp/* # restore this directory +``` + +Let’s create the `RestoreSession` object that we have shown above, + +```bash +❯ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/exclude-include-files/examples/restoresession-include.yaml +restoresession.stash.appscode.com/deployment-restore-include created +``` + +Verify that the files have been restored in `/source/data` directory using the following command, + +```bash +❯ kubectl exec -n demo stash-recovered-7dd74d9ff7-h9t7x -- ls -R /source/data +/source/data: +resp.json +tmp + +/source/data/tmp: +tmp.txt +``` + +## Cleaning Up + +```bash +❯ kubectl delete -n demo deployment stash-demo +❯ kubectl delete -n demo deployment stash-recovered +❯ kubectl delete -n demo backupconfiguration deployment-backup-full +❯ kubectl delete -n demo backupconfiguration deployment-backup-exclude +❯ kubectl delete -n demo restoresession deployment-restore-include +❯ kubectl delete -n demo restoresession deployment-restore-exclude +❯ kubectl delete -n demo repository gcs-repo-full +❯ kubectl delete -n demo repository gcs-repo-exclude +❯ kubectl delete -n demo secret gcs-secret +❯ kubectl delete -n demo pvc --all +``` diff --git a/content/docs/v2024.12.18/guides/use-cases/instant-backup/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/guides/use-cases/instant-backup/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..bfda2051cb --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/instant-backup/examples/backupconfiguration.yaml @@ -0,0 +1,23 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/40 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/guides/use-cases/instant-backup/examples/backupsession.yaml b/content/docs/v2024.12.18/guides/use-cases/instant-backup/examples/backupsession.yaml new file mode 100644 index 0000000000..7915aae348 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/instant-backup/examples/backupsession.yaml @@ -0,0 +1,12 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupSession +metadata: + labels: + stash.appscode.com/backup-configuration: deployment-backup + name: deployment-backupsession + namespace: demo +spec: + invoker: + apiGroup: stash.appscode.com + kind: BackupConfiguration + name: deployment-backup diff --git a/content/docs/v2024.12.18/guides/use-cases/instant-backup/examples/deployment.yaml b/content/docs/v2024.12.18/guides/use-cases/instant-backup/examples/deployment.yaml new file mode 100644 index 0000000000..557bf8f9a3 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/instant-backup/examples/deployment.yaml @@ -0,0 +1,45 @@ +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: source-data + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: standard + resources: + requests: + storage: 2Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-demo + name: stash-demo + namespace: demo +spec: + replicas: 1 + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - args: ["echo sample_data > /source/data/data.txt && sleep 3000"] + command: ["/bin/sh", "-c"] + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + persistentVolumeClaim: + claimName: source-data \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/use-cases/instant-backup/examples/repository.yaml b/content/docs/v2024.12.18/guides/use-cases/instant-backup/examples/repository.yaml new file mode 100644 index 0000000000..c8074c44fb --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/instant-backup/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: /stash/instant/deployment + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/guides/use-cases/instant-backup/images/instant.png b/content/docs/v2024.12.18/guides/use-cases/instant-backup/images/instant.png new file mode 100644 index 0000000000..ecf2841fa7 Binary files /dev/null and b/content/docs/v2024.12.18/guides/use-cases/instant-backup/images/instant.png differ diff --git a/content/docs/v2024.12.18/guides/use-cases/instant-backup/index.md b/content/docs/v2024.12.18/guides/use-cases/instant-backup/index.md new file mode 100644 index 0000000000..1e67922d4a --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/instant-backup/index.md @@ -0,0 +1,373 @@ +--- +title: Instant Backup | Stash +description: An step by step guide on how to take instant backup using Stash. +menu: + docs_v2024.12.18: + identifier: use-cases-instant-backup + name: Instant Backup + parent: use-cases + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Instant Backup + +This guide will show you how to take an instant backup in Stash. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). + +- Install `Stash` in your cluster following the steps [here](/docs/v2024.12.18/setup/README). + +- You should be familiar with the following `Stash` concepts: + - [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) + - [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) + - [Repository](/docs/v2024.12.18/concepts/crds/repository/) + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +>**Note:** YAML files used in this tutorial are stored in [docs/guides/use-cases/instant-backup/examples](/docs/v2024.12.18/guides/use-cases/instant-backup/examples) directory of [stashed/docs](https://github.com/stashed/docs) repository. + +## Configure Backup + +Here, we are going to configure backup for a Deployment. At first, we are going to deploy a Deployment with a PVC and generate some sample data in it. Then, we are going to configure backup for the Deployment using Stash. + +**Deploy Deployment:** + +Below is the YAML of the Deployment and PVC that we are going to create, + +```yaml +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: source-data + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: standard + resources: + requests: + storage: 2Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-demo + name: stash-demo + namespace: demo +spec: + replicas: 1 + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - args: ["echo sample_data > /source/data/data.txt && sleep 3000"] + command: ["/bin/sh", "-c"] + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + persistentVolumeClaim: + claimName: source-data +``` + +The above Deployment will automatically create a `data.txt` file in `/source/data` directory and write some sample data in it. + +Let’s create the Deployment and PVC we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/instant-backup/examples/deployment.yaml +persistentvolumeclaim/source-data created +deployment.apps/stash-demo created +``` + +Now, wait for the pod of the Deployment to go into `Running` state. + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-demo-859d96f6bd-fxr7l 1/1 Running 0 81s +``` + +Verify that the sample data has been created in `/source/data` directory using the following command, + +```bash +$ kubectl exec -n demo stash-demo-859d96f6bd-fxr7l -- cat /source/data/data.txt +sample_data +``` + +**Create Secret and Repository:** + +We are going to store our backed up data into a GCS bucket. We have to create a Secret and a Repository object with access credentials and backend information respectively. + +> For GCS backend, if the bucket does not exist, Stash needs `Storage Object Admin` role permissions to create the bucket. For more details, please check the following [guide](/docs/v2024.12.18/guides/backends/gcs/). + +Let’s create a secret called `gcs-secret` with access credentials of our desired GCS backend, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat /path/to/downloaded-sa-key.json > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +Now, create a `Repository` using this secret. Below is the YAML of `Repository` crd we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: /stash/instant/deployment + storageSecretName: gcs-secret +``` + +Let’s create the `Repository` object that we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/instant-backup/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our sample data into this backend. + +**Create BackupConfiguration:** + +We have to create a `BackupConfiguration` crd targeting the `stash-demo` Deployment that we have deployed earlier. Then, Stash will inject a sidecar container into the target. It will also create a `CronJob` to take periodic backup of `/source/data` directory of the target. + +Below is the YAML of the `BackupConfiguration` object that we are going to create and specify that this `BackupConfiguration` will take backup in every 40 minutes. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/40 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Let’s create the `BackupConfiguration` object that we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/instant-backup/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/deployment-backup created +``` + +**Verify Sidecar:** + +If everything goes well, Stash will inject a sidecar container into the `stash-demo` Deployment to take backup of `/source/data` directory. Let’s check that the sidecar has been injected successfully, + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-demo-9bff9fd4f-xvt77 2/2 Running 0 57s +``` + +Look at the pod. It now has 2 containers. If you view the resource definition of this pod, you will see that there is a container named `stash` which is running `run-backup` command. + +**Verify CronJob:** + +It will also create a `CronJob` with the schedule specified in `spec.schedule` field of `BackupConfiguration` crd. + +Verify that the `CronJob` has been created using the following command, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED AGE +deployment-backup */40 * * * * 6m41s +``` + +## Trigger Instant Backup + +Now, we are going to trigger an instant backup of the volumes of the Deployment that we have configured in the previous section. To do that, we have to create a `BackupSession` object pointing to the respective `BackupConfiguration` object. + +**Create BackupSession:** + +Below is the YAML of the `BackupSession` crd that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupSession +metadata: + labels: + stash.appscode.com/backup-configuration: deployment-backup + name: deployment-backupsession + namespace: demo +spec: + invoker: + apiGroup: stash.appscode.com + kind: BackupConfiguration + name: deployment-backup +``` + +- `metadata.labels` holds the respective `BackupConfiguration` name as a label. Stash backup sidecar container use this label to watch only the BackupSessions of that `BackupConfiguration`. You must provide the label in the following format: + ``` + stash.appscode.com/backup-configuration: + ``` +- `spec.invoker` section indicates the `BackupConfiguration` object whose target will be backed up instantly for this `BackupSession`. + +Let's create the `BackupSession` object that we have have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/instant-backup/examples/backupsession.yaml +backupsession.stash.appscode.com/deployment-backupsession created +``` + +If everything goes well, the stash sidecar inside the Deployment will take a backup instantly. + +**Wait for BackupSession to Succeed:** + +Run the following command to watch `BackupSession` phase, + +```bash +$ watch -n 3 kubectl get backupsession -n demo +Every 3.0s: kubectl get backupsession -n demo suaas-appscode: Wed Jul 10 17:18:52 2019 + +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +deployment-backupsession BackupConfiguration deployment-backup Succeeded 21s +``` + +We can see from the above output that the instant backup session has succeeded. Now, we are going to verify that the backed up data has been stored in the backend. + +**Verify Backup:** + +Once a backup is complete, Stash will update the respective `Repository` crd to reflect the backup. Check that the repository `gcs-repo` has been updated by the following command, + +```bash +$ kubectl get repository -n demo gcs-repo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo true 24 B 1 116s 10m +``` + +Now, if we navigate to the GCS bucket, we are going to see backed up data has been stored in `stash/instant/deployment` directory as specified by `spec.backend.gcs.prefix` field of `Repository` crd. + +
+  Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +>**Note:** Stash keeps all the backed up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Cleanup + +```yaml +kubectl delete -n demo deployment stash-demo +kubectl delete -n demo backupconfiguration deployment-backup +kubectl delete -n demo backupsession deployment-backupsession +kubectl delete -n demo repository gcs-secret +kubectl delete -n demo secret gcs-secret +kubectl delete -n demo pvc --all +``` diff --git a/content/docs/v2024.12.18/guides/use-cases/ownership/index.md b/content/docs/v2024.12.18/guides/use-cases/ownership/index.md new file mode 100644 index 0000000000..0c2d93a038 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/ownership/index.md @@ -0,0 +1,160 @@ +--- +title: File Ownership | Stash +description: Handling Restored File Ownership in Stash +menu: + docs_v2024.12.18: + identifier: file-ownership-stash + name: File Ownership + parent: use-cases + weight: 40 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Handling Restored File Ownership in Stash + +Stash preserves permission bits of the restored files. However, it may change ownership (owner `uid` and `gid`) of the restored files in some cases. This tutorial will explain when and how ownership of the restored files can be changed. Then, we are going to explain how we can avoid or resolve this problem. + +## Understanding Backup and Restore Behaviour + +At first, let's understand how backup and restore behaves in different scenario. A table with some possible backup and restore scenario is given below. We have run the containers as different user in different scenario using [SecurityContext](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/). + +| Case | Original File Owner | Backup `sidecar` User | Backup Succeed? | Restore `init-container` User | Restore Succeed? | Restored File Owner | Restored File Editable to Original Owner? | +| :---: | :-----------------: | :-------------------: | :-------------: | :---------------------------: | :-----------------------: | :-----------------: | :---------------------------------------: | +| 1 | root | stash (1005) | ✓ | stash(1005) | ✓ | 1005 | ✓ | +| 2 | 2000 | stash(1005) | ✓ | stash(1005) | ✓ | 1005 | ✗ | +| 3 | 2000 | root | ✓ | root | ✓ | 2000 | ✓ | +| 4 | 2000 | root | ✓ | stash(1005) | ✓ (remote backend) | 1005 | ✗ | +| 5 | 2000 | root | ✓ | stash(1005) | ✗ (local backend) | - | - | +| 6 | 2000 | 3000 | ✓ | stash(1005) | ✓ (remote backend) | 1005 | ✗ | +| 7 | 2000 | 3000 | ✓ | stash(1005) | ✗ (local backend) | - | - | +| 8 | 2000 | 3000 | ✓ | root | ✓ | 2000 | ✓ | +| 9 | 2000 | 3000 | ✓ | 3000 | ✓ | 3000 | ✗ | + +If we look at the table carefully, we are going to notice the following behaviors: + +1. The user of the backup `sidecar` does not have any effect on backup. It just needs read permission of the target files. +2. If the restore container runs as `root` user then original ownership of the restored files are preserved. +3. If the restore container runs as `non-root` user then the ownership of the restored files is changed to restore container's user and restored files become read-only to the original user unless it was `root` user. + +So, we can see when we run restore container as `non-root` user, it raises some serious concerns as the restored files become read-only to the original user. Next section will discuss how we can avoid or fix this problem. + +## Avoid or Fix Ownership Issue + +As we have seen when the ownership of the restored files gets changed, they can be unusable to the original user. We need to avoid or fix this issue. + +There could be two scenarios for the restored files user. + +1. Restored files user is the same as the original user. +2. Restored files user is different than the original user. + +### Restored files user is the same as the original user + +This is likely to be the most common scenario. Generally, the same application whose data was backed up will use the restored files after a restore. In this case, if your cluster supports running containers as `root` user, then it is fairly easy to avoid this issue. You just need to run the restore container as `root` user which Stash does by default. However, things get little more complicated when your cluster does not support running containers as `root` user. In this case, you can do followings: + +- Run restore container as the same user as the original container. +- Change the ownership of the restored files using `chown` after the restore is completed. + +For the first method, we can achieve this configuring SecurityContext under `RuntimeSetting` of `RestoreSession` object. A sample `RestoreSession` objects configured SecurityContext to run as the same user as the original user (let original user is 2000) is shown below. + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: deployment-restore + namespace: demo +spec: + repository: + name: local-repo + rules: + - paths: + - /source/data + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + runtimeSettings: + container: + securityContext: + runAsUser: 2000 + runAsGroup: 2000 +``` + +>If you are using [local](/docs/v2024.12.18/guides/backends/local/) backend to store backed up data, then the original container, backup container and restore container all of them must be run as same user. By default, Stash runs backup container as `stash(1005)` user. You can change this to match with the user of your original container using `securityContext` field under `runtimeSettings` of `BackupConfiguration` object. + +The second method is necessary when the backup container was not run as the same user as the original container. This is similar to the process when the restored files user is different than the original user. In this case, you have to change the ownership of restored files using `chown` after restore. + +### Restored file user is different than the original user + +If you want to use the restore files with a different user than the original one, then you have to change the ownership after restore. You can use an `init-container` in your workload that will run `chown` command to change the permissions to the desired owner or you can exec into workload pod to change ownership yourself. diff --git a/content/docs/v2024.12.18/guides/use-cases/pause-backup/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/guides/use-cases/pause-backup/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..a066d83797 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/pause-backup/examples/backupconfiguration.yaml @@ -0,0 +1,23 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: pause-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/guides/use-cases/pause-backup/examples/backupsession.yaml b/content/docs/v2024.12.18/guides/use-cases/pause-backup/examples/backupsession.yaml new file mode 100644 index 0000000000..932dee7896 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/pause-backup/examples/backupsession.yaml @@ -0,0 +1,12 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupSession +metadata: + labels: + stash.appscode.com/backup-configuration: pause-backup + name: instant-backupsession + namespace: demo +spec: + invoker: + apiGroup: stash.appscode.com + kind: BackupConfiguration + name: pause-backup diff --git a/content/docs/v2024.12.18/guides/use-cases/pause-backup/examples/deployment.yaml b/content/docs/v2024.12.18/guides/use-cases/pause-backup/examples/deployment.yaml new file mode 100644 index 0000000000..2188c5c186 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/pause-backup/examples/deployment.yaml @@ -0,0 +1,45 @@ +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: source-pvc + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: standard + resources: + requests: + storage: 1Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-demo + name: stash-demo + namespace: demo +spec: + replicas: 3 + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - args: ["echo sample_data > /source/data/data.txt && sleep 3000"] + command: ["/bin/sh", "-c"] + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + persistentVolumeClaim: + claimName: source-pvc diff --git a/content/docs/v2024.12.18/guides/use-cases/pause-backup/examples/repository.yaml b/content/docs/v2024.12.18/guides/use-cases/pause-backup/examples/repository.yaml new file mode 100644 index 0000000000..51a3f09067 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/pause-backup/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: /sample/data + storageSecretName: gcs-secret \ No newline at end of file diff --git a/content/docs/v2024.12.18/guides/use-cases/pause-backup/index.md b/content/docs/v2024.12.18/guides/use-cases/pause-backup/index.md new file mode 100644 index 0000000000..956a4307b6 --- /dev/null +++ b/content/docs/v2024.12.18/guides/use-cases/pause-backup/index.md @@ -0,0 +1,468 @@ +--- +title: Pause Backup | Stash +description: An step by step guide on how to pause a scheduled backup in Stash. +menu: + docs_v2024.12.18: + identifier: use-cases-pause-backup + name: Pause Backup + parent: use-cases + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Pause Backup + +Stash supports pausing backups without deleting respective `BackupConfiguration`. This guide will show you how to pause a scheduled backup in Stash. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster. If you do not already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). + +- Install `Stash` in your cluster following the steps [here](/docs/v2024.12.18/setup/README). + +- You should be familiar with the following `Stash` concepts: + - [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) + - [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) + - [Repository](/docs/v2024.12.18/concepts/crds/repository/) + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> **Note:** YAML files used in this tutorial are stored in [docs/guides/use-cases/pause-backup/examples](https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/pause-backup/examples) directory of [stashed/docs](https://github.com/stashed/docs) repository. + +## Configure Backup + +At first, we need to schedule a backup for a sample workload. Here, we are going to deploy a Deployment with a PVC. This Deployment will automatically generate some sample data into the PVC. Then, we are going to configure a scheduled backup for this Deployment. + +**Deploy Deployment:** + +Below are the YAMLs of the Deployment and PVC that we are going to create, + +```yaml +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: source-pvc + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: standard + resources: + requests: + storage: 1Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-demo + name: stash-demo + namespace: demo +spec: + replicas: 3 + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - args: ["echo sample_data > /source/data/data.txt && sleep 3000"] + command: ["/bin/sh", "-c"] + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + persistentVolumeClaim: + claimName: source-pvc +``` + +The above Deployment will automatically create a `data.txt` file in `/source/data` directory and write some sample data in it. + +Let's create the Deployment and PVC we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/pause-backup/examples/deployment.yaml +persistentvolumeclaim/source-pvc created +deployment.apps/stash-demo created +``` + +Now, wait for the pods of the Deployment to go into the `Running` state. + +```bash +kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-demo-69f9ffbbf7-bww24 1/1 Running 0 100s +stash-demo-69f9ffbbf7-r8wgh 1/1 Running 0 100s +stash-demo-69f9ffbbf7-rsj55 1/1 Running 0 100s +``` + +To verify that the sample data has been created in `/source/data` directory, use the following command: + +```bash +$ kubectl exec -n demo stash-demo-69f9ffbbf7-bww24 -- cat /source/data/data.txt +sample_data +``` + +**Create Secret and Repository:** + +We are going to store our backed up data into a [GCS bucket](https://cloud.google.com/storage/). We have to create a Secret and a Repository object with access credentials and backend information respectively. + +> For GCS backend, if the bucket does not exist, Stash needs `Storage Object Admin` role permissions to create the bucket. For more details, please check the following [guide](/docs/v2024.12.18/guides/backends/gcs/). + +Let’s create a secret called ` gcs-secret` with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat /path/to/downloaded-sa-key.json > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +Now, create a `Repository` using this secret. Below is the YAML of `Repository` crd we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: /sample/data + storageSecretName: gcs-secret +``` + +Let's create the Repository we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/pause-backup/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our sample data into this backend. + +**Create BackupConfiguration:** + +We have to create a `BackupConfiguration` crd targeting the `stash-demo` Deployment that we have deployed earlier. Stash will inject a sidecar container into the target. It will also create a `CronJob` to take a periodic backup of `/source/data` directory of the target. + +Below is the YAML of the `BackupConfiguration` crd that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: pause-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Let's create the `BackupConfiguration` crd we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/pause-backup/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/pause-backup created +``` + +**Verify Sidecar:** + +If everything goes well, Stash will inject a sidecar container into the `stash-demo` Deployment to take backup of `/source/data` directory. Let’s check that the sidecar has been injected successfully, + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-demo-7489fcb7f5-jctj4 2/2 Running 0 117s +stash-demo-7489fcb7f5-mfqps 2/2 Running 0 112s +stash-demo-7489fcb7f5-zp8c5 2/2 Running 0 115s +``` + +Look at the pod. It now has 2 containers. If you view the resource definition of this pod, you will see that there is a container named `stash` which is running `run-backup` command. + +**Verify CronJob:** + +It will also create a `CronJob` with the schedule specified in `spec.schedule` field of `BackupConfiguration` crd. + +Verify that the `CronJob` has been created using the following command, + +```bash +$ watch -n 1 kubectl get backupconfiguration -n demo +Every 3.0s: kubectl get backupconfiguration -n demo suaas-appscode: Thu Aug 1 17:08:08 2019 + +NAMESPACE NAME TASK SCHEDULE PAUSED AGE +demo pause-backup */1 * * * * 27s +``` + +**Wait for BackupSession Succeeded:** + +Wait for the next schedule for backup. Run the following command to watch `BackupSession` crd, + +```bash +$ watch -n 1 kubectl get backupssession -n demo +Every 3.0s: kubectl get backupssession -n demo suaas-appscode: Thu Aug 1 17:43:57 2019 + +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +pause-backup-1564659789 BackupConfiguration pause-backup Succeeded 49s +``` + +We can see from the above output that the backup session has succeeded. This indicates that the volumes of the Deployment have been backed up in the backend successfully. + +## Pause Scheduled Backup + +Now, we are going to pause the scheduled backup without deleting respective `BackupConfiguration`. In order to do that, we have to set `spec.paused: true` in the respective `BackupConfiguration` crd. + +When we set `spec.paused: true`, the following things are going to happen: + +- Respective CronJob will not be removed. However, it will skip creating any new BackupSession for next the schedules. +- Stash sidecar container which is responsible for taking backup will not be removed. So, your workload will not restart. However, it will skip taking backup even if a BackupSession is created to trigger an instant backup. + +Let's patch the BackupConfiguration crd `pause-backup` and set `spec.paused: true`, + +```bash +$ kubectl patch backupconfiguration -n demo pause-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/pause-backup patched +``` + +**Verify Scheduled Backup Get Skipped:** + +Now, wait for the next backup schedule. This time, the CronJob will not create any new BackupSession. Instead, it will write an event to the BackupConfiguration crd that it has skipped creating BackupSession because the backup is paused. + +Let's describe the `BackupConfiguration` to verify that the event has been created, + +```bash +$ kubectl describe backupconfiguration -n demo pause-backup +Name: pause-backup +Namespace: demo +Labels: +Annotations: kubectl.kubernetes.io/last-applied-configuration: + {"apiVersion":"stash.appscode.com/v1beta1","kind":"BackupConfiguration","metadata":{"annotations":{},"name":"pause-backup","namespace":"de... +API Version: stash.appscode.com/v1beta1 +Kind: BackupConfiguration +Metadata: + Creation Timestamp: 2019-08-02T06:13:05Z + Finalizers: + stash.appscode.com + Generation: 2 + Resource Version: 39756 + Self Link: /apis/stash.appscode.com/v1beta1/namespaces/demo/backupconfigurations/pause-backup + UID: 96ed2068-a1da-419b-bae3-478f1b876000 +Spec: + Paused: true + Repository: + Name: gcs-repo + Retention Policy: + Keep Last: 5 + Name: keep-last-5 + Prune: true + Schedule: */1 * * * * + Target: + Paths: + /source/data + Ref: + API Version: apps/v1 + Kind: Deployment + Name: stash-demo + Volume Mounts: + Mount Path: /source/data + Name: source-data +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Backup Skipped 29s Backup Triggering CronJob Skipping creating BackupSession. Reason: Backup Configuration demo/pause-backup is paused. +``` + +**Verify Instant Backup Get Skipped:** + +If we try to trigger an instant backup by creating a `BackupSession` manually, it will be ignored. The sidecar container will write an event to the BackupSession describing why it has skipped taking the backup. + +Below is the YAML of the `BackupSession` that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupSession +metadata: + labels: + stash.appscode.com/backup-configuration: pause-backup + name: instant-backupsession + namespace: demo +spec: + invoker: + apiGroup: stash.appscode.com + kind: BackupConfiguration + name: pause-backup +``` + +Let's create the `BackupSession` we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/use-cases/pause-backup/examples/backupsession.yaml +backupsession.stash.appscode.com/instant-backupsession created +``` + +Run the following command to watch the BackupSession phase, + +```bash +$ watch -n 1 kubectl get backupsession -n demo instant-backupsession +Every 1.0s: kubectl get backupsession -n demo instant-backupsession suaas-appscode: Fri Aug 2 11:56:24 2019 + +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +instant-backupsession BackupConfiguration pause-backup Skipped 3m22s +``` + +Notice the `PHASE` column. It is showing that the `BackupSession` has been skipped. + +If you describe the `BackupSession` object you are going to see that there is an event explaining why it has been skipped. + +```bash +$ kubectl describe backupsession -n demo instant-backupsession +Name: instant-backupsession +Namespace: demo +Labels: stash.appscode.com/backup-configuration=pause-backup +Annotations: kubectl.kubernetes.io/last-applied-configuration: + {"apiVersion":"stash.appscode.com/v1beta1","kind":"BackupSession","metadata":{"annotations":{},"labels":{"stash.appscode.com/backup-config... +API Version: stash.appscode.com/v1beta1 +Kind: BackupSession +Metadata: + Creation Timestamp: 2019-08-02T06:16:53Z + Generation: 1 + Resource Version: 40010 + Self Link: /apis/stash.appscode.com/v1beta1/namespaces/demo/backupsessions/instant-backupsession + UID: 6a44adab-e44e-4020-9c23-7545e3b3f13b +Spec: + Invoker: + API Group: stash.appscode.com + Kind: BackupConfiguration + Name: pause-backup +Status: + Phase: Skipped +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Warning BackupSessionSkipped 5s BackupSession Controller Backup Configuration is paused + Warning BackupSessionSkipped 5s BackupSession Controller Backup Configuration is paused +``` + +## Resume Backup + +You can resume backup by setting `spec.paused: false` in BackupConfiguration crd. and applying the update or you can patch BackupConfiguration using, + +```bash +$ kubectl patch backupconfiguration -n demo pause-backup --type="merge" --patch='{"spec": {"paused": false}}' +backupconfiguration.stash.appscode.com/pause-backup patched +``` + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo deployment stash-demo +kubectl delete -n demo backupconfiguration pause-backup +kubectl delete -n demo repository gce-repo +kubectl delete -n demo backupsession deployment-backupsession +kubectl delete -n demo secret gce-secret +kubectl delete -n demo pvc --all +``` diff --git a/content/docs/v2024.12.18/guides/volumes/_index.md b/content/docs/v2024.12.18/guides/volumes/_index.md new file mode 100644 index 0000000000..7660100dbf --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumes/_index.md @@ -0,0 +1,77 @@ +--- +title: Volume Backup | Stash +menu: + docs_v2024.12.18: + identifier: volume-backup + name: Stand-alone Volumes + parent: guides + weight: 30 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/guides/volumes/overview/images/volume_backup_overview.svg b/content/docs/v2024.12.18/guides/volumes/overview/images/volume_backup_overview.svg new file mode 100644 index 0000000000..8b13582e0a --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumes/overview/images/volume_backup_overview.svg @@ -0,0 +1,942 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/guides/volumes/overview/images/volume_restore_overview.svg b/content/docs/v2024.12.18/guides/volumes/overview/images/volume_restore_overview.svg new file mode 100644 index 0000000000..65ce526ead --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumes/overview/images/volume_restore_overview.svg @@ -0,0 +1,822 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/guides/volumes/overview/index.md b/content/docs/v2024.12.18/guides/volumes/overview/index.md new file mode 100644 index 0000000000..d4f09108a1 --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumes/overview/index.md @@ -0,0 +1,149 @@ +--- +title: Stand-alone Volume Backup Overview | Stash +description: An overview on how stand-alone volume backup works in Stash. +menu: + docs_v2024.12.18: + identifier: volume-backup-overview + name: How does it work? + parent: volume-backup + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Stand-alone Volume Backup Overview + +If you are using a volume that can be mounted in multiple workloads, aka `ReadWriteMany`/`RWX`, you might want to backup the volume independent of the workloads. Stash supports backup of stand-alone volumes. This guide will give you an overview of how stand-alone volume backup and restore process works in Stash. + +## How Backup Works + +The following diagram shows how Stash takes backup of a stand-alone volume. Open the image in a new tab to see the enlarged version. + +
+  Stand-alone Volume Backup Overview +
Fig: Stand-alone Volume Backup Overview
+
+ +The backup process consists of the following steps: + +1. At first, a user creates a secret with access credentials of the backend where the backed up data will be stored. + +2. Then, she creates a `Repository` crd that specifies the backend information along with the secret that holds the credentials to access the backend. + +3. Then, she creates a `BackupConfiguration` crd targeting the volume. The `BackupConfiguration` object also specifies the `Task` to use to backup the volume. + +4. Stash operator watches for `BackupConfiguration` crd. + +5. Once Stash operator finds a `BackupConfiguration` crd, it creates a CronJob with the schedule specified in `BackupConfiguration` object to trigger backup periodically. + +6. On next scheduled slot, the CronJob triggers a backup by creating a `BackupSession` crd. + +7. Stash operator also watches for `BackupSession` crd. + +8. When it finds a `BackupSession` object, it resolves the respective `Task` and `Function` and prepares a backup Job definition. + +9. Then, it mounts the targeted volume into the Job and creates it. + +10. The Job takes backup of the targeted volume. + +11. Finally, when backup is completed, the Job sends Prometheus metrics to the Pushgateway running inside Stash operator pod. It also updates the `BackupSession` and `Repository` status to reflect the backup procedure. + +## How Restore Works + +The following diagram shows how Stash restores backed up data into a stand-alone volume. Open the image in a new tab to see the enlarged version. + +
+  Stand-alone Volume Restore Overview +
Fig: Stand-alone Volume Restore Overview
+
+ +The restore process consists of the following steps: + +1. At first, a user creates a `RestoreSession` crd which specifies the targeted volume where the backed up data will be restored and the `Repository` crd which holds the backend information where the backed up data has been stored. It also specifies the `Task` to use to restore the target. + +2. Stash operator watches for `RestoreSession` object. + +3. Once it finds a `RestoreSession` object, it resolves the respective `Task` and `Function` and prepares a restore Job definition. + +4. Then, it mounts the targeted volume into the Job and creates it. + +5. The Job restores the backed up data into the volume. + +6. Finally, when the restore process is completed, the Job sends Prometheus metrics to the Pushgateway and update the `RestoreSession` status to reflect restore completion. + +### Why use Function-Task model to backup or restore a volume + +You might be wondering why we have used [Function](/docs/v2024.12.18/concepts/crds/function/) and [Task](/docs/v2024.12.18/concepts/crds/task/) to backup or restore a volume. Well, let us explain. + +`Function-Task` model gives you the flexibility to customize the backup/restore process. For example, it enables you to execute some logic to prepare your apps before backup or execute logic to delete corrupted data before restore. For more details about what are the others benefits of `Function-Task` model, please visit [here](/docs/v2024.12.18/concepts/crds/task/##why-function-and-task). + +## Next Steps + +- Learn how to backup and restore a stand-alone PVC from [here](/docs/v2024.12.18/guides/volumes/pvc/). diff --git a/content/docs/v2024.12.18/guides/volumes/pvc/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/guides/volumes/pvc/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..9e26b09a52 --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumes/pvc/examples/backupconfiguration.yaml @@ -0,0 +1,20 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: nfs-pvc-backup + namespace: demo +spec: + task: + name: pvc-backup + repository: + name: gcs-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: v1 + kind: PersistentVolumeClaim + name: nfs-pvc + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/guides/volumes/pvc/examples/pod-1.yaml b/content/docs/v2024.12.18/guides/volumes/pvc/examples/pod-1.yaml new file mode 100644 index 0000000000..2c0929e070 --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumes/pvc/examples/pod-1.yaml @@ -0,0 +1,18 @@ +kind: Pod +apiVersion: v1 +metadata: + name: demo-pod-1 + namespace: demo +spec: + containers: + - name: busybox + image: busybox + command: ["/bin/sh", "-c","echo 'hello from pod 1.' > /sample/data/hello.txt && sleep 3000"] + volumeMounts: + - name: my-volume + mountPath: /sample/data + subPath: pod-1/data + volumes: + - name: my-volume + persistentVolumeClaim: + claimName: nfs-pvc diff --git a/content/docs/v2024.12.18/guides/volumes/pvc/examples/pod-2.yaml b/content/docs/v2024.12.18/guides/volumes/pvc/examples/pod-2.yaml new file mode 100644 index 0000000000..b8a0ec7bae --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumes/pvc/examples/pod-2.yaml @@ -0,0 +1,18 @@ +kind: Pod +apiVersion: v1 +metadata: + name: demo-pod-2 + namespace: demo +spec: + containers: + - name: busybox + image: busybox + command: ["/bin/sh", "-c","echo 'hello from pod 2.' > /sample/data/hello.txt && sleep 3000"] + volumeMounts: + - name: my-volume + mountPath: /sample/data + subPath: pod-2/data + volumes: + - name: my-volume + persistentVolumeClaim: + claimName: nfs-pvc diff --git a/content/docs/v2024.12.18/guides/volumes/pvc/examples/pv.yaml b/content/docs/v2024.12.18/guides/volumes/pvc/examples/pv.yaml new file mode 100644 index 0000000000..582bb70467 --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumes/pvc/examples/pv.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: PersistentVolume +metadata: + name: nfs-pv + labels: + app: nfs-demo +spec: + capacity: + storage: 1Gi + accessModes: + - ReadWriteMany + nfs: + server: "nfs-service.storage.svc.cluster.local" + path: "/" diff --git a/content/docs/v2024.12.18/guides/volumes/pvc/examples/pvc.yaml b/content/docs/v2024.12.18/guides/volumes/pvc/examples/pvc.yaml new file mode 100644 index 0000000000..5203a8033e --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumes/pvc/examples/pvc.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: nfs-pvc + namespace: demo +spec: + accessModes: + - ReadWriteMany + storageClassName: "" + resources: + requests: + storage: 1Gi + selector: + matchLabels: + app: nfs-demo diff --git a/content/docs/v2024.12.18/guides/volumes/pvc/examples/repository.yaml b/content/docs/v2024.12.18/guides/volumes/pvc/examples/repository.yaml new file mode 100644 index 0000000000..3c4c337325 --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumes/pvc/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: stash-backup/volumes/nfs-pvc + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/guides/volumes/pvc/examples/restoresession.yaml b/content/docs/v2024.12.18/guides/volumes/pvc/examples/restoresession.yaml new file mode 100644 index 0000000000..e7bd42eb5b --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumes/pvc/examples/restoresession.yaml @@ -0,0 +1,17 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: nfs-pvc-restore + namespace: demo +spec: + task: + name: pvc-restore + repository: + name: gcs-repo + target: + ref: + apiVersion: v1 + kind: PersistentVolumeClaim + name: nfs-pvc + rules: + - snapshots: ["latest"] diff --git a/content/docs/v2024.12.18/guides/volumes/pvc/images/pvc_repo.png b/content/docs/v2024.12.18/guides/volumes/pvc/images/pvc_repo.png new file mode 100644 index 0000000000..908b51fbc1 Binary files /dev/null and b/content/docs/v2024.12.18/guides/volumes/pvc/images/pvc_repo.png differ diff --git a/content/docs/v2024.12.18/guides/volumes/pvc/index.md b/content/docs/v2024.12.18/guides/volumes/pvc/index.md new file mode 100644 index 0000000000..b8e2b5a550 --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumes/pvc/index.md @@ -0,0 +1,580 @@ +--- +title: Backup Stand-alone PVC | Stash +description: A step by step guide on how to backup a stand-alone PVC using Stash. +menu: + docs_v2024.12.18: + identifier: volume-backup-pvc + name: Backup & Restore a Stand-alone PVC + parent: volume-backup + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup Stand-alone PVC using Stash + +This guide will show you how to backup a stand-alone PersistentVolumeClaim (PVC) using Stash. Here, we are going to backup a PVC provisioned using an NFS server into a GCS bucket. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). + +- Install `Stash` in your cluster following the steps [here](/docs/v2024.12.18/setup/README). + +- You will need to have a PVC with `ReadWriteMany` access mode. Here, we are going to use an NFS server to provision a PVC with `ReadWriteMany` access mode. If you don't have an NFS server running, deploy one by following the guide [here](https://github.com/appscode/third-party-tools/blob/master/storage/nfs/README.md). + +- You should be familiar with the following `Stash` concepts: + - [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) + - [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) + - [Repository](/docs/v2024.12.18/concepts/crds/repository/) + - [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + - [Function](/docs/v2024.12.18/concepts/crds/function/) + - [Task](/docs/v2024.12.18/concepts/crds/task/) + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> **Note:** YAML files used in this tutorial are stored in [docs/guides/volumes/pvc/examples](/docs/v2024.12.18/guides/volumes/pvc/examples) directory of [stashed/docs](https://github.com/stashed/docs) repository. + +**Verify necessary Function and Task:** + +Stash uses a `Function-Task` model to backup stand-alone volume. When you install Stash, it automatically creates the necessary `Function` and `Task` to backup a stand-alone volume. + +Let's verify that Stash has created the necessary `Function` to backup/restore PVC by the following command, + +```bash +$ kubectl get function +NAME AGE +pvc-backup 117m +pvc-restore 117m +update-status 117m +``` + +Also, verify that the necessary `Task` has been created, + +```bash +$ kubectl get task +NAME AGE +pvc-backup 118m +pvc-restore 118m +``` + +## Prepare Volume + +At first, let's prepare our desired PVC. Here, we are going to create a [PersistentVolume](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) (PV) that will use an NFS server as storage. Then, we are going to create a PVC that will bind with the PV. Then, we are going to mount this PVC in two different pods. Each pod will generate a sample file into the PVC. + +**Create PersistentVolume:** + +We have deployed an NFS server in `storage` namespace and it is accessible through a Service named `nfs-service`. Now, we are going to create a PV that uses the NFS server as storage. + +Below is the YAML of the PV that we are going to create, + +```yaml +apiVersion: v1 +kind: PersistentVolume +metadata: + name: nfs-pv + labels: + app: nfs-demo +spec: + capacity: + storage: 1Gi + accessModes: + - ReadWriteMany + nfs: + server: "nfs-service.storage.svc.cluster.local" + path: "/" +``` + +Notice the `metadata.labels` section. Here, we have added `app: nfs-demo` label. We are going to use this label as selector in PVC so that the PVC binds with this PV. + +Let's create the PV we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumes/pvc/examples/pv.yaml +persistentvolume/nfs-pv created +``` + +**Create PersistentVolumeClaim:** + +Now, create a PVC to bind with the PV we have just created. Below, is the YAML of the PVC that we are going to create, + +```yaml +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: nfs-pvc + namespace: demo +spec: + accessModes: + - ReadWriteMany + storageClassName: "" + resources: + requests: + storage: 1Gi + selector: + matchLabels: + app: nfs-demo +``` + +Notice the `spec.accessModes` section. We are using `ReadWriteMany` access mode so that multiple pods can use this PVC simultaneously. Without this access mode, Stash will fail to backup the volume if any other pod mount it during backup. + +Also, notice the `spec.selector` section. We have specified `app: nfs-demo` labels as a selector so that it binds with the PV that we have created earlier. + +Let's create the PVC we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumes/pvc/examples/pvc.yaml +persistentvolumeclaim/nfs-pvc created +``` + +Verify that the PVC has bounded with our desired PV, + +```bash +$ kubectl get pvc -n demo nfs-pvc +NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE +nfs-pvc Bound nfs-pv 1Gi RWX 32s +``` + +Here, we can see that the PVC `nfs-pvc` has been bounded with PV `nfs-pv`. + +**Deploy Workload:** + +Now, we are going to deploy two sample pods `demo-pod-1` and `demo-pod-2` that will mount `pod-1/data` and `pod-2/data` [subPath](https://kubernetes.io/docs/concepts/storage/volumes/#using-subpath) of the `nfs-pvc` respectively. Each of the pods will generate a sample file named `hello.txt` with some demo data. We are going to backup the entire PVC using Stash that contains the sample files. + +Below, is the YAML of the first pod that we are going to deploy, + +```yaml +kind: Pod +apiVersion: v1 +metadata: + name: demo-pod-1 + namespace: demo +spec: + containers: + - name: busybox + image: busybox + command: ["/bin/sh", "-c","echo 'hello from pod 1.' > /sample/data/hello.txt && sleep 3000"] + volumeMounts: + - name: my-volume + mountPath: /sample/data + subPath: pod-1/data + volumes: + - name: my-volume + persistentVolumeClaim: + claimName: nfs-pvc +``` + +Here, we have mounted `pod-1/data` directory of the `nfs-pvc` into `/sample/data` directory of this pod. + +Let's deploy the pod we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumes/pvc/examples/pod-1.yaml +pod/demo-pod-1 created +``` + +Verify that the sample data has been generated into `/sample/data/` directory, + +```bash +$ kubectl exec -n demo demo-pod-1 cat /sample/data/hello.txt +hello from pod 1. +``` + +Below is the YAML of the second pod that we are going to deploy, + +```yaml +kind: Pod +apiVersion: v1 +metadata: + name: demo-pod-2 + namespace: demo +spec: + containers: + - name: busybox + image: busybox + command: ["/bin/sh", "-c","echo 'hello from pod 2.' > /sample/data/hello.txt && sleep 3000"] + volumeMounts: + - name: my-volume + mountPath: /sample/data + subPath: pod-2/data + volumes: + - name: my-volume + persistentVolumeClaim: + claimName: nfs-pvc +``` + +Now, we have mounted `pod-2/data` directory of the `nfs-pvc` into `/sample/data` directory of this pod. + +Let's create the pod we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumes/pvc/examples/pod-2.yaml +pod/demo-pod-2 created +``` + +Verify that the sample data has been generated into `/sample/data/` directory, + +```bash +$ kubectl exec -n demo demo-pod-2 cat /sample/data/hello.txt +hello from pod 2. +``` + +## Backup + +Now, we are going to backup the PVC `nfs-pvc` in a GCS bucket using Stash. We have to create a Secret and a `Repository` object with access credentials and backend information respectively. + +> For GCS backend, if the bucket does not exist, Stash needs `Storage Object Admin` role permissions to create the bucket. For more details, please check the following [guide](/docs/v2024.12.18/guides/backends/gcs/). + +**Create Storage Secret:** + +Let's create a Secret named `gcs-secret` with access credentials of our desired GCS backend, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat /path/to/downloaded/sa_key_file.json > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create Repository:** + +Now, create a `Repository` crd specifying the desired bucket, and directory inside the bucket where the backed up data will be stored. + +Below is the YAML of `Repository` crd that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: stash-backup/volumes/nfs-pvc + storageSecretName: gcs-secret +``` + +Let's create the `Repository` object that we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumes/pvc/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +We are ready to start taking backup. Now, we have to create a `BackupConfiguration` object targeting `nfs-pvc`. + +**Create BackupConfiguration:** + +Below is the YAML of the `BackupConfiguration` object that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: nfs-pvc-backup + namespace: demo +spec: + task: + name: pvc-backup + repository: + name: gcs-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: v1 + kind: PersistentVolumeClaim + name: nfs-pvc + retentionPolicy: + name: keep-last-5 + keepLast: 5 + prune: true +``` + +Here, + +- `spec.task.name` specifies the name of the `Task` object that specifies the `Function` and their order of execution to perform a backup of a stand-alone PVC. +- `spec.repository.name` specifies the name of the `Repository` object that holds the backend information where the backed up data has been stored. +- `spec.target.ref` refers to the targeted PVC that will be backed up. + +Let's create the `BackupConfiguration` object that we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumes/pvc/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/nfs-pvc-backup created +``` + +**Verify Backup Setup Successful** + +If everything goes well, the phase of the `BackupConfiguration` should be in `Ready` state. The `Ready` phase indicates that the backup setup is successful. Let's check the `Phase` of the BackupConfiguration, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +nfs-pvc-backup pvc-backup */5 * * * * Ready 11s +``` + +**Verify CronJob:** + +Verify that Stash has created a CronJob to trigger a periodic backup of the targeted PVC by the following command, + +```bash +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +nfs-pvc-backup */5 * * * * False 0 28s +``` + +**Wait for BackupSession:** + +Now, wait for the next backup schedule. You can watch for `BackupSession` crd using the following command, + +```bash +$ watch -n 1 kubectl get backupsession -n demo -l=stash.appscode.com/backup-configuration=nfs-pvc-backup + +Every 1.0s: kubectl get backupsession -n demo -l=stash.appscode.com/backup-... workstation: Wed Jul 3 19:53:13 2019 + +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +nfs-pvc-backup-1562161802 BackupConfiguration nfs-pvc-backup Succeeded 3m11s +``` + +> Note: Respective CronJob creates `BackupSession` crd with the following label: `stash.appscode.com/backup-configuration=`. We can use this label to watch only the `BackupSession` of our desired `BackupConfiguration`. + +**Verify Backup:** + +When backup session is completed, Stash will update the respective `Repository` to reflect the latest state of backed up data. + +Run the following command to check if a backup snapshot has been stored in the backend, + +```bash +$ kubectl get repository -n demo gcs-repo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo true 80 B 1 25s 49m +``` + +From the output above, we can see that 1 snapshot has been stored in the backend specified by Repository `gcs-repo`. + +If we navigate to `stash-backup/volumes/nfs-pvc` directory of our GCS bucket, we are going to see that the snapshot has been stored there. + +
+  Backed up data of a stand-alone PVC in GCS backend +
Fig: Backed up data of a stand-alone PVC in GCS backend
+
+ +> Stash keeps all backup data encrypted. So, snapshot files in the bucket will not contain any meaningful data until they are decrypted. + +## Restore + +This section will show you how to restore the backed up data inside a stand-alone PVC using stash. Here, we are going to restore the data we have backed up in the previous section. + +**Stop Taking Backup of the PVC:** + +At first, let's stop taking any further backup of the PVC so that no backup is taken during the restore process. We are going to pause the `BackupConfiguration` that we created to backup the `nfs-pvc` PVC. Then, Stash will stop taking any further backup for this PVC. You can learn more how to pause a scheduled backup [here](/docs/v2024.12.18/guides/use-cases/pause-backup/). + +Let's pause the `nfs-pvc-backup` BackupConfiguration, + +```bash +$ kubectl patch backupconfiguration -n demo nfs-pvc-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/nfs-pvc-backup patched +``` + +Now, wait for a moment. Stash will pause the BackupConfiguration. Verify that the BackupConfiguration has been paused, + +```bash +$ kubectl get backupconfiguration -n demo nfs-pvc-backup +NAME TASK SCHEDULE PAUSED AGE +nfs-pvc-backup */5 * * * * true 20m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the BackupConfiguration has been paused. + +**Simulate Disaster:** + +At first, let's simulate a disaster scenario. Let's delete all the files from the PVC. + +Delete the data of pod `demo-pod-1`: + +```bash +# delete data +$ kubectl exec -n demo demo-pod-1 -- sh -c "rm /sample/data/*" + +# verify that data has been removed successfully +$ kubectl exec -n demo demo-pod-1 ls /sample/data/ +# empty output which means all the files have been deleted +``` + +Delete the data of pod `demo-pod-2`: + +```bash +# delete data +$ kubectl exec -n demo demo-pod-2 -- sh -c "rm /sample/data/*" + +# verify that data has been removed successfully +$ kubectl exec -n demo demo-pod-2 ls /sample/data/ +# empty output which means all the files have been deleted +``` + +**Create RestoreSession:** + +Now, we are going to create a `RestoreSession` object to restore the backed up data into the desired PVC. Below is the YAML of the `RestoreSession` object that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: nfs-pvc-restore + namespace: demo +spec: + task: + name: pvc-restore + repository: + name: gcs-repo + target: + ref: + apiVersion: v1 + kind: PersistentVolumeClaim + name: nfs-pvc + rules: + - snapshots: ["latest"] +``` + +- `spec.task.name` specifies the name of the `Task` object that specifies the `Function` and their order of execution to restore data inside a stand-alone PVC. +- `spec.target.ref` refers to the targeted PVC where the data will be restored. +- `spec.target.rules[*].snapshots` specifies that we want to restore the latest snapshot of the `nfs-pvc`. + +Let's create the `RestoreSession` object that we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumes/pvc/examples/restoresession.yaml +restoresession.stash.appscode.com/nfs-pvc-restore created +``` + +**Wait for RestoreSession to Succeed:** + +Now, wait for the restore process to complete. You can watch the `RestoreSession` phase using the following command, + +```bash +$ watch -n 1 kubectl get restoresession -n demo nfs-pvc-restore + +Every 1.0s: kubectl get restoresession -n demo nfs-pvc-restore workstation: Wed Jul 3 20:10:52 2019 +NAME REPOSITORY-NAME PHASE AGE +nfs-pvc-restore gcs-repo Succeeded 32s +``` + +From the output of the above command, we can see that restoration process has been completed successfully. + +**Verify Restored Data:** + +Let's verify if the deleted files have been restored successfully into the PVC. We are going to exec into individual pod and check whether the sample data exist or not. + +Verify that the data of `demo-pod-1` has been restored: + +```bash +$ kubectl exec -n demo demo-pod-1 cat /sample/data/hello.txt +hello from pod 1. +``` + +Verify that the data of `demo-pod-2` has been restored: + +```bash +$ kubectl exec -n demo demo-pod-2 cat /sample/data/hello.txt +hello from pod 2. +``` + +So, we can see from the above output that the files we had deleted in **Simulate Disaster** section have been restored successfully. + +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete backupconfiguration -n demo nfs-pvc-backup +kubectl delete restoresession -n demo nfs-pvc-restore + +kubectl delete secret -n demo gcs-secret +kubectl delete repository -n demo gcs-repo + +kubectl delete pod -n demo demo-pod-1 +kubectl delete pod -n demo demo-pod-2 + +kubectl delete pvc -n demo nfs-pvc +kubectl delete pv -n demo nfs-pv +``` + +If you would like to uninstall Stash operator, please follow the steps [here](/docs/v2024.12.18/setup/README). diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/_index.md b/content/docs/v2024.12.18/guides/volumesnapshot/_index.md new file mode 100644 index 0000000000..c7cd0fb4c0 --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/_index.md @@ -0,0 +1,77 @@ +--- +title: Volume Snapshot | Stash +menu: + docs_v2024.12.18: + identifier: volume-snapshot + name: Volume Snapshot + parent: guides + weight: 70 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/deployment/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/guides/volumesnapshot/deployment/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..743416c868 --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/deployment/examples/backupconfiguration.yaml @@ -0,0 +1,18 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployments-volume-snapshot + namespace: demo +spec: + schedule: "*/5 * * * *" + driver: VolumeSnapshotter + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + snapshotClassName: csi-snapshot-class + retentionPolicy: + name: "keep-last-5" + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/deployment/examples/deployment.yaml b/content/docs/v2024.12.18/guides/volumesnapshot/deployment/examples/deployment.yaml new file mode 100644 index 0000000000..98c57df827 --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/deployment/examples/deployment.yaml @@ -0,0 +1,37 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-demo + name: stash-demo + namespace: demo +spec: + replicas: 1 + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - args: ["echo sample_data > /source/data/data.txt; echo sample_config > /source/config/config.cfg && sleep 3000"] + command: ["/bin/sh", "-c"] + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + - mountPath: /source/config + name: source-config + restartPolicy: Always + volumes: + - name: source-data + persistentVolumeClaim: + claimName: source-data + - name: source-config + persistentVolumeClaim: + claimName: source-config diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/deployment/examples/pvcs.yaml b/content/docs/v2024.12.18/guides/volumesnapshot/deployment/examples/pvcs.yaml new file mode 100644 index 0000000000..3a7e5211a4 --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/deployment/examples/pvcs.yaml @@ -0,0 +1,25 @@ +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: source-data + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: csi-standard + resources: + requests: + storage: 1Gi +--- +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: source-config + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: csi-standard + resources: + requests: + storage: 1Gi diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/deployment/examples/restored-deployment.yaml b/content/docs/v2024.12.18/guides/volumesnapshot/deployment/examples/restored-deployment.yaml new file mode 100644 index 0000000000..72af01085c --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/deployment/examples/restored-deployment.yaml @@ -0,0 +1,38 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: restore-demo + name: restore-demo + namespace: demo +spec: + replicas: 1 + selector: + matchLabels: + app: restore-demo + template: + metadata: + labels: + app: restore-demo + name: busybox + spec: + containers: + - args: + - sleep + - "3600" + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /restore/data + name: restore-data + - mountPath: /restore/config + name: restore-config + restartPolicy: Always + volumes: + - name: restore-data + persistentVolumeClaim: + claimName: restore-data + - name: restore-config + persistentVolumeClaim: + claimName: restore-config diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/deployment/examples/restoresession.yaml b/content/docs/v2024.12.18/guides/volumesnapshot/deployment/examples/restoresession.yaml new file mode 100644 index 0000000000..b80e1e2219 --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/deployment/examples/restoresession.yaml @@ -0,0 +1,33 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: restore-pvc + namespace: demo +spec: + driver: VolumeSnapshotter + target: + volumeClaimTemplates: + - metadata: + name: restore-data + spec: + accessModes: ["ReadWriteOnce"] + storageClassName: "csi-standard" + resources: + requests: + storage: 1Gi + dataSource: + kind: VolumeSnapshot + name: source-data-fnbwz + apiGroup: snapshot.storage.k8s.io + - metadata: + name: restore-config + spec: + accessModes: ["ReadWriteOnce"] + storageClassName: "csi-standard" + resources: + requests: + storage: 1Gi + dataSource: + kind: VolumeSnapshot + name: source-config-fnbwz + apiGroup: snapshot.storage.k8s.io diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/deployment/examples/storageclass.yaml b/content/docs/v2024.12.18/guides/volumesnapshot/deployment/examples/storageclass.yaml new file mode 100644 index 0000000000..e1fa0f0231 --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/deployment/examples/storageclass.yaml @@ -0,0 +1,9 @@ +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: csi-standard +parameters: + type: pd-standard +provisioner: pd.csi.storage.gke.io +reclaimPolicy: Delete +volumeBindingMode: Immediate diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/deployment/examples/volumesnapshotclass.yaml b/content/docs/v2024.12.18/guides/volumesnapshot/deployment/examples/volumesnapshotclass.yaml new file mode 100644 index 0000000000..382ba7d1d6 --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/deployment/examples/volumesnapshotclass.yaml @@ -0,0 +1,6 @@ +apiVersion: snapshot.storage.k8s.io/v1 +kind: VolumeSnapshotClass +metadata: + name: csi-snapshot-class +driver: pd.csi.storage.gke.io +deletionPolicy: Delete diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/deployment/images/gcp.png b/content/docs/v2024.12.18/guides/volumesnapshot/deployment/images/gcp.png new file mode 100644 index 0000000000..363c0023bd Binary files /dev/null and b/content/docs/v2024.12.18/guides/volumesnapshot/deployment/images/gcp.png differ diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/deployment/index.md b/content/docs/v2024.12.18/guides/volumesnapshot/deployment/index.md new file mode 100644 index 0000000000..1f9ee3fffd --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/deployment/index.md @@ -0,0 +1,592 @@ +--- +title: Snapshot Deployment Volumes | Stash +description: An step by step guide showing how to snapshot the volumes of a Deployment +menu: + docs_v2024.12.18: + identifier: volume-snapshot-deployment + name: Snapshot Deployment Volumes + parent: volume-snapshot + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Snapshotting the volumes of a Deployment + +This guide will show you how to use Stash to snapshot the volumes of a Deployment and restore them from the snapshots using Kubernetes [VolumeSnapshot](https://kubernetes.io/docs/concepts/storage/volume-snapshots/) API. In this guide, we are going to backup the volumes in Google Cloud Platform with the help of [GCE Persistent Disk CSI Driver](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver). + +## Before You Begin + +- You need to be familiar with the [GCE Persistent Disk CSI Driver](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver). +- Install `Stash` in your cluster following the steps [here](/docs/v2024.12.18/setup/README). +- If you don't know how VolumeSnapshot works in Stash, please visit [here](/docs/v2024.12.18/guides/volumesnapshot/overview/). + +## Prepare for VolumeSnapshot + +Here, we are going to create `StorageClass` that uses [GCE Persistent Disk CSI Driver](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver). + +Below is the YAML of the `StorageClass` we are going to use, + +```yaml +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: csi-standard +parameters: + type: pd-standard +provisioner: pd.csi.storage.gke.io +reclaimPolicy: Delete +volumeBindingMode: Immediate +``` + +Let's create the `StorageClass` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumesnapshot/deployment/examples/storageclass.yaml +storageclass.storage.k8s.io/csi-standard created +``` + +We also need a `VolumeSnapshotClass`. Below is the YAML of the `VolumeSnapshotClass` we are going to use, + +```yaml +apiVersion: snapshot.storage.k8s.io/v1 +kind: VolumeSnapshotClass +metadata: + name: csi-snapshot-class +driver: pd.csi.storage.gke.io +deletionPolicy: Delete +``` + +Here, + +- `driver` field to point to the respective CSI driver that is responsible for taking snapshot. As we are using [GCE Persistent Disk CSI Driver](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver), we are going to use `pd.csi.storage.gke.io` in this field. + +Let's create the `volumeSnapshotClass` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumesnapshot/deployment/examples/volumesnapshotclass.yaml +volumesnapshotclass.snapshot.storage.k8s.io/csi-snapshot-class created +``` + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> Note: YAML files used in this tutorial are stored in [/docs/guides/volumesnapshot/deployment/examples](/docs/v2024.12.18/guides/volumesnapshot/deployment/examples/) directory of [stashed/docs](https://github.com/stashed/docs) repository. + +## Take Volume Snapshot + +Here, we are going to deploy a Deployment with two PVCs and generate some sample data in it. Then, we are going to take snapshot of these PVCs using Stash. + +**Create PersistentVolumeClaim :** + +At first, let's create two sample PVCs. We are going to mount these PVCs in our targeted Deployment. + +Below is the YAML of the sample PVCs, + +```yaml +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: source-data + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: csi-standard + resources: + requests: + storage: 1Gi +--- +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: source-config + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: csi-standard + resources: + requests: + storage: 1Gi +``` + +:et's create the PVCs we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumesnapshot/deployment/examples/pvcs.yaml +persistentvolumeclaim/source-data created +persistentvolumeclaim/source-config created +``` + +**Deploy Deployment :** + +Now, we are going to deploy a Deployment that uses the above PVCs. This Deployment will automatically create `data.txt` and `config.cfg` file in `/source/data` and `/source/config` directory. + +Below is the YAML of the Deployment that we are going to create, + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-demo + name: stash-demo + namespace: demo +spec: + replicas: 1 + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - args: ["echo sample_data > /source/data/data.txt; echo sample_config > /source/config/config.cfg && sleep 3000"] + command: ["/bin/sh", "-c"] + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + - mountPath: /source/config + name: source-config + restartPolicy: Always + volumes: + - name: source-data + persistentVolumeClaim: + claimName: source-data + - name: source-config + persistentVolumeClaim: + claimName: source-config +``` + +Let's create the deployment we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumesnapshot/deployment/examples/deployment.yaml +deployment.apps/stash-demo created +``` + +Now, wait for the pod of the Deployment to go into the `Running` state. + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-demo-7fd48dd5b4-xqv5n 1/1 Running 0 2m10s +``` + +Verify that the sample data has been created in `/source/data` and `/source/config` directory using the following command, + +```bash +$ kubectl exec -n demo stash-demo-7fd48dd5b4-xqv5n -- cat /source/data/data.txt +sample_data +$ kubectl exec -n demo stash-demo-7fd48dd5b4-xqv5n -- cat /source/config/config.cfg +config_data +``` + +**Create BackupConfiguration :** + +Now, create a `BackupConfiguration` object to take snapshot of the PVCs of `stash-demo` Deployment. + +Below is the YAML of the `BackupConfiguration` that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-volume-snapshot + namespace: demo +spec: + schedule: "*/5 * * * *" + driver: VolumeSnapshotter + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + snapshotClassName: csi-snapshot-class + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Here, + +- `spec.schedule` is a [cron expression](https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/#schedule) that indicates `BackupSession` will be created at 5 minutes interval. + +- `spec.driver` indicates the name of the agent to use to back up the target. Currently, Stash supports `Restic` and `VolumeSnapshotter` drivers. The `VolumeSnapshotter` is used to backup/restore PVC using `VolumeSnapshot` API. + +- `spec.target.ref` refers to the backup target. `apiVersion`, `kind` and `name` refers to the `apiVersion`, `kind` and `name` of the targeted workload respectively. Stash will use this information to create a Volume Snapshotter Job for creating VolumeSnapshot. + +- `spec.target.snapshotClassName` indicates the [VolumeSnapshotClass](https://kubernetes.io/docs/concepts/storage/volume-snapshot-classes/) to be used for volume snapshotting. + +Let's create the `BackupConfiguration` object we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumesnapshot/deployment/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/deployment-volume-snapshot created +``` + +**Verify Backup Setup Successful**: + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. Let’s verify the Phase of the `BackupConfiguration`, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +deployment-volume-snapshot */5 * * * * Ready 11s +``` + +**Verify CronJob :** + +Stash will create a CronJob with the schedule specified in `spec.schedule` field of `BackupConfiguration` CRD. Verify that the CronJob has been created using the following command, + +```bash +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +deployment-volume-snapshot */1 * * * * False 0 39s 2m41s +``` + +**Wait for BackupSession :** + +The `deployment-volume-snapshot` CronJob will trigger a backup on each schedule by creating a `BackupSession` crd. + +Wait for the next schedule for backup. Run the following command to watch `BackupSession` crd, + +```bash +$ watch -n 1 kubectl get backupsession -n demo +Every 1.0s: kubectl get backupsession -n demo + +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +deployment-volume-snapshot-fnbwz BackupConfiguration deployment-volume-snapshot Succeeded 50s +``` + +We can see above that the BackupSession has been succeeded. Now, we are going to verify that the `VolumeSnapshot` has been created and the snapshots has been stored in the respective backend. + +**Verify Volume Snapshot :** + +Once a `BackupSession` crd is created, it creates volume snapshotter `Job`. Then the `Job` creates `VolumeSnapshot` crd for the targeted PVCs. + +Check that the `VolumeSnapshot` has been created Successfully. + +```bash +$ kubectl get volumesnapshot -n demo +NAME AGE +source-config-fnbwz 1m46s +source-data-fnbwz 1m46s +``` + +Let's find the name of the snapshot that has been saved in the Google Cloud by the following command, + +```bash +kubectl get volumesnapshot source-data-fnbwz -n demo -o yaml +``` + +```yaml +apiVersion: snapshot.storage.k8s.io/v1 +kind: VolumeSnapshot +metadata: + creationTimestamp: "2019-07-15T06:14:09Z" + finalizers: + - snapshot.storage.kubernetes.io/volumesnapshot-protection + generation: 4 + name: source-data-fnbwz + namespace: demo + resourceVersion: "9220" + selfLink: /apis/snapshot.storage.k8s.io/v1/namespaces/demo/volumesnapshots/source-data-fnbwz + uid: c1bc3390-a6c7-11e9-9f3a-42010a800050 +spec: + source: + persistentVolumeClaimName: source-data + volumeSnapshotClassName: csi-snapshot-class +status: + boundVolumeSnapshotContentName: snapcontent-c1bc3390-a6c7-11e9-9f3a-42010a800050 + creationTime: "2019-07-15T06:14:10Z" + readyToUse: true + restoreSize: 1Gi +``` + +Here, `status.snapshotContentName` field specifies the name of the `VolumeSnapshotContent` crd. It also represents the actual snapshot name that has been saved in Google Cloud. If we navigate to the `Snapshots` tab in the GCP console, we are going to see the snapshot `snapcontent-c1bc3390-a6c7-11e9-9f3a-42010a800050` has been stored successfully. + +
+  Stash Backup Flow +
Fig: Snapshots in GCP
+
+ +## Restore PVC from VolumeSnapshot + +This section will show you how to restore the PVCs from the snapshots we have taken in the previous section. + +**Stop Taking Backup of the Old Deployment:** + +At first, let's stop taking any further backup of the old Deployment so that no backup is taken during the restore process. We are going to pause the `BackupConfiguration` that we created to backup the `stash-demo` Deployment. Then, Stash will stop taking any further backup for this Deployment. You can learn more how to pause a scheduled backup [here](/docs/v2024.12.18/guides/use-cases/pause-backup/) + +Let's pause the `deployment-volume-snapshot` BackupConfiguration, + +```bash +$ kubectl patch backupconfiguration -n demo deployment-volume-snapshot --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/deployment-volume-snapshot patched +``` + +Now, wait for a moment. Stash will pause the BackupConfiguration. Verify that the BackupConfiguration has been paused, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED AGE +deployment-volume-snapshot */1 * * * * true 18m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the BackupConfiguration has been paused. + +**Create RestoreSession :** + +At first, we have to create a `RestoreSession` crd to restore the PVCs from the respective snapshot. + +Below is the YAML of the `RestoreSesion` crd that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: restore-pvc + namespace: demo +spec: + driver: VolumeSnapshotter + target: + volumeClaimTemplates: + - metadata: + name: restore-data + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "csi-standard" + resources: + requests: + storage: 1Gi + dataSource: + kind: VolumeSnapshot + name: source-data-fnbwz + apiGroup: snapshot.storage.k8s.io + - metadata: + name: restore-config + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "csi-standard" + resources: + requests: + storage: 1Gi + dataSource: + kind: VolumeSnapshot + name: source-config-fnbwz + apiGroup: snapshot.storage.k8s.io +``` + +Here, + +- `spec.target.volumeClaimTemplates`: + - `metadata.name` is a template for the name of the restored PVC that will be created by Stash. You have to provide this named template to match with the desired PVC of your Deployment. + - `spec.dataSource`: `spec.dataSource` specifies the source of the data from where the newly created PVC will be initialized. It requires the following fields to be set: + - `apiGroup` is the group for resource being referenced. Now, Kubernetes supports only `snapshot.storage.k8s.io`. + - `kind` is resource of the kind being referenced. Now, Kubernetes supports only `VolumeSnapshot`. + - `name` is the `VolumeSnapshot` resource name. In `RestoreSession` crd, You must set the VolumeSnapshot name directly. + +Let's create the `RestoreSession` crd we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumesnapshot/deployment/examples/restoresession.yaml +restoresession.stash.appscode.com/restore-pvc created +``` + +Once, you have created the `RestoreSession` crd, Stash will create a job to restore. We can watch the `RestoreSession` phase to check if the restore process has been succeeded or not. + +Run the following command to watch RestoreSession phase, + +```bash +$ watch -n 1 kubectl get -n demo restoresession -n +Every 1.0s: kubectl get restore -n demo + +NAME REPOSITORY-NAME PHASE AGE +restore-pvc Running 10s +restore-pvc Succeeded 1m +``` + +So, we can see from the output of the above command that the restore process succeeded. + +**Verify Restored PVC :** + +Once the restore process is complete, we are going to see that new PVCs with the name `restore-data` and `restore-config` have been created. + +Verify that the PVCs have been created by the following command, + +```bash +$ kubectl get pvc -n demo +NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE +restore-config Bound pvc-26758eda-a6ca-11e9-9f3a-42010a800050 1Gi RWO standard 30s +restore-data Bound pvc-267335ff-a6ca-11e9-9f3a-42010a800050 1Gi RWO standard 30s +``` + +Notice the `STATUS` field. It indicates that the respective PV has been provisioned and initialized from the respective VolumeSnapshot by CSI driver and the PVC has been bound with the PV. + +> The [volumeBindingMode](https://kubernetes.io/docs/concepts/storage/storage-classes/#volume-binding-mode) field controls when volume binding and dynamic provisioning should occur. Kubernetes allows `Immediate` and `WaitForFirstConsumer` modes for binding volumes. The `Immediate` mode indicates that volume binding and dynamic provisioning occurs once the PVC is created and `WaitForFirstConsumer` mode indicates that volume binding and provisioning does not occur until a pod is created that uses this PVC. By default `volumeBindingMode` is `Immediate`. + +> If you use `volumeBindingMode: WaitForFirstConsumer`, respective PVC will be initialized from respective VolumeSnapshot after you create a workload with that PVC. In this case, Stash will mark the restore session as completed with phase `Unknown`. + +**Verify Restored Data :** + +We are going to create a new Deployment with the restored PVCs to verify whether the backed up data has been restored. + +Below is the YAML of the Deployment that we are going to create, + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: restore-demo + name: restore-demo + namespace: demo +spec: + replicas: 1 + selector: + matchLabels: + app: restore-demo + template: + metadata: + labels: + app: restore-demo + name: busybox + spec: + containers: + - args: + - sleep + - "3600" + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /restore/data + name: restore-data + - mountPath: /restore/config + name: restore-config + restartPolicy: Always + volumes: + - name: restore-data + persistentVolumeClaim: + claimName: restore-data + - name: restore-config + persistentVolumeClaim: + claimName: restore-config +``` + +Let's create the deployment we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumesnapshot/deployment/examples/restored-deployment.yaml +deployment.apps/restore-demo created +``` + +Now, wait for the pod of the Deployment to go into the `Running` state. + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +restore-demo-544db78b8b-tnzb2 1/1 Running 0 34s +``` + +Verify that the backed up data has been restored in `/restore/data` and `/restore/config` directory using the following command, + +```bash +$ kubectl exec -n demo restore-demo-544db78b8b-tnzb2 ls /restore/config/config.cfg +config_data +$ kubectl exec -n demo restore-demo-544db78b8b-tnzb2 ls /restore/data/data.txt +sample_data +``` + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo deployment stash-demo +kubectl delete -n demo deployment restore-demo +kubectl delete -n demo backupconfiguration deployment-volume-snapshot +kubectl delete -n demo restoresession restore-pvc +kubectl delete -n demo storageclass csi-standard +kubectl delete -n demo volumesnapshotclass csi-snapshot-class +``` diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/overview/images/restore-overview.svg b/content/docs/v2024.12.18/guides/volumesnapshot/overview/images/restore-overview.svg new file mode 100644 index 0000000000..28b2f098e5 --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/overview/images/restore-overview.svg @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/overview/images/volumesnapshot-overview.svg b/content/docs/v2024.12.18/guides/volumesnapshot/overview/images/volumesnapshot-overview.svg new file mode 100644 index 0000000000..a859c04afc --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/overview/images/volumesnapshot-overview.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/overview/index.md b/content/docs/v2024.12.18/guides/volumesnapshot/overview/index.md new file mode 100644 index 0000000000..97d3d5bfbb --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/overview/index.md @@ -0,0 +1,150 @@ +--- +title: VolumeSnapshot Overview | Stash +description: An overview of how VolumeSnapshot works in Stash +menu: + docs_v2024.12.18: + identifier: volume-snapshot-overview + name: How VolumeSnapshot works? + parent: volume-snapshot + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# VolumeSnapshot Using Stash + +This guide will give you an overview of how VolumeSnapshot process works in Stash. + +## How Backup Process Works? + +The following diagram shows how Stash creates VolumeSnapshot via Kubernetes native API. Open the image in a new tab to see the enlarged version. + +
+  Stash Backup Flow +
Fig: Volume Snapshotting Process in Stash
+
+ +The `VolumeSnapshot` process consists of the following steps: + +1. At first, a user creates a `BackupConfiguration` crd which specifies the targeted workload or targeted PVC. + +2. Stash operator watches for `BackupConfiguration` crd. + +3. When it finds a `BackupConfiguration` crd, it creates a `CronJob` to take a periodic backup of the target volumes. + +4. The `CronJob` triggers backup on each scheduled time slot by creating a `BackupSession` crd. + +5. Stash operator watches for `BackupSession` crd. + +6. When it finds a `BackupSession` crd, it creates a volume snapshotter `Job` to take snapshot of the targeted volumes. + +7. The volume snapshotter `Job` creates `VolumeSnapshot` crd for each PVC of the target and waits for the CSI driver to complete snapshotting. These `VolumeSnasphot` crd names follow the following format: +```bash + - +``` + +8. CSI `external-snapshotter` controller watches for `VolumeSnapshot`. + +9. When it finds a `VolumeSnapshot` object, it backups `VolumeSnapshot` in the respective cloud storage. + +10. Once the snapsotting is completed, Stash Operator updates the `status.phase` field of the `BackupSession` crd. + +## How Restore Process Works? + +The following diagram shows how Stash restores PersistentVolumeClaims from snapshot using Kubernetes VolumeSnapshot API. Open the image in a new tab to see the enlarged version. + +
+  Stash Backup Flow +
Fig: Restore process from snapshot in Stash
+
+ +The restore process consists of the following steps: + +1. At first, a user creates a `RestoreSession` crd which specifies the `volumeClaimTemplates`. `VolumeClaimTemplates` hold the information about `VolumeSnapshot`. + +2. Stash operator watches for `RestoreSession` crd. + +3. When it finds a `RestoreSession` crd, it creates a Restore `Job`to restore PVC from the snapshot. + +4. The restore `Job` creates PVC with `spec.dataSource` field set to the respective VolumeSnapshot name. + +5. CSI `external-snapshotter` controller watches for PVC. + +6. When it finds a new PVC with `spec.dataSource` field set, it reads the information about the `VolumeSnapshot`. + +7. The controller downloads the respective data from the cloud and populate the PVC with it. + +8. Once restore process is completed, the Stash operator updates the `status.phase` field of the `BackupSession` crd. + +## Next Steps + +1. See a step by step guide to snapshot the volumes of a Deployment [here](/docs/v2024.12.18/guides/volumesnapshot/deployment/). +2. See a step by step guide to snapshot the volumes of a StatefulSet [here](/docs/v2024.12.18/guides/volumesnapshot/statefulset/). +3. See a step by step guide to snapshot a stand-alone PVC [here](/docs/v2024.12.18/guides/volumesnapshot/pvc/). diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/pvc/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/guides/volumesnapshot/pvc/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..27eca4ac7a --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/pvc/examples/backupconfiguration.yaml @@ -0,0 +1,18 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: pvc-volume-snapshot + namespace: demo +spec: + schedule: "*/5 * * * *" + driver: VolumeSnapshotter + target: + ref: + apiVersion: v1 + kind: PersistentVolumeClaim + name: source-data + snapshotClassName: csi-snapshot-class + retentionPolicy: + name: "keep-last-5" + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/pvc/examples/restored-pod.yaml b/content/docs/v2024.12.18/guides/volumesnapshot/pvc/examples/restored-pod.yaml new file mode 100644 index 0000000000..4fee01c137 --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/pvc/examples/restored-pod.yaml @@ -0,0 +1,20 @@ +apiVersion: v1 +kind: Pod +metadata: + name: restored-pod + namespace: demo +spec: + containers: + - name: busybox + image: busybox + args: + - sleep + - "3600" + volumeMounts: + - name: restore-data + mountPath: /restore/data + volumes: + - name: restore-data + persistentVolumeClaim: + claimName: restore-data + readOnly: false diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/pvc/examples/restoresession.yaml b/content/docs/v2024.12.18/guides/volumesnapshot/pvc/examples/restoresession.yaml new file mode 100644 index 0000000000..7bab6ffea5 --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/pvc/examples/restoresession.yaml @@ -0,0 +1,21 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: restore-pvc + namespace: demo +spec: + driver: VolumeSnapshotter + target: + volumeClaimTemplates: + - metadata: + name: restore-data + spec: + accessModes: ["ReadWriteOnce"] + storageClassName: "csi-standard" + resources: + requests: + storage: 1Gi + dataSource: + kind: VolumeSnapshot + name: source-data-fnbwz + apiGroup: snapshot.storage.k8s.io diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/pvc/examples/source-pod.yaml b/content/docs/v2024.12.18/guides/volumesnapshot/pvc/examples/source-pod.yaml new file mode 100644 index 0000000000..fcf7aa7ed2 --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/pvc/examples/source-pod.yaml @@ -0,0 +1,19 @@ +apiVersion: v1 +kind: Pod +metadata: + name: source-pod + namespace: demo +spec: + containers: + - name: busybox + image: busybox + command: ["/bin/sh", "-c"] + args: ["echo sample_data > /source/data/data.txt && sleep 3000"] + volumeMounts: + - name: source-data + mountPath: /source/data + volumes: + - name: source-data + persistentVolumeClaim: + claimName: source-data + readOnly: false diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/pvc/examples/source-pvc.yaml b/content/docs/v2024.12.18/guides/volumesnapshot/pvc/examples/source-pvc.yaml new file mode 100644 index 0000000000..7af855c2a0 --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/pvc/examples/source-pvc.yaml @@ -0,0 +1,12 @@ +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: source-data + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: standard + resources: + requests: + storage: 1Gi diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/pvc/examples/storageclass.yaml b/content/docs/v2024.12.18/guides/volumesnapshot/pvc/examples/storageclass.yaml new file mode 100644 index 0000000000..e1fa0f0231 --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/pvc/examples/storageclass.yaml @@ -0,0 +1,9 @@ +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: csi-standard +parameters: + type: pd-standard +provisioner: pd.csi.storage.gke.io +reclaimPolicy: Delete +volumeBindingMode: Immediate diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/pvc/examples/volumesnapshotclass.yaml b/content/docs/v2024.12.18/guides/volumesnapshot/pvc/examples/volumesnapshotclass.yaml new file mode 100644 index 0000000000..382ba7d1d6 --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/pvc/examples/volumesnapshotclass.yaml @@ -0,0 +1,6 @@ +apiVersion: snapshot.storage.k8s.io/v1 +kind: VolumeSnapshotClass +metadata: + name: csi-snapshot-class +driver: pd.csi.storage.gke.io +deletionPolicy: Delete diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/pvc/images/gcp.png b/content/docs/v2024.12.18/guides/volumesnapshot/pvc/images/gcp.png new file mode 100644 index 0000000000..2b65e5423a Binary files /dev/null and b/content/docs/v2024.12.18/guides/volumesnapshot/pvc/images/gcp.png differ diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/pvc/index.md b/content/docs/v2024.12.18/guides/volumesnapshot/pvc/index.md new file mode 100644 index 0000000000..7df7dab6c2 --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/pvc/index.md @@ -0,0 +1,519 @@ +--- +title: Snapshot Stand-alone PVC | Stash +description: An step by step guide showing how to snapshot a stand-alone PVC +menu: + docs_v2024.12.18: + identifier: volume-snapshot-pvc + name: Snapshot Stand-alone PVC + parent: volume-snapshot + weight: 40 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Snapshotting a Standalone PVC + +This guide will show you how to use Stash to snapshot standalone PersistentVolumeClaims and restore it from the snapshot using Kubernetes [VolumeSnapshot](https://kubernetes.io/docs/concepts/storage/volume-snapshots/) API. In this guide, we are going to backup the volumes in Google Cloud Platform with the help of [GCE Persistent Disk CSI Driver](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver). + +## Before You Begin + +- At first, you need to be familiar with the [GCE Persistent Disk CSI Driver](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver). +- Install `Stash` in your cluster following the steps [here](/docs/v2024.12.18/setup/README). +- If you don't know how VolumeSnapshot works in Stash, please visit [here](/docs/v2024.12.18/guides/volumesnapshot/overview/). + +## Prepare for VolumeSnapshot + +Here, we are going to create `StorageClass` that uses [GCE Persistent Disk CSI Driver](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver). + +Below is the YAML of the `StorageClass` we are going to use, + +```yaml +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: csi-standard +parameters: + type: pd-standard +provisioner: pd.csi.storage.gke.io +reclaimPolicy: Delete +volumeBindingMode: Immediate +``` + +Let's create the `StorageClass` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumesnapshot/pvc/examples/storageclass.yaml +storageclass.storage.k8s.io/csi-standard created +``` + +We also need a `VolumeSnapshotClass`. Below is the YAML of the `VolumeSnapshotClass` we are going to use, + +```yaml +apiVersion: snapshot.storage.k8s.io/v1 +kind: VolumeSnapshotClass +metadata: + name: csi-snapshot-class +driver: pd.csi.storage.gke.io +deletionPolicy: Delete +``` + +Here, + +- `driver` field to point to the respective CSI driver that is responsible for taking snapshot. As we are using [GCE Persistent Disk CSI Driver](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver), we are going to use `pd.csi.storage.gke.io` in this field. + +Let's create the `volumeSnapshotClass` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumesnapshot/pvc/examples/volumesnapshotclass.yaml +volumesnapshotclass.snapshot.storage.k8s.io/csi-snapshot-class created +``` + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> Note: YAML files used in this tutorial are stored in [/docs/guides/volumesnapshot/pvc/examples](/docs/v2024.12.18/guides/volumesnapshot/pvc/examples/) directory of [stashed/docs](https://github.com/stashed/docs) repository. + + +## Take Volume Snapshot + +Here, we are going to create a PVC and mount it with a pod and we are going to also generate some sample data on it. Then, we are going to take snapshot of this PVC using Stash. + +**Create PersistentVolumeClaim :** + +At first, let's create a PVC. We are going to mount this PVC in a pod. + +Below is the YAML of the sample PVC, + +```yaml +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: source-data + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: standard + resources: + requests: + storage: 1Gi +``` + +Let's create the PVC we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumesnapshot/pvc/examples/source-pvc.yaml +persistentvolumeclaim/source-data created +``` + +**Create Pod :** + +Now, we are going to deploy a pod that uses the above PVC. This pod will automatically create `data.txt` file in `/source/data` directory and write some sample data in it and also mounted the desired PVC in `/source/data` directory. + +Below is the YAML of the pod that we are going to create, + +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: source-pod + namespace: demo +spec: + containers: + - name: busybox + image: busybox + command: ["/bin/sh", "-c"] + args: ["echo sample_data > /source/data/data.txt && sleep 3000"] + volumeMounts: + - name: source-data + mountPath: /source/data + volumes: + - name: source-data + persistentVolumeClaim: + claimName: source-data + readOnly: false +``` + +Let's create the Pod we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumesnapshot/pvc/examples/source-pod.yaml +pod/source-pod created +``` + +Now, wait for the Pod to go into the `Running` state. + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +source-pod 1/1 Running 0 25s +``` + +Verify that the sample data has been created in `/source/data` directory for `source-pod` pod +using the following command, + +```bash +$ kubectl exec -n demo source-pod -- cat /source/data/data.txt +sample_data +``` + +**Create BackupConfiguration :** + +Now, create a `BackupConfiguration` crd to take snapshot of the `source-data` PVC. + +Below is the YAML of the `BackupConfiguration` crd that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: pvc-volume-snapshot + namespace: demo +spec: + schedule: "*/5 * * * *" + driver: VolumeSnapshotter + target: + ref: + apiVersion: v1 + kind: PersistentVolumeClaim + name: source-data + snapshotClassName: csi-snapshot-class + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Here, + +- `spec.schedule` is a [cron expression](https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/#schedule) indicates that `BackupSession` will be created at 5 minute interval. + +- `spec.driver` indicates the name of the agent to use to back up the target. Currently, Stash supports `Restic`, `VolumeSnapshotter` drivers. The `VolumeSnapshotter` is used to backup/restore PVC using `VolumeSnapshot` API. + +- `spec.target.ref` refers to the backup target. `apiVersion`, `kind` and `name` refers to the `apiVersion`, `kind` and `name` of the targeted workload respectively. Stash will use this information to create a Volume Snapshotter Job for creating VolumeSnapshot. + +- `spec.target.snapshotClassName` indicates the [VolumeSnapshotClass](https://kubernetes.io/docs/concepts/storage/volume-snapshot-classes/) to be used for volume snapshotting. + +Let's create the `BackupConfiguration` crd we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumesnapshot/pvc/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/pvc-volume-snapshot created +``` + +**Verify CronJob :** + +If everything goes well, Stash will create a `CronJob` to take periodic snapshot of the PVC with the schedule specified in `spec.schedule` field of `BackupConfiguration` crd. + + Check that the `CronJob` has been created using the following command, + + ```bash + $ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +pvc-volume-snapshot */1 * * * * False 0 39s 2m41s + ``` + +**Wait for BackupSession :** + +The `pvc-volume-snapshot` CronJob will trigger a backup on each scheduled time slot by creating a `BackupSession` crd. + +Wait for the next schedule of backup. Run the following command to watch `BackupSession` crd, + +```bash +$ watch -n 1 kubectl get backupsession -n demo +Every 1.0s: kubectl get backupsession -n demo + +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +pvc-volume-snapshot-fnbwz BackupConfiguration pvc-volume-snapshot Succeeded 1m32s +``` + +We can see above that the backup session has succeeded. Now, we are going to verify that the `VolumeSnapshot` has been created and the snapshots have been stored in the respective backend. + +**Verify Volume Snapshot :** + +Once a `BackupSession` crd is created, it creates volume snapshotter `Job`. Then the `Job` creates `VolumeSnapshot` crd for the targeted PVC. + +Check that the `VolumeSnapshot` has been created Successfully. + +```bash +$ kubectl get volumesnapshot -n demo +NAME AGE +source-data-fnbwz 1m30s +``` + +Let's find out the actual snapshot name that will be saved in the Google Cloud by the following command, + +```bash +kubectl get volumesnapshot source-data-fnbwz -n demo -o yaml +``` + +```yaml +apiVersion: snapshot.storage.k8s.io/v1 +kind: VolumeSnapshot +metadata: + creationTimestamp: "2019-07-15T10:31:09Z" + finalizers: + - snapshot.storage.kubernetes.io/volumesnapshot-protection + generation: 4 + name: source-data-fnbwz + namespace: demo + resourceVersion: "32098" + selfLink: /apis/snapshot.storage.k8s.io/v1/namespaces/demo/volumesnapshots/source-data-fnbwz + uid: a8e8faeb-a6eb-11e9-9f3a-42010a800050 +spec: + source: + persistentVolumeClaimName: source-data + volumeSnapshotClassName: csi-snapshot-class +status: + boundVolumeSnapshotContentName: snapcontent-a8e8faeb-a6eb-11e9-9f3a-42010a800050 + creationTime: "2019-07-15T10:31:10Z" + readyToUse: true + restoreSize: 1Gi +``` + +Here, `spec.snapshotContentName` field specifies the name of the `VolumeSnapshotContent` crd. It also represents the actual snapshot name that has been saved in Google Cloud. If we navigate to the `Snapshots` tab in the GCP console, we are going to see snapshot `snapcontent-a8e8faeb-a6eb-11e9-9f3a-42010a800050` has been stored successfully. + +
+  Stash Backup Flow +
Fig: Snapshots in GCP
+
+ +## Restore PVC from VolumeSnapshot + +This section will show you how to restore the PVC from the snapshot we have taken in the earlier section. + +**Stop Taking Backup of the Old PVC:** + +At first, let's stop taking any further backup of the old PVC so that no backup is taken during the restore process. We are going to pause the `BackupConfiguration` that we created to backup the `source-data` PVC. Then, Stash will stop taking any further backup for this PVC. You can learn more how to pause a scheduled backup [here](/docs/v2024.12.18/guides/use-cases/pause-backup/) + +Let's pause the `pvc-volume-snapshot` BackupConfiguration, + +```bash +$ kubectl patch backupconfiguration -n demo pvc-volume-snapshot --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/pvc-volume-snapshot patched +``` + +Now, wait for a moment. Stash will pause the BackupConfiguration. Verify that the BackupConfiguration has been paused, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED AGE +pvc-volume-snapshot */1 * * * * true 22m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the BackupConfiguration has been paused. + +**Create RestoreSession :** + +At first, we have to create a `RestoreSession` crd to restore the PVC from respective snapshot. + +Below is the YAML of the RestoreSesion crd that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: restore-pvc + namespace: demo +spec: + driver: VolumeSnapshotter + target: + volumeClaimTemplates: + - metadata: + name: restore-data + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "csi-standard" + resources: + requests: + storage: 1Gi + dataSource: + kind: VolumeSnapshot + name: source-data-fnbwz + apiGroup: snapshot.storage.k8s.io +``` + +Here, + +- `spec.target.volumeClaimTemplates`: + - `metadata.name` is the name of the restored `PVC` or prefix of the `VolumeSnapshot` name. + - `spec.dataSource`: `spec.dataSource` specifies the source of the data from where the newly created PVC will be initialized. It requires following fields to be set: + - `apiGroup` is the group for resource being referenced. Now, Kubernetes supports only `snapshot.storage.k8s.io`. + - `kind` is resource of the kind being referenced. Now, Kubernetes supports only `VolumeSnapshot`. + - `name` is the `VolumeSnapshot` resource name. In `RestoreSession` crd, You must set the VolumeSnapshot name directly. + +Let's create the `RestoreSession` crd we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumesnapshot/pvc/examples/restoresession.yaml +restoresession.stash.appscode.com/restore-pvc created +``` + +Once, you have created the `RestoreSession` crd, Stash will create a job to restore. We can watch the `RestoreSession` phase to check if the restore process has succeeded or not. + +Run the following command to watch RestoreSession phase, + +```bash +$ watch -n 1 kubectl get restore -n demo +Every 1.0s: kubectl get restore -n demo + +NAME REPOSITORY-NAME PHASE AGE +restore-pvc Running 10s +restore-pvc Succeeded 1m +``` + +So, we can see from the output of the above command that the restore process succeeded. + +**Verify Restored PVC :** + +Once the restore process is complete, we are going to see that new PVC with the name `restore-data` has been created. + +To verify that the PVC has been created, run by the following command, + +```bash +$ kubectl get pvc -n demo +NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE +restore-data Bound pvc-c5f0e7f5-a6ec-11e9-9f3a-42010a800050 1Gi RWO standard 52s +``` + +Notice the `STATUS` field. It indicates that the respective PV has been provisioned and initialized from the respective VolumeSnapshot by CSI driver and the PVC has been bound with the PV. + +>The [volumeBindingMode](https://kubernetes.io/docs/concepts/storage/storage-classes/#volume-binding-mode) field controls when volume binding and dynamic provisioning should occur. Kubernetes allows `Immediate` and `WaitForFirstConsumer` modes for binding volumes. The `Immediate` mode indicates that volume binding and dynamic provisioning occurs once the PVC is created and `WaitForFirstConsumer` mode indicates that volume binding and provisioning does not occur until a pod is created that uses this PVC. By default `volumeBindingMode` is `Immediate`. + +>If you use `volumeBindingMode: WaitForFirstConsumer`, respective PVC will be initialized from respective VolumeSnapshot after you create a workload with that PVC. In this case, Stash will mark the restore session as completed with phase `Unknown`. + +**Verify Restored Data :** + +We are going to create a new pod with the restored PVC to verify whether the backed up data has been restored. + +Below, the YAML for the Pod we are going to create. + +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: restored-pod + namespace: demo +spec: + containers: + - name: busybox + image: busybox + args: + - sleep + - "3600" + volumeMounts: + - name: restore-data + mountPath: /restore/data + volumes: + - name: restore-data + persistentVolumeClaim: + claimName: restore-data + readOnly: false +``` + +Let's create the Pod we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumesnapshot/pvc/examples/restored-pod.yaml +pod/restored-pod created +``` + +Now, wait for the Pod to go into the `Running` state. + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +restored-pod 1/1 Running 0 34s +``` + +Verify that the backed up data has been restored in `/restore/data` directory for `restored-pod` pod using the following command, + +```bash +$ kubectl exec -n demo restored-pod -- cat /restore/data/data.txt +sample_data +``` + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo pod source-pod +kubectl delete -n demo pod restored-pod +kubectl delete -n demo backupconfiguration pvc-volume-snapshot +kubectl delete -n demo restoresession restore-pvc +kubectl delete -n demo storageclass csi-standard +kubectl delete -n demo volumesnapshotclass csi-snapshot-class +kubectl delete -n demo pvc --all +``` diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/examples/backupconfiguration-single-replica.yaml b/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/examples/backupconfiguration-single-replica.yaml new file mode 100644 index 0000000000..ecc9e46d92 --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/examples/backupconfiguration-single-replica.yaml @@ -0,0 +1,19 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: statefulset-volume-snapshot + namespace: demo +spec: + schedule: "*/5 * * * *" + driver: VolumeSnapshotter + target: + ref: + apiVersion: apps/v1 + kind: StatefulSet + name: stash-demo + replicas: 1 + snapshotClassName: csi-snapshot-class + retentionPolicy: + name: "keep-last-5" + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..4e07cee882 --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/examples/backupconfiguration.yaml @@ -0,0 +1,19 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: statefulset-volume-snapshot + namespace: demo +spec: + schedule: "*/5 * * * *" + driver: VolumeSnapshotter + target: + ref: + apiVersion: apps/v1 + kind: StatefulSet + name: stash-demo + replicas: 3 + snapshotClassName: csi-snapshot-class + retentionPolicy: + name: "keep-last-5" + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/examples/restored-statefulset.yaml b/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/examples/restored-statefulset.yaml new file mode 100644 index 0000000000..132b248e1f --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/examples/restored-statefulset.yaml @@ -0,0 +1,54 @@ +apiVersion: v1 +kind: Service +metadata: + name: restore-svc + labels: + app: restore-demo + namespace: demo +spec: + ports: + - port: 80 + name: web + clusterIP: None + selector: + app: restore-demo +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: restore-demo + namespace: demo +spec: + selector: + matchLabels: + app: restore-demo + serviceName: svc + replicas: 3 + template: + metadata: + labels: + app: restore-demo + spec: + containers: + - args: + - sleep + - "3600" + name: nginx + image: nginx + ports: + - containerPort: 80 + name: web + volumeMounts: + - name: restore-data + mountPath: /restore/data + volumeClaimTemplates: + - metadata: + name: restore-data + namespace: demo + spec: + accessModes: + - ReadWriteOnce + storageClassName: csi-standard + resources: + requests: + storage: 1Gi diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/examples/restoresession-single-replica.yaml b/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/examples/restoresession-single-replica.yaml new file mode 100644 index 0000000000..0c5f799f4a --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/examples/restoresession-single-replica.yaml @@ -0,0 +1,22 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: restore-pvc + namespace: demo +spec: + driver: VolumeSnapshotter + target: + replicas: 3 + volumeClaimTemplates: + - metadata: + name: restore-data-restore-demo-${POD_ORDINAL} + spec: + accessModes: ["ReadWriteOnce"] + storageClassName: "csi-standard" + resources: + requests: + storage: 1Gi + dataSource: + kind: VolumeSnapshot + name: source-data-stash-demo-${POD_ORDINAL}-fnbwz + apiGroup: snapshot.storage.k8s.io diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/examples/restoresession.yaml b/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/examples/restoresession.yaml new file mode 100644 index 0000000000..0c5f799f4a --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/examples/restoresession.yaml @@ -0,0 +1,22 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: restore-pvc + namespace: demo +spec: + driver: VolumeSnapshotter + target: + replicas: 3 + volumeClaimTemplates: + - metadata: + name: restore-data-restore-demo-${POD_ORDINAL} + spec: + accessModes: ["ReadWriteOnce"] + storageClassName: "csi-standard" + resources: + requests: + storage: 1Gi + dataSource: + kind: VolumeSnapshot + name: source-data-stash-demo-${POD_ORDINAL}-fnbwz + apiGroup: snapshot.storage.k8s.io diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/examples/statefulset.yaml b/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/examples/statefulset.yaml new file mode 100644 index 0000000000..ac66f2c920 --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/examples/statefulset.yaml @@ -0,0 +1,58 @@ +apiVersion: v1 +kind: Service +metadata: + name: svc + labels: + app: demo + namespace: demo +spec: + ports: + - port: 80 + name: web + clusterIP: None + selector: + app: stash +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: stash-demo + namespace: demo +spec: + selector: + matchLabels: + app: stash + serviceName: svc + replicas: 3 + template: + metadata: + labels: + app: stash + spec: + containers: + - args: ["echo $(POD_NAME) > /source/data/data.txt && sleep 3000"] + command: ["/bin/sh", "-c"] + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + name: nginx + image: nginx + ports: + - containerPort: 80 + name: web + volumeMounts: + - name: source-data + mountPath: /source/data + volumeClaimTemplates: + - metadata: + name: source-data + namespace: demo + spec: + accessModes: + - ReadWriteOnce + storageClassName: csi-standard + resources: + requests: + storage: 1Gi diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/examples/storageclass.yaml b/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/examples/storageclass.yaml new file mode 100644 index 0000000000..e1fa0f0231 --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/examples/storageclass.yaml @@ -0,0 +1,9 @@ +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: csi-standard +parameters: + type: pd-standard +provisioner: pd.csi.storage.gke.io +reclaimPolicy: Delete +volumeBindingMode: Immediate diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/examples/volumesnapshotclass.yaml b/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/examples/volumesnapshotclass.yaml new file mode 100644 index 0000000000..382ba7d1d6 --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/examples/volumesnapshotclass.yaml @@ -0,0 +1,6 @@ +apiVersion: snapshot.storage.k8s.io/v1 +kind: VolumeSnapshotClass +metadata: + name: csi-snapshot-class +driver: pd.csi.storage.gke.io +deletionPolicy: Delete diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/images/gcp.png b/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/images/gcp.png new file mode 100644 index 0000000000..25a15360e5 Binary files /dev/null and b/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/images/gcp.png differ diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/images/gcp2.png b/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/images/gcp2.png new file mode 100644 index 0000000000..aea779a6e2 Binary files /dev/null and b/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/images/gcp2.png differ diff --git a/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/index.md b/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/index.md new file mode 100644 index 0000000000..d7bb937c1b --- /dev/null +++ b/content/docs/v2024.12.18/guides/volumesnapshot/statefulset/index.md @@ -0,0 +1,916 @@ +--- +title: Snapshot StatefulSet Volumes | Stash +description: An step by step guide showing how to snapshot the volumes of a StatefulSet +menu: + docs_v2024.12.18: + identifier: volume-snapshot-statefulset + name: Snapshot StatefulSet Volumes + parent: volume-snapshot + weight: 30 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Snapshotting the volumes of a StatefulSet + +This guide will show you how to use Stash to snapshot the volumes of a StatefulSet and restore them from the snapshots using Kubernetes [VolumeSnapshot](https://kubernetes.io/docs/concepts/storage/volume-snapshots/) API. In this guide, we are going to backup the volumes in Google Cloud Platform with the help of [GCE Persistent Disk CSI Driver](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver). + +## Before You Begin + +- At first, you need to be familiar with the [GCE Persistent Disk CSI Driver](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver). +- Install `Stash` in your cluster following the steps [here](/docs/v2024.12.18/setup/README). +- If you don't know how VolumeSnapshot works in Stash, please visit [here](/docs/v2024.12.18/guides/volumesnapshot/overview/). + +## Prepare for VolumeSnapshot + +Here, we are going to create `StorageClass` that uses [GCE Persistent Disk CSI Driver](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver). + +Below is the YAML of the `StorageClass` we are going to use, + +```yaml +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: csi-standard +parameters: + type: pd-standard +provisioner: pd.csi.storage.gke.io +reclaimPolicy: Delete +volumeBindingMode: Immediate +``` + +Let's create the `StorageClass` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumesnapshot/statefulset/examples/storageclass.yaml +storageclass.storage.k8s.io/csi-standard created +``` + +We also need a `VolumeSnapshotClass`. Below is the YAML of the `VolumeSnapshotClass` we are going to use, + +```yaml +apiVersion: snapshot.storage.k8s.io/v1 +kind: VolumeSnapshotClass +metadata: + name: csi-snapshot-class +driver: pd.csi.storage.gke.io +deletionPolicy: Delete +``` + +Here, + +- `driver` field to point to the respective CSI driver that is responsible for taking snapshot. As we are using [GCE Persistent Disk CSI Driver](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver), we are going to use `pd.csi.storage.gke.io` in this field. + +Let's create the `volumeSnapshotClass` we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumesnapshot/statefulset/examples/volumesnapshotclass.yaml +volumesnapshotclass.snapshot.storage.k8s.io/csi-snapshot-class created +``` + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +>Note: YAML files used in this tutorial are stored in [/docs/guides/volumesnapshot/statefulset/examples](/docs/v2024.12.18/guides/volumesnapshot/statefulset/examples/) directory of [stashed/docs](https://github.com/stashed/docs) repository. + +## Take Volume Snapshot + +When you create a Statefulset, there is no need to create PVCs separately, because all replicas in Statefulset use different PVCs to store data. Kubernetes allows us to define a `volumeClaimTemplates` in Statefulset so that new PVC is created for each replica automatically. We are going to take snapshot of those PVCs using Stash. + +**Deploy StatefulSet :** + +Now, we are going to deploy a Statefulset. This Statefulset will automatically generate sample data in `/source/data` directory. + +Below is the YAML of the Statefulset that we are going to create, + +```yaml +apiVersion: v1 +kind: Service +metadata: + name: svc + labels: + app: demo + namespace: demo +spec: + ports: + - port: 80 + name: web + clusterIP: None + selector: + app: stash +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: stash-demo + namespace: demo +spec: + selector: + matchLabels: + app: stash + serviceName: svc + replicas: 3 + template: + metadata: + labels: + app: stash + spec: + containers: + - args: ["echo $(POD_NAME) > /source/data/data.txt && sleep 3000"] + command: ["/bin/sh", "-c"] + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + name: nginx + image: nginx + ports: + - containerPort: 80 + name: web + volumeMounts: + - name: source-data + mountPath: /source/data + volumeClaimTemplates: + - metadata: + name: source-data + namespace: demo + spec: + accessModes: + - ReadWriteOnce + storageClassName: csi-standard + resources: + requests: + storage: 1Gi +``` + +Let's create the Statefulset we have shown above. + +```bash +$ kubectl create -f ./docs/guides/volumesnapshot/statefulset/examples/statefulset.yaml +service/svc created +statefulset.apps/stash-demo created +``` + +Now, wait for the pod of Statefulset to go into the `Running` state. + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-demo-0 1/1 Running 0 97s +stash-demo-1 1/1 Running 0 67s +stash-demo-2 1/1 Running 0 39s +``` + +Let's find out the PVCs created for these replicas, + +```bash +kubectl get pvc -n demo +NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE +source-data-stash-demo-0 Bound pvc-760c1734-a6cc-11e9-9f3a-42010a800050 1Gi RWO standard 70s +source-data-stash-demo-1 Bound pvc-86f5b3bd-a6cc-11e9-9f3a-42010a800050 1Gi RWO standard 42s +source-data-stash-demo-2 Bound pvc-9c9f542f-a6cc-11e9-9f3a-42010a800050 1Gi RWO standard 5s +``` + +Verify that the sample data has been created in `/source/data` directory using the following command, + +```bash +$ kubectl exec -n demo stash-demo-0 -- cat /source/data/data.txt +stash-demo-0 +$ kubectl exec -n demo stash-demo-1 -- cat /source/data/data.txt +stash-demo-1 +$ kubectl exec -n demo stash-demo-2 -- cat /source/data/data.txt +stash-demo-2 +``` + +**Create BackupConfiguration :** + +Now, create a `BackupConfiguration` crd to take snapshot of the PVCs of `stash-demo` Statefulset. + +Below is the YAML of the `BackupConfiguration` that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: statefulset-volume-snapshot + namespace: demo +spec: + schedule: "*/5 * * * *" + driver: VolumeSnapshotter + target: + ref: + apiVersion: apps/v1 + kind: StatefulSet + name: stash-demo + replicas : 3 + snapshotClassName: csi-snapshot-class + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Here, + +- `spec.schedule` is a [cron expression](https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/#schedule) indicates that `BackupSession` will be created at 5 minute interval. + +- `spec.driver` indicates the name of the agent to use to back up the target. Currently, Stash supports `Restic`, `VolumeSnapshotter` drivers. The `VolumeSnapshotter` is used to backup/restore PVC using `VolumeSnapshot` API. + +- `spec.target.ref` refers to the backup target. `apiVersion`, `kind` and `name` refers to the `apiVersion`, `kind` and `name` of the targeted workload respectively. Stash will use this information to create a Volume Snapshotter Job for creating VolumeSnapshot. + +- `spec.target.snapshotClassName` indicates the [VolumeSnapshotClass](https://kubernetes.io/docs/concepts/storage/volume-snapshot-classes/) to be used for volume snapshotting. + +Let's create the `BackupConfiguration` crd we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumesnapshot/statefulset/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/statefulset-volume-snapshot created +``` + +**Verify CronJob :** + +If everything goes well, Stash will create a `CronJob` to take periodic snapshot of `stash-demo-0` , `stash-demo-1` and `stash-demo-2` volumes of the Statefulset with the schedule specified in `spec.schedule` field of `BackupConfiguration` crd. + + Check that the `CronJob` has been created using the following command, + +```bash +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +statefulset-volume-snapshot */1 * * * * False 0 18s +``` + +**Wait for BackupSession :** + +The `statefulset-volume-snapshot` CronJob will trigger a backup on each schedule by creating a `BackupSession` crd. + +Wait for the next schedule for backup. Run the following command to watch `BackupSession` crd, + +```bash +$ watch -n 1 kubectl get backupsession -n demo +Every 1.0s: kubectl get backupsession -n demo + +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +statefulset-volume-snapshot-fnbwz BackupConfiguration statefulset-volume-snapshot Succeeded 57s +``` + +We can see above that the backup session has succeeded. Now, we are going to verify that the VolumeSnapshot has been created and the snapshots has been stored in the respective backend. + +**Verify Volume Snapshot :** + +Once a `BackupSession` crd is created, it creates volume snapshotter `Job`. Then the `Job` creates `VolumeSnapshot` crd for the targeted PVC. + +Check that the `VolumeSnapshot` has been created Successfully. + +```bash +$ kubectl get volumesnapshot -n demo +NAME AGE +source-data-stash-demo-0-fnbwz 115s +source-data-stash-demo-1-fnbwz 115s +source-data-stash-demo-2-fnbwz 115s +``` + +Let's find out the actual snapshot name that has been saved in the Google Cloud by the following command, + +```bash +kubectl get volumesnapshot source-data-stash-demo-0-fnbwz -n demo -o yaml +``` + +```yaml +apiVersion: snapshot.storage.k8s.io/v1 +kind: VolumeSnapshot +metadata: + creationTimestamp: "2019-07-15T07:59:13Z" + finalizers: + - snapshot.storage.kubernetes.io/volumesnapshot-protection + generation: 4 + name: source-data-stash-demo-0-fnbwz + namespace: demo + resourceVersion: "18764" + selfLink: /apis/snapshot.storage.k8s.io/v1/namespaces/demo/volumesnapshots/source-data-stash-demo-0-fnbwz + uid: 6f3b49a9-a6d6-11e9-9f3a-42010a800050 +spec: + source: + persistentVolumeClaimName: source-data-stash-demo-0 + volumeSnapshotClassName: csi-snapshot-class +status: + boundVolumeSnapshotContentName: snapcontent-6f3b49a9-a6d6-11e9-9f3a-42010a800050 + creationTime: "2019-07-15T07:59:14Z" + readyToUse: true + restoreSize: 1Gi +``` + +Here, `spec.snapshotContentName` field specifies the name of the `VolumeSnapshotContent` crd. It also represents the actual snapshot name that has been saved in Google Cloud. If we navigate to the `Snapshots` tab in the GCP console, we should see snapshot `snapcontent-6f3b49a9-a6d6-11e9-9f3a-42010a800050` has been stored successfully. + +
+  Stash Backup Flow +
Fig: Snapshots in GCP
+
+ +## Restore PVC from VolumeSnapshot + +This section will show you how to restore PVCs from the snapshots we have taken in the earlier section. + +**Stop Taking Backup of the Old StatefulSet:** + +At first, let's stop taking any further backup of the old StatefulSet so that no backup is taken during the restore process. We are going to pause the `BackupConfiguration` that we created to backup the `stash-demo` StatefulSet. Then, Stash will stop taking any further backup for this StatefulSet. You can learn more how to pause a scheduled backup [here](/docs/v2024.12.18/guides/use-cases/pause-backup/) + +Let's pause the `statefulset-volume-snapshot` BackupConfiguration, + +```bash +$ kubectl patch backupconfiguration -n demo statefulset-volume-snapshot --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/statefulset-volume-snapshot patched +``` + +Now, wait for a moment. Stash will pause the BackupConfiguration. Verify that the BackupConfiguration has been paused, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED AGE +statefulset-volume-snapshot */1 * * * * true 20m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the BackupConfiguration has been paused. + +**Create RestoreSession :** + +At first, we have to create a `RestoreSession` crd to restore PVCs from respective the snapshots. + +Below is the YAML of the `RestoreSesion` crd that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: restore-pvc + namespace: demo +spec: + driver: VolumeSnapshotter + target: + replicas: 3 + volumeClaimTemplates: + - metadata: + name: restore-data-restore-demo-${POD_ORDINAL} + spec: + accessModes: ["ReadWriteOnce"] + storageClassName: "csi-standard" + resources: + requests: + storage: 1Gi + dataSource: + kind: VolumeSnapshot + name: source-data-stash-demo-${POD_ORDINAL}-fnbwz + apiGroup: snapshot.storage.k8s.io +``` + +Here, + +- `spec.target.replicas`: `spec.target.replicas` specify the number of replicas of a StatefulSet whose volumes were backed up and Stash uses this field to dynamically create the desired number of PVCs and initialize them from respective or Specific VolumeSnapShots. +- `spec.target.volumeClaimTemplates`: + - `metadata.name` is a template for the name of the restored PVC that will be created by Stash. You have to provide this named template to match with the desired PVC of a StatefulSet. For example, if you want to deploy a StatefulSet named `stash-demo` with `volumeClaimTemplate` name `my-volume`, the PVCs of your StatefulSet will be `my-volume-stash-demo-0`, `my-volume-stash-demo-1` and so on. In this case, you have to provide `volumeClaimTemplate` name in `RestoreSession` in the following format: + + ```bash + --${POD_ORDINAL} + ``` + + So for the above example, `volumeClaimTemplate` name for `RestoreSession` will be `my-volume-stash-demo-${POD_ORDINAL}`. + - `spec.dataSource`: `spec.dataSource` specifies the source of the data from where the newly created PVC will be initialized. It requires following fields to be set: + - `apiGroup` is the group for resource being referenced. Now, Kubernetes supports only `snapshot.storage.k8s.io`. + - `kind` is resource of the kind being referenced. Now, Kubernetes supports only `VolumeSnapshot`. + - `name` is the `VolumeSnapshot` resource name. In `RestoreSession` crd, You must provide the name in the following format: + + ```bash + -${POD_ORDINAL}- + ``` + + The `${POD_ORDINAL}` variable is resolved by Stash. If you don't provide this variable and specify ordinal manually, all the PVC will be restored from the same VolumeSnapshot. + +Let's create the `RestoreSession` crd we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumesnapshot/statefulset/examples/restoresession.yaml +restoresession.stash.appscode.com/restore-pvc created +``` + +Once, you have created the `RestoreSession` crd, Stash will create a job to restore. We can watch the `RestoreSession` phase to check if the restore process has succeeded or not. + +Run the following command to watch RestoreSession phase, + +```bash +$ watch -n 1 kubectl get restore -n demo +Every 1.0s: kubectl get restore -n demo + +NAME REPOSITORY-NAME PHASE AGE +restore-pvc Running 10s +restore-pvc Succeeded 1m +``` + +So, we can see from the output of the above command that the restore process succeeded. + +**Verify Restored PVC :** + +Once the restore process is complete, we are going to see that new PVCs with the name `restore-data-restore-demo-0` , `restore-data-restore-demo-1` and `restore-data-restore-demo-2` has been created. + +Verify that the PVCs has been created by the following command, + +```bash +$ kubectl get pvc -n demo +NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE +restore-data-restore-demo-0 Bound pvc-ed35c54d-a6dc-11e9-9f3a-42010a800050 1Gi RWO standard 13s +restore-data-restore-demo-1 Bound pvc-ed3bcb82-a6dc-11e9-9f3a-42010a800050 1Gi RWO standard 13s +restore-data-restore-demo-2 Bound pvc-ed3fed79-a6dc-11e9-9f3a-42010a800050 1Gi RWO standard 13s +``` + +Notice the `STATUS` field. It indicates that the respective PV has been provisioned and initialized from the respective VolumeSnapshot by CSI driver and the PVC has been bound with the PV. + +>The [volumeBindingMode](https://kubernetes.io/docs/concepts/storage/storage-classes/#volume-binding-mode) field controls when volume binding and dynamic provisioning should occur. Kubernetes allows `Immediate` and `WaitForFirstConsumer` modes for binding volumes. The `Immediate` mode indicates that volume binding and dynamic provisioning occurs once the PVC is created and `WaitForFirstConsumer` mode indicates that volume binding and provisioning does not occur until a pod is created that uses this PVC. By default `volumeBindingMode` is `Immediate`. + +>If you use `volumeBindingMode: WaitForFirstConsumer`, respective PVC will be initialized from respective VolumeSnapshot after you create a workload with that PVC. In this case, Stash will mark the restore session as completed with phase `Unknown`. + +**Verify Restored Data :** + +We are going to create a new Statefulset with the restored PVCs to verify whether the backed up data has been restored. + +Below, the YAML for the Statefulset we are going to create. + +```yaml +apiVersion: v1 +kind: Service +metadata: + name: restore-svc + labels: + app: restore-demo + namespace: demo +spec: + ports: + - port: 80 + name: web + clusterIP: None + selector: + app: restore-demo +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: restore-demo + namespace: demo +spec: + selector: + matchLabels: + app: restore-demo + serviceName: svc + replicas: 3 + template: + metadata: + labels: + app: restore-demo + spec: + containers: + - args: + - sleep + - "3600" + name: nginx + image: nginx + ports: + - containerPort: 80 + name: web + volumeMounts: + - name: restore-data + mountPath: /restore/data + volumeClaimTemplates: + - metadata: + name: restore-data + namespace: demo + spec: + accessModes: + - ReadWriteOnce + storageClassName: csi-standard + resources: + requests: + storage: 1Gi +``` + +Let's create the Statefulset we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumesnapshot/statefulset/examples/restored-statefulset.yaml +service/svc created +statefulset.apps/restore-demo created +``` + +Now, wait for the pod of the Statefulset to go into the `Running` state. + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +restore-demo-0 1/1 Running 0 65s +restore-demo-1 1/1 Running 0 46s +restore-demo-2 1/1 Running 0 26s +``` + +Verify that the backed up data has been restored in `/restore/data` directory using the following command, + +```bash +$ kubectl exec -n demo restore-demo-0 -- cat /restore/data/data.txt +stash-demo-0 +$ kubectl exec -n demo restore-demo-1 -- cat /restore/data/data.txt +stash-demo-1 +$ kubectl exec -n demo restore-demo-2 -- cat /restore/data/data.txt +stash-demo-2 +``` + +## Advance Use-Case + +Stash can also backup only single replica or restore same data on all replicas of a StatefulSet. This is particularly useful when all replicas of the StatefulSet contains same data. For example, in [MongoDB ReplicaSet](https://kubedb.com/docs/0.12.0/guides/mongodb/clustering/replication_concept/) all the pod contains same data. In this case backup only single replica is enough. Similarly, it might be useful in some cases where all the replicas need to be initialized with same data. + +### Backup only Single Replica + +This section will show you how to snapshot only a single replica of a Statefulset volume. + +**Create BackupConfiguration :** + +Now, create a `BackupConfiguration` crd to take snapshot of a single PVC of the `stash-demo` Statefulset. + +Below is the YAML of the `BackupConfiguration` that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: statefulset-volume-snapshot + namespace: demo +spec: + schedule: "*/5 * * * *" + driver: VolumeSnapshotter + target: + ref: + apiVersion: apps/v1 + kind: StatefulSet + name: stash-demo + replicas: 1 + snapshotClassName: csi-snapshot-class + retentionPolicy: + name: "keep-last-5" + keepLast: 5 + prune: true +``` + +Here, + +- `spec.replicas` specifies the number of replicas (starting from 0th) whose data should be backed up. If it is set to 1, Stash will take snapshot only the volumes of `--0` pod. For replica set to 2, Stash will take snapshot only the volumes of `--0` and `--1` pods and so on. + +Let's create the `BackupConfiguration` crd we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumesnapshot/statefulset/examples/backupconfiguration-single-replica.yaml +backupconfiguration.stash.appscode.com/statefulset-volume-snapshot created +``` + +**Verify CronJob :** + +If everything goes well, Stash will create a `CronJob` to take periodic snapshot of `stash-demo-0` volume of the Statefulset with the schedule specified in `spec.schedule` field of `BackupConfiguration` crd. + + Check that the `CronJob` has been created using the following command, + +```bash +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +statefulset-volume-snapshot */1 * * * * False 0 18s +``` + +**Wait for BackupSession :** + +The `statefulset-volume-snapshot` CronJob will trigger a backup on each schedule by creating a `BackupSession` crd. + +Wait for the next schedule for backup. Run the following command to watch `BackupSession` crd, + +```bash +$ watch -n 1 kubectl get backupsession -n demo +Every 1.0s: kubectl get backupsession -n demo + +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +statefulset-volume-snapshot-fnbwz BackupConfiguration statefulset-volume-snapshot Succeeded 57s +``` + +We can see above that the backup session has succeeded. Now, we are going to verify that the VolumeSnapshot has been created and the snapshot has been stored in the respective backend. + +**Verify Volume Snapshotting and Backup :** + +Once a `BackupSession` crd is created, Stash creates a volume snapshotter `Job`. Then the `Job` creates `VolumeSnapshot` crd for the targeted PVC. + +Check that the `VolumeSnapshot` has been created Successfully. + +```bash +$ kubectl get volumesnapshot -n demo +NAME AGE +source-data-stash-demo-0-fnbwz 67s +``` + +Let's find out the actual snapshot name that will be saved in the GCP by the following command, + +```bash +kubectl get volumesnapshot source-data-stash-demo-0-fnbwz -n demo -o yaml +``` + +```yaml +apiVersion: snapshot.storage.k8s.io/v1 +kind: VolumeSnapshot +metadata: + creationTimestamp: "2019-07-15T09:01:06Z" + finalizers: + - snapshot.storage.kubernetes.io/volumesnapshot-protection + generation: 4 + name: source-data-stash-demo-0-fnbwz + namespace: demo + resourceVersion: "24310" + selfLink: /apis/snapshot.storage.k8s.io/v1/namespaces/demo/volumesnapshots/source-data-stash-demo-0-fnbwz + uid: 14984cd3-a6df-11e9-9f3a-42010a800050 +spec: + source: + persistentVolumeClaimName: source-data-stash-demo-0 + volumeSnapshotClassName: csi-snapshot-class +status: + boundVolumeSnapshotContentName: snapcontent-14984cd3-a6df-11e9-9f3a-42010a800050 + creationTime: "2019-07-15T09:01:07Z" + readyToUse: true + restoreSize: 1Gi +``` + +Here, `spec.snapshotContentName` field specifies the name of the `VolumeSnapshotContent` crd. It also represents the actual snapshot name that has been saved in GCP. If we navigate to the `Snapshots` tab in the GCP console, we should see the snapshot `snapcontent-14984cd3-a6df-11e9-9f3a-42010a800050` has been stored successfully. + +
+  Stash Backup Flow +
Fig: Snapshot in GCP
+
+ +### Restore Same Data in all Replicas + +This section will show you how to restore PVCs from the snapshot that we have taken in the earlier section. + +**Stop Taking Backup of the Old StatefulSet:** + +At first, let's stop taking any further backup of the old StatefulSet so that no backup is taken during the restore process. We are going to pause the `BackupConfiguration` that we created to backup the `stash-demo` StatefulSet. Then, Stash will stop taking any further backup for this StatefulSet. You can learn more how to pause a scheduled backup [here](/docs/v2024.12.18/guides/use-cases/pause-backup/) + +Let's pause the `statefulset-volume-snapshot` BackupConfiguration, + +```bash +$ kubectl patch backupconfiguration -n demo statefulset-volume-snapshot --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/statefulset-volume-snapshot patched +``` + +Now, wait for a moment. Stash will pause the BackupConfiguration. Verify that the BackupConfiguration has been paused, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED AGE +statefulset-volume-snapshot */1 * * * * true 20m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the BackupConfiguration has been paused. + +**Create RestoreSession :** + +At first, we have to create a `RestoreSession` crd to restore PVCs from the respective snapshot. + +Below is the YAML of the `RestoreSesion` crd that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: restore-pvc + namespace: demo +spec: + driver: VolumeSnapshotter + target: + replicas : 3 + volumeClaimTemplates: + - metadata: + name: restore-data-restore-demo-${POD_ORDINAL} + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi + dataSource: + kind: VolumeSnapshot + name: source-data-stash-demo-0-fnbwz + apiGroup: snapshot.storage.k8s.io +``` + +Here, + +- `spec.dataSource.name`: `spec.dataSource.name` is the `VolumeSnapshot` resource name. data will be restored in all replica from single VolumeSnapshot. + +Let's create the `BackupConfiguration` crd we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumesnapshot/statefulset/examples/restoresession-single-replica.yaml +restoresession.stash.appscode.com/restore-pvc created +``` + +Once, you have created the `RestoreSession` crd, Stash will create a job to restore. We can watch the `RestoreSession` phase to check if the restore process has succeeded or not. + +Run the following command to watch RestoreSession phase, + +```bash +$ watch -n 1 kubectl get restore -n demo +Every 1.0s: kubectl get restore -n demo suaas-appscode: Tue Jun 18 18:35:41 2019 + +NAME REPOSITORY-NAME PHASE AGE +restore-pvc Running 10s +restore-pvc Succeeded 1m +``` + +So, we can see from the output of the above command that the restore process succeeded. + +**Verify Restored PVC :** + +Once the restore process is complete, we are going to see that new PVCs with the name `restore-data-restore-demo-0` , `restore-data-restore-demo-1` and `restore-data-restore-demo-2` have been created successfully. + +check that the status of the PVCs are bound, + +```bash +$ kubectl get pvc -n demo +NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE +restore-data-restore-demo-0 Bound pvc-745e0f51-a6e0-11e9-9f3a-42010a800050 1Gi RWO standard 5m23s +restore-data-restore-demo-1 Bound pvc-746227e7-a6e0-11e9-9f3a-42010a800050 1Gi RWO standard 5m23s +restore-data-restore-demo-2 Bound pvc-74674656-a6e0-11e9-9f3a-42010a800050 1Gi RWO standard 5m23s +``` + +**Verify Restored Data :** + +We are going to create a new Statefulset to verify whether the restored data has been restored successfully. + +Below, the YAML for the Statefulset we are going to create. + +```yaml +apiVersion: v1 +kind: Service +metadata: + name: restore-svc + labels: + app: restore-demo + namespace: demo +spec: + ports: + - port: 80 + name: web + clusterIP: None + selector: + app: restore-demo +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: restore-demo + namespace: demo +spec: + selector: + matchLabels: + app: restore-demo + serviceName: svc + replicas: 3 + template: + metadata: + labels: + app: restore-demo + spec: + containers: + - args: + - sleep + - "3600" + name: nginx + image: nginx + ports: + - containerPort: 80 + name: web + volumeMounts: + - name: restore-data + mountPath: /restore/data + volumeClaimTemplates: + - metadata: + name: restore-data + namespace: demo + spec: + accessModes: + - ReadWriteOnce + storageClassName: standard + resources: + requests: + storage: 1Gi +``` + +Let's create the Statefulset we have shown above. + +```bash + kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/volumesnapshot/statefulset/examples/restored-statefulset.yaml +service/svc created +statefulset.apps/restore-demo created +``` + +Now, wait for the pod of Statefulset to go into the `Running` state. + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +restore-demo-0 1/1 Running 0 3m9s +restore-demo-1 1/1 Running 0 2m50s +restore-demo-2 1/1 Running 0 2m30s +``` + +Verify that the backed up data has been restored in `/restore/data` directory using the following command, + +```bash +$ kubectl exec -n demo restore-demo-0 -- cat /restore/data/data.txt +stash-demo-0 +$ kubectl exec -n demo restore-demo-1 -- cat /restore/data/data.txt +stash-demo-0 +$ kubectl exec -n demo restore-demo-2 -- cat /restore/data/data.txt +stash-demo-0 +``` + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo statefulset stash-demo +kubectl delete -n demo statefulset restore-demo +kubectl delete -n demo backupconfiguration statefulset-volume-snapshot +kubectl delete -n demo restoresession restore-pvc +kubectl delete -n demo storageclass csi-standard +kubectl delete -n demo volumesnapshotclass csi-snapshot-class +``` diff --git a/content/docs/v2024.12.18/guides/workloads/_index.md b/content/docs/v2024.12.18/guides/workloads/_index.md new file mode 100644 index 0000000000..0d843efc34 --- /dev/null +++ b/content/docs/v2024.12.18/guides/workloads/_index.md @@ -0,0 +1,77 @@ +--- +title: Backup & Restore Volumes of Workloads | Stash +menu: + docs_v2024.12.18: + identifier: workload + name: Workload's Volumes + parent: guides + weight: 20 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/guides/workloads/daemonset/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/guides/workloads/daemonset/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..a702dc45e8 --- /dev/null +++ b/content/docs/v2024.12.18/guides/workloads/daemonset/examples/backupconfiguration.yaml @@ -0,0 +1,23 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: dmn-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: DaemonSet + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/guides/workloads/daemonset/examples/daemon.yaml b/content/docs/v2024.12.18/guides/workloads/daemonset/examples/daemon.yaml new file mode 100644 index 0000000000..986758d5db --- /dev/null +++ b/content/docs/v2024.12.18/guides/workloads/daemonset/examples/daemon.yaml @@ -0,0 +1,31 @@ +apiVersion: apps/v1 +kind: DaemonSet +metadata: + labels: + app: stash-demo + name: stash-demo + namespace: demo +spec: + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - args: ["echo sample_data > /source/data/data.txt && sleep 3000"] + command: ["/bin/sh", "-c"] + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + hostPath: + path: /stash/source/data diff --git a/content/docs/v2024.12.18/guides/workloads/daemonset/examples/recovered_daemon.yaml b/content/docs/v2024.12.18/guides/workloads/daemonset/examples/recovered_daemon.yaml new file mode 100644 index 0000000000..0ec9650bf4 --- /dev/null +++ b/content/docs/v2024.12.18/guides/workloads/daemonset/examples/recovered_daemon.yaml @@ -0,0 +1,32 @@ +apiVersion: apps/v1 +kind: DaemonSet +metadata: + labels: + app: stash-recovered + name: stash-recovered + namespace: demo +spec: + selector: + matchLabels: + app: stash-recovered + template: + metadata: + labels: + app: stash-recovered + name: busybox + spec: + containers: + - args: + - sleep + - "3600" + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + hostPath: + path: /stash/recovered/data diff --git a/content/docs/v2024.12.18/guides/workloads/daemonset/examples/repository.yaml b/content/docs/v2024.12.18/guides/workloads/daemonset/examples/repository.yaml new file mode 100644 index 0000000000..8746ae16ab --- /dev/null +++ b/content/docs/v2024.12.18/guides/workloads/daemonset/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: /source/data/sample-daemonset + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/guides/workloads/daemonset/examples/restoresession.yaml b/content/docs/v2024.12.18/guides/workloads/daemonset/examples/restoresession.yaml new file mode 100644 index 0000000000..293724c6dd --- /dev/null +++ b/content/docs/v2024.12.18/guides/workloads/daemonset/examples/restoresession.yaml @@ -0,0 +1,19 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: dmn-restore + namespace: demo +spec: + repository: + name: gcs-repo + target: # target indicates where the recovered data will be stored + ref: + apiVersion: apps/v1 + kind: DaemonSet + name: stash-recovered + volumeMounts: + - name: source-data + mountPath: /source/data + rules: + - paths: + - /source/data diff --git a/content/docs/v2024.12.18/guides/workloads/daemonset/images/gcs_bucket_dmn.png b/content/docs/v2024.12.18/guides/workloads/daemonset/images/gcs_bucket_dmn.png new file mode 100644 index 0000000000..dc2b02782d Binary files /dev/null and b/content/docs/v2024.12.18/guides/workloads/daemonset/images/gcs_bucket_dmn.png differ diff --git a/content/docs/v2024.12.18/guides/workloads/daemonset/index.md b/content/docs/v2024.12.18/guides/workloads/daemonset/index.md new file mode 100644 index 0000000000..3198fa207b --- /dev/null +++ b/content/docs/v2024.12.18/guides/workloads/daemonset/index.md @@ -0,0 +1,666 @@ +--- +title: Backup and Restore Volumes of a DaemonSet | Stash +description: A step by step guide showing how to backup and restore volumes of a DaemonSet. +menu: + docs_v2024.12.18: + identifier: workload-daemonset + name: Backup & Restore Volumes of a DaemonSet + parent: workload + weight: 40 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup and Restore Volumes of a DaemonSet + +This guide will show you how to use Stash to backup and restore volumes of a DaemonSet. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). + +- Install `Stash` in your cluster following the steps [here](/docs/v2024.12.18/setup/README). + +- You should be familiar with the following `Stash` concepts: + - [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) + - [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) + - [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + - [Repository](/docs/v2024.12.18/concepts/crds/repository/) + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> **Note:** YAML files used in this tutorial are stored in [docs/guides/workloads/daemonset/examples](/docs/v2024.12.18/guides/workloads/daemonset/examples) directory of [stashed/docs](https://github.com/stashed/docs) repository. + +## Backup Volumes of a DaemonSet + +This section will show you how to use Stash to backup volumes of a DaemonSet. Here, we are going to deploy a DaemonSet and generate some sample data in it. Then, we are going to backup this sample data using Stash. + +**Deploy DaemonSet:** + +At first, we are going to deploy a DaemonSet. This DaemonSet will automatically generate sample data (`data.txt` file) in `/source/data` directory. + +Below is the YAML of the DaemonSet that we are going to create, + +```yaml +apiVersion: apps/v1 +kind: DaemonSet +metadata: + labels: + app: stash-demo + name: stash-demo + namespace: demo +spec: + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - args: ["echo sample_data > /source/data/data.txt && sleep 3000"] + command: ["/bin/sh", "-c"] + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + hostPath: + path: /stash/source/data +``` + +Let's create the DaemonSet we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/workloads/daemonset/examples/daemon.yaml +daemonset.apps/stash-demo created +``` + +Now, wait for the pod of the DaemonSet to go into the `Running` state. + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-demo-c4nqw 1/1 Running 0 39s +``` + +Verify that the sample data has been created in `/source/data` directory using the following command, + +```bash +$ kubectl exec -n demo stash-demo-c4nqw -- cat /source/data/data.txt +sample_data +``` + +### Prepare Backend + +We are going to store our backed up data into a GCS bucket. We have to create a Secret with necessary credentials and a Repository crd to use this backend. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +> For GCS backend, if the bucket does not exist, Stash needs `Storage Object Admin` role permissions to create the bucket. For more details, please check the following [guide](/docs/v2024.12.18/guides/backends/gcs/). + +**Create Secret:** + +Let's create a secret called `gcs-secret` with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat /path/to/downloaded-sa-key.json > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create Repository:** + +Now, create a `Repository` using this secret. Below is the YAML of `Repository` crd we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: /source/data/sample-daemonset + storageSecretName: gcs-secret +``` + +Let's create the Repository we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/workloads/daemonset/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our sample data into this backend. + +### Backup + +We have to create a `BackupConfiguration` crd targeting the `stash-demo` DaemonSet that we have deployed earlier. Stash will inject a sidecar container into the target. It will also create a `CronJob` to take periodic backup of `/source/data` directory of the target. + +**Create BackupConfiguration:** + +Below is the YAML of the `BackupConfiguration` crd that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: dmn-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: DaemonSet + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Here, + +- `spec.repository` refers to the `Repository` object `gcs-repo` that holds backend information. +- `spec.schedule` is a cron expression that indicates `BackupSession` will be created at 5 minute interval. +- `spec.target.ref` refers to the `stash-demo` DaemonSet. +- `spec.target.volumeMounts` specifies a list of volumes and their mountPath that contain the target paths. +- `spec.target.paths` specifies list of file paths to backup. + +Let's create the `BackupConfiguration` crd we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/workloads/daemonset/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/dmn-backup created +``` + +**Verify Backup Setup Successful** + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. Let's verify the `Phase` of the BackupConfiguration, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +dmn-backup */5 * * * * Ready 11s +``` + +**Verify Sidecar:** + +Stash will inject a sidecar container into the `stash-demo` DaemonSet to take backup of `/source/data` directory. Let’s check that the sidecar has been injected successfully, + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-demo-6lnbp 2/2 Running 0 10s +``` + +Look at the pod. It now has 2 containers. If you view the resource definition of this pod, you will see that there is a container named `stash` which is running `run-backup` command. + +```yaml +$ kubectl get pod -n demo stash-demo-6lnbp -o yaml +apiVersion: v1 +kind: Pod +metadata: + name: stash-demo-6lnbp + namespace: demo + ... +spec: + containers: + - args: + - echo sample_data > /source/data/data.txt && sleep 3000 + command: + - /bin/sh + - -c + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /source/data + name: source-data + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: default-token-4tzgg + readOnly: true + - args: + - run-backup + - --backup-configuration=dmn-backup + - --secret-dir=/etc/stash/repository/secret + - --enable-cache=true + - --max-connections=0 + - --metrics-enabled=true + - --pushgateway-url=http://stash-operator.kube-system.svc:56789 + - --enable-status-subresource=true + - --use-kubeapiserver-fqdn-for-aks=true + - --logtostderr=true + - --alsologtostderr=false + - --v=3 + - --stderrthreshold=0 + env: + - name: NODE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName + - name: POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + name: stash + volumeMounts: + - mountPath: /etc/stash + name: stash-podinfo + - mountPath: /etc/stash/repository/secret + name: stash-secret-volume + - mountPath: /tmp + name: tmp-dir + - mountPath: /source/data + name: source-data + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: default-token-4tzgg + readOnly: true + volumes: + - name: source-data + persistentVolumeClaim: + claimName: stash-sample-data + - emptyDir: {} + name: tmp-dir + - downwardAPI: + defaultMode: 420 + items: + - fieldRef: + apiVersion: v1 + fieldPath: metadata.labels + path: labels + name: stash-podinfo + - name: stash-secret-volume + secret: + defaultMode: 420 + secretName: gcs-secret + - name: default-token-4tzgg + secret: + defaultMode: 420 + secretName: default-token-4tzgg + ... +... +``` + +**Verify CronJob:** + +It will also create a `CronJob` with the schedule specified in `spec.schedule` field of `BackupConfiguration` crd. + +Verify that the `CronJob` has been created using the following command, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED AGE +dmn-backup */5 * * * * 3m +``` + +**Wait for BackupSession:** + +The `dmn-backup` CronJob will trigger a backup on each schedule by creating a `BackupSession` crd. The sidecar container watches for the `BackupSession` crd. When it finds one, it will take backup immediately. + +Wait for the next schedule for backup. Run the following command to watch `BackupSession` crd, + +```bash +$ watch -n 3 kubectl get backupsession -n demo +Every 3.0s: kubectl get backupsession -n demo suaas-appscode: Wed Jun 26 16:05:26 2019 + +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +dmn-backup-1561543509 BackupConfiguration dmn-backup Succeeded 2m20s +``` + +We can see from the above output that the backup session has succeeded. Now, we are going to verify whether the backed up data has been stored in the backend. + +**Verify Backup:** + +Once a backup is complete, Stash will update the respective `Repository` crd to reflect the backup. Check that the repository `gcs-repo` has been updated by the following command, + +```bash +$ kubectl get repository -n demo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo true 0 B 3 47s 4m +``` + +Now, if we navigate to the GCS bucket, we are going to see backed up data has been stored in `source/data/sample-daemonset` directory as specified by `spec.backend.gcs.prefix` field of Repository crd. + +
+  Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +> **Note:** Stash keeps all the backed up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Restore the Backed up Data + +This section will show you how to restore the backed up data from the backend we have taken in the earlier section. + +**Stop Taking Backup of the Old DaemonSet:** + +At first, let's stop taking any further backup of the old DaemonSet so that no backup is taken during the restore process. We are going to pause the `BackupConfiguration` that we created to backup the `stash-demo` DaemonSet. Then, Stash will stop taking any further backup for this DaemonSet. You can learn more how to pause a scheduled backup [here](/docs/v2024.12.18/guides/use-cases/pause-backup/) + +Let's pause the `dmn-backup` BackupConfiguration, + +```bash +$ kubectl patch backupconfiguration -n demo dmn-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/dmn-backup patched +``` + +Now, wait for a moment. Stash will pause the BackupConfiguration. Verify that the BackupConfiguration has been paused, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +dmn-backup */5 * * * * true Ready 26m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the BackupConfiguration has been paused. + +**Deploy DaemonSet:** + +We are going to create a new DaemonSet named `stash-recovered` and restore the backed up data inside it. + +Below is the YAML of the DaemonSet that we are going to create, + +```yaml +apiVersion: apps/v1 +kind: DaemonSet +metadata: + labels: + app: stash-recovered + name: stash-recovered + namespace: demo +spec: + selector: + matchLabels: + app: stash-recovered + template: + metadata: + labels: + app: stash-recovered + name: busybox + spec: + containers: + - args: + - sleep + - "3600" + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + hostPath: + path: /stash/recovered/data +``` + +Let's create the DaemonSet we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/workloads/daemonset/examples/recovered_daemon.yaml +daemonset.apps/stash-recovered configured +``` + +**Create RestoreSession:** + +Now, we need to create a `RestoreSession` crd targeting the `stash-recovered` DaemonSet to restore the backed up data inside it. + +Below is the YAML of the `RestoreSesion` crd that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: dmn-restore + namespace: demo +spec: + repository: + name: gcs-repo + target: # target indicates where the recovered data will be stored + ref: + apiVersion: apps/v1 + kind: DaemonSet + name: stash-recovered + volumeMounts: + - name: source-data + mountPath: /source/data + rules: + - paths: + - /source/data +``` + +Here, + +- `spec.repository.name` specifies the `Repository` crd that holds the backend information where our backed up data has been stored. +- `spec.target.ref` refers to the target workload where the recovered data will be stored. +- `spec.target.volumeMounts` specifies a list of volumes and their mountPath where the data will be restored. + - `mountPath` must be same `mountPath` as the original volume because Stash stores absolute path of the backed up files. If you use different `mountPath` for the restored volume the backed up files will not be restored into your desired volume. + +Let's create the `RestoreSession` crd we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/workloads/daemonset/examples/restoresession.yaml +restoresession.stash.appscode.com/dmn-restore created +``` + +Once, you have created the `RestoreSession` crd, Stash will inject `init-container` into `stash-recovered` DaemonSet. The pods of this DaemonSet will restart and the `init-container` will restore the desired data on start-up. + +**Verify Init-Container:** + +Wait until the `init-container` has been injected into the `stash-recovered` DaemonSet. Let's describe the DaemonSet to verify that the `init-container` has been injected successfully. + +```yaml + $ kubectl describe daemonset -n demo stash-recovered +Name: stash-recovered +Selector: app=stash-recovered +Node-Selector: +Labels: app=stash-recovered +Pods Status: 1 Running / 0 Waiting / 0 Succeeded / 0 Failed +... +Pod Template: + Labels: app=stash-recovered + Annotations: stash.appscode.com/last-applied-restoresession-hash: 4703201294184533055 + Init Containers: + stash-init: + Image: suaas21/stash:vs_linux_amd64 + Port: + Host Port: + Args: + restore + --restore-session=dmn-restore + --secret-dir=/etc/stash/repository/secret + --enable-cache=true + --max-connections=0 + --metrics-enabled=true + --pushgateway-url=http://stash-operator.kube-system.svc:56789 + --enable-status-subresource=true + --use-kubeapiserver-fqdn-for-aks=true + --logtostderr=true + --alsologtostderr=false + --v=3 + --stderrthreshold=0 + Environment: + NODE_NAME: (v1:spec.nodeName) + POD_NAME: (v1:metadata.name) + Mounts: + /etc/stash/repository/secret from stash-secret-volume (rw) + /source/data from source-data (rw) + /tmp from tmp-dir (rw) + Containers: + busybox: + Image: busybox + Port: + Host Port: + Args: + sleep + 3600 + Environment: + Mounts: + /source/data from source-data (rw) + Volumes: + source-data: + Type: HostPath (bare host directory volume) + Path: /stash/recovered/data + HostPathType: + tmp-dir: + Type: EmptyDir (a temporary directory that shares a pod's lifetime) + Medium: + SizeLimit: + stash-podinfo: + Type: DownwardAPI (a volume populated by information about the pod) + Items: + metadata.labels -> labels + stash-secret-volume: + Type: Secret (a volume populated by a Secret) + SecretName: gcs-secret + Optional: false +... +``` + +Notice the `Init-Containers` section. We can see that the init-container `stash-init` has been injected which is running `restore` command. + +**Wait for RestoreSession to Succeeded:** + +Run the following command to watch RestoreSession phase, + +```bash +$ watch -n 3 kubectl get restoresession -n demo +Every 3.0s: kubectl get restoresession -n demo suaas-appscode: Wed Jun 26 14:28:29 2019 + +NAME REPOSITORY-NAME PHASE AGE +dmn-restore gcs-repo Succeeded 3m29s +``` + +So, we can see from the output of the above command that the restore process succeeded. + +> **Note:** If you want to restore the backed up data inside the same DaemonSet whose volumes were backed up, you have to remove the corrupted data from the DaemonSet. Then, you have to create a RestoreSession targeting the DaemonSet. + +**Verify Restored Data:** + +In this section, we are going to verify that the desired data has been restored successfully. + +At first, check if the `stash-recovered` pods of a DaemonSet has gone into `running` state by the following command, + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-recovered-dqlrb 1/1 Running 0 4m4s +``` + +Verify that the backed up data has been restored in `/source/data` directory of the `stash-recovered` pods of a DaemonSet using the following command, + +```bash +$ kubectl exec -n demo stash-recovered-dqlrb -- cat /source/data/data.txt +sample_data +``` + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo daemonset stash-demo +kubectl delete -n demo daemonset stash-recovered +kubectl delete -n demo backupconfiguration dmn-backup +kubectl delete -n demo restoresession dmn-restore +kubectl delete -n demo repository gcs-repo +kubectl delete -n demo pvc --all +``` diff --git a/content/docs/v2024.12.18/guides/workloads/deployment/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/guides/workloads/deployment/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..dadd561724 --- /dev/null +++ b/content/docs/v2024.12.18/guides/workloads/deployment/examples/backupconfiguration.yaml @@ -0,0 +1,23 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/guides/workloads/deployment/examples/deployment.yaml b/content/docs/v2024.12.18/guides/workloads/deployment/examples/deployment.yaml new file mode 100644 index 0000000000..bd465037e8 --- /dev/null +++ b/content/docs/v2024.12.18/guides/workloads/deployment/examples/deployment.yaml @@ -0,0 +1,32 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-demo + name: stash-demo + namespace: demo +spec: + replicas: 3 + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - args: ["echo sample_data > /source/data/data.txt && sleep 3000"] + command: ["/bin/sh", "-c"] + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + persistentVolumeClaim: + claimName: stash-sample-data diff --git a/content/docs/v2024.12.18/guides/workloads/deployment/examples/pvc.yaml b/content/docs/v2024.12.18/guides/workloads/deployment/examples/pvc.yaml new file mode 100644 index 0000000000..b40124e192 --- /dev/null +++ b/content/docs/v2024.12.18/guides/workloads/deployment/examples/pvc.yaml @@ -0,0 +1,11 @@ +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: stash-sample-data + namespace: demo +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi diff --git a/content/docs/v2024.12.18/guides/workloads/deployment/examples/recovered_deployment.yaml b/content/docs/v2024.12.18/guides/workloads/deployment/examples/recovered_deployment.yaml new file mode 100644 index 0000000000..f49b6fe046 --- /dev/null +++ b/content/docs/v2024.12.18/guides/workloads/deployment/examples/recovered_deployment.yaml @@ -0,0 +1,46 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: demo-pvc + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: standard + resources: + requests: + storage: 1Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-recovered + name: stash-recovered + namespace: demo +spec: + replicas: 3 + selector: + matchLabels: + app: stash-recovered + template: + metadata: + labels: + app: stash-recovered + name: busybox + spec: + containers: + - args: + - sleep + - "3600" + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + persistentVolumeClaim: + claimName: demo-pvc diff --git a/content/docs/v2024.12.18/guides/workloads/deployment/examples/repository.yaml b/content/docs/v2024.12.18/guides/workloads/deployment/examples/repository.yaml new file mode 100644 index 0000000000..bce1093b20 --- /dev/null +++ b/content/docs/v2024.12.18/guides/workloads/deployment/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: /source/data/sample-deployment + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/guides/workloads/deployment/examples/restoresession.yaml b/content/docs/v2024.12.18/guides/workloads/deployment/examples/restoresession.yaml new file mode 100644 index 0000000000..6afadfeed6 --- /dev/null +++ b/content/docs/v2024.12.18/guides/workloads/deployment/examples/restoresession.yaml @@ -0,0 +1,19 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: deployment-restore + namespace: demo +spec: + repository: + name: gcs-repo + target: # target indicates where the recovered data will be stored + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-recovered + volumeMounts: + - name: source-data + mountPath: /source/data + rules: + - paths: + - /source/data/ diff --git a/content/docs/v2024.12.18/guides/workloads/deployment/images/gcs_bucket_dep.png b/content/docs/v2024.12.18/guides/workloads/deployment/images/gcs_bucket_dep.png new file mode 100644 index 0000000000..c9bf94e426 Binary files /dev/null and b/content/docs/v2024.12.18/guides/workloads/deployment/images/gcs_bucket_dep.png differ diff --git a/content/docs/v2024.12.18/guides/workloads/deployment/index.md b/content/docs/v2024.12.18/guides/workloads/deployment/index.md new file mode 100644 index 0000000000..2a9d25cb04 --- /dev/null +++ b/content/docs/v2024.12.18/guides/workloads/deployment/index.md @@ -0,0 +1,724 @@ +--- +title: Backup and Restore Volumes of a Deployment | Stash +description: A step by step guide showing how to backup and restore volumes of a Deployment. +menu: + docs_v2024.12.18: + identifier: workload-deployment + name: Backup & Restore Volumes of a Deployment + parent: workload + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup and Restore Volumes of a Deployment + +This guide will show you how to use Stash to backup and restore volumes of a Deployment. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). + +- Install `Stash` in your cluster following the steps [here](/docs/v2024.12.18/setup/README). + +- You should be familiar with the following `Stash` concepts: + - [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) + - [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) + - [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + - [Repository](/docs/v2024.12.18/concepts/crds/repository/) + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> **Note:** YAML files used in this tutorial are stored in [docs/guides/workloads/deployment/examples](/docs/v2024.12.18/guides/workloads/deployment/examples) directory of [stashed/docs](https://github.com/stashed/docs) repository. + +## Backup Volumes of a Deployment + +This section will show you how to use Stash to backup volumes of a Deployment. Here, we are going to deploy a Deployment with a PVC and generate some sample data in it. Then, we are going to backup this sample data using Stash. + +### Prepare Workload + +At first, we are going to create a PVC then we are going to create a Deployment that will use this PVC. + +**Create PVC:** + +Below is the YAML of the sample PVC that we are going to create, + +```yaml +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: stash-sample-data + namespace: demo +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi +``` + +Let's create the PVC we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/workloads/deployment/examples/pvc.yaml +persistentvolumeclaim/stash-sample-data created +``` + +**Deploy Deployment:** + +Now, we are going to deploy a Deployment that uses the above PVC. This Deployment will automatically generate sample data (`data.txt` file) in `/source/data` directory where we have mounted the PVC. + +Below is the YAML of the Deployment that we are going to create, + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-demo + name: stash-demo + namespace: demo +spec: + replicas: 3 + selector: + matchLabels: + app: stash-demo + template: + metadata: + labels: + app: stash-demo + name: busybox + spec: + containers: + - args: ["echo sample_data > /source/data/data.txt && sleep 3000"] + command: ["/bin/sh", "-c"] + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + persistentVolumeClaim: + claimName: stash-sample-data +``` + +Let's create the Deployment we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/workloads/deployment/examples/deployment.yaml +deployment.apps/stash-demo created +``` + +Now, wait for the pods of the Deployment to go into the `Running` state. + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-demo-8cfcbcc89-2z6mq 1/1 Running 0 30s +stash-demo-8cfcbcc89-j9wbc 1/1 Running 0 30s +stash-demo-8cfcbcc89-q8xfd 1/1 Running 0 30s +``` + +Verify that the sample data has been created in `/source/data` directory using the following command, + +```bash +$ kubectl exec -n demo stash-demo-8cfcbcc89-2z6mq -- cat /source/data/data.txt +sample_data +``` + +### Prepare Backend + +We are going to store our backed up data into a GCS bucket. We have to create a Secret with necessary credentials and a Repository crd to use this backend. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +> For GCS backend, if the bucket does not exist, Stash needs `Storage Object Admin` role permissions to create the bucket. For more details, please check the following [guide](/docs/v2024.12.18/guides/backends/gcs/). + +**Create Secret:** + +Let's create a secret called `gcs-secret` with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat /path/to/downloaded-sa-key.json > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +**Create Repository:** + +Now, create a `Repository` using this secret. Below is the YAML of `Repository` crd we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: /source/data/sample-deployment + storageSecretName: gcs-secret +``` + +Let's create the Repository we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/workloads/deployment/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our sample data into this backend. + +### Backup + +We have to create a `BackupConfiguration` crd targeting the `stash-demo` Deployment that we have deployed earlier. Stash will inject a sidecar container into the target. It will also create a `CronJob` to take periodic backup of `/source/data` directory of the target. + +**Create BackupConfiguration:** + +Below is the YAML of the `BackupConfiguration` crd that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: deployment-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Here, + +- `spec.repository` refers to the `Repository` object `gcs-repo` that holds backend information. +- `spec.schedule` is a cron expression that indicates `BackupSession` will be created at 5 minute interval. +- `spec.target.ref` refers to the `stash-demo` Deployment. +- `spec.target.volumeMounts` specifies a list of volumes and their mountPath that contain the target paths. +- `spec.target.paths` specifies list of file paths to backup. + +Let's create the `BackupConfiguration` crd we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/workloads/deployment/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/deployment-backup created +``` + +**Verify Backup Setup Successful** + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. Let's verify the `Phase` of the BackupConfiguration, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +deployment-backup */5 * * * * Ready 11s +``` + + +**Verify Sidecar:** + +Stash will inject a sidecar container into the `stash-demo` Deployment to take backup of `/source/data` directory. Let’s check that the sidecar has been injected successfully, + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-demo-856896bd95-4gfbh 2/2 Running 0 12s +stash-demo-856896bd95-njr8x 2/2 Running 0 17s +stash-demo-856896bd95-ttbq4 2/2 Running 0 15s +``` + +Look at the pod. It now has 2 containers. If you view the resource definition of this pod, you will see that there is a container named `stash` which is running `run-backup` command. + +```yaml +$ kubectl get pod -n demo stash-demo-856896bd95-4gfbh -o yaml +apiVersion: v1 +kind: Pod +metadata: + name: stash-demo-856896bd95-4gfbh + namespace: demo + ... +spec: + containers: + - args: + - echo sample_data > /source/data/data.txt && sleep 3000 + command: + - /bin/sh + - -c + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /source/data + name: source-data + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: default-token-4tzgg + readOnly: true + - args: + - run-backup + - --backup-configuration=deployment-backup + - --secret-dir=/etc/stash/repository/secret + - --enable-cache=true + - --max-connections=0 + - --metrics-enabled=true + - --pushgateway-url=http://stash-operator.kube-system.svc:56789 + - --enable-status-subresource=true + - --use-kubeapiserver-fqdn-for-aks=true + - --logtostderr=true + - --alsologtostderr=false + - --v=3 + - --stderrthreshold=0 + env: + - name: NODE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName + - name: POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + volumeMounts: + - mountPath: /etc/stash + name: stash-podinfo + - mountPath: /etc/stash/repository/secret + name: stash-secret-volume + - mountPath: /tmp + name: tmp-dir + - mountPath: /source/data + name: source-data + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: default-token-4tzgg + readOnly: true + volumes: + - name: source-data + persistentVolumeClaim: + claimName: stash-sample-data + - emptyDir: {} + name: tmp-dir + - downwardAPI: + defaultMode: 420 + items: + - fieldRef: + apiVersion: v1 + fieldPath: metadata.labels + path: labels + name: stash-podinfo + - name: stash-secret-volume + secret: + defaultMode: 420 + secretName: gcs-secret + - name: default-token-4tzgg + secret: + defaultMode: 420 + secretName: default-token-4tzgg + ... +... +``` + +**Verify CronJob:** + +It will also create a `CronJob` with the schedule specified in `spec.schedule` field of `BackupConfiguration` crd. + +Verify that the `CronJob` has been created using the following command, + +```bash +$ kubectl get cronjob -n demo +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +deployment-backup */5 * * * * False 0 35s 64s +``` + +**Wait for BackupSession:** + +The `deployment-backup` CronJob will trigger a backup on each scheduled slot by creating a `BackupSession` crd. The sidecar container watches for the `BackupSession` crd. When it finds one, it will take backup immediately. + +Wait for the next schedule for backup. Run the following command to watch `BackupSession` crd, + +```bash +$ kubectl get backupsession -n demo -w + +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +deployment-backup-1561350125 BackupConfiguration deployment-backup Running 10s +deployment-backup-1561350125 BackupConfiguration deployment-backup Running 35s +deployment-backup-1561350125 BackupConfiguration deployment-backup Succeeded 63s +``` + +We can see from the above output that the backup session has succeeded. Now, we are going to verify whether the backed up data has been stored in the backend. + +**Verify Backup:** + +Once a backup is complete, Stash will update the respective `Repository` crd to reflect the backup. Check that the repository `gcs-repo` has been updated by the following command, + +```bash +$ kubectl get repository -n demo gcs-repo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo true 0 B 5 58s 18m +``` + +Now, if we navigate to the GCS bucket, we are going to see backed up data has been stored in `source/data/sample-deployment` directory as specified by `spec.backend.gcs.prefix` field of Repository crd. + +
+  Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +> **Note:** Stash keeps all the backed up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Restore the Backed up Data + +This section will show you how to restore the backed up data from the backend we have taken in the earlier section. + +**Stop Taking Backup of the Old Deployment:** + +At first, let's stop taking any further backup of the old Deployment so that no backup is taken during the restore process. We are going to pause the `BackupConfiguration` that we created to backup the `stash-demo` Deployment. Then, Stash will stop taking any further backup for this Deployment. You can learn more how to pause a scheduled backup [here](/docs/v2024.12.18/guides/use-cases/pause-backup/) + +Let's pause the `deployment-backup` BackupConfiguration, + +```bash +$ kubectl patch backupconfiguration -n demo deployment-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/deployment-backup patched +``` + +Now, wait for a moment. Stash will pause the BackupConfiguration. Verify that the BackupConfiguration has been paused, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +deployment-backup */5 * * * * true Ready 26m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the BackupConfiguration has been paused. + +**Deploy Deployment:** + +We are going to create a new Deployment named `stash-recovered` and restore the backed up data inside it. + +Below are the YAMLs of the Deployment and PVC that we are going to create, + +```yaml +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: demo-pvc + namespace: demo +spec: + accessModes: + - ReadWriteOnce + storageClassName: standard + resources: + requests: + storage: 1Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: stash-recovered + name: stash-recovered + namespace: demo +spec: + replicas: 3 + selector: + matchLabels: + app: stash-recovered + template: + metadata: + labels: + app: stash-recovered + name: busybox + spec: + containers: + - args: + - sleep + - "3600" + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + volumeMounts: + - mountPath: /source/data + name: source-data + restartPolicy: Always + volumes: + - name: source-data + persistentVolumeClaim: + claimName: demo-pvc +``` + +Let's create the Deployment and PVC we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/workloads/deployment/examples/recovered_deployment.yaml +persistentvolumeclaim/demo-pvc created +deployment.apps/stash-recovered created +``` + +**Create RestoreSession:** + +Now, we need to create a `RestoreSession` crd targeting the `stash-recovered` Deployment to restore the backed up data inside it. + +Below is the YAML of the `RestoreSesion` crd that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: deployment-restore + namespace: demo +spec: + repository: + name: gcs-repo + target: # target indicates where the recovered data will be stored + ref: + apiVersion: apps/v1 + kind: Deployment + name: stash-recovered + volumeMounts: + - name: source-data + mountPath: /source/data + rules: + - paths: + - /source/data/ +``` + +Here, + +- `spec.repository.name` specifies the `Repository` crd that holds the backend information where our backed up data has been stored. +- `spec.target.ref` refers to the target workload where the recovered data will be stored. +- `spec.target.volumeMounts` specifies a list of volumes and their mountPath where the data will be restored. + - `mountPath` must be same `mountPath` as the original volume because Stash stores absolute path of the backed up files. If you use different `mountPath` for the restored volume the backed up files will not be restored into your desired volume. + +Let's create the `RestoreSession` crd we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/workloads/deployment/examples/restoresession.yaml +restoresession.stash.appscode.com/deployment-restore created +``` + +Once, you have created the `RestoreSession` crd, Stash will inject `init-container` into `stash-recovered` Deployment. Deployment will restart and the `init-container` will restore the desired data on start-up. + +**Verify Init-Container:** + +Wait until the `init-container` has been injected into the `stash-recovered` Deployment. Let’s describe the Deployment to verify that `init-container` has been injected successfully. + +```yaml +$ kubectl describe deployment -n demo stash-recovered +Name: stash-recovered +Namespace: demo +Labels: app=stash-recovered +Selector: app=stash-recovered +Replicas: 3 desired | 3 updated | 3 total | 3 available | +... +Pod Template: + Labels: app=stash-recovered + Annotations: stash.appscode.com/last-applied-restoresession-hash: 14443247646000846167 + Init Containers: + stash-init: + Image: suaas21/stash:vs_linux_amd64 + Port: + Host Port: + Args: + restore + --restore-session=deployment-restore + --secret-dir=/etc/stash/repository/secret + --enable-cache=true + --max-connections=0 + --metrics-enabled=true + --pushgateway-url=http://stash-operator.kube-system.svc:56789 + --enable-status-subresource=true + --use-kubeapiserver-fqdn-for-aks=true + --logtostderr=true + --alsologtostderr=false + --v=3 + --stderrthreshold=0 + Environment: + NODE_NAME: (v1:spec.nodeName) + POD_NAME: (v1:metadata.name) + Mounts: + /etc/stash/repository/secret from stash-secret-volume (rw) + /source/data from source-data (rw) + /tmp from tmp-dir (rw) + Containers: + busybox: + Image: busybox + Port: + Host Port: + Args: + sleep + 3600 + Environment: + Mounts: + /source/data from source-data (rw) + Volumes: + source-data: + Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace) + ClaimName: demo-pvc + ReadOnly: false + tmp-dir: + Type: EmptyDir (a temporary directory that shares a pod's lifetime) + Medium: + SizeLimit: + stash-podinfo: + Type: DownwardAPI (a volume populated by information about the pod) + Items: + metadata.labels -> labels + stash-secret-volume: + Type: Secret (a volume populated by a Secret) + SecretName: gcs-secret + Optional: false +Conditions: + Type Status Reason + ---- ------ ------ + Available True MinimumReplicasAvailable + Progressing True NewReplicaSetAvailable +OldReplicaSets: stash-recovered-7478988f57 (3/3 replicas created) +NewReplicaSet: +... +``` + +Notice the `Init-Containers` section. We can see that the init-container `stash-init` has been injected which is running `restore` command. + +**Wait for RestoreSession to Succeeded:** + +Run the following command to watch RestoreSession phase, + +```bash +$ kubectl get restoresession -n demo -w + +NAME REPOSITORY-NAME PHASE AGE +deployment-restore gcs-repo Succeeded 2m56s +``` + +So, we can see from the output of the above command that the restore process succeeded. + +> **Note:** If you want to restore the backed up data inside the same Deployment whose volumes were backed up, you have to remove the corrupted data from the Deployment. Then, you have to create a RestoreSession targeting the Deployment. + +**Verify Restored Data:** + +In this section, we are going to verify that the desired data has been restored successfully. + +At first, check if the `stash-recovered` pods of the Deployment has gone into `Running` state by the following command, + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-recovered-867688ddd5-67xr8 1/1 Running 0 21m +stash-recovered-867688ddd5-rfsw4 1/1 Running 0 21m +stash-recovered-867688ddd5-zswhs 1/1 Running 0 22m +``` + +Verify that the sample data has been restored in `/source/data` directory of the `stash-recovered` pods of the Deployment using the following command, + +```bash +$ kubectl exec -n demo stash-recovered-867688ddd5-67xr8 -- cat /source/data/data.txt +sample_data +``` + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo deployment stash-demo +kubectl delete -n demo deployment stash-recovered +kubectl delete -n demo backupconfiguration deployment-backup +kubectl delete -n demo restoresession deployment-restore +kubectl delete -n demo repository gcs-repo +kubectl delete -n demo pvc --all +``` diff --git a/content/docs/v2024.12.18/guides/workloads/overview/images/backup_overview.svg b/content/docs/v2024.12.18/guides/workloads/overview/images/backup_overview.svg new file mode 100644 index 0000000000..0b078a81ec --- /dev/null +++ b/content/docs/v2024.12.18/guides/workloads/overview/images/backup_overview.svg @@ -0,0 +1,762 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/guides/workloads/overview/images/restore_overview.svg b/content/docs/v2024.12.18/guides/workloads/overview/images/restore_overview.svg new file mode 100644 index 0000000000..1f450f6387 --- /dev/null +++ b/content/docs/v2024.12.18/guides/workloads/overview/images/restore_overview.svg @@ -0,0 +1,692 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/docs/v2024.12.18/guides/workloads/overview/index.md b/content/docs/v2024.12.18/guides/workloads/overview/index.md new file mode 100644 index 0000000000..7939b2f1db --- /dev/null +++ b/content/docs/v2024.12.18/guides/workloads/overview/index.md @@ -0,0 +1,153 @@ +--- +title: Backup and Restore Workload Data Overview | Stash +description: An overview on how Backup and Restore of workload data works in Stash. +menu: + docs_v2024.12.18: + identifier: workload-overview + name: How Backup and Restore works? + parent: workload + weight: 10 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup and Restore Workloads using Stash + +This guide will show you how Stash backs up and restores volumes of various workload types (Deployment, StatefulSet, DaemonSet etc.). + +## Before You Begin + +- You should be familiar with the following `Stash` concepts: + - [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) + - [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) + - [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + - [Repository](/docs/v2024.12.18/concepts/crds/repository/) + +## How Backup Process Works + +The following diagram shows how Stash takes backup of the volumes of a workload. Open the image in a new tab to see the enlarged version. + +
+  Stash Backup Flow +
Fig: Backup process of Workload volumes in Stash
+
+ +The backup process consists of the following steps: + +1. At first, a user creates a Secret. This secret holds the credentials to access the backend where the backed up data will be stored. + +2. Then, she creates a `Repository` crd which represents the original repository in the backend. + +3. Then, she creates a `BackupConfiguration` crd which specifies the targeted workload and desired file paths to backup. It also specifies the `Repository` object that holds the backend information where the backed up data will be stored. + +4. Stash operator watches for `BackupConfiguration` objects. + +5. When it finds a `BackupConfiguration` object, it finds the targeted workload and injects a sidecar named `stash`. + +6. It also creates a `CronJob` to trigger backups periodically. + +7. The`CronJob` triggers backup on each scheduled slot by creating a `BackupSession` crd. + +8. The `stash` sidecar inside the workload watches for `BackupSession` crd. + +9. When it finds a `BackupSession` crd, it initiates backup of the targeted file paths. + +10. Once the backup process is completed, the `sidecar` sends Prometheus metrics to the Pushgateway running inside the `stash-operator` pod. It also updates respective `BackupSession` and `Repository` status to reflect the backup process. + +## How Restore Process Works + +The following diagram shows how Stash restores backed up data inside a workload. Open the image in a new tab to see the enlarged version. + +
+  Stash Backup Flow +
Fig: Restore process of Workload volumes in Stash
+
+ +The restore process consists of the following steps: + +1. At first, the user creates a workload where the data will be restored. + +2. Then, she creates a `RestoreSession` crd that specifies the targeted workload where the backed up data will be restored. It also specifies the respective `Repository` that holds the respective backend information. + +3. Stash operator watches for `RestoreSession` crds. + +4. When it finds a `RestoreSession` crd, it injects an init-container named `stash-init` to the workload and restart it. + +5. The init-container restores the desired data from the backend on start-up. + +6. Finally, when the restore process is completed it sends Prometheus metrics to the `pushgateway` running inside the stash operator. It also update the `RestoreSession` status to reflect the restore process. + +> **Note:** If your workload restarts with the `stash-init` init-container for any reason, the init-container will skip running restore process if there is no pending `RestoreSession` for this workload. + +## Next Steps + +1. See a step by step guide to backup/restore volumes of a Deployment [here](/docs/v2024.12.18/guides/workloads/deployment/). +2. See a step by step guide to backup/restore volumes of a StatefulSet [here](/docs/v2024.12.18/guides/workloads/statefulset/). +3. See a step by step guide to backup/restore a Daemonset's volumes [here](/docs/v2024.12.18/guides/workloads/daemonset/). diff --git a/content/docs/v2024.12.18/guides/workloads/statefulset/examples/adv_restoresession.yaml b/content/docs/v2024.12.18/guides/workloads/statefulset/examples/adv_restoresession.yaml new file mode 100644 index 0000000000..74ae0bf84a --- /dev/null +++ b/content/docs/v2024.12.18/guides/workloads/statefulset/examples/adv_restoresession.yaml @@ -0,0 +1,26 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: ss-restore + namespace: demo +spec: + driver: Restic + repository: + name: gcs-repo + target: + ref: + apiVersion: apps/v1 + kind: StatefulSet + name: stash-recovered-adv + volumeMounts: + - mountPath: /source/data + name: source-data + rules: + - targetHosts: ["host-3","host-4"] + sourceHost: "host-1" + paths: + - /source/data + - targetHosts: [] + sourceHost: "" + paths: + - /source/data diff --git a/content/docs/v2024.12.18/guides/workloads/statefulset/examples/adv_statefulset.yaml b/content/docs/v2024.12.18/guides/workloads/statefulset/examples/adv_statefulset.yaml new file mode 100644 index 0000000000..f795556447 --- /dev/null +++ b/content/docs/v2024.12.18/guides/workloads/statefulset/examples/adv_statefulset.yaml @@ -0,0 +1,51 @@ +apiVersion: v1 +kind: Service +metadata: + name: adv-headless + namespace: demo +spec: + ports: + - name: http + port: 80 + targetPort: 0 + selector: + app: stash-recovered-adv + clusterIP: None +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: stash-recovered-adv + namespace: demo + labels: + app: stash-recovered-adv +spec: + replicas: 5 + selector: + matchLabels: + app: stash-recovered-adv + serviceName: adv-headless + template: + metadata: + labels: + app: stash-recovered-adv + spec: + containers: + - name: busybox + image: busybox + command: + - sleep + - '3600' + volumeMounts: + - name: source-data + mountPath: "/source/data" + imagePullPolicy: IfNotPresent + volumeClaimTemplates: + - metadata: + name: source-data + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi diff --git a/content/docs/v2024.12.18/guides/workloads/statefulset/examples/backupconfiguration.yaml b/content/docs/v2024.12.18/guides/workloads/statefulset/examples/backupconfiguration.yaml new file mode 100644 index 0000000000..11b43fad7d --- /dev/null +++ b/content/docs/v2024.12.18/guides/workloads/statefulset/examples/backupconfiguration.yaml @@ -0,0 +1,23 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: ss-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: StatefulSet + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true diff --git a/content/docs/v2024.12.18/guides/workloads/statefulset/examples/custom_restore.yaml b/content/docs/v2024.12.18/guides/workloads/statefulset/examples/custom_restore.yaml new file mode 100644 index 0000000000..088b205830 --- /dev/null +++ b/content/docs/v2024.12.18/guides/workloads/statefulset/examples/custom_restore.yaml @@ -0,0 +1,77 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: ss-custom-restore + namespace: demo +spec: + repository: + name: local-repo + target: # target indicates where the recovered data will be stored + ref: + apiVersion: apps/v1 + kind: StatefulSet + name: scaled-up-stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + rules: + - targetHosts: ["host-3","host-4"] # "host-3" and "host-4" will have restored data of backed up host "host-1" + sourceHost: "host-1" # source host + paths: + - /source/data + - targetHosts: [] # empty host match all hosts + sourceHost: "" # no source host indicates that the host is pod itself + paths: + - /source/data +--- +apiVersion: v1 +kind: Service +metadata: + name: headless + namespace: demo +spec: + ports: + - name: http + port: 80 + targetPort: 0 + selector: + app: stash-demo + clusterIP: None +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: scaled-up-stash-demo + namespace: demo + labels: + app: stash-demo +spec: + replicas: 5 + selector: + matchLabels: + app: stash-demo + serviceName: headless + template: + metadata: + labels: + app: stash-demo + spec: + containers: + - name: busybox + image: busybox + command: + - sleep + - '3600' + volumeMounts: + - name: source-data + mountPath: "/source/data" + imagePullPolicy: IfNotPresent + volumeClaimTemplates: + - metadata: + name: source-data + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi diff --git a/content/docs/v2024.12.18/guides/workloads/statefulset/examples/recovered_statefulset.yaml b/content/docs/v2024.12.18/guides/workloads/statefulset/examples/recovered_statefulset.yaml new file mode 100644 index 0000000000..d0fe019e6e --- /dev/null +++ b/content/docs/v2024.12.18/guides/workloads/statefulset/examples/recovered_statefulset.yaml @@ -0,0 +1,51 @@ +apiVersion: v1 +kind: Service +metadata: + name: re-headless + namespace: demo +spec: + ports: + - name: http + port: 80 + targetPort: 0 + selector: + app: stash-recovered + clusterIP: None +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: stash-recovered + namespace: demo + labels: + app: stash-recovered +spec: + replicas: 3 + selector: + matchLabels: + app: stash-recovered + serviceName: re-headless + template: + metadata: + labels: + app: stash-recovered + spec: + containers: + - name: busybox + image: busybox + command: + - sleep + - '3600' + volumeMounts: + - name: source-data + mountPath: "/source/data" + imagePullPolicy: IfNotPresent + volumeClaimTemplates: + - metadata: + name: source-data + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi diff --git a/content/docs/v2024.12.18/guides/workloads/statefulset/examples/repository.yaml b/content/docs/v2024.12.18/guides/workloads/statefulset/examples/repository.yaml new file mode 100644 index 0000000000..c2ec0954d2 --- /dev/null +++ b/content/docs/v2024.12.18/guides/workloads/statefulset/examples/repository.yaml @@ -0,0 +1,11 @@ +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: /source/data/sample-statefulset + storageSecretName: gcs-secret diff --git a/content/docs/v2024.12.18/guides/workloads/statefulset/examples/restoresession.yaml b/content/docs/v2024.12.18/guides/workloads/statefulset/examples/restoresession.yaml new file mode 100644 index 0000000000..f7a58dcb4c --- /dev/null +++ b/content/docs/v2024.12.18/guides/workloads/statefulset/examples/restoresession.yaml @@ -0,0 +1,19 @@ +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: ss-restore + namespace: demo +spec: + repository: + name: gcs-repo + target: + ref: + apiVersion: apps/v1 + kind: StatefulSet + name: stash-recovered + volumeMounts: + - name: source-data + mountPath: /source/data + rules: + - paths: + - /source/data diff --git a/content/docs/v2024.12.18/guides/workloads/statefulset/examples/statefulset.yaml b/content/docs/v2024.12.18/guides/workloads/statefulset/examples/statefulset.yaml new file mode 100644 index 0000000000..9f6579069f --- /dev/null +++ b/content/docs/v2024.12.18/guides/workloads/statefulset/examples/statefulset.yaml @@ -0,0 +1,54 @@ +apiVersion: v1 +kind: Service +metadata: + name: headless + namespace: demo +spec: + ports: + - name: http + port: 80 + targetPort: 0 + selector: + app: stash-demo + clusterIP: None +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: stash-demo + namespace: demo + labels: + app: stash-demo +spec: + replicas: 3 + selector: + matchLabels: + app: stash-demo + serviceName: headless + template: + metadata: + labels: + app: stash-demo + spec: + containers: + - name: busybox + image: busybox + command: ["/bin/sh", "-c","echo $(POD_NAME) > /source/data/data.txt && sleep 3000"] + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + volumeMounts: + - name: source-data + mountPath: "/source/data" + imagePullPolicy: IfNotPresent + volumeClaimTemplates: + - metadata: + name: source-data + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi diff --git a/content/docs/v2024.12.18/guides/workloads/statefulset/images/gcs_bucket_ss.png b/content/docs/v2024.12.18/guides/workloads/statefulset/images/gcs_bucket_ss.png new file mode 100644 index 0000000000..a3db78bdc1 Binary files /dev/null and b/content/docs/v2024.12.18/guides/workloads/statefulset/images/gcs_bucket_ss.png differ diff --git a/content/docs/v2024.12.18/guides/workloads/statefulset/index.md b/content/docs/v2024.12.18/guides/workloads/statefulset/index.md new file mode 100644 index 0000000000..094a8fe2f5 --- /dev/null +++ b/content/docs/v2024.12.18/guides/workloads/statefulset/index.md @@ -0,0 +1,1009 @@ +--- +title: Backup and Restore Volumes of a StatefulSet | Stash +description: A step by step guide showing how to backup and restore volumes of a StatefulSet. +menu: + docs_v2024.12.18: + identifier: workload-statefulset + name: Backup & Restore Volumes of a StatefulSet + parent: workload + weight: 30 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: guides +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Backup and Restore Volumes of a StatefulSet + +This guide will show you how to use Stash to backup and restore volumes of a StatefulSet. + +## Before You Begin + +- At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). + +- Install `Stash` in your cluster following the steps [here](/docs/v2024.12.18/setup/README). + +- You should be familiar with the following `Stash` concepts: + - [BackupConfiguration](/docs/v2024.12.18/concepts/crds/backupconfiguration/) + - [BackupSession](/docs/v2024.12.18/concepts/crds/backupsession/) + - [RestoreSession](/docs/v2024.12.18/concepts/crds/restoresession/) + - [Repository](/docs/v2024.12.18/concepts/crds/repository/) + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> **Note:** YAML files used in this tutorial are stored in [docs/guides/workloads/statefulset/examples](/docs/v2024.12.18/guides/workloads/statefulset/examples) directory of [stashed/docs](https://github.com/stashed/docs) repository. + +## Backup Volumes of a StatefulSet + +This section will show you how to use Stash to backup volumes of a StatefulSet. Here, we are going to deploy a StatefulSet with a PVC and generate some sample data in it. Then, we are going to backup this sample data using Stash. + +**Deploy StatefulSet:** + +At first, We are going to deploy a StatefulSet. This StatefulSet will automatically generate sample data in `/source/data` directory. + +Below is the YAML of the StatefulSet that we are going to create, + +```yaml +apiVersion: v1 +kind: Service +metadata: + name: headless + namespace: demo +spec: + ports: + - name: http + port: 80 + targetPort: 0 + selector: + app: stash-demo + clusterIP: None +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: stash-demo + namespace: demo + labels: + app: stash-demo +spec: + replicas: 3 + selector: + matchLabels: + app: stash-demo + serviceName: headless + template: + metadata: + labels: + app: stash-demo + spec: + containers: + - name: busybox + image: busybox + command: ["/bin/sh", "-c","echo $(POD_NAME) > /source/data/data.txt && sleep 3000"] + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + volumeMounts: + - name: source-data + mountPath: "/source/data" + imagePullPolicy: IfNotPresent + volumeClaimTemplates: + - metadata: + name: source-data + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi +``` + +Let's create the StatefulSet we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/workloads/statefulset/examples/statefulset.yaml +service/headless created +statefulset.apps/stash-demo created +``` + +Now, wait for the pods of the StatefulSet to go into the `Running` state. + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-demo-0 1/1 Running 0 42s +stash-demo-1 1/1 Running 0 40s +stash-demo-2 1/1 Running 0 36s +``` + +Verify that the sample data has been generated in `/source/data` directory for `stash-demo-0` , `stash-demo-1` and `stash-demo-2` pod respectively using the following commands, + +```bash +$ kubectl exec -n demo stash-demo-0 -- cat /source/data/data.txt +stash-demo-0 +$ kubectl exec -n demo stash-demo-1 -- cat /source/data/data.txt +stash-demo-1 +$ kubectl exec -n demo stash-demo-2 -- cat /source/data/data.txt +stash-demo-2 +``` + +### Prepare Backend + +We are going to store our backed up data into a GCS bucket. We have to create a Secret with necessary credentials and a Repository crd to use this backend. If you want to use a different backend, please read the respective backend configuration doc from [here](/docs/v2024.12.18/guides/backends/overview/). + +> For GCS backend, if the bucket does not exist, Stash needs `Storage Object Admin` role permissions to create the bucket. For more details, please check the following [guide](/docs/v2024.12.18/guides/backends/gcs/). + +**Create Secret:** + +Let's create a secret called `gcs-secret` with access credentials to our desired GCS bucket, + +```bash +$ echo -n 'changeit' > RESTIC_PASSWORD +$ echo -n '' > GOOGLE_PROJECT_ID +$ cat /path/to/downloaded-sa-key.json > GOOGLE_SERVICE_ACCOUNT_JSON_KEY +$ kubectl create secret generic -n demo gcs-secret \ + --from-file=./RESTIC_PASSWORD \ + --from-file=./GOOGLE_PROJECT_ID \ + --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY +secret/gcs-secret created +``` + +Now, we are ready to backup our workload's data to our desired backend. + +**Create Repository:** + +Now, create a `Repository` using this secret. Below is the YAML of `Repository` crd we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1alpha1 +kind: Repository +metadata: + name: gcs-repo + namespace: demo +spec: + backend: + gcs: + bucket: appscode-qa + prefix: /source/data/sample-statefulset + storageSecretName: gcs-secret +``` + +Let's create the Repository we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/workloads/statefulset/examples/repository.yaml +repository.stash.appscode.com/gcs-repo created +``` + +Now, we are ready to backup our sample data into this backend. + +### Backup + +We have to create a `BackupConfiguration` crd targeting the `stash-demo` StatefulSet that we have deployed earlier. Stash will inject a sidecar container into the target. It will also create a `CronJob` to take periodic backup of `/source/data` directory of the target. + +**Create BackupConfiguration:** + +Below is the YAML of the `BackupConfiguration` crd that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: BackupConfiguration +metadata: + name: ss-backup + namespace: demo +spec: + repository: + name: gcs-repo + schedule: "*/5 * * * *" + target: + ref: + apiVersion: apps/v1 + kind: StatefulSet + name: stash-demo + volumeMounts: + - name: source-data + mountPath: /source/data + paths: + - /source/data + retentionPolicy: + name: 'keep-last-5' + keepLast: 5 + prune: true +``` + +Here, + +- `spec.repository` refers to the `Repository` object `gcs-repo` that holds backend information. +- `spec.schedule` is a cron expression that indicates `BackupSession` will be created at 5 minute interval. +- `spec.target.ref` refers to the `stash-demo` StatefulSet. +- `spec.target.volumeMounts` specifies a list of volumes and their mountPath that contain the target paths. +- `spec.target.paths` specifies list of file paths to backup. + +Let's create the `BackupConfiguration` crd we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/workloads/statefulset/examples/backupconfiguration.yaml +backupconfiguration.stash.appscode.com/ss-backup created +``` + +**Verify Backup Setup Successful** + +If everything goes well, the phase of the `BackupConfiguration` should be `Ready`. The `Ready` phase indicates that the backup setup is successful. Let's verify the `Phase` of the BackupConfiguration, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +ss-backup */5 * * * * Ready 11s +``` + +**Verify Sidecar:** + +If everything goes well, Stash will inject a sidecar container into the `stash-demo` StatefulSet to take backup of `/source/data` directory. Let’s check that the sidecar has been injected successfully, + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-demo-0 2/2 Running 0 5s +stash-demo-1 2/2 Running 0 42s +stash-demo-2 2/2 Running 0 76s +``` + +Look at the pod. It now has 2 containers. If you view the resource definition of this pod, you will see that there is a container named `stash` which is running `run-backup` command. + +```yaml +$ kubectl get pod -n demo stash-demo-0 -o yaml +apiVersion: v1 +kind: Pod +metadata: + labels: + app: stash-demo + controller-revision-hash: stash-demo-6d887c7b6f + statefulset.kubernetes.io/pod-name: stash-demo-0 + name: stash-demo-0 + namespace: demo + ... +spec: + containers: + - command: + - /bin/sh + - -c + - echo $(POD_NAME) > /source/data/data.txt && sleep 3000 + env: + - name: POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + image: busybox + imagePullPolicy: IfNotPresent + name: busybox + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /source/data + name: source-data + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: default-token-4tzgg + readOnly: true + - args: + - run-backup + - --backup-configuration=ss-backup + - --secret-dir=/etc/stash/repository/secret + - --enable-cache=true + - --max-connections=0 + - --metrics-enabled=true + - --pushgateway-url=http://stash-operator.kube-system.svc:56789 + - --enable-status-subresource=true + - --use-kubeapiserver-fqdn-for-aks=true + - --logtostderr=true + - --alsologtostderr=false + - --v=3 + - --stderrthreshold=0 + env: + - name: NODE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName + - name: POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + imagePullPolicy: IfNotPresent + name: stash + volumeMounts: + - mountPath: /etc/stash + name: stash-podinfo + - mountPath: /etc/stash/repository/secret + name: stash-secret-volume + - mountPath: /tmp + name: tmp-dir + - mountPath: /source/data + name: source-data + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: default-token-4tzgg + readOnly: true + hostname: stash-demo-0 + volumes: + - name: source-data + persistentVolumeClaim: + claimName: source-data-stash-demo-0 + - emptyDir: {} + name: tmp-dir + - downwardAPI: + defaultMode: 420 + items: + - fieldRef: + apiVersion: v1 + fieldPath: metadata.labels + path: labels + name: stash-podinfo + - name: stash-secret-volume + secret: + defaultMode: 420 + secretName: gcs-secret + - name: default-token-4tzgg + secret: + defaultMode: 420 + secretName: default-token-4tzgg + ... +... +``` + +**Verify CronJob:** + +It will also create a `CronJob` with the schedule specified in `spec.schedule` field of `BackupConfiguration` crd. + +Verify that the `CronJob` has been created using the following command, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED AGE +ss-backup */5 * * * * 3m41s +``` + +**Wait for BackupSession:** + +The `ss-backup` CronJob will trigger a backup on each scheduled slot by creating a `BackupSession` crd. The sidecar container watches for the `BackupSession` crd. When it finds one, it will take backup immediately. + +Wait for the next schedule for backup. Run the following command to watch `BackupSession` crd, + +```bash +$ watch -n 2 kubectl get backupsession -n demo +Every 5.0s: kubectl get bs -n demo suaas-appscode: Tue Jun 25 17:54:41 2019 + +NAME INVOKER-TYPE INVOKER-NAME PHASE AGE +ss-backup-1561463408 BackupConfiguration ss-backup Succeeded 36s +``` + +We can see from the above output that the backup session has succeeded. Now, we are going to verify whether the backed up data has been stored in the backend. + +**Verify Backup:** + +Once a backup is complete, Stash will update the respective `Repository` crd to reflect the backup. Check that the repository `gcs-repo` has been updated by the following command, + +```bash +$ kubectl get repository -n demo +NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE +gcs-repo true 0 B 3 103s 5m +``` + +Now, if we navigate to the GCS bucket, we are going to see backed up data has been stored in `source/data/sample-statefulset` directory as specified by `spec.backend.gcs.prefix` field of Repository crd. + +
+  Backup data in GCS Bucket +
Fig: Backup data in GCS Bucket
+
+ +> **Note:** Stash keeps all the backed up data encrypted. So, data in the backend will not make any sense until they are decrypted. + +## Restore Volumes of a StatefulSet + +This section will show you how to restore the backed up data from the backend we have taken in the earlier section. + +**Stop Taking Backup of the Old StatefulSet:** + +At first, let's stop taking any further backup of the old StatefulSet so that no backup is taken during the restore process. We are going to pause the `BackupConfiguration` that we created to backup the `stash-demo` StatefulSet. Then, Stash will stop taking any further backup for this StatefulSet. You can learn more how to pause a scheduled backup [here](/docs/v2024.12.18/guides/use-cases/pause-backup/) + +Let's pause the `ss-backup` BackupConfiguration, + +```bash +$ kubectl patch backupconfiguration -n demo ss-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/ss-backup patched +``` + +Now, wait for a moment. Stash will pause the BackupConfiguration. Verify that the BackupConfiguration has been paused, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED PHASE AGE +ss-backup */5 * * * * true Ready 26m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the BackupConfiguration has been paused. + +**Deploy StatefulSet:** + +We are going to create a new StatefulSet named `stash-recovered` and restore the backed up data inside it. + +Below is the YAML of the StatefulSet that we are going to create, + +```yaml +apiVersion: v1 +kind: Service +metadata: + name: re-headless + namespace: demo +spec: + ports: + - name: http + port: 80 + targetPort: 0 + selector: + app: stash-recovered + clusterIP: None +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: stash-recovered + namespace: demo + labels: + app: stash-recovered +spec: + replicas: 3 + selector: + matchLabels: + app: stash-recovered + serviceName: re-headless + template: + metadata: + labels: + app: stash-recovered + spec: + containers: + - name: busybox + image: busybox + command: + - sleep + - '3600' + volumeMounts: + - name: source-data + mountPath: "/source/data" + imagePullPolicy: IfNotPresent + volumeClaimTemplates: + - metadata: + name: source-data + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi +``` + +Let's create the StatefulSet we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/workloads/statefulset/examples/recovered_statefulset.yaml +service/re-headless created +statefulset.apps/stash-recovered created +``` + +**Create RestoreSession:** + +Now, we need to create a `RestoreSession` crd targeting the `stash-recovered` StatefulSet to restore the backed up data inside it. + +Below is the YAML of the `RestoreSesion` crd that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: ss-restore + namespace: demo +spec: + repository: + name: gcs-repo + target: + ref: + apiVersion: apps/v1 + kind: StatefulSet + name: stash-recovered + volumeMounts: + - name: source-data + mountPath: /source/data + rules: + - paths: + - /source/data +``` + +Here, + +- `spec.repository.name` specifies the `Repository` crd that holds the backend information where our backed up data has been stored. +- `spec.target.ref` refers to the target workload where the recovered data will be stored. +- `spec.target.volumeMounts` specifies a list of volumes and their mountPath where the data will be restored. + - `mountPath` must be same `mountPath` as the original volume because Stash stores absolute path of the backed up files. If you use different `mountPath` for the restored volume the backed up files will not be restored into your desired volume. + +Let's create the `RestoreSession` crd we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/workloads/statefulset/examples/restoresession.yaml +restoresession.stash.appscode.com/ss-restore created +``` + +Once, you have created the `RestoreSession` crd, Stash will inject `init-container` into `stash-recovered` StatefulSet. The StatefulSet will restart and the `init-container` will restore the desired data on start-up. + +**Verify Init-Container:** + +Wait until the `init-container` has been injected into the `stash-recovered` StatefulSet. Let’s describe the StatefulSet to verify that the `init-container` has been injected successfully. + +```yaml +$ kubectl describe statefulset -n demo stash-recovered +Name: stash-recovered +Namespace: demo +Selector: app=stash-recovered +Labels: app=stash-recovered +Replicas: 3 desired | 3 total +Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed +... +Pod Template: + Labels: app=stash-recovered + Annotations: stash.appscode.com/last-applied-restoresession-hash: 10309464337907785627 + Init Containers: + stash-init: + Image: suaas21/stash:vs_linux_amd64 + Port: + Host Port: + Args: + restore + --restore-session=ss-restore + --secret-dir=/etc/stash/repository/secret + --enable-cache=true + --max-connections=0 + --metrics-enabled=true + --pushgateway-url=http://stash-operator.kube-system.svc:56789 + --enable-status-subresource=true + --use-kubeapiserver-fqdn-for-aks=true + --logtostderr=true + --alsologtostderr=false + --v=3 + --stderrthreshold=0 + Environment: + NODE_NAME: (v1:spec.nodeName) + POD_NAME: (v1:metadata.name) + Mounts: + /etc/stash/repository/secret from stash-secret-volume (rw) + /source/data from source-data (rw) + /tmp from tmp-dir (rw) + Containers: + busybox: + Image: busybox + Port: + Host Port: + Command: + sleep + 3600 + Environment: + Mounts: + /source/data from source-data (rw) + Volumes: + tmp-dir: + Type: EmptyDir (a temporary directory that shares a pod's lifetime) + Medium: + SizeLimit: + stash-podinfo: + Type: DownwardAPI (a volume populated by information about the pod) + Items: + metadata.labels -> labels + stash-secret-volume: + Type: Secret (a volume populated by a Secret) + SecretName: gcs-secret + Optional: false +Volume Claims: + Name: source-data + StorageClass: standard + Labels: + Annotations: + Capacity: 1Gi + Access Modes: [ReadWriteOnce] +... +``` + +Notice the `Init-Containers` section. We can see that the init-container `stash-init` has been injected which is running `restore` command. + +**Wait for RestoreSession to Succeeded:** + +Run the following command to watch RestoreSession phase, + +```bash +$ watch -n 3 kubectl get restoresession -n demo +Every 5.0s: kubectl get restoresession -n demo suaas-appscode: Tue Jun 25 18:27:30 2019 + +NAME REPOSITORY-NAME PHASE AGE +ss-restore gcs-repo Succeeded 4m31s +``` + +So, we can see from the output of the above command that the restore process succeeded. + +> **Note:** If you want to restore the backed up data inside the same StatefulSet whose volumes were backed up, you have to remove the corrupted data from the StatefulSet. Then, you have to create a RestoreSession targeting the StatefulSet. + +**Verify Restored Data:** + +In this section, we are going to verify that the desired data has been restored successfully. + +At first, check if the `stash-recovered` pods of a StatefulSet has gone into `Running` state by the following commands, + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-recovered-0 1/1 Running 0 10m +stash-recovered-1 1/1 Running 0 11m +stash-recovered-2 1/1 Running 0 12m +``` + +Verify that the backed up data has been restored in `/source/data` directory of the `stash-recovered` pods of a StatefulSet using the following commands, + +```bash +$ kubectl exec -n demo stash-recovered-0 -- cat /source/data/data.txt +stash-demo-0 +$ kubectl exec -n demo stash-recovered-1 -- cat /source/data/data.txt +stash-demo-1 +$ kubectl exec -n demo stash-recovered-2 -- cat /source/data/data.txt +stash-demo-2 +``` + +### Customize Restore Process + +Generally, Stash restores data in individual replicas from a backup of the respective replica of the original StatefulSet. That means, backed up data of `pod-0` of original StatefulSet will be restored in `pod-0` of new StatefulSet and so on. However, you can customize this behavior through the `spec.target.rules` section of RestoreSession object. This is particularly helpful when your restored StatefulSet has a different number of replicas than the original StatefulSet. You can control which data will be restored in the additional replicas. + +**Stop Taking Backup of the Old StatefulSet:** + +At first, let's stop taking any further backup of the old StatefulSet so that no backup is taken during the restore process. We are going to pause the `BackupConfiguration` that we created to backup the `stash-demo` StatefulSet. Then, Stash will stop taking any further backup for this StatefulSet. You can learn more how to pause a scheduled backup [here](/docs/v2024.12.18/guides/use-cases/pause-backup/) + +Let's pause the `deployment-backup` BackupConfiguration, + +```bash +$ kubectl patch backupconfiguration -n demo ss-backup --type="merge" --patch='{"spec": {"paused": true}}' +backupconfiguration.stash.appscode.com/ss-backup patched +``` + +Now, wait for a moment. Stash will pause the BackupConfiguration. Verify that the BackupConfiguration has been paused, + +```bash +$ kubectl get backupconfiguration -n demo +NAME TASK SCHEDULE PAUSED AGE +ss-backup */1 * * * * true 26m +``` + +Notice the `PAUSED` column. Value `true` for this field means that the BackupConfiguration has been paused. + +**Deploy StatefulSet:** + +We are going to create a new StatefulSet named `stash-recovered-adv` with `spec.replica` 5 and restore the backed up data inside it. + +Below is the YAML of the StatefulSet that we are going to create, + +```yaml +apiVersion: v1 +kind: Service +metadata: + name: adv-headless + namespace: demo +spec: + ports: + - name: http + port: 80 + targetPort: 0 + selector: + app: stash-recovered-adv + clusterIP: None +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: stash-recovered-adv + namespace: demo + labels: + app: stash-recovered-adv +spec: + replicas: 5 + selector: + matchLabels: + app: stash-recovered-adv + serviceName: adv-headless + template: + metadata: + labels: + app: stash-recovered-adv + spec: + containers: + - name: busybox + image: busybox + command: + - sleep + - '3600' + volumeMounts: + - name: source-data + mountPath: "/source/data" + imagePullPolicy: IfNotPresent + volumeClaimTemplates: + - metadata: + name: source-data + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 1Gi +``` + +Let's create the StatefulSet we have shown above. + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/workloads/statefulset/examples/adv_statefulset.yaml +service/adv-headless created +statefulset.apps/stash-recovered-adv created +``` + +**Create RestoreSession:** + +Now, we are going to create a `RestoreSession` crd targeting the `stash-recovered` StatefulSet to restore the backed up data inside it. + +Below is the YAML of the `RestoreSesion` crd that we are going to create, + +```yaml +apiVersion: stash.appscode.com/v1beta1 +kind: RestoreSession +metadata: + name: ss-restore + namespace: demo +spec: + driver: Restic + repository: + name: gcs-repo + target: + ref: + apiVersion: apps/v1 + kind: StatefulSet + name: stash-recovered-adv + volumeMounts: + - mountPath: /source/data + name: source-data + rules: + - targetHosts: ["host-3","host-4"] + sourceHost: "host-1" + paths: + - /source/data + - targetHosts: [] + sourceHost: "" + paths: + - /source/data +``` + +Here, + +- `spec.target.rules`: `spec.target.rules` specify how Stash should restore data for each host. + - `targetHosts` the first rule specify that backed up data of `host-1`(old pods of a StatefulSet-1) will be restored into targetHosts `host-3`(new pod-3 of the StatefulSet) and `host-4`(new pod-4 of the StatefulSet) and the second rule specify that data from a similar backup host will be restored on the respective restore host. That means, backed up data of `host-0` will be restored into `host-0`, backed up data of `host-1` will be restored into `host-1` and so on. + - `sourceHost` specifies the name of the host whose backed up data will be restored. + +Let's create the `RestoreSession` crd we have shown above, + +```bash +$ kubectl apply -f https://github.com/stashed/docs/raw/{{< param "info.version" >}}/docs/guides/workloads/statefulset/examples/adv_restoresession.yaml +restoresession.stash.appscode.com/ss-restore created +``` + +Once, you have created the `RestoreSession` crd, Stash will inject `init-container` into `stash-recovered` StatefulSet. The StatefulSet will restart and the `init-container` will restore the desired data on start-up. + +**Verify Init-Container:** + +Wait until the `init-container` has been injected into the `stash-recovered` StatefulSet. Let’s describe the StatefulSet to verify that the `init-container` has been injected successfully. + +```yaml +$ kubectl describe statefulset -n demo stash-recovered-adv +Name: stash-recovered-adv +Namespace: demo +Selector: app=stash-recovered-adv +Labels: app=stash-recovered-adv +Replicas: 5 desired | 5 total +Pods Status: 5 Running / 0 Waiting / 0 Succeeded / 0 Failed +... +Pod Template: + Labels: app=stash-recovered-adv + Annotations: stash.appscode.com/last-applied-restoresession-hash: 4338322130475899419 + Init Containers: + stash-init: + Image: suaas21/stash:vs_linux_amd64 + Port: + Host Port: + Args: + restore + --restore-session=ss-restore + --secret-dir=/etc/stash/repository/secret + --enable-cache=true + --max-connections=0 + --metrics-enabled=true + --pushgateway-url=http://stash-operator.kube-system.svc:56789 + --enable-status-subresource=true + --use-kubeapiserver-fqdn-for-aks=true + --logtostderr=true + --alsologtostderr=false + --v=3 + --stderrthreshold=0 + Environment: + NODE_NAME: (v1:spec.nodeName) + POD_NAME: (v1:metadata.name) + Mounts: + /etc/stash/repository/secret from stash-secret-volume (rw) + /source/data from source-data (rw) + /tmp from tmp-dir (rw) + Containers: + busybox: + Image: busybox + Port: + Host Port: + Command: + sleep + 3600 + Environment: + Mounts: + /source/data from source-data (rw) + Volumes: + tmp-dir: + Type: EmptyDir (a temporary directory that shares a pod's lifetime) + Medium: + SizeLimit: + stash-podinfo: + Type: DownwardAPI (a volume populated by information about the pod) + Items: + metadata.labels -> labels + stash-secret-volume: + Type: Secret (a volume populated by a Secret) + SecretName: gcs-secret + Optional: false +Volume Claims: + Name: source-data + StorageClass: standard + Labels: + Annotations: + Capacity: 1Gi + Access Modes: [ReadWriteOnce] +... +``` + +Notice the `Init-Containers` section. We can see that the init-container `stash-init` has been injected which is running `restore` command. + +**Wait for RestoreSession to Succeeded:** + +Run the following command to watch RestoreSession phase, + +```bash +$ watch -n 3 kubectl get restoresession -n demo +Every 5.0s: kubectl get restoresession -n demo suaas-appscode: Tue Jun 25 18:27:30 2019 + +NAME REPOSITORY-NAME PHASE AGE +ss-restore gcs-repo Succeeded 8m21s +``` + +So, we can see from the output of the above command that the restore process succeeded. + +**Verify Restored Data:** + +In this section, we are going to verify that the desired data has been restored successfully. + +At first, check if the `stash-recovered` pods of the StatefulSet has gone into `Running` state by the following commands, + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +stash-recovered-adv-0 1/1 Running 0 3m30s +stash-recovered-adv-1 1/1 Running 0 4m50s +stash-recovered-adv-2 1/1 Running 0 6m +stash-recovered-adv-3 1/1 Running 0 7m10s +stash-recovered-adv-4 1/1 Running 0 8m1s +``` + +Verify that the sample data has been restored in `/source/data` directory of the `stash-recovered` pods of the StatefulSet using the following commands, + +```bash +$ kubectl exec -n demo stash-recovered-adv-0 -- cat /source/data/data.txt +stash-demo-0 +$ kubectl exec -n demo stash-recovered-adv-1 -- cat /source/data/data.txt +stash-demo-1 +$ kubectl exec -n demo stash-recovered-adv-2 -- cat /source/data/data.txt +stash-demo-2 +$ kubectl exec -n demo stash-recovered-adv-3 -- cat /source/data/data.txt +stash-demo-1 +$ kubectl exec -n demo stash-recovered-adv-4 -- cat /source/data/data.txt +stash-demo-1 +``` + +We can see from the above output that backup data of `host-1` has been restored into `host-3` and `host-4` successfully. + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete -n demo statefulset stash-demo +kubectl delete -n demo statefulset stash-recovered +kubectl delete -n demo backupconfiguration ss-backup +kubectl delete -n demo restoresession ss-restore +kubectl delete -n demo repository gcs-repo +kubectl delete -n demo pvc --all +``` diff --git a/content/docs/v2024.12.18/reference/_index.md b/content/docs/v2024.12.18/reference/_index.md new file mode 100644 index 0000000000..04bab775f7 --- /dev/null +++ b/content/docs/v2024.12.18/reference/_index.md @@ -0,0 +1,78 @@ +--- +title: Reference +description: Stash CLI Reference +menu: + docs_v2024.12.18: + identifier: reference + name: Reference + weight: 1000 + pre: dropdown +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/reference/cli/_index.md b/content/docs/v2024.12.18/reference/cli/_index.md new file mode 100644 index 0000000000..a44df441ad --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/_index.md @@ -0,0 +1,78 @@ +--- +title: Reference | Stash CLI +description: Stash CLI Reference +menu: + docs_v2024.12.18: + identifier: reference-cli + name: Stash CLI + weight: 30 + parent: reference +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash.md new file mode 100644 index 0000000000..3b8f25be95 --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash.md @@ -0,0 +1,133 @@ +--- +title: Kubectl-Stash +menu: + docs_v2024.12.18: + identifier: kubectl-stash + name: Kubectl-Stash + parent: reference-cli + weight: 0 +menu_name: docs_v2024.12.18 +section_menu_id: reference +url: /docs/v2024.12.18/reference/cli/ +aliases: +- /docs/v2024.12.18/reference/cli/kubectl-stash/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash + +kubectl plugin for Stash by AppsCode + +### Synopsis + +kubectl plugin for Stash by AppsCode. For more information, visit here: https://stash.run + +### Options + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + -h, --help help for kubectl-stash + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash check](/docs/v2024.12.18/reference/cli/kubectl-stash_check) - Check the repository for errors +* [kubectl-stash clone](/docs/v2024.12.18/reference/cli/kubectl-stash_clone) - Clone Kubernetes resources +* [kubectl-stash completion](/docs/v2024.12.18/reference/cli/kubectl-stash_completion) - Generate completion script +* [kubectl-stash cp](/docs/v2024.12.18/reference/cli/kubectl-stash_cp) - Copy stash resources from one namespace to another namespace +* [kubectl-stash create](/docs/v2024.12.18/reference/cli/kubectl-stash_create) - create stash resources +* [kubectl-stash debug](/docs/v2024.12.18/reference/cli/kubectl-stash_debug) - Debug common Stash issues +* [kubectl-stash delete](/docs/v2024.12.18/reference/cli/kubectl-stash_delete) - Delete stash resources +* [kubectl-stash download](/docs/v2024.12.18/reference/cli/kubectl-stash_download) - Download snapshots +* [kubectl-stash gen](/docs/v2024.12.18/reference/cli/kubectl-stash_gen) - generate stash resources +* [kubectl-stash key](/docs/v2024.12.18/reference/cli/kubectl-stash_key) - manages restic keys (passwords) for accessing the repository +* [kubectl-stash pause](/docs/v2024.12.18/reference/cli/kubectl-stash_pause) - Pause Stash backup temporarily +* [kubectl-stash rebuild-index](/docs/v2024.12.18/reference/cli/kubectl-stash_rebuild-index) - Build a new index +* [kubectl-stash resume](/docs/v2024.12.18/reference/cli/kubectl-stash_resume) - Resume Stash backup +* [kubectl-stash trigger](/docs/v2024.12.18/reference/cli/kubectl-stash_trigger) - Trigger a backup +* [kubectl-stash unlock](/docs/v2024.12.18/reference/cli/kubectl-stash_unlock) - Unlock restic repository +* [kubectl-stash version](/docs/v2024.12.18/reference/cli/kubectl-stash_version) - Prints binary version number. + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_check.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_check.md new file mode 100644 index 0000000000..59e8d60577 --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_check.md @@ -0,0 +1,122 @@ +--- +title: Check +menu: + docs_v2024.12.18: + identifier: kubectl-stash-check + name: Check + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash check + +Check the repository for errors + +``` +kubectl-stash check [flags] +``` + +### Options + +``` + -h, --help help for check + --read-data read all data blobs + --read-data-subset subset read a subset of data packs, specified as 'n/t' for specific part, or either 'x%' or 'x.y%' or a size in bytes with suffixes k/K, m/M, g/G, t/T for a random subset + --with-cache use existing cache, only read uncached data from repository +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash](/docs/v2024.12.18/reference/cli/kubectl-stash) - kubectl plugin for Stash by AppsCode + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_clone.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_clone.md new file mode 100644 index 0000000000..d3e0923fa0 --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_clone.md @@ -0,0 +1,117 @@ +--- +title: Clone +menu: + docs_v2024.12.18: + identifier: kubectl-stash-clone + name: Clone + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash clone + +Clone Kubernetes resources + +### Options + +``` + -h, --help help for clone + --to-namespace string Destination namespace. +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash](/docs/v2024.12.18/reference/cli/kubectl-stash) - kubectl plugin for Stash by AppsCode +* [kubectl-stash clone pvc](/docs/v2024.12.18/reference/cli/kubectl-stash_clone_pvc) - Clone PVC + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_clone_pvc.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_clone_pvc.md new file mode 100644 index 0000000000..69fb22cdaf --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_clone_pvc.md @@ -0,0 +1,137 @@ +--- +title: Clone Pvc +menu: + docs_v2024.12.18: + identifier: kubectl-stash-clone-pvc + name: Clone Pvc + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash clone pvc + +Clone PVC + +### Synopsis + +Use Backup and Restore process for cloning PVC + +``` +kubectl-stash clone pvc [flags] +``` + +### Examples + +``` + # Clone PVC + stash clone pvc source-pvc -n demo --to-namespace=demo1 --secret= --bucket= --prefix= --provider= +``` + +### Options + +``` + --bucket string Name of the cloud bucket/container + --endpoint string Endpoint for s3/s3 compatible backend + -h, --help help for pvc + --max-connections int Specify maximum concurrent connections for GCS, Azure and B2 backend + --prefix string Prefix denotes the directory inside the backend + --provider string Backend provider (i.e. gcs, s3, azure etc) + --secret string Name of the Storage Secret +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --to-namespace string Destination namespace. + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash clone](/docs/v2024.12.18/reference/cli/kubectl-stash_clone) - Clone Kubernetes resources + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_completion.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_completion.md new file mode 100644 index 0000000000..6a01faec14 --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_completion.md @@ -0,0 +1,153 @@ +--- +title: Completion +menu: + docs_v2024.12.18: + identifier: kubectl-stash-completion + name: Completion + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash completion + +Generate completion script + +### Synopsis + +To load completions: + +Bash: + +$ source <(kubectl-stash completion bash) + +# To load completions for each session, execute once: +Linux: + $ kubectl-stash completion bash > /etc/bash_completion.d/kubectl-stash +MacOS: + $ kubectl-stash completion bash > /usr/local/etc/bash_completion.d/kubectl-stash + +Zsh: + +# If shell completion is not already enabled in your environment you will need +# to enable it. You can execute the following once: + +$ echo "autoload -U compinit; compinit" >> ~/.zshrc + +# To load completions for each session, execute once: +$ kubectl-stash completion zsh > "${fpath[1]}/_kubectl-stash" + +# You will need to start a new shell for this setup to take effect. + +Fish: + +$ kubectl-stash completion fish | source + +# To load completions for each session, execute once: +$ kubectl-stash completion fish > ~/.config/fish/completions/kubectl-stash.fish + + +``` +kubectl-stash completion [bash|zsh|fish|powershell] +``` + +### Options + +``` + -h, --help help for completion +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash](/docs/v2024.12.18/reference/cli/kubectl-stash) - kubectl plugin for Stash by AppsCode + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_cp.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_cp.md new file mode 100644 index 0000000000..d00344772f --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_cp.md @@ -0,0 +1,120 @@ +--- +title: Cp +menu: + docs_v2024.12.18: + identifier: kubectl-stash-cp + name: Cp + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash cp + +Copy stash resources from one namespace to another namespace + +### Options + +``` + -h, --help help for cp + --to-namespace string Destination namespace. +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash](/docs/v2024.12.18/reference/cli/kubectl-stash) - kubectl plugin for Stash by AppsCode +* [kubectl-stash cp backupconfig](/docs/v2024.12.18/reference/cli/kubectl-stash_cp_backupconfig) - Copy BackupConfiguration from one namespace to another namespace +* [kubectl-stash cp repository](/docs/v2024.12.18/reference/cli/kubectl-stash_cp_repository) - Copy Repository and Secret +* [kubectl-stash cp secret](/docs/v2024.12.18/reference/cli/kubectl-stash_cp_secret) - Copy Secret +* [kubectl-stash cp volumesnapshot](/docs/v2024.12.18/reference/cli/kubectl-stash_cp_volumesnapshot) - Copy VolumeSnapshot + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_cp_backupconfig.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_cp_backupconfig.md new file mode 100644 index 0000000000..7baed3c2c6 --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_cp_backupconfig.md @@ -0,0 +1,124 @@ +--- +title: Cp Backupconfig +menu: + docs_v2024.12.18: + identifier: kubectl-stash-cp-backupconfig + name: Cp Backupconfig + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash cp backupconfig + +Copy BackupConfiguration from one namespace to another namespace + +### Synopsis + +Copy BackupConfiguration with respective Repository and Secret if they are not present in the target namespace + +``` +kubectl-stash cp backupconfig [flags] +``` + +### Options + +``` + -h, --help help for backupconfig +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --to-namespace string Destination namespace. + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash cp](/docs/v2024.12.18/reference/cli/kubectl-stash_cp) - Copy stash resources from one namespace to another namespace + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_cp_repository.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_cp_repository.md new file mode 100644 index 0000000000..127722251a --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_cp_repository.md @@ -0,0 +1,124 @@ +--- +title: Cp Repository +menu: + docs_v2024.12.18: + identifier: kubectl-stash-cp-repository + name: Cp Repository + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash cp repository + +Copy Repository and Secret + +### Synopsis + +Copy Repository and Secret from one namespace to another namespace + +``` +kubectl-stash cp repository [flags] +``` + +### Options + +``` + -h, --help help for repository +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --to-namespace string Destination namespace. + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash cp](/docs/v2024.12.18/reference/cli/kubectl-stash_cp) - Copy stash resources from one namespace to another namespace + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_cp_secret.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_cp_secret.md new file mode 100644 index 0000000000..5f9f2a5a49 --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_cp_secret.md @@ -0,0 +1,124 @@ +--- +title: Cp Secret +menu: + docs_v2024.12.18: + identifier: kubectl-stash-cp-secret + name: Cp Secret + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash cp secret + +Copy Secret + +### Synopsis + +Copy Secret from one namespace to another namespace + +``` +kubectl-stash cp secret [flags] +``` + +### Options + +``` + -h, --help help for secret +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --to-namespace string Destination namespace. + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash cp](/docs/v2024.12.18/reference/cli/kubectl-stash_cp) - Copy stash resources from one namespace to another namespace + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_cp_volumesnapshot.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_cp_volumesnapshot.md new file mode 100644 index 0000000000..feb5be6783 --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_cp_volumesnapshot.md @@ -0,0 +1,124 @@ +--- +title: Cp Volumesnapshot +menu: + docs_v2024.12.18: + identifier: kubectl-stash-cp-volumesnapshot + name: Cp Volumesnapshot + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash cp volumesnapshot + +Copy VolumeSnapshot + +### Synopsis + +Copy VolumeSnapshot from one namespace to another namespace + +``` +kubectl-stash cp volumesnapshot [flags] +``` + +### Options + +``` + -h, --help help for volumesnapshot +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --to-namespace string Destination namespace. + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash cp](/docs/v2024.12.18/reference/cli/kubectl-stash_cp) - Copy stash resources from one namespace to another namespace + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_create.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_create.md new file mode 100644 index 0000000000..b44522ca92 --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_create.md @@ -0,0 +1,118 @@ +--- +title: Create +menu: + docs_v2024.12.18: + identifier: kubectl-stash-create + name: Create + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash create + +create stash resources + +### Options + +``` + -h, --help help for create +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash](/docs/v2024.12.18/reference/cli/kubectl-stash) - kubectl plugin for Stash by AppsCode +* [kubectl-stash create backupconfig](/docs/v2024.12.18/reference/cli/kubectl-stash_create_backupconfig) - Create a new BackupConfiguration +* [kubectl-stash create repository](/docs/v2024.12.18/reference/cli/kubectl-stash_create_repository) - Create a new repository +* [kubectl-stash create restoresession](/docs/v2024.12.18/reference/cli/kubectl-stash_create_restoresession) - Create a new RestoreSession + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_create_backupconfig.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_create_backupconfig.md new file mode 100644 index 0000000000..ea0b229ba2 --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_create_backupconfig.md @@ -0,0 +1,154 @@ +--- +title: Create Backupconfig +menu: + docs_v2024.12.18: + identifier: kubectl-stash-create-backupconfig + name: Create Backupconfig + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash create backupconfig + +Create a new BackupConfiguration + +### Synopsis + +Create a new BackupConfiguration to backup a target + +``` +kubectl-stash create backupconfig [flags] +``` + +### Examples + +``` + # Create a new BackupConfiguration + # stash create backupconfig --namespace= gcs-repo [Flag] + # For Restic driver + stash create backupconfig ss-backup --namespace=demo --repo-name=gcs-repo --schedule="*/4 * * * *" --target-apiversion=apps/v1 --target-kind=StatefulSet --target-name=stash-demo --paths=/source/data --volume-mounts=source-data:/source/data --keep-last=5 --prune=true + # For VolumeSnapshotter driver + stash create backupconfig statefulset-volume-snapshot --namespace=demo --driver=VolumeSnapshotter --schedule="*/4 * * * *" --target-apiversion=apps/v1 --target-kind=StatefulSet --target-name=stash-demo --replica=1 --volumesnpashotclass=default-snapshot-class --keep-last=5 --prune=true +``` + +### Options + +``` + --driver string Driver indicates the mechanism used to backup (i.e. VolumeSnapshotter, Restic) + --dry-run Specify whether to test retention policy without deleting actual data + -h, --help help for backupconfig + --keep-daily int Specify value for retention strategy + --keep-hourly int Specify value for retention strategy + --keep-last int Specify value for retention strategy + --keep-monthly int Specify value for retention strategy + --keep-weekly int Specify value for retention strategy + --keep-yearly int Specify value for retention strategy + --paths strings List of paths to backup + --prune Specify whether to prune old snapshot data + --replica int32 Replica specifies the number of replicas whose data should be backed up + --repo-name string Name of the Repository + --repo-namespace string Namespace of the Repository + --schedule string Schedule of the Backup + --target-apiversion string API-Version of the target resource + --target-kind string Kind of the target resource + --target-name string Name of the target resource + --task string Name of the Task + --volume-mounts strings List of volumes and their mountPaths + --volumesnpashotclass string Name of the VolumeSnapshotClass +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash create](/docs/v2024.12.18/reference/cli/kubectl-stash_create) - create stash resources + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_create_repository.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_create_repository.md new file mode 100644 index 0000000000..5cb8ce4664 --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_create_repository.md @@ -0,0 +1,137 @@ +--- +title: Create Repository +menu: + docs_v2024.12.18: + identifier: kubectl-stash-create-repository + name: Create Repository + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash create repository + +Create a new repository + +### Synopsis + +Create a new Repository using Backend Credential + +``` +kubectl-stash create repository [flags] +``` + +### Examples + +``` + # Create a new repository + stash create repository --namespace= [Flag] + stash create repository gcs-repo --namespace=demo --secret=gcs-secret --bucket=appscode-qa --prefix=/source/data --provider=gcs +``` + +### Options + +``` + --bucket string Name of the cloud bucket/container + --endpoint string Endpoint for s3/s3 compatible backend + -h, --help help for repository + --max-connections int Specify maximum concurrent connections for GCS, Azure and B2 backend + --prefix string Prefix denotes the directory inside the backend + --provider string Backend provider (i.e. gcs, s3, azure etc) + --secret string Name of the Storage Secret +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash create](/docs/v2024.12.18/reference/cli/kubectl-stash_create) - create stash resources + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_create_restoresession.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_create_restoresession.md new file mode 100644 index 0000000000..576f348fcf --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_create_restoresession.md @@ -0,0 +1,152 @@ +--- +title: Create Restoresession +menu: + docs_v2024.12.18: + identifier: kubectl-stash-create-restoresession + name: Create Restoresession + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash create restoresession + +Create a new RestoreSession + +### Synopsis + +Create a new RestoreSession to restore backed up data + +``` +kubectl-stash create restoresession [flags] +``` + +### Examples + +``` + # Create a RestoreSession + # stash create restore --namespace=demo [Flag] + # For Restic driver + stash create restoresession ss-restore --namespace=demo --repo-name=gcs-repo --target-apiversion=apps/v1 --target-kind=StatefulSet --target-name=stash-recovered --paths=/source/data --volume-mounts=source-data:/source/data + # For VolumeSnapshotter driver + stash create restoresession restore-pvc --namespace=demo --driver=VolumeSnapshotter --replica=3 --claim.name=restore-data-restore-demo-${POD_ORDINAL} --claim.access-modes=ReadWriteOnce --claim.storageclass=standard --claim.size=1Gi --claim.datasource=source-data-stash-demo-0-1567146010 +``` + +### Options + +``` + --alias string Host identifier of the backed up data. It must be same as the alias used during backup + --claim.access-modes strings Access mode of the VolumeClaimTemplates + --claim.datasource string DataSource of the VolumeClaimTemplate + --claim.name string Name of the VolumeClaimTemplate + --claim.size string Total requested size of the VolumeClaimTemplate + --claim.storageclass string Name of the Storage secret for VolumeClaimTemplate + --driver string Driver indicates the mechanism used to backup (i.e. VolumeSnapshotter, Restic) + -h, --help help for restoresession + --host string Name of the Source host + --paths strings List of paths to backup + --replica int32 Replica specifies the number of replicas whose data should be backed up + --repo-name string Name of the Repository + --repo-namespace string Namespace of the Repository + --snapshots strings Name of the Snapshot(single) + --target-apiversion string API-Version of the target resource + --target-kind string Kind of the target resource + --target-name string Name of the target resource + --task string Name of the Task + --volume-mounts strings List of volumes and their mountPaths +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash create](/docs/v2024.12.18/reference/cli/kubectl-stash_create) - create stash resources + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_debug.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_debug.md new file mode 100644 index 0000000000..d568799017 --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_debug.md @@ -0,0 +1,118 @@ +--- +title: Debug +menu: + docs_v2024.12.18: + identifier: kubectl-stash-debug + name: Debug + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash debug + +Debug common Stash issues + +### Options + +``` + -h, --help help for debug +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash](/docs/v2024.12.18/reference/cli/kubectl-stash) - kubectl plugin for Stash by AppsCode +* [kubectl-stash debug backup](/docs/v2024.12.18/reference/cli/kubectl-stash_debug_backup) - Debug backup +* [kubectl-stash debug operator](/docs/v2024.12.18/reference/cli/kubectl-stash_debug_operator) - Debug Stash operator +* [kubectl-stash debug restore](/docs/v2024.12.18/reference/cli/kubectl-stash_debug_restore) - Debug restore + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_debug_backup.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_debug_backup.md new file mode 100644 index 0000000000..0759f2249d --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_debug_backup.md @@ -0,0 +1,133 @@ +--- +title: Debug Backup +menu: + docs_v2024.12.18: + identifier: kubectl-stash-debug-backup + name: Debug Backup + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash debug backup + +Debug backup + +### Synopsis + +Debug common Stash backup issues + +``` +kubectl-stash debug backup [flags] +``` + +### Examples + +``` + # Debug a BackupConfigration + stash debug backup --namespace= --backupconfig= + stash debug backup --namespace=demo --backupconfig=sample-mongodb-backup +``` + +### Options + +``` + --backupbatch string Name of the BackupBatch to debug + --backupconfig string Name of the BackupConfiguration to debug + -h, --help help for backup +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash debug](/docs/v2024.12.18/reference/cli/kubectl-stash_debug) - Debug common Stash issues + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_debug_operator.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_debug_operator.md new file mode 100644 index 0000000000..74f96a1f34 --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_debug_operator.md @@ -0,0 +1,131 @@ +--- +title: Debug Operator +menu: + docs_v2024.12.18: + identifier: kubectl-stash-debug-operator + name: Debug Operator + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash debug operator + +Debug Stash operator + +### Synopsis + +Show debugging information for Stash operator + +``` +kubectl-stash debug operator [flags] +``` + +### Examples + +``` + # Debug operator pod + stash debug operator --namespace= + stash debug operator -n kube-system +``` + +### Options + +``` + -h, --help help for operator +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash debug](/docs/v2024.12.18/reference/cli/kubectl-stash_debug) - Debug common Stash issues + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_debug_restore.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_debug_restore.md new file mode 100644 index 0000000000..dd2882d4ac --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_debug_restore.md @@ -0,0 +1,133 @@ +--- +title: Debug Restore +menu: + docs_v2024.12.18: + identifier: kubectl-stash-debug-restore + name: Debug Restore + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash debug restore + +Debug restore + +### Synopsis + +Show debugging information for restore process + +``` +kubectl-stash debug restore [flags] +``` + +### Examples + +``` + # Debug a RestoreSession + stash debug restore --namespace= --restoresession= + stash debug restore --namespace=demo --restoresession=sample-mongodb-restore +``` + +### Options + +``` + -h, --help help for restore + --restorebatch string Name of the RestoreBatch to debug + --restoresession string Name of the RestoreSession to debug +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash debug](/docs/v2024.12.18/reference/cli/kubectl-stash_debug) - Debug common Stash issues + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_delete.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_delete.md new file mode 100644 index 0000000000..8acdb219e0 --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_delete.md @@ -0,0 +1,116 @@ +--- +title: Delete +menu: + docs_v2024.12.18: + identifier: kubectl-stash-delete + name: Delete + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash delete + +Delete stash resources + +### Options + +``` + -h, --help help for delete +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash](/docs/v2024.12.18/reference/cli/kubectl-stash) - kubectl plugin for Stash by AppsCode +* [kubectl-stash delete snapshot](/docs/v2024.12.18/reference/cli/kubectl-stash_delete_snapshot) - Delete a snapshot from repository backend + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_delete_snapshot.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_delete_snapshot.md new file mode 100644 index 0000000000..88d4de3928 --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_delete_snapshot.md @@ -0,0 +1,132 @@ +--- +title: Delete Snapshot +menu: + docs_v2024.12.18: + identifier: kubectl-stash-delete-snapshot + name: Delete Snapshot + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash delete snapshot + +Delete a snapshot from repository backend + +### Synopsis + +Delete a snapshot from repository backend + +``` +kubectl-stash delete snapshot [flags] +``` + +### Examples + +``` + # Delete Snapshot + stash delete snapshot gcs-repo-c063d146 -n demo +``` + +### Options + +``` + --docker-registry string Docker image registry (default "stashed") + -h, --help help for snapshot + --image-tag string Stash image tag (default "latest") +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash delete](/docs/v2024.12.18/reference/cli/kubectl-stash_delete) - Delete stash resources + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_download.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_download.md new file mode 100644 index 0000000000..8a82d7f377 --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_download.md @@ -0,0 +1,129 @@ +--- +title: Download +menu: + docs_v2024.12.18: + identifier: kubectl-stash-download + name: Download + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash download + +Download snapshots + +### Synopsis + +Download contents of snapshots from Repository + +``` +kubectl-stash download [flags] +``` + +### Options + +``` + --destination string Destination path where snapshot will be restored. + --docker-registry string Docker image registry for restic cli (default "stashed") + -h, --help help for download + --host string Name of the source host machine (default "host-0") + --image-tag string Restic docker image tag (default "latest") + --paths strings List of directories to be restored + --snapshots strings List of snapshots to be restored +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash](/docs/v2024.12.18/reference/cli/kubectl-stash) - kubectl plugin for Stash by AppsCode + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_gen.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_gen.md new file mode 100644 index 0000000000..10fe370fe1 --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_gen.md @@ -0,0 +1,116 @@ +--- +title: Gen +menu: + docs_v2024.12.18: + identifier: kubectl-stash-gen + name: Gen + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash gen + +generate stash resources + +### Options + +``` + -h, --help help for gen +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash](/docs/v2024.12.18/reference/cli/kubectl-stash) - kubectl plugin for Stash by AppsCode +* [kubectl-stash gen rules](/docs/v2024.12.18/reference/cli/kubectl-stash_gen_rules) - Generate restore rules from nearest snapshots at a specific time. + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_gen_rules.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_gen_rules.md new file mode 100644 index 0000000000..9daf2ea8ce --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_gen_rules.md @@ -0,0 +1,125 @@ +--- +title: Gen Rules +menu: + docs_v2024.12.18: + identifier: kubectl-stash-gen-rules + name: Gen Rules + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash gen rules + +Generate restore rules from nearest snapshots at a specific time. + +### Synopsis + +Generate restore rules for a repository based on the closest snapshots to a specific time + +``` +kubectl-stash gen rules [flags] +``` + +### Options + +``` + --group-interval string Snaspshot grouping interval (default "4m") + -h, --help help for rules + --request-timeout string Request timeout duration for the kubectl command + --timestamp string Timestamp to find the closest snapshots +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash gen](/docs/v2024.12.18/reference/cli/kubectl-stash_gen) - generate stash resources + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_key.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_key.md new file mode 100644 index 0000000000..78201b62d5 --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_key.md @@ -0,0 +1,119 @@ +--- +title: Key +menu: + docs_v2024.12.18: + identifier: kubectl-stash-key + name: Key + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash key + +manages restic keys (passwords) for accessing the repository + +### Options + +``` + -h, --help help for key +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash](/docs/v2024.12.18/reference/cli/kubectl-stash) - kubectl plugin for Stash by AppsCode +* [kubectl-stash key add](/docs/v2024.12.18/reference/cli/kubectl-stash_key_add) - Add a new key (password) to a restic repository +* [kubectl-stash key list](/docs/v2024.12.18/reference/cli/kubectl-stash_key_list) - List the keys (passwords) of a restic repository +* [kubectl-stash key remove](/docs/v2024.12.18/reference/cli/kubectl-stash_key_remove) - Remove a key (password) of a restic repository +* [kubectl-stash key update](/docs/v2024.12.18/reference/cli/kubectl-stash_key_update) - Update current key (password) of a restic repository + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_key_add.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_key_add.md new file mode 100644 index 0000000000..2f01a4b675 --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_key_add.md @@ -0,0 +1,121 @@ +--- +title: Key Add +menu: + docs_v2024.12.18: + identifier: kubectl-stash-key-add + name: Key Add + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash key add + +Add a new key (password) to a restic repository + +``` +kubectl-stash key add [flags] +``` + +### Options + +``` + -h, --help help for add + --host string Host for the new key + --new-password-file string File from which to read the new password + --user string Username for the new key +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server +``` + +### SEE ALSO + +* [kubectl-stash key](/docs/v2024.12.18/reference/cli/kubectl-stash_key) - manages restic keys (passwords) for accessing the repository + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_key_list.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_key_list.md new file mode 100644 index 0000000000..2b3176cb3a --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_key_list.md @@ -0,0 +1,119 @@ +--- +title: Key List +menu: + docs_v2024.12.18: + identifier: kubectl-stash-key-list + name: Key List + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash key list + +List the keys (passwords) of a restic repository + +``` +kubectl-stash key list [flags] +``` + +### Options + +``` + -h, --help help for list +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash key](/docs/v2024.12.18/reference/cli/kubectl-stash_key) - manages restic keys (passwords) for accessing the repository + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_key_remove.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_key_remove.md new file mode 100644 index 0000000000..de21076995 --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_key_remove.md @@ -0,0 +1,120 @@ +--- +title: Key Remove +menu: + docs_v2024.12.18: + identifier: kubectl-stash-key-remove + name: Key Remove + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash key remove + +Remove a key (password) of a restic repository + +``` +kubectl-stash key remove [flags] +``` + +### Options + +``` + -h, --help help for remove + --id string ID of the restic key +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash key](/docs/v2024.12.18/reference/cli/kubectl-stash_key) - manages restic keys (passwords) for accessing the repository + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_key_update.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_key_update.md new file mode 100644 index 0000000000..4e0858b804 --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_key_update.md @@ -0,0 +1,120 @@ +--- +title: Key Update +menu: + docs_v2024.12.18: + identifier: kubectl-stash-key-update + name: Key Update + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash key update + +Update current key (password) of a restic repository + +``` +kubectl-stash key update [flags] +``` + +### Options + +``` + -h, --help help for update + --new-password-file string File from which to read the new password +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash key](/docs/v2024.12.18/reference/cli/kubectl-stash_key) - manages restic keys (passwords) for accessing the repository + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_pause.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_pause.md new file mode 100644 index 0000000000..4e6e71e15b --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_pause.md @@ -0,0 +1,118 @@ +--- +title: Pause +menu: + docs_v2024.12.18: + identifier: kubectl-stash-pause + name: Pause + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash pause + +Pause Stash backup temporarily + +### Options + +``` + --backupbatch string Name of the BackupBatch to pause + --backupconfig string Name of the BackupConfiguration to pause + -h, --help help for pause +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash](/docs/v2024.12.18/reference/cli/kubectl-stash) - kubectl plugin for Stash by AppsCode +* [kubectl-stash pause backup](/docs/v2024.12.18/reference/cli/kubectl-stash_pause_backup) - Pause backup + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_pause_backup.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_pause_backup.md new file mode 100644 index 0000000000..93a02ae709 --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_pause_backup.md @@ -0,0 +1,133 @@ +--- +title: Pause Backup +menu: + docs_v2024.12.18: + identifier: kubectl-stash-pause-backup + name: Pause Backup + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash pause backup + +Pause backup + +### Synopsis + +Pause backup by setting "paused" field of BackupConfiguration/BackupBatch to "true" + +``` +kubectl-stash pause backup [flags] +``` + +### Examples + +``` + # Pause a BackupConfigration + stash pause backup --namespace= --backupconfig= + stash pause backup --namespace=demo --backupconfig=sample-mongodb-backup +``` + +### Options + +``` + -h, --help help for backup +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --backupbatch string Name of the BackupBatch to pause + --backupconfig string Name of the BackupConfiguration to pause + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash pause](/docs/v2024.12.18/reference/cli/kubectl-stash_pause) - Pause Stash backup temporarily + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_rebuild-index.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_rebuild-index.md new file mode 100644 index 0000000000..ff382d1be4 --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_rebuild-index.md @@ -0,0 +1,120 @@ +--- +title: Rebuild-Index +menu: + docs_v2024.12.18: + identifier: kubectl-stash-rebuild-index + name: Rebuild-Index + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash rebuild-index + +Build a new index + +``` +kubectl-stash rebuild-index [flags] +``` + +### Options + +``` + -h, --help help for rebuild-index + --read-all-packs read all pack files to generate new index from scratch +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash](/docs/v2024.12.18/reference/cli/kubectl-stash) - kubectl plugin for Stash by AppsCode + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_resume.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_resume.md new file mode 100644 index 0000000000..7952be9eaa --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_resume.md @@ -0,0 +1,118 @@ +--- +title: Resume +menu: + docs_v2024.12.18: + identifier: kubectl-stash-resume + name: Resume + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash resume + +Resume Stash backup + +### Options + +``` + --backupbatch string Name of the BackupBatch + --backupconfig string Name of the Backupconfiguration + -h, --help help for resume +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash](/docs/v2024.12.18/reference/cli/kubectl-stash) - kubectl plugin for Stash by AppsCode +* [kubectl-stash resume backup](/docs/v2024.12.18/reference/cli/kubectl-stash_resume_backup) - Resume backup + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_resume_backup.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_resume_backup.md new file mode 100644 index 0000000000..b26a44e16f --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_resume_backup.md @@ -0,0 +1,133 @@ +--- +title: Resume Backup +menu: + docs_v2024.12.18: + identifier: kubectl-stash-resume-backup + name: Resume Backup + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash resume backup + +Resume backup + +### Synopsis + +Resume backup by setting "paused" field of BackupConfiguration/BackupBatch to "false" + +``` +kubectl-stash resume backup [flags] +``` + +### Examples + +``` + # Resume a BackupConfigration + stash resume backup --namespace= --backupconfig= + stash resume backup --namespace=demo --backupconfig=sample-mongodb-backup +``` + +### Options + +``` + -h, --help help for backup +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --backupbatch string Name of the BackupBatch + --backupconfig string Name of the Backupconfiguration + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash resume](/docs/v2024.12.18/reference/cli/kubectl-stash_resume) - Resume Stash backup + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_trigger.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_trigger.md new file mode 100644 index 0000000000..b79a2c5e39 --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_trigger.md @@ -0,0 +1,123 @@ +--- +title: Trigger +menu: + docs_v2024.12.18: + identifier: kubectl-stash-trigger + name: Trigger + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash trigger + +Trigger a backup + +### Synopsis + +Trigger a backup by creating BackupSession + +``` +kubectl-stash trigger [flags] +``` + +### Options + +``` + -h, --help help for trigger +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash](/docs/v2024.12.18/reference/cli/kubectl-stash) - kubectl plugin for Stash by AppsCode + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_unlock.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_unlock.md new file mode 100644 index 0000000000..a41d94bf01 --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_unlock.md @@ -0,0 +1,119 @@ +--- +title: Unlock +menu: + docs_v2024.12.18: + identifier: kubectl-stash-unlock + name: Unlock + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash unlock + +Unlock restic repository + +``` +kubectl-stash unlock [flags] +``` + +### Options + +``` + -h, --help help for unlock +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash](/docs/v2024.12.18/reference/cli/kubectl-stash) - kubectl plugin for Stash by AppsCode + diff --git a/content/docs/v2024.12.18/reference/cli/kubectl-stash_version.md b/content/docs/v2024.12.18/reference/cli/kubectl-stash_version.md new file mode 100644 index 0000000000..3495d9def8 --- /dev/null +++ b/content/docs/v2024.12.18/reference/cli/kubectl-stash_version.md @@ -0,0 +1,121 @@ +--- +title: Version +menu: + docs_v2024.12.18: + identifier: kubectl-stash-version + name: Version + parent: reference-cli +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## kubectl-stash version + +Prints binary version number. + +``` +kubectl-stash version [flags] +``` + +### Options + +``` + --check string Check version constraint + -h, --help help for version + --short Print just the version number. +``` + +### Options inherited from parent commands + +``` + --as string Username to impersonate for the operation. User could be a regular user or a service account in a namespace. + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --as-uid string UID to impersonate for the operation. + --cache-dir string Default cache directory (default "/home/runner/.kube/cache") + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to the kubeconfig file to use for CLI requests. + --match-server-version Require server version to match client version + -n, --namespace string If present, the namespace scope for this CLI request + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + -s, --server string The address and port of the Kubernetes API server + --tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use +``` + +### SEE ALSO + +* [kubectl-stash](/docs/v2024.12.18/reference/cli/kubectl-stash) - kubectl plugin for Stash by AppsCode + diff --git a/content/docs/v2024.12.18/reference/operator/_index.md b/content/docs/v2024.12.18/reference/operator/_index.md new file mode 100644 index 0000000000..3072694447 --- /dev/null +++ b/content/docs/v2024.12.18/reference/operator/_index.md @@ -0,0 +1,78 @@ +--- +title: Reference | Stash Operator +description: Stash Operator Reference +menu: + docs_v2024.12.18: + identifier: reference-operator + name: Stash Operator + weight: 10 + parent: reference +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/reference/operator/stash.md b/content/docs/v2024.12.18/reference/operator/stash.md new file mode 100644 index 0000000000..abd3880cb1 --- /dev/null +++ b/content/docs/v2024.12.18/reference/operator/stash.md @@ -0,0 +1,113 @@ +--- +title: Stash +menu: + docs_v2024.12.18: + identifier: stash + name: Stash + parent: reference-operator + weight: 0 +menu_name: docs_v2024.12.18 +section_menu_id: reference +url: /docs/v2024.12.18/reference/operator/ +aliases: +- /docs/v2024.12.18/reference/operator/stash/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## stash + +Stash by AppsCode - Backup your Kubernetes Volumes + +### Synopsis + +Stash is a Kubernetes operator for restic. For more information, visit here: https://stash.run + +### Options + +``` + --bypass-validating-webhook-xray if true, bypasses validating webhook xray checks + -h, --help help for stash + --use-kubeapiserver-fqdn-for-aks if true, uses kube-apiserver FQDN for AKS cluster to workaround https://github.com/Azure/AKS/issues/522 (default true) +``` + +### SEE ALSO + +* [stash backup-pvc](/docs/v2024.12.18/reference/operator/stash_backup-pvc) - Takes a backup of Persistent Volume Claim +* [stash create-backupsession](/docs/v2024.12.18/reference/operator/stash_create-backupsession) - create a BackupSession +* [stash create-vs](/docs/v2024.12.18/reference/operator/stash_create-vs) - Take snapshot of PersistentVolumeClaims +* [stash forget](/docs/v2024.12.18/reference/operator/stash_forget) - Delete snapshots from a restic repository +* [stash restore](/docs/v2024.12.18/reference/operator/stash_restore) - Restore from backup +* [stash restore-pvc](/docs/v2024.12.18/reference/operator/stash_restore-pvc) - Takes a restore of Persistent Volume Claim +* [stash restore-vs](/docs/v2024.12.18/reference/operator/stash_restore-vs) - Restore PVC from VolumeSnapshot +* [stash run](/docs/v2024.12.18/reference/operator/stash_run) - Launch Stash Controller +* [stash run-backup](/docs/v2024.12.18/reference/operator/stash_run-backup) - Take backup of workload paths +* [stash run-hook](/docs/v2024.12.18/reference/operator/stash_run-hook) - Execute Backup or Restore Hooks +* [stash snapshots](/docs/v2024.12.18/reference/operator/stash_snapshots) - Get snapshots of restic repo +* [stash update-status](/docs/v2024.12.18/reference/operator/stash_update-status) - Update status of Repository, Backup/Restore Session +* [stash version](/docs/v2024.12.18/reference/operator/stash_version) - Prints binary version number. + diff --git a/content/docs/v2024.12.18/reference/operator/stash_backup-pvc.md b/content/docs/v2024.12.18/reference/operator/stash_backup-pvc.md new file mode 100644 index 0000000000..017ea8d272 --- /dev/null +++ b/content/docs/v2024.12.18/reference/operator/stash_backup-pvc.md @@ -0,0 +1,134 @@ +--- +title: Backup-Pvc +menu: + docs_v2024.12.18: + identifier: stash-backup-pvc + name: Backup-Pvc + parent: reference-operator +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## stash backup-pvc + +Takes a backup of Persistent Volume Claim + +``` +stash backup-pvc [flags] +``` + +### Options + +``` + --args strings Arguments to pass to the backup command. + --backup-paths strings List of paths to backup + --backupsession string Name of the Backup Session + --bucket string Name of the cloud bucket/container (keep empty for local backend) + --enable-cache Specify whether to enable caching for restic + --endpoint string Endpoint for s3/s3 compatible backend or REST server URL + --exclude strings List of pattern for directory/file to ignore during backup. Stash will not backup those files that matches these patterns. + -h, --help help for backup-pvc + --hostname string Name of the host machine (default "host-0") + --invoker-kind string Kind of the backup invoker + --invoker-name string Name of the respective backup invoker + --kubeconfig string Path to kubeconfig file with authorization information (the master location is set by the master flag). + --master string The address of the Kubernetes API server (overrides any value in kubeconfig) + --max-connections int Specify maximum concurrent connections for GCS, Azure and B2 backend + --output-dir string Directory where output.json file will be written (keep empty if you don't need to write output in file) + --path string Directory inside the bucket where backed up data will be stored + --provider string Backend provider (i.e. gcs, s3, azure etc) + --region string Region for s3/s3 compatible backend + --retention-dry-run Specify whether to test retention policy without deleting actual data + --retention-keep-daily int Specify value for retention strategy + --retention-keep-hourly int Specify value for retention strategy + --retention-keep-last int Specify value for retention strategy + --retention-keep-monthly int Specify value for retention strategy + --retention-keep-tags strings Specify value for retention strategy + --retention-keep-weekly int Specify value for retention strategy + --retention-keep-yearly int Specify value for retention strategy + --retention-prune Specify whether to prune old snapshot data + --scratch-dir string Temporary directory (default "/tmp") + --storage-secret-name string Name of the StorageSecret + --storage-secret-namespace string Namespace of the StorageSecret + --target-kind string Kind of the Target + --target-name string Name of the Target + --target-namespace string Namespace of the Target +``` + +### Options inherited from parent commands + +``` + --bypass-validating-webhook-xray if true, bypasses validating webhook xray checks + --use-kubeapiserver-fqdn-for-aks if true, uses kube-apiserver FQDN for AKS cluster to workaround https://github.com/Azure/AKS/issues/522 (default true) +``` + +### SEE ALSO + +* [stash](/docs/v2024.12.18/reference/operator/stash) - Stash by AppsCode - Backup your Kubernetes Volumes + diff --git a/content/docs/v2024.12.18/reference/operator/stash_create-backupsession.md b/content/docs/v2024.12.18/reference/operator/stash_create-backupsession.md new file mode 100644 index 0000000000..eadd9fa959 --- /dev/null +++ b/content/docs/v2024.12.18/reference/operator/stash_create-backupsession.md @@ -0,0 +1,106 @@ +--- +title: Create-Backupsession +menu: + docs_v2024.12.18: + identifier: stash-create-backupsession + name: Create-Backupsession + parent: reference-operator +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## stash create-backupsession + +create a BackupSession + +``` +stash create-backupsession [flags] +``` + +### Options + +``` + -h, --help help for create-backupsession + --invoker-kind string Type of the backup invoker + --invoker-name string Name of the invoker + --kubeconfig string Path to kubeconfig file with authorization information (the master location is set by the master flag). + --master string The address of the Kubernetes API server (overrides any value in kubeconfig) +``` + +### Options inherited from parent commands + +``` + --bypass-validating-webhook-xray if true, bypasses validating webhook xray checks + --use-kubeapiserver-fqdn-for-aks if true, uses kube-apiserver FQDN for AKS cluster to workaround https://github.com/Azure/AKS/issues/522 (default true) +``` + +### SEE ALSO + +* [stash](/docs/v2024.12.18/reference/operator/stash) - Stash by AppsCode - Backup your Kubernetes Volumes + diff --git a/content/docs/v2024.12.18/reference/operator/stash_create-vs.md b/content/docs/v2024.12.18/reference/operator/stash_create-vs.md new file mode 100644 index 0000000000..b83516978f --- /dev/null +++ b/content/docs/v2024.12.18/reference/operator/stash_create-vs.md @@ -0,0 +1,110 @@ +--- +title: Create-Vs +menu: + docs_v2024.12.18: + identifier: stash-create-vs + name: Create-Vs + parent: reference-operator +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## stash create-vs + +Take snapshot of PersistentVolumeClaims + +``` +stash create-vs [flags] +``` + +### Options + +``` + --backupsession string Name of the respective BackupSession object + -h, --help help for create-vs + --kubeconfig string Path to kubeconfig file with authorization information (the master location is set by the master flag). + --master string The address of the Kubernetes API server (overrides any value in kubeconfig) + --metrics-enabled Specify whether to export Prometheus metrics (default true) + --pushgateway-url string Pushgateway URL where the metrics will be pushed + --target-kind string Kind of the Target + --target-name string Name of the Target + --target-namespace string Namespace of the Target +``` + +### Options inherited from parent commands + +``` + --bypass-validating-webhook-xray if true, bypasses validating webhook xray checks + --use-kubeapiserver-fqdn-for-aks if true, uses kube-apiserver FQDN for AKS cluster to workaround https://github.com/Azure/AKS/issues/522 (default true) +``` + +### SEE ALSO + +* [stash](/docs/v2024.12.18/reference/operator/stash) - Stash by AppsCode - Backup your Kubernetes Volumes + diff --git a/content/docs/v2024.12.18/reference/operator/stash_forget.md b/content/docs/v2024.12.18/reference/operator/stash_forget.md new file mode 100644 index 0000000000..0b3dc651c1 --- /dev/null +++ b/content/docs/v2024.12.18/reference/operator/stash_forget.md @@ -0,0 +1,106 @@ +--- +title: Forget +menu: + docs_v2024.12.18: + identifier: stash-forget + name: Forget + parent: reference-operator +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## stash forget + +Delete snapshots from a restic repository + +``` +stash forget [snapshotID ...] [flags] +``` + +### Options + +``` + -h, --help help for forget + --kubeconfig string Path to kubeconfig file with authorization information (the master location is set by the master flag). + --master string The address of the Kubernetes API server (overrides any value in kubeconfig) + --repo-name string Name of the Repository CRD. + --repo-namespace string Namespace of the Repository CRD. +``` + +### Options inherited from parent commands + +``` + --bypass-validating-webhook-xray if true, bypasses validating webhook xray checks + --use-kubeapiserver-fqdn-for-aks if true, uses kube-apiserver FQDN for AKS cluster to workaround https://github.com/Azure/AKS/issues/522 (default true) +``` + +### SEE ALSO + +* [stash](/docs/v2024.12.18/reference/operator/stash) - Stash by AppsCode - Backup your Kubernetes Volumes + diff --git a/content/docs/v2024.12.18/reference/operator/stash_restore-pvc.md b/content/docs/v2024.12.18/reference/operator/stash_restore-pvc.md new file mode 100644 index 0000000000..9d51cd9f2f --- /dev/null +++ b/content/docs/v2024.12.18/reference/operator/stash_restore-pvc.md @@ -0,0 +1,126 @@ +--- +title: Restore-Pvc +menu: + docs_v2024.12.18: + identifier: stash-restore-pvc + name: Restore-Pvc + parent: reference-operator +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## stash restore-pvc + +Takes a restore of Persistent Volume Claim + +``` +stash restore-pvc [flags] +``` + +### Options + +``` + --args strings Arguments to pass to the restore command. + --bucket string Name of the cloud bucket/container (keep empty for local backend) + --enable-cache Specify whether to enable caching for restic + --endpoint string Endpoint for s3/s3 compatible backend or REST server URL + --exclude strings List of pattern for directory/file to ignore during restore. Stash will not restore those files that matches these patterns. + -h, --help help for restore-pvc + --hostname string Name of the host machine (default "host-0") + --include strings List of pattern for directory/file to restore. Stash will restore only those files that matches these patterns. + --invoker-kind string Kind of the backup invoker + --invoker-name string Name of the respective backup invoker + --kubeconfig string Path to kubeconfig file with authorization information (the master location is set by the master flag). + --master string The address of the Kubernetes API server (overrides any value in kubeconfig) + --max-connections int Specify maximum concurrent connections for GCS, Azure and B2 backend + --output-dir string Directory where output.json file will be written (keep empty if you don't need to write output in file) + --path string Directory inside the bucket where backed up data will be stored + --provider string Backend provider (i.e. gcs, s3, azure etc) + --region string Region for s3/s3 compatible backend + --restore-paths strings List of paths to restore + --scratch-dir string Temporary directory (default "/tmp") + --snapshots strings List of snapshots to be restored + --storage-secret-name string Name of the StorageSecret + --storage-secret-namespace string Namespace of the StorageSecret + --target-kind string Kind of the Target + --target-name string Name of the Target + --target-namespace string Namespace of the Target +``` + +### Options inherited from parent commands + +``` + --bypass-validating-webhook-xray if true, bypasses validating webhook xray checks + --use-kubeapiserver-fqdn-for-aks if true, uses kube-apiserver FQDN for AKS cluster to workaround https://github.com/Azure/AKS/issues/522 (default true) +``` + +### SEE ALSO + +* [stash](/docs/v2024.12.18/reference/operator/stash) - Stash by AppsCode - Backup your Kubernetes Volumes + diff --git a/content/docs/v2024.12.18/reference/operator/stash_restore-vs.md b/content/docs/v2024.12.18/reference/operator/stash_restore-vs.md new file mode 100644 index 0000000000..477c7c8c3e --- /dev/null +++ b/content/docs/v2024.12.18/reference/operator/stash_restore-vs.md @@ -0,0 +1,111 @@ +--- +title: Restore-Vs +menu: + docs_v2024.12.18: + identifier: stash-restore-vs + name: Restore-Vs + parent: reference-operator +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## stash restore-vs + +Restore PVC from VolumeSnapshot + +``` +stash restore-vs [flags] +``` + +### Options + +``` + -h, --help help for restore-vs + --invoker-kind string Kind of the restore invoker + --invoker-name string Name of the respective restore invoker + --kubeconfig string Path to kubeconfig file with authorization information (the master location is set by the master flag). + --master string The address of the Kubernetes API server (overrides any value in kubeconfig) + --metrics-enabled Specify whether to export Prometheus metrics (default true) + --pushgateway-url string Pushgateway URL where the metrics will be pushed + --target-kind string Kind of the Target + --target-name string Name of the Target + --target-namespace string Namespace of the Target +``` + +### Options inherited from parent commands + +``` + --bypass-validating-webhook-xray if true, bypasses validating webhook xray checks + --use-kubeapiserver-fqdn-for-aks if true, uses kube-apiserver FQDN for AKS cluster to workaround https://github.com/Azure/AKS/issues/522 (default true) +``` + +### SEE ALSO + +* [stash](/docs/v2024.12.18/reference/operator/stash) - Stash by AppsCode - Backup your Kubernetes Volumes + diff --git a/content/docs/v2024.12.18/reference/operator/stash_restore.md b/content/docs/v2024.12.18/reference/operator/stash_restore.md new file mode 100644 index 0000000000..1cacb969bb --- /dev/null +++ b/content/docs/v2024.12.18/reference/operator/stash_restore.md @@ -0,0 +1,115 @@ +--- +title: Restore +menu: + docs_v2024.12.18: + identifier: stash-restore + name: Restore + parent: reference-operator +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## stash restore + +Restore from backup + +``` +stash restore [flags] +``` + +### Options + +``` + --backoff-max-wait duration Maximum wait for initial response from kube apiserver; 0 disables the timeout + --enable-cache Specify whether to enable caching for restic (default true) + -h, --help help for restore + --invoker-kind string Kind of the respective restore invoker + --invoker-name string Name of the respective restore invoker + --kubeconfig string Path to kubeconfig file with authorization information (the master location is set by the master flag). + --master string The address of the Kubernetes API server (overrides any value in kubeconfig) + --max-connections int Specify maximum concurrent connections for GCS, Azure and B2 backend + --metrics-enabled Specify whether to export Prometheus metrics + --pushgateway-url string Pushgateway URL where the metrics will be pushed + --restore-model string Specify whether using job or init-container to restore (default init-container) (default "init-container") + --target-kind string Kind of the Target + --target-name string Name of the Target + --target-namespace string Namespace of the Target +``` + +### Options inherited from parent commands + +``` + --bypass-validating-webhook-xray if true, bypasses validating webhook xray checks + --use-kubeapiserver-fqdn-for-aks if true, uses kube-apiserver FQDN for AKS cluster to workaround https://github.com/Azure/AKS/issues/522 (default true) +``` + +### SEE ALSO + +* [stash](/docs/v2024.12.18/reference/operator/stash) - Stash by AppsCode - Backup your Kubernetes Volumes + diff --git a/content/docs/v2024.12.18/reference/operator/stash_run-backup.md b/content/docs/v2024.12.18/reference/operator/stash_run-backup.md new file mode 100644 index 0000000000..e668f62ff3 --- /dev/null +++ b/content/docs/v2024.12.18/reference/operator/stash_run-backup.md @@ -0,0 +1,114 @@ +--- +title: Run-Backup +menu: + docs_v2024.12.18: + identifier: stash-run-backup + name: Run-Backup + parent: reference-operator +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## stash run-backup + +Take backup of workload paths + +``` +stash run-backup [flags] +``` + +### Options + +``` + --enable-cache Specify whether to enable caching for restic (default true) + -h, --help help for run-backup + --host string Name of the host that will be backed up + --invoker-kind string Kind of the backup invoker + --invoker-name string Name of the respective backup invoker + --kubeconfig string Path to kubeconfig file with authorization information (the master location is set by the master flag). + --master string The address of the Kubernetes API server (overrides any value in kubeconfig) + --max-connections int Specify maximum concurrent connections for GCS, Azure and B2 backend + --metrics-enabled Specify whether to export Prometheus metrics + --pushgateway-url string URL of Prometheus pushgateway used to cache backup metrics + --target-kind string Kind of the Target + --target-name string Name of the Target + --target-namespace string Namespace of the Target +``` + +### Options inherited from parent commands + +``` + --bypass-validating-webhook-xray if true, bypasses validating webhook xray checks + --use-kubeapiserver-fqdn-for-aks if true, uses kube-apiserver FQDN for AKS cluster to workaround https://github.com/Azure/AKS/issues/522 (default true) +``` + +### SEE ALSO + +* [stash](/docs/v2024.12.18/reference/operator/stash) - Stash by AppsCode - Backup your Kubernetes Volumes + diff --git a/content/docs/v2024.12.18/reference/operator/stash_run-hook.md b/content/docs/v2024.12.18/reference/operator/stash_run-hook.md new file mode 100644 index 0000000000..a4028e8b50 --- /dev/null +++ b/content/docs/v2024.12.18/reference/operator/stash_run-hook.md @@ -0,0 +1,116 @@ +--- +title: Run-Hook +menu: + docs_v2024.12.18: + identifier: stash-run-hook + name: Run-Hook + parent: reference-operator +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## stash run-hook + +Execute Backup or Restore Hooks + +``` +stash run-hook [flags] +``` + +### Options + +``` + --backupsession string Name of the respective BackupSession object + -h, --help help for run-hook + --hook-type string Type of hook to execute + --hostname string Name of the host that is being backed up or restored (default "host-0") + --invoker-kind string Type of the backup invoker + --invoker-name string Name of the respective backup invoker + --kubeconfig string Path to kubeconfig file with authorization information (the master location is set by the master flag). + --master string The address of the Kubernetes API server (overrides any value in kubeconfig) + --metrics-enabled Specify whether to export Prometheus metrics + --metrics-labels strings Labels to apply in exported metrics + --metrics-pushgateway-url string Pushgateway URL where the metrics will be pushed + --output-dir string Directory where output.json file will be written (keep empty if you don't need to write output in file) + --target-kind string Kind of the Target + --target-name string Name of the Target + --target-namespace string Namespace of the Target +``` + +### Options inherited from parent commands + +``` + --bypass-validating-webhook-xray if true, bypasses validating webhook xray checks + --use-kubeapiserver-fqdn-for-aks if true, uses kube-apiserver FQDN for AKS cluster to workaround https://github.com/Azure/AKS/issues/522 (default true) +``` + +### SEE ALSO + +* [stash](/docs/v2024.12.18/reference/operator/stash) - Stash by AppsCode - Backup your Kubernetes Volumes + diff --git a/content/docs/v2024.12.18/reference/operator/stash_run.md b/content/docs/v2024.12.18/reference/operator/stash_run.md new file mode 100644 index 0000000000..b170429f30 --- /dev/null +++ b/content/docs/v2024.12.18/reference/operator/stash_run.md @@ -0,0 +1,185 @@ +--- +title: Run +menu: + docs_v2024.12.18: + identifier: stash-run + name: Run + parent: reference-operator +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## stash run + +Launch Stash Controller + +### Synopsis + +Launch Stash Controller + +``` +stash run [flags] +``` + +### Options + +``` + --audit-log-batch-buffer-size int The size of the buffer to store events before batching and writing. Only used in batch mode. (default 10000) + --audit-log-batch-max-size int The maximum size of a batch. Only used in batch mode. (default 1) + --audit-log-batch-max-wait duration The amount of time to wait before force writing the batch that hadn't reached the max size. Only used in batch mode. + --audit-log-batch-throttle-burst int Maximum number of requests sent at the same moment if ThrottleQPS was not utilized before. Only used in batch mode. + --audit-log-batch-throttle-enable Whether batching throttling is enabled. Only used in batch mode. + --audit-log-batch-throttle-qps float32 Maximum average number of batches per second. Only used in batch mode. + --audit-log-compress If set, the rotated log files will be compressed using gzip. + --audit-log-format string Format of saved audits. "legacy" indicates 1-line text format for each event. "json" indicates structured json format. Known formats are legacy,json. (default "json") + --audit-log-maxage int The maximum number of days to retain old audit log files based on the timestamp encoded in their filename. + --audit-log-maxbackup int The maximum number of old audit log files to retain. Setting a value of 0 will mean there's no restriction on the number of files. + --audit-log-maxsize int The maximum size in megabytes of the audit log file before it gets rotated. + --audit-log-mode string Strategy for sending audit events. Blocking indicates sending events should block server responses. Batch causes the backend to buffer and write events asynchronously. Known modes are batch,blocking,blocking-strict. (default "blocking") + --audit-log-path string If set, all requests coming to the apiserver will be logged to this file. '-' means standard out. + --audit-log-truncate-enabled Whether event and batch truncating is enabled. + --audit-log-truncate-max-batch-size int Maximum size of the batch sent to the underlying backend. Actual serialized size can be several hundreds of bytes greater. If a batch exceeds this limit, it is split into several batches of smaller size. (default 10485760) + --audit-log-truncate-max-event-size int Maximum size of the audit event sent to the underlying backend. If the size of an event is greater than this number, first request and response are removed, and if this doesn't reduce the size enough, event is discarded. (default 102400) + --audit-log-version string API group and version used for serializing audit events written to log. (default "audit.k8s.io/v1") + --audit-policy-file string Path to the file that defines the audit policy configuration. + --audit-webhook-batch-buffer-size int The size of the buffer to store events before batching and writing. Only used in batch mode. (default 10000) + --audit-webhook-batch-max-size int The maximum size of a batch. Only used in batch mode. (default 400) + --audit-webhook-batch-max-wait duration The amount of time to wait before force writing the batch that hadn't reached the max size. Only used in batch mode. (default 30s) + --audit-webhook-batch-throttle-burst int Maximum number of requests sent at the same moment if ThrottleQPS was not utilized before. Only used in batch mode. (default 15) + --audit-webhook-batch-throttle-enable Whether batching throttling is enabled. Only used in batch mode. (default true) + --audit-webhook-batch-throttle-qps float32 Maximum average number of batches per second. Only used in batch mode. (default 10) + --audit-webhook-config-file string Path to a kubeconfig formatted file that defines the audit webhook configuration. + --audit-webhook-initial-backoff duration The amount of time to wait before retrying the first failed request. (default 10s) + --audit-webhook-mode string Strategy for sending audit events. Blocking indicates sending events should block server responses. Batch causes the backend to buffer and write events asynchronously. Known modes are batch,blocking,blocking-strict. (default "batch") + --audit-webhook-truncate-enabled Whether event and batch truncating is enabled. + --audit-webhook-truncate-max-batch-size int Maximum size of the batch sent to the underlying backend. Actual serialized size can be several hundreds of bytes greater. If a batch exceeds this limit, it is split into several batches of smaller size. (default 10485760) + --audit-webhook-truncate-max-event-size int Maximum size of the audit event sent to the underlying backend. If the size of an event is greater than this number, first request and response are removed, and if this doesn't reduce the size enough, event is discarded. (default 102400) + --audit-webhook-version string API group and version used for serializing audit events written to webhook. (default "audit.k8s.io/v1") + --authentication-kubeconfig string kubeconfig file pointing at the 'core' kubernetes server with enough rights to create tokenreviews.authentication.k8s.io. + --authentication-skip-lookup If false, the authentication-kubeconfig will be used to lookup missing authentication configuration from the cluster. + --authentication-token-webhook-cache-ttl duration The duration to cache responses from the webhook token authenticator. (default 10s) + --authentication-tolerate-lookup-failure If true, failures to look up missing authentication configuration from the cluster are not considered fatal. Note that this can result in authentication that treats all requests as anonymous. + --authorization-always-allow-paths strings A list of HTTP paths to skip during authorization, i.e. these are authorized without contacting the 'core' kubernetes server. (default [/healthz,/readyz,/livez]) + --authorization-kubeconfig string kubeconfig file pointing at the 'core' kubernetes server with enough rights to create subjectaccessreviews.authorization.k8s.io. + --authorization-webhook-cache-authorized-ttl duration The duration to cache 'authorized' responses from the webhook authorizer. (default 10s) + --authorization-webhook-cache-unauthorized-ttl duration The duration to cache 'unauthorized' responses from the webhook authorizer. (default 10s) + --backup-job-psp strings Name of the PSPs for backup job. Use comma to separate multiple PSP names. + --bind-address ip The IP address on which to listen for the --secure-port port. The associated interface(s) must be reachable by the rest of the cluster, and by CLI/web clients. If blank or an unspecified address (0.0.0.0 or ::), all interfaces will be used. (default 0.0.0.0) + --burst int The maximum burst for throttle (default 100) + --cert-dir string The directory where the TLS certs are located. If --tls-cert-file and --tls-private-key-file are provided, this flag will be ignored. (default "apiserver.local.config/certificates") + --client-ca-file string If set, any request presenting a client certificate signed by one of the authorities in the client-ca-file is authenticated with an identity corresponding to the CommonName of the client certificate. + --contention-profiling Enable lock contention profiling, if profiling is enabled + --cron-job-psp strings Name of the PSPs for backup triggering CronJob. Use comma to separate multiple PSP names. + --docker-registry string Docker image registry for sidecar, init-container, check-job, recovery-job and kubectl-job (default "appscode") + --egress-selector-config-file string File with apiserver egress selector configuration. + --enable-mutating-webhook If true, enables mutating webhooks for KubeDB CRDs. + --enable-validating-webhook If true, enables validating webhooks for KubeDB CRDs. + -h, --help help for run + --http2-max-streams-per-connection int The limit that the server gives to clients for the maximum number of streams in an HTTP/2 connection. Zero means to use golang's default. (default 1000) + --image string Image for sidecar, init-container, check-job and recovery-job (default "stash") + --image-pull-secrets strings List of image pull secrets for pulling image from private registries + --image-tag string Image tag for sidecar, init-container, check-job and recovery-job + --kubeconfig string kubeconfig file pointing at the 'core' kubernetes server. + --license-apiservice string Name of the ApiService to use by the addons to identify the respective service and certificate for license verification request + --license-file string Path to license file + --permit-address-sharing If true, SO_REUSEADDR will be used when binding the port. This allows binding to wildcard IPs like 0.0.0.0 and specific IPs in parallel, and it avoids waiting for the kernel to release sockets in TIME_WAIT state. [default=false] + --permit-port-sharing If true, SO_REUSEPORT will be used when binding the port, which allows more than one instance to bind on the same address and port. [default=false] + --profiling Enable profiling via web interface host:port/debug/pprof/ (default true) + --pushgateway-url string URL of the Prometheus pushgateway where backup metrics will be pushed. + --qps float The maximum QPS to the master from this client (default 100) + --requestheader-allowed-names strings List of client certificate common names to allow to provide usernames in headers specified by --requestheader-username-headers. If empty, any client certificate validated by the authorities in --requestheader-client-ca-file is allowed. + --requestheader-client-ca-file string Root certificate bundle to use to verify client certificates on incoming requests before trusting usernames in headers specified by --requestheader-username-headers. WARNING: generally do not depend on authorization being already done for incoming requests. + --requestheader-extra-headers-prefix strings List of request header prefixes to inspect. X-Remote-Extra- is suggested. (default [x-remote-extra-]) + --requestheader-group-headers strings List of request headers to inspect for groups. X-Remote-Group is suggested. (default [x-remote-group]) + --requestheader-username-headers strings List of request headers to inspect for usernames. X-Remote-User is common. (default [x-remote-user]) + --restore-job-psp strings Name of the PSPs for restore job. Use comma to separate multiple PSP names. + --resync-period duration If non-zero, will re-list this often. Otherwise, re-list will be delayed aslong as possible (until the upstream source closes the watch or times out. (default 10m0s) + --scratch-dir emptyDir Directory used to store temporary files. Use an emptyDir in Kubernetes. (default "/tmp") + --secure-port int The port on which to serve HTTPS with authentication and authorization. If 0, don't serve HTTPS at all. (default 443) + --tls-cert-file string File containing the default x509 Certificate for HTTPS. (CA cert, if any, concatenated after server cert). If HTTPS serving is enabled, and --tls-cert-file and --tls-private-key-file are not provided, a self-signed certificate and key are generated for the public address and saved to the directory specified by --cert-dir. + --tls-cipher-suites strings Comma-separated list of cipher suites for the server. If omitted, the default Go cipher suites will be used. + Preferred values: TLS_AES_128_GCM_SHA256, TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305, TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_256_GCM_SHA384. + Insecure values: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_3DES_EDE_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_RC4_128_SHA. + --tls-min-version string Minimum TLS version supported. Possible values: VersionTLS10, VersionTLS11, VersionTLS12, VersionTLS13 + --tls-private-key-file string File containing the default x509 private key matching --tls-cert-file. + --tls-sni-cert-key namedCertKey A pair of x509 certificate and private key file paths, optionally suffixed with a list of domain patterns which are fully qualified domain names, possibly with prefixed wildcard segments. The domain patterns also allow IP addresses, but IPs should only be used if the apiserver has visibility to the IP address requested by a client. If no domain patterns are provided, the names of the certificate are extracted. Non-wildcard matches trump over wildcard matches, explicit domain patterns trump over extracted names. For multiple key/certificate pairs, use the --tls-sni-cert-key multiple times. Examples: "example.crt,example.key" or "foo.crt,foo.key:*.foo.com,foo.com". (default []) + --tracing-config-file string File with apiserver tracing configuration. +``` + +### Options inherited from parent commands + +``` + --bypass-validating-webhook-xray if true, bypasses validating webhook xray checks + --use-kubeapiserver-fqdn-for-aks if true, uses kube-apiserver FQDN for AKS cluster to workaround https://github.com/Azure/AKS/issues/522 (default true) +``` + +### SEE ALSO + +* [stash](/docs/v2024.12.18/reference/operator/stash) - Stash by AppsCode - Backup your Kubernetes Volumes + diff --git a/content/docs/v2024.12.18/reference/operator/stash_snapshots.md b/content/docs/v2024.12.18/reference/operator/stash_snapshots.md new file mode 100644 index 0000000000..0cc4fa818f --- /dev/null +++ b/content/docs/v2024.12.18/reference/operator/stash_snapshots.md @@ -0,0 +1,106 @@ +--- +title: Snapshots +menu: + docs_v2024.12.18: + identifier: stash-snapshots + name: Snapshots + parent: reference-operator +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## stash snapshots + +Get snapshots of restic repo + +``` +stash snapshots [snapshotID ...] [flags] +``` + +### Options + +``` + -h, --help help for snapshots + --kubeconfig string Path to kubeconfig file with authorization information (the master location is set by the master flag). + --master string The address of the Kubernetes API server (overrides any value in kubeconfig) + --repo-name string Name of the Repository CRD. + --repo-namespace string Namespace of the Repository CRD. +``` + +### Options inherited from parent commands + +``` + --bypass-validating-webhook-xray if true, bypasses validating webhook xray checks + --use-kubeapiserver-fqdn-for-aks if true, uses kube-apiserver FQDN for AKS cluster to workaround https://github.com/Azure/AKS/issues/522 (default true) +``` + +### SEE ALSO + +* [stash](/docs/v2024.12.18/reference/operator/stash) - Stash by AppsCode - Backup your Kubernetes Volumes + diff --git a/content/docs/v2024.12.18/reference/operator/stash_update-status.md b/content/docs/v2024.12.18/reference/operator/stash_update-status.md new file mode 100644 index 0000000000..065b77d235 --- /dev/null +++ b/content/docs/v2024.12.18/reference/operator/stash_update-status.md @@ -0,0 +1,125 @@ +--- +title: Update-Status +menu: + docs_v2024.12.18: + identifier: stash-update-status + name: Update-Status + parent: reference-operator +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## stash update-status + +Update status of Repository, Backup/Restore Session + +``` +stash update-status [flags] +``` + +### Options + +``` + --backupsession string Name of the Backup Session + --bucket string Name of the cloud bucket/container (keep empty for local backend) + --enable-cache Specify whether to enable caching for restic + --endpoint string Endpoint for s3/s3 compatible backend or REST server URL + -h, --help help for update-status + --invoker-kind string Type of the respective backup/restore invoker + --invoker-name string Name of the respective backup/restore invoker + --kubeconfig string Path to kubeconfig file with authorization information (the master location is set by the master flag). + --master string The address of the Kubernetes API server (overrides any value in kubeconfig) + --max-connections int Specify maximum concurrent connections for GCS, Azure and B2 backend + --metrics-enabled Specify whether to export Prometheus metrics + --metrics-labels strings Labels to apply in exported metrics + --metrics-pushgateway-url string Pushgateway URL where the metrics will be pushed + --namespace string Namespace of Backup/Restore Session (default "default") + --output-dir string Directory where output.json file will be written (keep empty if you don't need to write output in file) + --path string Directory inside the bucket where backed up data will be stored + --provider string Backend provider (i.e. gcs, s3, azure etc) + --region string Region for s3/s3 compatible backend + --scratch-dir string Temporary directory + --storage-secret-name string Name of the Repository + --storage-secret-namespace string Namespace of the Repository + --target-kind string Kind of the target + --target-name string Name of the target + --target-namespace string Namespace of the target +``` + +### Options inherited from parent commands + +``` + --bypass-validating-webhook-xray if true, bypasses validating webhook xray checks + --use-kubeapiserver-fqdn-for-aks if true, uses kube-apiserver FQDN for AKS cluster to workaround https://github.com/Azure/AKS/issues/522 (default true) +``` + +### SEE ALSO + +* [stash](/docs/v2024.12.18/reference/operator/stash) - Stash by AppsCode - Backup your Kubernetes Volumes + diff --git a/content/docs/v2024.12.18/reference/operator/stash_version.md b/content/docs/v2024.12.18/reference/operator/stash_version.md new file mode 100644 index 0000000000..c549c03a93 --- /dev/null +++ b/content/docs/v2024.12.18/reference/operator/stash_version.md @@ -0,0 +1,104 @@ +--- +title: Version +menu: + docs_v2024.12.18: + identifier: stash-version + name: Version + parent: reference-operator +menu_name: docs_v2024.12.18 +section_menu_id: reference +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## stash version + +Prints binary version number. + +``` +stash version [flags] +``` + +### Options + +``` + --check string Check version constraint + -h, --help help for version + --short Print just the version number. +``` + +### Options inherited from parent commands + +``` + --bypass-validating-webhook-xray if true, bypasses validating webhook xray checks + --use-kubeapiserver-fqdn-for-aks if true, uses kube-apiserver FQDN for AKS cluster to workaround https://github.com/Azure/AKS/issues/522 (default true) +``` + +### SEE ALSO + +* [stash](/docs/v2024.12.18/reference/operator/stash) - Stash by AppsCode - Backup your Kubernetes Volumes + diff --git a/content/docs/v2024.12.18/setup/README.md b/content/docs/v2024.12.18/setup/README.md new file mode 100644 index 0000000000..36f66e4205 --- /dev/null +++ b/content/docs/v2024.12.18/setup/README.md @@ -0,0 +1,102 @@ +--- +title: Setup | Stash +description: Setup guides for Stash by AppsCode +menu: + docs_v2024.12.18: + identifier: setup-readme + name: Readme + parent: setup + weight: -1 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: setup +url: /docs/v2024.12.18/setup/ +aliases: +- /docs/v2024.12.18/setup/README/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Setup + + +
+ +The setup section contains instructions for installing the Stash and its various components in Kubernetes. This section has been divided into the following sub-sections: + +- **Install Stash:** Installation instructions for Stash and its various components. + - [Stash operator](/docs/v2024.12.18/setup/install/stash/): Installation instructions for Stash operator. + - [Stash kubectl Plugin](/docs/v2024.12.18/setup/install/kubectl-plugin/): Installation instructions for Stash `kubectl` plugin. + - [Troubleshooting](/docs/v2024.12.18/setup/install/troubleshooting/): Troubleshooting guide for various installation problems. + +- **Uninstall Stash:** Uninstallation instructions for Stash and its various components. + - [Stash operator](/docs/v2024.12.18/setup/uninstall/stash/): Uninstallation instructions for Stash operator. + - [Stash kubectl Plugin](/docs/v2024.12.18/setup/uninstall/kubectl-plugin/): Uninstallation instructions for Stash `kubectl` plugin. + +- [Upgrading Stash](/docs/v2024.12.18/setup/upgrade/): Instruction for updating Stash license and upgrading between various Stash versions. diff --git a/content/docs/v2024.12.18/setup/_index.md b/content/docs/v2024.12.18/setup/_index.md new file mode 100644 index 0000000000..56079efddb --- /dev/null +++ b/content/docs/v2024.12.18/setup/_index.md @@ -0,0 +1,76 @@ +--- +title: Setup | Stash +menu: + docs_v2024.12.18: + identifier: setup + name: Setup + weight: 30 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/setup/install/_index.md b/content/docs/v2024.12.18/setup/install/_index.md new file mode 100644 index 0000000000..6b8b2e9f80 --- /dev/null +++ b/content/docs/v2024.12.18/setup/install/_index.md @@ -0,0 +1,78 @@ +--- +title: Installation Guide | Stash +description: Stash Installation Guide +menu: + docs_v2024.12.18: + identifier: installation-guide + name: Install + parent: setup + weight: 10 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/setup/install/kubectl-plugin/index.md b/content/docs/v2024.12.18/setup/install/kubectl-plugin/index.md new file mode 100644 index 0000000000..31b255ebf2 --- /dev/null +++ b/content/docs/v2024.12.18/setup/install/kubectl-plugin/index.md @@ -0,0 +1,148 @@ +--- +title: Install Stash kubectl Plugin +description: Installation guide for Stash kubectl Plugin +menu: + docs_v2024.12.18: + identifier: install-stash-kubectl-plugin + name: Stash kubectl Plugin + parent: installation-guide + weight: 30 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: setup +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Install Stash kubectl Plugin + +Stash provides a `kubectl` plugin to interact with Stash resources. + +## Install using Krew + +Stash `kubectl` plugin can be installed using Krew. [Krew](https://krew.sigs.k8s.io/) is the plugin manager for kubectl command-line tool. To install follow the steps below: + +- Install `krew` following the steps [here](https://krew.sigs.k8s.io/docs/user-guide/setup/install/). + +- If you have already installed `krew`, please upgrade `krew` to version v0.4.0 or later so that you can use [custom plugin indexes](https://krew.sigs.k8s.io/docs/user-guide/custom-indexes/). + +```bash +kubectl krew upgrade +kubectl krew version +``` + +- Add [AppsCode's kubectl plugin index](https://github.com/appscode/krew-index). If you have already added the index, update the index. + +```bash +kubectl krew index add appscode https://github.com/appscode/krew-index.git +kubectl krew index list +kubectl krew update +``` + +- Install Stash `kubectl` plugin following the commands below: + +```bash +kubectl krew install appscode/stash +kubectl stash version +``` + +- If Stash `kubectl` plugin is already installed, run the following command to upgrade the plugin: + +```bash +kubectl krew upgrade +kubectl stash version +``` + +## Install using pre-built binary + +You can download the pre-build binaries from [stashed/cli](https://github.com/stashed/cli/releases) releases and put it into one of your installation directory denoted by `$PATH` variable. + +Here is a simple Linux command to install the latest 64-bit Linux binary directly into your `/usr/local/bin` directory: + +```bash +# Linux amd 64-bit +curl -o kubectl-stash.tar.gz -fsSL https://github.com/stashed/cli/releases/download/{{< param "info.cli" >}}/kubectl-stash-linux-amd64.tar.gz \ + && tar zxvf kubectl-stash.tar.gz \ + && chmod +x kubectl-stash-linux-amd64 \ + && sudo mv kubectl-stash-linux-amd64 /usr/local/bin/kubectl-stash \ + && rm kubectl-stash.tar.gz LICENSE.md + +# Mac OSX 64-bit +curl -o kubectl-stash.tar.gz -fsSL https://github.com/stashed/cli/releases/download/{{< param "info.cli" >}}/kubectl-stash-darwin-amd64.tar.gz \ + && tar zxvf kubectl-stash.tar.gz \ + && chmod +x kubectl-stash-darwin-amd64 \ + && sudo mv kubectl-stash-darwin-amd64 /usr/local/bin/kubectl-stash \ + && rm kubectl-stash.tar.gz LICENSE.md +``` + +If you prefer to install kubectl Stash cli from source code, make sure that your go development environment has been setup properly. Then, just run: + +```bash +go get github.com/stashed/cli/... +``` + +>Please note that this will install Stash cli from master branch which might include breaking and/or undocumented changes. diff --git a/content/docs/v2024.12.18/setup/install/stash/images/enterprise_license_form.png b/content/docs/v2024.12.18/setup/install/stash/images/enterprise_license_form.png new file mode 100644 index 0000000000..330d1cb7fc Binary files /dev/null and b/content/docs/v2024.12.18/setup/install/stash/images/enterprise_license_form.png differ diff --git a/content/docs/v2024.12.18/setup/install/stash/index.md b/content/docs/v2024.12.18/setup/install/stash/index.md new file mode 100644 index 0000000000..28ab0d014b --- /dev/null +++ b/content/docs/v2024.12.18/setup/install/stash/index.md @@ -0,0 +1,245 @@ +--- +title: Install Stash +description: Installation guide for Stash +menu: + docs_v2024.12.18: + identifier: install-stash-enterprise + name: Stash + parent: installation-guide + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: setup +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Install Stash + +## Get a Free License + +Download a FREE license from [AppsCode License Server](https://appscode.com/issue-license?p=stash). + +> Stash licensing process has been designed to work with CI/CD workflow. You can automatically obtain a license from your CI/CD pipeline by following the guide from [here](https://github.com/appscode/offline-license-server#offline-license-server). + +## Install + +Stash operator can be installed as a Helm chart or simply as Kubernetes manifests. + + +
+
+ +## Using Helm 3 + +Stash can be installed via [Helm](https://helm.sh/) using the [chart](https://github.com/stashed/installer/tree/{{< param "info.installer" >}}/charts/stash) from [AppsCode Charts Repository](https://github.com/appscode/charts). To install the chart with the release name `stash`: + +```bash +$ helm install stash oci://ghcr.io/appscode-charts/stash \ + --version {{< param "info.version" >}} \ + --namespace stash --create-namespace \ + --set features.enterprise=true \ + --set-file global.license=/path/to/the/license.txt \ + --wait --burst-limit=10000 --debug +``` + +To see the detailed configuration options, visit [here](https://github.com/stashed/installer/tree/{{< param "info.installer" >}}/charts/stash-enterprise). + +
+
+ +## Using YAML + +If you prefer to not use Helm, you can generate YAMLs from Stash chart and deploy using `kubectl`. Here we are going to show the prodecure using Helm 3. + +```bash +$ helm template stash oci://ghcr.io/appscode-charts/stash \ + --version {{< param "info.version" >}} \ + --namespace stash --create-namespace \ + --set features.enterprise=true \ + --set global.skipCleaner=true \ + --set-file global.license=/path/to/the/license.txt | kubectl apply -f - +``` + +To see the detailed configuration options, visit [here](https://github.com/stashed/installer/tree/{{< param "info.installer" >}}/charts/stash-enterprise). + +
+
+ +## Verify installation + +To check if Stash operator pods have started, run the following command: + +```bash +❯ kubectl get pods --all-namespaces -l app.kubernetes.io/name=stash-enterprise --watch +NAMESPACE NAME READY STATUS RESTARTS AGE +kube-system stash-stash-enterprise-678bcb6db4-267vk 2/2 Running 0 3m +``` + +Once the operator pod is running, you can cancel the above command by typing `Ctrl+C`. + +Now, to confirm CRD groups have been registered by the operator, run the following command: +```bash +$ kubectl get crd -l app.kubernetes.io/name=stash + +NAME CREATED AT +backupbatches.stash.appscode.com 2020-08-24T08:20:54Z +backupblueprints.stash.appscode.com 2020-08-24T08:20:55Z +backupconfigurations.stash.appscode.com 2020-08-24T08:20:54Z +backupsessions.stash.appscode.com 2020-08-24T08:20:55Z +functions.stash.appscode.com 2020-08-24T08:20:55Z +recoveries.stash.appscode.com 2020-08-24T08:20:54Z +repositories.stash.appscode.com 2020-08-24T08:20:54Z +restics.stash.appscode.com 2020-08-24T08:20:54Z +restorebatches.stash.appscode.com 2020-08-24T08:20:55Z +restoresessions.stash.appscode.com 2020-08-24T08:20:55Z +tasks.stash.appscode.com 2020-08-24T08:20:55Z +``` + +### Verify Catalogs + +Stash automatically installs the necessary Addon catalogs for database backup. Verify that the Addon catalogs have been installed using the following command. + +```bash +❯ kubectl get tasks.stash.appscode.com +NAME AGE +elasticsearch-backup-5.6.4 5m8s +elasticsearch-backup-6.2.4 5m8s +elasticsearch-backup-6.3.0 5m8s +elasticsearch-backup-6.4.0 5m8s +elasticsearch-backup-6.5.3 5m8s +elasticsearch-backup-6.8.0 5m8s +elasticsearch-backup-7.2.0 5m8s +elasticsearch-backup-7.3.2 5m8s +elasticsearch-restore-5.6.4 5m8s +elasticsearch-restore-6.2.4 5m8s +elasticsearch-restore-6.3.0 5m8s +elasticsearch-restore-6.4.0 5m8s +elasticsearch-restore-6.5.3 5m8s +elasticsearch-restore-6.8.0 5m8s +elasticsearch-restore-7.2.0 5m8s +elasticsearch-restore-7.3.2 5m8s +mariadb-backup-10.5.8 5m8s +mariadb-restore-10.5.8 5m8s +mongodb-backup-3.4.17 5m8s +mongodb-backup-3.4.22 5m8s +mongodb-backup-3.6.13 5m8s +mongodb-backup-4.0.11 5m8s +mongodb-backup-4.0.3 5m8s +mongodb-backup-4.1.13 5m8s +mongodb-backup-4.1.4 5m8s +mongodb-backup-4.1.7 5m8s +mongodb-backup-4.2.3 5m8s +mongodb-restore-3.4.17 5m8s +mongodb-restore-3.4.22 5m8s +mongodb-restore-3.6.13 5m8s +mongodb-restore-4.0.11 5m8s +mongodb-restore-4.0.3 5m8s +mongodb-restore-4.1.13 5m8s +mongodb-restore-4.1.4 5m8s +mongodb-restore-4.1.7 5m8s +mongodb-restore-4.2.3 5m8s +mysql-backup-5.7.25 5m8s +mysql-backup-8.0.14 5m8s +mysql-backup-8.0.21 5m8s +mysql-backup-8.0.3 5m8s +mysql-restore-5.7.25 5m8s +mysql-restore-8.0.14 5m8s +mysql-restore-8.0.21 5m8s +mysql-restore-8.0.3 5m8s +perconaxtradb-backup-5.7 5m8s +perconaxtradb-restore-5.7 5m8s +postgres-backup-10.14 5m8s +postgres-backup-11.9 5m8s +postgres-backup-12.4 5m8s +postgres-backup-13.1 5m8s +postgres-backup-9.6.19 5m8s +postgres-restore-10.14 5m8s +postgres-restore-11.9 5m8s +postgres-restore-12.4 5m8s +postgres-restore-13.1 5m8s +postgres-restore-9.6.19 5m8s +pvc-backup 5m2s +pvc-restore 5m2s +``` + +As you can see from the above output that Stash has created `Task` objects for each supported databases. + +Now, you are ready to [take your first backup](/docs/v2024.12.18/guides/README) using Stash. + +## Purchase Stash License + +If you are interested in purchasing Stash license, please contact us via sales@appscode.com for further discussion. You can also set up a meeting via our [calendly link](https://calendly.com/appscode/intro). + +If you are willing to purchase Stash license but need more time to test in your dev cluster, feel free to contact sales@appscode.com. We will be happy to extend your trial period. diff --git a/content/docs/v2024.12.18/setup/install/troubleshooting/index.md b/content/docs/v2024.12.18/setup/install/troubleshooting/index.md new file mode 100644 index 0000000000..5e194c5b0a --- /dev/null +++ b/content/docs/v2024.12.18/setup/install/troubleshooting/index.md @@ -0,0 +1,172 @@ +--- +title: Troubleshooting Stash Installation +description: Troubleshooting guide for Stash installation +menu: + docs_v2024.12.18: + identifier: install-stash-troubleshoot + name: Troubleshooting + parent: installation-guide + weight: 40 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: setup +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +## Installing in GKE Cluster + +If you are installing Stash on a GKE cluster, you will need cluster admin permissions to install Stash operator. Run the following command to grant admin permision to the cluster. + +```bash +$ kubectl create clusterrolebinding "cluster-admin-$(whoami)" \ + --clusterrole=cluster-admin \ + --user="$(gcloud config get-value core/account)" +``` + +In addition, if your GKE cluster is a [private cluster](https://cloud.google.com/kubernetes-engine/docs/how-to/private-clusters), you will need to either add an additional firewall rule that allows master nodes access port `8443/tcp` on worker nodes, or change the existing rule that allows access to ports `443/tcp` and `10250/tcp` to also allow access to port `8443/tcp`. The procedure to add or modify firewall rules is described in the official GKE documentation for private clusters mentioned before. + +## Configuring Network Volume Accessor + +For network volume such as NFS, Stash needs to deploy a helper deployment in the same namespace as the Repository that uses the NFS as backend to provide Snapshot listing facility. We call this helper deployment network volume accessor. You can configure its resources, user id, privileged permission etc. Run the following command to enable network volume accessor, + + + +
+
+ +### New Installation + +If you haven't installed Stash yet, run the following command to configure the network volume accessor during installation + +```bash +$ helm upgrade -i stash oci://ghcr.io/appscode-charts/stash \ + --version {{< param "info.version" >}} \ + --namespace stash --create-namespace \ + --set features.enterprise=true \ + --set stash-enterprise.netVolAccessor.cpu=200m \ + --set stash-enterprise.netVolAccessor.memory=128Mi \ + --set stash-enterprise.netVolAccessor.runAsUser=0 \ + --set stash-enterprise.netVolAccessor.privileged=true \ + --set-file global.license=/path/to/license-file.txt \ + --wait --burst-limit=10000 --debug +``` + +
+
+ +### Existing Installation + +If you have installed Stash already in your cluster but didn't configure the network volume accessor, you can use `helm upgrade` command to configure it in the existing installation. + +```bash +$ helm upgrade -i stash oci://ghcr.io/appscode-charts/stash \ + --version {{< param "info.version" >}} \ + --namespace stash --create-namespace \ + --reuse-values \ + --set features.enterprise=true \ + --set stash-enterprise.netVolAccessor.cpu=200m \ + --set stash-enterprise.netVolAccessor.memory=128Mi \ + --set stash-enterprise.netVolAccessor.runAsUser=0 \ + --set stash-enterprise.netVolAccessor.privileged=true \ + --set-file global.license=/path/to/license-file.txt \ + --wait --burst-limit=10000 --debug +``` +
+
+ + + +## Detect Stash version + +To detect Stash version, exec into the operator pod and run `stash version` command. + +```bash +$ POD_NAMESPACE=kube-system +$ POD_NAME=$(kubectl get pods -n $POD_NAMESPACE -l app.kubernetes.io/name=stash-community -o jsonpath={.items[0].metadata.name}) +$ kubectl exec $POD_NAME -c operator -n $POD_NAMESPACE -- /stash version + +Version = {{< param "info.version" >}} +VersionStrategy = tag +Os = alpine +Arch = amd64 +CommitHash = 85b0f16ab1b915633e968aac0ee23f877808ef49 +GitBranch = release-0.5 +GitTag = {{< param "info.version" >}} +CommitTimestamp = 2020-08-10T05:24:23 + +$ kubectl exec -it $POD_NAME -c operator -n $POD_NAMESPACE restic version +restic 0.9.6 +compiled with go1.9 on linux/amd64 +``` diff --git a/content/docs/v2024.12.18/setup/uninstall/_index.md b/content/docs/v2024.12.18/setup/uninstall/_index.md new file mode 100644 index 0000000000..ac08676b0f --- /dev/null +++ b/content/docs/v2024.12.18/setup/uninstall/_index.md @@ -0,0 +1,78 @@ +--- +title: Uninstallation Guide | Stash +description: Stash Unistallation Guide +menu: + docs_v2024.12.18: + identifier: uninstallation-guide + name: Uninstall + parent: setup + weight: 20 +menu_name: docs_v2024.12.18 +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + diff --git a/content/docs/v2024.12.18/setup/uninstall/kubectl-plugin/index.md b/content/docs/v2024.12.18/setup/uninstall/kubectl-plugin/index.md new file mode 100644 index 0000000000..bfb94895b8 --- /dev/null +++ b/content/docs/v2024.12.18/setup/uninstall/kubectl-plugin/index.md @@ -0,0 +1,89 @@ +--- +title: Uninstall Stash kubectl Plugin +description: Uninstallation guide for Stash kubectl Plugin +menu: + docs_v2024.12.18: + identifier: uninstall-stash-kubectl-plugin + name: Stash kubectl Plugin + parent: uninstallation-guide + weight: 30 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: setup +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Uninstall Stash kubectl Plugin + +## Uninstall using Krew + +To uninstall Stash `kubectl` plugin, run the following command: + +```bash +kubectl krew uninstall stash +``` diff --git a/content/docs/v2024.12.18/setup/uninstall/stash/index.md b/content/docs/v2024.12.18/setup/uninstall/stash/index.md new file mode 100644 index 0000000000..02979821e0 --- /dev/null +++ b/content/docs/v2024.12.18/setup/uninstall/stash/index.md @@ -0,0 +1,135 @@ +--- +title: Uninstall Stash +description: Uninstallation guide for Stash +menu: + docs_v2024.12.18: + identifier: uninstall-stash-enterprise + name: Stash + parent: uninstallation-guide + weight: 20 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: setup +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Uninstall Stash + +To uninstall Stash, run the following command: + + +
+
+ +## Using Helm 3 + +In Helm 3, release names are [scoped to a namespace](https://v3.helm.sh/docs/faq/#release-names-are-now-scoped-to-the-namespace). So, provide the namespace you used to install the operator when installing. + +```bash +$ helm uninstall stash --namespace kube-system +``` + +
+
+ +## Using YAML (with helm 3) + +If you prefer to not use Helm, you can generate YAMLs from Stash chart and uninstall using `kubectl`. + +```bash +$ helm template stash oci://ghcr.io/appscode-charts/stash \ + --version {{< param "info.version" >}} \ + --namespace stash --create-namespace \ + --set features.enterprise=true \ + --set global.license="nothing" \ + --set global.skipCleaner=true | kubectl delete -f - +``` + +
+
+ +## Delete CRDs + +The above uninstallation process will uninstall the Stash operator. However, it will keep the Stash registered CRDs so that you don't lose your Stash objects i.e. `BackupConfiguration`, `Repository`, etc. during re-installation. If you want to remove the Stash CRDs too, please run the following command. + +```bash +kubectl delete crd -l=app.kubernetes.io/name=stash +``` + +If you wan't to delete the `AppBinding` CRD, run the following command. + +```bash + kubectl delete crd -l=app.kubernetes.io/name=catalog +``` diff --git a/content/docs/v2024.12.18/setup/upgrade/images/stash-navigate-old-version.png b/content/docs/v2024.12.18/setup/upgrade/images/stash-navigate-old-version.png new file mode 100644 index 0000000000..252fd1fbab Binary files /dev/null and b/content/docs/v2024.12.18/setup/upgrade/images/stash-navigate-old-version.png differ diff --git a/content/docs/v2024.12.18/setup/upgrade/index.md b/content/docs/v2024.12.18/setup/upgrade/index.md new file mode 100644 index 0000000000..41fa6b20c6 --- /dev/null +++ b/content/docs/v2024.12.18/setup/upgrade/index.md @@ -0,0 +1,279 @@ +--- +title: Upgrade | Stash +description: Stash Upgrade +menu: + docs_v2024.12.18: + identifier: upgrade-stash + name: Upgrade + parent: setup + weight: 30 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: setup +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Upgrading Stash + +This guide will show you how to upgrade various Stash components. Here, we are going to show how to upgrade from an old Stash version to the new version, and how to update the license, etc. + +## Upgrading Stash from `v2021.xx.xx` to `{{< param "info.version" >}}` + +In order to upgrade from Stash `v2021.xx.xx` to `{{< param "info.version" >}}`, please follow the following steps. + +#### 1. Update Stash catalog CRDs + +Helm [does not upgrade the CRDs](https://github.com/helm/helm/issues/6581) bundled in a Helm chart if the CRDs already exist. So, to upgrade the Stash catalog CRDs, please run the following commands below: + +```bash +# Update catalog CRDs +$ kubectl apply -f https://github.com/stashed/installer/raw/{{< param "info.version" >}}/crds/stash-catalog-crds.yaml + +# Update metrics CRDs +$ kubectl apply -f https://github.com/stashed/installer/raw/{{< param "info.version" >}}/charts/stash-metrics/crds/metrics.appscode.com_metricsconfigurations.yaml +``` + +#### 2. Upgrade Stash Operator + +Now, upgrade the Stash helm chart using the following command. You can find the latest installation guide [here](/docs/v2024.12.18/setup/README). + +```bash +$ helm upgrade stash oci://ghcr.io/appscode-charts/stash \ + --version {{< param "info.version" >}} \ + --namespace stash \ + --set features.enterprise=true \ + --set-file global.license=/path/to/the/license.txt \ + --wait --burst-limit=10000 --debug +``` + +#### 3. Post uprade cleanup + +We have changed the name format for auto-backup resources to support dedicated backup or storage namespace. If you were using a dedicated storage namespace for your auto-backup through the `repoNamespace` field, you might see a new BackupConfiguration and Repository has been created with a new name format. Unfortunately, Stash can't remove the old BackupConfiguration and Repository before creating a new one due to a flaw in how we handled them previously. In this case, you can safely remove the old BackupConfiguration and Repository. Your backed-up data will be intact. + +To cleanup the BackupConfigurations and the Repositories, + +```bash +# Delete a particular backupconfiguration +$ kubectl delete backupconfiguration -n + +# Delete a particular repository +$ kubectl delete repository -n +``` + +## Upgrading Stash from `v0.11.x` and older to `v0.12.x` + +In Stash `v0.11.x` and prior versions, Stash used separate charts for Stash community edition, Stash enterprise edition, and Stash Addons catalogs. In Stash `v0.12.x`, we have moved to a single combined chart for all the components for a better user experience. It also removes the burden of installing individual database addons manually. + +In order to upgrade from Stash `v0.11.x` to `v0.12.x`, please follow the following steps. + +#### 1. Pause Upcoming Backups + +The entire upgrade process may take few minutes depending on your configurations. If you have any scheduled backup that can trigger during the upgrade process, you are advised to pause them before starting the upgrade process. + +You can pause a backup by setting `spec.paused` field of a `BackupConfiguration` to `true` as below, + +```bash +kubectl patch backupconfiguration -n --type="merge" --patch='{"spec": {"paused": true}}' +``` + +>If you don't pause the backup, then any backup that has been triggered during the upgrade process should start executing as soon as the upgrade is completed. So, if multiple backups of different targets are triggered during the upgrade process, they all will start executing simultaneously after the upgrade. If multiple backups of the same target are triggered during the upgrade process, only the first one will be executed and others will be skipped. + +#### 2. Uninstall Stash Addons + +Now, if you have installed Stash database addons, then uninstall them by following their uninstallation guide. All the database addons will be created automatically when you upgrade to the new version of the Stash. + +Make sure to use the appropriate uninstallation guide for the addon version that you are currently using. You can use the dropdown on the left sidebar of the documentation site to navigate to the documentation for previous versions. + +
+ Naviage to old documentation +
Fig: Naviage to old documentation
+
+ +>New documentation does not contain the installation/uninstallation guide for the Addons as they are now automatically installed/uninstalled along with the Stash operator. + +#### 3. Uninstall Stash Operator + +Now, uninstall the Stash operator by following the appropriate uninstallation guide of the Stash version that you are currently running. + +>Make sure you are using the appropriate version of the uninstallation guide. The uninstallation guide for `v0.12.x` will not work for `v0.11.x` Use the dropdown at the sidebar of the documentation site to navigate to the appropriate version that you are currently running. + +#### 5. Update CRDs + + When you uninstall the Stash Operator, it does not remove the old CRDs. Upgrade them to the latest version using the following commands: + +```bash +# Update Stash Catalog CRDs +$ kubectl apply -f https://github.com/stashed/installer/raw/{{< param "info.installer" >}}/crds/stash-catalog-crds.yaml +``` + +#### 4. Reinstall new Stash Operator + +Now, follow the latest installation guide to install the new version of the Stash operator. You can find the latest installation guide [here](/docs/v2024.12.18/setup/README). + +#### 5. Update Task Name in BackupConfiguration + +Stash `v0.12.x` has dropped the `v1`, `v2`, etc. suffix of `Task` name to make it easier to upgrade in future versions. In the future, when you upgrade the Stash operator, you will no longer need to update the `Task` name in the existing BackupConfigurations. However, for upgrading from `v0.11.x` to you `v0.12.x`, you have to update the `Task` name of your existing BackupConfigurations for one last time. + +Please, remove the `-vX` suffix from the `spec.task.name` filed of any existing BackupConfiguration. Use the following command to edit the BackupConfiguration, + +```bash +kubectl edit -n +``` + +For example, here is an example of `spec.task` section before and after the update. + +```bash +# Before Update + task: + name: mysql-backup-8.0.27 # remove '-v1' part +``` + +```bash +# After update. + task: + name: mysql-backup-8.0.21 +``` + +>If you are using KubeDB to manage your databases, you can remove the `spec.task` section entirely. KubeDB catalogs now include the respective addon information for each database version. Stash will read the addon information from there. You no longer have to worry about what addon to use with which database version. + +#### 6. Resume Backup + +Finally, you can resume the backups that you have paused before starting the upgrade process. You can resume backup by setting `spec.paused` field of respective `BackupConfiguration` to `false` as below, + +```bash +kubectl patch backupconfiguration -n --type="merge" --patch='{"spec": {"paused": false}}' +``` + +## Updating License + +Stash support updating license without requiring any re-installation. Stash creates a Secret named `-license` with the license file. You just need to update the Secret. The changes will propagate automatically to the operator and it will use the updated license going forward. + +Follow the below instructions to update the license: + +- Get a new license and save it into a file. +- Then, run the following upgrade command based on your installation. + + +
+
+ +#### Using Helm 3 + +```bash +# detect current version +helm ls -A | grep stash + +# update license key keeping the current version +helm upgrade stash oci://ghcr.io/appscode-charts/stash \ + --version= \ + --namespace stash --create-namespace \ + --reuse-values \ + --set-file global.license=/path/to/new/license.txt \ + --wait --burst-limit=10000 --debug +``` + +
+
+ +#### Using YAML (with helm 3) + +```bash +# detect current version +helm ls -A | grep stash + +# update license key keeping the current version +helm template stash oci://ghcr.io/appscode-charts/stash \ + --version= \ + --namespace stash --create-namespace \ + --set features.enterprise=true \ + --set global.skipCleaner=true \ + --show-only appscode/stash-enterprise/templates/license.yaml \ + --set-file global.license=/path/to/new/license.txt | kubectl apply -f - +``` + +
+
+ +## Upgrading from 0.9.x to v2020.x.x + +If you are upgrading from `0.9.x` which did not use license verification to the new `v2020.x.x`, you have to first uninstall the old version. Then, you have to re-install the new version. + +If you are upgrading from `0.9.x` to `v2020.x.x` Community edition, please note that the following features are only available in Enterprise edition: + +- **Auto-Backup:** Auto-backup is now an enterprise feature. You won't be able to setup any new backup using auto-backup. However, your existing auto-backup resources should keep functioning. +- **Batch Backup:** Batch backup and restore is also now an enterprise feature. You won't be able to create any new backup using batch-backup. However, your existing backup should continue to work and you would be able to restore the data that were backed up using BatchBackup. +- **Local Backend:** Local backend now is an enterprise feature. If you are using any Kubernetes volume (i.e. NFS, PVC, HostPath, etc.) as backend, you won't be able to create any new backup using those backends. However, your existing backup that uses the sidecar model should keep functioning. You have to use the Enterprise edition to restore the backed-up data. If you are interested in purchasing an Enterprise license, please contact us via sales@appscode.com for further discussion. You can also set up a meeting via our [calendly link](https://calendly.com/appscode/intro). + +If you are using any Stash addons, you might need to update the `Task` name in your `BackupConfiguration` to comply with the new naming scheme of the `Function` and `Task`. diff --git a/content/docs/v2024.12.18/support.md b/content/docs/v2024.12.18/support.md new file mode 100644 index 0000000000..42067ce27d --- /dev/null +++ b/content/docs/v2024.12.18/support.md @@ -0,0 +1,88 @@ +--- +title: Support | Stash +description: Support +menu: + docs_v2024.12.18: + identifier: support-stash + name: Support + parent: welcome + weight: 1020 +product_name: stash +menu_name: docs_v2024.12.18 +section_menu_id: welcome +url: /docs/v2024.12.18/welcome/support/ +aliases: +- /docs/v2024.12.18/support/ +info: + cli: v0.37.0 + community: v0.37.0 + elasticsearch: + - 5.6.4-v33 + - 6.2.4-v33 + - 6.3.0-v33 + - 6.4.0-v33 + - 6.5.3-v33 + - 6.8.0-v33 + - 7.14.0-v19 + - 7.2.0-v33 + - 7.3.2-v33 + - 8.2.0-v16 + enterprise: v0.37.0 + etcd: + - 3.5.0-v20 + installer: v2024.12.18 + kubedump: + - 0.1.0-v16 + mariadb: + - 10.5.8-v27 + mongodb: + - 3.4.17-v34 + - 3.4.22-v34 + - 3.6.13-v34 + - 3.6.8-v34 + - 4.0.11-v34 + - 4.0.3-v34 + - 4.0.5-v34 + - 4.1.13-v34 + - 4.1.4-v34 + - 4.1.7-v34 + - 4.2.3-v34 + - 4.4.6-v25 + - 5.0.15-v7 + - 5.0.3-v22 + - 6.0.5-v10 + mysql: + - 5.7.25-v34 + - 8.0.14-v33 + - 8.0.21-v27 + - 8.0.3-v33 + nats: + - 2.6.1-v21 + - 2.8.2-v16 + perconaxtradb: + - 5.7-v28 + postgres: + - 10.14-v32 + - 11.9-v32 + - 12.4-v32 + - 13.1-v29 + - 14.0-v21 + - 15.1-v13 + - 16.1-v2 + - "17.2" + - 9.6.19-v32 + redis: + - 5.0.13-v21 + - 6.2.5-v21 + - 7.0.5-v14 + ui-server: v0.18.0 + vault: + - 1.10.3-v13 + version: v2024.12.18 +--- + +# Support + +To speak with us, please leave a message on [our website](https://appscode.com/contact/). To receive product announcements, follow us on [Twitter](https://twitter.com/KubeStash). + +If you have found a bug with Stash or want to request for new features, please [file an issue](https://github.com/stashed/project/issues/new). diff --git a/data/authors/pritam-das.json b/data/authors/pritam-das.json new file mode 100644 index 0000000000..e1e25f906d --- /dev/null +++ b/data/authors/pritam-das.json @@ -0,0 +1,10 @@ +{ + "name": "Pritam Das", + "designation": "Software Engineer", + "company": "AppsCode Inc.", + "biography": "Pritam Das is a Software Engineer, working at AppsCode Inc. He has been involved with KubeDB project since 2023 and very enthusiastic about Golang, Kubernetes and open source projects in general", + "profile": "/assets/images/authors/pritam-das.jpg", + "email": "pritam@appscode.com", + "github": "https://github.com/pritamdas99", + "linkedin": "https://www.linkedin.com/in/pritam-das-55aa651a5/" +} diff --git a/data/authors/tapajit-chandra-paul.json b/data/authors/tapajit-chandra-paul.json new file mode 100644 index 0000000000..a47723cd93 --- /dev/null +++ b/data/authors/tapajit-chandra-paul.json @@ -0,0 +1,10 @@ +{ + "name": "Tapajit Chandra Paul", + "designation": "Software Engineer", + "company": "AppsCode Inc.", + "biography": "Tapajit Chandra Paul is a Software Engineer, working at AppsCode Inc. He has been involved with Kubernetes project since 2022 and very enthusiastic about Kubernetes and open source in general.", + "profile": "/assets/images/authors/tapajit-chandra-paul.jpg", + "email": "tapajit@appscode.com", + "github": "https://github.com/tapojit047", + "linkedin": "https://www.linkedin.com/in/tapajit-chandra-paul/" +} diff --git a/data/authors/tauhedul-islam.json b/data/authors/tauhedul-islam.json new file mode 100644 index 0000000000..cd408b34d8 --- /dev/null +++ b/data/authors/tauhedul-islam.json @@ -0,0 +1,10 @@ +{ + "name": "Tauhedul Islam", + "designation": "Software Engineer", + "company": "AppsCode Inc.", + "biography": "Tauhedul Islam is a Software Engineer, working at AppsCode Inc. He has been involved with Envoy Proxy project since 2023 and very enthusiastic about C++ Backend and open source projects in general", + "profile": "/assets/images/authors/tauhedul-islam.jpg", + "email": "tauhedul@appscode.com", + "github": "https://github.com/tanu70", + "linkedin": "https://www.linkedin.com/in/tauhedul-islam" + } \ No newline at end of file diff --git a/data/products/configsyncer.json b/data/products/configsyncer.json index 8c93e1a4d8..74efc506fd 100644 --- a/data/products/configsyncer.json +++ b/data/products/configsyncer.json @@ -44,12 +44,12 @@ { "title": "Configuration Syncer", "image": { - "src": "/assets/images/products/configsyncer/features/feature-3.png", - "alt": "http" + "src": "/assets/images/products/configsyncer/features/configuration-syncer.jpg", + "alt": "configuration-syncer" }, "icon": { "src": "/assets/images/products/configsyncer/features/configuration.svg", - "alt": "http" + "alt": "configuration-syncer" }, "summary": "", "description": "Keeps ConfigMaps and Secrets synchronized across Namespaces or Clusters" diff --git a/data/products/guard.json b/data/products/guard.json index e9965dbda6..ce7ff32080 100644 --- a/data/products/guard.json +++ b/data/products/guard.json @@ -49,12 +49,12 @@ { "title": "Identity Providers", "image": { - "src": "/assets/images/products/guard/features/feature-1.png", - "alt": "http" + "src": "/assets/images/products/guard/features/identify-providers.jpg", + "alt": "identify-providers" }, "icon": { "src": "/assets/images/products/guard/features/identity-providers.svg", - "alt": "http" + "alt": "identify-providers" }, "summary": "", "description": "Guard supports Github and Google as identity providers" @@ -62,12 +62,12 @@ { "title": "CLI", "image": { - "src": "/assets/images/products/guard/features/feature-2.png", - "alt": "http" + "src": "/assets/images/products/guard/features/cli.jpg", + "alt": "cli" }, "icon": { "src": "/assets/images/products/guard/features/cli.svg", - "alt": "http" + "alt": "cli" }, "summary": "", "description": "Guard comes with a cli to easily deploy in any Kubernetes cluster." @@ -75,12 +75,12 @@ { "title": "RBAC", "image": { - "src": "/assets/images/products/guard/features/feature-3.png", - "alt": "http" + "src": "/assets/images/products/guard/features/rbac.jpg", + "alt": "rbac" }, "icon": { "src": "/assets/images/products/guard/features/rbac.svg", - "alt": "http" + "alt": "rbac" }, "summary": "", "description": "This tutorial will show you how to use KubeDB in a RBAC enabled cluster." diff --git a/data/products/kubedb.json b/data/products/kubedb.json index 7aa2bda6be..8f09a573ed 100644 --- a/data/products/kubedb.json +++ b/data/products/kubedb.json @@ -55,12 +55,12 @@ "title": "Lower administrative burden", "url": "provision-databases-on-kubernetes", "image": { - "src": "/assets/images/products/kubedb/features/easy-lg.png", - "alt": "http" + "src": "/assets/images/products/kubedb/features/easy-lg.jpg", + "alt": "Lower administrative burden" }, "icon": { "src": "/assets/images/products/kubedb/features/dumbbell.png", - "alt": "http" + "alt": "Lower administrative burden" }, "summary": "", "description": "KubeDB simplifies many of the difficult or tedious management tasks of running a production grade databases on private and public clouds. Maintain one stack for all your stateless and stateful applications and simplify the operational complexity." @@ -69,12 +69,12 @@ "title": "Native Kubernetes Support", "url": "deploy-databases-in-kubernetes-native-way", "image": { - "src": "/assets/images/products/kubedb/features/multi-cloud-lg.png", - "alt": "http" + "src": "/assets/images/products/kubedb/features/multi-cloud-lg.jpg", + "alt": "Native Kubernetes Support" }, "icon": { "src": "/assets/images/products/kubedb/features/kubernetes.png", - "alt": "http" + "alt": "Native Kubernetes Support" }, "summary": "", "description": "Runs on any Kubernetes distribution including OpenShift, Rancher, VMware Tanzu. If you can run Kubernetes, you can provision and manage databases using KubeDB. Use standard Kubernetes CLI and API to provision and manage databases." @@ -83,12 +83,12 @@ "title": "Performance", "url": "increase-database-performance-on-kubernetes", "image": { - "src": "/assets/images/products/kubedb/features/performance-lg.png", - "alt": "http" + "src": "/assets/images/products/kubedb/features/performance-lg.jpg", + "alt": "Performance" }, "icon": { "src": "/assets/images/products/kubedb/features/muscle.png", - "alt": "http" + "alt": "Performance" }, "summary": "", "description": "KubeDB uses Persistent Volume Claims (PVC) to dynamically provision disks for database instances. Using appropriately defined StorageClasses, KubeDB provisioned database instances are designed to scale from small development workloads up to performance-intensive workloads on private and public cloud environments." @@ -97,12 +97,12 @@ "title": "Availability and durability", "url": "backup-restore-databases-on-kubernetes", "image": { - "src": "/assets/images/products/kubedb/features/availability-lg.png", - "alt": "http" + "src": "/assets/images/products/kubedb/features/availability-lg.jpg", + "alt": "Availability and durability" }, "icon": { "src": "/assets/images/products/kubedb/features/last-24-hours.png", - "alt": "http" + "alt": "Availability and durability" }, "summary": "", "description": "KubeDB will backup your database and transaction logs at a user defined frequency and store both for a user-specified retention period in a cloud object store (S3, GCS, etc.) or local filesystem (like NFS, etc.). You can also initiate one-off backups. KubeDB uses Stash by AppsCode to take deduplicated and encrypted backups so that you only incur the cost of incremental storage use. You can create a new instance from a database snapshots whenever you desire." @@ -111,12 +111,12 @@ "title": "Manageability", "url": "monitor-databases-on-kubernetes", "image": { - "src": "/assets/images/products/kubedb/features/monitoring-lg.png", - "alt": "http" + "src": "/assets/images/products/kubedb/features/monitoring-lg.jpg", + "alt": "Manageability" }, "icon": { "src": "/assets/images/products/kubedb/features/prometheus.svg", - "alt": "http" + "alt": "Manageability" }, "summary": "", "description": "KubeDB comes with native support for monitoring via Prometheus. You can use builtin Prometheus scrapper or CoreOS Prometheus Operator to monitor KubeDB supported databases as well as KubeDB operator itself. You can use the Grafana to view key operational metrics, including compute/memory/storage capacity utilization, I/O activity, and instance connections. You can also use any metrics solutions like Datadog with KubeDB." @@ -125,12 +125,12 @@ "title": "Cost-effectiveness", "url": "manage-database-on-kubernetes-free", "image": { - "src": "/assets/images/products/kubedb/features/low-price-lg.png", - "alt": "http" + "src": "/assets/images/products/kubedb/features/low-price-lg.jpg", + "alt": "Cost-effectiveness" }, "icon": { "src": "/assets/images/products/kubedb/features/low-price.png", - "alt": "http" + "alt": "Cost-effectiveness" }, "summary": "", "description": "KubeDB is free to try on any Kubernetes distribution. There is no up-front investment required, and you pay only for the resources you use to your infrastructure provider. And, when you’re finished with a database instance, you can easily delete it." @@ -139,12 +139,12 @@ "title": "Security", "url": "secure-databases-on-kubernetes", "image": { - "src": "/assets/images/products/kubedb/features/security-lg.png", - "alt": "http" + "src": "/assets/images/products/kubedb/features/security-lg.jpg", + "alt": "Security" }, "icon": { "src": "/assets/images/products/kubedb/features/security-lock.png", - "alt": "http" + "alt": "Security" }, "summary": "", "description": "You can secure your Databases with TLS using KubeDB. Also, KubeDB allows you to use encrypted storage for your databases using keys you manage through your cloud provider’s key management service." @@ -156,6 +156,37 @@ "hostDocs": false, "show": true }, + { + "version": "v2024.11.18", + "hostDocs": true, + "show": true, + "info": { + "autoscaler": "v0.34.0", + "cli": "v0.49.0", + "dashboard": "v0.25.0", + "installer": "v2024.11.18", + "ops-manager": "v0.36.0", + "provisioner": "v0.49.0", + "schema-manager": "v0.25.0", + "ui-server": "v0.25.0", + "webhook-server": "v0.25.0" + } + }, + { + "version": "v2024.11.8-rc.0", + "hostDocs": true, + "info": { + "autoscaler": "v0.34.0-rc.0", + "cli": "v0.49.0-rc.0", + "dashboard": "v0.25.0-rc.0", + "installer": "v2024.11.8-rc.0", + "ops-manager": "v0.36.0-rc.0", + "provisioner": "v0.49.0-rc.0", + "schema-manager": "v0.25.0-rc.0", + "ui-server": "v0.25.0-rc.0", + "webhook-server": "v0.25.0-rc.0" + } + }, { "version": "v2024.9.30", "hostDocs": true, @@ -1142,7 +1173,7 @@ "hostDocs": false } ], - "latestVersion": "v2024.9.30", + "latestVersion": "v2024.11.18", "socialLinks": { "facebook": "https://facebook.com/appscode", "github": "https://github.com/kubedb", diff --git a/data/products/kubestash.json b/data/products/kubestash.json index 0dbeb7b3cd..268c381e22 100644 --- a/data/products/kubestash.json +++ b/data/products/kubestash.json @@ -176,6 +176,15 @@ "hostDocs": false, "show": true }, + { + "version": "v2024.12.9", + "hostDocs": true, + "show": true, + "info": { + "cli": "v0.13.0", + "installer": "v2024.12.9" + } + }, { "version": "v2024.9.30", "hostDocs": true, @@ -240,7 +249,7 @@ } } ], - "latestVersion": "v2024.9.30", + "latestVersion": "v2024.12.9", "socialLinks": { "facebook": "https://facebook.com/appscode", "github": "https://github.com/kubestash", diff --git a/data/products/stash-cli.json b/data/products/stash-cli.json index 16e0ee3231..f2c4524222 100644 --- a/data/products/stash-cli.json +++ b/data/products/stash-cli.json @@ -22,6 +22,88 @@ "hostDocs": false, "show": true }, + { + "version": "v0.37.0", + "hostDocs": true, + "show": true, + "info": { + "stash": "v2024.12.18", + "stash-community": "v0.37.0", + "stash-elasticsearch": [ + "5.6.4-v33", + "6.2.4-v33", + "6.3.0-v33", + "6.4.0-v33", + "6.5.3-v33", + "6.8.0-v33", + "7.14.0-v19", + "7.2.0-v33", + "7.3.2-v33", + "8.2.0-v16" + ], + "stash-enterprise": "v0.37.0", + "stash-etcd": [ + "3.5.0-v20" + ], + "stash-installer": "v2024.12.18", + "stash-kubedump": [ + "0.1.0-v16" + ], + "stash-mariadb": [ + "10.5.8-v27" + ], + "stash-mongodb": [ + "3.4.17-v34", + "3.4.22-v34", + "3.6.13-v34", + "3.6.8-v34", + "4.0.11-v34", + "4.0.3-v34", + "4.0.5-v34", + "4.1.13-v34", + "4.1.4-v34", + "4.1.7-v34", + "4.2.3-v34", + "4.4.6-v25", + "5.0.15-v7", + "5.0.3-v22", + "6.0.5-v10" + ], + "stash-mysql": [ + "5.7.25-v34", + "8.0.14-v33", + "8.0.21-v27", + "8.0.3-v33" + ], + "stash-nats": [ + "2.6.1-v21", + "2.8.2-v16" + ], + "stash-perconaxtradb": [ + "5.7-v28" + ], + "stash-postgres": [ + "10.14-v32", + "11.9-v32", + "12.4-v32", + "13.1-v29", + "14.0-v21", + "15.1-v13", + "16.1-v2", + "17.2", + "9.6.19-v32" + ], + "stash-redis": [ + "5.0.13-v21", + "6.2.5-v21", + "7.0.5-v14" + ], + "stash-ui-server": "v0.18.0", + "stash-vault": [ + "1.10.3-v13" + ] + } + }, { "version": "v0.36.0", "hostDocs": true, @@ -2586,5 +2668,5 @@ "show": true } ], - "latestVersion": "v0.36.0" + "latestVersion": "v0.37.0" } diff --git a/data/products/stash-elasticsearch.json b/data/products/stash-elasticsearch.json index fb6548ab48..84141309fe 100644 --- a/data/products/stash-elasticsearch.json +++ b/data/products/stash-elasticsearch.json @@ -27,6 +27,11 @@ "hostDocs": false, "show": true }, + { + "version": "8.2.0-v16", + "hostDocs": true, + "show": true + }, { "version": "8.2.0-v15", "hostDocs": true, @@ -102,6 +107,11 @@ "hostDocs": true, "show": true }, + { + "version": "7.14.0-v19", + "hostDocs": true, + "show": true + }, { "version": "7.14.0-v18", "hostDocs": true, @@ -192,6 +202,11 @@ "hostDocs": true, "show": true }, + { + "version": "7.3.2-v33", + "hostDocs": true, + "show": true + }, { "version": "7.3.2-v32", "hostDocs": true, @@ -374,6 +389,11 @@ "hostDocs": true, "show": true }, + { + "version": "7.2.0-v33", + "hostDocs": true, + "show": true + }, { "version": "7.2.0-v32", "hostDocs": true, @@ -556,6 +576,11 @@ "hostDocs": true, "show": true }, + { + "version": "6.8.0-v33", + "hostDocs": true, + "show": true + }, { "version": "6.8.0-v32", "hostDocs": true, @@ -738,6 +763,11 @@ "hostDocs": true, "show": true }, + { + "version": "6.5.3-v33", + "hostDocs": true, + "show": true + }, { "version": "6.5.3-v32", "hostDocs": true, @@ -920,6 +950,11 @@ "hostDocs": true, "show": true }, + { + "version": "6.4.0-v33", + "hostDocs": true, + "show": true + }, { "version": "6.4.0-v32", "hostDocs": true, @@ -1102,6 +1137,11 @@ "hostDocs": true, "show": true }, + { + "version": "6.3.0-v33", + "hostDocs": true, + "show": true + }, { "version": "6.3.0-v32", "hostDocs": true, @@ -1284,6 +1324,11 @@ "hostDocs": true, "show": true }, + { + "version": "6.2.4-v33", + "hostDocs": true, + "show": true + }, { "version": "6.2.4-v32", "hostDocs": true, @@ -1466,6 +1511,11 @@ "hostDocs": true, "show": true }, + { + "version": "5.6.4-v33", + "hostDocs": true, + "show": true + }, { "version": "5.6.4-v32", "hostDocs": true, @@ -1649,5 +1699,5 @@ "show": true } ], - "latestVersion": "8.2.0-v15" + "latestVersion": "8.2.0-v16" } diff --git a/data/products/stash-etcd.json b/data/products/stash-etcd.json index 7110902ecc..8b14e10092 100644 --- a/data/products/stash-etcd.json +++ b/data/products/stash-etcd.json @@ -27,6 +27,11 @@ "hostDocs": false, "show": true }, + { + "version": "3.5.0-v20", + "hostDocs": true, + "show": true + }, { "version": "3.5.0-v19", "hostDocs": true, @@ -123,5 +128,5 @@ "show": true } ], - "latestVersion": "3.5.0-v19" + "latestVersion": "3.5.0-v20" } diff --git a/data/products/stash-kubedump.json b/data/products/stash-kubedump.json index 0684501a4d..c0e40bc106 100644 --- a/data/products/stash-kubedump.json +++ b/data/products/stash-kubedump.json @@ -27,6 +27,11 @@ "hostDocs": false, "show": true }, + { + "version": "0.1.0-v16", + "hostDocs": true, + "show": true + }, { "version": "0.1.0-v15", "hostDocs": true, @@ -103,5 +108,5 @@ "show": true } ], - "latestVersion": "0.1.0-v15" + "latestVersion": "0.1.0-v16" } diff --git a/data/products/stash-mariadb.json b/data/products/stash-mariadb.json index 66a0861d7c..5976f5c1f9 100644 --- a/data/products/stash-mariadb.json +++ b/data/products/stash-mariadb.json @@ -27,6 +27,11 @@ "hostDocs": false, "show": true }, + { + "version": "10.5.8-v27", + "hostDocs": true, + "show": true + }, { "version": "10.5.8-v26", "hostDocs": true, @@ -153,5 +158,5 @@ "show": true } ], - "latestVersion": "10.5.8-v26" + "latestVersion": "10.5.8-v27" } diff --git a/data/products/stash-mongodb.json b/data/products/stash-mongodb.json index ac2beadbdc..2dab760581 100644 --- a/data/products/stash-mongodb.json +++ b/data/products/stash-mongodb.json @@ -27,6 +27,11 @@ "hostDocs": false, "show": true }, + { + "version": "6.0.5-v10", + "hostDocs": true, + "show": true + }, { "version": "6.0.5-v9", "hostDocs": true, @@ -69,6 +74,11 @@ "version": "6.0.5-v1", "hostDocs": true }, + { + "version": "5.0.15-v7", + "hostDocs": true, + "show": true + }, { "version": "5.0.15-v6", "hostDocs": true, @@ -103,6 +113,11 @@ "version": "5.0.15", "hostDocs": true }, + { + "version": "5.0.3-v22", + "hostDocs": true, + "show": true + }, { "version": "5.0.3-v21", "hostDocs": true, @@ -208,6 +223,11 @@ "hostDocs": true, "show": true }, + { + "version": "4.4.6-v25", + "hostDocs": true, + "show": true + }, { "version": "4.4.6-v24", "hostDocs": true, @@ -328,6 +348,11 @@ "hostDocs": true, "show": true }, + { + "version": "4.2.3-v34", + "hostDocs": true, + "show": true + }, { "version": "4.2.3-v33", "hostDocs": true, @@ -515,6 +540,11 @@ "hostDocs": true, "show": true }, + { + "version": "4.1.13-v34", + "hostDocs": true, + "show": true + }, { "version": "4.1.13-v33", "hostDocs": true, @@ -680,6 +710,11 @@ "hostDocs": true, "show": true }, + { + "version": "4.1.7-v34", + "hostDocs": true, + "show": true + }, { "version": "4.1.7-v33", "hostDocs": true, @@ -867,6 +902,11 @@ "hostDocs": true, "show": true }, + { + "version": "4.1.4-v34", + "hostDocs": true, + "show": true + }, { "version": "4.1.4-v33", "hostDocs": true, @@ -1076,6 +1116,11 @@ "version": "4.1.1-beta.20200708", "hostDocs": true }, + { + "version": "4.0.11-v34", + "hostDocs": true, + "show": true + }, { "version": "4.0.11-v33", "hostDocs": true, @@ -1251,6 +1296,11 @@ "hostDocs": true, "show": true }, + { + "version": "4.0.5-v34", + "hostDocs": true, + "show": true + }, { "version": "4.0.5-v33", "hostDocs": true, @@ -1438,6 +1488,11 @@ "hostDocs": true, "show": true }, + { + "version": "4.0.3-v34", + "hostDocs": true, + "show": true + }, { "version": "4.0.3-v33", "hostDocs": true, @@ -1637,6 +1692,11 @@ "version": "4.0.1-beta.20200708", "hostDocs": true }, + { + "version": "3.6.13-v34", + "hostDocs": true, + "show": true + }, { "version": "3.6.13-v33", "hostDocs": true, @@ -1802,6 +1862,11 @@ "hostDocs": true, "show": true }, + { + "version": "3.6.8-v34", + "hostDocs": true, + "show": true + }, { "version": "3.6.8-v33", "hostDocs": true, @@ -2011,6 +2076,11 @@ "version": "3.6.1-beta.20200708", "hostDocs": true }, + { + "version": "3.4.22-v34", + "hostDocs": true, + "show": true + }, { "version": "3.4.22-v33", "hostDocs": true, @@ -2176,6 +2246,11 @@ "hostDocs": true, "show": true }, + { + "version": "3.4.17-v34", + "hostDocs": true, + "show": true + }, { "version": "3.4.17-v33", "hostDocs": true, @@ -2386,5 +2461,5 @@ "hostDocs": true } ], - "latestVersion": "6.0.5-v9" + "latestVersion": "6.0.5-v10" } diff --git a/data/products/stash-mysql.json b/data/products/stash-mysql.json index 5536e5e900..49c94d7245 100644 --- a/data/products/stash-mysql.json +++ b/data/products/stash-mysql.json @@ -27,6 +27,11 @@ "hostDocs": false, "show": true }, + { + "version": "8.0.21-v27", + "hostDocs": true, + "show": true + }, { "version": "8.0.21-v26", "hostDocs": true, @@ -157,6 +162,11 @@ "hostDocs": true, "show": true }, + { + "version": "8.0.14-v33", + "hostDocs": true, + "show": true + }, { "version": "8.0.14-v32", "hostDocs": true, @@ -339,6 +349,11 @@ "hostDocs": true, "show": true }, + { + "version": "8.0.3-v33", + "hostDocs": true, + "show": true + }, { "version": "8.0.3-v32", "hostDocs": true, @@ -521,6 +536,11 @@ "hostDocs": true, "show": true }, + { + "version": "5.7.25-v34", + "hostDocs": true, + "show": true + }, { "version": "5.7.25-v32", "hostDocs": true, @@ -704,5 +724,5 @@ "show": true } ], - "latestVersion": "8.0.21-v26" + "latestVersion": "8.0.21-v27" } diff --git a/data/products/stash-nats.json b/data/products/stash-nats.json index 3e531d4c6d..d30308212c 100644 --- a/data/products/stash-nats.json +++ b/data/products/stash-nats.json @@ -27,6 +27,11 @@ "hostDocs": false, "show": true }, + { + "version": "2.8.2-v16", + "hostDocs": true, + "show": true + }, { "version": "2.8.2-v15", "hostDocs": true, @@ -102,6 +107,11 @@ "hostDocs": true, "show": true }, + { + "version": "2.6.1-v21", + "hostDocs": true, + "show": true + }, { "version": "2.6.1-v20", "hostDocs": true, @@ -203,5 +213,5 @@ "show": true } ], - "latestVersion": "2.8.2-v15" + "latestVersion": "2.8.2-v16" } diff --git a/data/products/stash-postgres.json b/data/products/stash-postgres.json index ab4e529a00..af885b37de 100644 --- a/data/products/stash-postgres.json +++ b/data/products/stash-postgres.json @@ -27,6 +27,16 @@ "hostDocs": false, "show": true }, + { + "version": "17.2", + "hostDocs": true, + "show": true + }, + { + "version": "16.1-v2", + "hostDocs": true, + "show": true + }, { "version": "16.1-v1", "hostDocs": true, @@ -37,6 +47,11 @@ "hostDocs": true, "show": true }, + { + "version": "15.1-v13", + "hostDocs": true, + "show": true + }, { "version": "15.1-v12", "hostDocs": true, @@ -97,6 +112,11 @@ "hostDocs": true, "show": true }, + { + "version": "14.0-v21", + "hostDocs": true, + "show": true + }, { "version": "14.0-v20", "hostDocs": true, @@ -197,6 +217,11 @@ "hostDocs": true, "show": true }, + { + "version": "13.1-v29", + "hostDocs": true, + "show": true + }, { "version": "13.1-v28", "hostDocs": true, @@ -342,6 +367,11 @@ "hostDocs": true, "show": true }, + { + "version": "12.4-v32", + "hostDocs": true, + "show": true + }, { "version": "12.4-v31", "hostDocs": true, @@ -502,6 +532,11 @@ "hostDocs": true, "show": true }, + { + "version": "11.9-v32", + "hostDocs": true, + "show": true + }, { "version": "11.9-v31", "hostDocs": true, @@ -726,6 +761,11 @@ "hostDocs": true, "show": true }, + { + "version": "10.14-v32", + "hostDocs": true, + "show": true + }, { "version": "10.14-v31", "hostDocs": true, @@ -950,6 +990,11 @@ "hostDocs": true, "show": true }, + { + "version": "9.6.19-v32", + "hostDocs": true, + "show": true + }, { "version": "9.6.19-v31", "hostDocs": true, @@ -1138,5 +1183,5 @@ "show": true } ], - "latestVersion": "16.1-v1" + "latestVersion": "17.2" } diff --git a/data/products/stash.json b/data/products/stash.json index 730d5c814f..3b37e398b5 100644 --- a/data/products/stash.json +++ b/data/products/stash.json @@ -181,6 +181,88 @@ "hostDocs": false, "show": true }, + { + "version": "v2024.12.18", + "hostDocs": true, + "show": true, + "info": { + "cli": "v0.37.0", + "community": "v0.37.0", + "elasticsearch": [ + "5.6.4-v33", + "6.2.4-v33", + "6.3.0-v33", + "6.4.0-v33", + "6.5.3-v33", + "6.8.0-v33", + "7.14.0-v19", + "7.2.0-v33", + "7.3.2-v33", + "8.2.0-v16" + ], + "enterprise": "v0.37.0", + "etcd": [ + "3.5.0-v20" + ], + "installer": "v2024.12.18", + "kubedump": [ + "0.1.0-v16" + ], + "mariadb": [ + "10.5.8-v27" + ], + "mongodb": [ + "3.4.17-v34", + "3.4.22-v34", + "3.6.13-v34", + "3.6.8-v34", + "4.0.11-v34", + "4.0.3-v34", + "4.0.5-v34", + "4.1.13-v34", + "4.1.4-v34", + "4.1.7-v34", + "4.2.3-v34", + "4.4.6-v25", + "5.0.15-v7", + "5.0.3-v22", + "6.0.5-v10" + ], + "mysql": [ + "5.7.25-v34", + "8.0.14-v33", + "8.0.21-v27", + "8.0.3-v33" + ], + "nats": [ + "2.6.1-v21", + "2.8.2-v16" + ], + "percona-xtradb": [ + "5.7-v28" + ], + "postgres": [ + "10.14-v32", + "11.9-v32", + "12.4-v32", + "13.1-v29", + "14.0-v21", + "15.1-v13", + "16.1-v2", + "17.2", + "9.6.19-v32" + ], + "redis": [ + "5.0.13-v21", + "6.2.5-v21", + "7.0.5-v14" + ], + "ui-server": "v0.18.0", + "vault": [ + "1.10.3-v13" + ] + } + }, { "version": "v2024.9.30", "hostDocs": true, @@ -3091,7 +3173,7 @@ "hostDocs": false } ], - "latestVersion": "v2024.9.30", + "latestVersion": "v2024.12.18", "socialLinks": { "facebook": "https://facebook.com/appscode", "github": "https://github.com/stashed", diff --git a/firebase.bk.json b/firebase.bk.json index fd70ac90af..ece53bc459 100644 --- a/firebase.bk.json +++ b/firebase.bk.json @@ -44,17 +44,17 @@ "redirects": [ { "source": "/docs/latest/", - "destination": "/docs/v2024.8.27/", + "destination": "/docs/v2024.9.30/", "type": 302 }, { "source": "/docs/latest/:rest*", - "destination": "/docs/v2024.8.27/:rest", + "destination": "/docs/v2024.9.30/:rest", "type": 302 }, { "source": "/docs", - "destination": "/docs/v2024.8.27/", + "destination": "/docs/v2024.9.30/", "type": 302 } ] diff --git a/firebase.json b/firebase.json index ece53bc459..3a79f46c7a 100644 --- a/firebase.json +++ b/firebase.json @@ -44,17 +44,17 @@ "redirects": [ { "source": "/docs/latest/", - "destination": "/docs/v2024.9.30/", + "destination": "/docs/v2024.12.18/", "type": 302 }, { "source": "/docs/latest/:rest*", - "destination": "/docs/v2024.9.30/:rest", + "destination": "/docs/v2024.12.18/:rest", "type": 302 }, { "source": "/docs", - "destination": "/docs/v2024.9.30/", + "destination": "/docs/v2024.12.18/", "type": 302 } ] diff --git a/static/assets/images/authors/pritam-das.jpg b/static/assets/images/authors/pritam-das.jpg new file mode 100644 index 0000000000..b87957eb32 Binary files /dev/null and b/static/assets/images/authors/pritam-das.jpg differ diff --git a/static/assets/images/authors/profile-photos-84x84/pritam-das.jpg b/static/assets/images/authors/profile-photos-84x84/pritam-das.jpg new file mode 100644 index 0000000000..b87957eb32 Binary files /dev/null and b/static/assets/images/authors/profile-photos-84x84/pritam-das.jpg differ diff --git a/static/assets/images/authors/profile-photos-84x84/tauhedul-islam.jpg b/static/assets/images/authors/profile-photos-84x84/tauhedul-islam.jpg new file mode 100644 index 0000000000..d38aca9b0a Binary files /dev/null and b/static/assets/images/authors/profile-photos-84x84/tauhedul-islam.jpg differ diff --git a/static/assets/images/authors/tapajit-chandra-paul.jpg b/static/assets/images/authors/tapajit-chandra-paul.jpg new file mode 100644 index 0000000000..ddf1f858ff Binary files /dev/null and b/static/assets/images/authors/tapajit-chandra-paul.jpg differ diff --git a/static/assets/images/authors/tauhedul-islam.jpg b/static/assets/images/authors/tauhedul-islam.jpg new file mode 100644 index 0000000000..d38aca9b0a Binary files /dev/null and b/static/assets/images/authors/tauhedul-islam.jpg differ diff --git a/static/assets/images/cloud-provider-icons/Akamai.png b/static/assets/images/cloud-provider-icons/Akamai.png new file mode 100644 index 0000000000..c205ff6c4e Binary files /dev/null and b/static/assets/images/cloud-provider-icons/Akamai.png differ diff --git a/static/assets/images/clouds/akamai.png b/static/assets/images/clouds/akamai.png new file mode 100644 index 0000000000..22d6f8ae3f Binary files /dev/null and b/static/assets/images/clouds/akamai.png differ diff --git a/static/assets/images/products/appscode/vector-logo/appscode-cmyk.ai b/static/assets/images/products/appscode/vector-logo/appscode-cmyk.ai new file mode 100644 index 0000000000..bff0228057 --- /dev/null +++ b/static/assets/images/products/appscode/vector-logo/appscode-cmyk.ai @@ -0,0 +1,5798 @@ +%PDF-1.6 % +1 0 obj <>/OCGs[32 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + appscode-cmyk + + + 2024-12-17T09:31:50+06:00 + 2024-12-17T09:31:50+06:00 + 2024-12-17T09:31:50+07:00 + Adobe Illustrator 29.1 (Windows) + + + + 256 + 56 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAOAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A5Jqep3+qX8+oahO9zeXL mSaaQlmZmNe+Z4FOrJJNlTgtLq4NIIXlI68FLfqyMpiPM01zyxj9RAVZNK1ONS72sqqOrFGoPwyI zQPIhrjqcZNCQ+bWn6XqepXItdOtJr25bpBbxvK5/wBigJywlyACeSdy/ln+YcUbSyeWtTCIKsfq kxoPHZcjxjvZ+FLuY5JHJG7RyKUkQ0ZGBBBHYg5Jre4f84qaxqI81apo/rsdOksGuzbkkqJo5okD KOx4ymtOv0ZTmG1uTppG6fTmYzmOxVRvr22sbK4vbp/TtrWN5p3oW4xxqWY8VBY0A6AYq8nuf+co vy4hcrHb6lcitOUUEQHz/eTRnLfBLQdRFlP5efm35W89zXkGkR3NvcWSpJJDeJGjMjkjknpySggE b/MZGUDFnDIJcma5BsdirsVdirsVdirsVdirsVUrq6trS3kubqVILeIcpJZCFVQO5JwE0xlIRFk0 GDXv52eTLacxRi6u1Xb1YIl4Gnh6jxn8MoOpi6nJ25giaFy9w/XSb+WvzG8reYZhbWdw0N4wqtrc L6cjU3PGhZWPsGycM0ZOTpe0sOY1E+ruLJ8tc92KuxV2Ksc87+dbXypYQXM1u909xIY44kIUbCpJ Y1p92VZcnA4Wu1sdPESIuyl35ffmHJ5tnvo2sRZi0EbLSQyVDlhQ/CnTjgxZeJo7O7S/MmXp4eGu ts0y52jsVfAOh6aNQ1BIXqIlBeWnXiO30nMjUZeCF9XQa3UeFjJHPoz+KKG3iCRqscSDYDYAZozI yNncvKylKRs7l0VxbzV9KVJKdeDBqfdjKBHMUssco8wQ9H/JbzMdN106K6otnqjEghQGFwq/CxYC p5BeO/envl+DKbo8ne9ia6Qn4Uj6Ty8i9ptPMOgXt29nZ6naXN5HXnbQzxySLx61RWLCmZ1F6u2D /nL+V2k+bfLt3ewWyR+YrOJprS7RaPL6a19GQj7YYCi1+yenes8c6LXlxiQ83j3/ADit/wCTC1D/ ALZM3/UTb5bm5OPpvq+D6ozGc12Kpd5i1mz0XQdQ1a9obWxt5J5VJpyCKTw3rux+EYQLKCaFvi63 8oPP+XuqecJk9NY9Qgs7NVFEPNXabbwHKMD6cy+LenA4PSZM1/5xcuvS/MW6ioSLjTZk26ArLC9T 9CkZHNyZ6b6n1bmK5rsVdirsVdirsVdirsVdir57/MrzvdeZNYaxs3Y6TbP6dtEnSaQGnqkDrU/Z 9vmc1+XJxHyeM7U18s+Tgj9A+0/jk9b8neQtH0PRIrae1invpUDX00iK5ZyKlQTX4V6D78yseIAb vSaLQQw4+GgZdS+fPq2qWmtJCsMlpqSTr6UJBV0k5fAADv16ZgUQXi+CcctAcM72fVgrQV3PcjbN q+huxV2KuxV5N+ftyBb6NbA7s88hH+qEUf8AEjmJqujzntDP0wj5n8fav/IOzK2Or3hG0ssMKn/j GrMf+Tgw6Uc0+z0PROXeQPl/a9WzKeidir4V8kgfW7k9/TH/ABLHtD6R73k+2Poj70481Oy6LNxN ORQH5chmJoh+8DruzReYfH7mOeUnZdZRQdnRw3ypX+GZ+tH7su47UjeE+RDNL25ntrK5uLeRop4o pGjkQ0ZWCGhBGarD9cfeHQ6SRGWJH84few7yPrMeiecdE1aWRooLK9gluXTdvRWQeqAO9Y+Qpm/k LD2MDUgX21e+cPK9noba5PqdsNKVDILpZFZHAFaJQnkx7KN8wuE3TsTIVb5x/wCcW2RvzH1NkHFD pU5VfAG6t6DMjNycTT/UX1NmM5jsVeG/85KeabuaLS/IWlBpdQ1iSOW5iT7TJ6nCCKg/nlFf9iMu xDq4+eX8I6q/5t+V7Xyt+QUehW5DLZParJIBTnK0oaV/9k5JxgblacsahTzX/nGT/wAmZ/0Y3H60 yzNyadP9T2n89PO3nLydoVnqugfVfqskxt7xp42klR3UtEyfEE4/C3Kq9aZTjiCd3IyzMRYeVeV/ +cmfOcTXiarbJq9xLEF0yCGNYqT8ur8ByZeNdgK18OuWywhpjqD1Q2j/APOTnnu31pZtXjt7vTGk /f2UcQiZEJ3ET1LVXtzricIpA1Bvd6p+df5iebfLPl3Sdd8sNavpeoMEluJY2kkVpYzJAUBYLxZQ 1ar1A8crxxBNFuyzMRYeaeWf+cmvOcSXsWpWiaxezIo0yOKMRBJATyL+n8TLQ9AO3UZYcIao6g9y h5f/AOcnPO0Gtxy62lvd6VJIBcW0UQieND1MTA1qvWj1r098ThFbIjqDe71r84/zgPkrSNObSYYr 3UNXVpLR5STEkKBT6jKpVm5cxxFR38KZVjx235cvCHnvlLz3+fXmXQtS8yafqunfo7SfUa4triOF Gf0o/VZFVIyw+E7FmX55ZKMQaaoTnIWKelW/5hT61+TL+amhFpeXdvJC0a8uKzGY2xaPlvSvxDc0 +g5i6j0gtWs1HDp5T5Gv2PK/y+skvfOukQOvJfrCylTuD6IMu/8AwGa/GLkHkezICWogD3/du+ms 2T3qm9vbySJK8SPJH9h2UFl+RPTBQQQHnH5gfm22jX0mk6NFHNew7XNzJVo427oqgjkw770GY+XP RoOj7R7Y8GXBAXLr3Bhurfmb+Y9jOkFxfRwzNHHO0aQwkqsqh0V+SGh4sDTKDmmOrrM/auqgQCQD seXf0L1fSPOtnL5Gh8z6iRFGIibhU7yo5jKoD/O4+Ee+Zccno4i9Fh10TpxmlsK3+773nVr+Z35g eY9eWy0COGASEmK3KK4CLuWkkf8AhTMfxpyOzpIdq6nPk4cQA/HVjv5lap5ku9YgtfMEEMF9ZQhC IDVHDksH6tSopleWUid3C7WzZZTEcoAlEdHqv5S20em+QYbq4ZYknaa7ldtgqg8ORP8AqRg5lYBU Leh7IhwaYE7XZ/HwSS6/NLXde1xdG8m2sfxV/wBMuQd1X7T8eiL86k+HbKznMjUXFl2rkzZPDwAe 8pVZfmz5r0bzDJpvmNYrmGCYw3RjQI6UNOaMvEEd9xuPDIjPIGi48O2M2LLwZQKBo197598k/wC9 Vz/xjH68ze0PpHvau2Poj70381/8cWX/AFk/4kMxNF/eOv7M/vh8fuY35U/47cP+q/8AxE5sNZ/d l3HaX9yfh97MtV/45d5/xgk/4gc1OH64+8PPab+9j/WH3vOre3nuJ47eBGlnmdY4o1FWZ2NFUDxJ OdA9iA9R1D/nG38x7LQ31MraTyxoZZdOhlZrkKBUgfAI2YDsrn2rlQzC246eVJj/AM4rf+TC1D/t kzf9RNvgzck6b6vg+qMxnNUL++tNPsbi/vJBFaWsbzTynoscalmP0AYgKS+UvL2ifmV+ZfnbUPO2 gSRWEkVyfRvrp6RwUSkUSAJKWZIuI2T32rmUSIii4URKZ4gmP5u+Xfzh0fykJvNXmS31TSZ7iKF7 WIsW9WjSId4Y9h6Z/awYzEnYMsomBuUr/wCcZ5UT8zo1brLZXCr8wFb9S4c30sdP9T1j/nKK6SL8 ubeEkc7nUYUUd6LHK5P/AAuVYebdqD6WDf8AOKOixT6/resSRhmsbeK3hZhUq1yzFiteh4w0r4H3 yec7NemG5Lz786INPg/NDzDFp6hLYXCkqAABK0SNNQLt/elssx/SGrN9RerfnRdfV/yG8m2Uj/6T OmnBlqdxFYsXPTejFeuVY/qLfmNQCB/5xP0W3l1LXtZkQGa0jgtrZyK09cu0lD2NIlH04c56MdMO ZeYfm1DYwfmT5iisUVLdbyQBEACh9vUAA6fHyyzH9Iacv1F9A+evywufOn5U+XUtKDXtIsLeSyRi AJOVvGJoSx2BfgCD4gdjXKIzqTl5MfFHzfMdpqetaOb7TlnuLOK6H1bVbRGMRkRG+KNwR1BBG48R 45k0C4QJGz6m8xTaDc/khZzeW09PRRFbfV46VZVWUIyuf5xJUOe7VzWaoGjbDtevyprlt94YH+Vt wkHn3SXc0UvJGPnJC6L+LZh4TUg832Qa1MPj9xfSObF7pC6refUtLvLwUrbQSTb9P3aFv4ZGRoEs Mk+GJPcHzHoFs2reaNPguSZDe3kQuGbcsJJBzJr4gnNbEWQ8DponLniDvxS3+e71T80vy5gu5L3z RHei29OEPdQOhYMYkCJwIOxYKFpTMrPi5yei7V7MjMnNxVQ3+Dz7XNM1fTPKGhvcajK9nqnqzw6Z 8QijCEEP9qjFvUB+ztmPKJER5ul1GKePTwuRqe/D0/G7NfyE06MnVtRYVlHpW8Z8FNXf76L92X6U cy7T2exCpT+DBvzHv/rvnfV5a1CTmAf88AIv+NMoym5F1HamTj1Ez518tno35hTyaL+VelabCTG1 wttbTU2PFYjJJ97LvmRl2xgO+7TkcOjjAdaj9n7GFfln5q0TyzNqeo34eS7aFIbOCNSWfkxZ/ipx UVRa1P0HKcUxGy6jsrV48HFKfOtv0/oX6B5M8w+dPMEmqXlu1tp91O1xdXTKUQqzcikVaFvAEdO+ MMZmbZ6fQ5dVl45CoE2f1B4r5LlVdQmjJoZI/h9ypG2bHXx9APm5Ha8ScYPcWS6zYPfadLbIwWRq FCelVNd81+ny8EwS6bSZhiyCR5JP5e8vXtlfG5ueIVVKqqmpJOZWq1UZxoOw1+vhkhwxZDcQpPBJ A5ISVWRiOtGFDTMCEuEg9zqsU+GQl3G0z/KH8m/MN95o0vXjPbDSdLvI7iaRZCZC9uwkWMR0DAsQ OtBTxzdDURnHZ7XRSjmAnE7PqPVNRttM0y71G6bjbWcMlxM3gkSl2/AZSA7Ml8w/84suX/MXUnPV tJnJpsN7q3zJzcnC0/1PqfMZzXjP/OTvnB9L8p22gW7cbjW5D65HUW0BVmH+zcqPkDl2GNm2jUSo V3s0/KDyunlv8vdIseIFxNCLu8PczXA9Qg/6gIT6MhM2WzHGogJF/wA5GaJfap+Wlw1nG0r6fcRX ksaAljEgaNyAP5RJyPsDhxGpMc4uL5j/AC9823HlPzfp+uwW/wBba2Zla1rxMiSo0bKCA1DR9tuu ZM42KcLHLhNs7/PHzn5o13SdAg8w6UNFunkuryOxqxf6s3CO3aRW+JXqso3Ar1oMhjiATTdmkSBe yc/k/wCdfL/5fflnqOs6i4fVdWupBpunrXnOtuiopP8AKgkd+TH6KnbI5ImUqTikIxsvNPKnlrzB +YnnUwqGlnv7hrrVLwD4YkkflLK3YdfhHc0GWyIiGmMTOT03/nKrUIor3y5oFuojhs7aS4Ea9Asj LFGP9iIGplWEcy3ak8g3+VXnrQvy7/Kq61K8Ky61rF1NLplgK85UiVYEZ6fZjWVXqfmBvjOJlJOO YhC3mnkfylrf5gedFgAeQXM5utYvaGkcbvyldj/M1TxFdzlkpCIaIRM5M/8Azy/Mnz/pPnubR9Pv J9F0zT1i+oQ2x9MSoUDeoxX7alqrx+yKUpWuQxwBDdmySEqDDPzF17SPN76Fq9hGW8031uYfMNpD EwDXMLBIpVoKM0yb0TpQd8nAV7mvIRKiOb6K/LH8vbyx/KVPLmt8orq/WaWaI7m3aZuUa08UorEf zVzEzgTsN0tPx4jCXUPH9V0rV/LusG2uka2vbVw8Ug2rxNUkjbuNqg5qiDEvC5sOTBko7SH4sM8t /wA8PM8trHaQ6dBNqLAIsyh25t0qIlP2vkfoy/8AMydzHt7KRwiAM/x0ZV5O8o+Z54NU1TzJeyi9 1m2e3+psfhRJFoGdPsqw6Ko+yPnlmPHI2T1dlotJmIlPLI8UxVdA8ahOoeXfMMTzRFL3TLlHaJqi rROGpXwan3ZiC4n3PKDi0+UWPVAvSrzzJqX5l3VvoWm2kllo6Ok2q3LEMeKmoXYU6/ZHc77UzIMz kNDk9BPUy1xGOAMcf8R/Qi/zu0KQ6FpV1aRH6rpbPC6oNkjkVApPsPSA+nJaiOwroz7e05OOMoja H3H+xiP5befJPLiXljHp8moTXzobWGI0b1ACKUAYmtR0ynFl4ejreyu0PBBhwmRlyph2pvcvqV29 0hjuWmkaeM9VcsSw+g5UXVZyTOROxsvXfNcmredvIk17DpEtithOlxYxseTzwCMq5VQF6cq9NwNs ypkzjdcnqNZx6rTGQgY8JseYYD+XvmnTfL2svcalaC6tJU4EhFeSNgaq6B6D2O+UY5iJsh0vZmsj gmTMXE/Y9c0D8wdR8yaxDHo2kyDRUJ+u6hdHhTY0EYUsvKvap+jrmXHKZHYbPS6btCWeY4IHg6yP 6HxbbXE1tOk8LcZIzVTm0lESFHk15MYnExPIsusvONhIgF0rQSftEAsnzFN/wzV5NBIfTu6HN2VM H0eoImTzXoiLVZmkP8qo1f8AhgoysaLIejTHszMTyr4hSs/N+lzOVuOVrueLsC6kdq8AWB9qfTk5 6CY5G2+fZEwNiCXr/wCW/wCaf5Z+VdAuPruu+ve3UnqtbQW10SoUcVXk0SLy7nemXYNNKI3d72Xh GnxkSO5NsL/Nz8/Z/NllJoWhW8ljoshH1maanr3AU1ClVJVErvSpJ9umZkMVbly8ue9gqf8AOK3/ AJMLUP8Atkzf9RNvgzcl031fB9UZjOag9T0XR9ViSLVLG3v4o25JHcxJMqt4gOGAOEGkEWjAABQb AdBgS7FUss/K3lmyuzeWWkWVreEkm5ht4o5KkUPxqobDZRQfKf8AzkdqrX35pXsHLlHp0FvaxkGo H7sTMPoeYg5lYh6XC1B9T3H8rPJHlnU/yo8twa1pVrqBFu8sb3ESSMguJmmPFyCy15CtDlE5HiLk 44DhFs/0bQND0S2+q6RYW+n253aO3jWMMR3biByPucgSS2AAcnyR/wA5Car+kPzU1RA3KKxSC1j9 uESu4+iR2zKxD0uDnNye/flz5C8s3/5YeWYdb0m0v3Fks0TzxJI6rcsbiiuasoPqVIByicjxGnKh AGItnWkaHo2jWgtNJsYLC2G5ito1iUmlORCgVPud8gTbYAByW6x5d0DWoli1jTrbUI0rwW5hSXjy 68eYPE/LEEhSAeaho/lDyporB9J0ezsZACPVggjjkoetXUcj9JxMiVEQOSb4EoXUNJ0vUohFqFpD dxjos0ayAV8OQNMBiDza8mKMxUgCPNT07QdE0010+wt7RjsWhiRGPzYCpwCAHIIx4IQ+mIHuCOyT al+peXtC1RlfUdPt7t0FFeWNXYDwDEVpkZQB5hpy6fHk+qIl7wirOysrKAQWdvHbQLusUKLGgr4K oAwgAcmyEIxFRFBUkjjljaORQ8bgq6MAQQeoIOFJFoLT/L+habI0mn6fb2kj15PDEiMa9qqBt7ZE QA5Bqx6fHD6YiPuC2Ty35flvjfy6bavenc3DQoXJ8eRFa++PBG7pTp8ZlxGI4u+t0xyTclM/lLyt PdG6m0izkuCatI0EZJPi1Rufc5A449zjy0mIniMY37gmkUUUMaxRIscaCiIgCqB4ADJgN4FcnzLr H/OKnmoajP8AofVLCTTixNubtpo5gpOysEilWo6Vrv7ZkjMOriS0xvZB/wDQq35hf9XDSf8Akdc/ 9k+PjBH5aXk7/oVb8wv+rhpP/I65/wCyfHxgv5aXk7/oVb8wv+rhpP8AyOuf+yfHxgv5aXk7/oVb 8wv+rhpP/I65/wCyfHxgv5aXk7/oVb8wv+rhpP8AyOuf+yfHxgv5aXk9O/JX8lb7yLfXuratew3O pXMP1WKK15GJIiyyMS0iozMzIv7IpTvXavJk4m7Fi4dy9aypvdirsVdirsVeSeaP+cdNA8yebb3X 77VbqNL5xJJawLGpBCqtFkYP/L/LlscpApplgEjb03QtGstE0ay0ixDC0sIUgh5nkxVBSrHapPU5 WTbaBQpHYEvIfMH/ADjf5d17zVf67f6rdql/M08lrCsaFWalQJGD7f7HLRlIFNMsAJt6npGmW2la VZaXa8vqthBFbQczVvThQItTtU0XKybbQKReBLsVdirsVdirsVdirsVdirsVdirsVdirsVdir//Z + + + + uuid:b2df748e-951a-4b4d-a163-dcf78d196ce2 + xmp.did:2967def3-a1db-3648-9803-9bbbaf9f24ce + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + uuid:87d7cc42-d24f-554d-97c7-b76979e61089 + xmp.did:68099ade-e32b-42d3-94ec-ef546c954f1c + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:2967def3-a1db-3648-9803-9bbbaf9f24ce + 2024-12-17T09:31:48+06:00 + Adobe Illustrator 29.1 (Windows) + / + + + + Document + Print + AIRobin + False + False + 1 + + 5.000000 + 1.500000 + Inches + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + Black + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + CMYK Red + CMYK + PROCESS + 0.000000 + 100.000000 + 100.000000 + 0.000000 + + + CMYK Yellow + CMYK + PROCESS + 0.000000 + 0.000000 + 100.000000 + 0.000000 + + + CMYK Green + CMYK + PROCESS + 100.000000 + 0.000000 + 100.000000 + 0.000000 + + + CMYK Cyan + CMYK + PROCESS + 100.000000 + 0.000000 + 0.000000 + 0.000000 + + + CMYK Blue + CMYK + PROCESS + 100.000000 + 100.000000 + 0.000000 + 0.000000 + + + CMYK Magenta + CMYK + PROCESS + 0.000000 + 100.000000 + 0.000000 + 0.000000 + + + C=15 M=100 Y=90 K=10 + CMYK + PROCESS + 15.000000 + 100.000000 + 90.000000 + 10.000000 + + + C=0 M=90 Y=85 K=0 + CMYK + PROCESS + 0.000000 + 90.000000 + 85.000000 + 0.000000 + + + C=0 M=80 Y=95 K=0 + CMYK + PROCESS + 0.000000 + 80.000000 + 95.000000 + 0.000000 + + + C=0 M=50 Y=100 K=0 + CMYK + PROCESS + 0.000000 + 50.000000 + 100.000000 + 0.000000 + + + C=0 M=35 Y=85 K=0 + CMYK + PROCESS + 0.000000 + 35.000000 + 85.000000 + 0.000000 + + + C=5 M=0 Y=90 K=0 + CMYK + PROCESS + 5.000000 + 0.000000 + 90.000000 + 0.000000 + + + C=20 M=0 Y=100 K=0 + CMYK + PROCESS + 20.000000 + 0.000000 + 100.000000 + 0.000000 + + + C=50 M=0 Y=100 K=0 + CMYK + PROCESS + 50.000000 + 0.000000 + 100.000000 + 0.000000 + + + C=75 M=0 Y=100 K=0 + CMYK + PROCESS + 75.000000 + 0.000000 + 100.000000 + 0.000000 + + + C=85 M=10 Y=100 K=10 + CMYK + PROCESS + 85.000000 + 10.000000 + 100.000000 + 10.000000 + + + C=90 M=30 Y=95 K=30 + CMYK + PROCESS + 90.000000 + 30.000000 + 95.000000 + 30.000000 + + + C=75 M=0 Y=75 K=0 + CMYK + PROCESS + 75.000000 + 0.000000 + 75.000000 + 0.000000 + + + C=80 M=10 Y=45 K=0 + CMYK + PROCESS + 80.000000 + 10.000000 + 45.000000 + 0.000000 + + + C=70 M=15 Y=0 K=0 + CMYK + PROCESS + 70.000000 + 15.000000 + 0.000000 + 0.000000 + + + C=85 M=50 Y=0 K=0 + CMYK + PROCESS + 85.000000 + 50.000000 + 0.000000 + 0.000000 + + + C=100 M=95 Y=5 K=0 + CMYK + PROCESS + 100.000000 + 95.000000 + 5.000000 + 0.000000 + + + C=100 M=100 Y=25 K=25 + CMYK + PROCESS + 100.000000 + 100.000000 + 25.000000 + 25.000000 + + + C=75 M=100 Y=0 K=0 + CMYK + PROCESS + 75.000000 + 100.000000 + 0.000000 + 0.000000 + + + C=50 M=100 Y=0 K=0 + CMYK + PROCESS + 50.000000 + 100.000000 + 0.000000 + 0.000000 + + + C=35 M=100 Y=35 K=10 + CMYK + PROCESS + 35.000000 + 100.000000 + 35.000000 + 10.000000 + + + C=10 M=100 Y=50 K=0 + CMYK + PROCESS + 10.000000 + 100.000000 + 50.000000 + 0.000000 + + + C=0 M=95 Y=20 K=0 + CMYK + PROCESS + 0.000000 + 95.000000 + 20.000000 + 0.000000 + + + C=25 M=25 Y=40 K=0 + CMYK + PROCESS + 25.000000 + 25.000000 + 40.000000 + 0.000000 + + + C=40 M=45 Y=50 K=5 + CMYK + PROCESS + 40.000000 + 45.000000 + 50.000000 + 5.000000 + + + C=50 M=50 Y=60 K=25 + CMYK + PROCESS + 50.000000 + 50.000000 + 60.000000 + 25.000000 + + + C=55 M=60 Y=65 K=40 + CMYK + PROCESS + 55.000000 + 60.000000 + 65.000000 + 40.000000 + + + C=25 M=40 Y=65 K=0 + CMYK + PROCESS + 25.000000 + 40.000000 + 65.000000 + 0.000000 + + + C=30 M=50 Y=75 K=10 + CMYK + PROCESS + 30.000000 + 50.000000 + 75.000000 + 10.000000 + + + C=35 M=60 Y=80 K=25 + CMYK + PROCESS + 35.000000 + 60.000000 + 80.000000 + 25.000000 + + + C=40 M=65 Y=90 K=35 + CMYK + PROCESS + 40.000000 + 65.000000 + 90.000000 + 35.000000 + + + C=40 M=70 Y=100 K=50 + CMYK + PROCESS + 40.000000 + 70.000000 + 100.000000 + 50.000000 + + + C=50 M=70 Y=80 K=70 + CMYK + PROCESS + 50.000000 + 70.000000 + 80.000000 + 70.000000 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + C=0 M=0 Y=0 K=90 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 89.999400 + + + C=0 M=0 Y=0 K=80 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 79.998800 + + + C=0 M=0 Y=0 K=70 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 69.999700 + + + C=0 M=0 Y=0 K=60 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 59.999100 + + + C=0 M=0 Y=0 K=50 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 50.000000 + + + C=0 M=0 Y=0 K=40 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 39.999400 + + + C=0 M=0 Y=0 K=30 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 29.998800 + + + C=0 M=0 Y=0 K=20 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 19.999700 + + + C=0 M=0 Y=0 K=10 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 9.999100 + + + C=0 M=0 Y=0 K=5 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 4.998800 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + CMYK + PROCESS + 0.000000 + 100.000000 + 100.000000 + 0.000000 + + + C=0 M=75 Y=100 K=0 + CMYK + PROCESS + 0.000000 + 75.000000 + 100.000000 + 0.000000 + + + C=0 M=10 Y=95 K=0 + CMYK + PROCESS + 0.000000 + 10.000000 + 95.000000 + 0.000000 + + + C=85 M=10 Y=100 K=0 + CMYK + PROCESS + 85.000000 + 10.000000 + 100.000000 + 0.000000 + + + C=100 M=90 Y=0 K=0 + CMYK + PROCESS + 100.000000 + 90.000000 + 0.000000 + 0.000000 + + + C=60 M=90 Y=0 K=0 + CMYK + PROCESS + 60.000000 + 90.000000 + 0.003100 + 0.003100 + + + + + + + Adobe PDF library 17.00 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 5 0 obj <>/ExtGState<>/Properties<>>>/Thumb 37 0 R/TrimBox[0.0 0.0 360.0 108.0]/Type/Page/PieceInfo<>>> endobj 34 0 obj <>stream +H\WK$)x!l52 C !ۋgpD$߳0NED~ok磖VW飖'oǷQ# Go7+ ~xYZJy^¯v|FW^>^m5{fy=`oC;xY|*WZq]5׌CZf n <e_a<ǵ=U(p q(v= =2ݾn㉃w,8cJiwͭcmz^y慭]+$'V[z6l2JXB;Mג"Ίk oؗ;iiȭ];{G\vͯ{r;e代$Xz5܊{g}ވyE-] 32.`ӥ'̚O"]V;Fp{*h%ՋsIGg=aĢ3jE]Ɩp:uDE+ +Dp4ݗ!)BJ;x+"cȢ3:8 c=+v(3 l.MO^ P%@S%$ fW#XǂȮa}Qo!PQEo6M*!,1(ύ 1C*NDPJĚ~~;*kT=ɤ/dNL%_ {raEHc)ĺcb;RM8FN0WdOl}Os1 [Ɋ5C=|m|ݍTuS*pW"{nBjDZy8r&4}/V4WZ^}L,B?zkaVJ] d 0㔳h9ˤەX? + +QV\5#=I F\i'B/lr#NP; W ]4WzZٴqtZ΄pB{6X AbEb+zgNfD+_קTS>꾎QU$}P$ƛ.Tv~kQ~vjLF7OkLܵu!?KL{Mfw&|Alޖ='857!ƚu7ۈ/m7"`]ɢf:p),ŔҥR +s3 |IPokK|hlc`%_ [,wx4nQ \M7dZDݘgP@iRI*QR˄e,jGiB݉mU +YYϜ+i[P qzHʽvc|ڷ[e llq50|5-Eo 0Wמ9G^IeDQ!݊#ߔJJ\*EH.^&: J"E %eO k<AࣾEt5ƭUpQL^?A ' s(@T']>WfǬnHXt Uw͙(g[*FvK +\5/cՙU$-#2ٞ;L5f4KX)k 5 e]M]ᇄeF6Yy-3۠C 9hA̦ +;.,lcr< F83iPwV'Tvmxp! <V!塞SղnM 0 ,ggF%/F;L B:=.R(#V F{LYSHgp`“_`sx}Ekk]_֤ sMl5jrɭCܪR!JI$MwIZw?Ȩ6J UPٮb$MiΗ(BH S-b(yr07 v۠4)09"bĉ }+-YRn6q~M"#Dk;lBya-%UœA..Zƪ#hG!$Vr66xIuGTx*O&jPu=tYc! yn6rGgE~N˱sN}Q!,2#3Y-d0B*VkN:#9MLg_Sy$rA~m <nIyT\{NBD 8^8?$&u)e]Y@=Ǚ{؃D!{2$W'gSңmA޷(>Ϫ4>QcOX$bɑ1Ѽٵs;.39H~(K^=gWݧPdwqbY=PMw꼂Yʏ_ӽ馓o;lZg:O+4,cSriD8r:8C'DAa&N]hr# +n!ߙ7z'"Q͡} U@>H!uA5rW7:ì\{_dn:7%&Q:ajV^~X)HJ`23WpVn;N-Cy-29wZUmz3⫧Ur+[JdrVKzZ(ԅ' R&ac6 j`+xsCU-@gsA~ AV{1K4&A Q/tvP)vY 8^sefH`VLtrKsG-cLk}㥙cKf׶@QO=oC7mְjg_5.[ gҷg8uΈJB";`Cٌh'ƕq7Od&F~b>Y(Õ}ޖqݖt,/]0ʃ-j+\ӽ"hZR[o _+ n;Bz[ɖbypM%]Ki?>+&NBbu!֜kFY_é4t0XghBANطN ]CPr§Ռj|3YKO7Hi>" zeA9 VZRD!]YhZ Z޴w{G΁($eϦT@o_m].NDPΝXh&,q)WGxM5hi݆'b`$R^w}/tY1&ܯ:%5#" fa7d4RHz!Zeprݝ:TtL6>Hi>3LV3j,0zjX cȍ#n{W@>u8tc9' ޲gz%~7 ¨`Yx9c֬֝_WTum>}XgҬ1\h?g"P? xL3ϓ1OkX8Uq6O5` V 5.>:5#"1,7V<> _y8;wv WZѽݻNw_(l%ŋ} ra?W=^_:-5Oԫ+6:Ӎ%pV=!ʍqebzp<]\1Ѝ򍇂>ra;bIhHStSKl5f9~r?߂3-C@ E_*R׆!GFm1. Z|J*A/[KᵮvϞ(C^'O].EQ]^g\({XC?n}2jg蕶9Tuq_K 8wo??NjI(k@S7q9`UyWO>V='q$]P)H[֖p,hoNGjѰ#)^m;Qłt:z\;#zmQw7ՑZ>OS(WSe1S\!ߕ ۪f@ wȥVͥ?x[ݑx\iHY5ڭLtrN&Iu L"2Lx+P6#iަـVjlR2yQFNl_,ok:qkG('՞ic80q\Y>lz4Q9iN,DZb)Β\uzi*UUδcgoMv5JGXjDa9|nI1x#p@ݲuezödszpyq|^vѲ]"̈8ԃKEWDcNA}nqwɫM]p 4hONb%'^6$>OݒTD14t%MņZ"k *a|Դ/[+_7Fѥٟ_|y豮jwB?,j`*X7EGA6(ASHe6 |Ts̙S3~6m|J^S .=i >P޿t8"<1 _?ǽ_1cWE kZd^luO1&R2#MfxcG +k^ +ڞ0'ߖS& 4O(HD|956nטg}AClsZg{>NeA@F&'K^%]K=& +#=xg1~oؘb,$ir6 .Q \Uj*{tD?*ǒ֡[Em|8ÿ +'*}׿nAEI  tɯi⸅C,\]fiܥv&"$" U(c6|1ژ0LДnD6b ؃Wi3qf$ +dęsR˶.FOyY[)8 Q'YŰWY~ @g>%K ߦV]|k6S#nqu6`Lm5 +1>ݲoX$I]T1 ;֬]1+7I庁`ݪ\ +}PF(ӤLIt@DASR]gH/j5~IUmb4xOՓjd; +e388 (T.'MdzP(}.խ'tØ>OS-UGK49ÉLb/H +\ &Ke' +Fm (>| *+a҄+厘jBI -l'Tf[J0_t9A{g-3<Ic%R힬=Gխ)Ŷs9ZFqdӨai LBCqR1RUD#^A{X,EF*Ppa!DF{"v V5>$`k<}LUL젆q4567SlW-!JP4U!,* +Ӿ:*Qt&F-k"T&^JoOX]s,AudLz>Ej=&G^|ؼuNh8*TvG9!^Ini"N !*$_"ș%+2ĺK_(S{З7Q%**"LZ NoeoBa.y ߞ>p&܋D3AQ:CVwb*8e#CQPNs4t6RI-`nlU-PPv:a9M H-~E$dvo<8USCLKܴpVJ^[A\«vbFBwȠ.-@ ȒANǢf(R7XD}@]Uڦcݘm=Ori) MjL5jz3sKptBYi8o3O"ږuzH._8򕪆OYju>%:#y59v"ic|_NFVG$,4j,DI^SВRMhsDß2{-Mq^jBNEӿZ6b%ZVg?#ɲqh|ԩnoXYx~["Jj/*Z7_v_0l3p`@9)vU @ȉ8$kg2 ;$ɓFlh,74F)Y4Ґp +ћGIq*:ӜF})jG]:؍WϖD!Ӥ(v; +fKsBmm/Q\\&"'itk}jGdYVbp] +hAmrYvI!&C;QEp g|Q浥,!]%f8C5 N'C%VOb g84[FȽR|(j*iZyWzX=zMZK<1t'ꍸ6%ޖ #iOPB1vN!h+fD!I%.g&`e]wmAD 0gǓH +2!I4H{OcyQs_ʼn^8 Ƽy~&+Ifc䬖yVklǩl' ^0T"MOU6[dۍ^Y8[DNm>stream +8;X]M\IlV2#TEh`JLaf$m(WSe6n%isgnetPT]>qU$^lhN@e?APA'%)tkm2KVI +&7SSk*5G`` +endstream endobj 8 0 obj <> endobj 9 0 obj <> endobj 10 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 24.0 +%%AI8_CreatorVersion: 29.1.0 +%%For: (Mohin Uddin) () +%%Title: (Untitled-3) +%%CreationDate: 12/17/2024 9:31 AM +%%Canvassize: 16383 +%%BoundingBox: 20 -87 340 -21 +%%HiResBoundingBox: 20.7838753129718 -86.8473798027353 339.216124687029 -21.1526201972647 +%%DocumentProcessColors: Cyan Magenta Yellow Black +%AI5_FileFormat 14.0 +%AI12_BuildNumber: 142 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%CMYKProcessColor: 1 1 1 1 ([Registration]) +%AI3_Cropmarks: 0 -108 360 0 +%AI3_TemplateBox: 180.5 -54.5 180.5 -54.5 +%AI3_TileBox: -216 -360 576 252 +%AI3_DocumentPreview: None +%AI5_ArtSize: 14400 14400 +%AI5_RulerUnits: 0 +%AI24_LargeCanvasScale: 1 +%AI9_ColorModel: 2 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI17_Begin_Content_if_version_gt:24 4 +%AI10_OpenToVie: -48.2941176470604 78.6470588235325 2.83333333333333 0 8246.47058823529 8220.88235294117 1616 906 18 0 0 -1874 121 0 0 0 1 1 0 1 1 0 0 +%AI17_Alternate_Content +%AI9_OpenToView: -48.2941176470604 78.6470588235325 2.83333333333333 1616 906 18 0 0 -1874 121 0 0 0 1 1 0 1 1 0 0 +%AI17_End_Versioned_Content +%AI5_OpenViewLayers: 7 +%AI17_Begin_Content_if_version_gt:24 4 +%AI17_Alternate_Content +%AI17_End_Versioned_Content +%%PageOrigin:-126 -450 +%AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MS +%%EndComments + +endstream endobj 11 0 obj <>stream +%AI24_ZStandard_Data(/XT~# +-rH mE栭T_,Sdwo{xf.iW m1P_XJDLDUܽ؎VWiO:sj V!k#RH)rERD22 +E*TGn5-BDWKґK2{ڮ (żr1n*fD:HGΞO,T/{EFKSDP#VHOI"BY:zjdXUPܤ{B֯k" ʳ;K|*:YZ v)+ϒveZNs H+vSι)gG]/Г5eݭ2Ae|V݇bYRM:.g!`_JXI6|  hHL@@p z8NH< +eՔʙ³kUywH8‰H! #X N D("Q*"Lazu泔0wz!̹,: Zycs3)P ++`0 F`<4H +ƂH1@$H,L|41Ԫͺ2ڨL'! bPUV륨E1QzX -vS0=lGH~[  G. t'Χ"E2|>ھ^~w|_( E)x<"+1%"Qvbh( +Dx(TvbX0)&(!Xy2x!& I> 9\ p IHVHCV"1P "A EZǚ" <"# # "hC],E$HdaUY"!" ܛY]Z1ab'Ʀ3x ͆n񆢱h,h4h<Gu09qt#Î;P8 cX8p8<G=a{ȇ~x,x4x<2?ґd"tfb^ZVR6'2p +< 8-Nq?_ޝ]oak- ̬6(G5QREfcP,"-jA.fP8 "P, +V0E)HQ(wqWvaVDH5H:aDch05Q j1h0  3c(ccX0"QDoHH .8@@$.X\x`)#ؚ)CXra)"aDb("1A$\"!aA A$$A* $@xD@&xp`hU`x0Pp*\@B* + @@D,`ЀA l* ,2hX(,2hx` … (@`<\PP`!,X\X <@x&Hp $8  H@,4hSʱH5_&K>_WgBUJjx\gQ˭b:Q6Se:oo?,ѹXzIenVi{YRln~V/wrwR,!X9u?,ݲ^.) SjWRCgvi Z ޵-SV^ R1ό7"&2duncxk YI7K]s+,&#S"~p —W+HIMVb*C96Âf䮰%#{v33ʏs?Lيm'oN,3GGTyB&,*!~ХK]nJG"LWr׭՘%dV~Z.5NLa2C1+wy9'[[׻PKrЈ֔c\{zWvx:t7MK?c^ݱ\:BM5/;c]=WnV^f؜՘Y͗6*S֜zȇj1Mz̲`ݝsw7URj?Rץ< +?\yw3}pwHV+^w6a6|3u4|瞳yn + }]T9]^^/G4 9nUυ8x;XZ,ڦ.i_f Mhs!aF.fAm;!y^UVGBJQhW:+_{*kS>WXIe4R=( vLl\nf.NL,9wFd +VM:2:+g̬gOxzI;ĩ3ˢo +=)dg .uufywC-ir|>33Q +ojJ+^oQA4V[QM#֩=M Z\Z*bTCcF+T'bq3Z ++D0qrʆ2g̡Rk#D,:ل/X\)9SDr*b>D<}%U\ K9&Zlƿg#+'ďK&s^JHQb:r#L{UK4eRCrh->RRfgTUȐ\Б'c#/,#+")ERc*_fk$$5Cwʱp^Ƥ\2&ɳrf٪Z3=%Y2-ck&aH"3[`X$ER&4EiVʧM " +\"I,h#2#W)<|9Y\߫ϪddVɺ]Ė!$VN4FfLs)BYJX,h5#7 IѲIWsx'?aGB*5%U~|:)]/gk V~dߗ2r-' +"s*;˴R#XF,g$ +11MN$eS(kNve]j͟|xSU8UN? JIrVHhJ!镜Uv~鑓a]Med,ufb, [>DN39 XbjqblM*HLy^)!aӊ8nh%X<)'l5 $((T`A@o^Y)+;L.C*L#94$*+;mG*O# E+y%w. n]1eb.3m*KݛYRKRoY/Y6bTFvwRKҞb7R#a ]WfDsVKWS~#"--}+w'6K]B.<҅&D/MSz#yiT:{)1֙m' ]PN[يrxb/S ]+TI>Ķ\ ^%̙ +^%ѭW2*+kr)⛓<-N2TZd=W)Os+OocǓ+כz"ݛ-!CiOD";t-~UŦm/&-eg a&N>KaeQaBrDv~9Qos,+Qɱ$c&\ffğnF7'SKNrJ ڢj9Vh#a o״VsCUy}Gtزa)9om<+Ir_f7a^!&v8iC]}ǽZMݹiP]}sVdڋ2]Cv"r"iNv{ Qkld<)#+IهӴ]Dze1+"]飹׌ 2cX&&z{–1?vOhfN.g{f'i|9u|^ɮXL3KZu]f~K r^ssOɮi{~Ќڧ%{SubR2"_*2Y\Wó+ҞCi4^q) +jo=d_U8Xf( \r@nMSsל7r.m':e:>YFunx?#*r*Uu 8Dzm尦J+~Yz)sXL{ݽS0[B[;d;ҸDFx+>uVΔ"!2,ޫJe{3f1C B:Rڝ}QҞCQRqX+Zώ&nFdw+ݼD"%QN5c5DG=?[ZY;)2J2m>+QkYl2df +3uG"`YYyy*XHי4,><LXvF)shZ~Jð~*V[WS|t֏zb#SRI*ꄶ2H7^z9Y7#Y\%jYdT̨c/fF?f_cT(nWtEa  0XPS:w[ᔜ= yjT_B=X*&9k'oFWbeEg>s܇Yt= +[s3ws.lY*co#7T7NBU3e)ZmɺyѩQ{szdN*s9bsJMg=2Hw[xw1WפKI<^sb?38-&LE RYZ\fg3/uD$k"_it*Uf={׳7cgNޗT;!u%M/+[Ek )q'|,o˪^Z.oz5J+;yj7|59_Я"{ݯݗYW=.EDr:g;c)<=ٴXg MCfꦨ %k JU%(o`XV_bTg,;$;,_HSha*_J[UD|(+;6ow P,ճVN~.W_5owjҭ7ϫ|vWVü4o^|yв|eBtdKwn>{htϾBh4ǻ,m15Ge4$]Jl5fi]Q媤ҜeSx$$&fLY?4dT2NK'JBɛX*1r af~j +7xHŅT-پ4R"`a+f0znX\V|W9:45].b}ʑ"Ԝd^D2a2J$ixʙA{5BZn,;CfӮi\=q!kv3,DUԺu$H缗x(Ƀ)IvDb,}r-9j"ii%[[ˉXsT6{B X ™_Y=oXL:I%zkk572]5& 7,uuIHxػ񮾫j̺ÿת.1]ZY՜f^g}Ufe֙Dh2_yz΍%03%۞A_eXDSv7EXJ,#ezzF'N3"Y}|HI,R"YspUIe6,ZEzU4g3גklHTC(T?[Stc-K%NEed7dNVgrZWEdUO鼵Өhr!f9̱L+b{*תuC C٤:\zTm3C23cOexeVW{T*k?W.i]e}NYY|4-bxg={yTfN!w|،ur|{f>{UKSW"͑z\J2ujeՕ] +_YL?rKE(tBdPy:}9.OO_э]c/\Ϩ=PV1ڄ6ǪUdyN9ædۜ^WhX B ̀AhoXV,W1۱iVVfwef-ˡgN[ZKmEO>mL+!Z ~&эd6tȪ̃gGv\ β mh4huhb딣]iS;M#6f3{TgYYof7fE.6#e<;;{Ztӌ>3zUbe2bfvˮ}ete{^jvsKRo=kdʋF&Lh+4K+66.6jMtrh҇'IBcy%ֹ7kZk=1nnqM1rdX/Cevޝ]gyV3;ohL3KgC.FfnjZ%eDv}mfs+TT5Vp}y7faR2_*xOsse"_fQ1wfD%:˅:<˹3tѱoY4pl22r]VZsb돊j߻͂Ğn+*]EiY]M^JLrƌ~;=-:x=\zZNI~*D??8lSGKD'1$'4:/w&tdFt˻QNQdS >iѝ%ѭuO˴U%ki,)S7ջ_7}D~c}N]:{ykb_)ʾX,Ie,{gJY*զTq^g +Y=1?xe=ӗJ]YfMEfqꅬҦ]kBX壣-WOK,nafRSF->YO-M+OT/PVdw4SjU-rUBT}ɖ:SJkt+r:euxWVV9u*e4NEh2ߓϑ>IUo=WtZ:X8"Du"Q dF`dfx}[M}9Tf KYo `zBXe|7JF~ w)A(m6ҙ"[&d_lq2^It*B*` <3l .fEsXlo,[<̛! A\'gx% ?=Ycۡj (1sRV:otC.'"xw`ZR_M!9A:K d\* `Kwo&@c\xrǥtՔ7:\k`V,6\ _ ~tl}}IUQ+˿@캁IUȉ q1mbzeBwLbirI.JcEk|'!XU ԤlaG?dY"`|B 2c $ +@_ am*/jJ0 KJ'd@CJ&(iXX/OL6K ++'S/*F|[X# +Ix$2ൌ3`KY;W A'{5"fK,Bvj+t>gƆRG]f Lq}.%jr>$PǗqEn\:_7Y (%Xl۬St6ەAƶh5Bn^XeQawc(ɊoUť밃%J* yy[\.n Dw-y*hq-H4u۷%ߦE4kkQ5:זpx8kF21FuO ӽ_F \–S3bM][V y>' mg~TZM7to:9PYMx+q4\L'=rwňw|UkP/A\TgV4~Kˮ["& ] u =H +A 'i5c:}FP ,dͯ*s4ݲ!vAfEx ^WH+._[gv:vԃ%v\A[)H$KC79 v˭^A\(g%Lkg'e@㨃,![m@&?W0V(5W)~(_mc2a8"UE*άP%!+LQ*{8Ud'mVt1eZȬ)-w?;>[,3f9-Tz/# .SK׮ãT F^θomf ()]hdVd\>䡫8 ȎbA(Ӫ%@.U|3* ' +O~ Gs:E9ypٴ<@&ׂ;Lfy$h "on ؙLB%0Lk2,a&Tr(e %74b VѬȋ}<NYݤqM}|8lf =lSkwnF/['Zur^6x TJǭN=Qv 0c+ݞ'6޼'x?Wɫb.lRO7-\>tS' DO'+''x>qix.u1 RiOߏ9ڟfu6P yH@q9  +މn@ѹ-]Ҁ@A]{Z&PhBc@. `k*P,3Rf>ъq'ʗncHDybMCHay.ÚG3U^iS'g qsS.0ti[J xx E,αd{80#cgVccA'8g(v=&f[nzmOi/TG121~  TJD%h"9o+ n A&[1`&M`;$`i4CSD|+ESbޢ+&c,\;ը7\F 3CSӮ9Hª y  )N [3h'sWЈ@*=NkXRRm sl`;v8OXL$Ҹ]IeO`Eh2S-\6ǯJ ^&bXؒk2z)`JwzYeUsyňufM ;xr +>*(rϗ\b3)J \*;ȍG:%%)7(Q0?0o`ܵhK>BbX"$; +S\ 2nF6;ַty X?X+ + %$B1KhXImu^R*D3C:ɭGMԾ,M)ATl䳿N АCC0ՀZM42,;HPQ}XB2)>$\r1hQ231D(P*z НWSPhx2zU(mDU<+*8 ?YT$t>_m/EUI+t̳O^GxV1RyC};Pw>,!s@e0,B# +1EdBn&p=,;j.+׎0 +A[:/\@be9k˻#_<!?j), Z(8;wcW/%zm\]auLҚ&u]oEtVH))mz#BIK3O*Y X0\qc}#7O&=Pp?_ +$o +8vIOyMd2bzXT7V +fG731ͱXkF!Ĝ3 .QIW,p=1,ţ̈a/[Պ{S=3FU=_1A,3$[*"{-4ho-/}4#wޖ(\DVzR0w\ZeءDNG[E,7_TDuǐ6$=\CsD]ݱIZ `C2-{V"V_2C'(D\iTTD!A7&]5Ğ^{j5."fFS[O"u!"TJ;1.v/zkqH㚌d0sqE\ß4sk%Z)[mRV6IUݳ9%dP& +'~ikŏtf0G+E4H"./r- n.KȈV&5aKWT"),Lh$<MWX7BnpO_hO(,X.61(!W;M,2 I? eSւp1Z.]\!r {>+OX["IQ|%6dv,6}ܠoVDbX7.%g^! ^#81j.%d&*Ep\$ZqMX8i Q!Zo^R;L=s#sq!-Jy W9'%Xބ𵻒(k@12<!SM0ÃQnS}au}^'Ą$OX&_4 #rB^߸xNN2^jQf=Seg:yi@4"S)Hf]2ώDhoz&HgB#V_krQD" +23ba hC`N V(c&WLp˱UF`ݟ*xC0DHmS:nClT){;)۴N '!^J8~V&ib0 :Oo [IÞ!6mAKKBlq /M7A_ԈYhu4V8y2/|}B:*t#)TSgU 0Elq(̻Nȁ +݄k%:338B,*0)a&iyj卐(fܗ!: }E$9#@*\Lx?zsuT I2Dp,0A4bq߀ške΀8j!w8 2耒bT$SNR'n97NAʇ7T'hB妌Qb<jPI-_TEJdm5=ց +'X`" +U&&8I.T>$5_l2( +&x>ŋĉ\35] +J5(.,)r(\X̫AZ+2>ƾ2G=~{}٥QIqQs)h# W-'FVSnGqJo[nFfwGK|z}!W`?c>a1u򽢣:đObS}|b&V㋼X|Xo4k0CsPc0GR>JC@L(_ Ys ; {tvXv qac +e PƸ6  &@ƞzvc;Q`;q("Lb1( ӗ$`^sǘw" +]|\)M]:.A$+QCGa4br0YlP@B46l/x9OlFy0v 8 PjP Sنj[CM!qjj:gʫ:Zei*]1*> ծ:C6z-[BmanN+)nq2nV*JLq.m +xV)$_1J*b!C@ǺI\~Şdc)0y[%p 0&zVRQ:78-}-V`sm>ǡ6Iݓ zrtz 'YM]gOW-tNUy.'ͭ)U?}k4p,{O` KGnQhzs;بmuH~9墭uc,JeGXnUGӀYN`S\1KZ@4n4?\Ɲ|ՅeL\T uo +y8X.,|f0E +嶊k5*SQnD6y^Xau?a8hTwT + 'c)}%Uz^s +"CI4h^Odùy:dAkg6P=}4#[%B/*ofR׸I2 *}|RNpBAUrV!0m+#vxH:&ኋ)(tHVf8Q+#\*=@"Wp.b((KH/[&Q] f b<[|I^kp Uz5r՛Vyr2LT#WHeoפ%nrLF$6x<ʼ=`|Ҿ֊uN!@# B9*e$X.; 4+CDx^-+$k>p M)K؊Nn6]{CLj~teq`F܏NE +'69u:)LǫZֺjگv_u|OP"C%!7 ,JszqV9z3uh/XJM"C{ ry:Ne8/6L"0XB8Eb9ArR R,  'xE8},u]ǐqJ,}1 L꽊ф䛰8 >]8Dۀk 0X[PBl +ES' :/e¨+'sɅq܂g]FX3yת@=\k7Akغ`gw9>&`V^GР"uGʌDHUlה)0\j&bO:IVRPIHByDd"u)] +4RG>ⲖkWC=c;YS>B8+ٌQ7k5f sU+ATnd-זοj:!^Yg/55#o/%DBziZT}/ +de#"՞bs-Ys4WeK%nӧ'3>'@ϓ g:D n0z(a/3Ч +K;%P +ZL?5B8\ tCh ftIǐ?VM~"<;(9B`:2)λ|}_Qyz3BJџ1\`}.dV-XeF)H`OXd印G>M[-n9~5~X]Pn+Ei)~jBzwv{OhX,_:LOka$3@2`aQO0K%-긁ںA|VO.n?oVձG;境S)HD~  b^ +inz'$>({l^ +;EaWGT`l]\aBgc.$X2n>Jl$x5@–E%" vo@7lrGn 88-^io&o Zo gs >l=2?y~RO2h ^:Q+!Tð nI&k(ɡO8icyO-.tгIе.\=mUy4_e"Ԫ<0?_Yp`y7T!:>( +'eoB'2}鋈~^F%gR& +ƟhrHbiH2{_ ]s ulpЛWW*KT" +&_E#ƨbPjz۳G3RaÏcc)KA|!p(FgbCJ;,Φ3R_2j}G7jϲlD;YʘmBµܳ_U{%֨,0HZ.ŭ%&ik(*-N5E]%-W=o--#-VcbECX: ]; %l1΋LPSyht#.fcŊHD9̃ܦ qJQ;%_Ĉ~$+B=D/LuDk6]&2|)ÈܤDO2?JԕyJIDS$LQJ4X(ѾBLK XѮ+&Q &Vu{'ьn$oD-*$.KM"MJ#Ef +dI(-KˉTl?-h#2"5Vop>%U'F ֮yϡ"nwH-"\G\b'?NbA? qWsS|m1Ry5|+Oa-<8[\8N"Eo:Cqq ^|gHw;.[@©d"/EC0Kc&r%riC>{Y뜈c"wF0~"wMGYz'rF,9,!7`;9ԪI ϟ; ʺ@D #le]1(gI746A+buo{G'ˍCģYFyŜl/&Ī E~H؟tl $ '.3 +kMh lKH0Q$撱U 9z ڙ9.tW EY qQ)I[ɾhFz52? p TePBj]g4jY?p2jrY= =lW"J+yNAD x*a KJb2=tD-›;g=:>!J2iFXuM)c1p 7pJ]ٸxޱv4:Ҕ|}"TeJ,] +/VXgiAtz6hriܝ"'rt^e ~ure× K8ƲUQze%j a M7Ps /F4̑3YU>U#]}7՘"J*_Js`>(ޢ.kP L_wf*Ti7@%tpv. 3}:wUfјrIc$ nP} +*,} 9ٔ?D{,a>lZUc\%~;4XKEl* {bٝ轢R +0j-#LϗM6}x9y4kb&:Q1PS!7X5nVF+*pfCXJ0?}7b*թ_5%fxvԸ`Y/ +ӃHQqɡfov?jRxLV?,N)3Ic_Ghu±D˻9djuu߸b[=4 q^iDS VBkV:{&IstmԽYYS[*Hh>YNN]<{?=!uP,4C.Ch0 Pp +x6K݀D,2͐XZ= +P(l(% |ۙƘ\dUʱ)P +t?Z-_lePjbkWH( p~yfUQD2yht!eeD6*D/x#@xx=T+%[:I?6l*GVW#85v}S0.MQvTЬ(2:n-CP>oA!9RvXڧlˇԊPSp9 ! 1uZޥ8O7ᄵN(e?C 2h erw(~"o) LUOԠV_odj$LN#{VXBmn>SI0yӒ]"Ks;*1r.~qXubR7E*kz#mLЗ6dr[15VEKxy`-:%beD xg8_{]m p'w>loh׽GKVu;Os*qֱ;r8Sf;ZZm NGt~sܙZݗzJmm''|Mtբ?hTRG0QPSygڠcIxH$9l"܅UXA5u,ʰ b}DȰx3'4Lr>; cc#= ? {phM.e*D~ɔ%$nLqJ03u|;sVJQmE 3md#0`-AR h&pB(qw3SY%Av@R-Vt@@' \pr^@WJ7M;uZ/h`HSڤ1ٵIj;O7YA#1( +E…FiDZg/壙uջ +Mg-xQF0}}r MC_mDw ud97 +UO.H 3B^92"˨8**|DʃA#:V^\l)!g1 +2O) DMy*,?ָjf0[ 2H*fq}^VxQ-OUx8)<>]>"6}p⎰<]hh#ޜt 9nNț1zŐ!C ̆~u(YBɍ:`~8@yw™ +N +BQE.+]9ZÀ[+ޞX5ߛ2вWҩ~]oGaWŪQ@fE% 7B[(è, *VurV;ɠ{{>w9ˑ1NϒˮAlw2`S ܙp=!__GUs@'xi gqz3#f$uLxBV7 s,*֡b.ѤK/׃0H2 EO%& t)Mx5iinyŎIi^+51n_k\h<`*m=Q:E-&B6iHDgvD%DpX5 k*#VFp荩}WwW+9;f&\$γGfճ~O.(L[UNn[|+-&QatKVv8o;jʆ8.(Ɲ{BkPLAƌrFTpHͭp*d`daC!c넅zGG*xxkxrfFqNodXo0ϰc}U&97+E.0dؒНH  +\P%ҕPLdbHXIRkOҎ +pq +u#ٹZ~G-R{ jcW/#yĶB%V@Ohe^$/5sT.5SI,m:% +S r::aIA8Lïw 18ID#E1t$a粷 q`o﯊FIUѺu]إ; :L #5ʹЩW@T6XlRN_ }]̎ӛsI^3R*\5}/>=Y2ۇkTD^?KS bVCf7U{zy 4WhprB,d-^ WBв?sb;@9G)}6O-jĪ~Hn=ch}3?譯Aa8seWP|#l + I<($D*gYlm{Dt狠 E5-ic&ƒ=L{/ }T,)7n?ї9 8tŻsW Yi8LQLT삆ќ $e~E+FP'cfOr z!yۈZcR;MmNV7'Nm-QF'FZakG Er3<aӅ(ui aYTfPeaS Vq米j > +gEIJR|SMD +D3pvdETo҂_+;w}Zia?ldE%)zF<ԝ3r 켳ɝ}Ůi/;E@זA]TЃ8}?2UgxEBEwi@΁ngp>Fe~x*)O +jϓkӰzW -+9y-Ia |~ Z%Ʃ$[0țT.d`%+,N]IRe D=ɾNfE+5E&;I(/(/ +d^^$Y5*t +WzpG9x0^7K?+s=V׵Ou|"o1i%kCxG;` +Xn瘪w~{:촭 梓2}a]3VGdijw'+ʼnib[B8ɚH%KdIY뢍Җ=rkeIt "6I'hͱ:yJ%%<*Tdh~Jg3aL/kt۬&Ygu%<8`=ϢE uƤ6*0R(;SA=q튣4YLq?Ǩ FYLl"'5_'Y( /aE#<su.lsn0Qw57!R"5JF EÃ8^|9/'svaV6g9@zt_巠=`^05j'HjՍO!?_/Wm0"WPgLtkAM]>Xaj:EƗVY.=r+8-.OQ_~P}+)%87:ޕ׮XCpOv;Z`k(3g,i 2t:4XeIojz_p'Gw?+u]O6X&!)x< +yŗ&Dn$qc$rO$r)],JyԔS~8$T` +7vϒwq8$nBGܴӍ1',(֑'#CS7$dA:x#:5 T9+jN/EAoMj~K!-7n@[{>Z=-.|41x(`HRPR؊ 'G[Q݃( 7$(>@QÝC܋zP`'Lw,%If&sfBo,2=M'=(L +)~N?jQ D&$S܄4e4m+P;pM+Ji.#ES zd8-e`bU*<'TD';,!UY$& + 4Hr^ߵMנdւIrmb!~beS*Z8丐{Z~pq+ +bc O|&p&;/dӥ㜚vD$!2l$ 9 s@[Zᒬ  B;j\tP%Tة `%drOֹO*%?Y,Lhuyp|R+ǀBFD1 \;asdcRe=AmbzܕmmAD8sݰ!R-k58-hL?12,$r(qс\HW2>Ud\b/' + +D]ſjRɄ*8=oMZS_Ox1L v(zs{uR ܿg={2ET,Dl IcCeHn>}sQSN0,t9Wx@108mHo9 K*Tj*w9+쳫=!;3h˹cx9cӮf|Q_IQy);$dvzyZJ=> F@G\tJC~%R [= k/_&.l0jmV*4xa_g"u3fh3oW7e¬g,{ϸ,5H.IҚk7|Z^ԫijO.]ݡ !Z9=b/jN[f .c8 & 3]!!馻%:tCik([v?%=hSrH & o{$㦗9T:[i٦,&kk€nBt \}!?a +Da;ndހ>,`@P'7 '; :Vq)"#\!Al+O5KaQBYb~ `6u'E +Δ܁#{}3+!$ޜ %4NR} 4Ǘ׷"u갏P5˻nx+bpx/}1VţL3V̖hӝ z(5=,} R.GdӪSC,v4+ܴlw_Hv NPu"Kyr <!#>Uœ?/LX]*xG0ݤ@ބvÉ7H +e "v,~,پWZWϴ&Z}GA;Ue8Hy x׀a0|:_Y+Ыu +%,bDlVزGlď_X1AL͚[*waO#x[4[g?ZHH{abC0M.k(`]Mn?c#KB5eRލ7,kҹ,˔MN:St"C1ἵ6xE۹q~"|2f{-0ZrE >A e*`Gs:er7IY +JLŰ?j6Ȗ,O,)yp͠)xoX֚sI#+s'y@(9zױJXa<,P{.҅#טDzHO` @,0YIOY ' b̳cTZwbSO "LeBdq4AJqRb"ZNa"xz< +A5 cة",Nʼn#B7Ux6Q{FߢN[?M䅆3Ԡ(zYrI(r( jR4$OD?>4pƚzPܕT=r0Ei@4u!)4<€/iZu q[wEς](dd۾Z4`$ WTυ uMlfBuEٮS@deN8n@dū^C­`M è#ǔAWSrìV,KsgwJdKM&^.+ "R^uJhsHƑK"ovrʩ8TK(*F%Rc?p\GjQ#pSK9RrE[1PX鄑(2,_9֥wedkp({Sl2UʰhK͞^EFӾצo軫wsRnz-#i-(2Co5˪ALLL2#Ȓ⌔- q*/*I#ȵeh 2`[k LM$Md"j0Dʳo_yyEo{˧cH^YH%8uŽWMKP#9F/KTEnOX8Zwbf IXNQ2. +cYdQrP mʐԩ kbOa9/.Dy* *+5Rܯ糶9[) ѣ(w?GIۤlY1q{Kh^{n1uM94QuejLc\뤔#ywa kDs"}Է)$D")ڑCxpҝ=ѓQf3+]bϣZƎqӲY(7D{V;r.l"$UmXSe\9Q)ŸfK;Z" Ut="*_$M+Yi0IMYx#BD:vᮦyB +%0ݴ:h:KMHgTxj mAiPLr+D$:eGKNk>%ˣAJA=( )5L %56y9hh)>QV=F 3V$ #CT0JFE.ۥLCICc + X,ŝP˔2ٰˌ_RU +*dV8sa=bWb (oAm+.&"8>$f'Ê堸h%+0`) 7 +V彵4Co~tvܕ~J$1y%T$`eTbI&&6Zif|J4FvLG rk0t={[s qMGS%9>VH2BV*ԔURMj]; ml V QQ$GF _(J -e*3X}գ%?C>nު<4)M{I9 [3:q U(pZa'Y52}$-"I}DxNI!yFJ9Dԛdb[A 4g.RlDȵ/ ٛ95!=KD%"1H8Bߘ"!ɥ]Q;!G$Ji_"gM+#НP4kQg<|+AR#˃bV/DPM G㎐(LW\:;.^FJh>^G1TLr,8*AW{J["+Ї*z+$:CJf +PPkEhLM l!y[ј̘ ERWL!eHDE.E9. E,EYEE5C%.w,0E@Ω8X M!9oc9t`_4SG)_r? EUL|N298&DBSTc'3I26a \񠡈Άsͭ}^5DCu4ŚRCU[n ?$%" |O8%V!!4U!Ty^PzCD9UiCBB[xO"C(t9u +jFK$6*$QKޙ`IbhbiRg!S5B-y4ӖoXz,} aSiI=3 {%T2:bIGiLiOش.!Y&jhT6R3!zILoST/SITbO/*RTX*䅟z.Tb+y5D "hmܘB"CK*V(u"},fT;29N}Ć94E'Re,S"w$lN9-fV}H^ԡXSp69m4nJt־-%q‘GxSRjuDpa>XDk{ψ8̨0G:0K&߃ѼSѐRu=C%(%<"li0 P)A⑩29KKw\ADM! * mUME$e $gz@1E#GP= Zz@hĎdN(ATHA !!o PԑGդ,lWXC.BuedjAUҠ04Tՙ${ áȕx7RvOUC\9AffA S*m,b6LBYQ\XJeh$;DFlBy&tKXHL&NsP)RU%%2ԅ!IO;=aзK^Y5LL3NEw),ZS^P -zI9 n EcB\(*Z!G|΃{2BMXrCo:U$$Qtl,)ZA$4PIQc jU-w0Rh6cp@4 U }Kd&]K{bۀؚY. NKZSF!of:Z=%.[3C?> IMU4*8?:YD꼴*0vDʖK7f;HGT  g%5 rkFjyB'XhǃbmMR GUYP3}׍t,H2"% yQC/y 2N{"BY5!aE 2|fRASN63ҸhqD"n5 +m(X#4ݓ(x͠)%wʝaNzĈV y'Tk ⠯"aDd4Ba*&eO G5oXAjSE\?/(BOո'F!䈪v1 8Yimb0 ՚PˆP%*ز;%$ԤpOׅG 􃓩u uhOBbr ( +.@H``8@P#' 8@H@H@`0@@ ` ',н$kp0\2pl <0( up# +@\@0$'@ƈP8' @@ Dp ` (00 [MeI+v^UpMN5IN\܋UDWS_SwsPӯOʸBkzESȈ33=NDbeܞD,>â$MH)/'HN5)5[F{ &,dkK˻j#)# QIPy>-ňt9dr* Ɛx'>T +ȿuj>9FMT]MӬ:g$VV*1Q&^8'#[\zilr1/J%^wBi"1biϢyX&^Q}"yH2BCfS>D]dGK?B%Ƒ§ZU*Hbd=ORA#}+U CUjKuw(Eɦ )3.!dB!pfsј$i4CfJ4t3xdsWsT(#kQfػX_"& _8c.g 1TAi 혦9Z94DRM983Qfm3̘ Üjg[] 0 Zq~ckQmr#Z_HP4ZJ>hc}<0),Cqa8>'xY1TjrU`@èI (yfXr<3քwqM`^IjRSq8TE ԡŨi>VuÆ =UAh^3Q㊉]TIC$Baff Y U'Z"՚!I }%+ EJȩ'(0 Ccׂ+ǰfGU RhD!,A0;؜ArGcP\gVU˭Vwzp2r9xkB逜 +]1y#OGZό9`EѩKNST;mʈy:Cҩt +_Cf]Vaܑ8V8 PhLxq,X>F6M٤<ӡb"Ɵ(͘/G~C'34N˒ț0U 5U׋hN3D6gL&XuШY)|dH!Ps95!mC~TEhsB^#4PMF313~h "s\Gdz^VQjK&bJFk`E" +HʬqGRJpӡV.B}U<H剑I(2U\P ULU(n(%B :m}ڟҋh6ұ;NK`UT1J#Fb(,\D1BRhuK4.^QF*.VY7#DYAcSL [D' Elx|@RU1ThffIx|+' nryPU$܃!~U=Y8I~FC{0TUjx`JP:G=.z /q1>r5QKXu? cEfӃ͉P1.:U+}ևN$䡛ؚ*B~@̽!|dNezP:rNSR_gΨH: V(k8c> tM2UQhTց%x+J1'dƒ;.զ'$ϐ(Kv9 +B=f4-I#j.E]1i|Vau|Q3D$'..R 6C ˏdh[fl"i\l7N ^+쩿BYk IMXK5y$8MNr1sL6D6,p/]3ErsPEWAT +\ibTAIu6ʅ:<8E D3ҡT eD(;e0nzN͢V/obu‰w(vapvf^1KpШc{j>x؞6ccs=)Zz Y1VC/O,Ky s?8; sʹR.qnF4(("*G] #BAVf,Fx Ը!2f-H07;;(Y*BL +$)VbdKNF 9!6!'RR&#W)qkƪ ifB>! +ʍӽh3w <}(mh^< 7D?yMZ]xOIM.6Ov> OwH1멿Xha)մhᆉM &٥;ˣ +!!6vJ+M*!i?c+=VCƛCZ14Fx2{<+KE՘"bi#tUZS7jB֯Ei̠U'jM~O^!Q~?K.6~3}rB>J/TpBMN3h'yH@ a2iG5LFȨřSUώ4+/]Qɓi?Vs-c*ɐsɍ#ZѥGG ʼn(Q\"9rq20.&M.X(%q'QqJf97̉Oq5뉷%5j񚾘N\Rr)4|JϓO)(c)R]Ihq5r%q E}UkƋ+γ|qV)&h6=z@.'ߣߨ *gJFZȆ%z7w̌͟,H㣩# +5UjQN{'hGEMi>U㉰(^c m,jS \&_}3%B1, ף]Qգ~u ӛy:'*j5~p~~Ո2޴zp#/4KI/~Sw֙GĤK->(BJ$z.iv)7y&R"+E~ j?E/h|Mcm06Z5羠g(V|AY#M(eaDMMcᔗY}TX4.B\TDIDQTX8 KoQ%g"g(M"!Al"%CNEc'$GKV~:Ε"\ʋN.Nf1ci(a F̼xbL:O?WEl)Ҟ0'SDrNC=bAAN6_PcVNmfR鄠]uMqcs6zvWyJ*5FU+y8y_E]dQw-I~\pҏdA;z2fk4OStoNAdƑ$ɠ W:A$&K%w/q.-HI8$%Dw&J&ɜ#ߐqW絼1MY%?\IO%щd.AFd*YXː{lIQBF͈HW$px`TjMHQ.SL%Sm`46VEhokT١vZ [9KZȞL`b]2K%·jNW OhvæьPX +DApPֈ,00eAD`=Vu]S\eu0%_кn"7@!B2ꐜFN0֕U*^c5* /[aώʹJ1,:~ +ݒWR1z0xXwXc"cxO+[ZΪJ1_t57?Sc,&|vI]5Ȣ`G[T tXmڄm4.FnX*#9(T4c!NER UQr뎃{KxkB|~`,4bi˿j]M^RS 낱.)=ccKP`Dy;D!a,FjeZScmYOb +c3xY+HA)BI[釱pDUe cuƂp@1XLJ2^scJҦ +7a(ž^.a,%ގ6$ R9cx>/m8[7_읰nX7o!s4nXnwfp\0ֱ4yXg lՋX6rzt$Ţџ9 -R8]Tu*|P +.q8?Фc7"I__șM w|K1Jbẫr_ȈXƐMkыK;kI=:‹/V;tM +E +xBp?!S}Ԁ(yJ⾅2d ~8S?/4ыe +|˒/g %[XņTX;ظXȱP1"NX׿1!jO0cx[I,SX \yc=H/XA͏#9F0J[Dvl1- I-v voy?Ƃ su8CkC;r=XAU~]lX#qBҽ3NY.RX_ Zy%7TW@=Na +Y6`,Vl +`"BX~bL|+ +Հ{8ӥti i0]kc]z'?K +.sq10^V5cat0fA>g7 ؤSlC9N:^d"c%PTVXTvUc Gdj,OrkMBM5Ka㾱0q[%/o@k,gM}iTfJuF?$ Q THu W6V;=%PnftX%zjE߅8pP{b) +^KB2?[~mX\Bu^xXgRh.\n aPxۏ/Sn k5CA 7*6*%m~FRdrFA~z,k,e_ td.iφĭ%2aM([+FAQI}B+TX4acujlz :7fc%ڧ5=6P=(!Bbƪ.WG0Lh]nXn,RrAp?Syэupvݲf)9T |5T@w\Qfq." V.88$6 n2oްOh*7fKtGg{Ƿ.n {yOj@ݚnxQscݘKrc]-;M!Բuc)&1dZÍa1Ǎ,an$ײ4 &5{ $QiA7[fAntnSK>wdoN @Kɒ;~~*#!#O1n,XrվzƂ/`d7CBGj<nrcjqcAÓnU8bƚ,;uc v_wZDH\ 9Qo^$5U(ߜgE0AjC?耓S | 0}DxKp )7͓qiD ,o&5<Ǟ , +ILҰtod2")73PFXk˲kn+KI/ڣQƊ꣼Z i3Ң՘&R9jDE oԮaK6m9LccqKrG%<4͵6i@Qޡg!Jɵ6#Oq,B?_smbv7VהlD(4y5n[)|E MX +\t(A8FpQ$_cXSEt{чp[7\惐qctQ7}JeL];TLzvk0MN N6VTI6Vu + geXcm/z,>u!d<''ےmަTjSdҊ%:_7(t62tK8ַ.CCentƺ7F5ڜD7V;Oc@ӳ7VfMݍp:-m,iV#}РtuNv̵SUK+P6 +&U`v \^6UYG +hl,v"PF; o?jjx}^P9^Ђ^X-m,@=T7l*"n "D̀={k7LQBWUn,3&6E J!7MYlNv,ȍ5=+TŰDG$WXӠ`ڍ5 ")~ m,Qrkmڻ%BCt+K/OzV/8C=NH=};)< +u'N<O"?8 65k0bc% +gߞj#vKI냦 奠0}Cs9ȲoXYfƿq,p1Wjc48V;mq,o NXh_X/A$c4ux&rF29CDZD7>3ct)8V1MM/VDFb%ex#kKM\$y(a$!Xxjjyp$}+8V,4JpҰz9e)fŗ׀y^Y $3E<)`g0ś +b<" [賯GW ^hߵOp(]XmMx=G%:O*z1<5i*H>K>"AFl|*je=qAh+[KTl<׊†ƃm,1/IDğu?5p5T\n#aZ_FS*N[E/B|~!37duO֥ԆF3+cq.C^DA&ڐ֭/Q-UW7ɾowկs j`4c+G:ށ2lsHtK mZRR/ S]W}Q(܉0,-ʩXkDO=u ,U+&E.X,n^WgcQFԲD9ޢDsRuQ'+4o0}++ +[gs?x~C jnФ[ 6s Ma&O٫+K_y/._ڤкG.]uaa-+[`0 `a RHd6&DUBiv\sqp Mq!9%l)tNCg7\C$F A0f^Ej 2ߒ# ‰Ր'ha=( h*kᑘȔ(T݀1Ɓ\Y^,""lBtPDE0% +sdFRlld'LmW-,[m`PVa M,;m;7R>RW˃PA,H4nM͏'V3 z=<Ǝ}.dXN`<YnQGf-K>P2q2N@k 5XpV/a0ƕh [hMwƬXn} +Ś3Km QÌoXYpE<]1":[Ef5zӸ6D +M + 'NŬ; {B)̀?W&l6>m8q-N"į^ܓex&ԓ ]ؚqp DݯB&-alwY~B@ȶ +F /Rǥ~A&?5;.L׺[ | +.\.",sBMDnG4ir)%+`0[Dd*hs[D [i2D}mW$ ZF-5GWdeSlɭ_-ȼSERBPguF̛/. [H΂c2p`a]!XxYZa#?o Dv*ͰC`S>#e/.w:wm@ +v61ЃWO76VgUI5 6p!uɥ^nTOͷЙ&"fyT $]Dy{:߫pvB=v 6p3IZaצN`i7:̀{#Au3 !Cu0J0l`Yh[n +E , iy'}rUYx$+ +eέiA{m(ɟh{C |~mmfb9)]cP哶k,=MjId^ܛ\ #TGzDK+O* /,̕MFG^|yp*="UIl^öqB9ʸHtb_lȓAif*tq[1 8NM:l?|0jej֛{uH,wclYu#b:RKC`?{'=DՌStz89Lķщq| #KnG0ʋR6DoY3G͆G ]Hь5Q|/\R?b\e+մA5Q{'2tpO+1Z']y[, J2''7C -Ø4",kØz 1ׅ$ 3J0u--rN}v'w".]GI1ȳ귩^MA*Z @2:Q~dsdDNW&ϻPW:W@MT|wHf7Lkl^&sү]` g)uzJ9UHۏ>Sd`İQBGP4JɗT+ T>/qa[_`&ޱKgQɂ@hض EyYx``Op/%OZ)WKe?SЈ.=;ٙV􄘳":^)R>"\>,T4CͲkkHJCk(/3w޶K|ҡ=Z.$543iV5I$d$;(6NٹK<ʷR^SqyT!bN\5=J c=pE{p'=LDd;z㟔)JZHŸt(1&#GQ>xBH’{)ȵ§i s gɇڧrLÕɺVPl sRΕ^}{MlF5yhaRsH{j(j7lF.ĕOmpV;y 8Sȁd="p wbw1ruY˫i~g +MOPz-2PXK][ h4g0q:Rc|U ξ0_O b*ղ}uZ[Nq(ζ)FhA*wmrlL&&P/뱰gͧݠ(7 \a/@];aPqNPՑVWg%:ωkB/b0E^hD؛=GbS +I \}Xϭ o(0+r4;ՊC!GN,BIeXз+eRjqrN/x A6E;Qs%t >r磁| /Awa-لb*9MYcXR3c/ӲR#[HJ*6O \ڌr_-F12Ϝ{]|K#ЙsȆKh~%Dϻ,B >,>eưG$p sMlvg1Saxj)4n%gi)3DpGD)pFttݙcҢtFDe}W!*Ҩo"x@!9GA-v.#7;IX G +\+|; l_9=B2O,* Wf'Hk,~2XD~f혔EHƣ T껟SM*ZLV: PgPdKh}e\ #L{LZ4}LT4#VBC(jm@m>6;R!Rob1? ™#Vȣ?ZmZR(nt@r⒰APv$OY*JpPRz +V%ʾ[x^} z) +!Y2iuS+. Ŏ +T'q]L=xZI/૙_L0 %{:P0h[Ÿ@\c(=3,ՕP]q`Ycn)^-!EҝgJ, `Jr5/!]Ч7PȚq{a9@:'U40ef |\缐crthb6*1O*ݭz]>x+؆^?oŢeV9FNyn1*EYi"5|9ӶT\^ͤpsM}n))<,aZpdP2GavTTNM+J?_BC-znt&0\B}1B:M9B(؅Z)y *hg)̀`E(#u6'Zt,5!&oQyI‚X +x+wH`(vN,w#p{w$Dώ!`}"E7ʺ_T<&j+,my2(9dt#_.MrӔ218ل }8`}N#WN)*~qBN<uj¹l-E6.s `rɽCoz"5zxF 'A +W+kCڇ'O"1 )ľF\p9E'+lZ#yp BUlљ2h1GC+l↰K`eܞm2Va״@yoٯU1ܫ~SaK;DPC'zح ɃxežfM8@ [.w(VȺZ~ȵ5n}3u-ҊRI^5 n^'39͈)dWAh =&I*Oc- 1_6e 8|lB@T\?}`7%E +Epϝh#~L3\l}D/MUqo;ZQ|ɫ!ҙI/u9~t_fxo!F dḚ=Y _]ݭ ̱d6LL,EcaqY8PdHg +-YN{w"H)Wp>㹋)o͆låeXo*(?؆c+<: $3˹kkU5grI0- +-Oǃq DN2bñl+)ӂ?jX2h z6"'G" 4mpE`Z&SWncOqx^҆(">"Fc MDÿRdn`p+ݰBsvB81t)|G_9"zg +\]:v>@0*JGL](1HؒqcXLC,@w"BuS,s!amW@4^:$LX@KX7 n0sM5pY Ρ0NS1&THD[N^/^ZTEV ֪_.!O[1 +j' +Tki+Z8XݝD?-!ROZln]AԀfZ#ޟ cOhNK,SL@lKgԆ^[Ȫ-ٷ"#5Qx_%=$ߑD"A>9R',9%T:By~(9q/X P +*uɡ0Hl/Ӟ,:A3^~EIj47%ԅTv%^n1ݿ asDZ޸]⪫u&A w-f,e[g8]bIXإ$䊎 ׇ$ߊJ B&L=TyYŜ7و O5!D2ji19"j]H3W'( +*F4CQa&]6.V0Zq>ete'g}Q]zeL!s ݳb@eN [:.S> %  E[12*6aFFU{;F0A{rR dMR([;~5h9abal_mkw֞?Vv~7©+oAUoyfU +?yK@Jvd)Мap:Mݳ +zqB/B$ .tNN9K"v"Fgţe(ԉ4| oǣɹlkIsQmS}4T*P˃䉗M)T𲧎fC A$ݻu7D@Be[zr/&e8a@iqA9\ѝCibIOjONw*e'G%A!lz k< oe5đJ\;06 +SfwgO,8YFvS59 vQvZ|%L $ŕ?BKvHzV2?:RrZg W!ZVN1}yR'N*o+$%p&>o~w +r)QNRFurƥeڤ馞!-k案bCJxhKu0K\h.ۑqWqf%M +yoQ~8psZi-aen|| +!c/Qn"2W 3sMH<6;E0QJK ֦ uvRr9(H25rrn}rWpuE>1AL-Ama 0YD^A$^/OC`Fdh`E`$\"O_;AO!)cF_"Kš$z}!YXY1LZDw*O!Uaȗ-ux/d)P/1))d +٫F|KklfzGO-Y؎ȉ,I[g/A +(C S8vjL*2¥!)qJfi +}HFҌd <`3%?;{gCְEr\d|^:O8I:B XMw5 zx}'/d\Շ,/ N @r|3\{/b`㜗_l;E%I=*180f̾6 + _|d0yfЖyT )]BY.wA4++>ֳW%_O'§ {iuH b5 +(\6)8y߂q"`i3E޻"A@ʃa +L;xzLe)_"HSSꧭ@~t0"CE =:g)Hf!:%!mXM@%l|P]44ÃP!E$$:LEd$TpK\8s8,PཱྀjG +po/7jzVjG/nYG;8i`٩˹VjnC{݀TvFYz0ktKY:p@XJGb,H$.عy}) +XQ' 9!5삏m~+zub4nyqƞY]E o)Ic9|X'n4U=V4;" p@>ZR}uҠb昙[9L!hyq:m޵]@4=COrTL[ҽ+\vyL+>\~|^UfBzLjf?̝x%@taMoRY+, xn1R}Z1=fE0ܶ%fydh<4ZGa%$Vy_"/i eNm5%0MT`?h,El$JTkCo'1b +MLU"x&=(u{?X)@6),$ge+61dϿ5h_^g<^sbʮ +t4ܸS|JԳ[) LOQp gbZ(*IX%{}w7h6:ʚ@:3s^O+Q '+LYaC^ +/aY:]KaƳX*XADzi.wo;;XJ!x }ocytקԱb%]\Ah@#8t6q#V{S{6^Jӕ1Es 5A +يOB!/{V2˳ėtmH=x0N[dD%";YW.,T=0B(PWݡ-p " ˺)0_h5b\I"*p0(qLǾdt-&Pq(@GO q ;|uwչSG/11٠VdE> ]WbLK|x"Ne$FKX.>׾7)tx[08gkZ"{Uass|O1sNL5Ӫ%_$r\63 ":T[|$Qu ̟ }vF9/FmU,38W"f\) +@xuYq:b!ʚB/yq40Pz*/w*׵Cy&;tXL_eouB7z 2eiKhp0;&{"N/tFxĵǡP?~sFsGXSQ.>2ٌ K7j4d$F|$ROlGc%`I:sƮz \{/@ <7&,P bƳG0*msqAvbzF/GLB<o 2u~W3 F)/O;GPtT3umu-t ZKa@gn6Jᦃ c[Y1qk[%cQA斵~9Ib ف2-sU}.q0Zf:Ek% R>&/lcqjaw (JY|6 w7xQ{)fOU[ߌ2{93x o.I>@ǠH('}At+23IBkIn\pʗR+4GeзDG?ch,Lg%-LiiөejAvZg%nܤeBװߦwDmRɗpYt, y6 +j;pDe\hiJ>b o+EA%=\kr.qXs()H58l<֫x:\7] +~iFz,d0M113F!`$fY|KWfX5yD$ 3 ap1-yGɊ^1z秠fb#! Q3pjXQsppқxX#.=/KP'L$.,abNAdP ?j5 !Ddz +w*&`C3:_J7'ȟPT 7&S"q{r`tp 1f޳xELF^jI}TD.3qL, @PSx-,V9q +ы_] c`eES`FO7oc;rU@*xpIW*~5C3UDrCX3?UɉQ81?&{j{;L0u,"\b}$([fАץʧU +\ VRr%&"X`ثyEm%&?Ύ }v8uOj[Ӌ5` &ѹB65$*X#$.*` !>)k:m@= (CIUKԧ?JU,shLہroY*Qw?)5믉\)$E4hBIm()8- tR]{OF`} W[mY(r)тi2L0|ł TkQIds= ! 'W\δn(p[XaE~3$[ِ+P +˾ݔ/݉|3sQqRcڼm9eE+@ * ģWA: + +.ib.`7.jԟ~,ɬ|Ҝ(3G!pݥrPjz6p}(6'E$qJ7zl$dpbb&³ZFzhH.QqSKuQe-}+cNݼfzSDi"sNG@›k yN&-~3IfAOJF\#p  FƚWekfle ?HZd]PfR-.P7RW73RH{fVm +(bc.'ܙn-NR}O-6Tm79~jA([$C(6kIX|cA4l.Rx@VB>(0nZwwME"3]Vu|v9+::.ٲ1k󰫜(\CԾ]wwq&j_2DZi[hpQb3&雭W|vy XY0[osa]d˩jLsL\0xIePр7iStn ]ӕ mq $IG3bϨf 8 Ht? q. f\XB0+vAB(/ B#?x +lj,z4(HHngJK F- Pl9@/ƬڝV9hD֒;-g ]L&ھ&$f,!xz؊gmbaȯa$c4]퀇KF)b F\TKWkm^H6: RfI-{fCx1^ZN:t`8ꂮJ3;Pӄu>RT~ɽg`g@Ρ0, ^VMV3|As$9࿐r_RJQeG_GY8ٝ}J4bUUD7tl=}^ o_\8+C3l;urW/KCI{m-@.<,y]zn5x>LOPjD=ԝL&e\WmQۘ8OFv-g|l|[ 3jk$yZFkQ5ewoF,Đu  j "[& 4i2@S"UU l1W@(Jȫ@qy*ˏJij +7[nqAEi %.T"V_eP]<]%J +D +jCa +r2@uLYS* +na\DLQYTX&=Te WP`A=T:KQz]m=-X'Kj8NeT:fD%0"A=쩬@B?F4w "[%jFFS 0YP_SP{d.5ûظP㾡+Ѕ .0fmE +Pv4DVY}G0X> +>4L + Uî8'Oe.vpwQ zXa!=GXޕby!k + DЉHIE^vbv -@]cϋ}^;1YC*4euZ$`s"6\f?1#WR6Ċ$u_,Ά^ws|؏ BZ.1A0c7c#_/WmÎvIְ~/G&%B6hn5K +NaIZ)`,Nߌg5~m6~a߹Yة/%x [ʲ[=9 ~xж.r.}ƚ/{4pgS(du۽i#iKlFU \0w5{Ϯ^bVfjg\v#(EmMIZd +"_A t1:NR S)Ȱu*a +bsb51`|lfUn(*\4MoΔf%ވښMFq?`Am H60Ӧ z8Ⱥhn'͔C#d:33e$EMlt]9aR'9-+%'(-ZŁƬ/V@=ыCjݝ,5(fOIMB̺V8@%|_ 4>Qgc|dcr::O1#7Gf^-$FGM91f]cl;ƪ?RuK/'Cʏ1;d+{_O[ۅ|S?coE( G& +ҵ?f5>+!"5sN1N(yCwA?ZNq]#=4"G=}"SF_}>k/'Ose0~n!~c*)7zu +<'4꽍Wu[f[FpvI 8^y:;8%lx~i[1HfiN>N+?ť+WFŧU\[m=bl9-үںZn+ߗ2JXpkS'$:vcgUⴞꨧdRO:O~CXthKyIo>]=5")ѽ0C 4b9",agќmFhP3*k֗e\"L2k+G{IܔAFO6ۑNóދ .pMN Ҿms +0(0_ p~,V}2e@ ×MÔ^ҧy;سcCw|q~W@E̖)> { *sQU`'\r i=*Z wdhP #`XP0LնWCjx*R2}i*c&IHp? og5rw9s3̕EgJW+0z5 )ڃXPI:X]uo {E w%KȞ\DVэE`fղE"/WZ+eeg0uv#R{DU/R~4A ]z|>Lv +R,.N +7ZPBt /3F7wbGřdKQ +e%} + 9'ٝ,PT=#89O\Wqh|C(S )%tۯNdײ@G%bA6i5Y~R:?Wh烲LǩdZє5c11J&aJ6Kϕd'5Ks^#6"ET>˾ &<1: +q`j԰?U&EeP즢Ƀl]fqcގJ.EJ!g[ȹf]/\|WIw!M]HOm-N1]V-J/}(YϿwtPjۿKLeR?S+ʯiYtG`TGzGk{R" +^gsW?//Uk_wW;gUl y&0~LU//stJY\%-RU;ز}.sbWoq^G+o.,qu:r`Vr%_na$瑦[?hy_NLTV&_i _mu/q[Ʋ V)7{fFƄ넗8 +FԀɸ`-§wcg-.{?S. Lr3ap>`.%`mq{З?!HO^,Adky .Y 1^pɢZBBYѢT+X@IY6d{ =\K >z+Le&Z?IN8b"OFUD`YX('Lw4{6L ^R5GE%A-nZ]5&j 0s“wsO5ikG0sO #O+e;'iF󟑺M)qFF GkwrhN&JaqI޽0lp4H>ńQ_r,gL;YFǏ!|%xbJͦCrEQ1ܱaW:u0l@!zoX^!qwC7fQ^ߒCp'!YKG~)>stream +L"@2eO 16å\1Z×Vx+ߴ-t? +fDƟGeY23)CY%MM5/^6|ܖ=C+ Wr?;zWfd߸wi +$S >ˣqVN~'Eef+$OT9V1tN;]ٌ㆖_⊆L4>/sk'+r2g>ij&c\s...vE"c\Iض+㒎4ǝOw]+WnqY^641sQ&·뫱hm +\GzçkS +AQ4Yk9L_(JՄ=VYfآyc)i[ 0hvMVy{=4VMLdAaq|d+L㵱t%Py#l~#3,f윉8d@]o,?> R-F9_x^AGFpaP7;n:X5 퍳̺V6K,IXN4%9  I|ux֥&-&{gt:&j*<;% +r7`K` +  )&&KP>j`t6E\8ͩ)3<';lc$r涿7Ba"wA +~7-2U 2% 3d4w~ZR=!F)?ёϢ_0Sֹ!`%)b͘]\)5H `yF:JjH,;9sUJ[|7_A@&RWE@^E)䇵!ċ8w#4h؛C/)9CPb-a~Bv60[hhpb^5{Qtnd)`WW.c}//q41Mk7Cz)Lեxg ~S*Tw ;ORW$:X⯅x6-k &J*݈m[T\Kwi63- +fWJeEz9d/wUx] c^xtM_Zy2s\X2to̴f!RXC +?fSx,kڡ?}0a]) 3^8H#&}hA%L;(l*MnKoH;s.2Pzcx24iJ8(ZmXwX(Mv$bw) 'Ø&9C!bKPH-nxVM< &}.2:G8UY{-p@zZ4z}w,b?t&VZ BMX.ф&;N7UB_'XRY@"IBriD0z\@Ӓ* JBa =RE@UmV>S "nRp"EqZ+|.gL!SN(L5mpb8S:'8 C߲U5Β}2QUڂ$C1Mf2߁쐞 hNMb9 FbDCGI -9ȉlq4{Fka)H4>UBB`Nv9L ?`!|Œ3"q咎{gLu6s}xZWBӔkdyBi5\T}/,.S5pPiy&@LIb3{/'or!L{53\]^ֳ=^YFs=r4MV@J6Ldü# 5yOXwkׄȱVb)#WhG 4(yп"ٖm&N{U,gO}i"∗ݵ4Tu8I[Pc΅j<U"dUvh.{$;?WvC}1L:Do/g~ԮZV#uk^&q7-@  W«0Ly)_RdEt6P~5Q9.q3x# TYw3ya.mk7c|BT! k).>(&eDy&AEZ?`Fi&2TpU1` +kkq/ytVRtx^*UV%$vLr6U m<$P`3VY:jޜyij*,3JZ^UE^% NF,4]";QfhWFJi$G4_NQϹy&@ ,@ eO<w NX2 J--I}NVݹێrntxbytlX#VD2IJ2J06g!)Hwůhvl !u ZI1I.#IJ匦#RR47(vW{BuDɇD_2˃l,dVAX\\_"Sm[..ud5@$Wt=̯4έ(Q ;Y8dq@T5 7#]@kC~IHpq +hbCSS+}=ӒD CX N_oirV`l`;g| :}%fu_qsp3zĮyk4 !ñ)["H 9ljMu+Ԗ磜MmA,ySըDFJ.V dCC)eC($;3ߝ8~#FL2_0PTNXx͞62PaJS'@7p"lQv"]c/3e|A*fJn}gi +J6=0lypYp2Np8OPN)dՀ*4i\}F܌vJ8HRu:85 tcL;#,r?LK0:Xemx7JPj:Q-LJGH= JjS(HO1FbWuf˧-HQg(OC3j C d@ɣl}r` IJ"gV3=$ pCQ ҁaXx-M7)/ sC$FiYfpe-?p'GjsD=b +qittus+3 ݷ<=)$f|bAB ;vv=Z ͭ^椲#iJ^tKcz{y+ٛ;21 +@uHB1r Hyq5\ҖZ v- :?R`qW=o*2ѢWs5I;fګΨCTH\/Һ6EҐwn^ /zϤHubYfF +*m˟6AP¡)b8cOlJesZv]h3S9 F660l2u[+;jӈm&'SHo~zlcB\fLy}d%䥦-,F")li^ i90:\GK׮陋TR\ C/ЌUAWK˶IH8; va L`&q[ϱ֙ZRki{(V&>|3,HڏPIQu.} OitH\:ם`DZ6*@3Ź9(nZ;}S g˜z%K^0}i\]F8~gVX+19u8e_:aǨR U݉{sWw"'ڳ񘩑Ғ8E/M:zc+jz9ݦ 0 ;=^(9d3S7xKW}(TbEӝ"FJ3 IT8@/X”\*}&?F$~(L>}Po񑹪g| pT,3 Eb򢺤hdI,E !|sWmh-k*~+Տ*T"odW';} F*cO`jbH#SǁhqC@14 +G;_GQiƷqo[S-gԸ]!^X+|3(lbW<~PC#]ǞZT]L/3쿓 =:{h?a#F:ߕT-2]w^z;]!#Ҵc>u'Cy:o\۾NY4+ n&Rw0$>IE2MJfA<x2B,LD L3{,I#"m Xxg_$TGCK +(=% 8b?S.xr0ZW=9akNȢ`W}J]0 ֫ê^,.dWzFU"Skh}RUՑ0r3 WNfGiU=,UڸzY&NϺU'ơyۘo1cW7F^ *uuސml@T ?< 7;=/2班v!.=H'/|?.rErX!i[cqeϋ׋6uƆlz Oϋs~dt~j RvR/\5Y`8 ~c +~k"PuY4n9(ͺDxra +,~_]3k]~z/ /t| gmOϓ j*C{b|kѪ#ր[HRd|?;k$-:{B&y*Y ϭD:PY[;r=ݬw+~Αe|fkSG2o=/Jcґ =R:,{wTbRU <1_aY>᳴? +H%I +KRJR(S#|T6JK(eez="t#$}37ӎnG!QN#=(V eaC?54R7I#†J$U3>dfڬ:)*r(`CfJd6C ى3˩̹>X.<4t%RnܔUF!@Ch B J :J-^_J%kfYGeeGB-!E!Si ˴(^ՊWhdUEӘiA"JHZB|zy舩nN1k*j/:o{A5TόuWV:V ֏ԥ>ܺj͐FG]!2Swff||W ~֪]tA!NjeqdzU T-={kW+>H!ݘ,Tfi)>ӗAJ.u5J꜕n,G!~=rkR9]97k +yd(rN$AVM:-$(=e(-$"cbkQÉC!M!B$v{?5i{/ Gzb!ȱ2RϒʜԗI%g(a*7S54jAtM6qDR]#ƍ onhfgT3*.r=jO<UŅ}_ 8 ?k㍈A3{5Y%qŵIb"Yr\6Y.)yأPnft#rfi!riO˱Fӟ QEhdz RC]7^ b}ps]f$E&K0ƗNR-I1e"a3QBGk#LFjIGݺq(OKZ8ϲY9.g)FD +[2)!($5\h5#9k&tLu5Y(j&4i@>D\& /:YU IµF>7w<:?;jFu*cȝ砗"FV,]CGi.TQ%H䰴)*T, X,Mb9Ɗ(5@ +0䉖K{5obidS37="N|[􈍴8aqM؜UH#AfddL`|V14ӪX147hSΑAvEuQGP(C⑘J.y'Ceͺ$bSr)$[ӋCB#{ 2$.?d+X'D441ZЈ$itˣhso9F+J8IHlل)LDj|*=0י?B"jFhU19XL bKtF"p\m՜ܽ zjD'gW?IlH(A5(KfRņ޲,GWݸ$X):u':)bKJG,T)ɣߩD9N\UΕ-us U;3ZpBsTqŗHG-%")f I֗4Lk-BjdGN#NX#y`Uȉ~e4ʯBl.\N:=]iuy^g1*Jl|dtR2Ri `L\DPͰ^zl &tSi1׳0"Y$U(PΨp('{WQZICʐ3D\4Hjθ5[o&՛"T\3[]-fL|`b.]E-SbzȨUkeER +vHXt-(-e ]d)JUE`8"2ŠlFJ i~Bg$E h7&M(a: +dYٷ8)w~D/}km#LH(CUp9u~ZI'I-MUX}3hF ʴ~g꜔!p0B{أi*^H#*5qclj c]"DOP Hc7c֠W"\ܸܸX$JL=RS5sB$a]6J+}'3;+Lg+R{I>J(qňj^DvDVy|-aϪɪR墋^ yrvXcbFj?tZ<~{LfL}16O[wDYĨ9:'Ŧ{Hi(mscMsQ%#Bbtoe[o _Q5Oy92JEE+TWљyo*ƦdCElFq3mYǜm*!Ңe*swf36U>+[k?6gSbܐ5m r4w7(n5nuyPPvBJD(%r9lԃ+Rt^"_IcX8t "r\X䲪LD杮:HG$'fz'p6!m<׺troݻ`()u ;T[̫IeD+VAu4oOhsbm:F]$1٧N}[BӠ Yc}x&  RH@0rDoڼ$4Df bz#ԈXbf#WP\Aǃ2EE)WQѱ}f'+% N^ݙ;ILI֢h&k$ŽãJ-j9 +f22ޠ4Ba.T8?H!Q 3%4'"sI dd$b[H9Fu)9" dy$dp7TYRF},Ob%qBLyhEhyuJ|]*1ɩո;S)HweƪILaS@w[W/l"je }!d"CQ.'+s9M_?dEK0#D'}}Q]#Rm_c|\1ڥ]F*)Yyqŗh2"q "p  JA$"mg [h-qg)=sdXElž4ȒV'"Ie38_' FcNV[,'U$η:hPq\tJkًQKxsԲ,88$98rZE9xc%4 +J B"!?z.s!"=D"$'gt(v[[jD"Weڍ+! %*\Rf[ [aTT3xVs܋*͇*PҗAr+(zܥHzT8LLHQfDj53oqgŎ I~diÖmغx\[ ܎pNFq;d%u`筝Mc*ƅFJ\ARN"Ԟ)F$J"kU!QyԣIU&kjdi`ڡQcb:D7zd BXf"8&Aah`p1g  H<Є g† ]&l=Lب"bbBTaB#`xb| dx \&-N_-QKA` {W `+^*L%ܡN GsJ k(aO0MΓpIxFI*)}IqU&AW/ k_h rrZt] `cKB(au*%߂IT=p {L$/ RRWcS~)1L+&; о[O:,L讍kAȷL8 $SkJ XRޅG`V,$o¬;]j N 9ّ yR$A$w'+Љ@0; +o6\=ŅGAܠ&oCpm; 2~G#"E#,p͓`F$5yf}qe^=:h C)1 ]iQć`cTFE"$c뉆 P]zWa w1BIq$cJd zTlj`n?FAWƲ@-daqبHO[AU14eCU sr{T ek ç`yMWt Ѐ!# nJPSZ}Ht-AE"΋D0Ra<`^R _.sNEP!{l> (`Z,EJV2$;DGl'`u I`cX>ZAt3"("ĐE@ [EPٖ"WY0!X<`Q3A "dzrGX1 -Ko=<~JY ĕ&o:"@E406_ "An +#6oŹ+•|*jI!5C:ǧ $jk3o9ăPkȘ3DOCy;g'WMS"BSVX(sDHjD9[: [+CqC&OtAKr4kS~)1hCH\7CHBEIrg!Lp>lCЁCG}!\S zCAvaR$'B aa" g 5Xt+*\0P  8n7l an1@H +ϪĎ@q(³ Ap2Ez]yFx'T# =089 AM|O2 +A OC<  w|mc( +k d~XbVw:Ӎ;uPh(A_$ŏT8'z|s,:p9$`-CЉpnB y0R8qPNEυp8XO=A4C!SUۺAO=wonp 6L?׀+!@P{loHl0uCpI55@r"HaZ;f90VZG/[j` <`22?hB˵hǨ4<LADOgg@5˯d2g+ird;Xeౢ J&"sSH AT̎#y="cp[ ^fJ1$[A!XA"0p`@AQ`J{+D0H_/@TA2{!S#EAEよewhe'PRZyM.-0Cs q{gZ !}@(bׯ,8,i L(x+׼WW`NCT + + Xx,SW@V=#"WFp*pDē + ;PO¿)HI)xKN%۪U +Ȥ3 s`W-ȍQ)1D&Rz+HK/Pe4ކwO> R!4hJ !mYÐ#QӑI!  +Ĉ`!~ա O)rA:#d`V1"PlQQQ`KKnQEKvuKpC>+hWGd3\ +Xԡ?YP;0m  :r|IiIDvA +ChDܡS(H9N9dEp4YCY47.B̀ +($hƱ 05=tZ"P*%M@ \tP ^r:NJH guWD)Sv6q8Pkgx EsoYl ESwjQay SCVn C # +!i (zMYeRx9HɆK]$ܮ;]6USL'&dM㷼JTqBbN VS),rE q5IA1-OQl&BpTݗ! uœbo20J\S_ʈlG;2rSOv9}#3A -&(.$b 9L"pR`ePX!+R W$#`SG?0s [{_FT|-z|>v֋1+C0 8@Ao!W*LPwӦm;F +MX}-`$ }e19 {0EJիFOPkAK5 s i-_dOiFƪ, 72hb-Ϲ7WZYV]-Yr9! @u^4T +yZ +ObOD ]L؉uGacϡ[=ՌMZ_-pN]-` ;wKu`]'%Y XN$@KaW gfKu^E9Z$kZKNo,#%# t-PFhZ&pݮ_VA*e\Bs{-P..2X$~<\ZJrT5(UW@%#Ze1>^ka."NQZK +㵀T)8LCvIy; +e,w ^`2 Ke@,Iq"pSDO7fk)Z$_>âm~=oQO`jUJi <3+`|b9@\lX@./7Q,atWis:,%0*'.W5u;g A7^=blmesS4Za׉ig )*:]M@Χ2'YH + +[}Qϼg4"Y&rMEZ9X0WRdss&4`eK~I_*K@TM6Έg v` ҉QJ%Hb.&q;@x@KiR6KDV%y(#`v~`( +w̢.#v.4)#wOW,f|h#Lp܅+F\?63x;TUN5欕a-} |!G\TaX@)2͕A,$0\ t_ps)zA +V^! x@S|.wzq%z"h{0+pfW|]JnQ 8<u9:j*I%8f<-Ub7@p4y.b[F%hV_hhqȽqZ@G3d8*TC4bg00y `T3nwa(& ":KQ_h.J,Tr=0? JHd@YciJԵd1@2ߪ]@ ]m<49g$PK Z`  +E]]@'G1 T)~ ; ?O =3o/A ,e 7A!H/~5z|B|$0!ˮ-V(/>PTir<8>_ +Tӊh( |pD;&b4Ԍ' F( jS_kosෙE"K@dMrCVG 艅2@P# ,}Mvw,S LmPFV=$e v7i~#X]žs>,DDk3C^ U +A7]>@i2" @@&0MaCC + 0/]I/q~›E4FuꎂI͡A»3ԉA#}q2<M4#?L$b@-Qң\C޲] {囌0'+"hEwh@LJH9Y@E.RlsGG]18:3.R'2hj\ +F(Bt%\QxQ@maM\ؔEICU[4 E 4D$pfԀ cYqÕ<$4|i:"D,Ng4ޮ%dBj7/HBL~BGv*ac1KQ[m$Qɷ" +'^&(hpًja36yM_zAw`_5^Kݿcddas*!m#nJ2ٿhOoq- d]BAk vl@.QdCp##aBPxBqM*'{~ /~ǝ{ko?@bXmIH/.I?^qDB܂i8_>_EnSo$~Jf@0.W~.PAϫ7!3p7-wýD]-,/dw +h8ǃ!\J (C*%; WY1SOj@ߺ6Qx'7`8dk=+hx ҚC^σ"(]JS +8\ AfݠoG] +v~~vJm7<}K[C+;?ė~ Z/;N'w~1tbǀFß#9!Ώ$@k1th JžbYBsm?dʽ3)wa|7<8$~=C+O@hv0ӯs(Mp'z~ +셟@ ԓj^;E,;3@R׃yf8TU!/h0?¦~Wﷰ$n]WWzk ߗ=fb2)#ncS^yN&;hp7Tv`J"RhF-CAKht">1-oOP|ȧ]qH S@_Uܯ*JzApgIZyN-f~9~0bgcl8cT/"Ѡ{zITޕ?t4s;MKEf$bD~ü0JWt/_lZj'D//6Va:vP;Jz|U_}SKEdmLGfŌmQ80r8_*%>_#OG->'1E۸2f[}ڛU>-p9P{ +ߐ[͐aSԏ,@K?t+cxno{-ag.eQ#j‘0x}ts4<,ҧRrI*E xҟvh %GG+'|[h 9L{ތ +kq͇vI<|a=$_ %PrEnGcʀΙqXyfP,7?H9Qb*%_2MAt#T+r鯢ĹRJWk|G''/yK<j3e>{FaKǍg +o2ܗZܽhM%M$èD[>Y +?X]:f͋{2l"vQ4o}I-RC.s?5͹K ?ԽG0xYFb[ޣ`?'֪R{)GEqD2&|͝(FhA#V-.wh09c=Fkl#f 5ev3WFALٰO3W%kf r*p_p>Ը/ު\XO +kNS[=V d+40OIĐ r_qrۋ`n<Br{-ulhǶ}¶]g[Rs"WD5^B8N%~t$}k)0'UB0'T޹) U&n/F5pCWD,[Y6oAq Q՟^ŀXC|d%%u)t^_Rg\<,m${!z$NCT {b)SJ_W$τ7/9>^R1rgna/_r {٠j0IuWJ)^*nTɛR{4SQz[ɂâ}#zѣ+aAZIpIbV\n`Sbz[PakzK}qgXpzy.*7I|2ĉP4EYZ?3hta|uQ٘u )ZQ Z:GYV|Wd$eo򺆴2Y=>ƶ X陽c)2{IfВ84H s;/o@@&\mִW_24%>L%bPMh+mg  hV"y;y&Ed3VEPΖw ^埒RHf?[ zR]m-vIgmŧ(&IدD5,t}tZrεx%վ:ezNWU8bNzRzúRnCW)Ӳz%-qs8bdҚk7 {|";۞4 `:=`Hwݣ2ޖcح'QLM>ͳ7ASC-u1;ٯ^ζE_f:-!yrE|x7}'->0DKDJAN1=O_}.M(?HA9¶ad"u(FTT8eVϦ8]itJqtf[s"ؔ/U{Q_z.!s\Rnxx2- d^,zZ^hƟ \P,g^vRwW_s`A5Pq!s5Vs=:.v2K +W%U``&6lQE~<*& t$'ǜ[ΚdO˕Y@0?Ypb9G4sdm4N9,îl:wyh@g,4xx2qt=7jP>:b-\dSЋT5$/2d|`SAJk>.1=* j9+ME8C vb~B^^.ғt2W#8xsd뇬"2FYXQ$%w%JĉV;=qL\%5ٖEsljN#Ǯt]%4KN^b^͹Zk~0y ڡs&ݧ5gT9?To mu@9"vloey \8m&1q>p%^Sxoog!Qu~Qk!ɭ6Қ9rs=(uL]QYf;3bz*RW0[6)`~@J +Pin9}c>)? +4t^q0GBBJ2Ts:y8+F]t-k~jr9}# +&4 _st~g/+s쉊 }.zurPp4v\sH-PҚzMc:I'<:/_t 2d /m~> f.Zˎ0-INN1N9t;~/,=a3c_=T28hdȜ>S cTKH=9agk|p +]&u:?ӄy8 v#OhZ7AIʥAdN]НG1"ء2zMq%$\~< FtJsb uNm A9Ա٠CViuγٮ?2-$QPql8"V>XIotw^!SlΩvn Xkvx&t4 +~2^XҖ.9uǮh|NŤpEB4DIsΤ(,ɱ$ F'ƒR5{lVt.0cJ>B7*#K"ǀHACDYyN^/UQҖ2*xk]rsR!AK}gS 9ոZH`sL:P!:~*[Bk*K; G]ϠXռmð!d8;9DcK*[lIAؒQI=4rXlI]TyǖdI,Ay$&cSQ&Ktθnhm*6YI؆W B+1V7G=9ۏf14[p8)tD<_fQ-3[V<: 됛gIE.:s>Õς?vVk<1-Bqг˒s#<˱ga@KXB;HOx'uRN0G1uk/Dwk!<]KgV-Ό +k+G3߷I$KbMx\ M?cB!U8"O26{ f洿Jkn!tG &D=8/o2!Y{8//G@9s vA1H%L h#7mln^^,}n +>*W`I]N};NnԱ'ӕ(Wc;=~UG6s՚ ⽄e:Zk.թm)F8h\\s?-Ò Q +- 6%I^8"3>e~> + +jվ$vO!)c ~Yֳ|)(T!ş}cRlj 9z0(i CjClxuLNp5| 93@DÕ)zWi!h $ꈺM$0q8,*nx\r, YP$wC$/BGѻ@}EtwL9N Ui)4"2%d(RH^:ݓ@ґVJfrH\5d@c6+xf cb' 5ITG6XI!8cTta#ҚQL,o NzQa7Bhy@ +*{h)@U @ k2zTTenoVLMpmsgnJ {Edi{V4NQ7TL]f +!vSYˑkJc C5,ypd8 H@Lf@W)ML)#1]'P>&[Wp@`M( R2%`=Վ94ʴY "r5dmϔ:RH0,> +Dhvy +Sh8L*C46d2apo且q#ўPH?gFK@VOj+K ϯB^hZing/dLdҔ3@J%tJ Y'XRƕo׃-ߖg؂*7[:g*Q#)Di=3>c Hӄ& #m2rW'64̷W+UuA;Fϥ,_'/Q@$@(W9SiM>kwl HNL;P_.E{pw7L'[S:v8cvtH50Dn%^X@}VT]A@<~[X%E(|m-<&'( 8c@hF}qo+P^:A82C@,t76/2 T;xC0_ $.tJ :Y4emC2%J\^s##7eگguXJ d-H($lPSo)>U=x +tjA**5P+EUQ~/B 0p$ U!/j,lx_ѡ-:CX@.VOK`O!$Tcq4a1_(J_ @Ӓ)`MX/:5? W!L'uDU"՜rp~v½ͩ̓@^w)rjO1nuP 7/Z$ǫ^ 8j;4MG& 4m4+gM7$OJx]Jn-c/Q3zzZRO'w\tppjg^7(7DW%{n`$Bho6;$`F<)ۨ I0Cj@'F4Uw8x̦@gwW`.NBkv +S-Hn)Ŕ;ԄYށ6r2u]@=N6ͺ\n3Q>{Sn67vV.cj\;Pƕ35.pL}S܁\y +"h6D=?%AoeuMPG3*E-x$͊ܙk[ȬF.5]&3=${ l^BlwE}ϙ + eڈ )%D2_d~{Yvt?gGVXpjo[ɾgl}#Q+c4r\LhmMijjZ&|s&(a((-6fWd6>adM7`> /Mmajڄ=_"ܪ4&tƙݛMS'E;Sگ/L"v\+3EAK+hL|>((Toĭm} +܀Jj(ή +9"4 +{}`Ӈjx_H4G$ +XԠa w( +8u"|E=oZ'^*l%uCd G49edmŠă= +C'^4 + W\sp4vfH^cVH[ l7EI +3( Q& =r($\ү@ ItObV 1L~VG3!La\KhIP |/LPn +&HIZc0S(.~gRm& +g50,&h捦 ¶KL&/߃0^a$3龖U$RgHjD) mϝIϱΥӰ1[$Ɉ&G m G! Dݩt=W7&HB\w&X( &Wf "`0 +'$.5TI;8 + o)KN%X҉\|gRc&ڗ&OW +_4!mBC+(/&Z+-y +MBqEBS~t>V.>w,C7O騋'Hd4&hBRhEw{߆u;M$lVM/|#./H6LCAIt(lM)X`_+;/V; +toq"Y0 ) +_=`Z jy* y/[#[P! 20DL:n-ɠܑ4En)N݂G#M44^h\9<4uhʬt3: =H(5xTW̥n\颤N<M_!G`pذI^<&kcy7 +QlW]ȑ"V(fPa~7֥Z(*oy( u)ʦ/}*" ɝ\vBք/Bᄟ#:_7=Ye%\ܽD8E3 顆Yx>iDBsGTm'hKP"ߞ =;:#$ʨ"%݆NZ0VI RK'pe:U0*ȯ;Ms@0.b#MD99Q,rO4sNR)E}x'9A(E.Ug?wGjx0\ћ>P!.:,+S@7kEO-dT""eblm.QrѣJrKlR TⓛxkFO^I#{B7dRC)F~ L&"_ܺ i31Z_2l"[-eEFS@e#F*zH'.^8ců?&6tDG(jp#SxwT+^{<6{ʮ|dru|@|Q+5$s +#bv)q?LfD%) oKH}5'MD3㇝ _ZH0>H~ڽB˜ed{ JPjOP#i|cHnGH$}*Ni$鏹gaPv1`@ב q->?TB6'6Vǧ@OMBk+ qxWIm&TM&IvĒABL#B^')1Q~*ː;$EG]IIkQZ/6'$ADEBZ<8SGEQ-j}E,Mxp\ >LțP.)oާ4Bd‹'??ʅI<~R?i W T:D(& +փS/?)CP;(FͅcOQE +xyC St $o $Ob[j쌊U@aF%A6*5^ +Up( 1]D\oD5+gGD`|cj&>KlxZ?HuKKR+m.]]Q|;C\3c\ʅ,T^m+rjC +)L5QBxtvq+?.!t9h11kh&>]: zH*'CKSbM?Պt,+>YI%d-s]]|;RwW.MKFH56~hS7я40h1&dUwH Ϻ-Qj1f.Ѳ&$6Vt" `?815)RDZl3DQ")ʫD릌-k[RƖd*hlpGPĖnp RtK7Yl4R:i[sY!٩=}UO>B;C*'5+DՏaYσAO%rߵl77 )0V|V)ZݒǭzO--sG3̆nF|H.`[pif8M$ϼMdJ!9"ŚQcA1);Un M7` A/wKΜcݒi6sUZn)bPyhLeu+Ź]C8*ܥ%3BRȥ.:.4/ww΅Kt %50*́1RPO`2'ժt?,@9QJc61޶ܜc"2WH2wIVU)S0b)+Ɩ 0o3Z:DD:x.Rj4} + n؞aJ>S=dZ _ +3B\})>6yWSb_JMkC*G&G4Ůh6mMkBY¶6C]kS%R4MkΟeMd@.dv* Ʒ&(>3@SI.޼V`\KOGReYS5 5PUo7%,H T%ʹuQyq RcQ5%)ɭ|иqeDt=D}ƃ/7}[^\Tl[_)M +*)o+O&)z =Ѧc?'"/0 +T +|7i.(uNkʁi7Qʖ7MK]&&,e)i>EަgG]0'@,=Ӟ]icwO8A}&onM8.F8JVpY +JqSp`wуhx[ÅNlT}~#%NdH *٪S(Tr9ǃ)Cݭ&:_Nw Ģ6P1cMD#u@儁霾N)$-]N֒Hs*!5rujhꂫw$, Ҕ7 jy\+v2p a%.)hSƞHȡie(a}+1Od "9%pv0k{2W>sDv/Q *ZgWJ۟N>Kԯg<"VN۝D\deCբO?HSu:DghQ"Ii,;#u( +wN@Da{dQ. :jitr*OCܰD1Uًma1PعNT͢LyQOf1liJ"TKE)"tx y_/\Ux5$X`נ|JHpUaAvV +9 O(N +8v)5\I/W-3ݹЏZAЂB)pF@T ߰_']z@15noA!NRʟZIVVm\V)ՅBC`SSY#njU̱X|SP裡1vVYyPފ ̰$ @/6De΂<V()&-I+Ac&,K$$wE)dD+4c?P˦r<|U#&*L33@i<*.߇ъ>- !au!-TO{XD*UE ;`uq0 +6@+٥[_G*B@\e m(ZO5p/*cNP'M{|EwgU( 9)GIT!.HիգF#^0UJHѓY@Zܝ(C*]oVJ&YDžm*m6&0xȂUdψRNVd?syك+6HUE,(l 3WxOS?PQ_u"o' GJttO_5/,9P]F^@_,.W|*VqU5i% joVRggr+ {>} A>+^]Gjb{ FbW +d/{r j U3%!, 7gI{4#UX)+v l*s{ ONW~InX%O#+Ҥ ʐ;XԦ +$ ^X{ M.Ūu?}X<'%d胸D$~h3Ejz.E̜SCt #&w߱/Gp校۠cDXdIJ"3 'ȵaHc,LS6E}p_<mA_"+ncYb$|#굠qLNdU>JcX: #X`JEܜÇ:kD9 HuzcI +[X8agXC,vi5/I]b!ʆ0lrX~A#)˿sB^ՕX'*=5rPLV|Z_:Zx݅ X2Doey,^tXaS6b%- C<=KqzXΐUAS00Vvj$Ж97^N{XՏo~,߹ [5:jIg7(+D +FcQ2Ώl801?GxB 7*?V=dfMX1.ǚg#P^D82 Vn,`I yT~,QEs$=Mn]?J'c @,, )s@r4$ +|@]d=5DBd$ +}~RqفyWh~,c' H~0 H+cYXSoY ::s lc5.'\yG[X#&p[E8~ ?YW"R* +㶼XO,FNB*wc}ttˀ0BgKKƊT;Xá'\X.ԏ뗱$zgT;"?|}P;c}LU頏; ʣ,t.3˧EXXkێBB-|Edcq)X~UC=ci~S -Z.I A$A<b29r_*<(kѪȯ Q3إ=VrmHf(X HN{rIUwK|~m|a߾ΐJOkeg挡(QFB}5+y6p:1r">i-=֗C*\)X^Ez_8r 0 ]Bcɑ` +hZpeŠ,EŢMA{,+=3`F}cm[6N(=CDҥ9)./DXa\,)7`uAQ^X+wc2`3Hc7w%BXBLW*w^%ĉ接7QP{C"R~ S~cy myc=Ifd +i捥t +P1o,ԫ@ ҙs+fVgͷaCZJU]ƍemN?֢X:ݝ'zh6TݩI*J1Mίo w@lt9Wž#6p&*RTI7U\k k’`. +0yZ&`F%[e!o. eVJN#X_Ieo2_ƺk!N퍅kV^?# +ÊO7ZEu5=*.g!J*Zqhna՗!Hn +.t%6{cѪ&^EX7!?$\ 7 H +ލ%NX[X^@jͬVP2%r;`rYC Ѯy4d{ +4H1L0 TE!c;0/*u'7V&cɴW 11ʝd/ԧL+VHeD,tc:kL4!q.iHF,k ~oeLd# +,cU`ҭZ#0O4⾗Hn~\د]!L]Xmu}/'c̜9_;ga,_Q?KJ댡*FR£ڢ(.qε"!Ã0V#$,Ca +wlza'악rX)bL۔;?[>}T4;7gc0qXʔz0Q0; BL7*`6ܶc!*M6  +k4f4H70?т|)33W(dڦ"c ?Hx=|a0^P*"p5Xm=m7Bn]L-cɖ9n#bKR$IH/~6\7B+>XLEX[ Z9}#2q9lXo\u 0[)FMbNsrcQ< +XI*z+ +62R0X@iiOP0k- Wz+KָЏHcwo+GDNXꭥuṶ!pX$9|"7c]W*LW.Ed`I`G5@"+ |b0V:ޢ0Vp ^or6UN2~էX޽n&2_Ab,4t6zOL;P0V9΍0vjKZRt0Vg!i<08,XBƊGgÝ 4GJ QrJRnʴK ad CME4!3p"$tc*Tcs~At8EOCXa0\0 pdxa`We*Ub3qEGnn7ӊM3˅&(= 7&A$Q A0Ghn6n026l)g\8>a;i)0F+ę8̪_=Ť[xf#-L5 +EXJ&*a !0!t QB +EIǡ7XhxŌ< b42'wKOn3 )Xa,B*"QѢj b3#D3nEaOeejyy_{=3jVqNl} ƗY_ZW3avrhV"%8;c@C vau9->!Ȥa_#_0I%PBhWlUK"њY5.^Y\?2ٍNY9!7zLT +3"ʉ9ZT_љ_Jy2/t^D 2.Pq:2aY&&=$IXG#4AOd{~** j jSd,?i/ )Oh-0o4?HQnf$$KC ρؿ>Jx{{CB`#d_Ba [ffLf{g"^ bU z4AJ)NX 0/\֢m W +dUH?q%9HyB%D3@8 1SG@?&9yt/Ql ` $5/d$iPx\E1EDcܨɿ% CPZc-씔JJIwUP@Nɳ@PÇ*UB:e,gS̐!Qa\}݅"xFQRO$m ڦIzS/ +R'*xoՅ2vb!!tCx<<Ҵ +>"a-{&e6XF&v&V~NF +“ %PA +<I''4;WN$6$)a&['E\!0#cߥBb|Bˋ ,asJޜ`}.R捆]~DEe()b45!ImQZGA R? ?qb1?Mca)lZqMiE V,H3N}9 pqtTsEP_A39e /un1ENJ- i6.VI<Ж;dX sE +"GD(8 qc>D%”3z{>i4,&f31w<>}TX/pBP'$}GQtl`xqFC|XMm + $z4uVp@l +w.Z + Db0h&!(uBX0[ 0S1c` +ҩc3Y@̘APGu8"3rGfLBP~b2L4x t!fVd\S, .c|zZ1 3g - P{-k*bBܻ9fk̘t *b^Pb-D3اg[[m6>NhF;F]t&J Ľ"?+MD9LJNx_k1Cr:fT&hg/ހcG1C^9߅jMTDfȦ4=W<J[ʀ{CoE0lZ"GfVWa; wٴjػ@Rya od"MQzߧ9sx`eJI[D?"g(h l b3{Kfb9BW2P=8t+pG N"dp3 Fu2c9$3}P3e= vW&SN[`̘nV:eu9 +gxLAM)3$cg(3ZXTO$P*OfĀB~~nY9 G6 ),'3ip2#mP3@ ϖГk hi]U'3sDߎX\~5g9qݍ!Qh1KW_2JE$Y{_NfS!F; aq[[ ¬8PkX$?RʌB 2C|EA߶i_F2@ [hR8$2ڄuꡔ*yPA]+m+,)3bx0KFK!9Zx=In`k)ˀʖ8z 鋃'i n_ 1/.3ja|;DןmrEUsmBLغȑ9Fj[d,(f-Ze=3-eD1j[fܙ,AZؖx/3<neFJR{OrTmca8za ~A``R,eLɗF+Q?=%0X12-/fW_s/]8K(,3̤ښ:\ˌP;-DZ+zpgó8M6H~rv&بpՎ eƛ$R`-310vD#Rp-Y:9t2rfq8R"W}U +D1AYA^A,ПgGUfCbsr Q0czN;.؍tX438,9mXVYfEsk fqXOp{'q +օc\AaTf2vKQe.PNF(,3cwYfd;iLCrԆI2weFؓYfx,YRyJ(ͣ2ic2f1:}E 'fTTf9O 0ђEŁ }% ٤ho/qk̐m/H7<Lm̰e~ F t,Qn[IDԪBq t3dF ]@#[L@lݶ ܛS(3R˼EPfXnGoY8I {I+^IA!RPf(:)l+J(%nL"a"}T3ST)\P!%,r#}m,H;aTml(3*{&oh㏛Ch$ +ʡ3Bn?H4FrQf +z%04ҵ69uJOZFNAۼJLg1c(n#tbÞ2#yQʌYL@ox3S a`渹}w-Vv*ό%%~Kls)y b "oǰ2SRhzihTK]*k2C_7 \eFL5!Pa{b{FX]H 4#-:Q1}xUlTXe4X-lMBlBu+TZfMъ)3C ;2 s%LB2ChUڌ7{"Gajqim]qL^Q'Z~r`䆈h-̸=bb؂$*81Vp\>Y1I#ۨƌm0]aS;j 6(RdW8軩@Hwۯ@̀@Ԁ2^+3{Ks{+ elD I43m&¯&U[jDLMM2>?U(\[̱W~z:lXO[?ۆ0$6t{!OҔ6*3YTft_Y^= z/5L +/0?'|J2jkGz?aaVlQH2̰¾#%[]װB]rU+%tI(.hRQe/s CXk3=̰j褡_Q+y27a%Tl,3 13x~JJitjTZUp822a^zOd25PCޕzhA)`e֯ j\ 9/!/2e苝(1%5>ne"Rׅ8Ƿ rlM@+3&j+3Jk_+5(5ԘK26t"/!8ZAj 9D%k1,6_?veF7zhŝZL+-~pefjLekaoh̘(_QxCލzsTRLVfx+3x'=j@u5m=ꮛ4Y%- Rћ2{e`XB'E`!NH]W1Vfb-2C&A %&uWf0Yc(wfu5D4\t1;=-32ÞGeFZd(]Ī2# 6,"eP{ȕ0x+36c!^4&uGi #;p8-Nawd`㈦Q oTal iG pO1-+3N{^ @3v]%!r.\f01! DS,.D]0ʋ(s C. ; -P6ϾDgx 'z/C2C*TүI4d`-:1/h;{OfW +$kZ1pP<*^w:Fơ2 dF &߆A&3qZQ ;2ۓ,YiɌFVTN@F[*2Ubd0&thP9) sS"sA9;?Ǩ~d +EjCѸ?WGf\`E]n"3 BchIG@G "27؆Ȍ#6Ջd7s*1=z Ɍt]#:2rD̘>画_0X#0mu4'a6XPѰ_榖gu|Ȍwfi8=2 (sq;ZBW!*Ֆ`Vwa:Cbo /12S"s lRHk O_ݬRD +OF)>Ac $3J*]]9Tx 6UV۷zI'{PyvWjGTnd +mǮGm")'QknKf0!98D5m*ܒɌ JUi85du hXS -7]5u/ `7~ xY_ k(k}/waO̘BӸ +?4ЪNjIf }LEYGp6A2T!qz9T0"WGbNPq-!{д]8YJ/42~'P`&3bުR0 a ?0YCPf͠|R!Ɍ/" R'4 cz2=%@Je=x< 2Mfa IG% [,h K l1ùȧw`ku}F&3؏ژΑ4qDffKP$g _ +B+Ɍp+rF ΄XeqCxH,K zhkr:K؂+ 1TfF0EeFgs(an5f2C#HVϹ Tb,0ljVi"\*3 Ih(@exo3E2")3rสeՙFPUQf}iTDkq.OG4̪s2cyPa Pu| ,IHhz2N%@8{Z#Y ^K8 AaRf%)ז43S+LA#-8X1OօD@[4<œ#W1\O\1Vȥ'3q53x2|xɌF4rr?B8< MfQ7տk,[~dFZɾtgo2D>Gݘ0Z8ng&GمDc6Y*߰aZ*`"C$ɗ<5 #d7~ߗ\a1Po=:!2:T2#`K:EFˆt=$'duNC +QIb68QfC@&bdML>?Vdk鐙$ROɌm-~!2o`+ F&kmvN8 ^~~߸3VV?miTR YrjDF|8@4'3cJR;'F*7=k2G Aqq"iR'f1Aw>vHf I52V^=QvډX)pϻQ=]"1zEKV}dFǶJrS*`bF7t !^QN܏J`@ɟda~ }0py!__ ؈IfɌ6 {0 N:@ic!F(-#r.9~Li=Xg?7J` }Nv14 +d {}d?y-GVOC*F]gS Y2#e,t_@ 5CV.(d̨Kj [&~%CsqR}7Ax.k:85z"|d1O++#_DfL3Y_Ӈ +Bf)dPӯ! @Kt 0Ecg̻ +a\Zq ҞOM 0V$mߨe9d[ފ#mrȌ*A@2@k PO pt6yYF%g,Xm!Q3I4`(tACk" 2#zah<"3lg߉5Bp w2P K%@ +6#k{'mdB&C2&J2+ [ѵU'3ژм4Z͸Xx\'3VVr`&3_p.'j +QYAG"_6t՚4r,bKf@i'60̜W;!Q?뙠a{?߫R'J!KQ,ZY8p*w anrdF3R2Cvd +c A OF@p"`|VDzl\$MaSg_&:_hً(d+XL0֠C-^D> w 3jMvO.Ȍ42M}FEf< aXM'5Ϫ`03p;ZdN(`šgO@ۿƥwdFUx`=zY(pdl@BgKʜ̘\%95_X|OMtHB1܈вc0anA(= xG=#SAf$׻P2#%S@@fPAaXu/p0U9 U*c<;aȺ6?f0ԾE +cwW1b T]FDLMp( HWޘ1l}̰2C8J(%Lc?`;p'% k8M eMM_- x >QD +{̘+r1ahSGH˱/L܋>fhً LZ;tGr/x/QX{C繈RyNV-}ל,̈x|x/^yeZ*q΂3j݆@Vwj+rUfqL^0OH0y}{!RWh 2/ ,ƈwRBf :Bf"g2HoրiubUpG_j yiE=fH$ж8nch7]`-sKf%7fj(Znjw,Mw04kl=.q?Hû,mnjfCDf*阡+<| 4~qVR F 2ch ;SNeT3Ӷ1w]ج  J1',|3vɔ1CXnX:#,w. ,Gp +9).H&1 +̌92Ufr4 )蘑Inj܋Dܔ%!ZDxf a !\ *-+}Hnm%ߞ5d̗R42(o26DJ4*W( ;*2-e9Yw (˸O!3\9=z •')N=vp|k3lݲ>fT9æp\e *a5_-da$ y({gRu }*g3>NGAk20n@'33||xe\0FYZ GָexUcL6fxiffM3xJ4ƌ6?P9]d26bF4+k1 f.1$3 +O< ᩘ6u`(j15$Kqcq-f\HL͏1UL&7};!1};5؅3R5E+L3.H4 +AHiF +=? PR#fv-d + (]=5A5v/8obI61c`a+.@um@025ubFf^k:)>q(ČJZ" %ȾYr~C+čČV ?EX=WTYg$h +^Ԛ{AB N3sM:I'f| ?!'f8cRes}bF)ɨOq=4?X%ٯit#S.W'f0/#>;UT0)]ajiH3*llhŝX%Oꅈ*fw H-.4kƛ&WfG.cu~Sz3L0q8L1S靋~}r%fs)Vgp=/9 +[13l tRE-yPXYaB]YU1#[P̠Hv~1=PcCfDӴ\y' 9c'P_ss T7fdN +"g2"6f2s;7rx^w!˜ۮCn$knj촪<ݧkR@S$wF^ +H0CMz '2"D;ApMNU)1v-ecF|ʙ?C3@G59 + 9[+` +!:@1:)j~G=m̐(N-oP9)HʰD +@{̮o v !wQ+M`_vQ0=@[ +0JiyEؘѵM]8{n1C|,i 4v 9&1cld|{/yQh)\ ƌ]mM6f)AD\Iq̨NtG@||ukK[o,}cF%值(TY k`rFs1uD>E3RA1 %bQ& +\8,f띾JA{tk3eI `njB#1c/J*_c1+Q c4g|*QhGk@;Y_ Y3 Wu cƶQ¼'܎71r[07f?Ľ®\1WA*["+b{ĄC$6~&b%"tf̘QŲ)b> Y욖[ `1|ޕ +æAU\KǸZ)c ٔ2>+~gb.$b$8" %#yJZdBdP Ң@a]1 E c\cǸW$;&t Иb3 b$qN10 +kG59Y"kdh2F0_B|Nn +[ 6yZ1n%Q1cf'1NMK #1r5bL`D cɹ=cA0~Sl`*v@>MBmz)WçT ti!5l%6lrfţ~bnîL@a7:@1b0l``NA1Rqc  {HǗ40712CrXbvG  x`xJ]K0MZr sʿ C/Cqi} [7C {_t_Xh۹/Db[TXL ,0+Nc2]X_(Uj|/WL{bba/NX/Fbz^>ӂe8Պ2Eb̶Nb>na/4OL jeE^" P݃^V} 錙b۴jG6f:7߬m5d!ibFQV~v6gwXJQ/6C]\,g13u1evO h Z;"4oƂ֞1"b<ѮЭZy&t T!mgGZ&R*-u! cgeik `ƃ!m3C]f83ͨS)|5 VoZb>\M YGogOMwX3n6|N7MjZ\%jr4AH4 +h ZT[B. A +Q;uٺ4b5uJ$xC>5D!6*]N좋s 8E޺EW T.)M 7B.a+$U`qb82_anir2acwHS4 +3K *x:xk@_TS${) b؜DM!6S•@ހFRhlJ-챝F6+dsR,,5Jg^wZk6>"+)ٞJF.$E!ōA ++j(`:a(Z%Bk;Qc{cf1mk(66J"n#!bo(7> 0Fk(cn\ sP FY5KnFP]7|B&x7.s811P޼B 7i]ݟຽr?~ umH'l77 mqOэٲ_&06^b_ ǦBay'Vpg 0׉NTp `:9yB'aНpO +`NXy''&Y^0P ] +u;L.:PuB7VK@1+uӺjuhovv.caT.unE`Zvd˽K.hr]vv fMަmq80?~lga]*bخlWRwKsEHiUXۭێkڎ]"RX,K,l;Tu pv +%+\%BfI9a 5bj@%/Z ۝o~AK5RBTvx6FnwW]<;LL] |w xǚ*?z>J] e%|wOḛĂ~N+1{7z {Jt*aU }o-~&L<Ҧ-%^w%[xj;)JbcގT2|=FhϼbvYZ.׍r#G`G1ͳV~#X{7b o\#Ɠ‚NO4B"7#e/a} /bƍW+1"J$m݊0*0KEڝb-4iE(WDS6oBnN(B=Oȉ&;̓\e'HGDwwGvډz0*!BQ +~p%QVeyApo}W!%ޣ-C>E7%ϣrB 1ACx\XbUB}Bυ Ix7O!>3 +a0boфZ !8#!f#B0Fۃp $g! y4} )n\'@ 00 Xz TV@4="9V X*T#;#.@(xDfU<jz V.Fs=? {ػ?ܰ)߲?蟽 Å"`A$T"SVsO}dl3pVޙ= v$`ZS>Gtzڇۉo{>s|W^ɧ!}Q>73|0x>sLJz,|0bm tI`L]xKI'πs*>Άf'-ӧ{P۔avc9]5bROOZCY}Z&?9FA%Ex= qK8!͡@}{ס0K=r} +|gj/~}K{}Iӫ,=A:ӰmO3{@?V\҃Z 6e7\z00=<~7=y +\0=ء?!]׭~KoPP=ؿT_]Wq-=Ua<xwDiarGPJJ;gH&`в T7 |˟l |={ +F L?(^K藁J0zA 2GP48#2}8^7j8.`>" #z`foӱ7`U,%G0F򼡨 fHv7P1I iܰ. +7փLmhgކ_ ǎ*ZSLz:A.#:Z6 8G2$|l|kpoГ`L@0y4g b sj訪Ap/ejp@:_a"&Ғ,SF^@)`!U+`-*ͰF,I`_  g  _rNRg 0I|<_^V%H] !~ Q@ j_"2FW8Xo_a>*!|}؍K '}h&W1)$y @и]GA \,n +UVPYa +3vXz`x*TUY|U0!6*hhkPTqUXw*@L +IA*`^qZCAݧLB80|)`N~Mřӡ\L09Kd),R)R8sI#<+_Z((Q@P>;~0N(=s" +/盇,3T(?pj(.?a7?aH 5 xO4dO3?z.8'N wuB4i0VcI: $'8!+ ڿ S&H?MZMx5 +DMԀ.ܧ,SR A'Q?s:1 +*@BwJ(g(WI5"ɔ22af6z+L  \ǟߗߗ]W2[w]B$|{ߗ/qq ߻;,s}mI>nV+HxJPAɏ[M +#Hb܊d TAI?[DL^$ܷvMRA!yqA`@ +'\7qů_o.=w򮁿~rܺ}n?]׻ݘ|ʟ-ݷu᷅}[­]zܕ[?OP9v.7[;߱aY0] n|޾o {c½ݯ.{w {8[n/w/Vޮo]˾}1ޛ{macmݸޯox[7p]2{oo{}~{_{oown]}~a~ݾۅ~[wr [szy>.[>vcw o;.q߽Vx{~pí,q+raV~o}]sWnq/{~u,ˮ[]\>~.\v[-Dzʿ1,2 s eٷ?o{y.w{ۅccnco/s8~-./_\^ۿ{}}.\q5Ƚn qI_ƽ]6Vr}=睻wsv9cyǰ}9wsۗ/ȜV8nasrw[ܻ=s]o7.٭[{ۅ?oe~[vwwݾݺm,!}ݽqso7--n~/=n ýw.ní{;oouߺ6yo_7- >nxsmc}cq=+Ǽ=mq{n\vwue{|֕ۺ]mww彷콉߷W],-_[۸vcu;~Y~csXn%~]]9.=neYeݸ{m.n?na-w.n yp8vMߕ;u}w6n\l +endstream endobj 13 0 obj <>stream +m.{ |DZ |o=cs_{}_^v]7箇]na]ώ[/ǯ[eop{]w52v&p[qn\q,طn{˝w{-{nv7.c};yvw.?s~./u{ =;wwo]/폷]wVﱗe}1w{˻_}y2[[7nX/W6ݾݜow빇[oq]7{ñǭ]u?<{Ÿ=e]~_/nV~ݾVr[9;vp].omawm/]뺭a|ǭw/}w[ݯ>v[/ðo߽߾؍K<[9v5[ys1zno9ov{[{Xn}%n۷؍Koe{˲wn ^0]­19aYv 10ݸanc ;onc7{ca^?syau_%c7MV v *HPAneK9Y$$ޗ 7q+;. 7&A [5éhPT4,p w`o.4\c_ 6w\ .a>@#Eʑ9),2rQ5R1]_zLԐSYR)q%16`KXpCQ+ľrzFMq6a32f-ec6gVvsNnldž|+ @LS[Z-]uijs^[bFMMY9=>%Sm%ŏUk44*N_dY#R[:#e6ӜtkN]PC +VC8!@YĒ`!/"v'w،tHű%iWfVSִBNoljl2fNB>@@S-,zS58$֎ 5 +T'( VLaB! GI!Ȟ!def4wPdAJ EH +L'tNR ғNq:[21l?ݱח>:%ZMSVw>LJXw`0dpĈT0$P:64Bb` re ;1\ahIXE1 GVFAdhŹF܂ZP4߱&^vX2^[bk:CP&";^,tHdr ">UXǩ8=I!rY؊9S3VA$Z^IlL8E;RY3#Dԣv!=  ȚVJY(,2TRQr^Mjؘ׭IzJW*#;RQQYVY#Hb]`F "=Eu$ŬcfY熬PUy[Pg 3HP唵 ů #tUt]s^QXFOTEBZfk>Nʦdu>KS98"NQPJǦacKNtb^MUPJS3RU8l501BSTͫIHEi15c0aUӪɪycf4)h(Ė֍iVWNIᔪ9^d<#giVim5X! THT,bU#ZYhFӔf%,c2+)"QDL8ű??+LW#Յ[B?甎YxfsafFzN!'X +?A?C5!kڎ! !LjV b爚!h`!8^bѰ+ (]%b& Y,cVUh;\hAhGzȪט"C!VITِ3Va<#-/qnjWgjF+p@ N 2;jnD Iꁗ C#L(kQ'ԁ~\SÉ~iL-(eN7p3H. )8{5M/6$ 9FO:GPZ*9j ) rl!vr GL׼ؘS'Zj4ŅИsלkcC 8)S#3V}> SNQB$TƩlY-as;lQVwp(%iy%.0$Ush IxGKb/~7Ԙ.9̄P4*74O do,ǜ)iq!)SvnI+ I،UOy]ݐ/#K,3FĐM-Irm4Bb5ETH*ԆԒ՜ڒnݘ?&NTQ9a'?É2"7nٖWI ;εbHBX:\%rjgĖ`/ *VOȒ#`FQ+3 ( NmlEʆؐWWZS3N#"zz9|EP2|:7Q̎(0#hkd-"Z@ + +?AJ^L2J< +њ 'dGUC#j$JC^BZnCR9&7II];a6 ӎcÊȉfvKK7ЂSó43 !!ZGP֑LHMXMq%Q5IO\f39d`SCNQb2h$2YċhzfGps'( +"at'WZ@c9vH7t@7!$^6܈vCh MMQK/pft-z +N!.3K03K(S3WZ˺FNt@ԊvxH8%E%"A}LbF$&$1쒸*$0%ۺ$)$pB"eΆHP &$0éhLXخI_$a z?ܻ+Ǯ+wWn>>0( W#CVo;+Nt5a}x=NOrnTkĜҵc l AkBLkǴIq^Y9%)0dU疬I@څ;V/AaAzqZ5ȎV.9xV ~tLZ;JMXA'sơ1k*SabLZtYhcb4%4fJy"VC8nJ +:u>k:ZX5/Ҫ"RidlNU[ʞ !g)Ȕ%5Qj!(}[R1UO%=W"bU$S;)-pj!džcֻґI;$8aU''c<" +Zf@V45KhES^FO;_*3;GQ(\zekfads3.#iV X+5M3r$jI) 8EOUH̆Tqf ;CE\rCO3:(  'F R4q! -23zaH +D(J%jݘ4G/((Jc<$,(&?#U*5pJ_A [fEjhȨ Y5KȖUYx:TzKηyW?) M阰?^VŏE13cһYؒUҚN1!iq:%b)z">]#NEQ[J-q*KRk9+ TlLٍGVfm:%k ǬulvKZؼxKڅKJ}&J+.Sk^i9'vv>+Hq"+0ckE!#Jc#ՅVü|K-tH )!.0"Sb=!pɪK)mٚ5Π81VidYec4*Գnqb>9è12:Vif-\^_fHRC cX +BEϗY~FG܄ِ1hhGx74D bSClHIkGqBvp r,*eȪˆmxB J_dYȜb1)]9QxMچ6)!uVxIͭ8_`:J]`i,Ǵx: + %! &!Y5oTzKל麢1]ilt5i浄m"NW^E.YĎ3qXX.i3r!Fcb̺ÈPHtSIYZk:SZU%]9\Sc81MzSV}~YTrJifKj WIU9$GYhYI;*17 iՐ$2ER;3NA]ZMGv9GZ0p8e1rrq)]mdKYJkYӃhM!+V[`*miUќWY3CkfehyEԌmܔ+AH$) +y_qEp@=&`P1ǎJg>+/㍡#6E nX`Fg֜R٘S74 97ȎЊSA{m9( %VJkNmY̎XNYxIMb\dpan f4K4gD M!5CN N " +Jњӣ4Bs3z`pȉWzJzP v)#Xu՘ّJM*" 9!LǓAPp* JPtcBVQuV0Sܠ +BO\I\ғgQT_u[fMQ`̊O~5 +*U=MkIoгeݔ598)n.ùhǼpKS<ޒ ~ rG:Pؤ|JS~SKZMR&SNiHJ0g8FB`ZIE`@Z{xVܮy}VWNI!1i^yW>Tn8zvE,VSW *z4SM$^GQ3cSJ{~KhOqN%P*V LHKN}<ڃ[n=@dvFuAU궤Ԥ?ZRGj2\ cZW\K!AafG[Y +*3_c %U +g), pC!N ڎYn+,9Ԓ궴Ԍ>)Wnu0jp4vHڥ;ZfV'G|D'xyG$͠% -(픦|LF|eMsCzb BBIzCR SBpw܈KȌ VGO )k +ANVCh 88 "oH̀TT XIIUH, ᠓te؎TۮAS`xkF(љpBKȌj2*2s Fz|D'7inHHxi7zC( R6,TZ8Hz!03#ԥKRWf$usCNe7W)&#$d;^l]q-@k:%v`AY`ƪN/೷sbCZDG'$&9XҪ8y5AHye񓤶rȧQ#*2jv#*zM &^+ 0T4C <>ET `!F: )pbXbCJw4-r+aRVeZFXpH7:bfEsfMڷq$&fN3&?$ BghYU[7z4/ +Mń @)bu$-Jr:D{X`%\xqS 2NulZS^{ԉ*'|2&9(E\hCLm@ rfȪ 5nt1QIMbRԵ+?gyg ,-2$"684%vUJY;tƬp<@)f6lwXuI!03Tfvr &%MTY.Ilzv EP§ f\$yFx>fSvJueŏr:EVՎ*YvMYv 5Pӵ+iQ@E鋠|elLڧהxL(e}IZGit n7nzk36uhJuLYLw|ІP )g^IjMWUi-J̎vk f|).)JgYsP +3Y u3MS6Ƭ[871+,Η~Ǚ;'bBlA֔U՚֕i!iO8@#)4;7%5i>9%= $>| V*"%tvtI'Y7p +'44XZd +61IN:Mb$ M-쀋a:%uP~ämhEP[e #KFwnIkz"&nX "uu +>]dC + GTQM!'`IIhcl@u%;ER.~V\pIFfyXp +S95%-=?%6;^/!䅩S^snǺD+i]8Cʁ'cnFsLH]錵h35 AI#RW5IAH4cF q(BKܐfW/MkpH+"Z:@ܗBFLH|)КAG#Z1(aR• +hHn $4I5Apz#Z90٠"V|ϧ8~YN<,>+z +ZsJnM2v ;;y2'ۡ(9K>"i\F`%)Q:DZxg}@~mFeǎ(vJ1TN7 *bdYf1nmĘȃ :! U6뺎g&l }yy +"z{+hܻ(_3LL6 qmXV?n0|3yG Z.XU$\ +r4­c ^gVψ(GY8tNqn pwCׇ]$jF2J]č+:M{)h5!S{;) ݲH:3 P遐vRRdA+`fHf`e7W9z>Aùr-cROQP@Y\ +2%HBBq7MP->3fJ Šȥnȍn"=w\u}?. R|Eo>L@؈nqx .:!N?x"0XMaP0Cdx==B +Bn*MDy6U2^? J5t~)aM?5J{ߵ *CL@T R/ 7T Df;h^s6hxèk3_ +÷) STL;hwGFhgWI٥*7Gܧ,); _߸l:TE1aC|)Nٓt#dǚ|lh9a9சpu$.M;(TnR9,XEweHnHQo3ܠ=6!7E7M#. Q#,CRPieQȞ!%b"e,0 "T~XL@w憁SH?ѾpqNщ{.ju4Dh)S|V$e.0 =I=7ТׄXBGV#AOt^mn3ɶƒw쥕3>y sDcq;Xj='~\|,pct}"@X! Rk%kt PRXp4aZxJK.wυCЙx7˽[/8d>AbHl1]$#Py9xJu(153@otq݉ +` 8h-Yd,⑴`DY>Sk@$e*SO?JPe,(NBjIO0z;j O~!f+ (<( b{+!yVRD'd# +w**R̙UR6؝61]tU&Sawx@lvC\θoRS5#_.B1h{x7An؞FL7rEmJиڶ6"0CPRzś7Qev+az=%TaEg7$8 ~RLtڃAhsV#GSKB\UgbYi YC i3mdq0D{vع D9QnlɟAQR#=EwIsU}20'<#KTd[ށ3͂p"΋ly[} ICͣ˽7Z/^ Sl74u~Y&' +V˅rU,21Kedztdו4v= v2.$}VM2$FՏۏ}8Q/!?1&\DPnBKy + ~{<'7s~w 7-&`J6jX&چ$%YȈx!B.4 z%8;Q~Z?tz)t2S넏3t!2M)Ea(2A +$i, '?P?ŷ8+(3 ++O8%i`q+2n}kPx1RTCtwc`Xf<ֺI >,9?PѥRԸx`x)VMDrTܶo-$ {+-OLȾ_P:n(Z:O'XV#x6sT@e`d!bYin`6COq;bjZPz3M榯ݣ%UU;Hs& ka] +|Ƥ`pS6y,tKKb&Q864<^_?2N;kCH +81?7dm w *|)ts A )U[Y"dV$ w +ZT/TPr~ܤfjg_oR0r0G=4-sE ': +$9KzH8@!n\d5o-5)7_ݖ9[7?/xO )륛%iQ35Oѥ(8D%o?nz]R +p7yqx -ona/˧Y/mv^fov9D/ƬPx`O1 @ (R! `!2GVٵ@r? \u[eu!P Dا5%߇,b 5F{&Qd$⤹EQE.%M$r@*ã8oAso2 Cj]iFa-ꎐuC.JO[\dlRr/ 3J!q8LMq нg,m mNsT51 w3K1xZTX~;f6eT5x99e1cB &.9lBG;P}l.jn}Dlv dt̓}c.ٍ COT`C³~X z$ Bb=,PP95V\mŖ[ +\z(eRϐDq_&!3)2=G|iyt +PuUZ@f\fJc,6:i~l^P(86K_ap H}0"cե}"-FANo^û럷@mpFzYIދdxwD=ܞ>b.!4ZShʟ;o7xs+x HkkV*-)C^sDxi;19<a)KAcIoڴ. +堦qgݙ.։0lǡQ@`Oz)G#X`$tx}':Dr+hVr mؠyQǡ!0d)%GFl-F&"@qWmڲAwON{V·G1'*9N4A51Lbu$lȗGZ8A"c J7aaNoy⚭ um}.bp&*J-qb{]}PDZ f;\ː{UQRX﯇c !ǫe\,PpYA쒓 q_6bv5h`u35AECgQ˝:1 ?|~9H8_| +[.÷P<<,XI)("&d;7\d\!v$aKo:AJU%2yx^#Ay;I#ۀ% x`>T\ 2/R_7 Ĩ%oк +S3d FB6=ڃ> QQлu5O?[9K g;lƑ(#c.!yjepʷ)o02|VY'rG@@DTZ^7ɰR'6N- V\Up=HV.JY[S,Go"{#z؇MF3|O}QgUfJ[$F(ld~\̳ p3wjDVP7=Zc AEed3q+9XzCL} {/Ǯ _akZ.aDx/ggaÄ!<ގޟ1es(ߜ[X{pFxt9L@!򢞷]aw%@ꬓ &l0mI5=0|'p1o76ԧ1'-<37_V Z#^HzL. m+,׆Ṯ@ek NDi~.66\qG+]hW +4jLu}7޺4֢B;R!upY, +1_Ӈeԑ.wC%jy+SqfrTmYɺ ";܆_tLv\85ÁN8K R3j}T4o :]WeqĄH۾V&]>݂mc +]24܊}XXG&z:T +͚n1~wKW|(J~[Tm->D/yoY()Ox18# }Wo햩!`t]g |&ڑFt K|& C L W~ߩbC`i3.ƛh"0euMd5XA&Mjy&a]}me,ٸ Af**49X_ugZ1c=GqDA"(!i{P?Hm.MVƪP潿Nu7Y} +-ĭ"z$79Yu.A0ip +gfѩKv-hw8BTؾb_a@yΣ#$[/>TmX>VJ'ϋ?u'YxH.; +I4/D y֫D/6]Deul} +1}uNwZ{;{c~hrX.w4~:>G/&Ћ$hpyo}C8Ky`AR$5 x6ٯ}431 !QPNyzY'5Vl;2/gO$s8괈z@DzQ% He67DB`H̠:u di0GKi1)VfP밒V>LǓ#;߇}tf|AO4GG>`^q`.3=Ͼnyɾ?okڔB*UȸD$wHL& Fk^l>I4;#tRj>x;#ڈ0UV[ PG7~pFjʮ0|+`]37<܄cŋ:g^SФ8VdB9h; o^.aWqmȗKjV 碕Rx0ؾUvZy&k?l'>!ȊLFXBpٲ-9:tCpdͧˣ%C4@FEM"$Hd۱#?Α +En{M߹^`b@xT5`8Y*?=iqPn}ީ69ŧ+jAS/_1GNnJa" ^%|ߕZIDP@sC::g`˴A (Ȣ>)`(OFbB1&JNHVC@ MKys# ]\7:AS3p1{dB~Ue] 8Οb<[X1ݫ܀5vG">q ѕĴfvNzo!DY\ rR6VMB)-]ܾUpcpD89@țOݔݮ ܮu91m!Nn)ƂK4o^/hKnL”G?"5-.# +lCR'ݻ?k]EFHfCh݂ò&Ql%b5z*IZ0Y< ^m-^7(5C-2Rg@7NPH-j l^L&=e+8UC/AO8BB8hU^2hHR56~M9fj.,6rK!ؕhHA =OɑRzA/jid2oSF){,(+xu4$ ޠ?:ȩ,;[P=P Nv ]'C5R7\|ߕ%u]=Ka53U f%+^I[-]&4-+lPKEw "nz;K٧cw@ +6q -ޝͲu?y֟"UN 4ƜGMF9J}=A3jP*5r9 0@QZB!#Y/ &j$Lf2h!NAcrpͿźŔ*5׸G~ຍ5X3F{k"XdRL݌K}#oo`sIR8bƕY~0 ,l/&BXT~ +# ݐGu.:0j7aSu8{{O(iuxMAdCfO5uZfz +h1`3II9r`~c(l+=\X 3TieBz_=q ^cQڲeށX$Q ,ג\Ow&Eq A;UlW@)1X|׶Ǚ 2Rf@?KzLp)30[ 蚔-o朦/a<4D͹CxVϒ3$R2-TǪ1/"QD;S̊ 91:xt:ioqE!SW: SxdIH+}_9ӪQHhzu -_d0R]DX5'ҋ(D=\_4zmBXL*Ub I$Gm|(f-EއrԞUk[=JRDUL_Vjؗ/ zZ6pkʺ"%nؖWSir8/ڰE#] xz=P0YZ#Δm9&־hvDV" oKDtՌf^46/ʕ8'{>RܑRRн?e)f&,Q{o tm1X[n3t_q5,F/uO_vzA@ nm~ |iRA61:D.Kܡz‘ QamnC?#2X,3᤿YjvX3hIǪLo(hOy ) Qn7ް$7H969ٳ*ax ]X|%T:Q= ELpXhe{`1)N#A"ك 4 Aam}|2ͤ0Lk ĴĈ.;$q `{WbYeUF#kUӍĝtŨX:i}U7( FYw\W/_9k3q%%xUF69&+\Y~XID3[,ʥ&WM~WzRMҬnxQyKV u[Ϲ`朣;S+LA}DDLABotn4Lp-cGt6HbR:<肭8l?Rbm}ȾBj_S_ +K8DBS;s?Mlb%x4cS=bWZT𡲣ic2f; {1;ʇ+'(Œfhu~dsG8mb[ D5V +cfD`f6q_lf0Nw1"k^&V1!]3:obҌP%R&Ҍ3n1s,[!*D6{y1VabKsiZlpLab]b<,Bk(F6,6^ʊtF-&Jpx$H7>%oV V5B5#;ݶq;-f@Bނ&ەI zo]| 05p}tT3mp7sju(Ffpg ʑl-D: H͘ܕ­." +BJ(h"n5ґ[s95q2 @h8ōDVǥ ͂U#H05cu%qfr,Y)GS`\ˉMGxjFsW-s&9u\,9sRN *v9= kjd_̝g99iF \s00үi=;<5z5>>9%jF3[ bЉfWy2Aڋ, tCSth b=ϼ[˜W!MǢ!pN,m.ӌMo/\.-kQΞt!EC6tHtr4fX:*`]yӌtɎN3RE鰿n>H 0/G4jƯ Z:XjFeV 5c+S h N3.ntqvuC]҅~t)|tM39n ӌ/覿=erJJ5C, iFVǢ0IMw44p@g5]4;4HitKw,"b{-.R2cE4,8titVS^Xj٥SJ6md@)Kfa'W3ɧ +ZuϥNӕکLu߾N_NӶuIP3\g]wLסdO3ש4`G]#ƌ i{3͘poiF:4ӌ'ywEiRv` PZڨiro#J XJo'w1f@f '1͐%gHIXܱJ4Ch" Z*wcխofډ.. tOEf?ݽ*YK X;Qw{J38lF\TnʜKo(͡|cSh ギf(fCiliE i{>MC.QNҌ"nCN)d,~"-03Q߭L33% #5UH r7}4c:7WHxc>Bg7% (OQybytyK`g浺Gy\qpҌ&:Oo0QH3jȏH3I3Tb |'J32(4B̟.&=Mz,<)gqwI-ϛ/\3C]AҧK ~fR9Ni=^ H4c,}7xST2Q 2ZZhOA3(""ߢ7'4,֢DaF?3^ cFg٤. ,] 4g% yNGo*, %_xgF-3CE cMs>3}f`c2όb쟤VGg>3T WR^ՠNӇz'5f zENEaʞ,`gb^Y܍ GKroI~f4a' hy?14_ag+fДhP4c͈7->hc?Sɗ*ʇi-ߌ49ceҌ|`mGzP|'E"}!J]|F8S>hF$558 y \&}]Zb_ d_d8opK`m4#g +>~4c1W_Ig>OKN'@)RTo7 hޗ߇)7FwV_'o[=4=?AiFc9OUDa" /ĤDyW[8 +x̀x +Z1=7hƛ/A/ь*0|ӫвL|?kU FLR )>. SҌpƤn*pI +n5> +^ 5G!bV@hF\U`F3`370-bMI1#U:fH-#X11dA L*8fW +B̮=g4]`K&嘁3ޣmCA#Q7M3P" %.ۂ߄`PTf06ĔcJeʌ.P) d "(tA>=_UW91dR*T,AٚVf40"\#8)fA(kB4/`z}oaĒJK7i9YjIwlKh/5!$bqe߹̠΄OFNFI]fb~V1za`2U0F"u`2\Ӫ*(j20D'8"ؼ%iGe)fF| + '"&̸`.3Xf&?\Dt17#T8EZ< B 4pUBNSe`˱p`+3FD2DoiEPDtRE!DPٸH+)5"?V x`qy.i NK{SrQDOLy(ʌ\G$H= .E[+.J3p5k.njbHEIn!8#A2 xd 0JZ9LAb% 2C4@7 S`]h(\fk'XUQ ABY ?ZfbQXǽ<VP0ˌ˶%*1=+mA #(!Oy YfPJ .-3c h,3N 0 Xeƒʌ"iWӕZ +]Dq h2C?ܠgeAۂBH2 aek*rw`eݼI 1e_9-TtsEdeSANS +>V(3KkR)t Ofhc20-/Z 5a?A}1h(A_EM"1Vd(֕ˈ@3"Hf$'@)uQ Y$LfTj PBMf5Mf6]h(@m^2n6AlҲjpb`|0(2&)3mjA28ܚB]QG`^RfY|2S@0^YZ4է2$*@ AGa@7z2NG#Wd-lɌc1_O2B{Dd̸ 0K,\2aG1[.`a"?L'36`$7U A!Q2â(d(\8(.Apq̨TH2[6XlMfĠ1AA("TmpOdx{=粥~daD5 =l Ef\'d0IPud I24{ֵh Qh:T2 (̨``d2LdFY P`l,6+Ad۲w0 dp ŌM: MkRA%/(JTAp xDdF0 k3AƂ (8V @dF b +4k@ ԡ ($QP[GfdA^ ;5B2Qf`:=NfxRBVwT >Z JX2.a#.BgqA[72u"3 |SdƤfȌ-2C!tY̓:] *=d A Cf̬ +h9[=ʹ" C`.*#XAf >8A39 dĠnjSRc*OVz z1k('@dXC36dC AʗBf1\9Dɴ"3!A'Z2CZ̸:33 !N` ~GN@1}w}8WJ)y=TuY333Y(xrf$fY}QHAG*H 8HE"9N@3tZ`.0^ Ā#:8D\H@ T`@b'za`:v@ ` Z>9Y,ۆu`k$(8LBYl< Lภ \Cć|I :03< "/ nD}EX'כ95ר?c:H2+o 5MPZZ(#Y:`S›gғz&" C TԈ K*+"* @@j;VEJ>MTC_@=,lBx +LAMOs;ԅ%9rBKA:B7 $ + .pD!8p 4Aa#H8H()b0nݰ!"2ߎԵ^++9^12 +OȀ  'fL~>b*N'I-2:[(Z`Ԥ>e{sK88@IQ&^ +pAFZ|Y.Б95 8!B ^9!7 2)A(Wlt ]D[i.^j 05XU;R*֟Y*ࢤ@@c.TP|J$" -WZ~WV=: M$\WSS.Z2Ps)ќb4Mr[>U #|*dp<CJ .\ HbǀbZX *",S">_l;ֱ0=U0Ua7 aex 0ɀ J8.@&b@(q""3T@ +&OxPC>M@V* !ͤ $:O)~WZs."Y@ *8x@G +*pXZ +NdSsJShJE&ie&q}T S"RM!뤎w*N+_V~jr&F'6# mI0%cw3ʰ62#:,܏ Ai!m˜X9Xxdy66ZKqB 2_]kK1"pj. +>a`Xߣ\.ѷSj ܞ%$HTyqR֓uzs t GwisAUԚ]~QW? f8ŀKpsbq'̯|S d +3帥]uW=krlUD=6 5>T1h+<ʻt\P9\j^Fu^EHY1.X1~f=BGIܞTEU2I2O aeqnV-O# +j탚Tֲ]*R&D͓IWf1[9Ď;G +Wx&2޹a]D,6lV EcDt6]'6 EA%X_Pe3.',> 9Hl%WܿnTЌKJcyE(d1O6U.`r a-BT!ԧ3%9 fYjz5pYq?F? j6URm!Ӡ=Ưpx,Jy :@0gYW7Y.6؛HWQvQc:P`fs:L0 K7 +Ui6Op?WuG/kgmWN'9ѱ6jw#t; I?8uVbqZibwd0^Ul+Q,5î+Yvy2d;f@4w-}D{̳%sN~b/Gk &X Jbl&xxཎ{ߩZye]o/~Ut hD2hQZNC)a@|4Nn -Cd9No@5cXÎRg`n`$Dx:KfONݎ!E+5@4Ů6 牎IYl0Vg/ϯ6vtdGi $n(0u/b{D*%1J0<   +U cγ~ߊW]5Mbm#xSe+z0z^$8II CgAN#ɤ*9T,8~5IZY25PȲG_7i%7rIs.ʰ 5<]p1}ƍ2) ψCʕ zK!&SlbbN]`0VkG.8?JnAInBgJmW֯{ lHlaG|Ē#}teԙ tjrjQVo.Nhx|b\l#M-V lǙًP?"8efW>^pܪ0^(X(nVĐZd ]~hYBvnס%M a +MY<) /HB<|4̲[5Y`z63\n'HqEsJZp)G1$% B%Og.ɰ76n"+QfYB9bF4ٱ;Uh۹@h:W!R;0c (XW1e^zOT')$tFTȉ Cl܊/Sp^th-Canh,CH,J0UW9b-g\nK}FʵVJpsfR~8x(/|y~#v) KԀ0^K)oRE_i^x_8&~J T)/>ܢbR 'G53܆\dDCW\o'F+'ְ +FN&~Nk2^(BY@RR@9 €R]elcoECTQ~44tĨ؏"Kn`$H}qF98cT&Vo0[V!F:oYR(d_}Uۊ'4 .Dk +J`d!|JmWkey5I2j%e[k:[1 J *o[j*S4[њ8cb&kMSYVD* 5U0 +`-69&*]G=ۂ%D V0jU`pJm[bϝb5| V+ŎW0v9Gٱ)j_0Jb^LNEyV7[+v/1^- Qby)}ά B_ 5QeDcWۉ2ދ">Fz7Ju 8$dLH3Q6܇qRq1Z,B`p)|Yi+|\ipxX PZEy1;(Y/ XtΤ]KA理hI8MdZ`#nd |D* U2*̓0zA/q3e`; UGRXbj]&RC\a 8Zav@3 :Kip+Mi}qFFҪ[nVܧj,.-hp!t'̮$8)/ 4~3‡*QP ,N'/j98RGַfAH@{:p1|r1Zr`D bh +22-yQEgYb5HjKJAj Qr,"zCpRW"vJXs@2:JA 5Ep 8EE2JG)^ SD- ߱Sm_!G7V.PpMt/Zu.Wn^h(~Xo'I-0ƗbֈXq?w]p)L.,5%Ŗ!TO 4w6G#J-b*H?8ExrZf ᶸdU Y%;xٖ)`!b)/uG40~7/Ug#ņCK؅.`NrJCJY~ qVj#d`p3[g rlrˣ$zWݦYkxq}19w[oF,VDU_Q|B#Tz@fb|&Lfj +fŬo:sa~V=[k.cz0?l +Zg +6>%? Ng%Xge0 q4p%p* (Yv&8.6q4&=B))W,R*o,Ѱ 5\qɒB +3* 4jFpʬ9FI7vWXVJe(tf&H2L?h6@%;~@ &a6)%hb,e t(xz\/Sf$Pu ,8_9Mug#Į1 + EJI`r-8b\t^ZH:Vj9R8\1"08`#Y 0Lp~M!$EF (Ī ^txOghr-NR>![k؄ 4$#8Z 2j=k _̯ZAj%0 ƨ|6*~d.|>A6OǪ 8!QqA_Ȏ'Xx+Wlr:YuYH#(Bi@W& 6Tm!t` x^n&"r":Y +,# Bf<| H+x`K_Iz/Xi~%P%yA(]h0t$@z1ZWb(.IZlLKLJTb@aɓBMӼBREMf_r|&9x _$9%9 U _V\6b~yZ)a'l8oK2KՀ +kC0*Scbx9We+H180Rl"R,Ѯ%aU)r;(Q;=4PY xHQVp~WV@4uQz(JP=ٮ؆(2#.h#9=\$KMpj& ~ +U.Vz)Vk*Xm!~Og*Pg(N- ,I PLHcD@E1 B͒\՚ _՚dV Mj ‹Y|P  1? 4?i +2>cb[lb$/уuV+Xj;PQc@#ƀD&J~P9Ι ˝Ao rsZ@ӔVb'NDˑQr{ي3~Xnn@HHz#9y A`8Ac@0G/Ks@c:a 3SkkFЏzfk 1^HV]T]p⑦T ĎF( ,E#:/$ǠF-A@ҫiXQ Q(N 8raSY"8uva'ҼZ#`A~zLgp!r3]oxHp=J Te)hX=$iu'ANPo j;##BE0t&[>u!Q<*N0%s$/6 +d1(bcɌ 6xU,2X d@ z+ #/0Ѯ: +?qn=(zy+ # !tPtr#K.:Mf#ç 60!(Nbsth6]~"@4cF‡b6#Fr!d"CyZo\v /Ip:=P@ysˎbH֢hŖ3(.thv.,詢 zu_})-G=5>u,ge؉s  +) fbHTc \f.?i d(Nq(؝Kl)[o-Fad @Hy9boЉ"^)p†(# f~hAP0~-mb&&9NCM6 L@2vmcH +PД!20$v&-0G-NeyĞ.NhM۽$t2`~ /",',- :>QU:  Ɂ"K"6 oqzu P׍ _=ЉS9738JCYL{D 1SBOj|\`j#|Uk*0|J h54z%V +6En->g F?7rO_}$G2k-1)%E+JY 4?]p*0I +CѻAa&EKZ3)JjXUucoArr{Nrp47񳢻 f(jSaī9 +aUۊa[_gJC !_W}EpCf z,d$1!zG!zk=0l[nE;*%Uoq#(GX<]n(Ͱ;O*_br5îzx23,74=^n D^穖yzTޙe8fU)sEYq*k1zsQzKica?INqisioI*`D! +HMgiĨ%k}DǕ$_T:b[Ls?r‡M])>y,BWj,^"XObCw#xZt8WjE1ʾgEE;vGE(_ ˣ麋ɪ(]$BVA d(!GXMdjJH?X>U%Jr 1Vnp\bJacmO|+x.xTY  dD}Duaz#|:HZITTTLTk#* 8A :Jr6.~q <}^AˣTXXj9nx7Lu+ajRy9V,w&Xc<;q$m'bûz5<1ib~bۮT+ß | +5Ie ,lrzGd2\iY̦x-,j'/BMBRE.DHsY&:Ƈa0\n*Yno~$q7Nnu?X/8{8N98q=5 +چ#Uߩ+Qgz1[p#z>PQux&YFb,Qï~?bx8ߋV4~E4<)@ aIҋAIbyi_N]u7Ab3)2N'7:F/ʮb5Yy }5S]mEcz]]pwM]QADpEmXoԎ3бۡ/1 + ͖ۇ-zqJ6LXYR>9yuj!g /LRY1j7Os]"["Vۊa r,ߓpQGyZB:;j1oiW_!gh-b*n(#/| V}P>I rP#t>ir,<[oxFdz!M,~r IrVjg&Qjǰ;yHb~kgi)xd} r4Ybp;U7#v?bQf'̢F:ZSV63;d=8E4"Dzks!Bsqk05Xx@jgZ$Z"ԙEI0}-YSG[Gۖbr/TyMW88)+!Q2Fp/4:Sn-AvjP.e ;l3LNuͪV%ѴU2s]m J$s0w 2q%}qyXgϜQS8 fh8"Ufv%DZ|sMhd=J.r #i9.g~C)5r_/DiDfDqUΙM89Xk*xvڮ}ߘiVaOZ6T4$ f:ñPLOr8u64 +ݒ @UXi~/˲~&ɦCf~=wztoj\!1ݗY&F3hMah>%GeI(#/{渨M̮2*eycIiێU4w.*,:G O~ So1b8v_&~YmıSN(%X2%K?pc|i9K\^7l0s>giFSwFHƐJvc,!|o;mt8]uS!cfce= 2;u^xl +PYݐ~:Lm˖cxL90*9~'y]yI}49tA'+KZls#24>yB}hUN$Zhph4|jH٠J!vU9E;Fl,4`o;4(nfwH\)!2;M(ڪ v'Iif>PʮVn0ulu4Q8 CNwi +o9[\*yֵ?鶛IvMM@KFcimqom=ŶRM'ݗ"QPl. Abh?=7ԕe5t专bXOL0tg S=ע$}5]F.VI)Y14  U_R'|e F-}=4FVBvmF5a4{kwb1nZhU8|7߲PƲ +f|lpUqhLs63^sXR5g5|qf5^z VL:M܉м ;MY\ϩ{ |N]K*OVFP6R쮨߫wZo~$phͨ֌ƒKŽrbI ? s*ÕM﹠-Z lZݏJ@: ˲|wV4M\ j7|fwI\4J5H5G۴̩ `:m#AF2JfӔ5fwK>hps~@$5^ZUE5Vꆶe4~5Z]Q(EF i3Lr:v\Q$PRtXY =WLUjMe$k q2Fx0-.$}Rt\qڎsZu];[v'Lh> +QNnqj,4״P~k6Z8esXGm?Pܮ|,uL)ڍ]M;'! W8KrF ޔ`j67fIu˝y{f)̎GNwie~"瘍gzf[^z . iBB}v3{?=TTf泬R Bs6˶jM%V gXZ3 .޳ x)6^YyMӜGN.Nz7] i& w5ұ4 Ǽ`y8_/ 'y۰:RQԳ l0p H,s1I?T(::ǝ rLw>[VWŲZt_yU m:5nWW|P7~Imè#Bs1H?fjwUl{7.zfj5TxOL?(N9jVNcj51EkDrV^ݒm5Twj523j~lMQ.sAYЙ .7B$d9 cA 4zxMNF Zn4s;T>톲j6„%f{v3S/KdvC]NN4Iͳ;U-Y=7\T:nnYodOғ etVEhne߭Y'8v E|MjH^#mG-3>& hE@2&)5mk ̮g^V#J={zϷ)-^4Y2kF붎sZ.O>ٳ ճ xp:%GɞFuFZm!;;qfV6Uћ?1~Tm{h]'/K3zFgCVp"7RYjxO^>pQ)f zL3f8w=zoԝ dy<6]+AHzbv%:%UFay/ˮG O\!n52]/^j=_| +[HlD[ٍյPPz.c;u6ly(6~גLeyN4]I[ԊSM,'Nj׀&Q04 Wq_0묆ilhkJ'BhLH>lΦ?i44A[ҫN,r)v~7ԝӸbVyRBˠJFQwn'V*ͰL:=qZ;NrH)<ą0p3^h.:M`jEѤkDe-YA(6;Cx2q%dV#n;**c;Ɛ~:nh[6WR;~ᷖ#Ot4s=[G;K)r;4^cRpj6-K| +/iq9ndҷR=c]3NwZNMYi}M[eSot3JvC=sF#ɧΨkvvqP컮y8wBƱ43MCP{U$kZu7KwMM"<ǽrJkne!:Ul:^'d$CH]]}q+N@etm;n(fii^}jkpmжF dוr#ΒnhkFCJHMs86^נA\V`iK~܌hw`Q@h6Tzfgٝ yb.פ9!m ]{5ۣZ5>*β]7dA$3I>g5~j,xa${brlnȇ釬.GN]žTVM=ʱ|qҸ %JV͖5= +SN4y C3fٸ[F'dfč mr 9xM̆1jvC9nuCBk+ӸY>Ȍ'BYf-t $5G%TV$+ +j[uI}߱  |nqNC𹨡_eԖ둢?۲;2Lf&nm)1>/j5[b;8}ߥ q#DH8 wݖR:̯ݚV61lr{$%zP~Q{kI=gx$t~D@)E͒ѐjqkZU!\L܀^o=q=$gd뮱i׈bwGyuӠaTj6Dzvij6󚦫y;s݌7$ebcddq6!؁"= ZC8ѯ AѪC7<*ANuhzUМFAGhL=gvX]c.30dbHբ@RT8V+J-,N܁=KDamj#!:C4>`odH$@َ5a\kY!1Q륿@Z8pB*ZNE})UaN,WmYg1HH Hn$2MdEQzgW|Yn6RSP|N.uǽ3Tkb`|"vb*8qjWS'2 +2EeT4@ PV +V22 WԄ3mgX#n`%[izzbn$9,¯=;r>W+3͑|| ^UٕV#vg5Ciߵ0[zΣm&r^`8 3N`s /H= [әJUh!tZbV]:qVq(俬Y좳8n",2@ٕ 3=Zk%Eݚ qwY,N[Zv;H-]$έ3Bڇq-)V/N-M)1׫>DK!Snc=UjuAܹ &Z0*nE8©EUbM.bbԼ)M 5㓥bX2 S1X L_ +6Gr;Nh*0z?)i#sSb\ǥr1I*[Zs)n 1OP_b \Rt xW}/ɁIO<|)sJ1=T$dxA+W hH<(Hu2bmyo#jnM'x ekmE$;=^" ̚%I$Y+?b`[Oͧk襶RZi;Zod LT ĨiDOVLPgĦD=T2ErW:]s[Gp٪shZcp:(,$Z}HHI  [`qV*ѯ e+QYԒ(l^LUQ(BU8Gí=6cZN)AՁ沊})w Όl=z Vf ^ Bz?$WYG 2Jy!x*1xA uHt|@Ǐ$Z`XI}!2?bH%a-Uq#D-5gvBk_+-y]UuL} [ +[1BB b,aTo"J*3M Rch3WjG3[ĿWZ4}S(5gdU'1_4'F%H%I:!vRS@Ơ% V4z5̦.5R_}u $Ɂ"rj}Tx_ZEpL‘ j`mdf~1,a5̇$ ^1 2#r!TBOp)2BiUvn斌UҜ\Kq5M}4~ߓ/B +/0H<;,Z 0Vap)ZZs1`:zTg:dE JqO,y7ѐb{(_^Vng c0ʎWE_3y RD:/XN3"0D6g, +~ +᫖~v͖ըV2a`k1?уE7 YÍÍĸVT@q/ͱS'1)?KYuL9S<`()Jg0e%Gdz(b,0Zo}tQBG&/sf i#b=P-BaD1;*ƭ<(%P* NZ pDcp9Q=h%(ѓMyfAWnh|TI( ^a&!PmAڤݲ]UԷm\}CZ 4PgԚ饆bYcxAj +2Q(Az! CHI 䙥˂X|Z/=e'i\BJ[Jk1I\nIu뗺j5r*~hVa >snUl@j-m{2Yf@Rl 9H*3 aa8_T_fpëmeEcs !Dz@iB P/N,T$Ϫ2֜gv][cd|ǙnxR0k}oVo:Ѱ-lgW-=$&MUf9Ob!v88QAr`ybG8ըA4wߒYbۉsnSWyN([1Oq'+qoC8ݙ g}a޴ sJCjr[Zgll^Za+*8fǎW oOlE)vT?B3>.0a:{^Z/v$1C©~iǥ2* u{$}Ǚ:1=߉x"!2܊n׉^9FgQ;Tf006֙rarNQ`[4I/\ +2zIzm^܊ѣܰPlVfRܯɎ;Bq*iVy֫7U-9BbRX|0`f>ɲ.3b[Z8J,pZw"s뜂v?ܶ8k\y{Xl [yɪ8?D#b4׭3, Aӻ1jla\b:D`g$ (W$> 2Fm3@(ʮ36SffȆStܶ۶ epm;Ѳ9Ī|2ϖZ g18аYe"' J_DMn]é +d'Ce 4Sdd'ɮ*d,;d^næ(.ЫURx F\m |Oix̸rC +DzVɬ3bːVA%~Ҫ &t?7n(~'I䀩,s'Y /#XTfa&(PٕF"giXAg2Pr%؎]{[*XH/~ PqS "3̍%-=N1|KxUc:QoUO=:F'ʧ !  +$Ea&H< +H)nfH]%=r@/Q0IX-{U\?fx ^On~|#xoj5\یz{218Vd)>p~i߄~sQ߳n!ag0M1 4Km=Ve0$~|10F~y~Th[iW;錂~nPS[ :% F@nt3-2Gj +[x`c܂0Leb/ծ0N[K`Uv 7Ӆ9"p}IXQݓК1{<L E)Ū#d'*@1G B(>H*͵˞EØ$"+cbijMS_jHBm>Qs +r u~%!7xMہU}E z%\ղ{3nRJ\S>A +f 1jn"$j(DxEVOxqa+J*&+:2^Lo뺏ѷ nLOGFb{EnR* 1q.R• O3 cq~a +aTBRJB [ۅ R`O/E>}|گړ{fuT횎y-]U[f7jef|ga~T^k.ˬ5R!.*LNbdI3b~ERIAi20DbEnqv(K/"\ٜב\{ڰ{ DOh0yQC_%x]uK0)̭-V)[ n{R\U|hQ$~f4Xb7Ii6I;Vr %J J=bo.v €Y1"Y TZHf:7Ďݨ^t,I=Ď9TbvԪ;ӰM˖#שٷU-2L-$E_ jFW SUsXGZ'\e ^p+RK|S>}o_8)8>۟ڳH%=-lx^z `2Jn +6K[u?Ur +DI5EB5׉A?mQU"bsQ,{/LAqVYVgBUd :Xf"ͪJm!AKLw Β\D魂:p 1l6|g,HTj/P.NgVr>ܶ\O[ΙE>kG݇jr+.e((_`k"~He R^7b9灄r8N*'MH+v_۲)ɒYXBh&8jHJݫDj;߃Ql;mi9"w2{/lP4wcNdPx]ʦJp INV=,Uh?#~Eq <"u <"EO)~2K>ms^{t[D@j=_*B@c*jNtѳ i<7բNmZݦڭ;YEXs4T-4rNj=\u'Cak'h 6I%5gA:Ou>8]㫆q*>.~/-/gb#Yf5vgYd Wfu0䶠AG &DQLOhS|Zp+ kap=/FMfI;PP;.nԞn4~P݊q-$gbm(N-2ջ;4FĊu ؽ\osK3ἌR +jr 6At #j 0d ulV#ݪGhyN@Zkh7DۏT˅%uEA츠gv|f5=t>)w nP + қ‹\ R/EYn(|RueڷH5OWf(P*Ln(}~ I\/r$tf/[nO2Ӂpq:^am~VM& =[lbb4X]mkDJnsuF=Tq +R/2j  saf0XFVm3]o(Ui1Uk&xPcp{HT`LP nh@.G$#WxȴzӂW6Ǫ'wH1.Wz'f1K3[E fr sCI)L/Kcz+ EsnwTEBefRCyrZi>*4_ЕZ'ӻD0 +~Rj[TK R(԰?f;u&,wp.7nӅ]箎}0%v_H7Z$NF1MkDfZ3fo4S4 ;JXu㤆&JDj*=iKvo  iCE'9~5N^ H^CR <ҲyeE9 744)I?r; NN'j^%Nm9dWmmK[5` x~@Z@OΓkOd} +c,pdhھ(oSF='5԰5ݾVfnxOp=3"iY"gEF?:9ǂ|/,V1m72*=7@{ _X\mg7\<1ĨRZ7H5AYai=HK9]Q\o$8K^i116cXu"XBCiߢ 5o9lVgje ߕxO#s𼇠caFV XxZ!HV8e(hxXc.vI^u\ZvGL+j(~R+_JvR셱jM$V5][NMה.WdPZ/%TvG%DFc)=״J:ĪFZĶ,ĦE  k_ Nc|xB .Nt ΙUǑaZyYzSv:A }a|\OZ{6^筟jKѣFBsup/Hf>+jf/ɬ {J.CH5 %UɒCΖlL5:&A;"՚8JJ]n&ͭ73V9_aWF:ӦSrۅ &U|A3/npX}EٵBueIA"> b %1Y tFWˆ%p\0Ps 8Dm9Os)5X:3eӜfqJ@;'s6ߍVtNIx!84v1ۮ\6]MNʍH0 +'Q%IpAbe '\!x\.#-j ]uX:[l>d)gHZz<(,Uqgqrf=SPӐ.Fņca3~Zo*zKe&x&vn"F0ЏDY*q;J&ێΡ+ ry-P{d*Faf( +~f?r#%Kѫ,y5G]m%xpo9) #f&,3!̖ݮ@`6Q$[p9,Cn,?VOUcDfXq5m}q9ϣ݈׳y,ׁ]zq{,y/Ȳ_xik'VZ'X:̢EA GV<}Fr[m{=״/U b%ɵ G}u֫007&vV|y}눀w20|+?JY0#zKGL h=7ۖ\Ԝ 6BbJ `'z>& +\P\^z}әu5HrK@0c&'VkT< "FڅRRa@kP3Kr"kQl']w5h/f:dVۋU #򺎫"j} 0/R[ Vך0|!Ce`E-ZM +4- 5J8Zn$h"t1ΰc*{T4<H!Ñr+g:׭ =ElA( T\ά+J?NZ܏*LY1)PE!8޸t{(JIYf@+BǩL:LP;PR\$̂2@F%#5/#.eHfRjr7O:QEմ%魇n䷗׭U3Em Rb|Y:0Ixb0#5^d4 7g'L/\t;#]u~-eiL3\1*o#U7I?q~Q[naiUYIQM%gњ#齖@t>V20x?֦gp3I)H^ǜ*,OhbS K󋷡YpHF7 r%ۭݴjWf}'q17t"U2k-E v… >T_6 .WyZc4_ӂ[Q2NrU<'yek*7GVrC)ۮֻ4I+؞Ԫ0r^kEy?HҰ Zj2\^Ź=A,0pbv ++>fN =@BeAxRU]j2Ͱz(2 !L+Sudg-'m]}lxXazh^!i:=\7%\!а 7>kMEoHfl:QrW\NZk)NJ .j /I-bEr0Lq M($2yP7nr&|Qe6' +8C68RC+93m 5G ư 0? +7I@)F[ +!';.Fo[mpn#|Md,O%w|մ_)c}oYٯwuQR Vx!6 OD9 )Ȭ@AQ0p+zWmrNR` %zKd'|RfAHI_̓Wb}XԒEFeʌ_:Y9QxbJI oO%T&wf)f}qkݲ6N=)r$U㷣vZ}A9=_h12%6t8ʵ?iֻeߜ-Jۊ譏'zL\p,|GsN5 (}2]_h'ʯ"wP[nh5Wcuk{*bT/R) 0ke)=˩z0]p*[u=%I~ư X]H7o8]u/禆u9ΰTGPѓ9m˱Z b?Z +ZxJd1Yi:R[ק'Q1o)bkhY r(2Xd6QpUcf}cDJmӭoID|#؛J.Uf!jLlR{2Qj1efV&bl%~Vi&0Ƭ5H.(^3Mtq bn<テAg%P2Xm+x^fxc -A? M +S˔<̈́&L-8EKր%>@hd\m"I0;4Ep 4@k +\ ^8\t EfA_9E xu| 2P0=,7 +X1bO!rw!O[p'F+7 /rH3`)xZf|nrWC;| +*Ev7PXuz"e3EXBt ^@!H.4WYݠr]qIfno0\oCl9$tk|f2<̶\W!-xai)?' pFg~5 jX^X=yeu/Ft\_e'qn9'b^+0aW[PGJr('+Cm!V=E;!LS)V*zx{c9m6 = ,A 3گ$VJ (=F_QȬOBAk:#Pv4L)\g6I5fSмSPWV[ +6Ok.D$ +ZETf$u6JKEߡ]^;2Ks}$!\TZG +& cCZQ e{~3Z篎~ q +Vv-/Rc;7br9G9cE kY41~h=닆OCM0\kE°: ߘP>ݪH!I Sj?Q+i-DHnE+9Êu_o!+$W4j`{ LKޡb QrD*.{MjbAn(z߲4U`FB2|W^{MCC x,sL.#r'X1@5ja.!fM[W̢|vBT@Dhk&ydH8&D(qh{NmM|;WH?o/(p-qF9vK!\an=V}54˦ }y-:N-۴x=ۓ~ +nɖ58'?'F?_~4 t͇jq10SMu]N];ISQ1iB07]ln`^޷!\Y~*6cI0/x^m2at>bù0pHn~݆H *AhQ֤\s^(ian}0.ؾԖJ^*~ٓ Ɠ3]i~KmduE+?k@v7N4ыGZKJ#QC[tiWہXDM̎ ZR9 +fca{aۊ"}{i-[$7ŖɅa`irZCI59v6 ,֩t[Xљ>o%Ĭ +2 mE9ۻsEeMI nrҵqޒ$5@5`:OIZPnckMZ?VqD){Lυ rbiRDo}%В呞ݔ⦂Z-YUa_oE)2^8E9\Jq*ZW5v\#*zQ&>§6izvܔٝ I"rM oJ~$@q͏s>H+jgFn{5Q 1 /Fj \F\q-j=bbܧ~2[i088+]G~íר\2:6Ib;Xer3VeME鼰~C!"~-Z}u_lt5﫛7?gi~K +rq٭z?~<^# ǃ?b(`ғeAXxdʞぞw]ꦛrz"7~=qd8fUEea8$]kǡyNw >z[gSO)2Zӑٌʨ 4Ca7lӭ9Yj$F<ڎӴHd옛J*6:az`6"[hmhȌWnpX Sdz0::F+Ou2~r6[ՇnRVf=].4%їZQkUK*@@Vi%,7' +}ێ[1V\"Q9߫,14Ϳq=p^H +ݟ+mF fFBQ*6whƴ5EĎCA}ZDla8I2cjydgtW>i~M^1O[;rM8]Kfsܬ۟hLRBkro@Hcm$/NP)$%ĵV\ ybMCi<\,4V0x4( d@ZcWZ1ji4|on#bO~ŧ$W +UbB@Ⱦ!כG=#$.OTg'f*^Zp-[og^H}Q;_eދn%/D Vgv˄$:2s,"a}D!K%ؼ)#MXQ{_~{:J%@?lojsY7\y*.úD.J<Y0:I@:hhD~\\\ZfeXȑElw0L/è2)Zu͸ E~GWb!@AU&[*"eE;RT-Y2QrI + =wC/5B*n̪lY獐y!e#VX\0F0RI2zRQVZf)rϨ*^35WN1iՠZ F+2ӻw!#x Lo՟f&R+5 Uq@}SPyxN +yCml3[vm?,x͘-ӑp⦵=Tdؐ]0աI[iX(,!مf! r =2/ʤF^kјxUۏW},`Rh(bp@@-H212ÆPIY9AmNf@Cg:K~lo[0(Q,RD)'28A '8*` Rb QE J^zC*Z's[v"b(.i]i=,֩Cak.i$&'.+ +Db„c +T/C6U|,V8i~M`8{dE +endstream endobj 14 0 obj <>stream +ƭ4cFqMc 9 $5x̶<#v>j_a㢣౪੪w)*Èdwu#=%(*=W4'|>Z[l!(&@f0ڀ/^E)f ~d+C!~1LhFA ސ/r!Ʈ:UiL В% r7@jS)0^oa#8u7!8$1h7)Co]m)ɯF`.zfazx V=F/L_DyEEhFH\ "r{za<2ܧ0 rJnaFDIى.) 6EeH)7 B["}Oy%#32Pi`3No>0G{@S%)NŨG1䂳yB+E!Hq3 A +;f /; (47Pefd{ʯJ-)`D_k$1< ۊ`U[,$,%yAHZؽ [ 5=Yl:tNe(mB;zXj J`X hn]@tρ>9;Be1V/%T/Awj[!T &@x1z^~B60@|Ĺ#V=q%X|$I]J$̺@EWEO6 +185Cm%Q0``wy3N@:SgvB\(zWl%zSh$xn߻+x혈*W D #ݤe'BX1GћpCFAК"3D.8E-:&2/[srJ-F*QlM,\!g}BNYR1  D,"' N鵯,XO$9wi;гye%h)yf鶃98H'Ɏq(mg͇A@$C ,Rk1nDg*+)]严VtF|.˔#v^E9kQ~ݫ$n&Jh݃D@=b-?VHbmǹkR@VA +p1`n^aH!rey4~z%[VlW c93Zu R4T|z.h;R4b09{m?>DN] ۄ3'9?.L0)-=T'ڏLۑw:3‡E'1VH,~UjMH}PRO {cfAfJ SهQ r`e*WHp|7Ns+\ 'S kGAT$X=O@"( .tvYXl2Ym,/?*C)LcHY^yy9 .Bh@\!v$Ʊ86*t!Wr!C ZF5)<7AHQJCOVRbBR; BEO +U/p$Oj!jbR@bu%CRp)5-Bq V lfΆqQJ#5-L&YtpLdc}X.DYKMDHSk)R\o-J%RE( l|z-Ym!xT@Zm2.Y2"C2Pc~FqsugcMSY#E0KYeXcV'cSL`eDVM|s;Qjq+ZfRJyk6no9VmaX}CT NTӨade /7]m.zؐR8'x88Wj8qGjփTE)ju>):n (Uc~3 +.G:Um)v'ư?G +ߙb=8ء2Q%ɱSlBێiU@jpGخ sY~5˱_iK t0| =0yбϏIOC'(W  +U]Nr{" na-AOmI ՚PT +DQ1xJbߖ(>,?<] 8f9 @-èe(VM1dsjoySAb[X:[9jMyB+YSïryxWx]pR{ug 85{e '8 1?Tb1rZc[  [ts}kvv-ބp >>qf^JeUӷD<0> i.B#zNmb =fΗйr#S&GfWe3!A>qBիH%8^0V`VE 4rb4pƊph9SbkAX+6CB2Ib\o$WGnn R>ViVsd4ѷϹ3qufa VY3`RqH+.67|%r,+_lHftV,tEx,O 1Oe^h#zW-eAϗK;^~&XbLAiRsT0Sw3d5` ߖ +#tPlVն1-PmzlX2+IfHֶؔkQ4OA,s%6.HOU 妊tkyo,oc| ѫ{z݈[zOe"yiK_,yx1Vl'+ eX+j9"7[sx ,Rh/tҀQq]64BՒt#,5 r0>OɬL +⬊`~1zz8wfEy|oZ,zܥ%w"CA*2 n0~cchNde2rP:?W(Ҋl9wv˞ fיHzY_{A4uh֭JZ燊m=Yَ.̱; s bR5_SYʒk{0G@`QzNH7ZGV4W+Q G˥A'a(h5ǩv-BDj b^M5׫Ae7!3\M˃#$U4߉Pt0~lv>tgCV+vN*yyDNYdػ 6~LIDt^;T JD;QseNj9]VjK(?CBhÛ=PܩE$$C|৪T7ű G)I2jsYG9!G +Qሪ'$+"K")ԃ{nz>U`iJbh.ثqV {sAi=ذ2G.į5ܿbSb8QYSkJ \8 (0l|#SfDanYIKbp@Q]KnQŤL8$ i *eUUyXf|4ׯ82[rz) +,x%ۍ{ #1XT8A}YMa.+"/#"*BDW:IU9j3V"y?[nZ)v՛BmRC'$?Uˆ+ H_P,$]1m"+(VҔWŔV+UCoI ڄT[,ll,fE䑥3+I+;A=Ðc͋@%xY_8,0:L~D]kX Jan=T15$ Vc%f2W8 +%ω+kdxZRN/&'(#&*$&)-kW5 RbqrE[ՌmH_ et]ڎx.1+A2DK)hfɈ+# ;)pIE.YuB`4lYԻbXObo\pQ}6L4yQ +  +P`ٔQ¬mڜ)e*%%% (Mݮ<(xͦ9V?Wi"1/sT RP[$!|9 +`HВp$C.E0iDIIG).,0-02Է]~.I1KpT(WxGkJ$ )R'hC3hi5mrgIJ4[LO2TOR+,,V ԗEJ3qv,p}O~n<]JT.X[O&dS xtbBagL%d YhU%JiYӅNRc)B2\8 +lkM[la!;~^P*hĀ3Rim`QF?4a#'&֕WV9$vf;ETOCF)A %, Ӏ  A Ɛ8MfYДT5_)}qqYn t=e[у%WrũWbkś%vRtHSm(2@|L$@Sx,²lkQ1@AG +z$aN[tm6%mmŠ"yQC;~if$/r,52=%j )qp4HF +YpxCRk |%܉+Q-Б1eGY[l0 jjEyS`4HPXRd`Z1)" +pl1$ (P$sW#ڛysZȣ8g͖lbHEPfhCcW`,aT8#(d8!' +hv 8)@l"mZfLBBBYttd,{'YU(VZjw^ ``㌄%ۘ* @EbSxX:_*󄘵NSI(GOS$)_ ;Yk'Ѯ2{ +ē3zHЎt00e +NJ WpXbNeCֵ9B&PGB+-8ezFbA_4gfŀ+ 8LD@-)i |X@hsJGдM_SO8P(rE& Nc)ŗ t2DMcZ5) LHRS lYJf;S+tN +/JT{)4ذ8A,&`X3L5պȂf_xU.o -6E ;BLn[@H4YHT7CUbPYLVtUjgF^ +"`a.Jp`8ż\^*Ln睧WJm7&,-THNJ6H +A͊ቋ' Nj 'FuAzn_LA\\!%+(WU@ΰ>k}2MĪObX!C-+Ȫ8Pc#~:aQZ@,\V/Lʫ:E6 +}S]d;q6434%}b}e+Z)u+P@;*T PH̰` +û` +sIMoo!%1-Vivb^NZA) l-I%XPd7#k[c"I& 1)"*j=eƽo+ٲNȲ JK7Ք񋪊&ecEQj7% TzIl骔r5UBS@ bXJBepa\W!WQ)OL#]"rW 6ꦟ\%[3bMk;m%iӸZ8~+$&fD^ ^=9yGIe3l]ry'.zg)TE7,ju5A&F +^mJSap*\t=L^xij$%4d"W$uZnjp]F}zPeJY ^u]P<')љt^$txbaTL9Q_]穯8ʫ+TiǬ UוXuwc4*C^"!|F3IY1/75%$l"$5}aYUa,s LeֻӒ?4G +},}̢@5nN&UŒrH"B`lj^]2`A-\&(=+8S"B^4Y+4RYͻKe7%՜;**rA5w2 Z"àD4}%MF6.#08ٰ S*I|C4sDe*r߃|tB]9-M:5%uFY'7I6R _j;S{ +2gK0'pOjkk{ˉb3FMF[.1i64;b R2qZ2 Q{~̐2?R~/4JKAS,'K*rROmSFm|Or h} 9 ie%)PRلuHN]͍QKm>+!ds+tR!ۜWw^}㉂!9~ vbt$-Z_j{ĩYgmg?* +]reMk;?Doet +bۥv#5[2FzˀkSE6}LI_bۗ?_qvܞلu +5&F{[[=,PagV,NN:˗,#ݙm$ 8>JZߥu,{盓$Y +*a"az +Sw9۶gJPboQ،lߑT +~zk_+w]"*{NC+# nAM6eK$fVv +bsXY*&y0KcF':A_f1Q^U귦i?!tj_DΤ[m3Ta|rbmFFc7#1QY },)VCV+ͯBZ{Ea֊Yr-ח[[*whm"[Ԃ۰yKU Ăzd{jbZT댨v'#5_=Qޅ7mE%&yςزK_o$41s*j˫5]>Oha7l{sʜC^5ꖻx6uyП^LfU;A~9*P8CTkUg fI]5ꃾ7W얚" b]+uv̢Z\T~z0R\@2hGH:&b skqz龫ԖZ^tviQUn!{ƕ揙R/uzb`(7MQj/%=RDO;A׳>7" /Imh-a8/Q\Ԗv5"Vw!b3ߎ3NU|ܞۘOU,e8կ3)@QH"rPfHÅ筄x݊H7~ᤲ\ 5\k4V]gH-XJcaŠ2#InͰ?:nv͍>biRF;䎩!a5ܹMet!PuFH0HÌIiօ3S.3(UqەR :ӫ\5sk`8?.4 .Xf1zcp G6B痮̒@+̈́65ǁTO펱IЖAbdMKa)&r̖;cvj@w_Yk C"˱vYu|GoMƭ4D)2I5w`CłR?bj)U ZHKY+{ }G"Bߍ[O_tf̞ݎ\ڔk~C^W J= ڊvJ FULfz'v ܊V!1ۖL!*ׅ\V|%ornӮ ȧכH@Rm&33ȋfSzH&;d\r(P.s}*#y'Z(hK Er[1ٮt#3\P #ri9԰I G9ۗWM8(I!1 u )}O;Q: +uxȫy +c(b(ֶsJFd8cƧE?TPoED6E*"*y)NxHj=#*摒ۊѵ= *Z0Z ]*Z^W'qb|/@vY)K5|牪1J]DH)ݯ":T<Թh ld~SJ_B'נ6IMlZtRԽ*ǪlDJ>BG7d,*_h:X-4I7 4,͘-ߛZx5U2x=۫ݩ] @A:p=aЀT2h5bnݗ; J1B 6w Ћm vӱ~׎qr+nflI#vՠA`4A&Jnɐ"Zs2!(>iTXg*ҤR8{\ :)QIapИٱ > Bal=0 L:Ħ@,W5*킽bLZ ,Nn)N+mk#vlɠ0֋הX&L. +R`:Us+)cZHv*‘25-s +WdzK/hkLb ݚqSBdrwg I@Ae:P=3Z[_g3/t 4@Ts 7[rK~ ^u+X Wk٪۵' {Sq](5e`7hVr52i^X@nؚv zuBDnųBe=2J@--4T+m#b(&$2K}=c˩~st]}-=7A+g:ejmXگE*`:l-%ZsF]kQrQ(o#J.6ƪ94Demǹ9$ORkHZcSg4O Olf}cfz%Yo&xMm-@c'x<0)W$F.*UيXZ^j0ouズdqB>dqT-Ϣ74ƻr@zu;*ƳX,Ea?+9&$qc'7f)P=m؜-Ub}'2= [QTNk.rb J{~ruʌ%*O7Tf#:Ii1Q&ݣإ֓+Y?#a +USbDiuCR4!d aLK3m1$5QHܴL SV%G2 b%> P +NgAK2))F6R;Cr:W%K`5SA"ƈ u`#:QZa_h/[gl t+1HUf$e;T0.yN["~Jm S[ PW[%Opr"R!*ޠFs-~Xm(~Mm{Wo[K$5WieO^W|,>PhlU\E%_a4Jg=0zq1R0x]/O%iUCRn`xbm'0&n8ׯMUlEĪ>ۊ zr-(E~rSn: ;ق5iؙIJ>3*ñ6U/O(J*JMH>Nd*R-5ђq ")]kEj$:WetL#I/)>>*y|Q2?ߺ I :QakDV7]͓l癎2VdLw%7%!^-*Db0L0 Ƨ v @l4z%Ӫ@_4iֻ +fĞU{.i]gO5/TbN "\0O\` G~3QwM0t;e/ I\l0Vh%Ŭ.P&G_s! Ǹkڲe#}sM `9P+ܵM&Ig iij:0%ǴAF + 0 ,F\cf*s!G mbec9ݹhQ0BFz'(WZxzp3)R{z֯Xz%`!ČKQ-A|xB#)5C3%ܲ;(A`D:Ch.p)zZb15ZN`~ۯ3Id`*p"fHw}e=bz{0W1tgX=JoFW +5%Qefʬ' k{@ =L^f:R14*9D/=Kdc[cAX7㸾@]:Z?e8DY2^XI^m/p!Z;`:Jŕ>`L'ͤ3 +ժ#I&aF a&ɭ7yfl q>RZl«4ĩ2(3^t'pc{ &9V+nr>\y]( bsS,O#A9ٱ)RR#Cb6iat`t_ѳR1Jy"Tڃ؅JM86Inacn-ZoݲBخ%gJA$ + Ԓ\8k؛5K 噅FB[A.\ +QJ51l h1*- UBIHJDJ4jJ!5+f(|bmwŒE8)+`hv>Y !C\ Ŗ%l~ $\&H^_e'0[!VP{Ȫyg'NoB54nyt 1R^\XTfQĩC)5qV0ZWg<,4P]lԒB]t&Uم +>QYhh+H(]dogtbn2ͧ5sKw\< x`ρj>iNDR0*ԩA~h^ Gً*9e3QzOQvR{q~3үzJe~h֊k"+@Xu :[Zt< 9 24C d@D )J b +!FӋa'|$EӀ ">(d0@:I SD՚*,^+F&S `QMd  o`CX #[D[cd@ +` p[0sZp1>-@2c %%hb=¤:obtOTOm/sKfO:FYfîĚ*Qhbn"+INDA8fb8F. JWP_!uV 5Jp;JŶ2:R-;m5 붊un{_ժ^Chs4ҰiW VJkZ,ܟ%d6gFUJwf޺Q[ֿ4l/Ye'qI0lco,RdUW{'21ׯ)K 4ܱ/7kwo^|tw^}f߉)Sse[s Z%K^XlW[qi +ۄ*EFJ"u`ښד,XgL3k Ďtf{ S\b mY,pBuĪB8];(n(@[WDԙ",Wr,cU%b|Sl vBeNt9. OWCIdꅠENBxzz?@B]FNP&1P ?/O(ʮ +Z_ L|LȀiZ`GSc g:}70| h0LWL8IY '˹a:K DrBX@ d(&9/PA-)U` <Ө3Ӱd Q3HS+I>Cgv.:ˡ!{qah,L0%XL 'B"czqr(+Vl|Kp =Fl 7P,>JRt/SdG905XpBOeVBG FMhUi+'pS%GRyT,<*lΨ 3$hS..v,kඓsQ|s906-@_Oͪmi| +n<~L#s覡Ś } uS`ԌϩKsEo#vNh}<(H~f=ٰbw==(2 +*\6cP]EDF#VWdB(~ud1Eh#AvlBuB@mf6-wkYtKkVt]n6- 4~jm U =eLX=9 }f6T\Լ'9=6]1m8y%ς\8v;S\t܇Kao:OuRP!GKm%i4tjێXE[P + u^ 3YltT^}1!Ĩg7'UQq+3.I^k]# qb / C0i2Ns){;̮fy 1Wkl~u臌QFʞq,mѢ[p:!j 1c j1gT"[_]DXVtǧ5<*-gDbo1`8c===\e} +R|o^~y d-;bw"Ns P&r(n8eץ$-'^qv0zBhRKvTyt )9ۆ8 vmu@% wܢxf\e9O1K)ٍih<")voA2cyɓøBKM[VjX8`~mwk>:QѸaW=[d{v溞|8UnW5dvF΃*zQuϺN8%ϵ({&_ՠ1?bHiPZ;!!T04x t='cpO9W V3ο Ä&peiPzT=瓪T9݇5!YrxHpLP~&ONJmEϗMn[e`4`E9Χ0v>Bgr"4Ms}ofmFw%WNs=OEo"2Z%S@Nq90ȥod6zJ3XjZiԌƋq*Y J_-G\ץQxnR$A`:ȧ7+{A@z/ir;#fW-#mH<(3 ,Nkf/Es:ϠI@AZ{*̆1{3fQnm:zNFw_(dYBcg sD*/ØuFW xn"ð?!&|iMmA) .Gai,v'ű u둞6/[مB/*7%eX~6զ53כ bAsl?#JcNQ^mC̚E+:.drs0qiz(e׉WI}E L9t@*6 2۱ Mu?*qOk.)-{NhPd46 듖rr6og [܀xᢻq50TJ-0H]iSvCuƢ5{ft4β$ v;`p.|Hql}ձ>'zo)F̆KcN[ݲ tSV2JKV_ +WZs/z`l1z`m;Kv\Ivddk9:^4)92/ B*kX<ɯ/:52æ$(v#yryP?Fvb竍d(ֻ t&E\3.`՜QfX +C +"4sP H84Zk;3Nh@^F <8 +aڋmf@fZyN&Yq O4m:8 {Y@Y ֫u0z㎀r=bn#lJx4~v-Ǽ5ѱzLqlDdقs EÍR|܎5Q18 sa3z^8܍ӵ\ Ar<`b[Y~@?ղZ .3v?)7KvݑItD)Nٮ!2,ˍ=+ 5Qh!n\e\'䮡Td52':z4N=v +UǙc;&v}Mϝk#(wKO .,Pȵ5C70T f5QxIzX_|SQ}fNt59n Ԍ |'\v+뉪6Jq-7Ǟ3ŷ0>X/P1lY=uPSq +$x @Bg>1;<{מBw#= +M:Xsy/bLLf/I^һ8Efbg=G^Ae)).(v<ϵ] 3|~.GOA @:Tg"/JvGպsވ%E`m"E{Ucy5^j!ð2~]eJ́x1or A8̮Cud*ptn  `WsQ+r1ikzΙUa;(mžxS c"}We3i E/X$8s'z}]g7X R&L<|5Pmg} amm.G܈P=Bd(u>Zbg/,W|KܱQL9+̭:Rdhnꇭ*8pA>hQN}!hV 5Wf3~({Nڋ@Bnxbg +^n<|y労l^hdk*WܒK:nۦkh;3IX)55Adv#-qe=lNɧmdH˭ל=i5|uk]hf-G ZZ2_mPr#dJV*YE,& C 7 he=[w +SlK 8_}Rml:P75>8!7ʦC/XpbsI=zHmO]nLXh%Ӆ$ T.0 !~wc}r+0nqȩ:Jsڦb!E^f֚ +4YczdXE~|v'TuI$~;}RMĶ[_8o}V [ +~%87YNyMP7U5Dq1Ks$R^r+QzՁ}$2]2Lo a5~s].նFAn>Q{(KeB )}`MQ]3>6C GCe?ɐ'Sirf9BŖw窭8aZK8u̇bv81_U/7h?ղ֭/ePZt=Mt?zEv|7Q&AM|l8'8tlj$s2˵ΒYfj?l?1Aiz((}7b=q*M);jE) T *{=Zi*x:l'@̓P]ڞ[aj,d.e97uKSlRj6N3-[&zTqWZ t֣<)/r(nάzR +Uȱ^%O|^^koa0^?-e}㱎ٯAd=2K@x(^k:D,z#8O }X-=sq@i{[fcka&H(cZ%j~"H5ѳ@|wv{^5|@vUoLl{ˍrMw6M4/yJ= 2\@XƇ 1|Jk~IfL[߷8_7]P$g @㷞fjEmA R(]O\b{Ȓl'J3qAVk]@Ҽpc4Fڦ:u!D% vc).DsܴjVɇ,ʈ͏bqS[n^Vc;Z04!:s?[Ϋ BصQ?i7X90ƏwxܒQ:FI9m#ǙC!~0D(G`^YGēБ_y"C*6-G$Uc~aJ*|˕ہ&rV=jf:=ok1)2T3{cnӪQ7Oq9ދ:9~XdEoQB(~y_ogg %m~ 9Zj#%ئ$r7NE,\}rb! c{3at Ƈ -[nd1Pbe)~ մ\ tU߻ یXx$bsJ:Nfꅫz H-$'2B.oÁ3ѱ{:3e}r;TjYoĞ=iς.B, ~3Iz(Z^m818:3n'-w%yg=t/byi׬Zx?mɌy.^[M`&;7F +]#fjEyR0v^nlN{ON!.9%=t 1{o:Ud6sfs.%y,%^ӭauС2[^w0#:u^|yp0~z=Aa(Q(;]ۯV:\ne4u5 C;ћR$l)]R +aB*MLkQ,· r E\z$1;XF +CkQYMQdj 1cڏ͒1kѺgew;L7] +0 +B~!jB}2=?h f&j d`@LUp2+ZӁҬD)VD9E$q-z%tRp_΄WqZ0u)7=w`G^_}Nju9 ,OsJ=,6J睟˭(v<_tc{9%ArkR=([ MVʔGϛoAPc.EO0,qkMDV 8rD4t;S~gj@wg]x%;H) +S1 {{Y.Iŏr;qziaW$E z)ɱ}9 W 2J#av fMf0~PpE̦lM:&MJ_m5S/gٵ^wcQN LVh8i d ̈́RM/k *%s Awסr0zbޤXObp @:sY4nb{s/BrF( 4^n3z`﹞fr]v+A(p"<щKr?Frg9zDuVJpkm' kIrĮ~5X]7{ϫ~m-bxUTfrf9r~"D(ۨi,˰(ۭ /7=_0zO'Yqcv^ԼwNn l:$9r:3Z}03Yi0/u=yWVy k5.8~ʨS7C̖Z;ʎododsSݺزf~ƨ{~QU(+qZ[16lؙy!_akP>lds5KEE[.a6U0>[bA(Ζ]/[L*" czњ,}7P 1Mo8TqYJ3KM ~d.B=I ͭ H,*L~Շq>Y]l_tjvMWe@#H c" :e:Q^r ߍS\gӧ!ǯM9xLl6rk!yNEכ[Gj,=w_@@ 2$[^m׃xd9%ot|- JS0Q:StE/EڵܞVz1]1Yi6P^%L3Sdƻ՝Tq6*_pd`RxXoŪÆD|4UjNt 1Ib8R_bWۊrOQM,Qъ'tpv+/K[硒eY[r"u/N%پbT痶]EfwHA^ԺXgfvR\Lqd|+ 2GelPᷠg)ɩڦ{9$E/-Io +2Jp=/:se4t>r oLm4i6Txϩ !fŏ|%-bFxAN~zV^3m7FYxSo=O"{N6SL/GbXeվt~38Vg0< )W FS3oj%{V@A$+&CUN|j= l+yW+!ELav"Uug7R* cBfqSEVŠ;v-SbnR웮ieӹy<[n-xX\?hz?$Il=X; nAglP4tf +Jg<]L=,7W{2@=*Y" !5XcI}'؛й%ڵ&µ*qn9؛16R.4%\Us98^ ,Ne#p#t8X@5Wqga7&{Z-Vf,H A`pSjcQB3r+ѓzB=FqZHfTڎB_i!3K Eo7b- + *EFcjuҖBb2×6A׌㕅s 5 3~ɐB5zr݇'<'DcDQM'зl2;׽ト +PB K)0!˳$/~d ~p,F=w4O߷?0 +3_Tob|KKU\̎" *cAtb0̒~gZs|J}bT=dz3L~Fq~LW\{rq-L -H /Kd"lJ|oZs.)]'VgGTcY2^FlXbvFhe8oSV"g魁F魡) @n^bp2Xi"B/8.85[m-v*t3^(mAK,uOSAʷ0Lc0RUr.LS+5d5@;Jq 9?&[(3'B>:1sNl$ +Rk0 e3ͱL61?/zgbk1";Zp)]sK |]"t~J3,q+e)Z!HAYp3abafaVzMrVڐe JK JcvR$UX0-ίzLS߁@ "<!)U kdQ ۉhf>/~L +0'ԞSnz s^쌺grGD; +3qgv7F5?GKNj-') :u'8SuVa;FIfjEי\K @#ş٢?XZ;HI";#ex} +`|HuhFKE C Gբ@,IRْE\v8Dn BR,$ 70U\kH,Z.Nɖ|OCNY^ԙ W BYJ{W:v(r{^~"-ʱ| yg湑gOuT5#B{vw_u\'1v!UVoJ)wRvlc!fA  $S0`zyz4|_}i{Y~*K]E @v$!MO#H6h]Gljb +nWΓ 0} +-Q,?|Ţ\j8p;afȜe dXBtVlXŐ*~ղT] +a!ʬdHHu?]xKڏjy*9X=T3)ZMy16#݇Q&Fy3RuTt\z_^YQBD#L7 ˡ^W`J`{ sQQPlDq+ʰ>e)DT`<Z$7+ s#-h9*vBDvH*ʬ($tǩ. OA"$V<6 +>bEIƱ~STz7oʼn&ĢIyEXQp57XRb\xIJp&/c!扌B' S<{Ͷ =,:qlOH:ODUڇ(2?-6cx3_n6T-5Bu s ͅJ Ed)VߍuQG9CuMiE +E mIk?.A%R~b6Yl"0aVݒ.vd7Ƕ +<7#lZ)h/辌b  })j(7 D 6G$nL-sjfEڠ0E*B8m]u)X ˣQjg8j$t8 0Bi8N=-@.z#vnxEٵ%@~KB`v؞E aZ2Q@a'ofH(|3oc9罛Ѣ}uބӵ\4EWFbboiBGȱl o]H~W[< ]Ӂ,8! ъ)JjcܪRLf]X=UZ'E F|&zNhEhIza6QI1̟;a 9Um뵭1|)Md-rԚSyһւd0Ryjbxct=lH(|%ykA߀vO1t0 4R@@xbljzZ]8y:cXgAR`@>CQrK# c+SeRi:),jU^ie5çYn5h>/w pT?'SĎ*#1z^Zbo5OqVtGǁYS(ͯ:rlSmeJ-˭'z9v+I1G=υ `,AfLg ew/1>;:V+:N.Dh !Aꐠpz^4HOi&d`_8#F2Wb]yEZJ|אE·E0TE !(fr 1/%07"! >AmD oʌE"tGn)TTNU#zG BI >8=|_m)F0v9W_u=Nd#~O8A &Zxh#f#b#l<.DLw .lb ! W(4ճIÊ7@S^|$L*O)c<0j̡&)fl'NLSMEA !Ɖ ͓ى`ZϚeQ1Zn079E wt6ReFBKc3Deȧ bsKR^j@FHp+ʯz+V1򨢨OR>RQ <@A@A!P!Pd=QXF)C)G(E`QJ}pJ,!Mʟi3\V؉!"b9_ +x٭b,#j-J[uՂTkS0~wP'9$Z)#TFɐ2dT +I*# dFˈQ3*Ad F$H"2$AdJ)#2HFM2"dI*HFʐ R$A樌H mF( r$dI"9*CH12Jd 2*E$Hʑe$Ȩ RF2ȌJQ)ةvea3e2f5d-7abf-418b-8896-77126b9ffdff34a6f45-a93f-41ac-ad55-89c8396591fc-7963.1080262l74.209602371ll +h +WQ48߄QHX6G0 cQ hiy$JT3^kz;`DP+ \Reh5~cLc|`ckԊjzq,,%5fcbf8b5-6c08-496a-a514-94abb7da7fc8a7b8772b-f634-4f15-8e3e-99385410cbba36773637;:p4& QR @jh.$3<,RMP^Ah :H$ԡQ=C¨@"5$5hD0!&ۆeHqQ=j>_ +d4e9733a17-790b-4155-9974-ab7134aec8db8a86fe00-a1fb-4bc7-b33c-5ac48ec7c2b3266.6897323530502960977184ʘ Fp0ODh[v:/8QH +`[K"ؓxFQ[ሀkEd_b%թh|PMe:HZ6P1+Tf,5)i30303۾%$zKbs[#KvЏHGf({gob/.$ +M2񦠔nPx@D +&<8%l&$*L EH X =28&< :Dϻ>rEQ XY'N@jmPgUC+h&a>~MHhJga mF@Z'"qӉ.okF7=ԙ2ĉFSiZIHĵLm01 +=xh&J@0(uD|b@MRGaĔ0 bdm4RڥARrmSZ8Un  7:厵bY+ +]:\ڡe>EJ=,oP筻R uR2Y\BD[+W*:h@RG02 8}eC=w<|wvvznzGsVpPօ*6@F2g" Uc^DCpP:JDss 9aSTҔHGBu˅څ, $iȆ"@8( @  @0 0CA9W:@&I# +,}> ;$RG^܉0sm0:.3*ͨ2i%z$vp-Wb-_uJt1 *s,z x:h3)ӕ}. c'-ntc# ~X.d*uDPBEZy^ʽ5)dha|w코[F[B}DGôv'7jg ْ5?.l—X**2;E<R_-xlҺ'h 9iDxk rsƚ*lͬAj֌Xkt=-@3;T yqmq\:ȣ%!kL~9ҡP~ymB$-|4XtWV3DIHg/q ԟJ-h<5sI9ޯYR _@7krVqsZϝ 3Iu@3Tܜ{OaϮ%$NU8j(oI_0{00T3CgRRyxcz4UN.<4?:Eo# ႝD(nmYGCv)Xe=l~Ƀ,`nd$og7Sd-]d푎HH]g?DCG^Y58&Gu9OnyGZC'7oᾧhP̊{Bv'a8<AJ'hZwƨNJjW'QHk2n&`@DFpc9P!beC3A[scb.uH)*T$Fct4%Z8k "k p&@։b)zw/?T[\՞ڂQcC[7j]6c簢)"$ë"CD4fEuEGhS&[T}Rd ސ=K2ab 42Di޻T0GhY#b1nSSuKNg۹S +n4f )%*Q'IwZ^Q +ȖuՖ;|2E2jvi|IuտOlx>4+Nr9TR8b.К+a#h>f 2x~ 쥙UXsa56}15rYrG~4/X/ْiFkKGɭH+hsU|%MiY cYWJFa,̙ft:vE B+؄UP~A5A9t1ĵ42enmZqkz041V 搨BK}gSC֘ {tYW;Q9mU³qi[[Ž^i8Pv7F)p#4"EGr {0V"Wc˯N|S#Θ Zx(- Ȁ +RWң. %aXꎯ4^eƚBE p,~걕+FCڃJ "|\aB4' + +hCZ ^la{td?/.ƙ0<ן*'_  9[ ]3=3(ewa($nIe%@:ؿ!Vއ% +oo̢C۷l$ +B!X)(fiBM/N @tYpq/Q:ϖd:`0d:RSyѩAg8Vwߙcڨ]ٰP}"B0x`0J5>ҽA3eu?Wg dMBCYliw8pl_X_ +$I Bfs7R) $\Ić耄@uTI\ی."b{{{!#NȤ7U0P5 .[<4LjN n< 7Q4Zɇpܱ:sa7Qo;g X=ml=\0`ɾ`"^j>b:ƽCҚ4P\Jxr/e"J^I>L%Vb $̫e|Dt [BjNAHZyDSօ./38g5^͞FpnyQP&fDgh#1}?ǂY&c־w')Y-(>GA؛RO]5 <\ Ƞ|ꌾ%7lp9*>)ʆD#Ƃd 9یŭd8\LOh`3{cGc3;nIkn~,mа4'{h'F1SpXҽ38',_g׾zxhэxЛ@qWbB1~XS>#"" ɮD8#Z=,E q Py38U g:p6s)[8CaYc^; F+a2:&>{ꯠ*I Yyjs LImv~ z˥AuxX8Jx#p6(9L%z+3CxA-i&06/hel:A@P@h.3a!p'fV E3@d#*E[w%fJd%8S y#mdoF+"7]7#0wuQ LX@dѿKF9%(֛ǸZv 4֌ ^Bs] pUD٤MD^ A? L!l p u@gA;G\P,*i"_`VV,_V#ln;M @!WN[_}e @:p~M]$ʥ 0XZF;DfIA_>5 +:$=뒱XI>Crts,S]8vΌG^l Z 0>ukq TQhsz6RT8y&荓"A[ (XC +2#kjQ( 9`<|:dbPq]HC +Q5zR`*S@\%Z&i߳A?KP#6 $#U08!!jo ';`v80E<19ץ]hlDY^H.$ 9#6/XώjKO剞v|3 K?kz? +d D1hS1̞Te릐|LNew^3hZwE#9n&iibF, ҌhoY~ ʷF>G +(!~`2PO`;95 +֯x L 3L +Duـ[^<ֳrEJuL\ f,LA=OhG _G8`ҋ%2w~5> $;n /B& rzAtgr0IOQi+֮JQ8\鯁Bsf'AxfuaTfV1H6Fm :I+ЕD3({nǟ+"""wQkD66C†iP A*3- "P4@ Yj1]^U1nu}*wy.g+5~SY6Lk13VB E΂ny  dP7Wޜ÷AWu,}s^Eۖ1fgs&#.T}ٲzp<99c-,SA< LR4BM8\ރS @+yh8csDf gcƺ)Sƍ)uz겔440.kl6k`%pz*A)2u2-eAрʻ}9BPpfZ GRyN\H>BNw1ٶA\Wb7U.ƨk/% ! Q>eNT*+99[jYu\QA=b**^ 1҅^bfՕﶷq=/_m a\|L&0;{ak;Q0`fU[p0 ^c_dK=me7Ւ}d3ݘ1 >u_<ׯ] yޒmg[m2[!#ǥ'nծO3qU5g\O]^>YjKgrc~֮Woc5hw߫j\v<[dڵ4U=S07׭T,?fz驟Z_{~=jV[]^c~z>_ zBJ׷f_ژ:G<^&8ԵZ7`vm_vيn<f*eV_p0scU)ip>ꦮmc^,єZUU&ъ##3 Eu몵@;v헳YmھQjWu2kp4`65pHmj8rΆ#wlU.L=*<m[UT 4 ~{U?ep8d`6 ʧ Cw7)A6<}5fLf<3S[fdJe^2]^k>Vv6 u/O{}b|ᐰ?*ץzmVbɮm1-Yr&U!aǘy},[K~l GB`9HKn(rE(Ecb +eI;[eZss_M^%2q=3kp0`EȔSI>rSq&'gƭ5DT!m0ձF˻02L4DžQ\0Y6gߥLQMUeTU \0d'w7=}=y9}חkv_4[u}}7{7{ͦwovgffjjkvkkfno>kwJ~u{k7nLUcfOs^_\]ſL>rno2Lff^el2fMY2·)Sgʾ2ghk/?w{NJ1cɌb̌1bLk55֘ō[jscܸqck7wwm4t]w;2;b)dw3?/fUVfn^_w5U[g٭={2E뾯yUg_]Uװc)IGgmsYqٳNfMb^̚f Zefؙ[V]̚d,~k팙6eJY^וYr}w1/c|e.uoFo8wܒٹgێz\mf'_Z~3kvsy3\ٲm ]7s[__Ͻij._֜e6{3mpv؈.\ضjam7s5JtWq1WZs{}\2WU)tm[mw*[r[mXw[]LwU&nfb-pY1'[~Lq'Ju>pxmjSslmx]UxFV,UV1q~ᐰMFF^g ǣ1SLz~)2rk}z/>^1ugܫ/7j?j+᪷zO[c} +wcglƅY[V͸ֳyenU}!iK[kH\f*ž/:SNVǚp<ե:vRv_ձmsm7oǟrOG]2*S͊1;WkWퟩڷoK:ƞJfgw1sw^?ծ.Y-wuԵ\h엳D$ ;!q2Y$,-h$4#,<$8 eU9Ӏ9DYX"23Qm7qBR`L@ #1aA"ũTY (]013,7Uss <4 t(Ţ9(:hy&W"4(5Sq-g9 Q, g]s1]#-P  Ғ@j,d%CL$<Q04""!Pm",i$p&@D=I$]0%p(b &"4!e<, gr"% rDHTxpȄ`HHy&T4Nr&ʃ9r 9wt--@ +i2&%=Lb@2qfM HMd,DbC!M&p(.@NE㐰("P&њ@ �τ41R("LbE$&}Le,i2gd{E1 P08D"Id2YDXd\L&Di,p(MdQD 5,JT92!X呚hE$ƩXxi&rh(bj(2i h"$5PĬ ə("HUH'&™eM Ly(*gUTD i, dM*5\LeQA, 0Q\`@ +GZ@0@ ;LCI0IHδ<͂V F"9i($LSy`X882Dd409R1Y@N`4D=, @'>reePT$&ȑ&RM @Q)J@YΙ%ȱh<a*yG>Oh\v̞hb %=frU&ej(X&qH"vْm8q8HHi``hah  (z y8 j&0SEQh0C Y$EԦ}:Z5OxH-~416ȸR8dm!(&ڡIw/cl۬}@"5F!pI؂¦ eb?VG$oԡ._Z&4;eǙ]X1+hHcR `>Mkaj@36U5v&N4>L^+wֻ㜝'>?O`7vٞ 3 uu%5JZ@6rxR +hˌ}U:ROϪ5k,-L,6eёF{??'[^+(DrBpm;U{'Rc=u &Cve\'xv &KP"ˈt ;!+ś>3]@XAiZTQ۰Y &iqL9u w:d 6w7;g0 eOc2ncB ,ZzlxV ɸt6X,uYnWuQ3xnޔ$$0sHi8yv +坫қY*Eq>'`QReK87ps;s H?LIn8E3oG aXEgt^3 q(49hX,5$ /EZ(I +kk Ir#Պ$0wjJKK۝2qW6>.l<[WIpI@NS `f9Kk S>-~4v[-r QשbܰyKd2brZ6 +Maں',XS$jhTuVEI7i/Ȗ-'P~H@ OߐԼoǓs- +Fa'Ug *g8R(hDWG4`G|.܏媂ȿX|Vm]6LrGKť;!.= ά+k* }QMaNQ-/b#;`@2c=YJN5 pE6lnr5txTmꉽ8V <ع'ēT9ƬPqe^~A-WmRz\㤤@C~K +Oڕ1mFGsߖ +]FAnH>[JoMвٿP*Ď>eD\ D^uL@89ZLEMhAUvޯl-؀ÍM80jgtqT벚>mS+O.Tz hK}a5t6ZNv/L7=LEdI447XZQ%?2fK4|zژWLrY&*٤q* +K[dl 8'Rqm XQ `%!,d- / N~QX$ʜu2!gMu]#>^aNfx=J̖OkĴ;Sb3ES8ẖBPl%W߇!S]7h2u7Z#@k~u] J_޻On8蕣^]6}JY:<Əs"x=D33DPj N lE"zbmDW.zcRxzℎX%72@7zGI_pk=K1D`oUp.D%b2bTRUfiޞ9ԁ}GzCw`M`KgNT[6LS'}/"Y-NC+eEQEXsN$G.; ЕU(B5z3M`2) k{x*zhͩW}zA$%QL7܆2fctRhT .M%/`PѷO7U;]]^@ࣣoUFJ?W0z*mjuT;Fq):!k_&ؼ3FD+7MBJWBiTR;1wK3׹E/?x?ʂ@ࡩ:gQ±kE袌LbY/3*G!BBQKi׬՜-.&oiAJӟr)2Z$gxnYa +9oJ;2(TcSOj=P +P! +~IL ǹEg+C"UNoS!L%B3zY+Ţ,{Um2z#B[7!h89~p*F7^Zq?7d~]u0{LWv@pPpdSeM0RBfY*+v0Z{G+eDs#Q_AC>x#rV``WdtY[zI7D=]ڏ5'=5LOUhXᰌ.cՌ==@ٰ p ~fo$qͰy } +- v?"WH_DHs XO ֬p^]8pΕvT@k|g&(5"$>:x`hq~n9Y:ޫ%w$$n҇PJ>`r~J $Yyc;!L5%̰1WݺNEgډ+FF0#8~}onndb '@@1f|b󆒧rnp]<+S=Sst`ePT2MS- + lڇk2y)`+9%7(T4(A#'fKvS_wE{]|7jNz6⨔ $TgE@G! +jҩBU8CQ<.fNڇqI<ԃ}[ + c,6 ]fʷM+VX]ϳc0FS(xvC}B/夸P&̈>\ܓtv.ŇaخĚ[\T0U~0m쭨dY +#Y15H $/sZ1%eT='d-- rZ-dJ MAe*MΞKB( XOO U-DY`ŋ +40EܜR)$'? +wW Rc 21"G#j~&dEmx`>RdB6vn}Y$jx# +Q_N}PAQtO]$ n3mIѪֵ7|[Dlrq.$C$tvĆxFq3Has)MLH!vAH>#7/݌~ƀ;^F @pQ +}@PB8poʁbUs,}lLdNg`AbC "Yg},T$|p;Xnxm;[>jT,2h&HVrXS/CڬqurE x;Mv1YY|fΈ3|NBt ˆYkf"H%wt 46LL#RUę㐔ٶ|¥so5 GSG*P;a3/ }wAPW #\o̪f_Cֶ@m#_h+5qR!<8B[+h.ݲDH톫?~Id u6l*yZ FfP|xX!?p8<z6 `+!">g +w֦D5v  3/n{ r![qipLOF#uLS^p6 Gȸ2&m#kOL6*PG6OwBH7-DKh}o&́0硚b&\u|,88XA""ZM-)|T--V[NX V:P#SbI)[brC¥P0虤Q@znDN4o@2>9?Z,oNJ<{?RCU]#$_^bʹ*| fAƹ(4yc(&>fq;╲_8$rfng~(DR̤,a]Y j#YT3ԭW )F3dRV6Yb9"F{ 5kf +K {S|XES=PMׅxn }ֿ5zT1}*1( s2#Kf +7HW]r@zQhN"$+`Q["ߊiq Ψ8LzK tno"`8/&QiK"'dM%-lT7e?:hFUGl: +nN +jJdl1d!lGvqd<s9)9+,)#+r<[*O +<ze4>o^\{O}3&c|A(\oV¶;RiWĊ]Bd2F@4O.)oF?~[: ȵVL?-܎ ]gJ{!*m|5;u!:(5#Y\Zf(h|CJ8ƳW`.*eE&5|Fay:tmG떩Lfxsm*8:ޘ F^-Cv o{gDEw&[L/i[29a~|C2ϱ"3q0]4+y7'Ȃ0ܥ}Le>I/j*M7Euk?ɓNfL;wԬ@߄7u.(YKyK2 +'& ' +T:32h;jMYr e`U(}():yDBS;~42%%` ˲9XMb[dR%0M-j $TxZm\#WaQ?| ՋnVb!H(/? c <VQپ}Ն^ *i*PrQ5 Vٶ1nPPQ`@-Os)Nd-} +%C>RM%MxBVn/.*p_ZD1ɏzʒPE=%cacƇ;q鞦od2ioCMSRP&^KVZ+aĘȖHW6(p#fȼÚmiFNK[3Eծ*HcJM8.l?Ǿ~2 GaJ.d\M)˿S[r{@Xf\[5rȃuq3%-GvI>!COq, ԓZ!Vs>DPKLEՁQ\̹3"m:S@q|;l!'90u(0dU v>WCv=#kCš:d\jy[s=[j>F<$Kv^-&:^D]HHPa^"At UAɛÎ\싆NZ~nc(omKj#0!s0EIa{ɯhx~]˴H҃8C\KlְV6~uͥ\-y$Er za k&+!*d*S( +k; 8i;e(ʡWsF;2[7g*,a,M!K +":-Y5%bh7~qB 6 #DH):u)@ZL">RwbC[*8 x\6FIVX] NC b69ֶ۪ +LN +ثdEyqΜ *: Ucg2AgE(Kl6~Mt!B"T\bhꮱ(%o%:s7 +I@< 8Yxґ[E +jh;n)ZD_Ƀ@`"}mpf  تMCڽa;5_IjJ6/rkhmW`CkO8/z`(=v„SZփ0ߊ4`NԷHf3LVZ+),>4W,lS,jN3?@L Y@o+L$qܿ%+^nA':nASK_K%W DC -tkaӶ|"ʔ/).>95]DPWsN1j34,^[SY(YA$(eI4Lφ6 +>}]!&N^ 6JõhX9ȦMMx|]d ~νxn.kܭ.uB#ӆhkTYTMO~b2BLJ紺K3F1\^,kˢBi"ߤ\> '8;=Ӄ¡!53r6rz@?`}7.»3 ]5^3FBOMwkͶST(%>Z |ZUXTpD#MF-aea5R$/L +RTLm6eC#aKϥe 1)4BqU +hm㨚o0d2FWl$k%L7 訢1X]TVY\[/rZyH gec`hLW8w5z*x`V4%L@$6tK WPFTwǚGtMm4$Yc4.z[p"| $iRC8v0(˿쯔 +9II""+SPd! tAq\,tb,v{J +Tn꬚1KUKYT)jrԭ˃Z3<G#R?t"1#!b$BЙ/H~bc < e,uV;qP.gNf%ztƻ(DvZ$v4: +:eΎ_'/rPS +>'Wlb*is }Ǜ}vNn( H뛉l .x5G1lE3LEzV^g"oL>Ҹ7ۊt@ɬMH#6 ++]kviHjAL6ɍXNczձhyv/'Y]Vnvw4DwthSy95~d8sY0$t~'qNV^J޴[Y38Afy +ՠFr\kulZY}@.l If?p 9+'`V i")EǑ?  )F:<` +9STs +E-l כn}HBI%mhmk<7̵bʦ4@k8ձ#N.d壬E8^w;4 4`е qU86sVL[}=xÍw.`&S\&ՀّZ(bQF +1PQ>Jhmt +֏΀pox9:&X5ϫ$~胵-$nQھ$V_&.n6G][ȄD^Ű&2ڳ8y$<!pX*eK+Cč5e~%׾HdyN3쒄h)017'ġV(նª ,?c IS'a\Nu-L{ !Bn^z3̘%ZBx2:=0կYQ^[X%I~/'~r#Zapj[[Q*}`4_ܺG'DcK|ՙ{]CtsEy~06/l\tsJ&q W@؃?PV׶5TY +oCEK4iDV!2YIUԗgѡQz*+El)p*ڜ6b]>iFqu(Unڶ +!o`f[AnT8Nf W|9PGgJm +-|a;u+Ky 2r`YlgVe>{'S#*g&2wKn{mӥ˞Pe)u LĭQv$|4k8&bNիP.bR8$l6/NIm=1Z>"SG ԮqBjw. +9|0zLɎfvͫ`1 ދzDI$Vl=͍;z`2hߛ`*ɺQKM E8t]烸оL4J@ LD(Rg+)k>ܻ+ݱyO̲&Juotȹ IVMdKǠP qVYRNgu +"Z輲3|ג_TOzu(x'fWX, ;P@ *n7uSZC>/w2xx 2DY /PG׋i&v4+5_;:V3kDrf*Kx||jJy +t|Wr͵ ?r"G@/(/a-/DGu;|vF|)1b +d0GW>@xN "輤v+X]l!EGb] c/G6@!g*,EԡmٔF߾)H +^hKb[%݂ +Hm¶Th1Fm-$f3e}.m՗ְ DOHIXڦep[ :Iaeȳ6h ME:#Z\r}tG6q}YtQY%2H7i^(ꂣst8[hj1ƨˋ35סTLI&Fbөԏb*zp*kw6aX +ٌ ,&hkM FQk)//Y!4ذ!05JχN4w+$#\ێYRO^\R+TѤ [5+ѽMVDaD (5K|ڙä;w!4` V q|璍uHW&?xMR&$ +(NnJVI! լwV.)j{ND+ޚa[ 3֝8n"!ZD5QHZ )9BT̸$YZjc2zz7 OEYbl)^.G5ɬvf1Jh0n-&bbh-j9;:Axf`)J˝e j5Bɟ q"Mf Әf#ۂ 1KxA./p\`UGv1p@ٖF79`Fq+N_Ӡ7j*3FU|f0KL8X>о5n$\М™]ا)BS>0Z孿ڳ"zKmrLnolдZ9;e*3_8-Hb`@N:;bƔo+FgaQkے{gnsfl[%S%oBnS&+%]AL*dNe_{djpګ[^,0D*4?LV2xN&\{5D4t=q#SP#sm\.ز3zw'ӝFㄖAguH"Tx&X"7zBzFCS]7aSQԬk)DY>UMg+dٕ!]+6~ed#ػ2+ 7He3Q/ Z0\[}/? t[1F·O>O]+M4NA} ^vs|bW?Kۧ-vWkSm r YvͽIk|ʡP*0JݲGԲ%:eK;eG1 ?r?/{y@aE- ib&12ًa7"0d&3Oe3@Bu:Պ+,.Sണ.O\X}R*&ɚ*^ Ρrt84^4 !ʲW٤8e?v5ܝE3ޔ!m1H>r5SH⊙ v x-> a_]p k2"0t31PVČ`.Y# {y.FŅY rDNO20I YecN!ƝLVٺ8,e/Q_87֜e[RO pxLgBQ[Y1bb£ḦPjg^;X89o/z+[h`}޲u($->@mZ3K6 ;΁ދqEdJ|yU"(ũTlBV9+gt$SN-Ť gi,+g6`ѳ6b_`(UG>z՜%6.d2}K E+J8:I+N+?~t t2V>Y7nvo}Yigcf}3Sp73lsI;._Fσ|y 48!|vdN(ʀ + NÆH;:15euM}/%X#j 0G%Îg* zF?lspq3#g_0r*%,W,;NMYaUKT⋏(l(BQfFsh<ɐ?>h̉;ޭ U?ol6Tir<\58Gog bx%a ^wV*2%/Akթ7.ofey q˲y^4Lq65K}x,~O'^7FEkbswPIlb7#,gӛ)QA`{ݛ:7@6yO C-s>stream +M5"yQ0xAΈxYZϋY9 +$<i/``͢Q%H Fg|֨3`QjTק~y`#$,R%%-Mm+uǮ+iGPQi H5iDݙ=+T5mI&X0Rʊ+~JPRBF+S(|72ϧ:# NcsQQ/szHTw´[_O8c헷p+Tm)Q6L2`h]Ef^Vj1aC$ U yJh g>_ p1cw-BYSu<Sd[IfaKK2/+ JJ-ZUgcԭpa-/1LU^ZSϕie* 4:y +.繡hu%%U3Ajz`?)|_q%@K`O +xlNHWs#?РT:I` L|(2‘]!l3^*gr?Ma%ܳu)TЗshec0*` *շXX-\%/E1m# R8r"A^Cl4!C>8qq\y%P ;# w-zaOPrҿz_!-^_ENe%9YWAgIQnIecDEp!4KUAޝt$J"} (XUsGL˺VzU1#lyPSJoQؖZr{XH~şNcTe!:.g+mժoʮsJDe2. 3aa]/]_L_IQN)֦>PB-5uarA-oG/pD (MPk Dv0<}Gq+t3*RJ[ShS-@ʸ/h9nHGq2eł]υE*GrjږrΟ]|X[\~Zʾ Aw?s%}Hcc\H,38K\_{;qUy=4+tl Dt=z༥4YTGYv'RP.?kuH*B /N+ Ʒ$79;BH2@FΘd Rc@HEW>&nQ,<^[ @7tN|):^?bSѵ#r _ 0e_f 㵯c(Ċ ,p.6F(Ak ^l h-/M}^M05tSsz~v65$o2zxnWaJlK yPn~@o1`+t#HŒ2j u9Mc/Z?J*ĺh敢 +&2T_/d viKDB $UR-ҋmY[:|IW}HOK++XhޜJ,#,!Eǔ1ϭ.h$l#XmlEџYnC1bcP&>5&}__,glA +h˾WE,caḩ]ܮ Lƻ\"2 =,9#sNSW]r5v%? .X*]ʳi(} u>Àdܗ(<.vUojʖ~u:gꯛ{!2&Ȧ5i*)qMԇaQҖd62~#So9wڒr5ټVT8m*%Iu9_'4 _l‹rEHrhgذ"0-Aƹ:RI69!,k!v5qI+wq(a|HzЯD-ma. *xer>uйn/\] `$<&_WZfY9ǔTV!uvHou_CdLcc:5}v`BNpWVTiW>M<Ů'),h~_a\(Kf8@lwb׷ߩuV m1Rx-m>62 Y@דGZV] r%V.ȭV&KckǹAѸ?56^1/Bɂ EJ?6sj^g}:RjL"ؔ➰;`G(HwٝRѪ@xzMq |}_3mriT R +8X 6 9b\QAR~9SbP/G>z1tۏ̻&qA| [#t)v$.]O6]˱b@xh7} !CZCZ&uPEf~~Hl-P“ r- +Zt4^'%Pe=BԢI>Vz|qW|2 6P/P()-ep6l^#85.$, !a)δX^!2cP=t+0ơQ ZfdK$g.=&|$2e2VK+k92I;ڂ1 ('{dKr[h &7+BрZ]>$ZZ t9FD_|et/Y1 4/s2vh' 403$,i"M#}ʚAmр2gw'1'a9`46wZ@^U ]BD +m",syq33 +d'zӡ _l?j0`;o"o#ɛ)d1Mz3 (qOơ8=ЮwtΈ,DMo7$ X!U] Y2UFMX-Ԋ)[/>ʐK[_btT2Aǽ9-V6rFGW?F#4).op͡/#Q.+qw㖱*>XS0`"9HV l~b ŘL@^7e^ugRM͗~2 (8A8jʺXr>l}ƶak6UIhlgNX@:f뇮z.MXĆٴypJR'gr*; +&N-i3#(i\[=^s!TiͻYh~Km.ULávf'U !) ޸`_GP$ +Qb@50Ol\ tPx5,>j[RCtIUܮ᤬@ :ٙ0Ҥ!`/,%Bls ,ϡe&RDW%D'0/|]6cXMQq-Vߟ <pV!ÊFF59g~R^(Qj-}*\5'Y~#Ru+fhy'Be)F [B<]ŝZ#do`29ܰuF=g3k!rܰ#d/o2ӥ!^amw I[n|*/%Ov;鸩<]Pƨ"\g_H[FkBt\*0z U>ҚnHޠ* .Vj5JZ-P~ŋR{+¡5{WA7\' +y'''{ +ͳea㥣aՅ|$,ޝG O985bM 'ۡNܚr}~`P(!x + 9?Oo69mc%U6VN%꣸S +SuWC0o?wS5[1٦`oGN`d^AzM Fio8r/55]4ƿECܮNMa_-.XZjLn _28!N9/'BQkX!MGjI{[O(fS.]Lct--z帍BDHgqafs-ue1G_˴,?Y'9홁&ɐ*G _[J:">ޒ߀GL\>dK&h̜۫ZJ( X"ښ0^@`њe Yl9*`L&[G5 g5uWBZa)#aT)2Vn +DjXX|!}!¶2y|[$$N%|{Ewa+6/ C +W0s\ +*88R BF%_J% w.%;D JdyB,F&j,Qi0Ѱ^eҩ(̦x_A07*:75+V`XAmbے aﲭċ/֟/وJ;[辜 EkU['z~)~#*, lOJAgMBMё" E뜡;<X;T2N 05H ?+M)۾ᜃCp#?2]zᔙ=Ur1 +/SlCwB 4s8-^UT+uY5<[SslFcZYTaҐ,EPOD880ii2zqq 1 œoӀGLu~qڮ?eՖi cHAaK8p %*W =YkP.JjR(>Yչ)'4ypyP--\uڞЈ,@EuCO "j_g;!-luX֫%a"9KB}3aw4?Moi%C5?djk4104ַ~F@ޭv(̞-5r$d=*hkyD uì?#BFsJa\McW?D懌/) +׶CqX26nnWӂeV%?٠q~_hȠu Mĩ;%6Q ;q2\:m45!r DDQYp76K'I@5#io߷RN'5i[S?01"i'3_ +x Spퟲ/[5A>3&K6Ѷ4gbbK{EYSr]|auMN&)͆|&kQ W& Q.SH5/8\QIk?); pQ*; {P#($~9`8mk1k2pk%NM|hjRd"B Ŋ&6dqO +ktZy :i(\ 0*eő3@8ʓY~Ň|\$:* +,rqCbe,-:N'a閯ϭ5^W? +8 *k;<h3x.0*%jT^2KqN*N?I1jA9?"ȕ6.Q9B?XtZ#aֻuӊU4O;mU2-L96*H#[\?%Cr?wMKQ*1Ȅ2sO/J-T@SKRM/ŲLM܆Ȝ1nq4Z,™i +/wz\4 MSnDD[UC U E*0AWk0dfǼi(IyT88cb/BQp.{dLb~:\IdXBPT6M#Y \1ۮ?Ua"Fp֢R62(TiJLOmى[`赈79ơS6q@]^6VH݂ٳY,Z8ldHȂ)t47i7rx|eN?a׫|i3/kl*FJӚ,+1R + 3ƂOΕn cBz5_`pZ|53R+NЍ쌤 3}-B0sDq0S*sRVd:1uuWt!|͝pso~pY:ŀIҚd6x Gi)IFMӤnnjd\}_oHOjI"9E4çH6Ю;t])=1a U^r34_ m<Ҍ)QiMLypMqaN,B(D&>7Fi8m3ȥNJ%wu#.7;krKAyQqxOeTJ ԞԲNL0nʹ:"3{|2*%BGTk0Yr565̖~͑sXGυ +;Hz7ye )PPHg.Ϙ%U\TI^QMyGRu8ZbJ sTh?[R""KEgKvV?8ܗ؇xgp31.0f'(K5?I~YK5C\OD<.++Ҽ@y>DFTLgG7~)a):aў\+)ud:jW:E122#Ry|s۫*75C@+e=(J_ȲLTڙKi@QKBNxx4v]zdDtZK@C6Y u{h² +0LiV?09؏~;`uσE ?Dyƃ v,d11GT|R(??DVB܈U]ʲ%X_Dډk4( UzUF +5@uMg/Z J=@0WNrޚ *o/4syM{ +'H¿pG)__̕ +Ee#R@~bGm2-GZ\ 2*dPr9Ř@=BZ'gJ1S6:N|(E D"RGG +M7 ̕pHtL>a)gFՔa(vc|&trܡ\cl^P";2 `97'!l q_{L"GNt̍+e7iW&+`e0hO=y.[ bTdz wGO(z&L +*A/kG?ku.8 GZO;pH[& 5HJ8T  :(`a} # *!)-Ap&]rAA#xK0Z͗ \!=6ߦ=xx\X0roGliBkP#7(  CLݤ'$> Y. ,a/o<AxgC;KMK5o@,dW"qzЌʂMI_VCOp͵I;y\ ?%h(m:;3tqK i4Y:RߡqEw + g!ƥ}C.a R`LoumIHQS(X?]R\9)ю?>5h Xsc y7d` :P˹D`Tع_aVDcQIdJ7 ]5cr>T̘UW(JhcK7  " =GBft[rBS1)cpTy"R涭ߑ,y綴TO{vxOtׄ$ 8gO$9{PErZT,Qaz*^=̩ۼFk`Ҕ+g:6T*[qN&Sr];Uެ:lg̡.2"H2=4^5K(r +}W}Y4,Fr᳃V.=Q=v(MN]- Y|*G'R *MR6%++7Kj":L ?_ ^ Պr͵cNK3tJN?v2wCd47uMG +}jLs" mN %%Z:|z>\= +2Z0N U +^ɸw>ҙ9CW "Wa\S9OYa9I]@1aʊXBzCk=6ˍZkH~WGד`Y:}Qg߆r_+qҶ}b.Q Cy2_ÈH5lPZ~hGi;d_+WI7ŸV|xH`Uwy5[R3ıxz|&i7 v +8c{LTIynlHZtdj~zy!BkFJb8nk9.e,GLW*RU_Ee &k*CmqOJ1GչRpLVqwk8@79R +&/]rҧeJ_OXZ$sf##-fIopj] bi 蓝Ү+b + {p`3?p"BnL$UFjrbޥi[\P}R-"uKJ@T +[ҕt`?:қLjM +g#/ZBDTSԟ /Bl&^( (B+ ;tԗ0yΉP6 9#Nۃ@[xiDt.,}jp-7bV?^0K9SOeT7xP9ɹM%^"_$SAMrB"1ӇȢK3GdǕʣ}՜IG _lnD!gy0;xojꊸ+bA1eEEFBU&KiLQRc7%sZMH-hjcL2{iC|>()=H=:{K7?$1|^:]0{#O3$ NDCYЍ@|$o3d] +*F<j@C0\j 7:v1^d?tO+ ,5F#j2vGnjI;6$rl + ` MmL%,A$0JͼOqe,ssBZ%07.B#$цAP{uWQo8Kj هȬ\rW'Kiٰ~ۘ5o;IX<{=S=ӇoCһܘH47=s: E|RQHFF޲3c#u7p@yO> ^ |[ 'F[yg=4$d*J6.eDVQ#~AW|Op7&$bGd\"BuJ_-L3S&rcA!<Dč^xvNK(M'|A|q5I20;ߘgOFp$Kd:c!|6l*1įEǞX4o<ٕ0BxE$|R}xOw]cMY@tWhBnWnPKȽZw$^U@8gg}; .va  +jw~A(eU7b^bYxήK-2~Y#CZV* *sYo\T 8<|uTRw$j$G®, @L(Dn +u;0ָ\m"#y ]92կwu Ktk.!ў@JH, PDI\7?UDڷscY@p/]Z5vhBf^Y--\ơϣ{R]p x 0T*A/s+djEfiK(ߠ_CY@ EA$W+9NJvC}H\AZA ѐU2"h_2gl/{N4nU0DY@` l qO-Emu(8]Zj! ]L`ŒU&jCXd[&VP{/lB^=>zY@ !ZkI":.κ"1SvV>a8ɚJ y}pBZfH[V}a% +Y>fA06ŠRZ5U ٳgA#Πx8|ޓE&E|A-zGAT-"_,3 F26gק 9Xe:^ '3ajJ#}^J9ePH.^>V>(/Z, T75V顚|6ZyP$iaN0Bf`@1řWq17J,>h.\(EN Bp'fѺR¬چ2+:Zto4"UV`=8ạ_4"OcTW*k] #ݨS5 ^fۢ%؄Qݑ\57aC1_HAЈVHRc42MG{p][(!jKٳ@oYx'P )}$3ФEҢL$#Fْ/0-]w c#dAu>v0'ܨҜY@!~)'4k5c ̣tB57dI_Uo]וjwQ~s"gvqx`t?+աηf%] N kol+a"<^[Q V;#t9`^*{LL©=!QQ 9~ oqr'*H{9.' 2ܦ Sz+RrxWL +0*xԯIM +Cڛ)Be!@Q0, '; +\!’Ξ,X\Ӓk58Dk:tYy{7*;D4Sᎀyt.D @?3 KuSr^ ko>q )Ke]8bHLFX;S̈>58)1@/ko/X,j$` koE rW'T)e"wO<òiTSW(j?\Ay7 +=T,9 .JtfСDNߠ>+ɸNF9Hq5QE>-Cs$C ePs!aL;2ͨ^q,, (YR_"Bϳv5>}7xήTmU\}Kt;޷i 2?{C+J#1į!gsY@q'sEk@JGĸ Y +ZDt*D.E7wueAPFGFXiqULb9T}am5U8<37U[!ByФl vۢIG I ųY_mkoI(HC< <YfuAsQG|'*.~V- Ik$#Қ +1Gqc_{Gh&9 iRw7U&g e{]:Yy*#CO +WxF, µ㊃΃ǀEL!! *)2W;~Ez{mqqo k>pp أ~zrO?h%ͫQ%p&As$L0Dyҫ$N✣L.õhs) Tóຐ!ѹU}_Y,jyff zZVڒΨSZ˗3S4 Qngו/px,𕁢2ü&Ӛ`I ;$%.GӨlǛ6E?ڪFR-b4KVMU)OK^&%KIG{TgA io;|[pyڔ^Q(c_{i닶 yx)gbdWjoNO*_eޞӡԵClRCH`%iobY@@=k"N𰖴r;]\W#+ExhdwHK8ɫ::&Xp6[2[b9 lCVEm Ty">PoSBh*s=YB+qa+(2ʠ&UuY@`Bȶ3Qa:Du>A"BP5nä)q&Z\ⷌ4S[؅&PmkqGwg?4R$z" Xz5>Ho/H}NKas&\Hcw|h K]c"Ԯ ȌP~srE70wR9o,&iV#ڝ?U ]^ؖ| zow>@IQݮC0hO"+dơD殳`09V|+ܬc*$in,{!wdVZ6.".3^UpE:u* 鶅d  zj@MqNFo2Am>%k#ZݰOmݿ9"h9zC&@FDyA)U)7`h6ot!8B7“ob4&hw8TD&ci +vUسbʯ.q&HڱI&'{!C]- D h|-<;QݑQ&}!@%?TIn #<Ќ qlMJI,P[}J^ѳ."m4%zbŽ qcZ5Ƹ|;?>BjCީG 0)4*.Pp_K4VZ, @-8Rz ,kZ=a1ol\&­uT.'?}@* X)199C,y7U% +9mdaq՘6RZ2a{T }.=k:Vr)sJ̬&߭յy@n B2]nivuYZ,i~ѧduί<(}(l"vWUNvHzpU K)r0Uqդ26#ѥc +Orb } +s*G dzHR Dkqd"+wq!T*aSyKlV폣Ϣ߈rUǔi-0OziBP3-*՟.r_}Y#"HpA*xUZDx@ø,43NJk<@)c yQtZQlxeHf޶/UV)P!(am3n27gVDb~f"֔71At], 0J"Mz(W3xC9 +J/CZA*,i] )EqٷIr`lzA-sKϰj VYJ㶗K̔h/¨b~[QEf1&~$ْ. 5}Ih4 kA5"Qv Y@vH:Vp'pp05%SIBʐ74e$ВӾ(r2.b~l0ĕaY@!~Xwg>ף7{{^^]?zC.L JoޙML/}]ve'.Tր2}, P\$GIA/3-PCۊOjFG D,΍`8Y Gz;~oڊL"; RY-۔nn#Rsv]-ӱ[ +O:[ݢdΊŐi\<}IfcT kF8XSa]{|[An%'QRDr#9X3(2}]% +zfT~|- OqpD% uePij!~ @M:0.ف&q[p7ѣbgOr"T>4 :D~T)MG/y(8Z}=diov b_{πB88-Rg9` CJRA]A%ѧ51$եDuyX  cR9{y} %\:',.? ]<^>fetNyr>ݱG~h g;S{rI +EYp SLZkn, (<idd k:DR%HX,&/]fkw hn96k7몹$Tg(&Mw3Ih;F(1 Cn}{H܊qg_N)!c_{c.$=e&bjh@<:xF7dz8eڐqϜ]Wcg7|}ZܶDlȐK]ARf\@l:-g:|3<F$oPs0Uwg,HttJp z!dg~g5)\"F_U9;1$B, `}f¹.6Q᰼?lXB2  ˰ +t7 6كEIևk`ϮRy`(\("!nw,PJOMI6D42 %cQ;^-C?HOAWk x-y6P>I2(bTѯ +;.N`%csn Y@Hgg3rMi wEh +3;D.r@hkl[LDf#[e qhko +Ϯk-eR~hty%jrh6_a@vxUv-y?6!U[f2B֤jP4a@IS5C"1bb 1c*tswb~k/gוf'?'%,.Rg Jlv.F8NlJ_&8CXS6c0> A.^DJˮ3&qI +:$8n08" =!7ʵ\. Y`}mk[8bNIҢ?PMipJl%"%I&D3+9l{N>E=I1q_S`0|\ ZyUzJĮ2ܖ!ʼnRZ:XX$=. +dtE]Ý=܂03g4 5+}#>ENԛ !s:gg6Ua?䅯 :[J Iڛ]חҠת,v*a*4ZF@-F la4;ꛨg&Zo!n>ӂvbe}L] 2;HttZx{k;;Iګ]2%SR-mTX1'g 5ڃmHa]wY(`74f-%š +R?GiVND;n,I{Q.6~4ib !HGF^D>1 D{e{~/!7+?'b&^Rhl +)FES=Y6;|U).Gci9CĀBӊSX;skk얰^:-{))-|w\d[\tN'sA%H,pz~Ia_-1 +j* rcd2s՗DzK#ro:Jaa0}#bb I'+):=^d+`sF&LMr]L)~AV9{ xpL +/0[w>[x X$!:?65hCR.Eg1*8R"ڛ,9Cxl̏@#mzԁ8'0_3,Vk1_ZRp/mJ(hliN5AISd;G !QV~Qzظ漖^M_t\>s]L8]07|?(}W*meQTd</ڮIiY@q7T)" JTmYUc1o]'Dڧ{-j 1p[WO^qNH8|v7GCjZ>Yq'6E"Dp +n X7͵Цx_":b\хY7&Y@)`kɄ Vǝ D$DgaXTwi4(O$_Dzw OBݺ,Y@N/Y1W 1 8蹋k^pCjH([x{QH?jD80צ޾53u9n,0m߼fbFPbbQLW-9Π^-3AwP xAӦzEnFSLMhIeٕZxYf.a00dbpJ\۟:Qks$g +ȚoS"`FgAV:]\MW '^``$dMBWF^/)αvbRsMjfc 9r;"Z~ ⲀbPl8_kNG ]x '_.'A,swѨT-Q& cRs p:$  eK;!Xh|o,1/#[3_bS̮taqC?4|Z:; e6 zkr/$ GސW +k!W +b jlB*4˭m&Bۮ,-ΐ@CLcjY@I: { ` Ϣ) ʕaDsؔG [#G]kz= l*zY5.7 a,8tƑUF,S nj80L6a +)f9/,iIt%;{g F}*kU?xr]\O=M, Rt 8̵?8 潌JL 'c؄_r9}W"WY$B pʑdY@Ye 0!/__+ADVS)Ɂa2KJ,.~M+WQ>uD}=á̘?IA^ T6so,g:IMUO;F jsT8[QW%gqh(FZfx\0Ŗ.5$yskV´i":ev ! + OxT.SXB.`\uTi#Cb'?U +c$ߖa+[JA4{\I$M&:.X̬. +~db\`s`u/7 Zƀ,auk~@*=u l4g j4lN"d'X-߆&Bv>֮uI$SoY@h$2[h;,bhWgNS; "4e1N9_%#sAڞ*z\#zaKl*QG >\ `xs#.P/MԇHs\Y Tai 22i?]WɄb5zq! Lg*q+&:VrIL/*!{IŠK QS@/~Ydb_J/UT5fHdAi/Ϯ ݆>z 7]&Pb Lt\&μEbn7GsJ[Nx" 6M<σUD\Vg&:&*3Hg tC ;)N"PD #4 FoҮQB4Z| O5V.JŸ&9!^6y>P\΄NHEa|H\1$!fI fk##ǀydĵ5[O0)[cR[uP APq!o$N*ht{&ץY@ !`io]W\rl jb1FޥD566 +gI0qU)8,Qg& Si3şw3lM*R[V TއԖW{NG0fd>Ho&@2BW>+4$ 7i =Û"z̝X93޺Be#L-gY,㯽%.躹{pe>`1@G6Qh9 +A̴q=: D쀑Ma1ٸ"ƊPqƞ:A7ݐq[,k/]W⽕ܸI}8$7K>I33-°Q]HǎjcK, NxBQ|ڛ+ӍP:$M=/k%]s|moO'UzjNUcd j , hb>JŠF1Fgb&x0_$M;}#BERp2{X9QĚl瘒kz]SO4_{M /HϳаZ%C ,y㜖P-02J-AZkj~ojUײ>#9N $@ hch, A?q.&@dHQro_ߌ4'CCͿe7']6E6ME[_:tp_WPA(|W;L[T0@ItW:I{ ($(öe0Α 0تtgAΎ =|VOIVؾP%o ,{ȉ4Wؘ0ŒrFyY@ _=R;6SNEHڻAeׅB5Ym #;ewz]EPJ A4/Ai{eGˡXY@]F~L@4D"snQPb?.ZʏWR)_fȕ1uA +xg +;Y@kc$ `yũ-Cz;_k!6h$BnjJ9[ i1LRƴ 8aw,B;r7 {\_0M:Ԟ*?`T*2}QJLjB}NLט DPLhP";2]K4&FNg&r{ytTd%5= [lqpFcZ-o˚3WzkDW0O9Jqgg곀22 +* i󪂚ͶV!OY^چg{^r.i"xv9c{-'6$CݠnQC{:QI ֪ͥ͡g1=9bgPXa8 {r-,*~K\Cݜ2i4³$ÛG +a1>]9Iius0F]H9!soܶw?Wݝ|n$jO3jlmc0Cj}wb%+0 ~X]cB?R23sSZB9bs9 #p'Sw=t9rpeOG, "zֱ!Hao3a{$5,{uX(2 `/bq +YmJ)ܕOu_bPϒa,Ԫ泀PB%0 ر⛞IsEBXI*Rlw"7 &Z-j:rt/0^!}0}^Uv}wr4rLo] {tOܔX]mC/xS2*8:E/$c^]+anx KvC\= /^6܄y}{@!T0aIJ>:MIӔXNw唝 +&A1hw%JJr\[o:Rzw%ConJw<4w{b-ezR. (g Lۥܐ-#3_atۨH.4:7Vm0NcHP6,L0!' 6 +9@cżB~Y@T<>AWRokLCxcHkH=;&HX[^' 1WQۛA݆ܬW:Bx-))Zzϑih?k'%pbO |ܙMA.zPƔՔpH_ ON`Ii[`dZ| U Ks*N57c +k\:O;{WVdy1VqU4#f,8V:>'\m?.wܻbȡR@NdtUA/hmDmx5t=|.xѮɲY[xWaѳGY@pP"5w%?"}2g]F3H,DtLhH&&)=u W_G䷬^zbgA"=GvVIy%2"ZdI;=%)lHY*%| 9nJlIM֋, 0QZGhPbWffsMbIFxqL;8N`*c܂;=,6)xSQM>VpԥDT.CP=ڕwN#ZT/).::dH-==#|!EVQ-w/tRJj#;.l0XsVxxE_E4NVeND'ą%->4uў, ^ܦ(%." %ݻйZqm]YQ _fh$RW2&x<{Ce+o1I`vGzB/CtTejA!캼IAZK@&n/N'AI%:A|Lru2`Y@F<N|;<\L,b>\yPB) ǔUġd~l?Cڻ(eE he),=1HI@PeL[V0U >N ԔP2H_Y`pw}X xTVE–a:sNYY@ 0k/MʮtInv% +VP_lY@]b^F{Ē%"J;*pa85hoẢ}eWcO$GXMCF#[:#, -xeL~Xu!d(Nn%sP)gv49tŬzք)J6+L @pol, 88,"N61 hBk֘v}Dk/ʮ hjD~WC"|8^ +=&2..-1&b5oSY@~cB:ߟnQ +iŵKu릵DdĪ,UAoBXL!k>MEA< ,Y (D ״f_n*_7p) '|j)_@&ݼCf COi> f'9:jRv +c̈.qA9!Wk.!\|-1:@NY"z@D%R33Gw6jtkx-{F0O>:72O'&,JrYb(2u{C3H' -xr2. :x:!ս: G 쁙I_}l0+D ^e{İ-oC TsE-ڎIåMhS2o!UBv Xn1Sy 'M?]Q`ቤO~*ߖӠ 7XvaELGǖohL%޹žs#; >ZWiHZ$ #/$z_c5$4>͙_.]|&\-7J`Ҟ[Ê@CpJM.HJ!|wANٮ54,ͫ%;?2ݐ$nG?shbi{9*?QB3 gQlB.2aex(Fd6k]f4OB֣xc}Ī&R= qGl[t/W2{",K9.S5E/1RrQ'C²\1`[nݵ}T rMMeq75ZmdF&. #.yEyGjmsFN-kmjpmwa EY@@eLeJqKcN&?5Y1<會 +J%/oԏ6/pj7C c%2{cQKo@wU&ȉ?Z7Eu1ElH:A"mV1ҹg.cW6KwfcEoYT*m^h<Y~ JA[,!dE0H%z!]W&g= &yJ9sC41 +GZ, Y`ӌ{INތJ s`29F!,u_κ@r8.mʸp +fT +bW<M| J +84&m?Ö|z%QԶ31%$gAG_`‡1'{Y?|zK; "?l~6GH?Y^Mf iirC>sK֢cKrIJ-7&ZL&XbLCKAMoZ26/*P3< (TZ\J;(,~jEgA6A_Y"6鑺TCͼ";w s 'p6s9ˠpɼaRHsu +NLY@ B';,OʺpX GnxA8lJu+,'o7ڇklq/qeKX o[dg]=#݅Ad.@t |!"3RϋHyZ98`~>Sdht˃^ן6Y|Y@m+7fiL>Zh.eTAJrSۄRmC.,!hšH[h<ڀ6k-I(* gmJN}+Oz·%!jnf8EO~|DT+)AKn V|JPN$tȷ#ֱ>qnj: ư[uI*#TѣME''#ogV d +j9\xeto h{w>\j" KPԥ3C17axA j +ޫ?񻴘R$3z넂18'mWQs uoFHC$۵\,"Y@Ĕ.@aZ?4K",3ԮT &95kbC.#.8&~ܽ54-kj&~Mթ, ˆ6Tg{:C -7MIJ;/6wʇl| D.-72:`fܐ3{E]ʌw حB]Bƽs9]vR1:¯*xzcj)(c y&Ҕn7U"p%#uRo`3lQq?, #!md<ZA_9xRvj9Bm4Gq;'D8*m/ q(\ Sq`?)3l&Y@8 c̪Q;l1nt8(<kW8jg8TtnS6nUmn؋c2gۃeTt^~j<4"P*/+.hwoT1P aI`OȾ@tsV=( +r`4 Lt& Fbj~/tޗ$i2Hzd\)1lJ1h!\s`\9h" Y@pg6xtcA9d̬4 "$uioJ$T܆H#:).#*Z(] +Ɲ2"DsXՐq6U\&he@ pR) +9 +4`ԩ5>R`6.V3bTF!/!4AB-SD*攺'ܡ٦JTK*}!Y8Hq3<u1"Z$R ):|_4*DNxqTtlq}/sŇ0z1-7+[̓bi! i|K)|Sj<75Q{ G, +G97Gd҉`=_q#rl%l*LEUhH̆RNʄHRim Y@Ym^"?~ +ʮtd#Ũ`͍@pXp]V&ҫZVxPG +cx((7T +&(Ŝi0J}K˒H3jy +8j⸍2tDQ]C o.9HC*ڧ=f%fgGANR+}Z W͇aydN \Z1ȲgaeZ1p]5vs/ LK~ I|@L]eYN|):/O +>'DMb~F$" +K"*M̞]ːuUc, ƘnKn׶$zAV~K}H-eP@.՞}S|0WHZ"B>*p qboI-  +9SQ>+y J* "z,c!j6cv0Yf#-cqvf~pl00L)wZ[RPG28!LוuNO.\_'HkZx< %ip + X&`>&wsz Nms-4 J< ɳRyQmӈD + 傲JC +/- (/ .t*nZZ[5ڒ?!;9 r;r0/ZzC lV*yQ;xWf$*'_C,#SV!28E9anHA*ďg-X]|DYn'1<3,yf].oa !+eg!!mwPP, PO|8> V$a+7M-?\ )z'"(4~qȘ)"ODcų\ULH濹sTL/==dLZyBSOVQF(egũSD\ѪN}sJJǎ1"kq ¢!*.<^(:o"Mi).ZTŏE[vzc{P>A#*}$< ~o<6zeBGYxʯw2<4Ų[ +K: p! ;@xurڰKAQw #X,Rgѹu, Є|αiϓ${̓HƻL>$~{]e;zrv` ;jz +oEF74pSgٴT8ᢻ ;I?9Gr4z$b!p!ȣGb_B.Ye#=Ku|T-wzI\p F]*(K^3辴+O?t&PNLpJ,<<ځ]I'Eg}85.8@Jma} 4;D.;R0_շl?aqyNNVW?DKwX xgx:1t"kIFNU +HV{LGBoEC)M4UCU):K!6Ee&UBY/ʕD匥D *s'>1>sfvKXL>jOUN,|ZT!:4·GXb.W97f.Z8Ǽ-9 Ц*0J;q?XT8tQĜ\ۭav 2jaWI%7s M/~m~#c0eR#*VŐ%Y@pt,},E$bn'Mm̈́.&|elfBp%вξi,X[&3W\_^, c86022dĺg.D1 T!hqEئAÜ6qY@ݮk +m/FeףBj;L9g!IiMڵҔob3I-묿ťɜS*gAiS:KL-G;?Dw3$vIL;f`EHܽSۗƯȱ@C"P׉a =i˫3t9 +joQϪ.vR.xy4뤴 '8w a~-<黥Z%deq6ŠS&2`6HPwr\ZȂ{&gJh3|8 >q(l^1KpÂ8zQŏEݿ;-D^Ib6<pV`d4 + +ha2Ӗ:, 34(i1$*k /V ?ܨ2.HRF[-0LXEqk9\I{ dA&hTED7渔O91Wxhp3(rLe 0 4^->NQ`8ΦTOgALjsDŜJ-<(`᳴/I`8$R$g= #Xs@@O#ïGVn߭cȼTy1ȅ/VH7 a'dAipz28#wÊLT$G +_CB5 8tam$- (ShUc<,'SG^WQ-ab&u'9W-$$V-%ea]2Y@zg4\?db)f0h_&vf, @?NnB:wb~KN7Sɚ4Mf +M6b{dB)v.D~ܑp t!52h: 6SQAH4o2'yc; #sG|d4 +!yjfZtJQHOE_LTzd:g&otkuy8%-)pr գmHy.yByf!Jv][Hj, \Ǫx| Xґ.yC5nXEJXBj%MS[gl=&jye<>bOJ]SCfuP##7 6l_uZ'Hzۢ_Wtm:J)WGT顩Ubr ؓV<˂J4 E.BvDݓ(H]aF0ѱ[3)"OS}n 4ѸήkA=F;1C3޷/*CEt2@4H+8&ӀMJPF'`s1s]͖`ՐWݎ7GhL BjH{5)T+aMv]01ۅ6G;rGD6);@%R:(mȦx +@XBm +By`k ώCL+S:J"iG>/Y@`26W%߰$6m\0 N-4CF"_z bY@p)uԆ,C2*c5OCLEjV)Eެ.XБ؀[=KDSh\hr;zp(< 'j5 ٥# TQ1i/룫Ά:1rTHٔwT8yo8(ou*:Q>;IɺY@ai=0-,dec+-㚉SD#,H{6Lb}ܓ.3Վ[>e23@`“Hmf)0a"wŔRa}c) L#at6ཡn A$D&Zu1 TacsQMN:j BH(H`pѢ"RI3Ȫ1#0 c`l XyȇeLިW E,|.zG3?2q"^Xۨ9  sRRDpy *I`Vy]r7C$_{7X<heIOQd,5 8QČ k*u^$)7UO&ǚ W-ɨ,&r0K"%37 C_ 2- ZGbhƫۅj*"izI + '=0يB)9`XgłKDZl0E |dA:P}kԤ[ +PUy\i_e&5[U$,޳a [$#D5>v#5iѵbT~Fe #xc$''g#Ӗ2 Ɯ:$#KE;Q|Vyeg!vW +Z%;yё|cSj5RM.rHdW)wqomJA\Zz㖆r &RGn>~^$5qЀa= +&G3l ! 8edK$#V[I69Axk8 "Si5JH4 Vg]#ͥM@mW QQU"H? `=k2V9g _]әR*2"03r68ő5RM$ ⦳wO ǑʬRqZ-|[dJ!;&"T.v;3wD}m(bqI' gY4̛|0b8idREUYe7%1 }PŤvVyT"z1[-f ~]UGdbmFҋvnvH%JI3zAt^XS=%bYpK -rرnah7P/2Z, RI ͡fA:1ѿD~ٽ, P"Klp 8Q8y{q>LpppuXP&3*ѩov!zHIb".>H-(Ot$ï&snf%2S\Hvr4dX6cJ,̛x}ll5 0d !_4^e-ͲḄ4FbSO 9"LNlF&;DtJ1'lҿX$i˜d$Ƿh5 IljHI. |6'?DavچLvΙ̂I4`Fhr^~拡kI4C|ѧdgARFE.z 2x%+}~ߑLzf.5fAރiB6d;2!ASxO`We ICQh,1rY]IԂ, U7nH@?,= p R4VȂ2?ٲk/BVT +R$$j$& Oc c,'s|lP_ f`"d3vhYgjp]5ΘɌZ(h~|m8vunADQ$h{&xFڋTBiV$A<ϊJS#JfNm0A +3R3錑z)OɴGl,S׋G#NIGfA"W 'ߒDjv K2CCbx$,8ȲE8名YS+eX"0L&HB?A\+sq#;w3iQ`Ġnb#IPڄ9`XvT:MA5hѶsNr*1E'|͞y^%J`d@kqfM:c(H(#H&±-*)@4&~ԝBeЕܵ.%ΌoJ?ZJZm$䖇gM@`9O.Di[]C҈M]:Dk1ty@=x4,G{1Hȣe EPBQse/9W+#nd뺨[]T5ޚ1VV, K5|BP=\D볳@ #:vJb$Pǣ}t% HcÃWqڑ¶=eqVXR6@mӽRcOvZeA +!e"h)p(7W*N>[Ly]|+.#c3= Y@0R#™& X:/:i`B< +sC0@{R.L7•bF*H*гԾ2Լ 7]I;$E&NR"$`fTII~Ƅ|;|߄O,:Uy+Qldw&6fyU{lȈmFW8FSVӇbLj]&- +\\9F?f xIš9k]bѦY?ΕEX(ka=dV*bUEz+phner),p{dk:l=oYߴЗQ Β/r\,$+Ap +"'X^fݜPw*|`?&}7C'z^YBuWiɅ ƟU{镐 +(ъ#QrQj5IbA+68֑j@ِl&22bi RFLo҇v,֬INl#h}"ç`6O"=`2ͭZ.c1Zo#|ۄmd -HcaOj/y) +bUpuq'PLj +].{Pk@L, 1{J<]o*|8 UN'"/i"9>Hw:ȅx7nND=`r 4fF~VLh@1~UQ qd&GSûIWߓHw2e!^Y-.rFQD5D@! 'J" qqSѬ˪#b;W&Imqx)$g!($#Uffߪ}2=3eabqK+Z!$ ;Xs&`#L`k[SS>g2gBcL='Iዄa喵o^ Т&č=Ŧk:?"K&Vlm2]a~ǘŢq'K.Pzy@0 +Wz4tNdfFԡ?{<;ByCP2C;ӢQԡdiD:)B^qQHӸ$V9 δp R-E߬ Yu,٩;GJUdK2§j}+CBC5s K_ +80"R1pVxU,5U' qg2(eleD{ܓ +”A ի~c@G![Q1IiU7*T]GNY?_{NQҌ@.cQx:05W_@} ,>n|WNt9! &c]^ÒRM8܃˂j”F: Rzj;X&6 Bj<;onYG@1F[1d +m`DsSFu@_\hFIT唼tfWmHSSnCa|̜3AUbMy*<:[jOpCO+ vSӲ͔=FۋUDŽ x6Vf.lS^ WKT* ;zp eP\oT"1ND|ޖ%zCgQT\f=VQţ!!S!eU6+*g1 L,D'Ћ8WexƧ?Y@`H2!rb~|(b+n^4g)PӈU t I>C"ipQ95Ყ&"-Μ׮%vqRQ%Cbf6Ц0&OdIKAƴ[A^(吔B0WAYtɻ $DzTh\8{28@ۚ" &ayp +Y@+]؛eB0tzգZHjg>X,݀8HHFg)A^9@q1B#3*",1_5r -Wnӧ=YML_{9Si(~Ƿ?ׯ^ɂVw{:M*1  y5ר5$¤IQD% '+Ld뾥ir\\?eƆjwR5@SǴmo9U_IyH{^TAV$'㭧4c@Aw8딉7V%Y@kXpRG| J'WPt![\3M~{4ƚ! ZG[ +YвHܳ?T PQ?B³5oRŃh'Wwu'ՀmP{'U@@Ӛr>Q9iݻzQr)䗩~mqPNji26i %!,,)E~'j %~ŗ\Df-DqpLY~r<!#X< OQ(¬ypQ>0hm̽ސK ii!X-0ަK%jQ#P"|=mݴ8#eR"nY$x/oJ +@D]5]OށAiL)h Q`*DZ(uU4%:J+RG4'׸s&,STm(VfC' [G;9gJ1'il$aU);: !tEd,,`5#*]Ni|z +ŠO۲sb(!gUz\5TLi&Q/""- FQ$a9)S4 H<鳧ck|kcE(br.hʨC7CZY'j=- 6>olw +Ev(B&Z>!%)W'Q$&yTaـt'Ȑ'KڪVڈz BwF jxX-}XiĄ 71X3X9!ã5FFoM\&I,)F7 +U + +n-%+!Ie1H4\XFw7qZ +x>r eIT> EajYP`œy:TX w ޷!L`Nua|DBs:klHŁU@ԇ1w%I O?lnsV"22=d%C0 \KHc eڿY@$Ocz"$8-9#RX + b#9oNfq(|a fjLekBdAd{6gPdC'PNɄ aϥz &ߒu{mS*r} -ΆEC^Ciܒr\?ޙgt-%:tQ4plÎkzU%Q$Ddu("Y9ro{sY@T]uTaccŁY I.`$%q3U6B1fy{?iLm+):;hg2%ot*/K# XH8, L\:;:cǒ[RZvZpIL6j{Y; wD}Ukh$FyO_ #JwCj@ sj<֝,e,>ۢQFڋUe4A쵤q7Sj=It 'Zb!Jda1ćf5%֝3lBG"+7vdGīwQ3i Aϸvwq? +Kb{Fp:~v]O)P=f +&RWydÐfȻH.JI, SS$Ҁ]n6hdۀZ0Z#p e즨UV-%qHkqCi0!eH8K|?. @/DIhpx4gׅ 8 *gKLb(P K;B%F@Wz\ +CFeM_"Sܸ@ _Ajc E$pb++9HMNh̞]ם( BNMtrJhO'D9fNRJQ/Ό 04 ^ɏ|,{K!1T=iJuzyܡ4SVlab2ndץؘ0"'zBԵ  tp)+Q5:@qE"锗x`F%FNg=4 Ü%# dѡ7/#\)*QĬ@%۔y?dӷ-mΉZ9ª?Si:ݾPTD؁nt؆Mj +b~IC2LY@[&f>s?'۽^yHs,FVlw#I5U(gZfdoT +!-J$^tXxa~d&ց[x[mݲiy[\оcYFpThyC!CR_Qdخ*w ⭇ ^4R^c&\lyUn2EZNw%m-D)HגjS +H4W,4k1بZÎC7~5 e9PѠI}o: +:a:(7 L<Ew\(*Y"]S4hé Aɜzm3=nFUx@¶_ WüY@0P$%Cx&T0.) /MYdb#^qS7;PTv<, +׵ Sg.l)}J46u#J?{&CE:ģHVO&H. +>J|h0_{/Ӷ캃KR@WM +I70`4pT%iK$T5 Ţz)]R^X1 nekB7.}+< u@nIZBOhOv`[a5uG:, km>u\RTEwYY@pt1b%U|l%4K>:wԁ.E9xڶ7#-c@ZVƤ l(\h`4H#0 +nVA`,Z'M:_PJ0|;JSĕG-ɃrUO#x=1~PX^;"A1+gB7Sy"0y9 kyy% "vjR{, }@ :DgA@RIUJp3&l\3;>h=L]{Ťe0Tim3b2ahaے tfP`yfP9E_ oi輊+@vO* +(J4<C =X m# +25;%EbXp$Ue% -9<[HrnF& +7Ŀɩ^>lx%S\kve|Ίh%a`\3y puJ,Eu WjJf[==E([DY&ꘓnnA1ݔAςH{KJ2Pfݽ1qR):RV)(7r͞e +hOxήK;`s(3 MI5CX,(/}n&![=t\\IP2.xu@h l1 XFB)-Sr5(Տ53Q'>JqխRaڢF|D)Mt٭Κ*"(=t<.O8w6K=0b +¿G /Px_d +\߆o#v; 2 +))[6ĵNrSqXt'Ocsvݼ7qopY@0iq4%9>DJꍙr2Bod +oZkQ=\ng@oEpLf;"fAGIˇ+살Y] jH5lSő=GIFDrXI4y8)nFDf[H| X5EZi%A5ty8>>#jf¯)S_ H@)G`Y@5hM:5P)g-k6-n)7\yrF "'6Eqr6  ߆( v">UΊT^?=π5y2 Գo4!Q F}٘I=,?&kPTF[s }"&-$>z ?^I*SDe.pMC& +ґtUAfezԲ-7Ch𛭏G@=DM3 ~]_q[v}ZP2(d\ҭ/)!<9V4W a., ~a?!@ +Seyh\1 =y`0 gN;E'z&Բ0-V9I +VY`yσ7 ؜ |k:boDJ# :7, P;(ǖLqd0dqtrT< +ACޮb _, hWQmNŰ +3)|뙔Л 1~߶ɮU-'#R YAvK N+~yEN+$𳀀T |Z +k?\vB%}iYBRo?a*WCQv]$H|7RBt+̛5J!͌rF0Y]Dî/?2 g/kKB02 +@ J{u3D,u5HC9Zva%d-EyPB|  /GG*BnJaCKк+)L$ +ݛc_ee]6@l]%^tfB^Ѕ`x@MAp`hJꕀ,/^ +^2~iՐ{$) ZlgU&iš*ӊDu|G^mmbލy!o=W|xljR~d:C\l2(L`uôN7zh Gv*}?taJ3L(*.8)u~ax'S ,yy ++madIp⊘d*f z"3R}$Ԏጹ͑e;_>ÐGAՅtRX-Ҍjg;c$佳 5h_,N*6qa̱)S4sDoʜE FNiRJ 'O1U&Hetr2 + +զ׽RPZu3=Hyp`aӎL)-tOj +|Q8pҬHYPuնYiA *-a͂fqcPY@ C;4h5b -І-YGD +=XW1JW%u\DžCvdf({4EzBdsJ: Kh>5t?d>u%Tt54͚L$j4,?F>T 7 :X6~lx4P uoNcsTijEY|IL1VlK W>tv/Aoɮ%1ҪbAx< nc#Sq NaP2[/,ʢ>?ڄ-W"8)5fj EeZD&[őX>j3D`$ |r 8cJ ^K7f;k8lk/=y,8ނKxrB-x8yxή $X*q8dX'yoKVQZ  C9c_{+`0:*vMƛFJWm*!m'D]Wj MbpY@2FU@jg Qmz SK{a8"ЊR1į;p-3 +BHⵅ'B*EE48 0oB+ 4sv]A~*SxU5v$-1Juѣ,}i/nL3E)$CK#.ި^:Ϸ5v]҈|60([w9IO穁,6ao!leԱBQY@ I"vm#szZBEJb[dbklw $()vvvCx;͆R?0S]pO4;?sY9 |P F aA#c%[hcf/MtOZ%м;JAAEQ9PVbAQ )ֿ0QB?g( .&!#6jDG)fM}ZZ0PM -(Jy&%MZ#.4ݿ1gުFBJ:j HXf'7^ްcF\E1Y@`"Jsi.O,)|bWT)УU`/rZ|Ӑ ]O(:ۉPAA+n؉O, nMM-vOV?+Yz0CN:7Tޠ8Ivf,X"7pҴS~|  +nch}j!\H k\p]m!,oFI#$n( 騏GjeI-sv]_ͪ酡 Wsd>7HVÝws䎔"קWI1G."IB%!@t[OY dafj0&?_2v؋Fu?H=΍^)ڣ8SYBLem , ]Zb_{smxQ]#cWJ/lMCy`κV.\W~W3O%mor]_k"@lǓAVvJD,qYS܋k)G48ޝ VCh뒰6F6wW`JI O\gzynB2 oSH{9.ڔ˅\ƑJWM[`L ;N b^/N(7?6e4fʣPik=Dc:P8U"Ut"!H{9.[?2N+B3K5p!$aOwnf$, X-}(&CB;날65LM[byxT9*pF-blb)m H{9RSS?:P~oRl*ns F 3a^4kGFzC9+,8-S=@-.3 $<7H2v]jqd-`gt"ݍxhsQ3uq{$ ^r1%Ԙkt/G)4 ?Z7jU llbw4P?ioO:!> 7h‘^RSٱK|T\rA]wзuf}xgaĖ6(h]INk! 0WYMAq">CF,ɨmV^hU҄X콤cK/ +CE +sp*\Rr Ag +o/*U#3uT́Y@` yU]`u`H*ܧh kD99,:>b@ʨuE?GNp +)8dTjJly庤qmQ~xή %,0q#,s:N\fGI7>Pd(ؤz-x葕K޸x>!~9if|cEQq(v9I5WjeYvM=\ezr&koOa"JI{9cB6e!Wi)x^# J:UOvjӁaqH S[xm>6;3A?}0FJyr]5=y v:}z:tn⍯g30i/\7؝!HNzTI_%5P7$،XKCHnJSL1q:QXYN?=,he N~>ؒ7+Qe+_Q\YZ\0eRȈ&^axxC+ba +H"^HO _W1rȀPh͸ KS\!"b4"T$|dpz6K 9hqyw 1a^=-8e'f}| ъhGaaMġaZzt@pd@ondTV _FU=ƃY@ &t ' 8^FT]:-観q"*g@>hf c009:(&:$Y.i -9 R>!1 +.DqUSNjoy\fAhj!(>QFH I\Aw# 0p +S yɧI, Ae)ٛ87jhoc}:8pr5D/ݞ!z CܪLrѫ#]Lo 60E&ס xO`.3z,ng5zw YP Rc R\"9󹼗GeBI\sArx,y֛59pgA/j{Ca0~Y ݖx;}Sdk jX`TdhD,ђ̚b{%v9G./$7Z1$η8޻V0=y ,8c i'7"̚oDMu7r$~ 81WhE$J9gKqf~IM]&+Gձ,F:ic !OwňZYJaqSmxx d 9_,yIk$h;u,z&ljB/QOkFlk<}d([(h߼-҃TXn vL(}VGLJo-HHh+,, ,&qjciXXq]bmbhL%/鐒2,Ű|vC{} ۹b 7 2l:. 5#?v$,lw\{#<gO1 +{]~kh&ܺ@8ahӖ<%w!m-@uX<9emE5.ZY!B_nOC'SKP09)-ï*׬{sP-T=f>]: k@a\ԚKa j*BڷQf $3,ގ(N܃7 ^np19|5xriS!K amK|دY2UaS+@pq֎78NTjN(^"[|U5kN}vQd-#Iרּ9B;@,-U8mJ49N Id4Bo?13kL7P +|HYo.&ȶמA:VL 0qM6M0Ώ}觋c@&}6n-&;@##NO<<KMhSnԣxq@X.4׸YWeBMZmNZmCuIlLJ'Y@X&<]C X>g<ci+Gi_gL^+4#N<Ϛ0z}*t OnfAϗ)eK亄g LAgH7"xl>3RJLv_6nk#ޕc5 /FfC;TqW] }Y֯͟ğXy4?pC6޲m U.!7 ֍}$G& .$ w*bh8(B+*2kNiQv|, tbNmR$RdžYDfC $l ϐ2+D!;4r0^rSLN3]{SfWnP얯 / +':2!O !M*!1Ժm"2$]jÞml8mkqSBfޮD`A:6IU`Ьy@**=, +~hP }TG_Qǿ0麺[ 1z`9f +i ++uDʄ{>f?GfbcH`duaʾIne5 +C;3V*qnYRc&uw~M7D"erQZTj`{eq>*{m@҆Co,X{p蘴7˞P["EV2-f!{`Z=HbDS{/& {*dv'/ʸpꋚ"h`ڻxJtk*wCqPH6Y@A x(grtnilHs@YܖH?,F_EOfDНD +`hyyg=ӥq9W [mUd#q'jH[Ɠ⌏AĞ!!4nx'T([:;F .#%L-( Uhܔ*fV!QSzj~ٓ/z3@mE'P^+ &֤ ]&kUl{Ɖ&) RnIoŗXwLkqW)t#;X$cz,(Sb69Iwo-JƉZtęԸ^w3NI*hԂFŐC'{?Vn+rݬ߻mBąHpƜr?7 IE/6&#+ȮI7Z2& ˣ6՜l FĐ`+7>"-dMbnw:8qLbǹm4 _)vaY`JK`eCs=T& *IԦiM(8/Ƃ +n@u1 GBq;Jd at]Rq56F9 .ÆD蓙N*_L:Ffq(ᦼV3Y<%rMy!E3_9 U4I`09zU,6rpFR5c# ]n>2ye`| ?1Bh/Ftg%mwqꋪ=lR, h}ܩ)E,-LL٬ɾ2tb!阍SeTj+L^/pH5ӅKIj W@6F@k51qXUԗ%os-I^y?vii.\ΐS 8S~`8'bcU,v[CӹiokZgpCGV M]+/tNos 4&QFVe8ZTAgŢV[\S}qZpĝ^ ƇlXFڲm{ܳARͥ, ]lA'72O!RP%@fA56A9윪aE1AGyW\%Bl͡0%/ ޳ƮT}%%Dp9Q|-d2w*;7a.Tb&R-s=, Y44TW ^,݂E6:p".$EexxQ;/\KIf]Q9ݪ\G 02\f#qxH2>26D@~\F|"uNi1$9֐N;eB 5EY ETv +nun9Ӕw팽hk vSt T#!/ޓ\&y74`U;RuJo򪽠S>W$Sk$SŠEhrH ^% z>lI5f -ChJY. S8Ȇ"(;-a5ئB1Fː^HIe#YgPn ~1^lcD}eO6?͍fL6'C'dVc-T٪xx}ӂM)U\uaGϡ7>AgE>qiϛRq ii6+l uG<˃1viy$I}U8*'(Śbª` +z*؋SC7x?HyyW +<Ǐ*<$I/ +Ld˓qk[o둖ejӼY@ ޮE>TΜlǟq4*Vp'@-p +`e, X0>EL6k;r7xO#&~JQ"= y톢&Z ?1zD1J#|@U-vn`9ĒBcϻłLm) 2LHkkaLFZ t\Fq`ħZwVm-/%NA{-Y@ ,;Oz9w\lXb b0ZuglWsijؐHR r̺1Ӄj 솤(X6Fk +3Sk> +ZL;(.rDKY0hٴx(aWҵH+]Σ aڱ?"o!j1yϫRBcTz碢&ROoY@Pz fIyȮ +p }H>|#npddC#KkWDj68bʭ XJ, pdr61_!M*+Pbuo+ ~dvR)ZLT.vSd-{Pqͫ|B*f'xHjdžE8밲#5,if|ʂaFVs^Q!d|͔; Պ7ØvOE\Z/89KhZ!c3 FꮊrݭqVJɦG>b %U|=NQzI9dgѠ, `v`tT#ړ%BjCn?{@eP[Ҫh/Dв(b='Q) }ܞtYjNxseQCt zdaQt6|M|pE", K{M?ս= XXcs7ےv'Y@9qA%0 ++KCnd8"`]r`СW|}pc$k['b 9ݡBa@""֎k, pVY'0UWfg8DEX6dZVTaT+pUp3 n+BTRz 6sDaA5tiLlbT4G+Ҋ ߵ& 4(Y@ISfp(#9n<|DޒBm=y|<`Y#zF#`#b*mfMMIgW\9i$n0UĶZ 5A8PkF/m^ֶٓ ٽ*x*ǀZW`pZ,2^{, E9̓e;cITK2/*^{] !9BEwQjT6G9, >-lI2PDePcS8犛k^LM:ͪqNtDs>PCP>f$hpڙ(9!;8 H}qeNPJl',b=EYe:đ%JSU5'TlcVQ0Q%kɸ x ɫW8Re #})Ch峀q6s3v S}0F6U*ѻP\`*:AVYBcwı[IFJj ZBo PlY@COꋞ)Q AJ]zzL2rFCRDEntp. [pizq P)Q3:A#Jtʇ p }Ql 6]Ht,W]c!LOV*c>`5,A? mp}븞70|>dNj,I%:v 0L$w2ZrѶNC:w E-$R +)Tx2ƦH|,"kl<I} ":8H9Wjף- lEH!xb1p,= +z *gA13ȱ!hvGQseӸ_( mJ7RޟEǖ&tLqR(Y:<"Y߸5, xX(7ɻ^Ð +[UV/ +endstream endobj 16 0 obj <>stream +|K%<@̞ !3L8Wyb{wOjӧB4q\=$'t&Ǝet\q|?Ҿe&n*1'vP6ҘO !e$ +w|ag ^ˋglũ.Ƒrd+0n)h +^I:`~ yݶ^ߦq2cA2.qhΞ1Jn"OnD;DZY?aS8joX-h= dYp[ 0ͻȱb/8qlK]O^^lSf}mрMΊtV$&T'C6) {#.04zP<-r"ip@BY@(QI3"oȤ6klrUDB9b|1+C>4n޴YШ3ueƫGEZmc|Œ{gC?p98pv%6%2k"}QR6֖ +A8yiK5M洂|4VbUjZVuHZDZѥfh&_l1e ITb02؃Pd(1r|_3Y@~&a'8A!pOABJb89t`0JE(9tI+#PC')RǏj1Pd)Y@0qKX& +`1YPm#jš|.}:lsf`$n>g(L%zD|F`ļ!Tٙ5.KZfKxOr <&KbȰa +qQSܑEV7v5hn!Fb yX7 $ +.6?>O-_.#*RNȽ& %}s ycz{JF&ݸ6نi= +"q哝BIVG9 Hi _S%, +õ-ZX,Gr` pRqq8뫣aB 7R3oU;F e#  QBO:;l%9#4b3nD;:_Zx݇DA! eEoBI۳c@/|, ( 9áD<&%~f8-QTk"z]O =F0^zC+208AoE{;VqȆcnRx`C|1$bu! [s}lj٪jNr-i^2o:qHۄQGɕЋ@yiW, >AfMפOyGm_E +C#[yߍĊ!Pjƅ5o!K6oJc5#7$׾II2DzQn8d3KO,#8cHX">֍!aiöH'<[m0C\#\ùomDEƦճwB ߈Ă7ӂ`'"@:&L` +ݲ`9L Iȱ%K(AQ1FS:SS4f߈"IP)}PIu,jEj-H 2ړgA"HzMLhub@|p3I|KьRDmxfK8{:a+VeL!u +v%ܓa#5"m0i*$;q R.Lno(d%(qnY ش7:<5t:Zzvڇy9؞ri ǺM Kʐ Y:U,{/P;ŜLWH׬}6}t*qWojC6"v~*~Aá֑%KIǶ/GsR<-}M,~N 7+B<2.Kc7 R^q}?)qNqj{K(\tNKDm6*DF($h5b~_| ǯ[@GB,lj_lוV'! dQ4cViuߐ쨗ovL +wCY.MpPf=P๞O +@.w&G<*Фm#2cXtL:< < ډ+)TL +I2xoG^  ;0$-je4h>CAY@`=qZ+֭&zaO0?fUcP>F_K_rhzH-g(K:fX唽(LH{]"vD65qܶU8.SmJD1pϞ%i5p8 +p +vaoV4WQZ& YN*Y@z;QɗCokމKY@S(ͅA +,FDѴ$qwmoTTލSv/!"Ț1r5hRF|bE=5+K,-- .PɂMeRm#دzl4yDŽ"P4rqT$4 N 90V [:E7""٠(P[9a9 5EcFC8><׾$6:wf@.25N^gJQ%9l cT!h۞6"FQ_jP/ԃn$964m?@BU[n0X.C5FZˎՖ]!w4-͡Po7o Ucs{*kFax5)$(aH$$SI9R.ɗ@C +OМyT%F4XGA* +jāf Yxx?^MdQ*]HCol" +J&Z >sshp'mJQvPUqKt@T`e\T`%^^hQrY@`I'_x'0'0#M<k,râe8 -1ٿ3Ђ E9o\d[9 H{fNL͍ +gL5Ip$+bsZqf+?51 ;Jͥٞ u:"@uXtp, @|5G'Xji  Fs몒vsX싥O뺀KG u?M0o/K*] +qMUfq(@$yAWJոeSž(ʯV +-|nx\`Eo?@P 8TB, @E\^3btc{f8|O9V+ަ4^vUm*v C,Ic@B,@=ϭg2`2VjT?@}Ba)9FY_Ȥ5tИ=VP9 5swIv\1,!)P/ k>KC(m[xWX6L(URF:AչcDXsďV# !C( N?쒨Zw[oÐxpy?Yg o r8ida~gϸtGbO`VvɃ[ʄ4ZVO]Q+zwu ;Dlk" zezIȗYu&bΗOJhhPaGe*{] M'XiKb[Rukfqu;iGl"Ds]~ [8/[!c MW\ Lc2eGzLĀmIsJy3wc"ݻemS:@M$4qK% UOh AB +*bЀLۣG$ +q@%3 %x%_CRX9So|NEW;%[4(}x2`8& fJ̼F, KB-Z]v4v|Y%29 8E bŒDXW7/Ot6W0Zd3lp`qY@>f '8nr띸 y,m-$YU?AqjHGN5)w͜YIJ;7BBOBrbvcH\Eh9-=FX Bw-u, idԨ؄„e''2 ڭRS9d5, GW4cW3 =n +maPG)Ai$gJj;pjYO.{Ӽ%BDPe s>ƆT0,'@g >h˜+9{ gJash0.:CǻŘ41^l geR +O$wՒ{vYw՘l?P-]x0[Drq$lVƴZ;(z f'gnT>ر:qڬ]%SU`$  M/ǜ+p#y 1}\fĦũ|4Y@h* 3i32wdg (a=Bv\_qI/Gv]81 +0J+2~^ +3c `mY@R$_\/[x-&ݤBD|%yօV_e94/6nq[qI9;W6sѷfA:H e7y=$%cM9H9DŽq3TFWg&t[v։dquLJu+!b!8Y@ (l6G5*٬7jʐD7 K\q~o⃊x9Gi|(Crwl!Ê>_@9`uAބcG Kie3,h .D.27Z?_1/i$pسR V)y`C&> +X7#!GMvҧe$ +Fr'طJOG[2aRd@&o|M'Χ +: ?QN@ +i^pp_& xM83$Q*=ԥ+uXAnS={f@nx7f&jHbV537$\| a2œ-N/mPT+ +mb"iZ5 }QbP=*5,=tMI~JVS*R/ ;!'hcmltU.jR ~mqqY,gDZiOR-e0 DC3ACe2l&li/ŷR{z, xuޢ!L 4l +_[-Yߏe1*i5d0RW nxjU@[^&_$9, k!#Ļ~z5+;X!D\YE7BkWC}%ofťɜ/\'/s~B΍`=dALCᆬ?+4(S6Rޒ] bbn]$nd+D6gp0,F$"%M@R56 ,^)[I&"d:䯱,FQـȰI_Z%йIfB/$ sod}I1q$ #P +si'qϡ$Gi2GFC|p>JR?_ɛڲcDԇ^sb]"Z?ɇ. y ǂR%ܷSYo%"z#6xcBĔ2;48fʧĚ/vuyέb"P^Las3d7W%-srGzދYnSnվS3 Y@02w{+ {Z%>cFL~q8LfAѨînTgPv}eire 3 ?:, XxLWS2qD dr6Re]"ju3ȈR5DK*umPR(vL_TzC5 W/B AҾvcVB0#$0U Ș8GOV\l϶7,np =t1S^4)vQ-Qi &K2H3B|ItT<6 +Xqdda\JTµߓ"´N/g%XWDA\&EKN- +8aiOe7RU Cθl oӔ0 Ƌ6u_B1,Q` +dz͋L̝]i,(9 |I?z[yR~ǫiͤьh[H=tG hb{&T^ +0dGfʐ3Y0;ihy9Z סI<'(mpnY@- jǧN`ڎ1Tjau`.\MvFֈ˧3a-#2#']@ +pn~-k)n-0JDLfi!L*ůH#W mR٘sЭ@qIv-7T8Hg3`<~!Kig u:0&rwKXKq"_= ӨpYbDn~XvXl)w?V,ſIh+ +t>x9mp) ?* uj@*?\'OrHlf\3hWJW|տ`, x%7$&8 7 \(_3[Ti1*DIL {kXHpw(wįU3yG}*n 6s:өXA7)% bxl1ZZ5F Yݸ.(tCV&`%QdC,Q{Pİ6BM6/ ,'W!,#5U - {b\ [c]f/)]CYr/v󠹋FԏZV" ~x."oB.ly߇M >5o"AƒV.LpWtC. )| a4\ {TxOɒʌkvr¬G&sy}ty, bsFZ"O3Q_{{#P}$KiBN69 P"^DtOuӴᏀG 4%gP`L6V"&EԜ?@a+P},nz!B)sV7g, Pmkp%&`Ջ JXjʢrt$LuBO"BL_\1yk⯴tEdA@>4*Ma2 + U^X]AΦ*C׍6'!OYiA(y ZPrMiq <ܘߔzב5wA' D|QLiM,4G}˾8F*rj * @J8vVn&g&  +m)n>{M@v G2 qz2j䐔h G)&;{’W`/B5, wxU(\-~''$W5W9M6W\û<̼JഫU!Irk˃͊(bڅj,g嬣eAOڗ+ld@"Uvt#}~d#$LF~KG5s]KC6gɀd a> +16/dڙTt6Uەz(HSKDV0s\qfj-KvƩ#!O[S//PU29iɀV'C"_5$kCH]U7zV~1Nx'/_AEUJ*r% 5y{b-סW*eHlBNyB)TxehY@@Xxt*}޸IW0ٗ 1:[0&_8~x.J#.Z&o=WH]'>)R&+$&לX|aGTNQnTn2`ƜNgX4]e*QqIkϫNY@\sX`5w;T(I{`,bʦ"C6w^X-a+J1I.S)QnDe% H7bUzZ)(A&Y2FsOBaGO %tOF$rHMvps8KW?yT8l-D|k-k9BgkeNnr ٌ(Q*㔝Z5dd>  + jIHDz +xD./,j\])j_ +QǖAJܸJ0, X-Z>b +a1R('h}o>aVfiVxG+gzNi͓ P0dΦp5cRIg0֦W8:p4eO'5DLhVjr!Ątb; R˄+; "`&ݻJťly9 RXwUIW&{`n* Βv1j&ÆRd8.fr IWtsQ>Y,Nb4:{,X:(77[]f +: O6X1/b0 2ƒ+.hfa*4M3;*  +Zĉ%)$7HmfN1&(esWN)Q w酭#$>~v@4o|XE-;=Zly4D¸4+u%nU@I`(.栳N )'/4 Tm&(BOYOI"l"f[ ºX׻ZQ +&b#* beВF)TZ R懛, @ȇ2XmHO4?ƁV}rN۷U-^UI˲]WMC| S6%hcj>Aent5 +1݊nġ)iM'[tP#u҇v]3e/xe(mOg3gݒ1oѯjʌښz aԡD*q;*p+VVFcXVC|,]8l/=enN E|Av"2-wV8VVq@b/:C;i-z'm8csgmqhwXв!-i\#S O#IH>DaGaf\*"* ɟ.VYߋF$%yƄf!9شHiY@P~:aw +ֱhbBiyaH=j8nzmŽmmnBbęK>e\B6cO{._ള?S}{i.IP9TVV;,O:,gAF-ii4Ν;Or^&,5"hr=!V*G>:5phLf;I>99݇| "JXF&S! \"ŶBI;} cgRJFo4> p[eA84Nq %+reb_&Pal QdWCB&*2}p8IE \fq4 .M s yg)ei-örqTC,)iH2RKyxb]C~348S7J5{VZy;RYV + R'T,?IzVLbIUdAdA&1Ē,BgZWZ`>4*1!̦"y3j.t* ‘IF $ h+CAP Hu9r, d-Ŋ? [O$01-16Y@0OZ 2 Unr]Te z_L˹PϢY~a%XX4 +dGsdGEF|HJ~K;J}hKJrʉ%t0}ҝ1x9^*++)K߀Fp7kJ|IT 1F2-6e$,rvTy&e|F,4SNpͬc +V +,9E!;B +`󽔉5iGUkMNB ^h Qz;třQI5n5 [2q6$rM8W]^7 vEGi<3C*ݩ­M)c)U#lU5V WM1Xpa 6HxSSwF;F0-3} `I/Ux+Hk|>F@Z Ql !b! aF1rJdոPlftc> bĹJc4˭l,׳ofbp$7WZMB>t]27OΚ,  WbH}@4cк wuRőY#f +mBm o@H9Zܗaf +O]~P +0[tSdPJ4TY ++RKhe nt1B, ȤPנ.љ҅t2a <uDC:pBR, +9s,I-9Q +=]zzgQe&$T*^Hp? dPG"WI{2R㩶JU\ +Q@84(lQpχ?jq 8 sbI#ogH%%"G ĤbMꔧm{c[Jy[] Ƅi86O*AXRRȻ +F4^ 8Z:.Q}Ƅ!j.7@>ŲԇVofݡ[S(SxI95}}ޥthu2nG贍 1tB7E>X!#m** 49ѝ^? ͜,B +Q>?aTF>Hܘ8C9<;d13=㮩C/~Ê00<(1o+?l+?Py[uHl)ګF B >EDB"l ZLv]ͽ2 F1M<΀xl ЬI?D_|"3p XΌYb 'ҵ"HoLm2I0S !G'ǩY`I Dft6)tR>ԣRΟ!2L?Q{Y@L;aE|u;vO8J!C,+aH(siO*'%d& &CrkPɟ`= dgڲ[|8B$ԍ-QzdA42ihŃI9#Wص?C||&SIUl, qy!)ւS9yW ςr[~L2ue7i`H@g+s4eA* ܔ*i&%)'MVRB5nrƦ5+ 63JhBUԆVm(%Ն~?ݞl2*_%'@WN[P}} ř{Ex4+Uvqgi2 sdAdAdAdAdA MrSd} RSn1a} y6|rհ5뀟0wDITuVV9Ss*PDT$rhT/hy* A,|ڼ_^X()&[Ҽ0j$?dV~@F"["%rjebVUm G0oOax \q1{B&0(P0im|pHe Tˍ&t|cViOvWK£0ڰCݪ qSbdfoi+*!0)j18 zo/dx[D7ӛv+'61R[! Ktd~rt%&p*Co2׷Jmܦ& !hQA#RI+O D{JG<ɔ,G=:%4O)d"mqw6a9$doj!Ul, @<,-=GA4Ҏ-Oژ$շDЙ5rؐ0i@7s:10 %KVeE!E.ɳ15gh: +NGD@aJ&RSY@Y@dAdAdAdA,ގc'$+bUVBesF& hiΑÁ(abh52}SĪo+'VY@Y@v h4˜ݮS派 Il=VSgR DboA" ?QoRټT!b")HRG]J-*8#Ҍb24|* +NIg||;Q +4d_Xs(xA)cSҼpL|G29"Y@zw(7M--2b)p#B{M-r/zwa獬飩[!!BW>93qb䣌~ϗ}%"0e(>Y+C^x(BjWΪk7 +&NC@3h>mP|Gws*pya F|Sx) T[V@h|,k(ܖ^귕~*.' )~jPMdG4/oyig+ąJ<2`T^" *?KjtB)ZY^ԑκ9שX  &Yi@Q}>A*:xݲ,!ӢVO8jt* &뉮 pl%[y³C߹J-T%_2֏~&*jJD[aJLI +[RV 8b6?{2-%K ŸöQh"ZVDq +, I7qr10H/M?vR(vG 4M?k.3O~PddU>w䑅>d1TXFdXrq\,4x"R?0q%4_Fæi4{pKޟÀG)R/"zz/`BZ )6 vD( w>9p`SYI qo1A|:YLÚj2 ^5HGLJӿY@zeJo BG.`{gL&]K [d[mmlTDί2$f؆) pm,L9 ?|e1F"I*2q٪H,P]4[~IřWR7 +W =Z l=v,C"(`4Ac5ԧ98g#~N0hcN봂ff]S qS!w$*a_$Y@Ц:e[ 76c:,AI;d/qiI|`J)Sӕ9sk7Nx <^ТI=D^BqfA'!N)chOj B$g[!'OF &ZTYJ+~]ӽ +}:V gQ-FXr3|3ihm2-/zɕ25N% +pp4X AQ~a`5h0'xBLn&Q~CD 4:]P2 w<'7C$41H?cg, pEƥlAЪOiee`NIX/8Y@b RBхAOz?:@_ =! R9$t7Eei*XZ텰Te-(jwɢ" %)#0x@᳘]2jAJ6eV)|19 Ӻ-{$ZT6YNLMh|%WiQrQq6$pPZ?1E-Aی + ,BcuF$F +cDsL꨾3̓#fԝ̲l\Rrɨ"&:LgltAX&Z͗\bpЌa[)aA;惇S1=U-8tlE@iˆ: :˨v;Vx PA"@9oj*L@hxgVPQpF「85rm)>g{OՆa ,rH}E<4'FY.$Z}y~W7۔jP`&rjBzȊ_sTFfT3qšz)G4-چ!s Va!hg0ejUS؛Չ[m["*v&G +/( 2֨HarG:s(:R#cjHJN@ $i\ߤ6U`*DzZL'"T`#_5jW[j^eKgz:6Bҕ(u&q۝Ex* /qN +9Tc8,f< yxN5~NxTplH, U-\J"qRɜ*"4tvw&\o#{M}VJQjxsZ[J̣MWYOzdaS|tԏ/A_XaTEo/-uqg}`{Ss-=vUGsNkHTڏh"T8R3fAy(ƗTX4bqyџDPA:ˁevz* | !+HD r=:;gEfUʣnmφ,O$;4Y:1mٓ*x17@4fDzjT:+ Rf\ +qt6*BΠ B){tEJ!Zc,`S5(] x>7!̛h;t?ƼN{d1 곴FtGmh鈓۫[y "as>!Y@/S =%^uӽ RdC vцvyh報7^`Q"it +2LҴ#Ѐ0 mJPn Nz›++(LZ9l8LA~(c2™dVgO(BKYA~uHt, x"Euvd4E\_Y1jk HB ׉2PL"7^ 3'[C*kWgr +Bm$SXBhz]ҝ R1a,/D@<4B'Cj]0goM9Fg\F, `7b%\V.&ȣ4w>[(0wT@]RĿ8C*5\]؂`q{ +.|*p֣IQ7 E(Ӭhz{*F+opG!;$.5&1ܟH@hipH4\q^ }yd7H\:I3Arׇf95M YGj*l.U_Vlؒ<4|"Y95MeR%+|` HKh~{ᛐ"LJ^tSDơ jC=K2wHe!T)ʠȬFX8 4 +HH +_cn$= v r%< aa|$8ӹ^,ݚa| ]1s3 80GMZ`+H,g'Ή*a8Ȉ2su'0EyeQUtuŒJt2lB\ ȹ9%pQhMlVSiݒ'D +k/T1lT, "TMS愻1Ms\G +3WgE)d] )'Z bSW b!J%C-VA3'z_o ;Q_(+dlaƮ "$x&]mT8j%lNM[?dȥSI)膦)y*XZ{+, 8%ZYq즫y22UT,!\;ܶv@x;(HNYZɺpe)0P +a&oVr, 0#C;2٠* dgEFDьLʻv#=R̖=*Ǣkx"n/j)4SU̞14l(eAߋOau$ +%u*!q$Qa@ QhqŤȠbX>NikV[kgwΒ=asDəy8 ^簼oR͍ BewaĎ*Ԡ+XJH<=-DT$E4d܃ف>k +MK3xΎ-\ZK"r~\E,ƊDuIq4x8-b4Df.4ѯmOSe:nsG*$hHT)Yez*UPfqD5sȌ DS,KA,!n*Nbw(M?rڨՕVpQhb-hw01BX;uh$kzs`{Lk#} aū}qHuaz1;<{'Q;ner%C]}Od nr ?oW[9q#x4=e~ܪ|1Rfd>F!̷i4VZp\ +#68c\XdJ4>xqrXPCfY>5<08, F~ػ|/i|p!;mُ1yB/ϓ73Jp!ʙwޟyoy_Wr+{ 8ZKHF>HXZ5AMoYqGv &18s}vu+ REXQ*TZjhyWau`8*6&tK³ KfWAu|%S^)s18xؗˊקXtY5`@=jH6e8O O L2W wh IהAa )""Ÿ΁%w +U!^R`W#6.i~8D: ոI>!X`#KjY˺&SuYqb&WI<2\|[fǕ.vpBfP*EDC'u%ZPztsk]j:ut7=p(QK(l;?#G;6E'Cd:r +r \;$GOkfDI34T@V㤱h[5P!ɈX?8xUor"Y@m,5]R. >7 +SymB <1tqc-=^ꭟ6Wfr"BDK;¦8+Wj,ZZihp/f|2pq+@6-<,+G ϡK.Ղ{FZ١Mb {vQ}-8 Z#濫,]A(G灑t|]0Xu(6Fݍk[W@1;kPvZ2({X\q$ڊΘ"5aLl$ ױ !*&.I oUbf<:l0R!dEN?:%퀢 =@nSö`)tv2!LvdžT, !3:/5Քw`rgK8 1[j ^sJA&@ jIՂ@4;qgA7s3]Z}وQlrCVVL]`{k>i%OkCGC8Tk,0VpZhY@Dyeԭ0@Jev@Dq\6ȐL{Za[0@XQ7[Hy֋ȷ8Jv8O,)vLIf' (H>I$?:(,<JSa '5-S$ ['1b~VĒY$#D̡`q(҄&r6[up)cPaAB +I@ 6ǡ02s4xvR![F Sy6Z s=*dعAs5ItL˘E T$n =ݢxǂ+O,$M˚hAJziΧNy!Pxh5/NHj5E kilHx$,QqZ|?otGXsK%0/l1ukòBpy(Ð8lФqhS69rJ{$*Jۮ#?, %f<8|&e. +J&aE "UW ȱLK@[XO5(i(-!E6j[mY@mvMeخMX8*=‹w)pQrȜ:AAFO=.TVAFB2.Nfpi\?l/9qo2 +8.ȷ ̘ 2]^̇xeLʻvxJZ9a\V`s&w>q@̣@Eg1oJ} +[SV܍rP'tv'_~'cO>6OJb[Y@=!ZML-l£+60Dj=ےY$1D |ؖjz3`JR0n+_ !Ĕg5|kc|B"_B>N{h~>k%oR'vkVdJ*E(R*Oe/TXvA't]-Qڽ3d84 &tҌԯ+?(%Ert[V tj%@Odǧ13Mi~oK c|()B#ܗ87fRm(Qz`'-GM_J%ʢPYqB|- a %Di}3Gtq{CjIQd`p`@<Y\K&+ZVh >Oܫ Ȣ`~ҍ2UЌ. +3E!h˼Z6Hh.?m`PS ,I @hwZ(Ti^R'^SqLo8VxO.H*X5ћ H|ZoWd%o}'u=i+߉ey3Z-[&ҫ燵(j ݟG 4cwSŭg׸fAH:73@e@z^:{k4BkzA{7U4"XOQ ?**%mq*\e`zLl`XTJ/L3ӓ&þk^!zH΄ NnLRf͓{̚bp\ڲ1ϪVZZ}YEs3R +ud2%ڿ)DI@T]vw4Jqk Tfk&+~)dfFV@ k gC1gTҁh, Z, 1 m] YM(^Ӑ09L[st];I8J"V3'D/7Cm[L{R7 p|RbL{>Aqj1%<45a-fs=*6eըU|ArkI- _Yx\$. + +H] RpO'Z s`= +Ž$MNWHbImKWJS=CA`I6|kP8Y@p=jܑ` l~ȳ13 -6G 6X "+$-ޖ4${kjkuSʑd[NO,f~%ƀv W- +%?VTQ))qKɈJ>F"s-dnLGHl;a;cjY@=Hr7Y'"kH)u#3F5}`))oI9ZJbWz@~LgqXT*uڡ5mSY@@( `zݓ\9|rIn mt$jmqWZ]-3|ba*ϡan µzK$Ng}/)o*Tk6hDFB98g6#F[>0M\JA4̓ujr^x--T: Wa?ž~KF`l1v˻cLs +úTH(-VqxՌOz?qKvЈeX;Fds"Î3bt[^TuBYIP^ BʃNw_IZ '%"O.VP ]5iKefؐ7JcLhfbM`Sz鲛Ԫ+GUȊD. EQUd(mn"xft`$}ljhs. `dz@]wQ V~ Z{k%r>jw1t4 m9Pť1 +)z &)rZJq L<N&eyG"U=iSVI~Y@`0$odTJ 9ۣӾ Pb7Ĉ1)A4ub6/^^HLY)ˑ"JAC&W8WRr#{wOԻp݅Y:?SLc%]ilWUWyMe+maDvآ6ʞ^Xx8F-f>ԽEJzE6G;Jn}U: > \cs[]1 Ir]4[k- (ҫ^8"bh9M:T7xg{N# /(Tn5hv.sj_zl" ۑD}]>dٳT6éˀkeH%[zӘF:G8?F7,9|FM<%oAEXږ(RXVZX^TEas*(6b˲#*v 犿r4Q 8pIdId,j CMZfR[SJB b}8$Plq=^xlJ̰תJpGxJ5Dc4 >Ut:UaީoBPaf9V}QFX ^ZD);|=%Ț`AuT2!RryXТlac?\o~L8bI]R=hMBAPp _@,YUF>7>7rl oJ;x\aGdT<Ax8_KؔaYW٣FaC–Y@iѭD9 + cx;}e>,Yꨗq;@$C1yN˜qS7caI]UYxa4"KtxR=P19t{P=J ?cD߬{f9 +e Daǂ; 2Ne+?h*vU{Em}LL.@$X +z*Ⲕ6"i|w[,rH0AAB!b\$p )I[@1 gH +!(BQD@HH2@ 0&sF V<< @@|b8 !8VMI:h +Ssb+Kl+ɥɀ0P+\'ր0)DU/O}B\G# YVk%N2 0[U| +TȰZhʠ)S=dt_0PT*Uͺ+*i(Zi亓1 AK b@}E&e-XԅQcW6:bA@|90C( z\ +Hm\/KD5{7̤GHDauHP=LEu8ӪX +N!`h8g7a_sQB =W/5P d]0r8 ;*f\tyzʃ`Q˭?u +Ybz\վ\ĉ/h3LI+[p&6j<|XbvQqkҪ"Xqڜ,m +]؅||~Qt?N|IUh싇t4R9F ) +CWjU3ѬQR؀zD)k۹LEpı8 yLR-("p5$N_Be8f7cIR]D; +(IW][ݨ qp)5QcM9AI2bUG;4qk_iHQ@0j\ +lxXUYa~6qdYHlz,ѬL= +B`AI;c +q |.r h(:NIO?D ^ `aGy(p9Reg`Y ؘC'cqsloxQIER +E7j'%gOAKzc? +4ܒjc ~*ј ݚ[Rť||11R"\ix6f@xb%=a1E`A#])#Ԑ"VC$N[h!F<֛a49䓄&QPSٜ(bNN?r&D = Fי9uR"#Ttb:jq@lS^nCcX<PL>S!$+89 ymp648[|N*TO LU#GIJj/QxhT)0L&9~>ml2+1=7ZQp.í[ +.T pžy1*4!>/+8 C^i 'PL,<0ZHOE2@`9dž!2RX/HFZ> -ZU.t?2p2_/Gf7^ ռƆj7@ۤcgYH't>MT^$5,MN|T,v`2@ cgD)*i=U7iRCB}c<;~,M,2x DH}>qcQXEȧ@"b$[04e _))^.c)Fx$+)Ut^+8}bp²f„eYE'I:0 MDalD,$D 79A^+ h$WT1Jqt:}(xEXw?\ϛz# 'lMǦ| Y"hC!"Ӄt )2DnMT84>_$*u^5k +6ϧ=,݇u>:HMڟbmwk#|*> Ƞ^. Ӕ⥦QgTwADYD-ud`zeÄh1k]usr5 :Ktg MLJ"1BjV\ OFlS}L.}GK. 0)AOHE!ro"30)Aw*\TB̄)5OFܼDA7^3 :Ltd%pYM&ⰡXКJ)|ŻD!j[aIzX`d+ Cn~YH@4SyJ3p<\ԡ@O|b+ +8|RH*MArZ* [eCtxQB_b# +O>aO20 +""5ˢ9 (ny.,*h!M ,28J'D~ xoe=HU5uPMX*-Xtᾅt~TpkȇOǴŸG/f%>2,lܑ$S l!VC6` p"T(ɾ.x렩voU9% ZS^}$>f$D(| 8y s$S{TnT>ꨁĕq;SJmjj8[֢p8 :E$ yH5|+ _a5ZO%M!I^ +z1F>*C ++A +VYAbߵ4() +!R3ᇨnF}>}>J,4_z\:/2E Ye=oxG/;VaIԆ0|6*A,i +, Nf˾ݲ(W@D4 _r<&}h_V\v gl +_? F'kcGs^W#4D ʑˁeM<8*dw vG(ϥ JIJ;e6=O +$6džۤN2|'EB6oA^kQV^"A\4:&#;D Wieuu VB:0LC70MLzEQS,r|q~H? + (%^5G3,q-)14-&D1̈́* %@ )Hi cŬ㢘, +87Ie'׌M*єi; xJ=/Qgs/Oǘrcs&"EE]Mg5 Mr`C5CbҩC+hW'k&+$?d ,7l3syN\\t»z:oz:"~mU35!)eê,JJ &YBU^_/OдWEJMv_{(~y`M\ه/e)FԆKkNAfVx$R]'H> \00R|LJ21L  fԮ~5F~T*=NDu5' }J 4دo4 pUXxbb۹zL̹7{zـY8P# #I'+aBZe`[Y[+ zkpq `இ%xH~@,@CQܯ.yI&&%\7PB#RK=WPgB!p +)+0/A.P("\ @eDvQpIS[G(ᕐYBΚɱf +޵ ɑST]NGXrrp.I6y2[0B GhFrbk P?Bdbb?|\TJWU(cuw>"1|lY(J1oG<,4boN]z>$25soMq Ђ`#M%+NS.meUhIHuk&}cjΎ%fdY'C8HzadVvkJ*Wo>d@Fe"BFh# %~z{$|N3@$RU^F8Hꐺn]>Hu1|LD5_kea uDςPJ y䇴g^Pjd{g\wv=cA K=Sbqד}C~*v?_g +@cfỶWD~<6JarqU&Ίg"G<~Aϛ]:| oc ?qBpё*yHUDAuT UZ=2x$*4s**@$X$hbq>Q '_rH>r:=s/+f{" `azQt\)BLa[EɪmD4+IE˭{Ukx7|(g ܇?`B?}%M$:.ȧR J ƳwTD"Ұ63+R@-TDC-1Q@}hOJwNÿ?Ld';|8|M98| 2 +2 +?lUH#sRGy**a}*خ]0ZP$=ɞ>^w=Rn'd*GwS}l\>, b +RR>=Ӫ PLuNp9F:ntۏ%%}A>Ҿ~S)*Hb;y̰} 3~0SB7'Vq + #ظ%aJauj\7|1_ +i=Yʆߕ/w)>duu2|K=LGq*pQpF\Zɰ.Q}EԾW/pL׾&G ~ )}!b5?$orw2¯t§ݛslxL_xՆ_{ %6Id+ +h%Z\T-x;Y:%d3ihּR}W 1ln6*ʁYL/H8Yɶ p5,![x&qLAU*v+$ɒ r\=5( h}]),rIziKpENMXT XMb,Olhpz8U8. +Spf%n2=bDH +ٔ u֋ꎥHQT#\G澅R$sj篰ieqÑxVMphYD&|R%!=giؠJ9q/2(4P{0NcL[2y^3|ILD{Qåw\C ]T\pYe%BKJ{TH +x'.K*6{rdAӅI_1٫-^O.ddiRqxfDڏt[*]ɵJmO| E~/MdIB y0en0P)/PU( Ɗp\ԇDa-&dhLvG,spa]2@ԻMHp2uZ|ϯY;i NtEsE +'腾OjVxl[`?6B8:V.DeBOJ <,tH *Y} V"2c.0UR *o,T@`or2j6@7+$Ru(BLðz4dez0K &vQtRd 3e-X<0*DcdXd oxlplA$gKc'"ie#GA;&=u"PqS,Fj|{r_KbbT/BUiDYa[!ia}fi[ J8#0h̳_hIYxaPpCcY8^X&>R"_:?Î;z#뭪Ϙ8F:e`nM?AfLyl2sRȷ}n;+KzLHG%V5! JJ -)ǣ>)~m"Zp 5FFA{ya0dzW^=j&cMNY +v6uAA~ T@4=#O4-WL!Uy >"XruFF]b:J5lCl7,9VO~'Q-V!r#P@Mƌ>ٗ`#$twfP /o5ã$*f$X=PJ@xᝬT_#˼<a8t6Xׇr=4 ֤+ S OP][-B%`ebal1fa{1BAK.*^܀:eZ$7zU i xyy|pJ4EHgIDd$V!v@w!Uq2^,~f/خH)SB)Lo9]}:QD@S!KDdS!Ɇ\qj̦ࠧuךO]<^eV]^v`Ncj_O;HRa.j>Dž~1Bfw$&$9LPuOP$NK T>e)J<9T7x.Q^LH.1#J%;eXP8B:M5fZ5v?+ 0P6ƭM`/V@*,IŠV:z`.ܛL\)`PQ#@SnmW}>c?On/:ʅšn#@R9 rВ.TK8ԖJBt݃FT:lFIPTI`gY&s-~&yew2A" +fԚ7T^q7O `:J_0\ 7$޵sBF(0[EyXK'(*.T֕b~нyWgZ>w ТTJs,3ˢH輕Q$D*qcG;NIaTg:BtDLJ;Q8&}Zw ѫ y%` f_b+̈O<[S#_'3ڧO$^ + \!6yҊ4MNV1&ua3cI a޲W;pg@z5UI7~M**r%h!Q`$JaE҈ {$|b2:Os(+ͥO03#xet_B݈{2id@ i:F!ܯBax.ƩAW2(c/eBSS4UX+!aN V[6}utT{vp_ȇ6 6SNpyr':""ɤuT}~ST8C%ŦVlgJqV*wI}9|cu~#]O} #(l?(\HhsKR9LU:YIB9|;E8R`>+11 (2@!Jm(D 5hV)M#U6C)V,Y-@}evVAgH^kˆZk}"c} '?Mk#d-qb3@ĥ'Ki  4) %>FWa +ŅK@hǒC%$ly<&HXyeмH.nem+fW$6P=P2@k=FT"$`ɲ=C΍3WJ9 4v $ &8k w^$gC(cKR= +fce*3Y Ňl(M([Oyoq4ى!c~ZZz4d9r`1He"&]<)o=a!b灾cDAC/ ǰ K(wI%J',_y p +FUkچc +.%uCslh:-\vܕkCF Wq*K#, oAgZCR$}{z4)O}z3@Ŵ7wJCKXʆ慨$1rdvG22+I  :+4Uerk5 M=zT +D͂7M2@CW2g\/#:)hG,ed @ϱ8GJN>c +' +CL h~Jq{G(.NismbaإtNj"$4GQLM(/d#72ZYJ\8ZѕSbE۟C"qIwO@ۂ +v !ҙ˔#I|>8J0T,k?,;/؞/v~Mghz H#Youʄ҉$;0CѠ%!UKnᬗ$lF*Jl{_p}c﫤u9EE/*PT4gTD& /6ETB79Ψ) ;yxptׁt(NˠsR$47R*կL ~}#~>O=I)$)O4I q1Ԁ}㥒>C?dffL]D pQ+n%GUQV,4:_-_ցpbM\d@Fjmp@`a[PG# +WeqnONZ;1N:Mm)(#%;ex:2*;-4|%^USL6ʩz`!/cüR`Mrަc !TOB-U/EslNI>$DHUdZjr,y1*y_M{/t X*.x61}¨qe9|3=+UjXWȣbn)$? BeVUQ}~wgt[6h?I6.S%}pꬺ_ 7sY?>|¼uA+ctZC8M5G$P#k(34Y>?j^,ՠY{Ԉ D#{e#LKORCj=GܳQi0irgq>*DclڱT gh|b/)THfSH;VCtb7r p'O_#>"f/ 7+C?eNnb95<^z yLKE`V_dž{J7:t?eoEyxzy6.󡌂PF#2R88AtT(DjPj[yr^|;TglIX}Hӈ~gMtN!wJ} 0rr$ N)谛n<0iE8dr~\<]ޭu*NWAj/y'w Hpa>BھҧWN..NH* 1$Z#ch>̜*;X`Ya٤)dsV9u6u=^]t~5Q׊>xCaݖhd8ZX3&RkGGE`JHb-SeSH%VIu%!suٷ̞;6hU`S^ ش3,6NI LT*8ݾZ0%L$6 0Q=`9-Qg6NN6s2UJ{N\4G7tIk EЌqwOaId +zH\RR2@  +?B^!;LkL 1ʽttNhQ5(,k JMɢ$\/˸+'aR~e66y3\_.Ce4^:Z= +vO [e qV>.X͜(m>iJf4#KJ(>ӭ +J%)V~9UC4="3Jb'"1+ R,:qj2f4y^3 LHr:f5z@ݬ˩ /3@ 4["**U7QC%Dd=32zjؚR0P4?a@$;Ѝ_BFh 0$,&Vq3$T9SjHFi!,DZ"͸\jHn<)QGouqUg(cbq4=!>(-eXZp#yRE +FpcJGۖ&Xˡݑ?tQT!#X,. ky-\Æ0uTKQ.fa" +I[ ; +G@a*mriWmT^%v7]K6xdZ򥂑n0BJ2@p IYWRZO0Dx~CލWydwy H + +&Xx<ݔTSAJ;eh6'!s@]E7'k8z_DǶ}JY$෣3UMPo&'\\l_e#% @{&J "0mh*syO IlLQe$e-P#Q1xPˌG*]&dTb(YF%ֆNqh3qqfTb+j[я5P|b>EûP7Wb>`.ڕEKBbj`qRD>o&ҰUNoA,! fM|D@}q!!GrD'}U{@w?$AB1A1i0̦@d>B(dΛ`Fv/R֎ XqMF%Vޅ>@PE +)ȍ*,97`,W}m9D(QdDDcx +49LٞE6!W@~WH< Rm"Ii ~TW l!53]i4]ԑ ˰cQrSHк^5|3taz>K&tBoKBNu +}~ɘ{?/@HjEzg|!vd1sʤ+w$P,L*jA,e#Ip +k#{iI ^Z FVkz"劥|L'|$+Y[S8U*[}彟 y}}t_{FCd Sޅڀ)qx*P'jR@,%,,%I d2&^>X +i(M*G>"uߴO0; X3 JTqZ4"&)h% EJ8Jf6*]I%tFZ  +q?Ұ_xއ_=YUqRd$0H pGG14h*Yg i>neCho/ u-W` +[tA\ԓ0["#>>T   @)G*T"S:>| +?L5"j Kio.g1+nNK^(ͮ?U ~ONT8W* b !A"B$+&lXJ$3$} +n渳Xgǫ9ETY.Rci8;M$:Oz+2W_p х+#~ Kr $DbG7g4"] E\C +ZH\ZTbahZ.i8 +|)#ٍf-3@D';L +"Fl$Avyh\it"ƴlޑrQ3FaRߟv֥D7N3`ݧ'4f$ės%%8Kek` A02@6]ɝ{SyJX4¸Z!=PV'ƺȢ|Ш,~zP,:ɉuh[?0}R҇JN2H!!yⶄκ.zS4 < $4D}p s [rth +.Um8gA,DX5o y(m  +[XI2:8$6^ rS:QJ&8V| _}ޗ46n͌G|rכ7F /~pҋp;Ci=."]u4 +m8.W +]lHz%.Ǫ1 A5j7-C>2D"2=Q.C{M +qQq' =TT$uǁ + ~Bm{?W iCBp[؜ّ@q粴RG +*Tk5sk!VheɐܞQp9kD$Ш: +#Kn~!< ֐##'VG,l+r֑GD" LZAOHJ?f'M$L}X/h6dGeEϊv$BWppEID B%t毚b# tmhb H-$@|mo:KeHR*Sf ;@#v[m.;d"27 +?d~V_lLEsF&Qx @&IH[Mn{kZ˕VWW]Q%@ +irx뎹I%lBN^Heo|c+g*7~~/ޯeSSl9+cg7唺OUǫZ**4΃Y+Bz|1ۈRN6%NCVJɬXI ~ڰդR=|'Xr'[,e1|e;rqgc2c D{!)x.^KE1*8@G 﫚i{Tg@e+uPpC*]6[ +hL@5#r zG b`hbZ+T6ض~ea ~>}KK䤨`:eEb2@~f M6݄PޓS'HR8_"H'KԢ*=NBVfP-d~|_z߅E3 ~ [cɒ6Im0$vgxpJłG9 L"̈́p(ަ5OKD쫡r@,K2 +ZkD'~ aXm0dPZ:fȃ2M4SpAԀʹ-'\T(ԥ8j:Nc# U[B}[}QM]FA$}}߬:a0-(JAა%b{ Kk$.a710|"EUb}{{ϽVxM!N/bZBj +dA;M%Qdr-d<3UUp+{Q>{ߍM?&sw?F9 +Rge5Pl!<&1ȯPνRQEJ +IX DԘthG@LT,lPʮl1CwcgsE$!Њ҃O%t3>dԆKӠ~怜.tӝgogsu]ϹI$ =EK9ޠ 0ҠAz9ًzS|J{JjY$ƾ4Ɲ%==fפzqwJ`28[EhPJ RZ;bM륖ꞹXIjzMQ-kQrf"W&8;zTU0NI 8 + 9I]E5KUaqvB.E l< 88oE°$f0rn /hMZesCCf@YP^ȕ_NP~Hd}ݸ,6دn 1pn]Ǩzb>Dcͱ <|FQ|ֲyS " k_XMX^1L bٝN Sw󺬍L]YJ)a skRp'3 .9%^ P u` @0$ ,*A6Z"*qyh}K㪄EHYd>|X"HźfA\,0 .KŴ-I|9C8Φ8J^w p$6)8xb$*aszsp{S3lcX9z,rOQJg g@aش 1pK'O / o-?pKP1>tx.yFL&֦VE7;"Bjmל +ƕ!,˖d}$s c>1)>lXah5,=<4HHZտgȳZy(܌ օJW&K1¥TJhCF=K-Mň-,@0V<HxGV?u^H9e(r42858Uk}@}33@ g@7p}hlS(JI8fEjAeOBsoEF/ sp +$S I=>ǵYg# eώAJ+ٯH h]ڑA>EL¯RgbbVR Jb*A” DXR0 !PSUyU.9M;R Pat OfUcWyŢ'SgH$ۨH[i@]2@ 蝌ZF)R{6d~R1҉BJC|3?b^~ +6㋒8 I0sJȊx%$ k,°aXفHN>Sae2?i'-M4>"bVh@2@]BJ\W JPJ sEM/N[ġw y3By?ϒJ3K,'l!KߏLJ?V!Co!B'S|xWa(9 <7!&e/ +5{6TËRgT +-!HRGvz2@ۙ}l;- =ĊӈXGPDPTr8ЍRQDM ʪ +%m6)iWY -҂?Sߧ[5w@ S0zkEFkt kSe"-y*LTҿM};(]imn& 5}Z T{Rx^!,$s$N?t`Ekk=ԡ= lDy-,QNfA?{43SV *~:d&N*!?vV_ fة )!P}zx>"h8-tqWh³N|qKcT [, '~~_/;dg9 LU2 +FtP`OwHY +#`>H՗%UjUBŸ|ߏ^Wg[ Ly>5?N;h:W|x>Nk}2N@Te4k)bD^K)*킢zS_IJM宽Q3-ڝA)#j"Or:>je,d"[AJG3#K;#v3 2LJגsRߟtB_l%{$ǧf",IcUZ">|4ˆo|V(*ƸPHM k2dJ}{__/NGem}Vm?y:wٌV.9 TD }-I2d7OhXؔ )  V{@t~gyRhf OOG@e!Ld  e4@ƒwSC#¦6ZPH?j޷1Ց}Wk>Z4UO-WR@"c|SƏ)(o)(Q. \3T4 +{Ixn|3A;6)U^3p4p4;dۘ: a=V#f>v+*]j{3pt~8%*i&ex3@<^xx+9Kv|tFlXr]ʠ  6a /a'4g~q*=EudO~_^i2Pf$utт@gE2 ʕ߭  o}uh8)B,@8T'ˡ>2o#D;\W (B4Y>X0%xAƷ*z+EL+}2Ô+ϫOʂɄʫʛWe"~Yq d=Z=\px!л8^$PdgmQ z4P1q0# ȓ礢D8O `JɹD9d0#$(3vK"QEF K:Ý䩂PSb! c BaFʝr`(>K.Gj0d2@`ܨG5<Ӏ: * +Rd?h8ѐBA`bEL>Ԃy蕄!M +m3WKּJG9-\Z)2Yp9O*7W%LlK%#=C9B XD Q">eH,Q/Fmbu;1v@ /kVѨ-v:loD>GnT^࢜+Y0/dY +% ou fzyIMË9x\ B +QY`1C@ke)-`JJ.[C}&CH gQQߨUR"1\z\xIG4ޠfF +GG6uLP 1Dr24̅G,^ c5F9p*Y?*ߜ,Z_QFx0JsLh>&:R3,3+Q͖a$6X2Z:Kb"KL9BHGuB +W>xARBų +39h` +-1:!3ǭH8yU;A1`i#bT2ǻ'r~:،<-&g{ Pt>!RT +L'FwO;j~\ +R29?JWBk ~BPh-(ҮQ<&@qARד>BH!2 #].ӻ)}c߫H?@%Wa1%'u'cZM,y  >]=h*vSTj'z+R+XKPh?Qիyի/WOêW*T%^YJ%74_ yzcþŐbAF8'G@ N(@_`Vu-Ek-3}$^ȫ^7߬W_^⶯^FW<^=xx_$zC~~ !b`م}>FZiSZ(SFbT-U,*-HS } Sx   ` :P2lVpTMM6ƧmQؤ8"jhGFW3N!B_]090Jg Oٸ`qA/VxKSN@٥3M!em + "~<|1ha^zll'`x  za٦"O )ڔp\kf֐;8Qi\2]F? y+[РQڹ1)c. r2c(*dI(:C|61 PA SaG 8s:Dr7GPpXJaTij5H[Md üIkTZePrH4IfĒZ&7HoX@|@ AbzBG5L7JqjT10yi_̴`Ṋqy?G:F ͙bHAˠy}>Hɠ!&9Gh,AlLB!0jXBB`*T V!QM((A#2֎DE[d_ܶMa +Sxhdn?cK~l/( %aZ f %&P'2@#b!ebG#L)DG"1">#7C".W)E,@©hS©^#;pE )kSFȕGd;= ^an%8^/=ըóRn+M؈;y-V.K,L4&3"ELUaTI,Y׷JN%}?A Y:.d,nPrPF7"( +N!- ";U{ +)I &3h-B0gnySm,t|'ayk,O δɄx7$tR pSxfWL>λAcЀƌ0b#)t#W!WoSiY ʗY1)I+!.}lEZu".0moi/ge XS!uB fUWO}(]H),'{UE]) ,ITїLYɘ2%"LDD^qs(C:A +p *I}}vQd 3ZZl@&ʴ`f۵!6Lr9aKb V>rxtUKvgWps3~f@odUFR$ ,ŝ(|VqXHJ~Nw K3T?$rx$(ljҙU9q(Lĉ$:Fe8uG #iOaa,T[T ).i58ߧe+"ieԏĥ3,X>i\v$ sEX)B"0D 6@;e4ju`nH)s]g Yq,:Eűxm\na!hi@i8g.N OU +al@Jo 3rP+g@Q^5q`r% MPgc{5_ټ q̨8$Reʣyhe=&! V@skz"73P A@)7C)ϫNsWz<P<@D[HFr3dn*ֺKa +[=[=cY.\0~alA_vWA78%^/ NLtFvl\j +s"2ܑcD:uԻ(R1/Ub:+jcncz #xOZ "V`BѭYe MpICsޱz- V Cr(4Y<$ `~r3P 8{ 3@y3 2 RnF)!ĿHJr +endstream endobj 17 0 obj <>stream +>"k vS#(|\pu6KUh15qH.\ˈ6_iHx@D[-P4c%rw'fR6B^2`*#td@)E9|L*R4D1*4HO5s] W[PUM<[)Ds|W%CD̐d6}Qں<λ$)a`60_RpJٽ B(sxP3@@!؋2o2uY U\rѵ_+Mh>|A 4#KtNѢ' ~P:ripΙ\FX@FU +K'@7ly SX;'5BzVe@+LBZq"e8 +x B0b^` k -tj,Ddj:v +%ʻSLA*Y ěa/,>#f9 klդ׬M>B4(-_$Jυnz,FFTcLS*JKv4|~=_k,|qjX7x}/^1e ;WL[>Y"*UIb@ pޢgӺ3NfԠT{g;[L9/rԮôb-)L ʇ)! f e F"ո$ACiATƓ1Z:m[_D͢nQ"r8q4q}'tPGMQ>x% >d[.dh<CP1hNF?Ɇr jAN4,TJ'w{u8 c:}75ɾXd3e`) ߰ZG$MX T{df]=8)5=*Rn$6]eLV(ja]՛"%X$kZKie<'$8[HCۊOC^$l2ۗtd{tR)R-qc\ijꛋyŃcg7TVEVYl=S| N4&ᯨI!5m-}񂟚*~o1wD5Iݚ*| +t1X_Hѳ@LjQ׀[Sk+ +>$Ђ߉4GoBR *nj.'w;[ ~Սr+ +}XLi(9ӃoHeaԂ Q_'ߡ# cqO ~& ~C ?o/߶Q3@b م rZǗcJb1%~m;`g@ʒ`?Q``y/ʴi|10ё|mO!:]W,@bbbT ॊ1 F$c=쁖%WHCd*훅<}.'\+͠!ޗ^[C%{]WwvUGЛ/Q5"'Dva:KRB;beq!}SP-͐)Cp #?Dεݩ;9\G:37D ;Q!,ѕt BQ!>r/Z0q}ecH%a}D +WzStp:sWݵJoFGhEځ\%\EzcB(@{uCp{r2 4!N$bC$j#>bq.Қ.T#u^p˰RH["E$*RrGJdi$+(@>N%Zl%&ՆƛTcA1zU?F!(]QGubLքnQ\yLID{V^[: 4E5l2?SBI^BrbRl +BHk+- ;T/):FYF:FFOf>}$a j=p(aGd k9.j3@ƭ%Pd~=)c(I0yE0h.׫m)7TJBuzV\5ZSU6ĚUYgTrAR٬ /‘f[7Ue_eK[:3hf k(K? ׂΜ1*H"N]3Bf\F(qѸ$-X@4xs+,ZH{ÍВjҒ%=4. +x^]K88Ƅ2kQVf&?.04\"%7j̭["Ӏ0 f2e X /h`z: +\A`^tn!B^0ⲀdüdM_ͪT@vQ$kԺc?UIAU(Uk2u2D$@T|%M,D/iiq+2+ dTv +[%遧!")qML[Nnoy竁XDaX50,Ed9 Б(<#d谒h +","5(|1M%@qorj^yEgGLpӌ"UgҢ65_6IGj.L@8@} +3F(LR `3їi#o*sWM0I&wBLgIgOGT.E$(BގO3@qROy =,u\ +_Y}_t&ĒCtEr1"yɊѭy $xxiog$ޖIDhhI+JZط?s6"]࿳@h4na0:u{FMf z8x^AT[ʑL9YE+*ϛYY.|1j?NOhZ~6ǿFuNT0x6B'"\1Ta)^SJ$Q+CHDHT| 8 -:;$b^"@ 5NJ3Z5 `@VkTgI·yBhOWb?:ghC*!ID>GJf Ce?&rv//'B˜P)2Q @:D>>SȰxSR(`oX-Hc!nqH}j?ho\/ ო3@ B߀Mc w)OA % '&RHn;ŹBEPL$^;DL/iZ-GC9& >Ⱦd_̄tT)T)/hQ$AɊQ.Zw{W:ֹ!bֶB-A(i7M}=qh-`h#k]OGABAA-js_8F%71OPTIDCUiQJIzj,Alu6 ` ~?"oE7ʀ>C||?Q] 8ǕYu\_ + p|[>oLHCOuhi +s֓ TTT +iI4SzTԌ +>)m~gk>fE ӂøে% &gNO(.`|h ~I؃=+NS6Kg#i i… ؆l&oΧ2@ :JP \%_A' <, ܋®(fEz?~%z2@6!M,  C)>f@^&H8w QK} &}v-FTEk@8EUXNNǬlD 4Y/)S",P&Q=吏0-^C\D+vx.D}f6JP߁]! ܄KbGsU2EU^o#vngitX;bG9%ԧ+-1y7y/Bݪ{[ {E0,qGM6\ad[r pG\GYx jEB ?Bi΢e!I NS QABq0 89BkH F[Qò# \m°QQGhyȥ$>L,Z%jJjV<Ȋ YDC!K9Gh* \_rM}*[!]ʔ +" +ߊފLR@V׾Fb3@f/Gy-3dr8vѩT_UW/Vô"Z:tLd3"Bɥ!^WZnx"` D428RĨꠈ1A1͈*Nj-<÷59R0#;\ v?`k+vnN}ucQMmF0'[Njr +zQrm)qJUfB瑷 #Cn&D'fG:JdGWo@l-RʵGi۱3=ٙQI.hWF80Svqi =:VM @cɏ$ILO]z+:œ,<  * $נ;鐭g@$c]J/Wg^"Q7:ѯJG0; qFr!,+RAS7dt$yъfM\XH, P^6w%36!SUJq$U9Tv xX1nѷqK4%!KvX5V@$ҙjeZ ˝BEJ ]8梡ߐӚzH5ԑ҃G ;S. +G2-@K@N1UB,\ A 1y ?%K^Z0g͙XD(ڂMF502YQ2Ad"k|d #WB>-MhRCT/Q>ON\aïG7Vsih]RJ@(Rfa$ *P$6L"$aHeCOA1|E |N՜A^@ D6w;(ݐOX9ҺK"$!쭏DV?aWE'S{Jzn_>/JY +Rl4dy.z!{62ʜ0GڋAZybpX~{ 8Ϥ*BWdԝٙ%3OwtR +)Ea #αO,$+oNxobN.]aݚn 9<rA2@@$@L-n>Kÿd?O9Aq,ʇ#F8"p8pOx +Y2@ eԦ3|>d0qdm͙gۀ<܅ӂ|TW=|*EJj$d > †dAо!*RE)+N Ht[!ԣ0QŚ3} d2|.0U`D^͹[+SUj_Hn)QkOToL7/>Ujd/>\]QJ cVx0Q Z(SBAYT +dg=F=ԢY|fR$sju@U\Z!VCD'?-6~~SyS_t탫WƢ}Rj>h> oA $ fb׊, 2TiVEfQ> ܚ`wGO1M? +VB]QgͲ+;߆+޴/lڷL] DuPWwUSU}rys:8<-fO3)3(F4+|nL >a5~M #/%GuB;~k +8gNF&L/G U@K{[Kp /l~vdDM{ 43OyjIW;YZ ߡ٧ٗ?#w!7᫆2IRمR mV6 7 ~_xWZy3= Pq,JU oNMr&a~ >y`:+`:)R1d8JiwK3,"&ޠzHXF8pvg0 ^_&2(pHX>X( yxʤ~bNIQb2&AWbBTf r~Ld䜟J""TT^ЊͶzhQ$4Btyo'~p%R5P0SU(wxB酕^X)@ws !ʋa%Gs$!t5Z  ;peB {2!09az}Nr&zhUzhI&:8%pstC|uk 0^&0vƆp&^7zz9=2$Eī0*& &|eٔjATNs;|HPC&5n, +Tj**52I^}(A]75_.UCf"VL[7mGN W1a2vDj~A#"T5i>dq+T+y1 +R (Zܦ)Zp)ZhH^=V +)!9ۼuEV &#GPo)]@cD2&DXNcR5g{^;aÁb"#R9nÏSpV2@.6,CW7AnؔZ!SN7ja78i<9ώ}b৕p2M20{R-|Z5n4viq(Nl,T=U j/ҾҲ$H/ CxC)ޭPU~./ %I|SRLp >M_.tZ#*₟8cxCvN7')iSF.ԤHQƧ~& תM gz;$sXOUyI R: X (dASBͤ;_@ !E킔Fr6R"8D)-0==` :8Ph6'Ƅ-w 3mQX@A\G8KVaMxr _)Px9w'B}0y,%]Lapßt7<PƢō=ۆZčGU/ˢuylj5W4s>"(͔@hT77c%Bp3Tq;ʁM*iw +U>t?0?o!H/YDH/DGN}zylڥP\6QivHH{&ɭȇ_zEoEpr,bv2ڎ7=&<#M)Z:ߌ,}>նvly$WFG5j8BvHjё""F"$@X$ri`S + qI{)˪IZ=T?4, >F{Mdã<2l)1bwtK;oG ݎ@Pwhw%'Q$XROzg6^朘Eތ8eG%H"Yb]DdyYoHBipC} K++Rbܓ1jNb~ +ڂ$Xc"bg'Y\g!BY}D5RhrYbHL{M'/萱CWyPI4W-Jÿ?4]gج,E)$EgnI+h ϢjSb<BIdݪ_D4@EP"A[ejU÷˫W$G *C, +w_i)ITᠽlG)ƒBAN^U,%~Ug-H_?A\(4oIprU;g@V zQ*I+3\mѳnrH/|>(UzTy2k7c=LR3'J5[# )ӻۣg }.1eIKWKOLT)&XDWo 1!x$U`f,F wA] p,j܊WV.:&CJ/s{ESdW>[!@(XhU|7 ? +eVgd) r_ප0It>֢[ZzTvTRsk:ƽ݅0y{H5MkRe@GXqh}~Q VMuVzHBN7\${(Me%cZGsBS%aytϿ@*ZY*4#Zw21Ӏ2 t2a8UW Q1\AQ!R$q4ߨT + ή.ԧXpU\U)F2@\5"+p,C\>n>= DS2. h)U9(8 +3&*< 7Ɨ@ GN?XlJ +M'UV*ȃD,YCq\ j5lݬɾ`h-q]_zL[dDS)|R(| _~F5dD 'x2NQ%Jj\y P}M}^OA??govW5=-jf?D߀گ-Gb +_d_4!Q?\q8xUT)gXii$R[f$|b$|gAycAuAr &$!| Nebd_sg/i13@UUDۢ uߌMPRXi-Ȇۣ'(o)oA/1p0(ߜUG04 0Y}>afoCwH.&Nn_3ᓏ*)B .GM/K _6e4r4jaPj#=>_{꼄O;Y!#Jo|9:&gN >Z_1 +c^\Sfq!C~^A_Hs0@vw+xi~Ձd*5z7 ;6Ey^ 4t,4+/6 gS7P8J. ySP7KW aMFu^ f^ qPZ D=ziߋ13p\Er !3},Tk~-w- _ ־~>UPε`48ǽ >N?\!} *k! 6bX?6U7y'N誹agl̾س)iUfZJGFV ! #ko=xل* BR4vVQCw}9OoVfI\i #lM8IB'x'-(*YQ60Vkᮏ,CPؒXBf&2<;ܟ2ߠ0g$HoG_iq+U,p~JT~rkrP;^pBy*KY9lK[:u+cq`83̉.#0M ʩjU4; 8>M# oȡCbXB&Մj#Ŝ#jfLjp׷xyn/ƂBm_'L٨; } +Ñ'`%avV_e7Y({p+C!sa-\ FN</AX3˨;h (c ǺPUZupX~cm#pDiXHԑ#"bʏ0=!%@cpNoS?6= <hb:yD|ܗ3@^ T`e ek˥Uy4K F'iX3"9r@3 )!IHmk1cUA @<&,ge@@aZ]mFu#"(ry 6fbrIu՟"$8gpH6r$dOz5CaPhSVc N{E)bAD*K{(Fe.o3F|c& Cqo<(%^ҎM4̰b[:Ȃ 2gbIEHخCD~.~sTv;XdƹTM>RqTԒ9 +_:;CF.@q`HB97'8܈CfRj[3DM"'S&+1K.]}OLĥIdГdC%CĨIg\MKa}HaʩŠWހ!>\RH9с#W?wRt*':I3;\Nxw  52`Dሬ1FQ1LǠ)]|ل̢4Tv V2w(FWy26%Ē?R]/d?+'$Pe= Ʌ`Og"m=I{W>Jy]E9}'FX9R!H,*0euQAFoyH/A|(~Q!{0o!?Sj:ega,]n(˛@TaxjZh1Yd\fXלp#E|*Uvs,E4,i0.xs3 b> :N>  +?(wA&*b#q!eO` `V4RӕqS ;: 5hUa3)n;tPJj j/=}&~sO9-Q,cu|P!29xde6dP +Fnjz3*VC6+?\sK%wO@eQUql[?% +Bߕ}B"93 PnbSrgp<I(|lM|殣ސrȈ(wBRidcI6< à;=]e:3\ 퓦\\PA*|Lc5|> _k3נ} p\lg<;_%DETUO"*-17 5d%_@ 7g!d5?jDoI¯d:71:U2B0-,(O簨 KB> Uѷ%g(U29B-b!ÙXfWDF7YC>2 ѹ |5h6!L^~`@*jS'e&|ֳ Մ?HԄ:/䄯Y|?*߉#a̾b_0UWe?N6 _4lW$Cca$ 7RBV4 :&#8K%>!~ ArB!'|Cf't ?;VRO/w^ +, +~EedN9XXVȠ^Kx; 9_LUQT&)Z!dăuzxWWtzźF4Ut$wKrB–˄6Hj;f8awwNfBRN8)}!^ `  +䱡I +=71%%L ksQ>HX4ܒW9}zhiʊLF,ŒA!}ѫUTE%fF.^K<\AآzTifr2 ?N|gdvBEiU%qLL^Q({)͇ÊpQ\.- i%*JKM&9NPPz:t"DOа6+1(It "@D]U+H |a0 EP-:XjJ 18P)UI, +쒦ΊcQL\VK:S3 hXd!R/0@&ԡ0iRBK,$J ]$֞51G {l[0.n@+mljdSrjqvĂD, p#_Wb+ە,J%iL:LbJbf$1H,f;c$T#NںNCcNxHIpA 1Qzȵ̞0:q5d(0WRG8V1X#.)0OR`KR`~BHa#6)ec}',]\ @)*y`BHatTK܀~`ߎ"3Y֙1yдSn#(#(W P*(8)L dM(%`8CSV@tKQ$.M68@VM=ѫV/-qj܆TMr5ixi, SI p0޴[^iN<@]Rx 6+-4wXh"i&(}]hO&&&-R(l}?*K^S(ϚJ0A(wўik-AUKȡ$Ep' X>fXl? LK@IYRrCg"tꃐ=IUn+&FQs70AXξUJ^\iN#xc%V[gjqp8<heGW[J$} :1FD~ ɖd Hƨ@3ZBFZڜuВzN5q iA\1tJd2@ SnNAt2oZOm/LokU\+BA=_"rFPL1Acu]IT CP[" dɁNSwjq|#cʠ.|{Őȿxƚw"Q +()\X SRBtb,#/=J(yM{(,*RL ;,ƨ#; K"R_?Q)V] 5Ҩ g0޳ +1L:z3@ u"yI#vK#Tܔ$SnJARl#H;f42$N_d)-]ۗ`b#Vܒ&ž(K(׌]Ie!{zMKXJ0NrsY@%PƣCTu&U: pQw#tH+*j5,FթQ#(!ڋ#4CZ1Ufâ\(P8ZvUf@&BQ̗"*49w[N 7A57H!š6Da(s<;J( A8Hr'/ۤbl7 `#rE JJPmAi _ 6'I :KRa +NK'Vh!RB{R~ґn: ^`1c, mzЍ6x`IE>χ8^c"]RDzJ̀UԎUUU0if&Rf%Ԅ-4p^ʩ(% ԃzzOm ^®F[|v'8㕐v!q m[xRz9~S +<36ףEOHNJN\DG@t+h.ONUhS Q;٣-2@@ej+k\))+h#θ v[:﮹ ^tz&;umWVM8IZ{!+Ӈ.2e>ty$rH(jH!TSռ.}͂ +Tuu,it+imneFkڽtmpz46SzEĝF\\Q+ȆtrPqꫢ4U1n,*[d@PkIm'[p3wo`A-qykT/t"7<:p⹣Be״a |%Lbg +Mg (E.,X1-XU-X3`eBB%jVRb%d8:ZXITxy\5o N51*9c<|cK| qWO +Ղ(3h$|'4.+ ק²: +>mx=ELʒ"<( g[Τsj)bpLuꣁ,b8^ 3 #?>xEUb#294S(|}p3ʠS?_=#VXJ&mɧTǧ6?W}%P̒RUr#@(j\D;JǏ 3#e2Qc*ra!Xɦ,2=ͻ,>DrOJ($#2 +/br9& + q薃/o:PÔw$/ k kPn \GQ/^(qLq6#A1+R}N/MR "Hp Gw/%d)>*Tx6)K)⧓c}V B1LEhTg!4MhSPDȺit=>=Y=FYգ՗3LL6 :'NzX.^<d~&yE j90h"t#0GCCzHoK(208-ymКS/A*V:b}i-~}n7W/z4p7[nJL*vj5pj5ŞB7e@z2{};2Oϻ:}2L<2$Pw~0I)zwB Vq³Rp}e8ikߛ&kk}}jߓ$E}bQ`AS$TU= +ᨎ$YedƲE9 k֬={`=YS}}X},]}߾ >x))62=)VtRX'VRLSLcjSS2J>@1b%:6DDB1zL!J0jH&i YI +j@? Z]b ,ՉyՉZ˜d 8O`*1O601]LLJ~UJ*˄Z5q5!_ Bܹi J\ pFiT +‚E;wL۝RUb%Ub_b.Tb9 *19K3%B%vRm%_ɓXeIA$6 sY !1}&knT4iT: ++T`Rfc(8 3 9@@b#1ɽH0.夑؛GԴF`FJ#fj9#8#v mFl"# :#`-dlU܄TrE-ڌb%XP"\h+IZIJҧ@a H6A_M:/`4ZK&+Ґ$-X#/dAG }0g 1׈1G"EB7C76UKF\Lp-p32PB+dp-djFJnLj\, 蒂V-.I 7bG0J{ >#P|95Rv?ɩb2Gp2B"\2w+C uMT, r +ZjAT`!4" '4ZE7&a4,d[#if솅S\psCIº8iU5f|-&?D<6 +ꄩ|@EC! *2@'u$w""u~G:{ʘ'(ŝ͟)"rP( 7u 5 % }$D`(US S!N-&Bml%HHp7BKQ=hpߌdۋs⾨QX&a"ڬaҴ9Hxy|NKx*xN|Y4p4BWBIDj+߸—$+H'R`,jg\B,In^Lx6$HD}[Ni}R ]O8MNM +@q+:3x ?/gzD\zDjG%܌uHyAogOY>=~Q>h0#0]RZ m8B2@C Ycxo_[V;R}МIbHe1$dn%[IcHBq|a)9URV6#8m7B戠SP#m*UjYFknkv1YצYY O[p@՟KmζP̃f'yKsxK$Ih$j.MQLOO39+ 9X?tҜZHMƢ٪,("[iSPrkBY/{F?&J'/96$Bq:5r:O!rrB8Mi@0>eQ$),l[@*`J1l~EN5\R^4j륪#jJ].*nrkA16հ.숱Oh YeZ'%q]n8#%L6'0yyU`aDT(YsꢛO IqG]GYGesۣ~]`fq=v8B6:lUp [۰ŐhlY{8aA BU` #L mP$b-3긫5|AʍueՎj=`u5)_뀣l= nQFncTU to=plt@H=^E&Ճ^B:8H(v`֜W׎"0EX-ZX`b3@eE!$7Chc:Ͱ<&.sto,phR8&~"~~L=|oC$hx#Sтdˡgz$7o-@:SnATXr[@qhpKrq5hd{=zՀ3@V@24_ DdiKUq?Y,Fh!}"&M>놩5UE) ZZd3f.FPͽŬIbN 1Hlb)H+ˑ$̯ e+2K&0D^̓x cL1S=R2%GeR`PfǕ^d -DDTY% e,IrWe# v2`XpY.b¥2%7x,dsIOITFzKnr<)ecfp޼*7>gIhq1I4FbHF= 4FI扈L+Du0.뤕*_S)eEE_w2mg8HdDR g.l2//_`r/V8qx_xLx 4ysuehq- &+L@ )$Ug J;E*;CEQAn٫%^#$ M; +b\"0氺n]TsG d<08dŸʹ +Epp$pj=XӨh\T0)S&AJXU8E_>[JKD,)}y1j%?z(w%5C*WZ"@=,Pb5>V+ jm]1x!왁Қ$KI`8l\cqQ^ N&n|htf$ذ }G|\eZ>}\Ts|#@1pun ]IM 漯> W~髟)W?XGpxt96mp+az'1m%Y){zb%Cm uJ"c)TpR kE,vVWN۠BHuZ +nq2K.ϋώ?P|v'h~ iU +H(BB9C4.y ٦C$Iv؞n^ny +5m<:%"Yz< X'uq~?)=W/gwMwlWi^xHF( Fz+t2XmI3jM$F)3@SB 7S-(ZEQrKYL"Q*@k \(qs$ d% x1>2O0᧱QZEQ-W(u#D:?4S]*V)1Ywt Y%RrOHqҾ,}=ؾؾGkwĵ)E?ش=yfc*6*Ҁ*ALA+J RY4w[b'}ey^0VbR8X91Mqb +;\M8,}`L)[V  4IxGڈ`n0Ԏvt yt&RFbڽ@1JbUbR/tb`^XV':'p'FjNL XT4 QZd`kG=Fa0Yߐ)"> UcZRLoB܄LLC&C x 8rt1v1XC14?M L LlKlKXGc)1L)1܌dL -GA̐>77P0 H=@ Q 5al&E=$2)R''8<$Fk:$V8$%#]6$V!lHѐؙiH)RXdB*w`h'@ 2 =XipkC,6pryt!v-`^*Pp٪"P Z +pW Bi4DѠUmSĄm2+:Zujm/5 +kPI2Y**un& Y*`r:V |u3;@="B+{~:d;jA0‰(xRݢ⼐dlP@ [2h@AI6 +’Ԗ"v!d}!8 c3%Γ2ɝD.R Q_R(Tt@C&։Ro!lL^d>ԝG`acy/VL|7FIo:Hp?r?D(6ȩq7XR܅@Y^EƆMel_bV0P$ $]]PeЂƌ J +X˲Vl^{M/@Vu?J%̍㕛 ܜH;ǻYe1rD I`AHFBsx_cf +(Z%şO[HFHJȔdʾ$eiU/L>q-8`"c L"s_P28K<8Kq"څGVAMR;}-* +kbfxDgcK~mPj˖}K*MQ5;7/-iD-Ҭj mˊ$ICqPjI# D-䂄(oK"4476m$[nxVPA`uç3֭%(WMMs4ͰO(BjT4˜M-*b<8!sOP6 +OFǙ՛sE~ 8yC u! +>[-"D`Tɻ3@@mX TX&Pav@5:>*N{ +5cYlc-ڜ`ʸ<,F͚)D J  T|JͤS21q2J$Se<R4k+3* PUVuujPE5Y2g +g قHD͐+{#jD#@K Y%Eo}0Kg )isR  Kv_K=R]aiU+h {Cq2hgeg߳Y3 wqجN7;W {pBm0 #|+0aj59'@y}XAB}8EP *`ksfTNF;v4hv+h3$Ϋ:tpinN{¡Esdp㰼Zk\(8 ]˱Y=! cd"%"y*_"[>cFmkԓyAI%'qjdnd $TgԐYZ{œW}^s%"`8*i@is^!!!MZ(Oq$̅i5pՑ۲c,$+Ep,a[ƇD > ThÙ9]t2bÓbv72ՎAͩe,"jDݕp #!#v VHD^E*eoNB]vr #vFT/LkEOlDVixNlFC0"*z +1ȣ!%G+H!F"QvR ;vaP_g3@ DV6wmJVܫCA\l7lܽJ!fcP&3X"6yy@F(&3+[`DA\:~ kBC~ TkT_˲ ;v9Rq\/yn +&{RGn'w2d{4:p O.s;'9mht&"nH BqKYA]*o q -b_#Fدg=lr)J$HFZZty0M +ӫo:3e= {~"|Ȥ56/Z: RD =rHzLԟJϏXyEhsW6~EbGN!:hbs[C+ + nD QƕF"$Sz V;k1 ғ8Lg:#5R}av՛t_2zoJ,q +Q$ԡ $1j(TC)Qz0L ['Q +͵CN 9|(+PwIJSIS[gȬ\ES\LzxT%SJW!\^}xEcE0L͘pp9ONa@A 0opDRj]jWςWY!eݞ5 >Z[RabJ\=zL!!W_)> Z@XPEYK!< gxYm^e.eاfeI(9B) /r=OxT~?JuIpvuՋ 8*1:IncST*HVazVe)=J=Enx]^]}<{bUN@@Zb`N1SRwRPb6XK؉\Lq'@ F*#]S8RuD@ ;q<\ДVސcqRR,b)ټP(& .Ubr(EP,qr:tb+V~b'Bljeʼnm8/ $PsU9&r ~IhJ$u[3@acHl4_N,DN"'a!''v#扙;&W&BH&f6&8MFA(Z@pੌ !3q9 +EnPę"ϧB>yT\T9Ln,nl'Ue\z'4G#ĴAX(Z""q6 [ȎLEYd 6/S4ֹ . a=ٟ,O3!U$K5"DZ/jjp5P6j gkP"#[@e^y(fA5+b`7wo(i} +4̱ھ2Nt_FriuzC 42'5iÓ +A6D $hqM\RChB+>1^י GI|xo>u4>q3q x/8Ww3] >fĒȟ^tp>-0 wLq%:6 D$P\"806YP=X.9y(|b>|@ˣO"4Gř,*d +H|X8,$wEp5Wjh!^ ;j;]IӒ8K7uzl0k 1v\ \EBr[eBl NfBɍ(0(Hh<dLI t*s5!1iҿ@UO`0Cr^I!nzkj 0#jfdk)SdPN%t H>I~HK +L4ff!¹dh^u(AD{N#> +]SKӊ|SYvj +<"[mm'"OwalB(WѥzG ;ʵZzښq@0CM@PNH[ǧ8 + dA2@@Gǰh 16@> բk ,VE]Cl#` )$DlGY tPA,FR7G 9@e5!ĊT2@E1޼化N8t ?nOPƤ>y>C<%QϮPnRʘ0,A)i''F+;7PCwǡkN7r6\fD"I32>vȂ +D -(<Lh% ^ jrXmLjۇHe槲֗[%L$qahVj$B&-H +8JP_9}`[9DŽP$bIgR ayH%4SCr\gO$$̙YxB7l +@4h/hYZ4FT:%q:b¶a.r*8L F5D矋 ăp&/-̰(!;?\c`(qb~(34JQn0{#!wvXXw +8mm^cWf똘Tl?H!/xcMDʐ25q'W]mbԃ:W^ƣŰ hULѥ5i!qyXd¯X_>.~T~86ZiY5K4VyO.~LPd^ɳq5B*HmVglC<~ +~ۅ69c 7@,0NPH*d9Xg&~m&H?ȅK?ATvD6)mDo8feLf܅.]fQ{_,Aw( 8HM1MjUL(de,׹oPP)a! Pg\0B8 1 9 Ȉ.&ճbf&aֆ**v`٘P<ݍVqQK$™Ǣ 9b1JJK <Id/- +J*=׀׸Q+6²xJ\7h #xSe+ 6 QX( ҽ {sŔD땟C( | #;#@OM K];%|.hdɬ'wsKW}\f|ڋIk^ KRLIvbҦ~L+8= J2C);y<1]Sʾ7]$OCIg: Zd'VV'Ybb`_`hDtj]t5u QSL":OI׸4^:YNa Fe4azzͳWK$U[Th̪͖.Il˚{ւ7|W-~PnOe"\.&3,}7*CƶFYz*5ӦU:)$T?TvV #J8 +8 ^PT6kFFkrΨ/%k[w=swՃ$}tP|+|'N!)#RY8*n`8UD-RPɴ{:@>@:u4[#5W@W?1\}JzB9{TɫW/v?wWaFLhe/"B޷f}묿"u}/ƿG 9-+_"$R &gJzs=ë?SRS8bT1DX$Uό*GMͳbn(BDbA>ZbP\߂ԥ3+G[0#rxXbSJ4ٶ73@XyORLCpzbGS,)ʜ)F;fIL0K1~)w#9"_&I&-VWkc^59xY᧒Btm1y1A9  (F D1G&-Xe\6S.ElRh1 AWnnP!tm2'4kL!s5FTuHib𥤂6[=ؖxcJjeN&@֤.;u:G(]5'ӫW[ :ڥiȽ hk[@_M! \_XRic[p p2Z +u)9a Ȝo|o+oh97 671yH@ʁ0(B0B'ʼn+Dg/PVMO}vCd#I`':r |TK+>*,B0v0Mb?"qD"۩(dB J襂]yO&QVZ+S AdI̡hg5すדz/HjYv$8e^_ C r, 4fZ kZεZ6 Cjjt2YUsN)AB =+D02ˋdHɛ$U9x$Xu a߁f% +b"XݝY&' ˳ Zfv̒(OΈDӺDZl- 2İbTÞ4%!2mTn^—gx~t@dQև@th=$mP9aSǞM1!mJ)"^DZql'E%NaGГI#>e/'<~Ͱ͛3·)f@'OaW2Fa=|r>:<ՐHba"K\ Y~MT@:Ͷt6f%d5>Y= f8paF 38Dqh6 p >LB6f!LXĒ/2泝:cZ=bό\"ьNQP ?"LD)%+uw:rqdcf` EȀQ\ +U*OB/rI^dzMҘbzԫi'%Mu*fn ;)/m]nP*Ud߄b ԋeNjAy +\@m bٍJMxZʻO@%<*, Pyi\2 )EEG;B( v>f*2RgeTl=JޞDByU1UarZtfc L"!EAhÀ`.dNXTDE:yI2dc&'$s`!CNLcWmm&GkRXQ.Q\e0.}^Z !/W~AzL@fwQ!m:-CйWigÈ*ĸR@CTr DP>{mJ+ XRwJ4Zb+E̋ ph:XGАB +έTΡ3i=| +~RRNA ڃ4 8QT;,$|l&pw UVDh(-ockI+k1a1dcT82tHӇ%DiUSV:Q&1>i$i3iRʳLkm6ٮ $B2ƖGTlTWCPg42( :%#KD,6PB/A=Y4d 0]G̈́8?e EaH|%ˆR'ML.j `&ClOAm 6=ȵZO(F>\:OIuz+AdZぅBQ֨%b?Ҫ`)al Y'V_`'|~X\N 9S79qT!Wy~9 +sл$V +dcBPJۦqǫg}W_rȯ^c_m¼zԫg@>'m}~@c4oJYxHʶ8X{!/K'&W%L^s\SrGՋG$W_+Wݫ_WL^}WϿZb?Ճ'[UǖA5XhB͢TWOaUW/co?G!Ճ\73@A]}@]=JD]=Hu>]t]]=zѸOUz{+S$ϫO4߿m=Ue +ٞRCbTFi2U*FGD{MQMT15D섲Y괃i{ 2@a5AN1 Y݈vD/Iܜbm }{wh;4iTSx2b. h"/g$<&'Q\A\SUFqz_>|d#:˽j݂G݂}rBJ0` kL2mQv`rj y5rDgswÎm"!w Аc1$A6f{Tm4ܛA48jCE.o&\~!M8[Q-P!It 4uty눍O/6\g1E,CdG#Lb;a5 +U+JDpyH/VdBwvTvQ^@$Ӿf +6I.ghRz*|#vO%G|. HFq$DD+aь(#v +6EٙD=Fmkpc %avT༠B ;]eZnT0Uje+Бq?ñtjφd&a"a2(c P ZZ0FB(]yl݁DMC0l. ffQƉ*B8Eqzl VVh5h\r-!uwf+Kg$bt2@@ņb =ĕ$"E:d$z$fQ hąMRV!H`ce):A3rK,-=/N$^C&j<5+Qǜ+ҳkM\. r'@*մ!WnkCdHbFڠ&*gΊc&>ߜ +lG=k甆&v/X4|8D0LzH (-Ў%+L vP<1Gg"ESJY̕;9% *5b,$괄 $}ǔVӱ 0*eH{!Yf xNp|{:,uf^o1iTĂ %LFsbi8)mH)V,;#IDYMID9ͫQћՉ GZ+-kFڕbiۍh-1=ô;1 Y$-oI +pH + @|o-(Yph֦Lk UNd\\<'6!WYW1kƓ +653,jЌY Pv-vCB~562i`}[)=Sa% [c |1LW#8d6J0[K4BrɩܪxTnojYjs*vEM׮KvnM;rkC iP4{< +|&xLm0t4G=;/ %Ԯ(Ye,bEȂRUkHwIWr*, ; +ѳ}(0S"kX)q))#!=&Phf' B d| XAtA2'-^M2@@EFaEb +6P\.]fjI?>%A|7q$4i ͅwYE26{#"3|R"ٌ^&>jr]KSh!ou QFRAAƹT60IpҐfCQR!T ps`#v yEL`"ɽ9*!:}|-2B%"%>B0T0$9%vCR%M? oFO6"{T;>Qʌ4uwU[ jk9c‰mvbeb6^211M,-PZ}Af4-QS (@b @bN1AX{2Gh#f1CZ݅ZL*U܎P>̧+DxX1a !};TzLp.EJ1=1J b* 0c,D +DVO #R0xn:Tbb'0 @l)=|fx RS<⥁^Cu> dؠCkbpb$̅rv۱297%2I`בXP!ehu A0* +aHOgELqJZg$t$Hb<h J9Ixa + ke69\D(|('[ +$16IȳC@,Ϡ vCP$P&A!_—g7&&mvѨA M166r.ɇ4ɇݧ + ͇͇Y^͇9̇l2@cMK!P0$]*]tau0;,}DmuRAR g1ї'2 ;M JXJ$0:;`?.}xTTc]4~©RLPxv,2I-iR7%ɛ*hPa0?X'3)(+EjJfO¨eP؝o ܐՍ'IOj73ҸYSLRVY) +lEl5xMD͂)X^34*lG ")9pIcVHԠ?VԈ*ԉd+E걩f!tPEEBiZGBi{ͅ|dT@h>@pPF `!Rfa}DЦS:ރetkSh6a:SUc+ ncA?U G T̺ql.m xa8q0z`ơΙ IaQ]]b^8s{'N V:bM%Ddt' B4zҹ!!J +ۓe!{֠-w %Z +sZ<8$a#õ ֍`c RߩB. 8,MR8ND*JBc +c ݴTT[ʁIvQz6;DV2 +ⴒ uﰍ}\ځ n,#xOӦS"; DP.8'\ F +]lx4&X|9q"5#t$ZS|c^ Zy-/DaiK<8{`1.WQB0K nLB yW| !H$H8 DE߰SMii1XEׅӑ!iMO1i^R`XLvf%ã (=H@gTw4" "(:wpP "JьExt.8vPۿ-R4J'L!{ ˥5:SB0Ń +F--"&)JrX̢,\%0*gYj3a X%j)rv?8QsKD2҃63@\d,-s(8DJ=k$kVJc=yO qtҭNŒעDA 1nTb6NVuPW)8\/4>Qkk> qnDo}:;FA`DZF*d ˭Q~dCʳ´pPD8L$E*daaqД|W ӦAFNƶ/)ؗD7l*\`tzENGNvS,|l~PvHGCBzUqeïB:f\ =YE#>Ayi +Wmh K;jtkz? ;n)%Î9#W(GLT" ~t2 *$4F. 6Z56 3;G2@_[KzOKjW[ץ Jє\L8ag9gh) + i"ISrl FÅGV@|oN 7 X5_F mZ@h u|CE`Rbn6J[r!] DSmxu8I"ΌQƊ jBX#]*Id})Leܾ3\5nK[bQD+x-F|bBɬ*SZ؅-x>"*\1*1Xs 0ez<X0 a +!ܧ4#d@q̾"6Me هr‡N‡a|arqa8=0|"%0@aqpiF +8G8f˜(πU:/"fxVEoBtDƷ00VuXkyf< B:l^:L\JCV@TaApGq$A n$XoFõR)Ai(vE0][_) ǑGʯ͈#u&l&#BHɼ.E(K K!kE/ +p3@;muO3D]}~b Q{}.sg},TE|= 5X#Q &UBdD(ͨq᥻?! Ed+0DH:`7"~,RF&t5V5$mP"HA5>㉠!O@%b*'ČD8sa\-?C$Ux"G9+Vxcne*[b C7$UG~YS*W +\N .+}Ӽc-!4Ԣ"%I[ĉ- %&f,bPm3krײ8d"en!ƺQdĒDu_EEx/.%GtdbȂʮK ģV&_1L1֡GoH-Uޕ`'[F}|o;Ϧ[reew˨eH:2tHqvyӅIHXNȶ.3@fQPI%rrl2;6P&koӜQSbWzb5ָʈ4qdEmQS2@ڸUKj $aci/d-DTYWS&Fb%O&?T 5^&u0! CrvN =GcCcHBt⋢3x;Pd&΂dwwf"‹N`PT:*WH%4QU-J UV {YkE`\RD {* UpRcLNhނB*n@y!MaIIՃ 2,@uMŝ25"`_cMA*b*ij&!ahgtJI߹ s؀9F.;/I413MȞq`'ܙ.ʍ.}Yd`Px +2N|Zj}U8~ ?̝A6bH|b1BoLWhކҼZ𫵦)a&7U˥)y(,`Hן6&>w' اayېaxe"oG712@`M56ZM$cAn)cx +'{1 B [OD~b;8pGˡBeLRU Zy  y̫\QS$XK!~Α`I'AkḊ`+W14hjAA/}5(uhOab2)nJ(ya2"Zȃf -3Y?t8Y9f"J%.C-R-m}wº)]L `><@f'(+Af9*ˎeMN%F< *~@ԛS+ZM|wA9 \X-!D"1^$ 8[UPVBם7ﶦtw&a\J a08! +q%WfTݜ*)y76:`H7F#Y'P%/CKXޜjbRzԚu + є{n,&Tʻ-F_Yc2@k *Y OL|Jr#q7+*Cz/)>(|^|"]f>R$79wl8tk փXVVbS9Neu(xNAx6f>l1H6=.AQ{ҽt y!R " +iEHn]`hKTZf3-J/\`MM㶏y76pzL5Q \Z +vtãT-={#i~2MXZ,YY0+0(x=^MꢃFg0)SadҷMz7sʢqbV4Xò$Nѽ$īOㄡAED+voK*'UGe5o+IOGgLʰJNs14B86z6r/|!FsyԑW 6ufCF,>!MJD?Oa<89*.eذ8w>Y;$<(Ȥ4bIh-m@)ZI",CX|[X);V x\eg<)5،}Ä vŒwe%knKO2 t#I ɟWJeB7m2|]vIdk6qX/ɡ21OvB*K1IpUbhvwټ $,/_\EՐh. c.RbI)%vu.q,G +PqVn>&1=Vf~XIG#FB! PmKeW:DޱZH0݆38uf`[: +!2(!R:(ՇQVՇ|N9a!a'a=Ͼ#p @%#d,2],M'N eӍqI.+R-3K,JYa]{'/ٕaglj0"Ԋc9Nd 9bIFHD%A%JϛP!1'f7e}d PݚtlBF^#rf]S +ݨ{]VЋbIo)N+\bC r'W*H×  _\ _%La Ub*Lbx}:,_C5 yv'xRaGŁ^ ,P5 MsdI5uV#W qZ²˵!pkE[PКg#3BNBΛP /P6Rliɛ NAew(ծS<˜E;jneE.*@k%?\h7N1p ؃E٬ H8H2ӭ7A*MQI/rIc'Sը^,0j@=8BbKn(, Tl8: P@q^?[Q"W !K9/d`C;zmřz(vltc>2Ť֬Hb t-s-hWFוbJdBaYAdDm FCC.7G,W5wt,^̑uߑ/S"r Y+D4bgUK{ޤՙTLҔ:ŢIi c'FN-Jmn`V]QR< vMysB7+ÒBuϥ +!">dO[zCwRR)Jd$^.Oc,ݬ+@ N8jҩ:puv8_gFRjvhDДFwn^qXw=82p+dTJk(dT2+p.y\ndQVtLӳEi?5$.e*!*q09n#>Zdhn ,[J^Fp"dg-"lL@$:,w t5p:Mj`Cz7rDj=# +6Db@шJwRS.lWU.FLdIIViP+ ސ憳 ݃Ne?q|2@A#(^qлa\Om)l;u,!?NJ7-I|gCd4leЁ QU|Gv000DE"zISB20u) +B3&9R,"ReyZV3^B{}֦t0T += iWh%ؔ^^IԹڎ~~.]V]\uWo; dzW aA޲1K;USk-+tKLjJwIQeOƻ:]$0 H\kTݝjbRTkW֬2@SqVU[kpUU[ :ѿF1RQpǢXO3Dtbw '21th`(\fq +EeX  +NCLQey61P!61K01abT5՜IXLL,O%FxJ$K3o億!_6&0HLe PhHHKrov#S/e^hӍs태&w¾Xe&熡#diQ4FL]F̠pI#fWc]Έ}gFce0w&*bb0be1(׊X7J3@F|n(I! ] TpN{2HQ'v)0Y +,D C{d"AD "K> #6֢ + +l4 + aaX +LI <;FAC]4نB!6~Q#|e@[2^BuEz$lf!2Z665abbb'M #KClIB !'0'?2VA(`0 ;')D(ޒx@C/lsQlbK!씎2@ +uB``G`S a,>,X!0=B`9B`}(a? X!CXUKqUEq pطP>W IYh.eِwt='ѥ<Y4@L ƚ\LJ b7NˀxO$l4ał $Ȑ@Ixj Yj mU<^xjК"T!Ua7hC7:V?D,+ ;%+MB h)0b +I@%CK !~DUaT3#A/ Lxia2ܑAKU4hfn4Q + @dBobE +O 'UHН* + MRڨZa/)ƺkJ[<'HjHjHƁeƩ,i+pb' +CpR& 9~ `.C 8B<\+p*qv&tLʈ@` $`HŠ299PQ"gɕUaqomB]]wٮ;HԱ;0DҦDH[=Gۗ{7΄^.8nCB {q-%ZnaSÈ qdSb4"i^j T(aU4cmņ*g@)xԧ#oʆ(Vq{x֑*Fw]%/M o~<\gB\,_}ZJqhQ@Ecq 2@cl(DA| UJwQHc=l) +>]7{Ȁ6Y]/gasH ȭ|[[MP%^m)'Dţ$"4\J8TO*)X1pGL*},'Q63@`~4*WK`8c$լqDdМ|-\.88x2"At H13Ӊ"%z腥v" 1EѰ&iQE!T^2EN GY^E(E2VE +αE.?\\S؊LIC9A^:uU8@|:n+j +6  av J + )k] ?oR&lEzKKP'-ӵ3SDr'f'~2 +qI'L)=SbT*]00 lEY~\ m(Z,KApd@BrӧYL)na0R++b2 t*V:C-6HFeqHN?ʓ0F5} +E|(.LzqJiN$NJ+dq 6b.⻆WV/qg쇊=s24~5.4O`N'YOj}%xCDZ}nB"͹@FQ- > xCr<48( ϒD+nОJF`hFH!ҚvbVdJb!Lmpx$[窧lb-kqq> HxۗyKd`_gO,;z S)fKJ-CS2¥9M{Ю&~ %H N+Mb70tOBMv2N->^0qA`p+#2F1 ӨM `39/@ R&1XJgU} F1i^qGO&\i: $K2aX ĠoqX~9 -xbqҤB[&>#A*`6R; /wRX#b:ͳCw4<h]7:P"d +%4DSB`p12& ֋%=+ .ކ4`+=a*Fs\GoDC46bCM2-$@ :jkb>ǟ؈es"e45/8e# e I4YK +p)hR2p.'1iFvV S%;"tI<:,֤.T|='P-.Q /1ֳ.TJVv`dk9,v!jMxZ36fJ$Ԑ287v"ԕ"FR=aTVzXe(#1g< +1v:-ЙnmvrRPɴS=}q]Z2p1)3Ym3ng~ +tw zTs &4:e4$ta6Nt;Ȍ(Gx::}Oz}gkGnq)z)&RBo)Ps}a"w ^bZNlji2n@Ki0ϪVdp9LF'S}Ss91FZ4ղ<.C.x.ob7mM,L*5 +S\ h|nx` +T&4 Zd>睪8E[e܅oCX0 S>pq6A@"L{ZY8qq@cn[ j<kB}D06r T-:/Tqߋ!EdMBB)-m5R(< +*a" @Qi3;qP e![řG +1CFg Y8]GK Oiu + |S6Ѱ+ٵ/NM XApNsUL۽LH,*ͦ+u{T?W|(@xsvZ]#Mk#"a$@LġP  ƐB4wZ%7h4(Wo**5$#΄|0 5j}m33[墆 (3@4 VWcjt+IT+S0sHiQp }B% x_ѓAh+2{e&64`dVԍS_eNȒ#+eQ%`84 (T@!)N@IJB(=! 5B5)ZCq*_2tFE `(،1^ؚvDH4rrfK uQgah㰿Ş;VTAjeEah>Yq?Z|*Dn>m<> +wh_1Ff$5՜.Lg =X%l"VSh gۘ˩wfkcڭCyĽ C%Y80ug@F0"A\1qWli+v$XD~v}b$]HAIVɃ\cI7+8'[etZ=1iS=]hr g$N.49弋8zՃ zPG*RCF˼Fq_cob^#(SAXx9NIH lhD8,s3A4rIB) Ki /zՅ-F8Xk59M?z+x qִ +2=w9y2~k]Kʊf&:Q#AE3*F( ĩD|xQ%]`m6f=*J'\/59aJD_zfB ASEJ" tqf4,rC +(r ZȎlB"JIɮR,,锌E"ef `JN34A2\$-I̕  \XeÜ +$1*bQr:=յ?,GFhf9RHIpjPIQ;Y,&(]$9s 9Sa3@ sb-B^(anC| p/ A|aU :r4$Ѳ,j:tA]  pj,*pͼ d,`^}X WBCBbY}dVߧ6 n+jyYBpvH3@ K|inDn2VPd9!J0af ʙhl]$uu I\E[ J.bitF`| H_NjG>gSK-C&̯59ߢ5L͞Yȉ IF Ѣ3.h0{ۈ{v+x4e\ (^dj[RL%+y5ܘLs*V+qLy/E$PE  +3Nwo?t3@@!J.&*HHjP(K NԏՇC{4Z -Q*?Ȍꙮ]n |&q :ѷjY)PB=Y!VQ ⎉϶{k >\ 9VthaǤg@ܲGu@y y?:өԈ|J![ ET)R r൨]@ Yodh*p9)F*wFEQ]qA\e(e)+LG)<8̴h`ku)?|!D8.1$Zl5M=paBc閰BTXn-E̛H|)EOB̪2s(giv8a8@ Qf!g78ytIa~_& ^iU+`ڶ=uHN^^O3 .X Ա$`Ika_bN"N'*Z_67M$tVJ'epY] hP.cА,%"ݍqpvp˶ʸe:欖ycJ(JƑb(θ<1ŦD:@]suƏhcY\腉(;ј9\3g +s*Y6Ub)9R~ +.2  sNQKd<\cSgO)rP+BM(ZGģf'GLA' l`Z*Ѩ@\}y2Z僈Ĥ Hx=Lhäd lk;7  A3FCG\H49hD#(6=a{hU"T%F&F)T[j &JwKAOQ1yUxD3ώ!_ sؔFi  +CPD,Ix­JRm)) ~p461!+`T3UZV=V.>UG}z.}',K0)YCGE+})&DB!/.{n'Jˀ$-Έz6ʁrG,`*5١tFRu]4i>kk\cܵ{H{F{2^ԾO3@ ̓&SfWzQ]Q .)9Sϩw*URԻgEh% QUd[燓  p`}ؾ)kok͢_s'OԾO_ IZIm7hM1AXȥ(Ꝑ6IX:19drb]?=AH,!3p)C4nI՗ zca_[Lȉe)􉍦^Y{bqb<1;debmbGkb#hbSb0Bez` P(@P +ai #QSQ&@Xq6 XC@<#FI#`O,JH)$чBbx0y-es!(eaмͲr3T2Uh>l= {ɨ$eQ Y9Fb3XI/z L ~JP䯲yX'`'54uw Ӡ'̢}l;T"'>h7_ƉE"IַBgyQ-Ccg(Bڜ#LgճX?KOVzx BsPS x*`˚CoI*J2fXUԹ4U ^ܧe94,TCV!dZ}0` ƳfwŧH{XYKP7k '4 5cyh# ުx#͠NhEC44KSi,*G&mM8Ż.dXԝSh!+7-0 ٮ\e4emVH+7(4Na4@>YS@:N^BwV4`j )Ki/zƈ6c_qN%wLQ%!8,Ea`_奇=C U&aPziτ6"Y&ڏ^2@ʑo0|rAEM(*ᨪ"OB5v!B` Ge BDcz4Kr *bQMCd%gE=4#ԗ2FT@~М4h~x_VQD8 $o{gbG0X}wYGB5H EV SmMx;@;"pi k'(xxgmѦt} hb4{gN + ͲAK lZ; pivdqv I/}?*;7LL,^{Y#Q`U($0U/74y 6 &Y\pq +`Cjӣl ak(LoRyx|r0Oq(IChD c)e[t\4;S:*s/b'ulI V=.GSAf+{dM0CyDp,, +@0toܾ;[i"&Z3gvcl Af{@4f2r&B?*cQV4\B #*u="xFhfA L,ˑ klm(rftMoţ'&3ei E32lο΁)kQ]K<K'>bD+l>~$Jt{ UX$`$'2@`jTY03S@`{(b}rC4_f +!mutKu8{`9Q<(\ +h: uTqq,ḋU80>,=3 !˟k_46%6E& p"=U=Ы޽Cpp:5gaCfLBE6^,.(;l/S4FE7H[@F" +xTﲎoLJ/:*Z#vF[O1@):#`p~ LuIAES谩Ȑ#G"K1.KW%0`_.?Xu;|[# J,;DVB O:6ENB!'X4 2µN +8ƖO{ ǩݎM3k􂺜o GJς_⦢nߎ6yA|j)xR@/;0-Z&P/@N5k "pQҼM:}FsAP0>HM; |4p"ca"J@1OQ(+S.@}]Qpr&"O]@1qnPp) Jrd1뤌sWxP$r|IcżYc +6F(T)`e j3%@*ӖHIUTtegtIi &ƀE,+#I1_+Z?u'Z);@ˏuD  8PgG}, +8NM}Fñ + #&x$Q 4C{@J=# F._+0,{쨦 ՘3V"ja<1$)@DǕ `|DJ(J>BIW؏  J@]9NZi90; Y! +_7+H%DMC>+P>kC: +endstream endobj 18 0 obj <>stream +ꍆ# +{´&撃2ցz5J3@\:EyhWGC9*|d +[׺ӛaPS!qZøS\"pq^B XAb~8a@l;|5,9ZHo=vOP^,x-H`02P>K&:Ti!@A.8[995IZ\n>E*(Wg`AZwh1q.0B2*pl+! ̕0! ] ƺ @`Hؐ>9Q0H tYIz7~E/Di$*wȠnkW [twX{'fj dӴR?kgaP`PPu^Ff*A)mV4<^9\;#[hpu&+CУU*hb ++ߺ.D@v +8րƉ'"3:`t *чT-! a.b86QKr|?E=j쒝3L@y.S G̴5ger;5><q3ʁ eP՚ /BVWEV>5'vhVVqz!\5oˮ*;%CjuRL05<}]< n/fLO?_ERYY{]MhAgwq2 qQ.0™ھUx! +[W쯋Pz >NM.$'_W\F$ÈU{]?Nߊ8GGF J[9(LVvIlSX +bAoCސ0$* j\PY>,)bUK\b^;@ALDj} nqk_. =G +"`O% x:M7s(;T@抺0\WX&rA_WIV(:@liH + bz+Po&"hu]5U2&h3k.5"- +9Vʥ\8 Oq A4k52~l[iS`"t^d\hP:" +)J BM"UDDD^px !IJIY3klS(FCЈKO(Er1h[d.vy]7>]Ƃښ%lr%*kA 7%D(Z,ZKAnpVKw({s.1ʈxIS*E<+g_t9\>rou# @{8Dm`=XHP}5XJfsUJ)Μ!JVU['5a6f$)xV.lCN <24I\ Ҋ.L'CB1$mWN:6I=R)=K(# G09(O% e*{|& +| | ' A _I I_ ?,'`|!Ƅt8U 9ӣ[9"#i Qo/ӓT=&eW8#rٚbqgg۷GTJ$ +2B7D"%=!Ox҇ [.ooʛ0Aё^/'DPg)eJ2 ֶp|}`EqԴHiD=Q*̅S[D/IݢG[1$=g^>Gt]^D/fJ!R(п6/Y)?m\k3jh0n`N/&34"dz)z!z$ⴄr޴x )oO.x^>F ~|6ډ(p@,Aqeia>->RSP+8;z}0`IAo)AX <|+|^1>_".㓏oKf!ҥS ڍ$g2>PR2ѥ^#Ny'Q͏1LjkJk6M%?8%ըq(ɭ1͇ѓjQ;%?K-_ox~jiϬ북ը.SB!B=ayؼnYAlo9!|hXl0? 0Zc5`-4 + +[HěU758Mi1`f)=J&VȽ\A>7ZAMGa$&QuvF!"Ɗ=?6.D0&y!b5[[gUq[g=mJUä8ᒈ7Ҽۆ Ad{9pw8-eJJ7ô܋ ksC 70I, @5T-Sx.yjNGK445-UhKجiY{jKCɛ,FBhˋruЅ48i+V:"'u =xXFe@ʄΓN 3"1n8F0LPTj~fFIɩr(Fj\D99D6F@Bs|Nivu3;Q+ k@߇qoa>ХÁژ: @}fnpBHLW%nJyKʪ\8(  V5 sAaak[ZXM;?M;1%F0&6<$j >%=L"]Y꟏[6$mZ$Б&&0)} ;u@.KrFBreFܒAHSb(k9jt{' tηT6JXzdTZ(' JJQ!Ń+x)X(:.kfT4Wp$ͯ CҌ<@%>y:i,"rZӷ4 +FCVRiδZQM}B]JO1A`2_1AY +-*cyC߳Y {b% s  F-[v -d=QV1#R^iP@:hFBb nP0 -b5쪺d`AgyK < 'X-Rhh VRi$ixtЩej Y I,x 9A<_; 5N`C #QWCC"_H63v"#I,ZUu C0xɰiA\!)Zd4r!anYAg\BS7"ԝl³WlKdPƹ^/wh_+VD껥`#wK`¢pjŀ\ xfPIc0VpG Z  +l¥%FKKMNx6T,queFZF0)H.׸l62W')TAy36OӯÔ0xK$P' M+hd|)c%ېVHYH'e+=#K/ڌ%4ivWЁ>dȼ)JDT~>BDGLQI)*DW nKFt1=HT&EFDF/gܺ-zيQ +g)cаٴv\`'E6^( wum\}B }ơ?ݜcVЫ_(^zu += +ܽBڮ3O ^9޿P?5YW[!bWnK\4ir^$@Zit ܪ:tA*f賖 zuE"#F!У G_& +A=]UeW.SY捦`׶rnjA #> ]0JLz$3cA-Ky<<y|~!{>O0x>O:@ X~^>_r=_"Ͽ@q7y٧+w_{5v1dHRLtfC|vMuͫ5k $ȽW'M*玱qAHRU)PDZăHVjuRΝ+h87{<4v 8 0!QSHKتv#ayJCţAb`~ ZrNISf$&NmߠpH; rg.2dX`!"A#1!ėXH6 ~,u-EF[ʮyԘt@EdbkExn*U "TAQuhDS26qUU7*|@tFhh_MnN\` So +t + s!^lYa T"|R6shh!`u^FPJ]K(T;1M8iu;EPU2Pq\aQz"gtlGxZ22Y.1& pVcEm#@0HX+dKvNp 4Lj)B+lVƖVl8^aѩo} 8(61&K Sn B,*СIjt1Ȼa;H$MKҒ0c[ ,: @Q!koN#t,e.7\P*5{rUpF:K-c/&tEY `,*1"V +A=)s^},> .c1 D04 +HLzsrcZѣƩ(-sx +L1fVdti@s4m,gQX[hBakӕAױQ?l>zimZhsV +ҹR%k=!}:h6轘i\i>XnjߒJ|4:dc5r5OԚupí(t\BmQ괔<laQ ҉zW#eo+P1'{ʓtvfSPD3ӏa{pmӃ_@ב>}Ym8=}L<\A74p { +X "6NX=_?)p/'>TWqg;jJ\-sQhRzA(̵HyH?TH84[3Pc?=[Cd Q47سWl9UV"RD/'Uݏ>G;#T4W(5z"5 5xG_98&z B[EO8238i|w 8:K zTJ9ʰR>k !=t~4D"zwoE _WRU +C/t9#Z>Awօ\\ q +$& +*'$dtD-&jaJb젗=/-/NH=qkMD;c"+6A !/d@ +B c#,؊l., +ͫ>>cHN@ #>@r3&*I]Â~4[.QE +A<50\2e}u~VζfO;%s- P+Muc'sut6N>χ!O!U QϷyZu?ߦ*_P'ϗ,==-?#lT6ZJ]q,oKu-56~XɁ$1oEEVBBGU)bA{c̞'e:Y+򼮇c}CungaDj@=2R|ό&-5d1gT 4lte!"x0E'_)CUk4Shqiᰝxbb{ KlZ -AGKeSYM^khSd@{uBU$-}ɟPJT(o + H1 t amS! ߮'v=}x$Smwm$<lC^s,A:Iؖġx lJS0ɟxY73+ţh )! +1bh[DS:Z:  X*q`M`(SG6BRh^|%1BVt +0>`'0V;ᮂV2>3غ@yP:i=X"$1icr6@KjN~qy2ZcuLwQ ;a\yP00?`fgl[l0q^biԢ'kjQ WqtEP$qM!Ӟ0lfAAħ&u +|BLTO9:H7,DdC-` ՗ mLb>!Hj(Ⱦz4( IR>&_e/e5澧% br]*1.47<y?=)P3Ӂ;rY>BXBI?!&&WB +]EvGC =NV Z:ͥ\* jgĭcdOoL΍@w|@}Av({З b0=0=9PlN(0\e4JIo{ RȨ1QGd<1$yHS4ėeO%A*fMʐLxvdANNG"W Dp! вU`) + 6".~f @<40׀Fzp.XjEE15*#$8ի4iTr+s*;}*Kf43uZ1d`\a +GC _ E: ޜrPpB4|L* 'Op?Am %pa0sf.Wb J݁3) \Em ^0֠0B: k2ra!ʽ2"4 D5^ +.PU.4 3yzh +@Ql g RYKMIնu zkF[-UW0`%# \lc UDC d[̄y; df6k~BD<]ֽZaF#-yBK +&oAHނ +Hw;5N9:? TK|!IioPcUJ!#.Ipuhƣ]Z¾xOGszqv5wItN{nPTZAˤT&qjX9qK^^2wU&谔Fv i{XcWJú-Ӷ^7fwѕ$"}t/p[z)+DKc.۷ lv%2WIXǐ"w2EwJ JƳ948sc$Bmֵ kEtPΧ5Ξ +%9HҪ d.4Frx%j.FtM:1*:ǐLGZ`(O!#mi:+MNbXaC̭ͧ"6Ɯ;v6jQ*NZo7<8wZ(*Iֳl WD-'Xe0YSJR)èH6W1[ R]JR'}:Bk=t"Ei "॒GoS9J@+~HuF+(tUVMXV۹":D{qua{my cc5 n 7xR4>eMO* ^,,8QNKDŸ[?V_mFLH J" A\% oKU›\5QkȸMz5XѺ>qCF_pOYp@`|Z:AU΀V>"Ar@9 C Yʡ , DZDCVm(F5?]~E߰m'OAFd;v5 YPMT +"6.2nZNF|R䭬z\ =h,:<\zSUB_PЛ@{1S)) D ӡЛGÇzӴpc[HzUiMpp(FC&JJؓ)6 +K1[ab࠷Y +9zZ}a~e@/&VQBFW}U T_ I"CŽ-odlܨ9{UݧVO/4܏ ! 2U.h 008pRH"Ċ}>S}>}<k@KЃ1 >>jwI Sz~@_ +Bɸ BqmO,m+N% x߬8y.GkȦnA0U0)lHaXA]>>Bi y\vYU, +2mraThfi$T +ZCA .NQ3oav2$0@؈NAP哥 ~* 1\$H'+^r05oH^!_WqLx)A.0& q.tF OHhLNN,P0xAa|Ymt*{KT\#"+& WLaEɠKt^DGtyY +yk{jo~bR3"p \au:%y74uiRG[2)AD河&:>F0pqI6%doJfS&[]3CIdJ&;xB= $ȉ PCM( g@QxADqkRV)["_S(E5~1y:88A +P တ~U N1 p7Dx q  6KmUM'h.lвyh@ ؙb^҂ +I`htȋa'HtMbi"{q' nUL2bkttLN,b*L0\`Uƅ3QrpxܜB^.+eA(,vB0PX+0Z'AT*OݡjړQKVC*xb1Hb$ +VB;ᬉGh`Ek  ip8"^oZIoZ-޴ i/i-iH +\ 8C2 <=:pLTwL*QW8ABDp|xo N1vZW +~nV]R zR{fHkjr*/V٘i,%.}E9r"zgLF8H2:Hut(%T_SDȐ:KXll A&>c'] S\@ERkA+ʧTxA7l}b([!hPl5 ʞ7X)t4`C"q}D4]&msIaqkX Fz,12vQi%2\]W$eEWX R l~e5UbapCƆ)&:>spqǬ! ÆHUR =SmGd DQL*/`7`Cn>T܀=%Ş1<ĈshBp:HhaPO=Kǣ )#F"6Dx unA^%ߝ0Yn(.].@CU8el`C0ga2 wdX{02qc;4.Y( FfֽG, M NK.b$Qå$FgC7)RxJJ^qaEexgE$*G:/Xt6{4ݐ@h hX@- +$*ݒ̨VچˤqRHmjֳj t51QgaqmiɍDN;vaxĻ\r91+}v-4D \/ 1tQ "nZp+K4eld6 n}t Ve-ƔatBcu* J4e"X#h4E"pN +{ha 4cއ K1Fւ }t2ed*3“3a"jϤ3&|T+Qt^뺀ޜv2Rge'n]C9Xb",ݍE+BE]+92\y3­id:Q{1)c\rkC8a<>}s3 +6dTv lA7_t`Uѩ(ݮ0g2;(v,Iu=ͽ7>H(*{LˎoL` +#^DQ HjA)^J#(^u_tSǙB_\@䞵JcP:uɛ +E>b,Rl7O)92-eΔe)?N(AE72iHD{] fh[|$rrqo$N'_aovB<6%K🠇jWG$lO< oߔng:O 6Ht#E1R\<d0& + %1Uf6+At6JOEe)do:? T +HB| + +f +"67Z0b0.0OEDӫJӗh8}'4\ׄ>3/.y826g +M"#D#M٭&ZD0=WL/+ plqLlL-nzצw'Lr}fM^6pJ0$oEi%N +$koQ2,& +16 Cepr^-pF*W]4p#kU'=Ģ"I_e^7+Q8Dz&I*\$L7L\`mFй/bJ!:h|G #P!d>qGPͣyFg7=zی~oF 6;zK"2 BGU7&B|2*h@pBVOXq9cG. ]s-4:P.I",D{ DD}e=ZDiїcQYE EEKpVD +?GFG~R6622 !sYA"(`l-j#L+h'YEЧ61=ҁC61u }i^B/WhK%kh B&6P6_};4_0@m 6H@ip>!ۛ'¾.PWh@п}A=8F_$0M3hpg&9jk)ڲ +tHsc:&~Ԋ !B/\DPOX3:cB% +%.S2 E.X8h&/6pSZJ  >ʡiA~gXVOxZr c. E rJE$` b'& { K, 45+Y@8i +r].Bf:ea4")*+C #b#a,M osq6kY-M1EևRoK3j}9>R^LBN`\x RռT#_́譜\$5&T\@Pƕj<%Zi b"O ȗ:ɓXdJbbJW|U3/fF9+V- +H`R:`X0U5CO YDYHrתLF{~\bL~x Kx /kS@8 tحL#WU 7S~{*IˍL9)Tv4 6qB&v.Z`6?Kr%&3VS,:v0,WE)J!6pGgVj)gjRιK(g&Z)PZ +B)9p39P~]lTaz >.ZtVџE%ۉ&8\lpv){M*$HI_P+zP R!&=q!@Ua.Z,\%ڈ۠2@`gixwGV{" TIЄ< +d +/0q̃U+U5rF[l ęY%Ÿ;Gq2 ѼHT;bFWXI=6,5]:)^^DPc;еf9auQ%T9O:ܨ:sG AHrKy3ߝU |O0 N+>b1eT雁>goMOK+xl2E:[Ah$X[X-Zƞh19´~]ovќ@d*i2%Ns~ eGf_0CJ!姜2nr[NW-7An-~%4B)*xU/?W }VI$X mTCK7KgL95X5ZɣZ'ZS].Vd` TA%F QPEzgOEziFz3Wz9c=i^.T"OIrHK:) +pr߆Rt&/ ʿ),"X>-".> Ȩ$S-iF_ +y3#a5Ȕz`1)&鋑;`sNenhHG +Chs +݊hߏ~J}J"iR'PJEs +=VDn`3~X9aN,@0Yp3P<Ʉby?HO*)'Nڨv#vyOQrge*URgi#&?XKHBWd3Gw[~g2w BTPPxB\]btytKQ0eeVJ$$hr;" +>SrM [..H5\ m@EJh<$C)yƧ8%A3-E0 D$cFm8fJmB}{O Nkґ0I '5.lh>%!ID ,gy;KJBmQnei2y\/,M/&;(.PB%K| J.s 'M0$4ά6Ԑ,c$ + +Ap)9%X:4~4~P I!? Nȿwt \ЮbAB,RR"<$Ҥ:r8D7tlb9%3 N1; &KrB?T&'KKu⼍&IhA +\ z_/$8 QjL*D-h-O%-7"GeaFd94?)t6tzUCJ/Mp#!wF +x U0^a2$ j՛ +T3WW]t V@Xb\đe '"WFj_Z$q;#Ɂ *Kt0DmF"p ێ7bu1Z"a#iJ +; L_6ӌmc8ǣe{Ąot@W‚c=P;qagkT];Nf7 ڡ1@pDY/V\AںRDx@A`  q(6 YYLK2s|5!0˜qwEcnx `jkM7AaKI? %G1pB +(3Մ LZBY,T6wFO%u"pJN2}\ɴؾT#v"f$ V?9N ~g"pDt)F*!ޙs/,$Hش@E8$ vX14Ã*.B.{ %Ddօ8|Cl2fP}'7B#Μ} >2EWK(P䯇!Q-LĐ Q !:I2 8M@5*b]<_V1-S9**R!$E˕ gA C$\` dR&)Q؇Ҡmۀd b7;Y^T0)xhZ_v>fj2<Z# \ gS&t [l}p\$,$?H|x=*0], RLT>C!ίC)t3FWYÙ$M2nZbh< aA$°zg^1_'ŸK߁q A5f.hr n6PN؟L[>8(+oZ"|mv]hQBLxOҋuӉ;HNӝ~J 1B6zjmyĠ|:+ ȴ[%(ԓӓkI,[Z +9Lno>^e #TFl*v&BoV]BŦ JZ1,shP3k585aSd(|4%Dq\k nw?T6'3!#V!m7HĩԊS4nHT:sjms!v87%Qtj瓘PT~0aYl_wٙqDM$1t"Ŗ۔ɖK![NlR큗z,fhا\@D7w3"4)4n*RHD?)?WEsߘo.x\!K*ܗU%lW!볧!v'$ŠBtCVg/'FݽjqH‹ \]# #l !MC91 8h, G_|4> 1#4CyD69X4 凜4ɜeiZ@ ge!AΪs'ryMȺ4LO6_#{`ܧW )K(H-Rp/(NVɃƍ1b;NxbO}Rw53 TYtd,JQEg3OH@e)Z"Z$d)Sj XBHWsr'7Okq0$ӣ gPAY>uP*5׭G$)PA,xEEb(H P{B$F0,(ol(3ߝ@ 5Q1ze)UtRXAi&}fIAS\"" $TT'O<}tX#HXr*,r/`\Lsą3yaєXQt<UscETYf}l +a\ȡJJN~#Ld! ܩLȃ1iH(ܤa*RO|d6iTJHuX:VRaNx0Q@\@R5II6a*s.+b*(v38u7RsR9^dO¸x#".J2 %>k%hOOIN9 R y9`[wIF6ձ]*iҏ >D *}^\85IӘݓ5:xdY98*WwZ+G\ݬUtOvl)CO Y!5RT(NTlYuԤDw8Q#LuY]#M,q)?ʟ.2WyVKv''uR}FG"M$Ј@%X? ћБOZw,u-cWNKiTRQ=N.m:$1ԧ l@Dv& T&N +%$р"zj#JD@EAIwD-=R,\ p.^%S|L0Yhj%RT tNF 4x& +c9\qQ}J +B29[[quWNjȟM pC`@*ÃhRD#$1".f]u}Vb¢_Ը%XOHHBsL %ٳYz}7ԟvT-r؉kYQAdfV8%f%G,2"ᘨCx Ji& %6Eİ/)JGTrhTD\@?Dr.C-FdEBؐehuVH&vSd̕C'Qc#sBF[i 1bkh|4^klspp^.{4EP,"`iR4F + %6 C34MsFD<R"2-_cRܢRCL@D hIa <"DOD4J"$t|d ⅐u0o*U0[2r,U>X+R"XH^D_ j p"qdrI#[v呴E-;P=(UtSa wqh, f?_VxMpfC%"ӲC8X4ğN )iaRfS~C"U \,YY] zcWD-N`~*С-iWYIu7,u~.@HɠTHH꾑Vp 09POTPW=CG ԭET&tZU~~Q p:arQ^y)NV.suBA'9i#>FBčǼфQI3ڈD#}G rl~ 0HQڹCZع諉ŊLx~FNe%rdK̖Ӊ-e2]Pb^wEڷDJduH q!si J fW5OV3ҟ 󑺘OҺsˋZs;;L +$pc|~:eP5DjD84Gj%KY ?g/̔P)%aU`?ȾE;r2EPpE,<շIh}l-\/n"*YЫ,"Պͮ;|2?脟 |dĐIݥ#7hW ^҅mB謏-@{"J"zy8Bj5GUǑ0š䉹f,dT+?ChHGiy9\HxvAuҘ#OxE5*y$H%ZpFNأ8,IQ6 [l #"'x(d}>\,U BQ< Fj5,gfRCSeRIZ,ٸ(V,Zyj C>'ε8=O y塨ҧșJG!ǢF+1q3d46+Cة$6 R5XV_J22;O >DT(خYHT嚹δ@~F) ٴ$fF,C +Ei%<'7xPVA2׭<*gq +!\VA]%3JT\UD`d}JFgk%;0ւcz; (Ri_HCR!Am]%'I ߔ_lTqHkuT}Od<Ӕc!m 7'S>$Bq$z!kH_2T0G")얋v^Tˣ40;mC2Ee;F?f}hn0?fB` "XCX$%FHAQLJTՃ(JF8hTH% `"xJ?E2X5̉*sMڳ"wp`]/ݖ!Z>p&gliʕC!G20XZ%_vE(/>(eR0*ҩLZw'oAy XZaTf8}!"0%+ vQ2(xrì5>dcI%+X X7ar`v岺j. 7\ +c Gf(eLYPe ʛ˄NOfY'.i8(p(*( 1(#Pf0ZoN.]ph7j#Hӝdաt Bb `M7]M";݆nGWꗈxP^:呤?0Ԏ"4Ң˒X%^#+npC_t GKD?7jk~t4Dj0Iw4G9A ȟ/t߁E=1/*2%Uιt1*neJJyn^يAb/qAÐ`H=d6zQdJ͘9yx &AU0ڌDvUZ(&!El:}JB58( + i_"*L4.Ѹp9n>4bsh|BP4ks K%p<+Rd])$z4FڷD!K..P:E%x,)6ò!o& ¿3+ΙqN*p}ly,D%4&: +|~GrR ^U$y[^.`"Εzu*B< +.]848GdWS Ώ؂U: úY٥T=T+jnp eH08$:. +.EVٚƵ^wG]&YKVK +ĭJ^0 +/xÖ!t2LR?̨M]:V`&tRkقd7$0XP!HS"F<_{[vqfCY,r]pgj“_ "*oA: =T*oZ\@d2)@l ìcwܸ(|)rKG_Bܺ?!1S@[ $S=?G\կYhqduqPBR͊NKOt:{ų WmDrސ`aGR[{~.k!m:ifY4;'?qpTUqze;,= 8[b'<2=?j"(.E ܁8 gBZ'i펮_VOkRon va'+n fx)BDo`,4]iq^ra딙a6FRYE8mtMfB%p$Չ[4;G*GQz~.zJ8gحOuT4L!EUNt`SxR-Q-HB +FA5It\k3%UHP1?Hyu LM' +m:(uN 1csj7@j*P*h) CifJíBee~i=p.;{j <(NSSl_ӝ8ܦkQ l} Ǧ@Jҧ *yJ$h?̏ Oy  {H4\Ək?U$9plJ@V΃4:4Є3G>OV҈e%Mp4uozE _>kp.`*.D\x @CFӂ_HL(=m+s^C+m<*"A +ČDžlr0[ :$[+ +q(ԑ&l" IҲA.HGQ`"*5*psJ[[vC2೘_1 Wbm6x"_ry#}]\,ɗ ޙ6.ǵ L* %f6i@H F#yOy]yO,]؍U F]L~)\\]Dz5b\{blj|O1"tJCL&+m*&qK'e+]i [ė9&q፨cn!6ϖAg0:mMK怇 v,R++.Й*I +Qx.Ŝ,m1… }3Zvœx^<m:]5SqGp)̧Ȣ%*QeYTbJfW0PW7@PR=1 'm6NVBAӉX5xAL2LܕUʸ.")NڥEef8Yi\8X%\2+}7wgOLW Z_[ ~uHy.m6-IѾxU@*I -9d(f8j0BZ$8,Sڌfש3hB! T }HMDZV+^E +$(4 ge*$&`ٌRt4,a4U9)? +ASM^4TW_*GEZX|`Y>r4%W:ޯs +mUt0l] X <`ˎﮃƂ7?ӛ S|X2\fFHbytJ(^\Ǯ[$W]  T$z#H0=`}z6;S#GԴ%1ϊa> 0/ L#"u#鮢A! xUJq ;?e2o̖,1O]!"y:A*Q(V}OlARˇP%f?A1khHA!D͖1I8\[R-CލL$H$Oojx'sĩrǮqc%d4ЀYoT3x)4۳J)hVYӖ!.4UW~jDŽ~; Y +mpgCx~jXn& +9uyv̿8 Z-C]NF$TR;8Ĭ}~]&Lf0#8v{`tJ4>!vh25T+H)1B#dvza=* #<!?kt:EC>O(S}B-CN\Ti:'OM땉*ˆG!ߠ^f1a.JeU?à +/t\@N׋$վzp\Y=* +:;4lU:6;fOdnVi52TiD:=Gs'K6aqvˁWg,,,:)׎uT-PY5H"\JQ I 3Y8ǜNvq bsq.\ 7 ʐ: +fuTGuN蠼 s*8y“jv`7 ViZ}rA' mw9*-8 XdL TTz$ݬd/ԡ$VLfluEY+A$.l_}ͥ GŇR!E[2T(w[Tmo\@X(hpp:4'%\h̫M0 bl0EHqjl58=$L / >'p1+wwc-.{/z5]6˄CCӡf#2B*sLuJdSշKظIqk\>XdmYf6_24u˻ZdzcSxRk<(lA0s.j7%]U獵N.mݝGfoM3LGF=)Ab\3iVkTUrb Ya m;juJ@N\ͨIJh\u8N׶G$O0i0 b*.[POrFwꔙE }9H_|jgΖM^8!zy;ZZ8tB, >"oW / +OV4RYI,Z-$fs6Gehp€&ߊIPgVDhNqZϢ +pqqE0U&Cg hNRLBۄ =Nf~1P +G€&(*>A֮pZ/ |VwfnJ{*qکf"vyT%yxJ 4B^QT*.k]8]O3wySMcZj.X&3|"ˮo!9h +s 4P˅(T&Ҡ")'X+`-.hOzCW(_n +&R6@gb(׉]*GCĭÇ x fBEWDqTwun+qgH5RW(q^.at`Y +qvpDd4$\1q)pqthdb &*s+Dxv-|W iB[ [`@luOh"2/04.иGW pf!&9z)! #\3 qq.\ p. dhBt g%!,)٫YvZ1 >ͭ.Ps4%%^\ /0h\a+o].pY?{qlm E ]^ZU"1N c(>B^0p}7.pq>V=?C.K$N'=.E8 l8.Y{'v`tǝ-c.Vsy9\;zT4}";z1Pu'M +:dx:%ECb2*N0\tAq.Đ/=PJ6'bWC.rǣZ\`bJF#qDu@% NH<`<{21s7EsB*GlTZI>$Djz$. HpU1i5dSnLG8Z#ǥq;$rliwGODVJ * +ۡC]N>*ŬXu[IsE9buLx̀eJ8>2NiD":sJ, lU2 j`ťR.ƫQN.vSpABDAJP6tZid[ URGfy^.YYتxTw<|۰yr-Z2"',SI5`K\Mv]8d蟎sڥFT@T֓3 l)^cE$vQS&.'J~HNA!8dHoqub's0^ZE"1ZN1j!v dX2dj6ΞtxF.wRcb҇\>3ED:yIo\ )@g\4RN5[jO0)7Ax„ p}`)"2eک_6IJ\ p.\ p. 4Ni@P'e;qQn:q`KaI<)\@)"MzlNTѹ\ p6qKM뼼DHŕp?5$y%y$*f"8͠%>&"t&.W&HoN惠٬RbQ^jrNhX.vn +ȴZ%FP6!rqnԠ1?5lGFV] +ZjsXG0FN"8 #drǔ)a mvbŢ!s:RcAo)#x,lb6E\ p.d}v,kC>t)]B"-u .\3: ;:+r<‹M~GԑÒ*|ugE]c,i*)Dl)걇 qP,!5;P'B(FhqM@np|? qhM(Tc;LCOyQ%U19A(Cv"EcѯV})S,r "$Pi}CĽCX9 +#@?:]W3J^DA?*K +*ЯA惞 t gjy{hٍI.pŏ4p\ --id yy (yR|~eZ>_<}>{P>* OϏ4&㐌oxkMiZyMd4i(8dhyNg8{><=p{O]CiF8 8&\I)E'qΜװy' TA9 "`o'M(I o`E_6"&:-) PΏ͛f/we/o>Fʛ%/"(g|67͏w»}cdMb˖V).Ř݅J2M≮|3< +D-\1S4'M8CҼ5Otlܼ{7͓7CyK|q Fo ܲ ܭY"LHq/.M)٠2tēy! ] &%u%UaqJk1 +ɨ6+mXL7*!x_Ix9|eI  vƲŇ1܄38؄3Zp^Qn4dc l3Y&%7XPަ#Olb3a#(ӊ5@ t. ~s\꾿:n`=`km ·`!Ci#K\Ӣ粷D{Q3ֈQd&̕"km);$7U-4{T(QH=%::|,:4b=U#UKT ("s@v9 SKv,#[/Gfњ M3Ʈs_kdN:ohoA%߂jl)?qЂCCÐ% fҚ#-iMiMҚ'7b Oj9;~X'mLu%$얆^ +ZU W: +zTS֎BMT"H&-@{bpUCr1 XBt+2^ ]],J*66FM ++`2o=(P@#j(tڊF  FZ +'$; Bڔ+W@&,nNp:K{hsb'W 4\ bQAdd2  PDA+Njoia_(m}׏'IaO"`bqQoSL|%y9$3Eh;&ްk: %5GiE !;}aDT1ov$~ĿPg&z"zW.wP|)%c@5/hLɒi7CTqP +}ڽc*M-dtBRw|"_b8_G#N50[~#RZ'σqYzъ9ÀcO(%D#*sVR= D'Se VbnK:}D{w0C4 udQ#YTBb胴dhT="x ?-:P]O|R4Ȼ503U'EsGш#cjދډ]m@7bcH݂j.Rk 1C"ɰ L#D$Te#dXO'_ĸ?cPߗdNQd4:p36w9gnGvʎީJ)#E>V䧓'aVRb'7#ŀezAVV jJڰ8 >$ h z1Dd7X/bB fz=?${K ޷ğG<G<otI2%.cjPVHͦڑ\vپ)%cO^ˁ_G~ +?k"݇@9L龅tP?0DL $hEeQ%!b0y#Nrh>0n_1ۿd;@Q=/Erlc@{V'JCX'U/= + Ζ! gFix]ajfAC(Hg[}Nn?p? [}CjܧHw<_Ks}.0ڗe%ȐWZ/X/;엙PEK(>Me?5BeFٷ^oT8˝>w5H}lu Ǯyma/=Uu{/WN* (p&m}R~Fij?ဲhO_KgՂԾ+h?Sh_⊴(|RU}S¦CkyJמřk/XϴjV͂`+U}첓wDD<ס +SaEwc3К Fj(jN+%VA5tIJE".ߕqK\BJ"aHC/ոwy6Ȫ5DDU4p_aLm@YCk?IC9QH@2 PտDkΊgi +ŠɎK0 i']S" ҠlZR\(BAdsYn}4go) (zIC% ..;ZHu: +jAv8^8IFU1K3o +݈0tY1$%/Ǖ֍"/- DkBM!̒E_p :"&`UG0Z\Ն/XD#Y@b%Si*Szdo 4șANn6ϐ1g|ЙB V $0p ~.aK:GXB +|Yj5iІ~px$l7p 9#c;FM it ʥ@=&BA!$"10k`dNK.CGK=Hɇ& (A c]ĆʰaH*my9aB \`/NJ&/pĊ;\%jZ\c%&G-;b{5OEC rT0|噽^ĹRp?AIV jl5+h<>.BCR8pEQ$U& :pT"Q|#&nr1&829 Kί O*@5 +]X*6:$78#_'V +`B{U8yv{>,t )!I軲'͖&7; P"O7.s2*2Tp +}P^kK 4"u݅!u, e)Q {@hՍ +Ɓm#@4EZAhE2 !NeĚ!6_WDHV?_ +^PnJ/DD_Jݝ{>~ +H\W)˫2ˬNB.BaFN;H!*,'w>І0x ++fۻ2r"m*eyX-}oEcf*Vb9,nȏz :>py3y3]d7 d$P7гA$atDŽ0el84 X5ʋ`N3ȖGR!Lu Al.pax40z<NaGU`j5%}zUZ)0RbOU0OሧIbN{`)Ǎ(ψkd +i4"{plȝT +Dz21R +(UY7'IMtF +%]/\,ܭ\7R.)b i@}6rLʹhT^oJڂ2l2dȡNNTa Zi(/y ?^\1]Wע}… X[j#IqYo"btg 21ibOiZd!xy99L4N(, %V?JB7-x?6Jl0&/A{=!ůȔ3  +djM^ )%uJ\@ pTI:ͩTi+=Fy C>;L ̷/h ٜ; 锚xRdB6 24fs:xFO|5`Tgd,tΈ)'Vj(hi0&/ /Sv>q{c?BB#rKU-  63$I`d6Wg1<JA"h`i9[?U"')ӆYٝʼn P/J0t5B/CSj}o2 GNi4Pe(5mPasL*~%~?|y?9ƙ>q Ew'+Ng*XnhS؍6ycYG +ctoxIY8B~2uu|Gt_49ђE˗b +f'|V_qߣ8/*) +A}꾭_4NQ}e~oSqӣP-,Hʒ5-m}Gn?`}:2o_B2sb~6b o'ƽ}꾨t?X}vRй@+)rF.o)Kb/d }>m?8$X6sDZqݟ$"'C`80ܷXۇ$_>SA$aj}tY^cЅS$}Bh> lt"bT}+Vn/4P͎e~#s?q8}X"O>] py#ȫǴ&*,Ѕ}Hoi_ѶϥQqG}neۗ"_\z\ QOG}6⾀ι6o9lm ۇ_R'xrxr\A\>mdcض@bXhpq08>akRaCTM )^Ot^v(@02*Ljs+6 +}eӸ%DD1h_DLxx HI6:&¸ HʏeGquJOl[c`SU3؄ 5-1F"နX /HE[Yl43$xV8z'hxJU=:HO :-Y}Tac\e ;: hEhF_$yCc- E@:# +eA 0a"CzSXP p +W'@Q08:io,ZI(Sr7hAW&:@+AbZr'6$p5&cMdP~72 &j@X@pC lt`b(Fju%ӲCƄLN +XyCTϝ݈& +!,&j2H|H'ڊswfYTU_3[Rrz/ ظ(t%$D4 jT`HTRc!t@۩Fr +<%w$:Z;(fG$+)YDH%> |_dhUâY` h JfrvR "45|#׹EsA^!j`؈Mc貸EL~6\ĉddzu<# HfW*\ôDi%A -U0T_*m2D4R04bU(/R*}9$.f`-($o7Rx~iSHee*ƒ*2yq^BvT +A1!8p+P@)@kn+dD(UlbZ_A)혪ݤ?kKIK(ېze*'9Ɩ@lw_1.w**R銉UQ +}"aGhhVI꣤D.H +\< uLÈoww `qEG"Vq c;2,|@  pABر.).g mK?>hWQ5܂(1) .77uA\40 7i L_3Ʒҁ"돮b(<ɋv Ȧ!6b>s8дTCrc` D0? )"`uvEFW kָ4HJ**7TcJ"͟0MIu@(RHylj _e?Bp\c.Ge@k0מFQ!VzZ:Iu2Lc2RCrJQccH)n#'L3~4P`dlL<|,H$안'(R9h%FhZ)ȑT N UuT90&+QrW +8VBTg'~ ~K~'dπ(_yZS11Z&IT;r(WnAX#ֱ#>1?2x6FT5/>RވS/ 8*K#YRsՃw. +H) *ࣀQ%-RRbD|Ĉ +I!Tjr/DX>ڙ銌6\`^NX"ԧ%QKBلibC~Xn9AV.\. .+w2tXQ [%eQyot>S0/CP׬TqluƚC Bxx?lP +zg{?)bèAY–fjxQZf.sDi~M}q.k}8߼?[Oζ5riZg~#sJӮTˇbjƹ2iG}-k[RUYN}甼Ozhߟ"~_߈vuR޷hb$>M^VuI^ +p2Zoٰ>t_JuޏE1n7x?Ct_S $q/”@( I F׌L ^$]ۏ}vQg̓pݟd&8=}̩R*_O1PɈ2gF`Ju^}"'@p?gp }~%vQt_l2:_8UB}tcsyaܷ%f6܋S埔;T aa˨%J,x|ۀ\6\;RT׋[)˨pql (BDZp0%~wlB@_Vs䍙! m%*=a . : pOrr~vT(ӄqV`%yoAΨب@N=5u ZACKuUΐHiξX_6 $*ȣD! %Zxs5 A+|:Ǣ8[i,=BF:8P&@L?5V Z( g`ӢXsдdL uD6ˑ؅ V" Z}N" H8Sl6=PT@DTfjCC5qP+W@xNj<~ ./J=RZbs %E B`E1ecߴ{B AH s9vrhDT)A MPKfߊrV&Ppcd;(8%`asp> lV:)5r6|R KLL9Cl"uE@=F5t<|`5E]\E:6e#DxXDĻ??Y!PU&#"iK +;H͢8_c6i/NϠŜN+MA!~#KJ ˜hl@;-KK!:˪!Lތ!4'fu@ S$ 'F'%|_ CiBUCT30G+|$R'9 QfLNSN/F. +͢PUxmbjbj +k[$, \A쟓FyT0p )ɘ.4衬0^Q̿Qk5B"?cl@`6)Y.P|,FVqQИVTk`4DH ST/#4aBۡOÛƒx@A:&D3عBE?[SO&&fUx.rƁV FZ9eYĜ k)ja @T%YV8!,nOc>PH7ғVV3R֘(Lcg &$\ds_%4<apZCm79MB><`PF(4F"6*!.B'#4&C`N{[yC &F,H +ƏKB NЗ$ N)xf70t8A8֣3-9|CT(_$';NՈ Lza\C=TNuP{̿D;}?hF~M3>)R@JIHT\ڍTdL/\dS)yc d܇ 2Cj Z!D)$NAOt" %~. †QF) b`hCY(h_)gA))ڽ1~a97:Zr9coҦ`qHj%y_&.0RC`6k_Ni~)?BRQ75ts]%KvnvM9$/Ԓ2QN6Zȵ*բgTh\(ÇҚKŒVB TD&9S -z&k?MR+\ zrQ]岆g~T1\9TY+5ذ5z.`MZ&* {Jkvq0(2fS\@zW8F/BCx,B0[ >Fcsk9S 24G^ְA{:"j S Q$ +%;]qc,.rSʯz$ʟ`opߟ w 0 vc - s\@2{t1\ǰUN0%O +Lѽ+~R'%*f,F0_]~)no(gߜdy`ㄞcfXesi kcj\ H>>pMG[1kgY`[PAC*>CՆ}s3- + ,% ^-զ~~Z5 ./zf\PAތ48qtfTzLv +(D{">:!,XȄYp6hCP)'@OT"O7owtT#X %Zb{l&~ XJZK~fQ lG<:K͞)AD#{K)RΪi pu|І8DPIҸŊ>oJ]=$~ިQC [O}[9_R+^KgoY6p3NY׹@<1|}rEEf *J}ņ׼sXJ $'_N/~+s~.@iy,P|'Gjݪ55&!EV}Ы&tZ+0a Z&j$>Xh";%J ')k턥4>S?߷`b$UB8)k:S)*ZͰHjA(4-u&Գ9]紸ׄ +?ƕu2?0/R a>I~yWP߇K?B5$:4qWYpDB BI%hű&4=æc 8Q|?׬Ds {):/@ #5bԻ.(tV@\Ct9>Z3NUxyd di}AGmg~7% ¥T}##s.\]#NuM^vb*QC`ՊVEa,JF*_*_ih_%__FvLxߵ]OJ}o_2WF1տ@w2?2]:L4ױk/ꆹ+|$A[]qPTB +""qw##'u?_Go:&W(!}C|qJiكR0]}HhC//K&zA2pO(N0 Pw1}yu_ _g2}ܾWu&߯}B~߇7RYG¨%aXW4uKXa[C@w$bLpNM%5&0U@p0@n! d2(\S9bmgzignpJe\Af{䦃P+wy(@Bl"&d-!L`ʈRq-aӛ}͘ tL C&?nat348\*fpNK6YD0<5w+}AqĊ/%uQ` m/Ot W򌵸(A+VPaY>)*M14S ׁŷ1ʧ 6&xD -ؗiHr0rVpsDFsx.e2$pCYD&m58zY1ֿ-n%bk+E@'N P\LkN8Fh]3g!U%:k&Dil.~씖Hrma$ $׊,st\kI97x/\aNKW]IP2+SuR'ۃ`*N"qoZQ:QHOY +In䈀2(vZbw)"Ozl%(;[ dP+LrHIEmjOQUd ljD%"xY0PVXA-Qc݄6DuD`y8W!aQGS2s`dL[QC`J+tԄ|o`JC|pFtMȿ':Zg4&MB .@ +Hcł'Uv #K ;< )6rG@FrY6ea%D62g%7sK7)WnQ@ +J}a !WDi$Bl$r+<(J6FAb 0TmWH<\@ngW8Gj"WK)b9u  d 5Bܶ aTPi*_caسW@*m.+3 +$4J4qx)bx\Q.OR93H8΢j ƃIXJUq( +JM"ePvJlwThx@ I`L*/GjKdOFwP8ms~ `)"~tğT`XE3 QhvrYciu3*YCd ʹ.̑ +ȍ@JGTMD.a44kisC*TW 2''/uE1=SU50 !ߔ)Ϳ?TE""pF[P]8B2WdbTD\6(*Z\T\IyF͹),ÓvQMbTˑ0PFLIkH0Xs !!~F8rp^<aw)(+\( +1R[o+S( +R求(Œ !gUM5 'J*?B 4R* T,PHF2!sr-(>f,+ʂsxnB-QH89 +`7y`nɃՀ +^8T1XXˤ2MSJq+T] T4F|D?nH:V%ô烩FlA +Cf 3j<8VHxHGAb&>t(q0BFD711¼f`~VOz.o b )T-~P?- }|0{cʎnefL%]@C9JcT{x D4ppjRaNKT1&cq 1F0ULS~S(OS(~WEP'{mr X ƀ>*Cv^w6m߹`rHtrI`[A0Wܒ^bDO?T] a Z/Aqznkv+x7>%#ΖvH[䷡ՌS2-(ejj+WF$ȯ4lN#|?o2q٨AQKu5DsFqPAOO +[E RCʼu_uUԣpETpFZHR ժQN;!F'<DDOc !fM d/$ʘ%L^ ^S@*wu%pK <(0%ў mc'ŅCi&mUsP<˦+ͭ]Cr!"ZS&D'wbFBy4"?KK?9%gw;PsCw7CsxZiG&4#ŧsi.Q*=d @)DZ$3_> ?aI%v^"X|A Jޡ`<'X8 a~jTlo\w#41dCc:h&]Qniv,t&f?=^9 pY-O~i+vhrYqRR0aT%!'l&cT1SSbOfΒGٸV(.Z*^j>ͯ34\&)WRQpbQlx7M(yr&SiK*Ua$W<Ah37#w. +zySt 9S.U7 . "^iQ凒2 ݌D *]oYj$?f,b_bΠ$׬I(d3pu98z)1q%54y|TB# +0Mp<Ҟ{\+tU>7R$~.q1{rO괋OV30b9fk&ŝA\́R!Q."I!4N҆Jp8Ҟϙ_no1%ݍ[_?ӧ$E8赭 $SG7p918LP^,aJFMFL=AnrZhPpQ0SnJ]""!b.( %t?Ԉ_4T@$R-QGk:񴔧@i3*1%NHVHUW.D("jD5l2L)@ܡ*T K`0! TeZ'-.nȻ 2=ˣF"0 + LTx1ɿ>.3O"&ɈzD9xJ[5(ja\,.YF)W\ߣa/%L$TDG-ms,mR6Q1r 9ײ;3` Јt:;\t=j,BR F$C,#Jd +EI)& A}vș^WK?} +~bVy!ʭ)ʽ*Ֆ$=@V")#"K*l9ZHG/|}e`; vǃrƒVj﹏x!xPl/MI !im)Kqåh) &=o +&${";%v`mNo%ly ؎+.r]}b{)c[mY!2+]sVW:VVφՃUm@իz7ۀUCX LKn_8B]jdL4PjY,k_T>}=bRQXgXh7NE[HzƘ~`oA<ֵdY>q/ȸ}1X;QV"EBX=uPZLqaKS> b "c O_i䯄g7nM++JZ{3.hpЭ6tpyJlNEп&!,SYDTesz B֐˟7g ee`|UildX.i;18#HPy$Xx.>q]*4r!BGq@売pl]HuϤuJmwy72=.07GuL[1>!'@ +7Ҁր!=;L3"G=3N@/`G#bs\ӈU+Y+)Gn +Gb@XHX(W-QR#9aLjP)X< \FtPnYZ)}fDp44AEHP4XKH{X +FA^L2hpa +!"Mq+IRb0PI:LxVM+cg4-PVbg%t .ES\Rۙ559JJ'0] ,!!/)-0 ^=TPFU.dI0ACue#vA-5pGf匋3q:"UAUX"X-DBM ABb (p4š1f Ԥ NQ,dQʨ ,<95"R@|0a L d"@8K|0%ՠ j Xk>&5(8i?4w}Q@DvP$N&Fb"~XXH0t7DUxtu +n)DFLr#]a"d\4 +l.I*!A^*FE(/@ /RG|RGH ‚Ȇ~ MAGbJŌgQOBP+J bI9B@X47 *X9Oo&Ǻ48Nt,6pljd,\|$|$xT x:G’;;1CzʺiH#C#q]؝cb3KK^~zƒ91!{",`tugp0`20 ;#0KJʒXq@uf%/H I[wFT)tsʕ*WW`+^ɴ%r)еx6x:t$̀x=9ُ'/jfD6 F̡ t+!\ӻ(>xB\dŚCH.=@P{;7/}/zBxc,I 5|E!ahgӱN+G4ǝGxAsуFVi}tH$.>-xtBrnDɕ3&%)l7=o& +llwNY{?TLLr+_c亂c]aP/pM{X-n)~C5%wD d{L-;*Pxl_klVKXaуނI!tklB>X=ZVoEBgҵ6bO:/Pɴe%P "&N&aqF 12*\'V*$VFuaװzBzM,>!# >I0=8cAc`m':% v Γ81MV5  E&QYw Azo]M!@l|2W_՗JWYдP8Z1Lˁ!mG`=_{ +Xu݉P< +b\؍s@5!ILH^b2P?Fn +ו +%N%NL#ch&dut=Bx`>.#<< +H@iBK%j b*.uJD\hκ%AI?-U@bQ$g@VbVz[VDx7ƙ I+X+qԘd+B艶|h: +\tӤAO!qVBV A-TzDPg熜m-Vq+%JPREH.`)$LZD%*}&X+8 7# @2hHaY.k5(P^zf>$<, hrR E?-l=6Q> v&:cA {v>d1 +H.%Z`) a#iBkcHq^ 11* ++b8hr<ƄpV_ƤPi"qx!%#ԕKX&PbeIoE\dF,LgP/wHJ) S}!\焕 yj'p-*ʂ5|$,|$$y_Td ;+dD.[Aj3 CLGZTJ=7 z,-%i#qq4%=\>ʊX81`u&iC Rv8*>:G)Nm AsMHtH B}ϵ < +GzF(pT58y!]LeP=E")Rv!nJh1$Ș96'<i+`Pb#XSӁ^H\A7鯞uP\dCyzC27llKLUëP>M҆e Bv#ThޞqM +);m +(\#Z)*i܊J'2h78 trbzz9:-.0$ r@ň1D1"CcH/'4FFȐFAuEd3)E7Ay/aX֤=UcJ7vd#{0%}ث2 RI} 񴌑*f5Y* 9j#wpe&dj0n:a^ZTkN9f/ޥ0KgW(_hᙕX?gpSur\R9Dl>3 +eAT*T2)x+ydLʺV3+ЦNvurlq_uGItSĎ "8/,â;4F=RS%BMD.̶6MY22 H`Ť>TԘG|Mt@!PH :>`V}"$Z)Il|H"Mm\7~EqJ +j\тa^<Ͱ8 +LZ,5oSdy*%PhEG(铌SqRq$2kOU!kQU!k X`%D;Ż0TǪ|,rcKyai:[gf#x2S@7֖9dfRW &GHhD"&F']^_!D)F2A(3TA*IC/yU! / )Ka)r/%/&NAwKVh$7ܬ`D4*w9J&F+\Q!TgF?4:i!R:M /&L* L Wpt>}z?DJ-:ILUzE E3Q!: +endstream endobj 19 0 obj <>stream +<_g庻I)Z)tK6$g'D-|^!T/Hä+b2=e/0$'>2aJap6ckhjB,{$I(NT\KX$N)-&aZ#-{~mr6wAqL2PA7zԹ ]mS" P tsEholNl6 c;%O$^,ԝI?-"k{~V$>L bsBhC $}}Opv_܏1('|Xh(*$j6Ѱԧ肑A` \x'FG +8)d7B_"Ue'OcAQ d0+}vt{41C}.`8m">Bevp)†C g<,opF7$FP2bᕳPJQ/MHGtʀH*iEF[ +ѐ&pOʓNW'w4j!S)LċXBf\IKj*\)Dj:ҖrBeBp2-aSV&D)]AvJA}v$Kg>Qnk5(0b`X(VDE@J2XX3I5"u(ܢQ5b@lpة@[UlQS4 +%WZBXJJRۗU},rY45a ~fr!J="\@Noh"m"J̪T[PV=X04['1q%R# 54v.7{Ю}ܾZow7H~Vd_M8TumRR]vAtJ*VlAt^*Hё=ڄkb^/}Ie_18{!A##Mf}V@퇉GhPk-U}M~: VIJ\Rm˽ږţZ.] Ƕ4پUY ץF`Z'-^\O ("q>8E[ G8NyN)!>)A=v$cw~퉐QR#qylAWM~c;"M~Fkُ%KX`;8} + lʇ!}/$ +GV'ؾ؜`;qx[le&^{nib;Mb{zob;iw,W+ +dQp۽[] l.VNY%`cH<]T!` `.@I כV{ϽKWRu0aaomX*CV +V/RV9't 3]p + Zbb].y+4yW0OSJ꺆L!CZ<`:Qve6N^&V V.էa K! _ ~k!y7p9ͪSf;ثB +X!0Ch3M&R\tb!YVY85Jge.N{JpXc cMAQ Ծ[ sNa~J\A_y@3c]PLr'TE+(7Kͫ5ND͊ E"% :k;hhH j%l,  +:A<.Gdil{а3"% ] +%wr  3҅N *hF$x26eG t 0GlX%`"U>kIj3uADByBZZ NGT#uGReHn[H,i4*)+;d6BiOt<) ffHZWi_Bč@P<#Qݘ1Ld(}(."-ӐMNc#“WՂVC3P`Ԏ`C(WeoEA:ep)׭B T#9(@.a*@D?Գ.iPi+'.ba!gƁb*a ZW,]kͅ&]Yh8fH,d>&m#2[lbz5:_@QfH\ a`a%9E)HBT1"VXК +?8juV.ŤJX$p .LG8 "$Dl>Xn2ެ!͕$%]mnَOڥAqߊCCw.h CoeZVC%v 9ɮf_Xw%qIq/ૃvwLȀ O0(-rTD.w;zqѐ@2'Ql=,tqJG(lQ`@a2ɨʨ#gԗR1 eB`*eR^KH+EW4 O”D81 (b\kH,:Xvۺ_[7+D|qRaT(2](˛2oU?oDRFgX,cʿa;ԉR$Hdk]Ir,uq%Tcc1V6P0!cH5'bM Vd 08Ã= +1aprwbC+X_8ߊbzӃ!CwJJRMmU*?+sr̷Č}.BR1 ՐL$Z + "q5*!{`;ԃ +%@ע(:ғ`e`KMrQgSi7ùm}T=sW}VX Zu5BG}G;!xB$"-p>"./(RFt?R3,AyDAHm|m63(# +\Y$]P+b].ibʲ#h],!40 #)R‰Xk翬oOz?$"<,x|od4&ҘLrcRy<ǷL1LFǢu-RJNa--.3AXqm2/vzEۗI܏ LXD)bMP.AamDjh(x~QNE(8W8Z#0+ Gʃ8F,9üC:MBmW!yɆf`:v_7mI%e92/0s~hȪH\ԥl"ؽK2YX|>O|e)n|l% Kmd^&YҠf. |\2> tP1"y"OJe WAս_f3cpș1YZGr.<8g,fΐ͠Yabikd#i> lpX_cd3 qF20! U21lQ,:}*Vr1ѻ# H lO@ U#D[T=j=&t((t.=KF/ !>䶽8I}p?PRVHmkPq2@h *O=XBɌ݂_B]Y(ByBI!0LWhT$a` tT>VRdK/!{އ &'#rsxٯ#c(PѧCR-U0 +97.%R0;ibI<#!p8%?T(2 +UC#C0bet-ob_OK O2 Qʐ-:~d@ے[TZUAlpʫ +o.ޢ . Pd]80l*lj=r\/}r_q6)B}3cm. ڟK2W+$m)RR9P8s e)LQjy=bEbAD˴x/eWiqO#wez>mm.o])}9i4cW9uO/ބ*WI0ra,@&`,4쇄Sc,SWWKWo¦i}KоM6GER1!aURsҾHhwA5t5$eKzg5~ld /hvA]AM AqPfGXGؙYRI[g}#q, +Dg1dJS 9m;$:kdW ϊb17a`gze@]L~u7h@Te"&f=w5A:ɖ#6 o?qb*vF}`g2 ?xvahb;FKl?$,]Dupc;Ui-)9Kc8ylTݢT,'.` }pgzS ʰziX@.^ +7Ջw C7)qfmڟ:`AC jN񒖹5qPz@xҡ#I/KɑXXYQW a35 ZMx'ywc[PH")P?F< FJM(KFKOZЅ b;++#,%S)&/q"!/qĵGvv\y.Г5*c,xk8 XB-#e1̾h rT!HE$6j}a1BA*0a@ԝzYtNʀ%PbT0!,166X1 != +-n0zbn@f^K"sn6Z?W[C됆N h7vРdo;tYM"Qwڢ?>9%5bq5,H.z/ i)2rN$hȏ@`&*_#tM iR\Y +#J3T<9DZ#܉RhS=`T =(My 3&#07ÓX>YL*=`|Ԅ_q *HxnUb2+7y +V !'b?N[&M*\E9:u:'pqiTVľ`΀2(26a J>b Lt?emhCIb\C:pJRX":"#iQ%@F+49ʅkRʓ2 !!h~zJ\}q"8rI3M5 +*}% h\ib*}  +;Wj:1E YDCD +T?΍[X+*u#[ḨQS* ɬ43J$rO5C,"Qotd 2PbI% X~1ܡU-[j'C+uTN眰ys ds# " ]' }Z2T`fsAD' Cf7-*o 38_0!RPIsg];{Ho}PգW7V+F[%ҍr*./)!; 8b{Oc7a`IO0ߤZlmE*|6G rB8ʹryaBl0/>p!R8 tv2#GH\LHHGA Vcj`Ui<<'4,պԱ賷Ź[ē O +'o`VxVzpΕ",'"\cBHa5q5't㨔xk[UL8`;r0Dv6H&t3oI8>ÑuL8RS-.@Pcޏl5 v9bF.\BdoW1qi;vLA(W+(HW/Wׂw䱈0Cn4gDp/b*F"GEz ~Cr|N!x1!f[ :9u,՞x(TQ'HBeZ8D*:t#Tgi˴۫vt(*LSFFPR^ϔE(>a'6b>EIaa 0‡fJĠm#Aҥ"WX/QJCj{QsqpšQ9s~(~g0.ER!XPr 0WpWxLELqބ6uP "Ee'm:0 P"}_-^Evhr߅' uEkW!E'ep(b념iR2ZʰZj%8<1R\D?7g9]s..I >." I 9|K&&S!B٦aViJlUv>)5ԗ DL;)X^$'h7IوxN<_݌3\ y]<66:20&\uY$ h'>3]`tռ*z>]^MH28Aa˙(ӱ0Xy >"Zcy&`WP^U+dO*+Z}ԠGt$ +S[xm 6䈫ͧqYZ)<TIV=P,G$"Ѡ\LbHyuRnp?koG +/te[qBѡͨ\sbGdž=cq[ʇ4& +H$wHȃ?!rtaNSaT J +♙KKPߗ!g~ANqH ⵨0qTfC|D !ƅ:a!TD~8^yiXn|1u*$^d y(+.ǙYq[硦8R3~l+G  ,I9]|>܋DI6`-D]|WPjRIIdrn+ +T +aX4uiQKhD"6?dw/9ƙA> aU>':fQRB'P?(ϝTJoTfXYLj@)-."SK3 ÊwqX.Job u~ɒ(Y +Qgя}V:VZYVK.Qk2x#;vg~XϙX8s [PW-"}㾦?Dg?# 0u5{͵P֗{KRHk_~ڏd'4FG ~Lk_ѵjĴO'}>5rKF"Y kN?9'8XUbZfc̐W yi? +?Ԟ}8ݳ_hO7Ґ?5 +hc-GLܾvl3pU/g\iŰ,. +V0^oIwV}&g>\F@-KcK%9>ugh?S=,6گM-ȣܵPi?IJob4gkC},Z8:j1e~g3™>)+<оEj_p=\\{n_,UR$gd5*'uڋu_mx!afߵ5٧WPoվAg@oNwz.χ{݈aTa# g)rDv'Zmwj-6h=]å̜R)hlBqHa)pJQHi#XR鍵|cM!9"Ѿpa#;f"{ڀ9\ U +˲x'S*W.A:ZVTD2V\ⴶa(a(aߘ/!܂ GC4*Ph# '~!(R .}5AbTQ-i]bHZKssm3l2r1)$$ǂ)Ua"!gT(VJ!!PB $9PHMȲzĶOäzV(ʶ<*㊓D4I6{pCT.2vD6 W0PCJzV4t(P0h)/M .`J4FU B!Pd-AIF,p ].$K ʢР{ЧM*çP4Ah/"5b!L0P Ze=fr+TUރjs¾t}E!" > q!`qd >u:wc)؍1㩚<ۤ'2EbS \QTTeEe*3GZ=g'|כ6#,EOi .Xv  c{YTxs1#AB,GIP88LKEn+1F +FhG B!7h"%2U3KIu#a,>\dN> ͑f ->a@9 z1%G&l}('$s'q@L iQ'H +FIhqM8zAKlbe*HJB9͘` /5 fHsƣrw6$뤛.Y?2P /֐I)J$*6QD)J#DD +ra$ +av5 `\vc% :\+R:1K*4F D'SshFU^f N5K<1/1/_IWKZ7խEmMm֦\D*[[Gl@+u +3XD1i$pfp1uLh^B@u"qڱa+vID!s#}Dd7U|I$CW}:)\Nj +jCStlZZȧZAh< 鮇e%gڷx cgE_TIvXx%vи>E`qhJ 2VT8߶o+w1'}CpQ-vW9Z\zb`l dC\}=j"k8:Vi.4Sj9_^$"~νTK?YTɲVQ+Q;$Q0-` p3!g!x]':oFӉ)Ag` 1 +p8( ha pA0iLD((B! 0 @v2@H!elIJkVXpEG;XwL-P peT{8/[ՕQmFkX1en*6H϶s2*kGc#7#"*O3כ33 oV%!t! =H}tno/KD^ȁ5F2ȥN(#0DDǠ:@A1&ܭ[yDZ ģ S z& v#.LPP*w ûa"9px A_]U׈H:LEa%f:4 8pzAUW[/%)&Ky a|o8@ 949R+|bLx 972jT~. '3MA2)cin;G ~pUGy +wZ$@;up9;T(8-֜W˸:Fc+b5)L,t&G Wnr0y&ϩz1}byHA[tM=B ,'hxzяX?Y547$^N ,f+(MO`i*,D$#^N`e\c uwRF&(/ z uA#>}y0miLYՓzYhwi1J>TQDZ=&϶ߧH.stVP g2%,,D-t20-Ŗ% 0zl0P󜀪Tx"F?IRz* C}- s9Р8$!{G@T8 +Iz6s[5xSPg{/>6嵀~ Ja`G<<٢Xo]?aPvs +T%QHQ!9ACY4 +Dg6kN >i&H7VXFbC'߁P6Nñ0 Ru +zu;Z)½BI4AnLb|f~,q +&($VcI(6h1p\DfBߏ$5CtY5>BknYW4 Jn*Dϫ-k5;MxH:w"J }BJZz+=->XN˕1gm~xJs +GJf(Eb ~u +(L oI:҇ǀ}2H HI!!OmV\Y=7:OmYDOm놑^]Eu'pӴ 1 O SV?vX DDq؆:rgz|cER1B4[)^1!qgE&ކx4a߆I `&V^wRDF+ekR],NeD-B0 Ѕ7CP$VLa3IN_ų4\W@V:%FSJnCm$).Tצf{ +8PIA!I4ݖ"賓ͨlR7V}ՌYU?/"qWyrWnLgpqVh_jƮljV9Դh}Du+8 4B%+`c(*< &M5lv0(Q\|* E +4J0+dFj`VH,L's1>Kfك.Z8 * UpU[Ez t0Qu%AG.ZAi^e^ 3pf5SXZ^Jc::AE=YP]Tu˂G4EKλ"0On]u1a}l )7&& 0ͅ}|܀IӱZyr#-뷪&gOtaG Wt@ +4E\rb-x؎9VUU9T,P\V֝Yp(O㽺-۫h +0)B5I J"TF7\FVJr}xʮZa ctȰQLg]?D>W,-+M@'AD>|"?yV"G Pj2a; U`=rw>\2fl\}߀P!S.)zBd 70s x~x[U$w.mq^$N8AlV fM.7ѲFoU`eIz/b"H A=u  ];4`*] }Ǫ:곫S]6y|V~#Kah&sk:(_i_pB3a* 1QI%VSlyxIi$&I"ЄHfӌTxIڨ໎܂ޅNfAy&)GS8˪4g)|.a0FhչS)r-CW삍~h #~w=QFDyW& ~#` 6jt.PJ%T_T71ʸV[]*d`s[I9YB[F1ذu_@>,V&SǸoLlLA1/yZ+V!h 87)8ڽf2m =}HX'RJ@`O ;u;'`fDKHu6œɸI~Ot#2;>{٥A:Ml8zC="?蹮%_wm)qxid\GU oV;9f) +dfzG󿝻թ̞XpChmk'&7uOg]vVRK(jY-/T5eVR#q- >cV.ٟsI|bUP Bbjb޳~j;$/4#%J' .$MZ +xzxU*L/lMqs 2cj<<B LdTt4A y~G"l8 Xΰ )j*D97Z% P+8&P75P\?5( FUa< +Ys;F +ޯ ~%zP;d(fweJ +^ ʌ% tAã87Y%eh5W ^u'n&4X*L/6R++{NӄF!ln((ڵRUڀ%uWUJ85Q+FTic ڤXkaBMtiګs8@l)Hj =Ϊ .4_IŴ3 L\ JX.7F idӁpa;[w:,PRn('n{iٕIN‘rRE;5'^HK45GeE܇Sh@1+T`ѥ-٠uVUF +A,wYd?ʵ35Qyā"'=BƻfEn uXTzΪZ as?2*Vȑ(. 5+uhGRJK81߹Z0)ievE}*U5gR9 V[bz*س8[AMڥJuyjXtp +) 2rsX*LXG7' [&^aX%qXH 6z{X.XrA1q>TX\a4&@TySǁq[LX|H*W껸TRSXiV5"OWq0*\&mopZ%[*\EEF! ۵L!BAVFFUYz_Ιm HUU +@Ju$D4~6NyfŘS٬(/.L8eD\g$ZYWyX#]96j#-aP}P<;gϊ1򏅚#vV5p ZԞ=|6@L._CW\hx#3\*We_7Q]ar,pw u8ψfa4LsuV DZpܹІʪ8ڢ},/-Ug14:g-yn%f}uk2dXLؤN`v\6En"W޾..4ބ~B> $ײie@s67o9|"=J?c\geN`ƑAԙ3[RZ="S=B#^mizj3<^Iтg66Ƅ^7$Z-ģ$@%TK+Y*TN9;*Ѫ!N9D$7y(Lf6,VSl+/6[T3Qik \VQ~00 ] LU5j蕩5[?rR?% B!V-) =#TEt\sy_0@傁8{u6wkخ1-GKN-䀎s1vk%^+/AÄ́(16q'Fen&0ϻ&r|0AH÷a+VUnP6 Y4嫒82Q/ٵ/Z7)>nwXdFYJ/ s6,,2DЙc˖ L>16!yQM6fc b$͜x4f@PLs9s#Trn.¹HӤ O&#ҋj24m.bP 3_+.優l9B z&Cڰ*Y^ߎс[%F^ +*z)W2A&Ͽ:OՎkõ@e!oj rT^Y@@`*i1-峗\;̩P F_1A.,䫋{ $", B}ٚdLnkYbhP*V 4LZV:Vc46C2XTl;o1E5{D-& ,2͹haHEqd}!mcT>8Mbnz/dsLACO&O+Ŋ96 ''W%?`EEy4r$N'{ĻC}1(M&ܝ?XҢ@Cou2-_5d!0PQVբY}B ,;ICrT+L~Y o$ŧ}_5_^4-_r,;&9\G^c}V(}Im (^]L27Ֆ+=̓hѮL g-uh)jr0+>1})Co֟>n'W$Wuw_ +dK# T>x̜P~CVr\cx RsgjvBm.00I㛌MR0|^Уꍃ( %-S`*eP⢹TBIU14Y oK1xSelaɲua՜v . j@b-dgqK!X{ܾb~XDw x+->JEW[1NFMlt7|/Ry`vXc멕'PWAW5h pdzbq6 Hl'sxa3'EҢm'#.u`> )?~i>hN͕m\=% *-{h xy͖o9nzbY4 +H R!dUD楈)+* EY)/ @îSK)!vu !C`8H[Ꚋ/\j }./Z{]8*"ޱgZ^qXm5V䎒S"k!"{"s {kD0s5au9@ڈƓs{e(MaÙ1sRq ~hEm6$/k/9Û^9jp +fsH +dfFH `89 ւVEHOHGF$'@ÚTǛ) {~Ts۷viNM_['\d/G)(8u&LIU%Ú2{eMzr)ẜ(-hWKzI(Rjx+CrV]Ywi:΋`qO+k|4B U )ReB0TV^J&g5YEYzZGn5 uہ-<^8)gejGr +/-{|tW!AnQ0G@.K'tAzEF4@ +P0d2dk4! 充!a T)|?>1{?.z'AP܏f*UihkFb/MQ@ 4pz!M+o IfMBA_(wCa$sk~WdcEYaro("F $V( 0]#,@ +=5hh:AxjqsC~ ?^kܪViTǎWe2wQ)= C~f+=\mv1 ^vT 2`.EJ >x_#) >փGxxg yO<;>~ +]BA p8YY mPjyrH6Lz5 @^2^=*!÷vZ +%?2UUjt~sKt~y:Y cz 0Is19(?0B;ցe +U䇎`Zd8Y<0ç9(H2ܱG!w` ŏ~n?5.o< 7dbq(Y-:& &sMVNWFH|e#u dKΖ*#@_sEPkZfbIii Ȁ71A83=z7n"yEKYZ|{lxٍ\r%s~Zqymݢ\@: {{1 ቱqN+#~0ǖ$NaUZoOgI\6 +!R +? 0L/d6PkNݧ`xD٪RF&q [Ԝ...Mh1G)7"=(M@J 67:RXlͅcU`Dju"\R0jpHpa.q!eP !?e`D pG2bO?%EEj<+%itЏTy<)89&sl, 3\rSI5@;q#W)V E8i2%4b2C}Ų>晃>>8$~Դl<TjzK|^LE(3Dh\oT&6Ba``R=Eߌ%I9M#&/F<юhFtEczicaBi#&TRZST )LPv + QvRAa43܁NO)N& hY8$uBPT\ߵJؓ4xPIY渎):Ij bK۫-Ac׼T@t9A4zA ~@?ܝ!ZIIML%V;GRd]ik-LamDA6y<\U'^Ѓ5˨Fo g%SgS;^j5@@ A.܌~fNE)BH}"KK$K3 f 3>Y!%LZ`0XzU.ɚ~ʊ,KFu]&6 w@lZ/ z&'7r4As uX.@.MH gTvxx$:tՄVtU6#<$]PY޹]1k6v 3ڮԒ"w ^E1&Q.:ܠ=,'8%ˠ>4'YkD½JPtf +J6,R,tLOa21lƂ fu\'XÈЕ*ncZݩ,䆢v8 [#0 xTd%& 6d"'gE.aa2_|?c% zR~ EAܝGh@Neh/b,PElD4@`KRH+ ٛwdR²\豱 pD2;HNC&ī}e&tBS]wh+yWC0w$Aݫ3@.{AQb!f5=9 &BX"Yvb!h]zRM*ʱZ>e-+E2gi9.:PΥ}YHXeRj@s59ܹvLv$Pl\u PŹ{G9jjsʲ OE*F'a +&É gO ]3JVQdD#HUz>E \%WjU6ji*(&T:/wXB8a3П̇}Ɯ&U +zE pD-I4ʋ:}ng: yj.^f7k.Y"Mm:JlgJ:xd$q8!)D EBI&m>[[nN +-Xȃa`as!d@ pwH,,o"#B7[zW^ZWքiDaWLP}HRK1`BZ zy^a5l{^f=/R'QWs'hd*װc" UCJ@`.tq[kf.W!0fqgm eyy*qx. <ߦf/##U w5UY^4,~ P-% B+n '$-cQXh я73~G~?e_(/4Gj4&\ȸ0E,dnu Y:²mQxOX.2NB -۝4*ÃhYK$ 0 Jk4Zag4Ӛ#КJe4 myKQ6͓n,[erm]}9 pp-籝TѠ_]! ]=&!!J. _ +tfw(V&CVxHmrJJPk"Q&vR;+XKZF3TWāp  O OGjA +L*< R+&YeƠ 1(&5qO.) `tX4H-*Bs$H*͌WqDЕF?`"ㅫp3; E%^F KRN&6On +t-I fspŒJH{:_P`e6-B +A̋kGp{%BxbiqZţW\ÓRTqee'6(+C&H0]gu(m&obb(*e*֖~ R& ++b+i7$V,̫FQզPkTBTqrjPS^a^Oyzt*t,7X[3 KVz$S_ӬvmVYlD申5FiɧbƋ%8T Rg0Q9Y=ut _ ?Q((ː Q U%Efdϖ:žڜlVR[_5@@ĵ JڢH{ %QEĎcЎC,0jCxrw2?2R zB:Z&-x-}7+va$6n-!#:Yv^T*<ڒw)LW( aHhhK,C@f05B +"yvU7莀S2eK}BRPѥɪ+Z;P(JV*L>$ Mw =wf4h%x XBh15H* +FMcϘ6v@#!\2B[ݚ_k"1TKb m o!xlHI$!e5˘XOcМНОР2W~µYT.DALw ؔR08>W;$,s(pׅX{6*R! z4 +~PBhQaVq4@[S @);jPcV"*L& +5+gAŻ3>WyjoFºIԍ޺IAb܁VuT/ z%RU,/v1Hd<n1Qf!Q@0b<EjQMʢ + *)"qW Eq\Ea^C?NTќ-D(/1 +Tsp1od,X@S]~kMq3* +vSB,"\h> k5n@(.%,YqV1 %yDD\)p" +&T+XD0pA{R$iRִB553ɻ»D,Nf88]kȎP"fL-$ڤIzKVdL*DRL;ncFzM̭=0 n0<~vQYb ] +|Ģ,*CFҏBҋ/Z/=4R*F|0B*EPXJF$(O{ "ޝ2Iމ +z+ӊZ@qep@rHV(26FnYo4fy9Y=4\-r kf"RVt+/0ZI.YPjͽFvA>ltg!ZuzTCZ8h_;dIxQ$I&=ѭyВǪWs&7p6r茶l`q_#' !H9? PY C -[mT~>L8ŋ?ZN90TQUyyLVx~۞gSYY&u5@@QE |C  +.[,z;I40/$M7zK ".71Tt2ȩ๜(bZ +L $(52Rt0B4ku-Cyd y7GTyܤaxn#V AN (ըөb ƪU+RF>wQi懷'{F4KXfyl*Z,(yqS[0GeIUWwY!<Jߥg Vʲ:GyO;< sWU|t~԰ym!æfPy%yf[ti˽`vj0uPjxۿ?޿0o4oagT+NnC{Ҹ_X/87aj&?cVT9%~ e(veyUn͛YPEe}QKۙ J'11cJZ 689p~DZg'}äoT2H- ) +?u#sPt"B" m:%dfDOIK%U!E*jޣ|2pMJXѪ)DDJH6&i+ +IA"Br],E.hf5@@,Uxj^lD3fƥ-* b"7eqtb]*GCK^ZSDgpԦ..'Ҁ'̝PC2), ݂DviaJ&Jʳ%eYr$bNM&=L qW:5@ h"Tace7N:MW( y k֗*85X'.7$ 17͙!.)Ϡ="j-Ӽ=QHe!t5) QUe%mm=HynJUo/^J"tqgJK՜9B 4rWpYpp5@`olܵpI^p˔y襉w̆ `vh Q(JW)HdD T,ܐjEý4) ud8 9r&i*@fR: U@8U 0p} +}0D඲b0&hdSs\2ڐf!Eˡ@v:h-37XJ>0 iLxe$0vѝPKdc4.אm!yV2]Ҁglh y"|PδF=i-eUAv wnN |L(JG$0~0@5{*_ йa+T}f[n+gRH!8 +?p̿JmTAѫm#] +cC ǰ`fcoC rUE(Jr! F=wGh<Li q,uŔ4rL;?BBlyЭ6ON H:(0P  +탰O6|^vF^ J8_u ^Ѣ8vITC@!C-.sC2mu /#1rt2TFTcA6 /\+ +*P($> ݮ< rH$2Ɉ]r!8vu[l$!T`'@H81 +-X54@`! ?aRF;$#k"~{_ӀԸx Wj }8 ~j9h@"C + ^(ɡpߴRNE5:0-H0#V%DVE hR0uZ\/ 8g +U?5Rgr緂xa]AȍMp {s#f$(,R  +U)pSEL,X(%Nb,4(sP +PTa)$H%9 $29=SuVz`R( =x9{5$c}l{lLYl$ ȎTf>,|Gޭ yDRDE8ÐoJQN<3pZD:#oXڹ-mzJBeQv @]W~b/BvL #sM+!8AؤgnB8l] `YbW0M,^2ˮOq I7'Q3A QكR'ê){ {r (DߤĀ~8 +m2ݫ@~eԛJši-xfY^b!- I>xFFKS1h>m2#;s"*ʣ 'CjI,꒜dr+U/U6Դ vW o-[nO/G +IϮ/4xo4IBob qTA攇9 BËMNO vq(!=ń'#XʋG8H/v7;L8= m<{Eذ% lG8>2} m 8R!zH\ybJI&.RWAh?r5x ʋgĂF\=q㈘]hM%0 4 zdI/$$KB/vךbZ2$+='D8Q $ԗ*Tܞ&=0Y=J]xx| z!=[*^*1 ]t7I@&ʂK+R+J)*& >*¡CRG:9x~z{Έz.~_"߸.d*"y)RLPiQ$^^&g5G4S%D(fd[ +-s SJRccʝ%)Xp/jl3E|jCA|yW)yOJ\ + KKܖpoLDx +5@`T: v&i%B8*pL4#L2E2GmI"WAM6q9L(+C f7 cì%)mVY4zW-mKڶq& uLRf4SAi@d*Ptu$IRhѻ(J:ܺ+)9T (ڑaH]f<0ī:I˴gpPL0*G lU +Kae/숭ҁExwlj*åTPl:Z0(mGa4a1=6\ [#e]`.:kG޶U; D nܾc7^RE sF}6aiD=U= +Zd0)30(>@=#!+E (3;j@Z8i-2j+XQʶ:Lur}֩vM +Dlj@OZz2-Z4iS .BOx yXW vŴYZKb?b;CcU`>`TK+bd+kH@XLj'1p=_c^>vs4㶓- 3(BY~ZiPF4Ո>^9ӕK#)heܐyN5X O{{9+ێ0ܲ%gjEb ZEssN-u͑'͢aNg`*l-:W6hq+z.V2d]N~pErɽ];Mv;?.)P;Fѫ&IɎ\E&H=y3'PJ@]Pu)ݎANFMbdlieibPjcȆgVM]-BƱ"t+|9jө1 +daI(߄͂0f'#Kw_]17բٕ ` +0 +,4 *Y+3+WfVdExIuۋF;@HBvE9T,& BrJ]7r[ୋXb|9RӇ*d5X%)JNC-&Jd"Dg)TzRtPA+&B[6ZfgmgD ")24 >rky}`G#bhae bH֧ J2T p<Iav`." l' BT@x4>vVp ;chܹz!\EU&OCQ It3p iԚ:{ U7\2Pȓ4[T#QP=I~؆~{~{F bBN"Z!!V[ЌMI23Jc~h"dn' =Kk[\CZ+cC ^!QG Lf- F  M^ 'RQ% <(hrR1X-dkΦaE>Y GGI" +|DI[WLV] ,(/d"sQdHgT`}a `Hӛ+ tG8f$q2Ya)Ib1Z3aKdq!fV*Y'e !(UҪbE dҰtNZt}fp\Y^-;gbdZ@_Mea͎Ωb ~E/R#(!T(O1$HRP6UV3fl"#4GUl 4s`:-b} t#1 +u +X +t;PXh-čK5%!Tdd̉S@24'$qB+*ɫ 90k} sŵfߒZ_EBƺ.f"kHq3H! b:ez 8%0bHt&sHr gG %2h^*Æb!oiMrp FA)*=g*P$ +gSI K5&!Bǽ휙p2N  Hq0?p4w$b{4@6YBU?Dq0/P2ɢ%(9K)A@_S-LRԵsBNJub%px[GupW-G2f=hñIMi385GT![BJTP$w>yh4@@#)ݍ*I|XǚVbrsht,E*oOҋ#5r,eN @L(4QlaGeA;K$V>a3:?=/ܿ[#Ggg U%R]WƋϔ/"(*RG4.QATF9+4,,p ɭ7Z.զGy (ayW/Icy- %p-ddXKQ^)4Zfj2I/H]Հ5@d52Z4"A2S-=+q"𗉶%?>'"MV[)m9%;֮;-k;TW<^TKal:ls! sZ!<K BH +2P5 +0%#V6FdP/h[TV1jrzr\ +kzѓ7we&^b\Y^ ^a~yz[s`vp^qHWǭ,0 RZdZئZ +NbySgcS{FV7qW8H^Ys(E>Jo ‘#vdB4+B祖mCf9-4<kj 7 D\8$P1Ee1Rk)kȸ(lY[C.107E:9@iH8"TH,[;NqZ@rn +HhFSC D4@`M[pe3ǩEևT|A]悺Ĝjm"fꆼNP&rǷ` O7`"}-"UuCd% 9̠ASBWcqcknXdD=!QBOJJS _/&RgXh(6w+7l{/^0N/]VseN8~RZյȔG6W@<0 ̭ +OkXl|2pD&;r0TcM|@ԥ<2Fu2Flr&Sm=p℉c/|mbw3em> .􉑐 Bm8% +i g,Lᱩ-DhKdFD5ni2pT&q9tUʐf ZfM][f±ɳ Xf7B }_Zv'H[ ;Pu.MbDuyu.3j9RD?x#orNbMU +r߉ސOb?$֞T'B{"~Dh bJJME{HG=.Q6-qגwsc 2u\89c]!FssR kA'D͘Rq󰈕υ7S₭̊U,hVYG41tb,èLW34Z&`p2``SG4IpRD *ňcTf;(GQl1%2D#E +8.-B V Lk˧~g A>Æ5|l fb0\+4yԇ1XMpI%| bi_Y:G8@r#\l$AN8OʢKZBIXh<䱊eJdfCQa x>g%(/$7yTbQqJ8l +?}w0@F*фZG D2ZQ[W:nGqg>0P}2so8H0aJ8lTJBe\`pN؇0x]/6NjC N!T!䤙3@}(5QW cf\ˬvaX[$'f q +C9PӢD| [(x/yWa@+hbXAWDh`SG>}-=znN "΂q,H#B%6I^buOec1A895zi&- \vrY1SjGK!k *h8PHCfrBQS<5wV]ћ8ћ8!){Rd>SFQP +仮H=ʠNy Sg0f򋥔a|?\f6qc;({VFM}!_5X `GzNb}哧b@ ǓhPU.u,ThfLO/AN4?Bs)?(B(?GZHIeNK bM8.ga]} +̀E ,:1OWH~5HIπ3&EISߓ:xƯ㏘A0pnsA8j,jΠBXvBfrXe"+ş/]nߎLE. PSď& +]H.UR +&~/Mp*Qb@ȐC*x1dMXO^ 4O{~I0_r')ÿi-p/~?/k@Dأ)T9y5.D+Y`ZjFm8d, +ۛ`!?a?v.} -A e?:(VK8J"?EǺ]TT%}O^i,A-;Q.0GJBJZ='[&Hމ4Nk[)~￶}|r>2|߳ o 8? +85 g#gL`Lg3ҳɵϠRtcDɀ1!t*=|Yb^*% 7eQֱJ חbvbd@&hK*0&.p"#L/OoyJ=cEDwVÜg`T N[ɭLv(>f@ h+N5zh +N!Z0uF'̃)AY%Ҩ4 HYuzLugGci B=RxU !2 QY>4\tHFY Hr5@S:ux3.={(!mv8sN[e'B$MQ]h:9x,B6,4 @`. .F%|U+:kk"],HQÇS6}e v^N Ľ!AӺ; (Ch"SY.CrOVd52Pf?4!8|A%̘>`V|TX8(Ա mgsX vTy~JJC*'oЕ84,zKø AãC"H5@ GcVDA]""k:~('iHI$}݊?_b)Ssīܛ{4:SC9Zu rSRx V  p*&{xEE6݋)Yd [rnvkAbII 4Ib*6E9!HL8mt"pbL7bФ,Z%n"F/GBTSOSO4/ +t{V֛HR^MIQCJ[Jwf{9/70A\v AyG QbO[qmNyD&4kt= bH+=  8 Nlh +a^Rd[}rn*V0UImy}Fҿ (#tB4@`d0"*ҲMg+ +D@`L!ȼےqMNJ[Jx?DL5*4Gwk0$fFD  +: yd Å zD޽<]c.qd,gv;K$X/")i[8α^{_nf}}a8QXej.aˬFytBVE rZxH8͐cmQ ɋH tMl.ѐD/' +Y²rp4.aN)A&Y3&yp#%Yu#{y~u79mVA~Ԍ.S p@Imt~>L !D~#$/47 v/8IصbChKh6d0^7_ +' &oxh|1?1c1?b1Ç=E?RLIг.*2z4>-*}ɷKj2sm0!(E'lj  U +G-?2Oqt5yBh0Hjh1VIޅСi='܁I] ~C?!FmJ`5@`N,E'z?*v?) oqKAp%Wԃk|‹\˙4=M=(A|-_| QBZ&N +?ߒl;'F_>zw(c*]Dx9m-_#) %bmUA's r]08цb~I3 U4GOt@8B'VC9# 7ْGNֵ7q)Lң%nt:VN2Bڂjd,i?P@&;'FZbdDE$RH4G8C+|@'}g3 + D|I%Kd>THpd"?h2*)h>tpxF:"> \Hzӊ|+ Qw+,ՑbJRB:Ha0*-ʑG%ˆkMGpvޭs^BC%Ԏj՘ v!dZz%IEpuV--w!Ϥ|(YRR` @FVGESVao @beY9Tr1Yp>fkD 'Hsu.ɎH*l 恆y tSHi"DԛuQ+N6Zs*f~9( +!^Q /ӆeD'KFE+ +Z'u11 p:24 \4 +MO+y R@85MU vB"z 5N^0VJ |,KYt +E{ˡp8Y-S SL찏rq)B2@$`/_tm5ˈ;NJ/U vw-H,)Z ^7at/ `I jɞppҧlaB|Ƴ(*eEu3%2(J(dPWΠΠ˃O-V ЩWJ:RlZO6-hucLVS s$ձvB-)nPx% +W By*mɗ{3 xXNQ\6h9 'i7sLd:KuA,5܏H ǂĊYm%ѳ;} /A CFDOf]g^lё{`yC9lӦe308H[|?ۋ5!&R9K6^cِ+ ~5oIp,ACZ3Bi6m6^+΃+8Cfnh +pG!b%䏕U*["{$\#ALBbkui3ұ p樧FWjrSpC+]& ͕ 4-T +E l LF ZQJ#NwQm\w_V<Ү D%XkN=RnE1++Գ/' %RB(DQ{C(}5pm MHsVꙍIS3$!8+eCKF]x1lR]A8o=@ꀫ\)uurRY L , Qbc<+8bu`ҡb*+ 9$:Id4@i:̓o<5(JQ AuŶq Fҭxb0 +\ + A=ۢ!vB1 |ah @{! cc%JD JF9 E +8z*4@ nEiT +A-ж3}19< #pWzCYPH>8ɘNH% KGܙ̐m2(EPI͓bUW d,g$z$QKW u|9;P>4{̩rIENwKD ˻fȳHfpA=iIuyEK%aCb3]ilrrZ\Ë~_!.}B<12pQQJBtV]RlEi* L!1J-h?0wxmxVRU3Q @ϸ42HBՅ(1 e`C$D:AXm6esM/<'‡y|ۜĐ Grԓ5Kzj1P#Tf!)}ʼs( 3b5,[a /R_2)$@NW[Be^(EhȭǼ|i^8 /ҫR(q91@̉Bhp U xE*V{J!TS[=逵Z LI1xZEU@٫yrV%D<ka8EW o^x0,:m;-n/s~-y'ϙD6\Lz1ۉ#8w-hdN?P$Q?'aK~*a3AR*P24elkEy1]؈ TȉA\́g+w};BO\D0(OYPUJ??_كe[k7Щ  0-]U1Y"ŷE{oS9N;_Ј0KN ~^Q I, n:9_5wH `U? 99H2S*!nX'` xQϯQ_GpUp~ >#~OtwsRT̿J/ ΅ +{5F"1`:-Q4ESH[7cKRapk+{rjVsJII5@@&y_//?+ʯtZ>tk-c~0L#$2~q^RpD_9&jxxOq4Xα6L$y[L%@Y+2r"){O.9LЌZQiIWE\㽤{CiT(@}8%#g5@&iY8[0pE/$ +Wċ*؎"C!$K9۠22,)'kh/\Ճ'h%8Tp{kFgrTۑX,ඃMAL*`F`sUׯ01]#1/2dv5'IJ6 t\T%͐G050<+h;h:YGh"EAQKdR]JƒpYB:2$ĦdE4["6,j]0 dt7`5@`Z@Ge*tϻL$bʪ\++)k)cD4WJ9BZ8J09 qs-` ^4h`m 4AOs&J:Z!lXj\#+`0Dt7Gd U*.B4T(᳂I{)   loY.ȔS]œ{3aʦhhVn4 t_<=9WXC={BV0pq~JHDZ" O`3o)ZRλ9v^FA6#&-C~Ĕ; ŕCO뜨F윤 +C5@(r4eA**p)} +AZ@sȚxJbX `٪ʊqrX!A #9p#;X+,h;:e>^+ra6\\̔O_:WIR5 Y' +jm/3,"۶ ,zup"-Z-cWK)DiK4@-zgCⵣ>(zϏFҺU=ê+aUaHiBE9ٓ+@3v{c~SXyv.d` ,SS *E d $tB +|'1pF(tB~* +md2YqZiQ֨iu/ɺd'{vy&@w%<.hދݼE^DϥOgќʡ535έfҊd"|xЈWDC14)eکHi0p)7ŲNKc,Pe]ɠk{Xݻ*Q> n <8CJLɠGc"'dK_:2d&5A ?۷RH:Em9[)` 8 v988Zó< Pˌ .ؔ sc 'X\%vu*]K6%L( D%0!N#,&M?~SPfkw /S#@ +q(Є ׈8xQe VPJA- +8m! g%|+9$hJ21!lG!Ԛ.֦!0QٲX .I}: +!@$NʅI RL S[|egh{9~ywɆ %DQ +O Y}vM!x" '2ЍrptL ADF +p7bnڑY$`T +%.-)c\iTX-!MǨ )$p$ KgBdyS`0`N6H 919nE6 +Jf:eTG O +MzpIupr7^mʄ `UPcsQą@$F&7Na9&AFCNӸmq۟tL+P"Aa| ӣGP^\}ђh3 \"Í Y啬9;<ܡ>Իllu/C,k0 p`ܘI(Z9"/"tb_Хо}af͋afXa2Y9 +y c0J% M(2ydxDЯ'/S&ɋ8xBk\ 3/>5;x"C'=}bCm@ӉlBI[yxvj -`^(eU |3pb9IywFB|P$'y!}>H&uBAΊe J1_(eqdV)h@J4!Q6:/tt<$F)0 Lvg"/{1-Z#c"4^9ezk|)ć)[C2rRXuk}rg273eӸ +wה,Kx$liFlպWR˃x>ͩ">AAM̔# Ԉxz)'v"!SĄP&P[?Ht~t E0'd#H}BJ2ikze{zʤPE6Jfޘ[S۹ x8_7k:4v8Ҩ}PNVR$P|Ttd`XWDƁ8#48X.[Y 8;XVYeY,Hnׄx~!3g=2=p"Z$(F¿o֑g )Tcm'ztw/2AkPO`q3_ +*ditH$a +O7R헼>KC#2%M\Pe#F#>3l\"pQH^a=F +OC +'Y5v4c]S \?F<(_HTSBkD~uA6tFҁ1xN~.ĎSnvUb[7dF, i E|ְW \*?u5}|420sv@ ~hAC|iFFFyi@y 4ʾRK/E6Q'hH]zίoYo:>Q%~Џ7g2 GuG:$P]˝]?95 +AC-)͔VMq}¢4 Ё|{31 +wlY6? _dͯdz$1RYS]@pJ@DgH Jsť +kM|A@,r"@jɸ)#;J!,ȟW&{N"bNE~t"Xd˼RGI9{(*<&k؃,ܳi2|+}o6Р%Vf4{zWvK!sfru3gFdHq5 51i7dYZE#TEz R\&d|> v4Ci]X}IZh1VLm5%6)FXXSAVKbI7'^mWI9 KqTR./4H/ѕD )c_GR0lp m@ 32rLT~&ЩeY<{D Gm̖}L* ~7?ywg y'`3z9;jy@Ph'zUg|&L _Wr})}~.߻ N>$XcҺ( FFF猳,̔F*ʽxIxՄ%۠X"[)^U0~9erKe֍Q1NpJX vCՇ8xji G^xv:536J.mRY RaI/ɕFBBJXPc Cq+ k:6-ˡ{!YSFbytKMf [!4 M( L:v, h ~٬|!ŠK!clSo$&A8Z +NrG ! ӡ>6 )(9xDvuf}hKPR:!Uw, PbIvEkN~r69yx}dByVOlńZ*ҍdDv钋0ab9{4&,"+D(bS|]ZHh zbէrD&EF%I&}T[ҴdnK(NEBVoYjig"A>:?UD5F`U,&`/%&]X4@M5IMgL_k)RbcƎ2ST ַ!A v4@ #&S@D8@m}L "%2j|x\49+GX +fXEy *Z[cyzIDEX*D@,W["{x[MMA6;Ixt5_j)]QxLj?RpCI ʲO|B]r[g&xwȸ+ +~-OsOWCE `5jqл׳E(,Cl 3&_فGEqF3ip#xWٿSC WcqZY v^EsQP 黥ޛaL? CV@)F^w!vI͂$- &wzI[_+8Fc~ߦ(ӯ/J;8z)h bL嵥3X E*e:w3eN0(L j#9(_l4__;yGIAgE8$k$CDfǶ }Ht!y`Zܵ&`dK'an( 2=Ui`A:/&sD%R-Kv~M; Ϗ?;H,82?qO'Oc~^1>KUh}rmjɒdN! knX6:yAJ N`DB,QR~^(嬔6/;ߦMS[(`t ^4@x,9r J^3/ہ̄u\Jn\LRA0^L/KZ?م4@. öv_26eL"ΊiBD`ʢES-weƻiކ$ eS )H^*Rw!+;u1L}ܨ||QKѲ͋kB`Ѿ̟|@XJ2m2;X'>L6:]p7;l%lm p+Oqt P%Q:a`zxXx3D6~\&CC O </:6eIxY,i~0\d+Z6 Ee"rA< +!({{i$.=A=%7r%50e ;ir%5@3o}݋%U_VW-c3KHԎ\<,, AUL* +k΄^C +/ҡt(o:l3u 5@ Wj^b7ޑϐ(ziܷdpZҩa4O0dnO/H DS0hab0"얚WuȫlFߚT1ZꙒ[e%֨M>g>pPC z0,HKh_=0 +ZjL=_uZQeoIҊmWnD +|/mcL30j `umO%C8d|@$2fQcWfp>ҡvm"RISx+U eXa5@`4Q'"hB\jAt5>2셝 V;g[E GP-12C' P,:I2Ȃr%F.x|Ur7%{\C~UBQ)uˮDAʒnnh{1%SPTLxy!ن 5@` Y|YCtY@.xΑ33N(V,P՚㓬x딬_iZKhjeGX1[US)aWz^:`RLk +1,rU]}&ٚDv؉2E|&`%+ʰh%'K̺`,g/&?u3xy2xM V3JEA烬ӕIQ"<,pSx=,FDZK>)+cx|aPtc8%3b^a38p `4צQ)s.LiSœ YNtc`n#l$(/QpFmo*>$7˅r*IA6HV}Q k0qHW + c+j]RAW(zϏ&XTӠNNWL;4Q /1l@p|X2A. pR` ̖=aP֎o+Â:p FBBz +‚ +SfቼA>0 z`n5FeSJu,!e5 "d!V["M|jK#QRHD +{8||tuy\pK14@@pw?r fjP< Dѱ| K;|6g1Iʖ "HHO-^4h a0\(_冢57Ei9 5գ[,a8A_DP*!0ψya<ܬU_ eq1`"F~Cr H^/2-HD oAcyıp,k9y6}A\Ќ@0"( I\5ܬ=l]D+G3_GfJr=" BNyP1*J|Hz3?(9i' +S9 `8zAJxddS\ڜT]]؎VyRE< k| +\،/( +lye@*J-]X4@@nCc7D=> +"#k!t,N.}r"X(b!:/ ^ɴLsr^N)I=#إ + T*$"lUsDb_\t)П̿+E͇=L:b;^u 4^B۰بl[`DKaeM<Ep+rVCBV^\Q̵*U2+׆zE#5M=NP"R7Peo[\j!*t䖩PZFne be"{ŤnhɴgN~2qJո3ܿiJoR5av쑅%IS*g +tcz8keDj3d#ɨ2D?">x ࿅r1 =@ +EV -d( )5*3ᣧ 􉢺(KdlK}TWy~~jUΩDGJ7~NRQ*fZ5OW3\_F{;o2ַ&p_d ?EL˦v)5o /Yi頨`(PRXraE Pw!Q-}?i}rjW|2n+ɿ 4#$Aq5m=&"M(K;=o2yvw|ZdO} À~!{x8O>> Tgr?@CyŤlCV~h`HXGC߲[};WqS?X'~enݏtO!t_ tqp߃Xp?][~}D'd3d|hOji}&Btc i\6NP>~S~}#H 澁sU/~Krd1?Rt+`4@ /\"nZEXl vpUo?K +"uoy_S +G,b`~~>g/itb"`#Iס$&rD*ru&j]XvL;/&L@ [}hpm7ڟ)g>o7?5@`%ڷ +(}Jީ$:>"G*{\ /J9 JPe*`%e_C/0@/Ӿfiq洿8D78}Kg_O㊀,,ɩ,"4,7 p4 F> +E_;_ 4"fUwi;>짦D{. +ɾȾ#bȾud?Ujd_t)͟ T<^0Keϣ=8.r{g7Icz^#б˗){:a|ohE> eӉO +0c^naAuiK[ rFĩ&Av=>.qA~/f5uӁBQ(PjoĞU"0}2f`aSN >M]p">dɩu6CÔV zDQlN' {=#m^N_E`yALm.3nD”y1X< B(qJƾGrzT +ipw9RaFsb\8D˨qn+11Hn2 X}4\ncX#P% gpuQ6{?mtN +ZbÛC~!BB%E$jg`f\>`Ɲpd&M + Dȡ)*hM.7n%t.t8ԏK zk J%A<%9XzQ5p0bQ%bzG46Ho}>!|džDն6G1M/[a_00zq%帎"a;@"P1qC8Wr `дV@MIqfd.ᔠRS♀3U\%-r9su.'h)G4ۧˆ bn+BCBC%zRr%1tjڰ7RCGF؛[-$u2G&foG5@ #/V,)D@Pj>Kj#"a+di׽Y؜|vtpRCm.x:mnG2k몌\Z "+WlWg +֊l^%6W@-ՓgJF_rJJep8XfS ֑:Vn!A/D6H2ΚHF/'$,xK޸Z9ļ +i@~BÉM#$xz VN +4'S +͊9ڥ昗Fnbc8'TȣUbwg\HyÚMz"X.'JQ~Tޣdbc ,WL1|>rqWg0zu[A Iϧ=Z14skن;*XO\P/$TCS~ Hƨp +᪉ AtF6$ +0 ;?#:0Mܼn5x(tճDQf-/06*(TvN4|}fB')b?8>D$LBӒO_Uhj#&?e_Ox ~FHkgRw*kY0A}7 +x5@ PW5kc'S,şX+l>M{y?aE Y*j Հ8S:#[%}]}& }1oWZ'KI&@ ~:ߢ"be֥2uXc56;aE K X?+D ڽoI/RΔO3 Fz7{B*T& +֩ BؾYVZ q5 < .=;ٿzff!:yR0+ZSI؟J )L#e"XrlNOJ`?`KsTn^3Vȵ}}پl.0l%IoMۦ3%a@NHe.<+Iy0fy,ÍJs2\S?fp ܾ@+Nׄ a}i1o2Ut3ݾndJD{h heNk4|!JVO=1{>3$90ڤTڻ;a~EX(UOrZ1qmIj߉vM?%OzO $/\-R4C FsL#iuCjs#0ڀKثP=[ AWAQƠ&=S%2X›TjIpJY^]鄽*eqywza^aԩkcI?L7"c2sl(YBi%""tDD(Do Z%0u: ay첟U,;Ua<1tN&i0\4ԂĂSh+{/ l AbxCE +A An|ń)ɜUl\D4ʷ䬆Z!-BB lNؔ7 (r~!VKOPV6L(> 8F+EiE`N_ y V^ ޺PTtyW6]U<1BV/>)p˳-<¾ȔQ)]^LJ75w$Da5P(Ab rdNm"d=VHPD)+\!-DF4@\$Dݒr{r?x=/VFY]\-8ٝ-[X$9Nxg +懄 +Aּ3!8Sqw{s2W d0q{(27讁%+._/HΕoR?l9?f +7,5~h!?q$aYK6/1F[}w1Rt?N(?Cg.w> Ժj0!f%AL +qN3<2)avcA$ؠV*cY>\p $ "ܷU™tsP!('ւV)@٨C4ѡsn$H>ӥXT"fidTmdcF1z"P>O>ןi<}>acm1t3~=~E}e$LTLD sJaRDW(ڇ2b =J (6\GC 7a } X-w~71)  +E$/6(x2ٖHc[ejB桕sȁG +%.e1:Ns]kc"brFgп=|a=ڗ?xj( VK1l"blQ,J?CH|h@dn'dndlȁ} p$ +z/.DaAb yT7}kd5@`hއ7e68 cj{;KZ*v{X3)1*ǡ5Ă٦}h;tB6\#4@`] +uIxIG@& ZtvEJ\a#4bmeb |FIw2,xPͱ?R̥HPOeE PTVbhg7G.CNN7&T 2>C,AiH,,sRڃ'Ǒo3iih{Lm-77W"ׯ| 89O5i}\sz}!mLANaJŬB +CĐʟ#)''YS2( 6EAi9+h鹬y +N? ~pxs6> +6MV4t +y(a6!/h|zAWamyHU"f%jKo#+J# + ɐA "KJX§d7txj)Kn +q6hᡛ6rm:N< XfSm/ء<IxxH?0FtFHZ)+taOMiYZE٢/n2Osx2&ny^ȸ;TXR%Xwq}Kc"4C!$b$!c <#x)Hx:(fL16&wgڢ?1b_1m 5lmD5$ll+ VN$ֱ̰Ehc9ܕUeNPrwf14IZ_Ը&BR; &BigMۄN7SZ5y5FEգ }`ߏ5HJ<*6U5LUR1P]WG6#u!VBsIyhk@A[˩w8|=|I)^ݦ0v:vx>uBAfrCjPU%0bJw2®he]T=+26Bڍ?F'l )DP.ɐkg7K5< +H!ZΛ}|e.BӠ|LZZ . _^B$.oZcaoB1W9]#pDj)B82YLln.Vpy0Z%=ϴư]W^**; JVxsy1ϥIi~?, "Zb|4Tpj p-lJ/ |  z[ =[BJf:C< yK!9 +endstream endobj 20 0 obj <>stream +fP2ōYkZ#Bq|hP Ω3.PX{_پ].n(LZ)ہxx&y%D5YR^G |ҟGCSȔW/xEc]^`oQp@[9.O-5@e?Jw(=g %t( +$DNKKl1pVb~O~=ie6 F@Y<TZG"@%Vԇ/z.v& tz#L7YAVxBrl@Jy( {;MD:Lō.+3)yCSppG_և*7J!6w<*/A&@6P i}krpإ԰0by /$HEɤ)M撞0qrMi* h]^]'.EYxp=/o0_ry c1 O5CH(<"iI7%G9ut9ފ"h.-"yB8VS/2P'J. VBT77;t=rkt7м6@aҵ,I?d͓wcjʽڟ:X}3桢d0Yz<i@ T%.Dt?kfcxXP@,4 /:GDdt*W!h9 U\!dy2Ngbg }U|7{\ 4]Yl %!;=|Ժx~._$,׭w2:?mpp Lsv0*"SL(B.3^BɎ!?9#p%LG'Hd [4.!k Ö@榸L ˆQllR:;ҝIZq J$^\kA_8~)&?ol ))~xbuFr!k!ʱ#-uj5 sJH+h,,Q?Yw~ Z9~N*q?Gp?b_8?E!/ NV8 [4}r"Trf@wpXF@Ozy$\_.JT}Vo_łäa`Fm>N"y%ك|#>T:&)LuBAu_]O})F~ü?kAxSe@TM C j`s5P%qR8 V: /׃ɹxAYrl"|2bsRXh%&}~]6H}va:|OjN+6b.Lvƣ#tހ¹^'} /3/$bHCY_wzq]pOb$M"  5@3XZy&)F)D6ɺUfeiQ.ЍU%Ǫ߻/z2 +yL Pg!"8d"#L Z dr(xD'#.*{@DUC7DJաqۗpV6A9~~!խq<^bk]V "tN2V@Bm$hU"v Ii@``)`&O( *xj_zh&F4d娳) 6F&Ҍv8"!( +wez籂$!cBx(VmpTQ~qE)qPу]ݵ̟EiB*x.{2AwG2{Pz(IuUIcX@@pN?"r =4_ W,xvH HzF;6gJe%x2mnh"Y b0񤕊A_u6FQ='- ADF.S, A͗O12 l? c$0I>DfQL O l3lLJO)ɜ M%@mÂΪ e3;@-@| $RRU2IP;URE]Z"EDJ6HA#IB +r +D)=`jOYUz©| PZPOpGL:ukpkzV.<u'h+#< vku +3)!v<-,Q5@vjO^kBjXtBaN=(5av_v ^"wMQI$ āQoZ>&UV1ʓ׮ӢV횎 F`-ylJt3 a 2' +S)ЀiaM(a5U:EVta,AN` uUdhҬq~_PQNV*=I" BPWz]VHh! ZymDkш  Aa Т^iՠv5@_Rׄ/oH^N0&Dvm +y2UNd\XPqa+M DžIrދH p),_kԙ7AT؋љvA< +6&OUe4U<w|tV\,"U""u#]i-[`]0:Mh^6}[B|%,/c`P "`]@U32@d %̉4(EύY[J3Dwqb3t+&?i+|).l{/Fl}UL;7|=hp}ua>EH` +Cl K-KVC-A!=(X셖C١q1Z"Z7hbŲ:WU[e@JiȄh3D O(2gQV/D/>c|alܜoxRbI촼2;?*4fB"[P?Kx2 +Ҏ=49|0ˋq^Cct#>`H鄨!Ѓ(GeNg e@ V%SG&Ɛ9F730b," .֑jCT:fQ4"AMnQTnIr5_O.^PFWpU7RA,qk\4@/afYBqֱҌX +%6r1D/x)/J}pz$R"'!\@Mk4; 'h@jE L> @@C<[8POt^ +XĘ 'ƃMQI(}),iᡲE͗:M &Js 6]ZEiH[9l`$#/$M;iʨ)u1P$HGՑվ1` +)l^V;cyzIRR%>LzF{^TV7/tOXtV:ѼeR( 9~ypp?Fap y/LEdBHo& tbڪ1p)lX;:O/Y?#{_]+ }=QOa'.Ie%.~3˙B?xF׆'9og*'dP\oJWr. K"Y ɖ Q4&e-Eʝ}~q~88o$6Uݫ=Kқ?Dp$j.g$Ps0E G0C%hڛ +++ q.aߤYMoy3HZ?*քIh)d!1`WF0]%5@?a5nHo5>XX<bY_x$_`8f!2~})3_K:lPȈfo,,X"AK:{"D#T)L :\( %^ AU{R*+ +¯pĜ-->'WO(w3i[XkLQ75-arMd)_g?uRO1hOcv"j %/ +lߪ* +u+1 + Act@1ʤ>NI|?@_ߏ*ߏ}^ӿPo!)w&G4&ߗTde D\ j9;YuV%lMGdS'4@~]i%HjՔ5!$VP5ixWOx?w,2w={'+} +Em~xU?pToVMP<2Fr-Je)橼}*э|^LC h yY&&vSkj@Z %} u~1u⻿V7*d?I 4@/2HD~[qalS2ݴSXm"*&ǩD=،KD+-A mʙơ r&Țä:@9525AV1i1`rc#ta M2keaۦ(`cccC۔ik,OeH@FE%x,bix/ԈB:V!M"U+9bV"آJ sQX8+aDCU!:8ЦB,8«twqu<"xRϠWz!RV `' بJ`*4)AU68'UFpV”&4 3 Z4TqsF$Z ݉Lj ds<%ؿ` Lv3<_7 Q>VJ5RDM} ĪNImX3t'V=A&_>h@ H;(qJ. ɕ{P(ܔKk(;3Ef / q-pAQCFY1b+_$K:*ѣ(;2؅Խ{e)Vj F@k8#\71-:ҶoZpLD,`0e)aH HQ051N7\%>R2D4@9b E x6J B? +S =3vT4,hO?pqɸa (aWQK*q)Np@L8 R`1PJiNr#ќAqQ$e3>zeeA\7=*+N sXnLtCba'a W!DB];ƳϘFN/ȾыI-G}f&et蘎I;>@4 KI1DUYQbZeNhmJW܄:ig hUGO{5ja AIIj$dd#2;PqGXLNə3zAGT?`dxpNm.4t]$ΕL؍u"l;;vӎˊ :[.0uG/%p +sÒr&a)ֻP9Oix)/ž^w@E}ˇM]rE6>9DQf [sBi|縳e0Ci.(G97Ե')95@ ^S ;2'i@bh% `oeeSR/PQ!礊^ڹvx iň>NtT:FM-lV ΢~<2LW=Fh-$D\ ++;ZCWHk*C D42k2GktwqU P lKZC,٬Xr["Dݹy/pq)>^&̛(1\`.x.X1[Y#Hd?;(h f +q{}3r›2*>*>uz##ztڕr\Rи۩OΘwz|XL 2fP4m|ad8!8?\@ӜadtA{B3o +]4!)_KWO>#nrH39qֵ+~])|t~] fk/YCS@*M.ܘC^9O2DDеMC\%\X +f#0^lpf(5F; cKRѵ"dƙB"cҩ2,@}!1>Ki'\D8;MLJ' N2plQk_lKF 9ǧ:h܊CHy @Ƨ_!M6."yJ +iiUPyuJꎧ(.4fb[e[X>4@`UYBT ApJgNdEY!x+8Ͷ _Jb4@V^6a>n -BS/HtP<4DE⣰#&z:qF\o,zC:zrZꁺAd +yQZIސ%JQxB\BEފFQmoo0JB0L7B ot<@Dx x D!噓OJyPG?%͌ʉb$2qr} V㢧NHcn H⑷ݒQrCsr #'/HO4@{?x}y!kCb*(;x9Ay]H#z@w235_aW()8FeItZAδ짹xmBGtLP#"!4b1P'fP2+bfT4HòM57 :^4b;н|<ij!i!A(]rD Bb8\N Z{[XũfdZ CnG􊼐\k"?q0iXNP oXBR-*u + W+'| w2U^Oz2|jԉ3 *F4+XޥE?U!{UQUzV2b+!d ,zzz${=;Z +{/˜׃80 zzr0VzQ )i_pt#TE+IY=j=d $zzr>k^+{g>HC__?5 Em#zH֦0n"v9+q9]uFMAGG>@M +*GmC]ejvvSuxBPrt^lz6-zsΫF~S];h +tѬ!H{Jsum-r5p+\*d_aRiM"pWb2vHSsj <}B%3P,O(Ѝd&(0[)tړ+zT!7q%1yJsڒB:]`.Cu<.dPyD|hrlv 'x1Bրt@:[pY:EGt@y-'> -is!Xx]ʛxc_5piG8G$(qNEҗ^roтo P(>?ǩG>OlGen ao5^M%ÕHǏEʉCZ$xV򎙔$ +lĩlp(9d +K3FcQA3RM(=o`EyoɣH<JOz vNFp!"{V^5ja WHaCb> !Dt}iCؐ9$Mo_m B=ؖQ LsƝG[2!x  سDpV3#C+!$WA2fex+hAϰ ֈl2KjEt@@VÛ\HRh7雖gQ-`9h䫘x}׈>A`C2~"r)/)Wqѥ v=_mMl0,K\VÑôD"z`l57(y^IF S]+ .{2 ךj'4UM[μʿ#XCC0 ^}_ + J}Nc9 +ۂk~{K':dY k%k{Fԭ +;#!{6>t؟` +OoUE)E/^c+8/e#ay`C r)gR"m=E8Ѕ(RA\:@J7+ٯG10 =ن 7*/4Y5pU䳹OjRS HLbݕtKʀ{&!2:`> 2*,%P@fkU f&{ ɇ С>!~p|wСK- >+h@d[rx~e@]٠hZBL`J&Å~!Zw`__فekoZ!E +CiqAlB=^$(.&$i@NPf5&I҄({+B0] /  +BEuyª+Z VUX§p$})E!$.2D 1t<_q4@`èRd8r[r$gw,ʋm7Z %QHD>:Z* R[u\\LǬӰBڜ)Dz2R +TDe9Xl_# +Mt^($W*T :U҄!ЄCp{$_rc8dL$8Rb7 j XKTKSU'H[U c3*Ǟz 8:~-Jr"UfMDG(: ٴy cc Ҭ{;*WѠ ~0rƾ8y}]z<_lhTo513N,y("s$9k©QT;+tXUOؘZ +<SFANJ$s2jԽ0[!AJ!K?u[/xTYKUK~Jx0GA &I1F-31 +c:\|)GBfU Ri#U=%V\<`m'xaO?Fa/Q򰏬?1DkmABR ,q٘ p6|UYFJ%F9%gl.w_דP # Ⱥax؋2_;Y#C   ֊iX) p`iA5kFHn(ZEW! +z>##m{8t='*tޑ@S^^^8j.\&}}5`05UdHzYPi:4)oEkΛMR_bz]*fH$!UٷB +$*m@RueB3zIp\k땈V +9P䵘ihuLX7,a9|eYu>xR)ˆuhG-e0" ^'4giihs_X+] 8}ywzT~cȧ>y" + ^t6 ;dQvX:q|WS*c| .ʂH!ÌXw\YŅOeyQ2?J8A\Zf+vbxxBh +e O~\:4@k/x +ܛ2lJV)eJPdN6fL" Ґ + b=ظ?QdzaXu+'e]^l-B؛![*YJU tE6d +5X^᐀C'osJ'\UHzQ42-Gd <{U=v;^(# )o8$צ[+UwĢcNTGF"y؂)dۭ6Nyn/{4|)F +4n=F\J =ȑyᛳF^Pep>*O"YQr=H/)SPJ~ +LJa:.)1 })r ˄DϬkLYVy>y% 8tނY=/(̇PUz} &^}T4@ `m2v!PRݓk/ VF=5{!a֖@/\F2* =q->DBGZ /P˅&I5$zX&!ɨ dA߮j*J2[I%B߂p$k"n *ݪx4 ^h!qjlGC0=A|'_1,CAv: )2)SLkF7j3IDddw΋wl 0Fa,v℠4Z eP+ +^_d?-Aܝz@h"$ +Sf&;=0 3)x8J HqDWy{Gg'+){eb5LXI)kPwfϺZc?`sưwN OF#&ab#caBVb-ǻQϺw$-J =e݌}bH pЀXqHZrPzFXM{ɔjZ +QlZzeCŲRGG٧D cc/ZR)G soM!,/%FMMRjJA @$n!Գ^;չ{;/MG}s;0J i(1E#ɡwvT2asڰ|gkTolpSeGP'HS7.'zQx,ĉvL{LJr,zaGT,䊘F|ʕQ$DNk!!ؿ{&yG 4tLnL#Ӎ9TDD ccTS >8n§v)$#ؠL%"Ӥ^be} ˴ńKC2o! +&ƩPs9@')ةPd>M&| 48%WpHVB(J*U> XFZ7Hɞ`{fþ0!02aJ$ݺ~29Q1صXn1OPb#a`1hG5pt8ͯJ&ef^~g^!{ ͍Gw س2tGL]r@_Lbh4@$BNVy}|(_? 夆Abmj,!E`5lT,ړx O+hƾAb^aT +ے/HJ|"*hJeO@ b܇ѼR7A5bD +u +SCc=|yb. z< ƅCP,#FG{YD`>YQhvm)7ͲJcvjBZR-gBNHqþ +.]EH h8 ZHdT>NU}G\z #9S@38uŃ*l[y U2 d蟟H`,FSxTǣP)(O \bA:[.w,RV),;̚hA&k,у@$&n;aakD)ItQx0PUC @F U$gDU"o3Kb ͱ"Wy4{s68fF Huɨ7om`ϱϡ-Ꮂ_OE |M+kk"=ѓ-flmlYH L< +(׫2kMr=¶," 99Nr0ExGVePxtrR.YTBEiC[ +{ `$ F"a0 W@pG `-'tAӪ~X6=FȐ@{ެ5@y@GTȔ4,2A}ȃF+9+\3R8PHU@Ur񘤕Yf?׸ 2Ӡh!4 7  au À3W8DZ艴Wᔦ RHеr>Ҳ4{m/3a#[HM+XB6 㢞Jҗ +y39h(ء\RA * 8oxN ,cs {s!-y 9kUF#p|9ln7]Q5WZ0JkKB1=ţ^P_Fz +[6OҘtS*tx7]XFO(ņ$4T bSֲNL=-{NޭHe"Eu*fj@NJo]?J#`(fV܄>6Qy@"|9COdr'ʎ%i$dEy e-$Eؗ(X{0K"ehFdL܌9C^'8EC +TMvJJe8%^XEUNjO9KI{! {S%Þ1CQ1=B·R=R}0#L=(Gk~b$645~FJ;ɇiKbIIˏ=+q.~nla_[c{ ؔ$K8bbPٰ + +M=rKIr Pi)Ar^K-bO:b/44J[p]U`23P+Mb7vyH:w=q5* ue2t 7Jm'~u>_IcQT{{ d WXla-njEkH(\Oa( Yْb +ԨdU̶sgVEH{xChezE ETyLh'";0aJé4@t0 ~%f^"d9 FBB_ lF|LB.բؐ <.E%dQ ?*'%~@pa^ۂ`G?K٣2CNf$zE{E$‘Lr-he̙ +8jOT)+ f,N`g(SO GA5@@ !I,4Ġx}T^a/ffXDqC^ENʳV5@14 49~b/d#dcFXC./HNybQ]ЂQM?B6x8 !Aleַ]e_/u4wP R;(u%L!եaYπg@NeOVTd_Ҵƾ%AtB\TFt\BRTMW\i@92FBd_ƞxz,M#@ @4CiLu.˼O7m/Gٓ ٓ"o  @)܂SyKjk,-UDu6}Cf=߹qqZ" @PܔwYe٢\bAAc,oI jEKʅ(i2ǘ+ȾLk9C`JQ%7 +rQQ?Hُ8O|aه1Mg)d ɫ'frB ԪF6FɄRORПC qZl旊0jg +>I+$هs{ rLH%hgMe +7]fqRDq?q3}*+-DF$rlVL iDicsmClܡ8y-[1"r=)j4b" 0(y +3H;qB$tEo:GA^ 9[3}r@ BlBc҇d+4q&5_hN Ѭ'ž UL +h\5]r7k0Pa7:'DVtyk3ݞ jpb#h.B `BKI)gU֥pZ\`'ݣ9&Lr~!fQ IUXUKEdBM9W)$ +9F‹*=ur(_H È:Zt6^`|b +ʲR{O(LGy鱪嘀^~M05@. ^H\bu +c|HH~ [;Q5l%Meٷk"o6j j6Vh g!6TeeQֱ&v*r hHxN =Xe_CGMZ}k^ΆѦ СT=/m8f`u:[ldnHcYujeo#a ZԺzWb'UtSnWطǩ6oͮ:%C*Cn 4{ I$ONKkιx>O2*&fed`4@YoDf݄e"˾ .8+T.%Ph$.Z}Q/+߀LʈT0!fͫ +ghg7HJKx::DTyI 0b1i\䂮ډ&C*vBUHye[ҩ]j30k2<[~'lހ8}>+ͤTQZO -(:UiiL#ZL.̫b[eT"K{D.JF]ىic9:UH:,EJ_&*&bYNP@i2pȩl=YHM1 ΐe4WIc4qQ} *$ 9n5+9zT-J 2vɄ]es.lNZtl\Ru!m΃g TdXpAcQHu".C^iyZ2^e*do%S/j?2d4VY h<9}F}x8o f@C>Q UI?Cjq[Bz}G}ɐ}K{! +_.!BŜd3r#è|mO3 ]YA?漠6AD'<){ X}2Ou}rdI6)Ũ#U2v|٭D"cc  ^ Ds`H@YؽBР2Y +Z[5@ l^V5K1 ++O*U RzPB? (iB]qɽAڛG N*L[)ً~lLB,%A OhCl3i1 +E0b2gz^-E\Q-3Q J 8V ,W;1`\"7F&ÿg19'86a=)pxvhթ4b+׭5@IK͝)e԰ ƁUA +Qh59XzVl gk .I f mQTCGL'V)'CD쐡PBQSnNr fDH*Yq jί*D +ՠQ0S+({{:4{ X?=xui*e*6" TO@c77U)S%T%BK\e (pF Ë}e-ap1Y`+KIq]4B:O +fo~/ w ]fyܾ#ƭx|FJR5@`"!G0!t22-MPZsMZ16f_GُFe2 @9]6wr Ey?n7Bz5&p'xIY,&5@Z}:3>k@&1I~0(4|n`4|QezJPbtzExqBb9ڌ(!r~ ^*h 8*h\Y2ITi0a8\G $jQŲgf/jEH3e1 @jo!xv ;98|P^̒D%:6b~ĉC;N. lVXD4@Su zrެwJ@$'!y"pf٫ك Kdu|lb%8S}g'dD҈探3jvP$BR] +r%UD2{0{=ȐыU*kAa|g)a*ET^)||H ,Ah 3T$Tg|^1?,H<=I=#,D-Nzh8 p`xR^G`-puiKgQ_ hhhH7gQMB#=#έ̆3 36qw2p[hN&J%JԤojG%O)e X36 +w5@I(8 7h!"؝QHצC]4fn_v+X%md :WǴ &.C-GKd!H:#&tA39 :(( 2AmVNq^0<2/J +EDW6q`eiuh2!Pqzl{Pe.Jʉ^X 8/ +]7HL^XIL>(HV){ X:X!%X\ +(ۨ&720u@yyHҧ@ +m堉3Nb"tBl`@@IB^zO`)vIEeӡUɻ偰|:2PI8J1aBQQx'].];eϨ׼o!#LJMZ,84@)L,0 \Ө0ytFG0:lJZ'i+H6<<@ R+CJf+ kXèO&0; 4dŔpTwWA𷷇T5iS!P(τw9Dٳ/l UY'5Vz[a4@BCJb'<*#HӔQ])ƳǼ +f~YN#{      TT"ȠK}1Cb!bh`,_[w{/+[֠W#-1ikhhhhh`.@SjhhhhOco~$eM\QX-v/[O?0!Qy]?*1Rat񍒻C+ԭ!Dd\O9%{oG >SQIkYs6YSY'Br{Rm+3IL8awD9xS}o~+;M1m8յ"*Eࢉ#_]\%KBrg1LԄ`6O?ƶ) +IMTz \ ?lV#K ?? +/,YL938j&dm2I2D#L}y_#b';)c2Xk:+rKidYƲ>4 aNtnD*YV9t߲л*6ժ~!zḾW$} }Rk,نp?Caܾd- vYѶwxt&-/ +(GWZ^% ,'f>w%$9FA+̈́vܯL۟\`2}F f8%x\5C-|%ˀL +=L#9`:ؾ n(lȷ3ۯ0G5@d?+UIgӲ} ؾۏ*7Č)Ψ+8ڷ"Yih[n2qs a0: jiUQc -^J}% obG'Ɂ}~*+V/+{V*k>*[KPZG+:#*: XpgK9$S!-r18 !A^7y6d=8yآYrSh%[(ٟM](㨲?K)O>i|8{~ݴ|MFI.Yݥ i"7E[C4lw󰥀pMҳB?m,ߪNm7}0AȾ(rgBdN'/!ѐeg2O8(`xAXaw?O-b% 7X[C}xz "5@%9 **ZGe >(faXa?~ /*P)9e + + 7Eex' 4@ 1BWXyd=5E)"ix6aBzㄷDŽ(yO˂v. c!E2~O0}OW>ƱrK=}>Goח(aZy`1|WXxd~;5W3EˊMap\/ 8 Xnsڛxwq5mٷ07 +V]n|+P*߈RW^y\iqImc~f,UdZ!SySSh6Ul +%rV-V({sPS8ӧ :,h|d-Cr==R,_9 +(7]RڜU  +dh@ y 7"*|#*?]ͧ$ G܈$o2WX (ӡp:LZYI63/9YDv2j\NM(ĊKedF&ɅD$RH4%H4bO$AE' "7`W"8 +d mmmbΎK33FyQJģGIl a;܈|tj +Xvs/(f7q<ŅF0n\T%:9+ +CG ,|@3@11LI_AzoEbX,h-Q=$V5>8 `V-TJ@RG +B.CՏjKהT=VH6R \Zs֮!ao[Wŀ^ FK;ylM\z +Xr汻&m-.pʃaI!wf_3DAh"""iDD "BZ:o1>Y@[Klܕ4(Df<ȍV]$A&"B +Zy|hḇx5:u{]7/;ttCao)b`! }oQ$+G9,YTf.lYd_VBu-R ORh5Gj?ζz_||alWoL*b%͊u|"i`L `c ʪ}|N`h[þf¼,gJlD߈HA"OwK̐+4x Łb`H +Az@PbBDb (`X#Ҥh #"[1VM+7rY+fbV-Ho+H,XvC#wª +F%)eәWψ?HX ̓phh#MK+@d7x@kOv7VUQG:x`YzwT֝ VLf/KmC.aE'0Ǩ(}Kb/ OĀij*k`W콒G`E';|k^ 8"aci\/vKl3hE2{quJ(֕)g!aJR{bElZA1XQTRfs?^$)ރ g]$ i5q!f=(;;{LҸt;@UB`*땨>QFLjyK[zWAsKh6v5 U6'B{]{V}ەf]-j +gL|6Re )4 P۾ªb&~up#C̈ l군KU- :K5VRV7պ}4Ѝ87 +^5o aY/ 0d:9AJ\EYLcg%`av/A`|ARBWI_EBB {O* ;lP-ƪ@)̺Dr*E P+d13IuY:ː#\s|4 Q}ۯ `8Tv߬1Q|KҷJoTFJ{۠;I/wG\d6iVsE +%(V^ĕM4`P:c&\(.UI[=]F,zSۮHBVpety~v]hLV gauDWǻV֢@X leGwX;DPsnoVlfߗD2T/7nB⢛(;xN +@ 3Qd-q0(EB^f̺vmkK5q2gݵ? +VkE^" f"\QjQ?2*FP}Z 0fC B .P\*N5Jt+υ#a8_F)>9+*$u^וG3Qc)j8@0oQ年G╌}ڧK1Vs5b·VfnjIq m XYƄ; y0ƪs5KVWѿ.] R^uأ`U{hARM5M%L!(-ZBa [$ wFk)$0קq<Ѥ1@`0n#FpgJjf*T]%"\11,aTj㤒JI8B +Nj13i 2`T!"Mi)d0Ȫ {+V.@:.a =(:[QpU,^s +0BfZտ>ERRgb%#PSkEvjaPIaW;V@.o @oD̢V(E&RoTߦOٷ¾mXy-}dms +TV.PmS}(}ltQMmV[Tָ^Qw6BhTޘ^mݛ=_mVSylu< G?FٌmL<+@q|݅oc +6ۖ `vɼYz*6sN5%9/ds؊:!r5f[2f0 E mC[?G(1ľoمw +ͅ`_ЀLuMр)dk 1'SD,mt&: Acc/C/^@`2'sTn!fr+:\0QyB8B]O\m ODuڟB٫T S~=Vlō +.bpyt'!ƹy$AehtgM4s|%\1)9(F@TZV!AcSšݙK|5wYmǏ8t&F9Y *yv1\:nrY&W1rjˡ-:kɓk$DsujoB_OWc۴0) *U1*mXdǎ]f0)xw<C<S"Seŕy/%5-\bBIœ{N+( +rY1\rsz,"'!ݜ5L;Afhϛه-b4uaD9?8(;cԋҷrca&SMaVO׀g^4Y(0}m5PƂ +(\7TD%򢱁N` 9R$m+;t P$k 55S!O>N+1WgЫwӧ#E&*к4iv?pCVT{pMLm|V߃J7}1P3{mmoKY%J{{mGڞ6{N1=5!X;&-R4V]fpu[@s0}|/~:&YjDL6W%c&䬅ԱUE jĹte`` se}5!Y?颅Q3V9)ELHbg;~ ,0bq3Ncg$UbmU^e_r$d߶g' 'ZU6gq-{/y_T]{$Xi@)QD&qHo9([+<_^i߁^l Xe$ۄB nNH!l' Вll^46%+%"WqYKw-UH4qћҬ1]@HPc !(<'IÀX樳㩚a Fn67dW2Pz=d|$" l)`آjrmҢ.`mzp ^y\Wc _CC~ߊ`XqhįFlBJ )P l_לE$-`q$YcM3a:=A1qisLn#gC@b=F=Щƽ4Y4 B5᪥m}4W%]hޗ LE^ m$ȱn $v6XKN'[m m-Fg7$ ey)uԱ2dDf,b{~56q#ʖmoG,#_lO}3(>UIWl.z_s﬙r>$ +4Cx"op>Qmh<}҅$ Qk|N \}A#h oaX,8*e8Ѐ`TìNXMCXN-Pc(9fܷ>z[!k>`vV("xO6 PrBsl_ @gBé~}B+LjraDLf']HNAљ^JWh +\w ŗ7 [WV43Hsh؛}[xE1Fc/VžM O U?dqoc;,@aOP9h O%-Ejy/hsƙh@ +p2UnXt.,b͋K1oİ—!3מgLXf8h.ƘeqJUV/Xж!cE*aȌ}E:m +@ YLǓ @V1}Ϡh! p8|ٷ%N/C)$o{FxU&wZ3$xfW"dn6՗nj2|ƵoDTL +K|wrGpn4}W1HJ,8uD W@'L_xXt6Z" ) F*ɜX);6XO軝E>[^`ࢭ5`Q,Iߎ ORbiX>*UܚZ%s Jmހe@5 g%y٫/pz'GAaX,6VC>|8.g&PJASgr3ͩNT'VO'w|*r_ 77 RHDD= >wL$f2O)+u.!B+Y:F4 RHRϦ=OVE9 =9jn 6 Nd~_c`SIq5lAݖȄ!LBnJcY!.;6Ue#N @ؤ2'oS9 wJ +2HRij5& t_86)тz}IrI?O +\RL*a1y$*),ggE\ Yw FP,[iirzG$}XŶ? O5g{X>Dl_ +?xU^)_Ob(﹤g2@u>{/oLuɜ} 01uc ukJ-dz>did_6Q1웭EC$Z-~_d³`1ه >jw}{}o4 jeh۔1誕> {OQ)B5@4"d dB d߱ٲ[ -c>cI1ʉf:o H'@|*|(߂JH4œ__z?gP:j'/^k@q%B|K|# > Kg/ gCO.$>oCZS3gP{o&:Ltz♫߹@xʠa@9H^{sy*)NUrwzK+1FUb<uaY!GI6PVb8Y7p~NPtdH~lSn43N&nB[H.ݭ)ṼE7cQ ;K +- Im`E +ma Y\#ϫdJLUQQÿ́R/m; ԙEUL6 5wS3۾qCqFq= PA4ʶг|'&TO>iL!JX2SڄW: +TJ5UhņNb+vL"frLb2 ynmIeyLm{T"s Anu)ч5ZAVmj5@d᳀XPq#O:PՃJq^r:+"1ZkYkˣ< +L,`op)k0++SPO(SAXq)6<3,lu8xlx`᳄JvY}h BK 9E죾|GlܠasYAA$T5VtNÈS֖X (e +n ٹ[9qR;4`=mp(EOjdFkr+Y)[,a`>Zv4NY9ίrQM@#D&;'Tȁ۾ÈUZOœ;"HԻݚqTk9lY81-M; 4!utSq}N;hN?K/*Z @^z_sgM Hk@@ O?0Os2ͼC#0&x~skGX&3$m㌳u6U Ѕq1:EzӶHIh%џ}0=!DUSGh"3μI%uU+٦W_OP͎hQ.<[D<q&ߐXQL=a\.q 8=?YȄZȜ"5ɲ#"{} ݱ!": zό1qAeIL*QꀥyD;)jtS`| hAWq\ +,;;h=|4aQ߯ga}ghuGM?65@"XϜA96B<)g/]/R3J"oxZҡF JIؘ"ύ=ʤT1PdߨX0&FL3U7$A}x.&! RS:4@`NGY9A̙+D8zн`CE'sTycI-C*BYD"!Q5FH*-0~$~ +b2]3Rx9V`n+gH"i  +Q' KLMqcYiEc. @,zVTBBE2/~ʀ.xH g"nrǍg%qdb GJ,*zzh_QJa"@ZIrPE!_*jZ~ {~2&l_œIɠYMTyMq5h6ICrTw(!Q0^TMLM^0X!͜B:3%1ik8%Xu.Fk꾜c߲@E-*+:h3tzwґ-._0ټZ0-Kɤ2;'#?ϣb惋F47 +'.Ʈr2-.؆φ"EP$saiWUc *1g$ոPJcP<=tHuV& )eBU =NmJt2JWa` =&~?ؽ_ݯS/UixŰޱGwaAhCjPJܩMs蜻Q \7CG)I"TϔqMSnm˹KV+l4*3;Ή{` U IV'3WOЈZr %ZH>D%=xl' $T_)`,gWb%NB)K[>bnu6 @Ow{)QjF`'#" nSvlJ^k\(yTR*S'*qʹ)R3bmOҜJdrkfv3m+I++|."&osL!'O՜"6墼$* !Re +ru3b?*U^ܺ^6\V>PlcZiF6bӉ0JKJcV*LHR VCVd_6d2 EKEtͪXjMeZC+Mh_JEǸ;.-}U>6jm4o7؉w$kw|5$~x5P_CI\/0 |444(_,?lg!H:UBY5 iü>~kc +.'hN|pZ[zZM{c&ۃ{Ճ(P Z ~uc胯2;Yi ԴPw}>hBiP5X{hw5PqU}8< `?%oIs_?~QIϭS>Nϙ࿩:F2+uCDMJO'әu,K\W]OEuQVF)X9hyA4X B!_1$U:tɽGa*MP$0y4eZ`Js  ࡶ4:YRgҎX֌L,EnϷqHD]h}X\sqXXz@b20[D.h +\ +t)8u)wU~*5bjZX4"JuƴRPTAb欼а'LϺ e !LH:9fL!a؃T# J"d;=q_*Uf/jU&P~25@Xԧ}' ViI^̚ۂUBzpѱedѸ&ص%C3 +~B&D<^,c!!B1emf@iK@ .":5S7^[s%`UTM,"e#a{> ȬϠ-LY@T́L*tODHR )~7#:J+TQw҄藍GrUSY7O:*ʝE _N"9.FnG Z1H5 +& #_ 8K(e9JA>.&yiҊi+; 7,uu-UH=/UŲДpe8qDtFĂ^ +O%b^&;9J[#<$D.,2&Ʃ!a+R$@a*-Pjp()gὔ7XWS'xr;&Z|#eahL^ +MΈD_ +gG`Tmt +1dhr`?"E8+F} Xqm _8E;b<&y=μ,oKD8Xgp@ +L_i@~@}n7 * *g;+HQh0AvcIˤJpB@_R6H ԡ=;|"NLB!+^WB9][|$wf %z+KZPY[$3/+FU6DHGxιwR]Ƅqz0 (4L fS&x6C$ +RBP񚻟?u.T쓈IB +szs;*.+lMz^uDl #/lZP4şL ~H䙼^fSSFWC"%pG!bLYyt'qS'p7 +AzE R4URqބПrDMIquV, h"E[62va3 rI!X;%A0ZҀ?ю0izK C~Bp5$?$ iz @֕@x  <:%ɴ$GEBԖ-25蔴*Yh*ۈE'cnp #23gM[!lm\|vT0f Z4@Ji+g4p""Q%ca*6`$࿤jr(А@C4@@Kt 2CnÁġE1!_%yɰ2R<70(zkd0B'2sqW &w0z{A]kyqUHT NDA7Z&aZtoـab|݋ 0BNN8~}j%\5@VlaGr .P:rXILTaBQΫM k k6!υ" yViFKr5zF ~Ѧ~Q=@MĀz]2'a6EEWX|L[H2҈w \`g8&AL<#Q<D[!k,O&}# e1Hx!O͜1ʈ+q TtB3$m):(%< }^H+ieIZwh * |=(Z{x|w܏n E.*M\6i-8fsIw~a{<T"fHtP"E8$H Ba) 8^UGtil};=#o\8y):tpll2l>ۧ-ze&l$h2]̈́c-Kq?@pd*6P׮K|DhFxףCVO~hn] /Kxl$n_ 2r()XR~/Jj5Fڇ3k%>? (Z/~/A;>߳4 ?NEkliO:oi}xY?$gz'1oڇ-ͻjЦwOhi#;r /ConվW! LRHXmym~%#EdM3yjkjS+Aj?ڧhڧUH~Iuۯ(;Wd2> 6q,{#%2m4W&{g 7L/\ Qs` )$VHMI\ϫh875O:t2+, %%DGWF>8dS+t~I(9y% '~I1nc`V!tTc/02S*JNoHzFVhcO IȳcPrg &3íq @iX #7ƼÌo" b\M-e\`J!,~ZH:>m˱Q9ApOkdű]KT%@+/*;D,\|WIa)tCíf²kSaGIjΪuI3?P%a9Z(k-G>)?D•T|77dFo(+_j"L3o6<51M dQәZ]ʲ fm^-_&7:Vyx\Z$ 4Дz+d)GF- (<4NM=ԇ.8qEBKlH5-֭#[Y5a)6:lť]upwȚ(cޕo*;<3BIPBr5aK$9dZDuHUS٩bA`ͪXھ|0Au4"!M>W +˜n4I7ؤ,l4Nq +"5J@UU$ԝ&uب+x#HB]С2饄Hb( dS8EZF |*΁qׇU/_JM#w +#C:$4ņŠe_eŬD.5'uD'3D.J oXw/#1oĤ/a@1@6 MN2G"5YPG!.ĥn~ijJ C3 iOdpAxE8`2aLS\­fP-ǥQC4n ܌W%̮o0 N8 -sj8$ "nÓ>#L\fSWei5"Nک Ob}k _{FahTebA*}S9&'WW9Dt4HE*H,2̎@y@LKک@:]d^B$Y now5@ o +ިXb VV4ߡG0h#Q#nvrWxHRA7VX7f<"#"CID]%f.R:A}QB!lAGSIW5Қ͖ysW9U8/r_G4l9`(r%' +>Ps-Zh*ѵh}B rjA&?~dJ PdvDFIzw!T9ez"y]" U5~Oq_t]r]l]HU#@F08du#6h2h:s1-> hf)ȓ {JU5{O1LgDgIoN>ˌ gZ) y)AC" ^_/4xՉ"G |YL*Mg'-EBGJPx˲rы*o| !emE{4Z0/G|Le!KB/-U257q :GH(g:baJ3ѷF +1}͸ʨb0xC a\zCłP6sټX i\i,jW vք= pƚ D !e)x3q}eIV㥆{{* F {_r~ݷo „i.k-WQ21åҰ/ḏQm'מūl<5,J| ЋHF0*} myݢ^{*?I} YmǽahP Jq[.*SKbO'jd` XL+aO#H9\nq09!2/KU,PK=d GUk}c~Fw?ܷ$:eStعش=Tb䥔HC$DhS+o'/O υAiNĩ+cK4^\,Yņli'/u߯ȋӃM +L$,Kro\@iDɧEVO mUeoW:*j9n8XNb-(E qԽ~?Kޗ Jޗ3Bk#{_$tI۷e'fl&1A~l$/oʁ*%L|i ,TrR$PktY=O_A+g J?2v]2~$z`O + +SC%r~:/JPYP ⅺCƹE^hff( h}qJ+T B~`q7?OEE}6rwۯeOJ> pJ4Z=ɺCէ'x.J'74f: +c~quߙ sQϢk+J +X$ڈ#rOضh}>n?3*Po?#۟ 7~*r?hpnM^DTW" = \4@ /ߑ%D,Iqi>'`Z O=}*n?¡ۯOz6 >Ge-&}H>ZBU} +#vVĊGE[ u˪~s/BK 76IKkdo¹}J}}lo(kԣmbD +[9s|G +Ha9Xauh6-jc=GLxt=VJs,5LNJh}6\DQ%l5Zt5 +~s.A@P'ƴ_@+VK7xۧ a-pv$[U +,g6545[7dPo>o5Mώ*Qnov[djêPٽAj 3:I+vveL0T%삀vslNun^aӊdB̧#1UŠЕ玀 +=a*V(FHo/S׾PugR_VˬogV& ֈ) +jiCiGFjEVoxX  qV$?P` #j }8h}txLi~ʈ?d Mse}oOu64*gI5P(C^/̮Y[<q(S(%z H?_iJAܕ< ",1zgxCF8ChGE6Ub&Z[ &O/!Z9~PTFzweDBŒ2~ ߣbO ԠNdpYYĝa!.M#2:*SR(t1]vuD'+ՂVJ =yPuB=Ml&TkMĬ0τeᓴ4=m=1'&YiHn+ΙY)HȣQD{%}ުstLbm, kqмk0a' xKrK&Y D9'N5\")يhѕ7S+jg1WB8 5XH}K_R1tEم$ dgn`:l +d)CcllLfg]؟uJ(ݧGd/quzFiƆIHEA 2E*TXf$1NqyzTu;>:L@;L( r4&?x]ر3QH!8Q MnQMdŧ4B᯳<@⾊K  lR][@v9l9Ɠ2j4@^Z!MtX(" X*&< WtX~mx0tUw߬AD\* - ]pD2B5d6 lL/J(]0BԙYJo^"_W Iŧr>M2o'C ޷*Gl(@db Eh 哹RYdT"i҄*&B~WIl?B<#Zk^JyaȯX@wdr@ eD5m J0V$xOBld , `{ֆ>i OX~>gDw_RCz PcH4H.~8B/ynL1-P[(FS@}}Ξ>~cޗ]ˤyon2>Q#~?;es?RiS(Ơ*"(kVD5Go"s vzO2ioY}A}%?N;+}O$}^$$yṛ&\MIgLΥnRP}˭uabP[ +.f9i >;@CD% + &>a Rsh5ۧY}6%}>pJ_I> +TS[~jusܧ6cU~K$uoČd 4GG퇷j㾪m_-qw~p?l%XO}h-t9t_k>s}AgXwiGnOOSfھ mŧ_4<-?c3Q> +t?wg Afll= ]GPxADHa4G#Ǥڤ&!Pz\x"\FY78jDn.8}*Q"}]|5@ BaLk,fv T-FpM\(ٸrO3uIp k$Jc/hXpաWմnx-d-4XRg)P qY3Ԛa'#OBxO(W(>!BPޜ`,C`(eI(ej`Jf*Sv@7`n5' o:t:a{E&)V[DnۥZT Tl&aLg-6cÑ="'7y}SqI 3;(մU@hc쓵yӻ!B!ёAO;mu; p=C&w_39T"3"Sm2JiK&zecT{g=<Ϋe5t)LRΞHDdf7sKEӃ$Txɒ(U:< }4@̵̵ꚥ:zr_P;a84>_@աkMZ8A!*Ҷ- \ +SOpUMF/Wq9oW 0fuD01y6K'}1Ë@ x;=Zؼbbt${RrCw;rIb!(VaM35@@HF!R[~bXY -P8.6ȴZ7| xA <8/ eO Ej oG%EḁmuYh*=܅D(?pv4oh9><넾Na; ?kٸoGGa-(7WzqAKPi¢w[ +d+ & !s]! bch?Y< Oy*$2vmŎ_ǯ .R~{M- z+kG(ތ+Õ`Aljn 9>Dk|J3Zޗ).S`RX1P汬=7-kL 0K\Z8-i;W +"t4ĐT>gc!/ ;tG9  &B:` Ik<%$75Z?R4UKƿ5/πE)IV4ܖجD1!Gjn0D wv( (7Cneɪy]T46[GУ,+DEF3 !ubں +%1Z}l4h& )2=Ht!(xqSG G +㝬YAk})C(l,y+N脒])RSM?R43kM] ڊJwr%}Մi8Ge8y +Ж ƏQ|$$ E(56+D˵`QQ"!"HiMTAF]U)Nɱ= oRKp +B P8e_(?{1~彴bbbS)mGlIr v7PQ4@@1j"1CL.mFC36*1~d(Ɂc,Ep D@\ILJ:ahWi@)1YHk߅_V nq9tAZ@nnJs;W1e/<ӡ $9U*;!*#O +DZDe[o%F޷ "etK{` 5՝јd}T#_xsŧmb %O'o*T|B;_,?+Y]:7b' ,)f!+XJxS/!O hx\4K6)\ԜJ3~P&+nX*liğ@LT95J +\xJ"-zBXLm/~1waUjNZqC`WH1e)B'EPdVzj//QG~G< `-FEԌʻIzL9 0wʼbc1 "c3 Dm}:}N"qn% AD=e_E+)@\G(xzgLݷp֌v60 +aFҖ#0t73 >b9[ e(Jc@&&PO.Pدܚ?I?onJ}}/d'kvl 42Jx{Q2 DΩ{y;JXRUMy FIK ?lk_~{qW:EvlD :Dφ;U1W2y\U%QK%<Ɗ8畛5a`Ƣg h ?u\s}B>b>ѻz*%arS$#<U%VU-o@ZSK'/)w^7 ~Fܘ5DyeenإNWO2* O֣ソ?U^Ux_D;?Mo@iڽ*x`ݯhK@޾OomkbHIPq o1_aB߉tr,"/7<s~&k"W#;}x?&1p}i}x?pyOg2/UoL|nĖS?n}]CetM11V {_iy_Jޟ)}GiS8:WF';`iU~G4]^> +p_{k^UOc@7P]zըx_Tp$_pqbHK&p?oc۷1e4!k"A j+\EDlL$B+No4D1R2$op_=8 ~4[B*sŤ ӌG) C@O*)є %̔ )+/.%t8@@#!Fp٦rniezI#@(muu["Ok4 \*ZYT97IÛWY%*&i)f +A}*̺:(:_A6KKә]lcE%p8 A .2.2Q𡊈O[]Uzic},'kOqK=L>un\jP,06 b%"a`ͩwr* +Tclq9DRT孭MI$Hic7(B(k.ngVEKn~?rU c.BlPB59}K#UO\qP=6ᮇvrDzt)2ZLv [щ5MA=f=QB{[VhΗv% 5:&)-AkV +< "p98N\@*CJ_YN6k6KdBPѠhuZ&ĀhE kFK^ /VG\ '[""4Bϥ"X>*HiɇT& 2noICPɱ4j@!aWb@o Q8._aE&D̔u9r(Τ^ +a M3H;_̖R/~"9]ړ[T4Y*k84@bw8G(2O$Dj$Epb h;̎ t!Y%RAă Dx-8HJ~ģ(k¯Rh{-ROZpY* +fIDJ tw9< ` 4"!(O۩je#f?B~~?I%hV Y54@ݘUct0 +M{YqѠWs!"ʤpA!Ȉ:QjKiu&S2qdS}V+q<^PzhU-:R֣4 d:Bk鹴=߰dO80߱TJ?W_uzqAX @t]$3nŽ׀/WF$4@q9*hPMoxT%wHI0 2 p_Tk7ݝ8ڹ{< Հ^$j2xq=Vw+1ai^+=/JCW<oZG(\`Cسšj 0w>}H<6z!| +]KI<]dra +/xH7Zn)`h3A"}qཟ њb0h(DZL EB|.+hU$fE9"Qʗ +E*r~Z1$uV)w{Q~߄IGFP؝C+H}?MxB% s%&GOW`N X &+^-1+Ti~`s&|}/Xƌ6TGɠ꼄J `BS5(@qIE@U5uEDw2kRK%_T6?6o=KzcwΒMC?W)'AV\#C46$fbj;aKXLs,Vj#,ML ,bZ1tYoYWsX1\1kX``C|4·iH!Lu[ +  9lqpLtaD+*S؊i\J8J}H7ECR>F{ +`$"hN(A•({)H.vl6[UZ03卩^bJ#X˖Q8 aQiEeHrܒSf i8ϛiWH\ DO_R M%lGK&z0ܖ)R6:6[dz9\= 0,IR7, +T9#Н&8^0D'#b8Enfx\"rrqnɽ8_ ,i;zteIL< Ȉ̑G(%X^d!p(JfMݮ6+f~5#}#]x }4@j/%)'J U  +¦y#Xbh=Lڥ4C F@ېKI4@@9khieg2i%NmDꙀ5 *نmC"H$n]1m G5@]cZ3ҁ/nV2D@ZK\{I8YZ(Tq&0̵K'Sc📕Ffd:┴Ueƫ.MEU1<=쮔[EDԖ<ԬEefj̓E?fpXGgt`, ѩjA5(0<3礜 ZZo@4Uuh.%"9.FQFv)|I]\QMw RPQ'p!!Gו1\ Bc\ֈՊK9pu\t"gE8\xԞDHn!x-|Ғai)-)JT01K֗)+ Z x'Am^Gβ =EQ$A;IN1NTa?1lgh0)6Yf TR*Zссtī&īy +(͎E( @WC7g8/.lx{Y5HBs̅>Q8#n)u":JK\w H6hMugYM8M 6j[Uv ;lrpO|A(5Sl! 7<>20^{$ec3znr lMs S+XayOi2RwMeՄ̀A=kc).Dh)S2$ +@t=s"RgZ!q z8\*tvK DAڢ@Lc4@r04/CA^sjE!`<'a Ƃ]Ū +"–#!3i; עNGNZM(([MdA~VQ8i.N4  v$wڦXd%- _/1.4VUL6nAZ,X,҈qɑ&-2XɈ< /  -„HJU ;Z?W?L#+<*<}JU[!)QJanNҐ!A, ]ҩE + 0I>UTD 2o+UC2}J rQB;ksJ#D%7+n$Hd?{n0tЌ'-MY?ގxmU!.JeCcH ?xnahPI0H&"| QHLXTnJ;_|unDFw{;4h:zʹNtaFs pY=8L^.5uU"8[2B0X%4SMXjD)tN)Q+FOd@Jy/J=.5d^]+ԒWt̥N *WZH-;ؓC ġb  M"G> W|=D^2Ve(GaA&:YίKO͚@v}{\=Ro2ox1)LF + ('K 9ߤxNFI&&⊸6N JBRM6IJ*8[4@@i[L+#t6:-z?>Ee2i剈/IBܑ#B? { OD@4@mrX"tGdwOTH$LjN>]uhPe>hkY:\,Ny$ =V\é|}5.΅KcʠE,ȍTix,+n +,R$;sO(?.RxlB1+G5@ 8NcW/ +͔ +p(qS1xcGgD C/Q)ٯ` 0"D 2T6=bź&gg8q$s6CVqYW=^rE 36\ FήAC*.&bvV {ZI PIPD\P-4bu o`L8S! VvRzЊ\^\}ݓtD}_zw[>Ucj}C$2}p, + !o߇ۤ Q5ֿ? q ̐} /pkt5@@DS zvɮբ 2w2w ;Dۯǝ~rr}l:-5~48{,I3cVz& 7~%߫=!w 4_Wr&r{Y)㾯GUɃ{%gw9=?՗_|0.Fr.fq0#oiMQHxr8Wi{GE4@GEm6Cx[ H3_BbJ]LE3AB2U)Z3ZlT-*J`[iMY׋DiWQRm\IoQ/J%P )d P|6-v˲"w$igA,408 #$6e"VbWU.yänF:WBZs$f:t +ɬ;s<ϏK=@Lo.a kT-{V{h98 +0pmTOtK,M6)i(TۼttC#|?M-rX XɈсcEnGk/bؤ_EWb1+# +SQ+T0ĩIP} BF.(,*-Up-.tFsjOlc|,nv'vOM-9Z^C9.zgw@4#JTT31/E4z4A$i8ĵ@KdLe@ gႮC曀ǡ +V]TsS~:zX|O +akP2Q5Rx9D;*%_"tl,LP`P\L.gZW"w{ȋs^歄 /R Q+BhȂkI)gDEң94` +i _TYHDBTWP]Ah0a Uf[ y,X%S-`Ii/N=Jw>OC>9FҠ[=< EB|6"E,Z\i1LV1e Ϯ%'H"sGV*p0Z::n@3R^<᭽m% PAid]h"g.TԱSSI)WEJ쯊؜GC.J>($4@ aOrW2BJp4bD(8oj钩 `+]h2^lp@i{G~KR3"`4@0LBx<:a:c?k&'L6y4}?/4솦yO?~0fbkkjϱ"8 7>\U#!Ů\IJ +#5`Tɱ C1G@|0i-^(U־-\oZ pA):3 jk[zդB5$o]H6%~؄R8s 6' >/$[+H% iHa +b!J3cy:le~.}2DI' M7 p&LFJg O45,ာy]s@G=J/ >iSnrǃ%,:˴`SQl3 +>P/HG  tTڤ!É9[?yBt7KP 2^y ڮ 9{$F U:[eҺf4ڜFJ}@ыY<*up?Za_@vsds!ɹɨDHm["Y"*Vz*шԕD&˨ZDiQrY'K`$Y= EODD@/G$,aĔT +kCEGKOaJ<&J"q[DX ԑ>JHEB}t}S aad0em˫[+2{4By]bN']@4Ub<Й[N&M{Wթj%8%)M2Otx U,Zo;N*tpl"L00*,X(3$4=+J|S%}|*ix@-HS]oJ:;s4 \a%.2h?\x+ +HHeJHKϺIRE5-'(yLZR)`E|;>b&"fT_kG"[#XD!Hɍod\aNga'A[N ЪS(N'6ˬVe7&هXA|seksQBKu}ҋWZ !4@@ ٣l"FD8MK/V:0T{@49Q8)էRH5Nʤ"'&aENVDޅ[ӬRZZS~ĕ +ۚB +ׂW"O*k'/P5S6O\Bџ:GEu?AuGe3RٝI zatk*ʬ'k{M +s:WDwVASC3=ӿ_W{Es*7uQ^PΫ'LVöKea\.;;+ldSq;gt}\)qG4Rg)BiDž2`F@ΔIS +xE]bBbu1?]l8],ӝ.sdcp.Ƴl nh'3ToH^iS,e&5@MZy`2Jk:②y O=ZW:^-Fbbb1 +2> 4@@”ͦ4 (CHYIɣ곽c qum ^.4tƟΔN_&oiV QZ·pp XبzèqnzdJiy"Q\H&w 4x<9O6 ty {)| vַņ8ИBQըy+oRV"掋al^J~Ji.]j _(e +xu p"L)}ƐE"o-;)nY Ezf#>stream +M}B!U3 G P ?B!jHMNLL)BȶЈZULJǝנ R2Yq>`d>4@`B;r|Fed>KyS_!0Y aD 93j疾d!S} evqʳ!ծ9сc="l‘Ů` ZEMojPlws7 GHv? p µ$5@YDZiσ( hʲjkeܰv (:X!] h :<2"š! +neƉR2lDWhI|Nݫܠ*sU Jk蕒g kd] ٺ^eҧGp(C`cƭϣȦuJ|nA EHѐwΖi683a"t$hjٸrޑH:SZL M&(VQ#lWV+VܬV獰Uh3t!$F֭pm B\t&\x**D#HּNxHyƽH['% },; j6' 8ex@񞐫)GGahDjTb& A6bVe[ЊϒGWJtfi3[+Z#fBeyjC*!`ƍyNq\Bw{T<,nvd'NyUyWF~C29D:}0!{ܫ'k91yAGYHve.B҆*<4膈dNd.I#@Q&c|rF}HDR2 +xU\U zN'M W*#>(lOʷH`H(Pa~]HShjQҁNeZ:HJ(1]dEYkc_)UER)k*1+qw1 ZPVcoĬp#S.AfJcH~,npTJD$ `hiƗX$jπ3Q1*G&T.S)ZuJ ~$N/V&.%"O!;RBJ baÔ;+9./P|D*Y7(,1Oknh1|̑Z0z}u*3ij Yө, +d4Byj#jGRz@> G}:1 6ʶÎr>39-R⾠=(>iJ@,Qk@+iJlL(+QΠ z;$nBcSFNh;F7)ԍ Xuu_*_5 #UH63S#ҕ8GFVabϳ^zރ20NQȺX$k"t7)u”y\R=*< P""^M"?GBI NJ\y7*IBZG{Alnf5jB}h0 ~_H*%/{3Y! +*hP+rDB @pQ'ARߜgAƦ NVuQqr4-AsFwʎR$c8(:'WNwS9it6V~k>K|D$QJUfZ?Tt),eHR!0hYXñjđ:d/x +eVLֵ"4ɤ8U9狌3R,;2g(6~_0B6M OAu[5iauR\A'pMϰW4 ')k-233#] g m‹||%rq +>:ZV) +y5m~  -9[]XIsƫa3^x WW/pٯ^E_'_yoa+q +~kV~\=Elq1W:^>q\?W?W߹H!zԁ;DxWhW=9Ǿ }]پ>^Wr\=`pSaJWE fC5{Kw5@@ʮ^#r zzasͱߓ+P]§.6=QNt13]}:\֟T^6ZŒ45Ay $<#/76-AsV*.8hbHu1MN],%.ֱHd8Up; 4D>ɢ̎3VHE.PG +ҷa,ܶōT6u +%whdM 6L n ;? 0M2i 2 `b + .'!B 7< 0{R'a, @D"&8wĬ@QRi*+{]kZ,WdD᰺lq% D3hl:Ыtkxޒ2vR~rOgkkS\۪>AgbCWzL V+#殏¶)@\R7J~cUI=^J&N5/@% a18{r-ɔT-GbWLuD +B;TQ R2ФsP]?Z&e5@u6 +.@`~] 9;?Rt2)Je%f#'L[&q +!Q^0J ue?;dlU{+:Ik>P- H 8d Xƶ/d@f 1OJI"z؆&KwH2)N\: e_ GCa6 ٝG H-Jr5@{07zd.Qo[ؼl3G R4(1h kat|g6zބT qrS`Pm,:}tB,:%ZUw=5؂ʟz`Šc~D +p .fA,y}6MMݐ["CFB@EKzxCĽ> PfzN!)(oY&n䊃}X9]ւ|$ G4RdoE!ʢ:_RX WEl/gaS +i3O_ԖyX QNk a!Vd"ap(-e-!P0I S =Z>q$ "r-"X*FW|'vT)R(hiD'~Kߺ}\Y` r 9@Jr2ȡ$C +hU Fxa o%"?)X$D%ͩtD4x0mK]C5B ӧPQ"VL3J_7Gdm %CνCȵC0Gb <_*!>s9@9s  8 !d ;2K[d1wġdpΌ"6 5vtKe`:ϥ֭LX% P/Jx%&y L*.] n3bPV$THY~l3RvAE4#b5.b,NbO 1^S}ro+pDr%8 ڵDEQZW~75@? lJ\.Hl1QMIF3<]ehq6橈 1Tdۢ$FTL՜q#u.'14k,I#XXL7r-)2Taj -c[qö)8 *%^V[Pi|K"rHZ!bƠ?|`ϭ\"WqԬ8lj4@` Þ:iٱ{Kqy[#E|ձOc- `A0aR, " +oi-XQ4'0F,IDZ}ۦl9_Bw.ZF5:vpq;o .@eUXAbZf$ o6MƯ):~7 |JE5rP5@@V&C?4{D}CixO0JbЖ#<$K2roQ= 4F6$KM:`R +@jJȉt$;IDF2ǍbiM՛?q|Uj_\,siTwH)=1^ˉ-JT5tDҪ$o"-"AVf, +hյ"an10_5];~A "% 9"SCMdr UW){cQ1*&J3ZaM+;S^V*W‚Gx:Ac{|U\_ /p0MR ~.8?hzK%`]~>e.5B}&*X ĵBe@ . Ǿ~`E/1A!؟a7?/v_ +YhW0jRO_e;˾?O5Rޠ:~а/4쫥ØYՋbk2S@W߫W_WsWT ϙ[׫9J[򄅪N\C$|T ~|͈BeůWXW?W!^}JYxWՃR̫P1,Oo +~قoSfbXX顺XfS]}b%DX^ ;1  +DC) :h7Yٻ# 1UH&H鐓;o1t#[|&C#XoC b|1ʔ5p~}%%x4B7bmB1>dNN +F[B l}Tq\_Ÿ* mj6KPpxoW&muZY!b=(05 O0G}.j)c/{ZEZ<KкMbZeV⹴ hZ9]kY԰Qe԰5!Rosff4Αl4CNm`Mmm^5\I%LO~Jbd +G+?Qcddmdv&d{\2f<5@͸3L + bY|emn#n#)ZSeoΈ.d +DheOfjb=)9lUem464ʡW2pi{*(u5VV4N neM5 iw9x}l0!)Vh$kb mVdPZj{ص 1.5MW|:E}G] Oey-Y&8t>~3ցs;%jt DaӖkס , 0-ޱqーV;6=[6\(>>ڍ3!=op@ vYeu]mɒ̎4*+UgY0lľ J8x~rIDdxhW*[ATG'H'rXnܝƒYby_*>CٍIb= ).Hj^G+"BHN VnAG-j=8-@RE5@e1̆ q!+9=[  ">fF^6w9vAd=aFyE ! %޵TL軨H,LGM熥@W9?4x {q%UbWca6\ +%'Pُ$J[ڂ$z-*Tx\{NDע' R ̵!q~ԛ|;O|ے }jL9WŠm[T]ߎ6$qpef⠑%2atSVגDv$Q:FArUF !4ķ]c UۺԦ|IOF@Z,TsulhkԘː7%x~4$,ŝXNtSNDP\$E'u\B/ c׋O|~ZEYL>I:|\ K2my3ѮTSd/l lDBɾ&T+FmAh$ɎyL#8> Me@n mR*Ѳ'{ec$k:UWJSLVs^_` eec@$痘D44HT2BT0N f抆Ά @|dEK'p)6g@^!c|kl",EamT%MD|nAs - +)8t:rQ>iBd`Ncn |VnoP1 +<>}a>IɷxGX)8^HԙNep<13TvD"'"Ņc]%iꙟ0EbB}St,2R +67vԔ +G5[B/(i]<_5'>ύ =-67f>}s9L$-dt2.h3$SEnzhEBd,^TgG!6M}Ub'ܼeKU}m_|x=.N6` AE%ا!Y7TPE48<:Gc6(`xdL;Krt̟=z,JI&GCu)'XL Pn͢]s1_%3J* +8#x6oنAl@)r +Q񚺟HW 6 } P`U?"d]Pr-FzLDcdUD3<~pM:B0~O`3*\  q-U`U*z%}DC}{ƈU<: +&GnO2 )SCfHݵڥy+?;VK(N +=I(zE7 <~4}æ}h?\xLJ7 H4f9)8:Ot2bP@֑S\4@@WSF+"Ƨt(Y8S3TrTF1+VXH95rŎrmop' +"kHe<'L2ˇib +a* 3E sY8ӊ%L$>8uě' Ъ jrԞ;" xRa25 #K} +ɕdH)9a8.jG1tFu"+\)JΤ65@^/ut+%l8w&_?T&WS0_BڿS 4] ~i䌃s-iR* Q0l\ejCIbiCz-[m +n5Z~Z]gf1yf::˒`Ur~h|NM|KI| "uw'|,\3L~0eO]ɘye0Aq/P)(' zZot;ϔ߁?!s~3cXMD5/3fzd?-U__/`f 4@ !OTG<ۋ _0}ñD/#ߐ<xǂEÂ`~zұ:: #&X %h-G5mG} >؟Z.v. U詋bb b( `TvZ{0A5#m~i~*9*(&&3Cl1i9a)M-/2!]h4G`b۵u%ʝp:ɦLCC20cLe4 Iwa >EV%&T2ЪLV̵XQjr-T +-9x$$924x!JqcRQB%$3/GyCS_SG[ƣ5j<9 v(^}D"KCS_@?!-Utjy+T, p + + +hr|s!dQ@{_.TXæ% 2ou:PDiX G-뽼ۺ̎~+)Vѝq5L*JJׄEK[4|n*,DM[j{[z} TCڼrḘC)'RJ-B&۾*.{}[xacl/bH$b"f(5@t^HU k` "q(!ẎEb0D>=Zy #&-O(җfj~m)qtH + xU\j$B'ڒ0m$=CI8 *T9Hs3BF0U >L,D/D9 QЋ|A鵞SK*qs˶…ڞN1@!iu 3 CD꜒F %F5lFriηIq0PQepR}B7CCpT1PoI5@@sD +M:xXU,zN.H,zêԄ^Ru蓉1MLjf|_- xh hHˡzYJdhzEE&cP'W8+m5d5'ج#)+\q "Il !Ry;r0JKsrˣ0ןLn2UB"k~fBmFB—D]E-f=^Ť!GѝŝHf$8A))B+@cl;H|4V# ( ԡCVG +$ #(!̭Ԙ=9C)}[JJSBЗ>46jy m1 +PGT;*u?%܏gD?3m +W| +ՖQ"̣ +$?&U E YВ%;F 'ua?^LL\V#PnC+CE~GҼyAuI/5@@sbr"xC%%7&Ḛ2y=`›NR]8i5Urj}^3ZSGj=Jtu=i(6>~Jd[yj7pq6d^zPфP ʤSrܚQFhaJϕhyu(ӃTBwIC)GGaA_)KNA9Hek9{?UO.$k=e< tZ;Rܘ1A&&E8 >+J.qban + zzw:A`X8ҌTG$AnAxvWFg(~q.hDE&0ȀmgaxN ~Qq($!9 +SDu親/#'aB%׸A]`B(/¬T*i<Ź} +mI,Ea1R$qG@X5)a@H9:F/vũ#.Zth+ٞHIN^ַN'D<$sf DgF_D́f@E#&ۀ 0pX"021 +uDE|$+&Jb''y"M.M|4&ʼn%Hϖڪ*\u?LaѤyzP>*.EĹqAi^>JS7INN!N. o-L 0d!,M +_e*zOn(H$9B11}D[l оJ~QhA12'IP' 2'`t"jjϖ<|*< ,T3`mDڃ4 O0s F3YTc) 0IO/ԟ-lT<#*OqSUGXs,z570WD+tD1; *=#D=F+ 4Z_zfUkMxǹ Kg~CvxZ:7H媒Re*f 6~g wg+K9jN,T a4J?uZĭFlnSC_Ipxn,Q?H՛  Hʪ4~26xO_&b0M*RUIreuZcqѪj6o=5@{)Kޏ e +FfoY[/XxTg]͊DMF'8='ěb[0Zw -baC絮=i;4v/GHv\+oNZ﹙xM&Ki +de5R$4@H4r[}GF ak%RF!cYe$Fp^kۇmBg9BgոpAV0Z|ʻ"hD`Ja"BĜOH"hb육{֪;.}03?$ՍH^a.tEV$&dwzqu 1ZN:)֛0x)|[ /I9!@k$ Rl 2@Cnq3`Nwkփ/K`pq2@d(h쮋PYG[ \NԊARӈmA[e۾BЉ^Ǹ92zC ai^ttdzbuv2b0>dmSSJpc! +&+c` !/qh!mn-6񼗲}KBUw+4@@`8պVusDlQjGXhLa1QD |FCuh^YHx+LK%yLx핇b,hBeaiiCQULCE,-&И(Elh@ٌUɱ+֘!.ؼx _ +mxJ4[4BDvUĎcQՍDjuqD>8N?#ȸD F 1Yhhip̉8"~Ј&JO-BҞC8ΉF2*qm7 3 =84:$2EJaz-M„i׉8\s1PVH>1S4{c:Y-ߌ`LnzI*n\H f$ ' `2rN?[8ʫ"P]a[T_Hwc:d<\JoQ092%bBiɾGn +'M\s'*LQ!2YEd & ű2{H]xc+qW(2C5d3`8;@{Jbv>4 +}6S0.'Jd*Wo,7'Q-GW4L@^6 So6IL G zgTyOH}0C +SLB!4>i"( xm$F3yÑ}C2/gQZq7%s +AS>!(@ uY#uPyԯFZtGLiDcoIR+vx|\9oo #p}\CeF4H $+I.ԽtI~lNa>֔"RHŽJ04TP!CjMbHUziD<^f^wKb Ŭ',VwbL9RO)T%A4V[UZZo`qP] I]܈.U]b*j1^L_/l þNۘ>:D +㌺5ax!RYl=U#v -ՊaTՊ)nj>+$4* TL2t)ptwAbg\/\XRR,)LR,qYS)oCC/@bE1FD!4$4k;NO_mF  $ͥjb -Ч, +vbFؗ zbl~X2O2c4X(OlKN v'wIܓ*bnb61@&/&v1+3ijob"%GDҒJe + _4 %e05`5`t0`lO&p{PR0GֶDf X  0m2m̸Z\H ⱡ"e%NZ'/MhtjÜ-`"]8:] ]FM{sM1Qc9 +XSʧ祀miv[ +؏%%$A \+04yc NTzJ'cR<%V g@;MD?0 ! &` \Ʊ-Ce"ͯLԔJIpSd-e%"T0m|KEy 2lV>$PE{b7B9S][.)G0b-۰|(#p} '*m<4  JE#Cun/NnJ*;1rEBh8$"tQlE5DcuZ !=4@\^QQ@DVS฻cUUvz7us"5<k?S# }5(.CqDbyſq1bE.~)Y G &QJpyƃآU]# W HdQLxA3X!-DM^n W `q1q1xFgd0!"Ac2 +BUBAŲǒ5:!N.S'yxň1s0tf8I=\x + M݂0_@_;Ep.qgrB!%Y--!Gf4#`p^&RRI, Dn XI6WRH-D\vI?Hʖd3x +i.RmSTY *!;M&\`b9?{3D@ ڰEC 85dXvSd900AA;D%1vDkF +>IV)zS&+6hBU + 葡Qr(t- +w- +(i)(dP +I:ӑR.ꤚRCa&Ҫ{{Z%YqSdZZ^B\A^j JN=:+bʼ g]ؤP%: PI1SZBg0Q120ӱ +PۂUQ;r |@\ػFj@7pbsoZzF Upf-65`xtiUrPIkHIkY p]}Y9 |e}BTJ!{$ +mj 1Ä'S:v?crt|JﴮRks;(2bվ//rX*|5 hk(ȢG5[㝮U/tF4@EJFM 1e2!)gNED\_Vس~ +aS2g!a`td<{Z&ʱA1SUY+2i?f sI{X<)Mp*l*FȀsIBI^@>Ф2o6 +;q +MV^j6zr!3oS0Me\UVQxq×{, QLrX'TfZ2s9SL&\:\A`W@Yu}C'Dx~ Q٨jriڤʶI} "ΉռglJ'F(^%TrV_4+'f P[J'(ܘ E1+ȈXVQF1s wo/˶uh)DCR={>h)+(=M3H@5)bDC^41~+;z6vb\wbN E)Oa'-uU8P76zbB25RY U-AJXy xd5LWl}ñJfnEmg`Q6қ'(1%Ԛ@ 8'*2"R( SQDvôzR$EcE3\ !UbF~v1βv֚ؠWsZ/'.@Ut[hJ'Bisd'Ĵ ~KKz^x-C/jt(63V-V-ii@$<M|$` +(x i<,4\9y J Ba1Naf1I.YV #++:Vl$ #\dFkSrpb/9y2BU,6*VSbĠbN *0t*J8V&LBIBGb +_{%8b9bݍh@3>}%.YzT0ja͉щyщԉcL'FL'fNJ'6xmN4SNl7N,a=1'l'BJ70P XDlfu*!CfHd`6d>2` ʀ%tj0ʨb9Lf&f]KejIȀlȀ.30L` WI P"MUQuh#LrFФ>5vVT>R/J%6)Ĵ\b]b.1EH@]bQbt.x((›(1Fl/Q6EET#h%K;:XWeU ς &#")Ŋt;Ic(\x9 + P(c=XGL 0)c>jX;*qd+@є『х~9UKcloмEzT&%~q PA$Sn3:&K,N* 걱*R^ +98+ e) Nd9Gn@Z\miRR^$j kN7nMU#-zPP V!t+A {vp)QǮ(9ӓxu  p_C"<̕9Odsvs"L.<2+8bT 4zk{Q&^>bK2z~XTsಋPD,9Vye:oWBot1#x('^cNyh=RVj#§IkT אGaZwdg![mRx.Cآp!)eĩwh2>irR[!08= &V_Ix67W* Xq4*B +%sQIߪdby.Vj$D/1ڭ(O&4v_*3Wv3TP'A9Ϩ* $5@ +WpQKJ,mSF8rs*Nd#J o,8yPޜ*49Ij|+QȺXD apՍ]ɍE'JSUg$Cb\ YlxPyJĆ% \z r#B`PY I_#dEx +a|@coQ.E aM$VrByc95@\#J*ЧWx@>i,3bQ<|dNq8RCbr20(Nq(YQ}W,Ypb$5H\~ mGd``yxS2[FFq.w?_-a=sߓBDp 0A +DCC8㤔jg̀U~rQC9!D%a[t52a- $h#ZBp,h8aH<^X3UjQݫ$8`.Ifb+TQV:. (N.Jv&2O'W[:u{_j9B%/U?R;ޘO l@2}ٚT3d pΩ@FijSjo#+Do<^*쬂i<,)8ޮ-4z7Ξ'ڽkw8;MI*T:kQtvF!;iB(xpT G{=!>BWx˜}G@%&4ByU 3Z𪘔0Y 6;#Eo*G\~G@o +5ԪTV$7ogw;\$SRtI~)uNRJPi]DcclL +9{#A”´ڑ1iի{|yj1J۸B[mqz4;KA{>;>4~_l(YĴ6j5޷.! }&JGd龏g*J4b.DTbb-{bb"b hBF)\<Y:P?/DAm1f-ft>ߋZm4sdk^ϊH9+Id*.. %Q$/uTQ=W`Y1^ 8M-OOg7f&am8I + 񗒊aR[S-yUX>D-Ni"mE2]\0 xnОx2uP|aV"xqj3C + +h4J(+ Y Y J*"u&"9b xtbr2soLs"bw|Bէ+&ObCP6 A}3X97ebb"V"Rv1=X&&Shs !8H9{hv?DТ 7$IRy|/pk\y7CM2v, }=aK   X3nLN+ M\Og')7sk, F0 s*E\֋5@h0n#8Q$v6Vq,A)1ؼn{7m!TM?Z-Bq)`kE^m6!X.A+-=}Ү:2;ռ>idaF0X  /➗;NIץ**&$q-Ƞ htΩ;V=@yȣ}},^4oca_.S)!r5%5R.gK:Bg4@BB1Ԧ|ڸR*DI*ѻNNAJ;} ləIA28J"!36zne T3 +*Ɣ a B+4C +' +T9RsȐʉ R0ȓGΚ)E0Bj%\qIR٨yLG0j + 6]W+U]%)2?R(50bߤܿpkME-mh4@@}d dY:dY1[<7,_q(A4 &w/\BBPץShl4ҡib4r ֨wߧTNy Rg"x_% ׀^㲼%5@@S@[0I +Ma8DHET\SYs IЧ4 /UGuppP}G&n"%ʙUuh OEp&łkeXbgLς͘"46BTw(SLI rc̐dY.mJɏ5@ ,2 +d։'R.:Q$ӢB#ԙTRt$pt CjaĊIU +hܘӋ> S0r^+$ 1DK f kK6DVEfKe˲9 _`RAZc'ܭ9w1NOe.hF%47 >7g=zޠ09 2=ʎ|"8ujBwztzA_"Ҥ3c5SY! k+1-& ;6{͂,q܉T`hv   +j'1?uǨ#nN@ Q"NxVs 48&d{/y(d^E8,ƐِT$ Ã:?'zzwW):%Z'GwTdn Z I!D@&5@'e pp7aQI9$C9Д˕<:*0:&0=Ґ>WDJ# T EP60c1DQ\$mUP +^-U1fAAdv(XWXy"K0?+5"Z*gr`hUYfY1g'`a0i# +@VJ␲L!O'V15G!EL)VTV S4[RҾɥ&Đ(92KjYhH +p5^[q$@idߙ1~3ZŤB;i*ŇGFr[WWoJl$B\ KuIY8Cn^-ekWgW#yS'l@aՃ0gNnS4Bza$ Nj(@L.d Z &tkug]zqX6f!FmX2NA^16#It~f"9XRv2d!ÂD:O*& H-^% G!ҘrRDWˮ}/_F{vT8; 2FHԒ&q$JuF̝03jMMݛ.?ё#ίG+J%{ Ջ%;Z%HL^O7 ]ћD G2 Uǐ_/ 5ۧQf6V~yö[7~/skT +ZIZ[^ՍƝ,+aFo=2=Y#['Nc&Pe7B#V@.!i[J {q}H1O"g"w!FsJU +pF-v#Gb`hTX%o[ZkZTZLl-FJ,v.#Y,+a a`A;X0!:jAb5?yDtX͸W?V 'V’W TuJt5+F⊡0T*i*h*6yK)8))Vk.)5&1I/NWc籴ӲB +[I,VB'1]pb'؉E5Z)b0a0 APX bP E0(!qFFڮQLn8n"AěW: e|;)@1Y$ˡ&Wհ[1iة'R'h;^<ʼnHu>1Þeu}=nD;w085j6zZ@ p̼pef#|8leӱ9{d%o X!O!@!6@D , 4@`6AўWw85n h"l dF=SCF 9NSYY8 @C,lb p[N1l_L]6y70[xϯmoZNtqz{U\0C5N%E"Ly.? дb>߯8?0EZ, "!zFLLU16̸;Jth tAIf*Xw^Vk-jBF.ajpC(tӱl̛I*HMTFHCYt]<(ReHiA'c[ .dIV ]ֆ# PǮkCb B&Io]T#]P( XYBۨ(*dI4THUh)Fo"\B +eBK%Ѕ?&bӵSR&t|CTXuO +J]ɼbXeqI@A̎%f;ńc1%G"O +(,NA6JSd#2'2ܽ6K>_f FIߝZV*4PTShBWH7 NJN{#rՐ5驵37LLa6P{ +]&܈I@M*U14+_OhlwN/uV]!Ɋ V-ڙH*54ĹB. yG [rϋnƟ>DPdۻ/7?nA-"AɕSbV\":".1leEek4.>]lj@NV=&*+2AV(Xb$NQFN f(%%%%3JhOh Yf21 6tW@&&&aY+̾5@NGH-f Ajb1̎;2l 1J!K,+R$Ȼ: o(.N|?}eۜDOx<-O-bؾޏjhƐ. j4;(~?آ e!K 55@Tfe/ldX]')e$ "E|A)EwT>øh J]](] Ox-v%!e/ac޼N@>58gN*a([FD4@՘%^Bf.i4/x(S q${"{E"{kB}MHn_'SQ#*k}XD6`wūj;g͜ h4ߦ񗞞r/=:a阔EX^>"g r=3*Vi3*_yAEƄD%Nw;p/.*AjQ !@JE%n "G&6R2:u)|&z^'aŧH* VȚ܂|Ofg-.s4Aopj`zç~]^bَDG7!B# :j!|#/OŕK t`lX|to{O>PN<(O< xxXÌs5]:m' @7PUHBY݌ Bh3Ԙ0xqבa#@7)31Z" @Fh=VW"Ŕqu{$: +j szx0 mR"(2jtp-H#CTm30$C/cs65{rQju̲BuyUJ1 .Da]֛m8Q>ityPhF|'NͽZB.zd36U+@&8i &dE s4 CUNz ,jQt)hg3#!C<&BU:V8A:@4@@u"^ vAʈWĸ)i>I' +&#{r ((塜Fx"KY, ^8:Wƽo8,)BINјTP@׎qaҲc&4e8ɕm* h`10ZZ\ !#|׋`.1*lȔ.)yDMay Hu舫{ 42D4+VTjNEC /NT2 L24sxot/ 8*d򑥃/a.'TUC@UW )ԅhxFm5(Ht:k)4fJԎeخ\Qz[1zؾywOyX8T$Q D;8Q޶HR2TȤ Jr¥k*/n2{zG;2ϐBDC*ͷ$"E>r ?Q],]}Bz `,sfB[al$ +I$4UZmD$g1' 9Q9H )vkJ)ƞ+3A$tx@3ҡ"H.5i!ޫĉjTxM)Ot1T>W+_J{A9j7B4H1";+VÝ_P"1~俯]w8@x`v֙YZ >L%_-ɦ u)lW?= 澧dD{N-P88G}K7hV3hb#bx'uYm&b%GȴXv[KBVn]iIu`8rKpAdhPAR%s$>-fF<-:-!;-ր9-fXPZ̵iG X$V[ X4pXL<^0b<ױX)W`4sKfC6>tU-LbZ@TCKF\M bqI &__n(g}W,{D+VLcVLv3=uib.`N Lm\\%'U͖`8BX;|"-a'IOs,-p;VV+>U1Ui٪RHDŽJJ1œb%hIrˤSlTjSlg)eIȇ뛔A>w,U6(-!Q{7F"+P3r0ăzQ,L(&RP̎=3` +(8G) gL(1 @F4@PY0e*d8{PAD7p*wq ZMq$7 ]ihKg'H5u,7;m4Mm}mOhlmYT C!T R6.< .@'v#lU@GE +ӧA!VKؼ@B ECxv@oȨ+)!Ew]E,+;U]PP/bQ/RpO>彺"'ӧE#PA1L׃n t@'E8* dFKTeYZtzK<@$ZR΁1mezХˆ3$$U0L SHz7,f#/ĸm$_Eq1V -CJ -N +^T)?Uft0p"ݘq@Ř +,Uv +?FT19%?%B\T-x4WUK5A11 o|fڒ!p@lST0z傳eA +Ru0nD$4DoHA5E"OD +!)4([jqyL%3 0K  &FCIKު#Q_(+I$>Rl>q0F!R%1&MވC݇D bs"iQB4 &dmRP3!Y ,Q1$qRtA:!@QԹՀ]j]W([6,V0-Ub9d@g2Jl +"z RQKX&x}&ݾ 5S瘧qyHsE+ Z@ܴth%\+jV"ab-Ae 8ށN,: aL^0q +;qs"܉l33[4jKKu )sW<İV5>D5>DkO~޹ +j-AVVPDm.Esp@2Wp_XA@7="k#)y>4hjOƷAPupS\dĞ4R˾h5@ck8}[e!̢5Pu2Èj4/%9wv'n!f8'."?|$ +c6kJ(PTSk'+ P@5#h29[QqGXsA3IXҺBqv(qGfp3qw@%Z%BW\hK+0F"%X1O7jjmelV,Ji6BP! ڇHc-F yQ˼Ɓ___Ow0/A\8tX Y刔 Eӯ%,Ԇ_磌4RZ2sx-IJ3q,-S2'9(ն wEpYUk zSmv`qpwQ^<~)nG9h vk.R3FO<5c?Xh)U /򰓁9d.Vib;Q~MF*>l0Rq8hx⠩8w +&l oY\d OYiAdSdrWYָjmGhZEʆ=AWD FH0-&ҝvَwʈHDuxKY'Q4=D%(D=e3};b)D[U{jM<,E%" . $HdX`oUR[|"0 h)RQMaiA7LpZ^2 s舦U'2rC9n-ԅ)l ,V iB٥FF0֏0C%BF-$"o) 6 p/Kxby^~Л'( +~1`m_v„`TP,bUBBacռB\mH >xcx"q2ِHAD,'p]IhBɑ'F dʄ9DƉ!1;A;z|!l!Gc <7Q!E\#."F38,^ +MK[2Y}n$Cz$£T\q SR.I<%o 6u +It*뙚Y&Ša00 Xvs";? `pprЊ[hGOQ8f0T0Tވ&8xMD$b-'$`RCNEwB ,^xt,.R#>G$2% ñsP`P{sw̉{VkµA +CAJRPlH4(qNϠy9D1&,W' @4~;NC7U +ďTN^:DIvnz-4b}c~ 'O7K<\&q%@>i_}Ϊzy#H{ 6ˋJ2;zݸ zY9N3=7qc%&@S'T߃2/ +## O2/W_Qѯ^P̟lN1kr ,%z[Ĵ]{}!(OGqv)^>}t{z.&G^+'t{~’Z.. 41] .Fh`n dF00a +3L_PF1bo +,&E^lX;\Lu\LOi.Z LI--AMZ̡-vе3-B@(,2$XP8QJ8& xK ?9 qI juLeY#! Lj0S +6aK8m$j5BLNsD$fgdT[/wʧQ: $=P2X<:0!VfJHX^Ië xnB5@A[ Mb"asVą\.݅LYH' LyP.t\`zQY:m靬0)2!$hԴ\Bue(A*-"aSƦq/ !7[ EhȔ/fOq)KqeZ6Af'vC^Y䁢SN^q;cD +9m4@ o!F̈́\y>N›WK,(g& +x'\ [ SD_7Sl3S [d%'g=;-VXAb}D@xi#6L*M{{az:=]btd^_g4^s߯?.[PbQ0FĖaU1Hp&f/3hz*A݌$(Dj,9;/hgJ }+R˰(̌iM (dgwF> fY4lI1X=DiFaTQc,?4gAz'"3 +VBI~ʯ)#(a# [K\M3cUG6P߯iLP*|$CKjIrqj@b";z({q5HcGGuH=N(Ϡ$ s +f, oBsԣ*ZeM6(pٲ=7؟|CL9@$@//(rH~mA#M%ȅ1(3..sT4@Q]C=Ѿ*D= c/ԘPR1X1 \55tv; e+x=-6C{ba1D#u- 6()6( .I- 9 t a5yqě'uZ2J !o#](.t>BJ#R{";[.n=b6. ا=:'Гxb3!'aJ "x 5FʡQ\[UZJ%Rmwւ1e-eg`H.z\vέ9C_Rb4! Dvi UJ gC!HDTrjМ>8VB H5 -r,IQMPYN +pK֤W۽ +To=h@or +4fRH MjK2BP4(5-f'kv\۾A5AaA^3OQIO[\$)]f8tWG +pK 7c.aLn"h8:rf fs +fNt7Wp0*^kL!EaN8RVW zECbd_Fbcg5@MZ6i-1D̐ +v-tbV<_x[xƔTmmhţp-6;#YH  `5k֜VqP^/WgbSXS 9$pbw&{4\W{'JnCX؀GNq 6$!.&^QT[i3QĨ2NCed1uo#߁*qpHZxA Bs)zV!V!'"CF`lro")Q@o Q$ 5h3}Ƞw뭨 V2˫ݘ52֔DAHtcCIhJP~kUh +4H-Al!R CQjBxDt;F$( /KsϺv7hG1uo_,L>}EP,TB  4@M QA!ԇCm7ѐR>d8J t$\ nog8"q=Aۑ=N +H!&z pSzNFTtJJI9XX9OV/V#Hcy+JWi=ȅ,k.,LEN\J;;t'QQLE(e#y hRH,r;Hcҹj7b^5H9ĩ5 Qn@ Q1` +ŀynR|XH l4R9{i;9@hZw]٘xB@̡ _P)4xwx29#L) 0L-׎ @(`]"]^F]/E*v5@#g8GL*ydIF7ka⼤;_91‘%IvSIyI,SRM*H,o븛XH<4ɂ%|# j 0V\?ෞZIZ*`)%S()b<1 E,@DElوDl#ǑI\"D"ЈDL1Y U&y0Y\%QbaX KZccĮ1NbJbbb 1r'8C9;E$vClQ!FotbA-@}RU˿DW$a(+ovؒoQiAaTa aL}aAi^k &4cW FJ$wĨn9>.J A\c W]1+דH,a'aaza|aiaq0}GȘ<Ǯb:20QO[ZG6RvL"Ok7(se|WJF6%KA^GTTR3 pXjSSUrDs-;JHiZk8b $pF6: >+uQ)ZxW yK]25̣ej e5(d +MV2""ZJ$XjN,m;r'\!+.Ik}s$9~t7,HV %&/Ó. @ dI $4@28\6C?686wb"mkc8/L1cO8 aާ@7v 2_r\!|IQP=k)Gq[xARM(Q j1ZߣA2M0%]8wUÂ+ )+ + O!i.lNX@I,|]|-s@H '`&Io\|,$vUjV㢘SA7Wz/{F"P\t'|x95f8Ҙ.i:<=Xwz5o5ӕD~ ?FWjBU2oTPV-M;Z,ޯUU&, GMɤ>1 +Ty}:jy`ФQNq#b>)A- $Y#aHχ @]]Ale/]ح7sC625B&"*"7rh )ʇ;C bMDēQُQTH~A^P5a? +қ ir +(GՔ^*u0leZsrzݫ+GE& +2hy c%΅v?1yTQFidE)>IN2ȇW@!|L(2ЁtiH + me1(ZA5[2J`u 9#%j'_FN,!ސ;7$4[kMQ^ΣV$my;X,<'QȈDAOgkS1DdL7:0X  \S̑aR:s Aڎ!M(XR(Аj z-82kkx 90}r-[2 +$JCQL(Z]wM&ssJYf^s=yޕ-.n( hV9^^)jc#Af{gm QjaQA+}I-蠐*O3[Z2|5ֈ4 +FgR3z?BJF +jFcFJlF)DusxmzƆ[dg+N躥IJ:D~c&NW C-ш¸<.rN.LHp^u)9MC¸ MAYO+U~UWFHޥ%t~p&ᆽbnm ^2Bi+ &Eі=a%04Zyۓ1;@,]}rSqa-fy ˀtRo; eL062B[jw* <:rrńYИـw^3!u:krEg?"&5q$k\b{w) Y$tڢtMe7Vm  )ǃ1(ϦA HZ$*:HoہP q3k +bhҍ&+b`M HE\!Ɍη輐La1 'V̹I!/,rAh4Z';P-'{TQ1ޔ~c^焇䪉G"gÄ+z$hҶp'OJV2jusCfPtoz<e]=N(AdBcz#X7K +QPgO `?(*)ՒUH늩S9t!`lwc1,t)s̭w6,"/WǏM\LEGYCxH] xcԊ\#CF۽ t߼HWTo4xM D ĔOaZM! ج&LLo-&uF/E^V;FR==?Slaѥ; +%ykY}Zق(9mP Fh岻MVrϧ⟈ Z4Ak,|#iYIc +ӽieꨧI@6|N.Y^$5|Dd}E( B](؝:j$ԑ>\0Apy#tD<'+6o6Jl qmb<1XքK +K +b +4bh7?@1<k06Mdr{7Rh,g +G(j: T MbqjT=_&MrdXA̔=@,w) F +r;h2 slG; 0X{@tS ff!.aًEȗT&ŧEWloąQxcza=2k;ȇ}ZLJx +a0Ju@SXI?̄9F>^ ǐ2l\p2`o+Ĉڄm3혭]fjzzX4{ت'ahQk (!F),;!됥;h0ep1+Pd$ژ)H4pC2l ?m u/#`ҝKtZpUܷvL{%GdFgf{f}cw YŔj*:j4@z44lZ2m88 np 3+>>1|aObd Xb>VO[0 +8_áz@2J2RXRp +Cա4*_ѦIR ҧ#NY՝b]Şiǩ 2Sv4"({`NZ$ҊR [i`n㬶Yd@>0|PRCS&"Lr`_i;[poBبG2'1ɣ-\L[# y=P W"241!fTEzvIƥV18|Q\.*)'P7D>]gqb V](/p:U f/,@!iMI ?hy 8o |y %, +<ͫDoQ#Z<׊^3YO /4Nk2)A+0xXqlK_2" ˱(ʆΦz +!*oA"ƥC%0 2Lb%DjPJԗG9$564jZP!5pJiؐD}pDP}0r-`z*y7aH5𓈫P0 {̘i!4H5" g;~B K11$UT\UhΨ55@71#0rbHʾ'%MIrI 5 SP%b0ֲӯnh(&8D=a +ƹ3é!1FԚ!?M˔ƞa= PL Ka *A?'G2|EFy)dephfm,cD1)$0:MhWOIL{\0^SjHffX !"^BnMWLt)|є0} 6k(Q1Me~htrjV|uVĔ2:*HG0zZfJ,Z۾6G+JӃUI䮏 +hbp\k2eVIR@Z&IY%gKLTPqRVq0U 2 r3k1y`@kےi_pp*0/jkݣ(G*JQ"+M$cG +vdžBcuBXHQb.Qeօzמ. 4mfZROĥ{~qRj?O^Xl<55: gc*,6O~g8:H>BfUrfgwV  q<0m9idRo pJ`Bm BUsgZF[_t|[`ZO^c +[4GR&_u8zd&ƥ zzH=;?lz0Qf'3dQV'GGE˃h̭Ҫ*H#W^xB )< @ń"521PhB>3B00fPV;N;ޓ; #Ӗi=i)0sGEi{yr%UH\d6|tCMv$"JP '|SmgP>Nߍ'%kN}@.q\2a+HT1hr($~7 G!NRf̑4<|beZ ; ԢQGeBQϣ]$JrObJnJԚБ7@\~A0`.euaMօP.x"MJ +YlM4@@G L6ejNewSÕh 'hcY +w+-Tx +Mۇ}pc&b1^Ͱإa1Xra,ä́fӲX ,Z;+Y +vq}  Emf/(_QՑ)r<*+(̤ۤXĤHEi7J6,$vV"[$:/irK-*g-q!yN*]/#cb1rؚ&gj-.[+͔WPH~LX\2e')TZ2&FI.K8Rb&SbzSb)UC)1uX%JLZK Z.r̲ [2(|h!Bq*!{N1.Ѫ(Ȍ ` LRMLtbC< F,G̐00W!`:&%肀eWJH~]u*˙QQR}X!00 ݁X@, ]Hc$>#amA"ɷb+A(Zb-"B5pL +9נU&xDĥ=RaaZ0?, ?Lg0+/CUއݣ'uX+Z3n2eual&T&~kDDk{J1B͊t8O1q0^gQ X;UB6X&JͲLTA&ҩ &aj3/hdjNּ'P8fTNVՍP Bu8> ʠ5RpᒑyyV)+beխ~R+qXWm dA6 6 Px;n$Mݹ<^**N2rBrCAN@;."C2s20U|t. ydBֻi#!h7h_ 4[!؜/9\ɬI; JuJyD{z>uC_z`P-&l{^f);2?Wfg%TH.N}-058Oj$qB\ ixh?[9hO/Sߤ@ǧŁ Ӈhc1- ltV+[*nMVhT@LhDke:#1N*' @6]#)Al&R 25]V7C^='0?ǵ?GP2$Pg)fMjr UPCQ p9Cx:rG?a Ş̼D=`3!di8#L<ƣ"i4(~(^*BMYo~πT)PaA +\ON^Ȧcy0/-hORӊVA7SgnJK.*!3F Tl悫P4} ~(NhX= +%p@b zA¯b`EǮFˁ7 ={XWr1f(h4!}]*C B,勱ex12Udj8bBqAhEJ &vgD蒕hPc:f&p=廿.P^f,L>E _& RVFBB((O@6Q9*:q:\ۓT}(P4JP 52γIfRw~;ho"k5VE| +Pc GU)cOD{wIʉE(fuMizLrŘgT=*UIi +!&Yb'DBo9͎-a W[B%y03.\ڪ80jZiP mx@b0 z1H7 P0,^C\Ip"J#/%_Q,-܋zg89"DECS׭ū/^hc`r. yXyxN̽7* +IE4@qnVÆD.?<۝R% +-";hd́Ԩأ bw8({'K6 $(Q/& [1j; }q szJЧ&%h\,K(j (h%$;i$G\Jݛ0k̟(!4xjq@+LŬx4@ M.JES․TiսulN|S(IiӑS%JS 4ͩmؽ5 -sx@\.5QN%4m9VӪ hzrWOp(Zw[L-[p^`bw +}!iX,X18{rb<9rA81{*N$@819ԛX蘘a\ng@f.-0 )=NZ"C뫼=pU + h X-C hQG5`$lBJ Ԁ#0X%$u+!.$VXH>=$v:$&>Bb%Bb!C<_2*Jų!{{ey54X NxGcabDKj`QEUȩ E5"3B"VDAru#bTd!q/rtZtLsHbW 靷y>8EЈm(5"=({rtf&∨Al$x b3v;ĸX ZT2 Fy~NPYPς8?k0kdcx5)KҜ P(Ȋd:OOblӇi(s$ AN92sm;dЇ@Nd  Osًc @AxwaOE oV͡(]sMf'.J\1b \!E]#O* .i,!FcglV[dR~UcIp + ׹B|) +IґJ +on!Mܬȫ%$,|)~V}"t1**ut}<-㣏sN"!}0J)TĠG6@[xa&aMZMdېݒsR#ٱ8+^񴵇T>Q꾇9_-8 ~1h%͆h?4ObSח%!`g@HHȄ8'H +Zt;Վ(qJeZtzuz :\~iJ @(ʀ B >8E EC,HF]Z&Wc~TXxy.,0Z*" G5}XEXwjZa3@擴052 JX!LKOX3⎎,wT &5@4edrRQfuzB&dcW<( ~QOCYd6"҇;|]0@n5gfT4>7RA L +X"HFc+,*̄fhlTZTevD @̚@ZD<^Ij`óċb/f@ċ'V%5.t& Dr4$WNc^_rVbCm.]δPE6dJR$RAj; 7&N+'}G8qM$vc ;XM4! T 48؈nX0.ҧ .#S{Pc5Q-sCm)؊C[jDT)DB YbԅCRmEϣ%"IJM])hFs4Z bӥ Ofdq]OJa`7o( L p{9٘2ZWg]4:pʎs")wh&! +L"r0be =g[ + yT™t%ZB'aBD% RHOKNatc15@p Yp$YLS[zX̂ T + *AV=]BP3.^If1(ksTi!"b̚kՓ8]ȷCxvF12ē“*K'AU!DwZұSWoSi&$ h5McΥUZAiO +en.I\CH}''$gxғ0E&A5z! X;\2^Ex."8)3R Hm}pP᪆zcU$? a''nmkO^ .Q4@ի#xu% B2焅14)Q!vZ[6c=iA2Q"1{ FMU,TpCTdF Bݧ2-bJzr:O1D>;eLB2B1|ѲBȨ!'<' %5oRN룸*p +%U'VmkJ VT62 +?t4åchY7\L9':"̛ LZ}Pi2Nk9u$V$sEBu +[RuV& fui|6G~ hM-۪3ڦR\M>+pս^ҟ"dampxZˆijJF1RL1ژFet (;NH+1!p.w9H*r*Jd:L8MN. D'N *"^w!~a=Fނ/άe|JۂצxV<$x3R8%M&yנMTsS7 +;%]o],[P"u QBZ/x`N9? YLYn +5@st^:`jb*)JŤ53TyKc oL=~LbLB c+ތXRdir'BD< +WqEP֫3W-/%)FdP2H^Dzm|7 z/TG^\;z=?Sa=(QjdXյQODy#5OJĬ&̜ͶiGCrj#]> A nW-J<24~wV>Sūan_>OMDkJq<[lEFg-xґڰdU:`n̐z2fԱh8Ȕ)5N:R@R7OD1k)0-*{%/Wug,XJ'φUb]d-z[ (#M#ab^hiCo<jqk#XZ\[,6PXlXV=RJD0U:|IXҁAYi3'r:镰FiS&RC6X_~%x%(x%k\|],| +:0 ~T)`&ϣeuv"VT] WHPaB~^C\aE*n&-dbXK$v d68D01 cҋB +-VӲ1T ّl2*(0;GcC#t\0TjZ$A`NGȋ"Y;i(DB0 rh" 1\flV{-vȂ]MH́s̘f)=YW#Cb6GQ%%CDAׅudB+ .@I"s>%xe81TXT<\=5QZ>[AEݦ"˫.ȩ`3Ypeh9Y ,L)|Kb2@A +iʑu>p+rc70(1&J9J21gTnFkFt)b%&+HxΗHGQlt XU-vze6ջAV-It$ 列28*gyIeJ'᠁S)LȤ @.6\@(ޘJ6`>~QyxWf64+4dagɤn")&P **Y V HV=|EU`BDz8(2}5x찒#MP^:H9!DpalHRw~&c<&TDbcx+"%hX5D,VXOm,qxXPLZoH2p2.Mr*mCYߐв^NlzۀPBiovHd]t#ט"rf<0/-uܖpnB<8Q¸/vG?l.RfI>!򋓂F)@FP$f'}0|ݯj υ ѾҘX^9 _ypY#𶂔@R3 #Pe%IlYE3qǖ䢹RS]0%"ƷQHZE̴̎$x$Z8K1&6?rI%/BIblg@Z.z"iQ"mDHRڴ_vC8q,4@0B O L8k[HF:-%ggy]7X [좗~\$k%6 bU:͙F +ka)oԯ`tbpaѱWBc6CC~ƽ&8M`YagȀ"%~~yf6q^<4H!\La0UuÅllpoTh 6 +1 +H7hs`;Z ~"WoP7VsH^ IE$ oaC`$@w;iN]SgtBI,m;ʎG87wǫкy=R!L8 6.Fٓ/vN2doc[]0_s< ލQP'NU"O$ThW.jyHTaH'DIE$ +HĄg/BC/q@4HLVn^Oj1_Bx%e2#PӏyGxR/g/,NO唇"Cs&1իïV*}eWL1)W>J3d yWGR"7C]lxXojlq )Aun nSLjq<)F< +{!"/(Wi'cF'K%J~'evJPɌM Q*h>_83P +;_%IhM 8eNT*CT@O:Lô|e?k*A?@1 + iv2*#HO(QR2W%?Pʈ6L hZpJf*H=)rOL SuRuQ#U~Zի{cVi,ty["jk'p./R7i)VbL1lYCo_>LK5鴽1s1-K}mfb_abCbɤ`Ӣol1 aIx &T61!Mav=bţbNexbb4_희^؍We*F>Zbb# 9M%^dC{ĝ$em)O"ŬB11sB1ƄbΞH(f!PLFhPɠ$(b(VI(h' '`MNl0NTTBN@遲{M gFMЊƁf"#&Fw&&fLL /HLq@SpE`b/31L̰J2`\ *&= )'fKoCs uQI~H&@SkIC.1T,(1jQb^bSbRb)wJ$wJr┘#)E)t(1(K%cE^Ky#iFԗ%!& +qZ4fʼnἔuVy ii RzPYA˼0I+`=A+`ʠMAST֞Y+LPJ#їJ,Xk߲u{!wB儙ۦ@Lbu0hn%,BI +$ $FVK1^Mb`'"Bb1BbhNbӃx.&~S +N$ Cx{  ᚭQPY0b6b7b/jFL#FB#VQ[$ o$]E"kBDӈAھ[(tԩ3*ѳBiV:Sz$!T*8[T;:ggpӫeN23 $h!"$ ࠠ0 IDC`S(f@J:r A `B60B e&Pq{+;,ׁ1շI?^^6HHƛ?Zcj=@ܬW3C +6ְ]=>ST^uvʪccyp3ɱ"K*eRÆG`Hs;.Qla_ج<.S %ca7dKNlp2&vUF%2=MZVi~6MRV/QH<2&`^sTJgy?UxFr@E_6\5>@k㹥p{}%a 3Xֱw{V16yn%y17VO W~-v! Hvnm))X'˧K/cX >fLdv[͊a\5aL(p䎡Q]9; 0ë1,{}*b &ږ]շѧu;qq4L$T'=9 !I];;p}Ud^a{: }O3|!b1iGxLY2jbY<뉇IIIY܇gؒ23-4Eg&lIJՉtXS;s}Tk0!S4 D5"eyJkUqΊ`5l٦oOzH#O/E\ O6j+#G*9J&Gr̄+d\1MLu!T&tWg(M_N!h_d?IUp4#EC2 ,Zgv }WǜphN%bh_ MraB_AcT4YSlYzL|⬺lDJNja-xېP1K67~z8k ZT+ac~hgWN+GhϐXbWs-cNr@P;-3NuҤ[rF Vוn+ޡ!h1J^1{{#TNֈR_^*kY.Fd>GF*4`pq dDE vFc:)P0E `Fr⯙3m귋fpY&=6ma㯖^Khp#hSȬ0BA5-~ËB@CП `b%VVmo)skVv r4oq{vCS~m%Xm`*eEzC~XBo pɍB5V\9=S evTl+31ku<7rQz:^\R^ â`5}辚8kT+/~k۾Je֢E!lhZGjye)oiX]P_ER3I s 8 vWCS6&-B{w+tdzo3ciqEL~]{xǀ|6f.W +fA^ɔ+P$ ,Rdd Ǽ҆rleF=W=`2=&tz QC- 2K8շ7~mA + m l6nN/p~smI+9A6w:CLG^H[g8DFb^; {xЫP}cM!:pYV`fe~ Tc[|BG5O,!z5^\r+n/ZsaQz C䨐\`+p"q֊ _aLշeߺY0cO0@(6ssT߶COJsXmȃI[ezP  LzU$ A(\x3+ ēf{0pAZ7 6n:އ+F$#{ěX{xX^X'T[Tevq0/cܪwyO:tfiMnw&!dtN&?uǢx0++^Bi+ OviI~ZB< >^?}2zϺm֒7wyKS<&4$ i[wlc+Y&vEtb m?j\p4xA^PRT +qqUD*qR$BYжMշ*`Tv y߽H6 KRo_ෆ!ca\k!mCz l9goj0jlj8J=C +F"OǓ a! ]cC%% M$%f-(""V& +0q] nqe}ϢARiMh:-E7jS.l2$/T=*҉!e|:a}md~c!T%;܍bz2[+ Ѭ&W^*Fyj^4@@M[ZGw Z_4[W'ރ%h.WijA_4K"ZA!!AK}Pv`<#2Jp:Y nk {"S}[-sط@ڷu`^\.֯- BaBBVT6j&!#^?#9 +vh&ȥ2:4#`ɻĠܥm kd+EQR\5:`L ARS{LCP$CC *d;5 3БCJ\vL["0F$̕iMF@d9Kn(BΞYuFhK jqH& ůO *e$rs$CE w!3齈>^bh&+MC. F&/36R)P* Mkw!φṙ)Ѣ< T}E-oB:=gXET߶τE)Vbʴ+Ї/]GVc +\xP"v&Mk)]nϜ۴skyfARxc!k:}[岦u<]g$x15û?G,j-q0 8$mQj <zMbIjG r@a-v֢wKR?D+&  ҵgNvpЅ +54BtQR\4~qoI* Rɨ]°ES<* mVR LV-)sط;ҷRX0`:ߢ`Y@Dn%5JC{@AB#D~ h\ˊmUN{FCDm:Gi QB0C͢9ٷ-N#> 0HnKתOACFjc] XJ7`c`%L8?Xx&PhcXainR+,ŕidLnWMin46 nXSN@ 1Y =\xVr9X?mN S}fx[Tߦ+AHHˀEaxb2hplҞOliBY-$t5eMϡi4I60k-21oo>4M"KXB߰EKkA5UK`ۃ78D(Aچҷ(۞publBZfv@\طmRrP@v}۵^*nē75G[ڌzp&dq"8 ث㯐6? 犍&ofyG3%Ĉm;DT߆b TES&i JQvr֖C9tѪ/ڈv&;Éb.{l&%]6D=Ml[i< a>lboǧ㱂?m$2ޓ^{qm;xAbA=e鮦 L^+U8Z9{}`o"*S6%7 ۢP ,ڧ4$TeINdwG^nU_@?p~$M4 + +x n"#JML]2[(aVF.lm(!T/ѓ@:km &%yOշ0\m ESG[*ɺv@ᓆ IܻAm{8%0(0ݢ n@zW'2W#u@ +V0ߜO v[ XV( 8E5b#oTƳk|%%Dl^LmW'Qz"ǯUmǪA#9"ZB4{K]]'8PRdOʞ0.Z<^=J?*?P%2.AEG'h5腮\aV$ǵ +@_rƪ0Pf b.QoAt`rJ?K@N^hIְHQs(cmգÙItSư 1nv֧7LMUv. 8 rO88$s[AM "ƹjS 7z D&DDX;o@- ?cf E ,%hmA*wᦫ}[R*DpWzh2]  ,AN` f ǵ%F{QҾj$ ~5/F .3"Q+ omTW͈t/`z#7ăfF>U{@9]i ܡ p ;U̵UOg{B"F{a{~7'K|TjFZ"}HOu(FXi4WuL",NR\8" +L<NKa9DgD4CݟKwRJ\%x qcܵeereE(E[Ps=0$ rl{@0EQь"(†DCmP|uS깑]+M|Z6 @-"iFlBj,@o#b;OzC\#*KRRv3x)UСh5YwQbB"g FZ6&MdI#oՄ)IIk5~tҐ[Zspz +Nh@q7L0" PF/$3QQ*jA!OMXHM I]5Vua{@g qsc Q1*ĶI`J1%GJ|Ve:gj6AT)u}1h)8m + @r d`, njۀcyEf)D&3ִ>'ʌdRXS~ٖyxJz%R}# `hԓcje9 ڒWq a[-h +endstream endobj 22 0 obj <>stream +aqJJ&E!e\0RIuڢJd9u:w*\kDj[2,dZ *fTPYvH8%ӕ2Q +K"Q0YL'T1cj1 9}@wTj#R{@ դb>c,&IhgJ.2&6%L>}-!֫\:0j@f4'X$Ynȭ:C9P%3z.hIjl^ͣeAh盀&L) +֊]-ip`Y Wm*eYug ] [2t`J*p&HKLQ 0ݵÛvo Ub.MpYST{0CnŤo + }{@pL4E tIT39 ˄N +HETp%ZAe?<D9|ܐؠ z  ^46c0hYaї&w~ +YWIO9PB(zn` +Q(\2—`Fn#ᆷ qD{6RJlCл2&V3$NPL+$jolm iܡ†P(GJ2 .R.sB1¼3AKG[8͍:v>>&r9wTSbOEBA!HEґɹ!1˔jaXMQaF'6x69St<빴<԰1QB*Q48SӑF +AJIN= uQsQQk.XҡBC%H$7zhf R'X\bF$z5J) 's,k iBRt8뫀jUUsfZFhݸF`y:Yd ZV5rY%I\ϱM^Fa= y^zͱD6-1-n4K =g0D_# +0D{ s3t9$V]7h%e@{>No-$F][txa[nN=FTJ-$7`no\!?~K <[߻b3Qޭ`P$Ҥ,R##$ߝ` n#c<';}EJ~cVR{q*} JJf`J/V/z4r5Ks 0^]L!M>_)(Z| +:pOih:Sqe4Ik +IhH^ c;UamP:G(,n( #%@t>oS*!q4E[PhwIS66_b],5{?bcl'YY z*[XR{]+A~zsC'۱M#"9#D>*"3A?)QˬE~"P7Xt5Σ̇a"")DLZO1 +BCqa4qߔF%%'R T 8v:s!|ȸ +1I/G12䈉k+%Q%Wuծ˵P_vVϩbWZj3C|UTB#ǕĿX 5 ^X܉"Pc7Ƚ!P p H<`ZːоHQBf↏ e#|:|PEOHJ$| ` (| +߆<2yoh#eQ`۳o$l#/(12glu9?ntP}cEmM$&N_@Rk4"K_}K Q}[^a߷$|L߻2![&/^]`ʥ +8^@Ji@  ZZVq6,jZ !`.2E`=`WE{ׂW{=9^Do׉GldDV+_siL{ƳR~*ll҄nqe +(= Hp7}g?ӿQOCPӿ<_B?ש)^f83!Bqq к҂xj^6G mO <I|hS&~uOt &TAF +! Z)19 33bB[5C,K<}UɅ`1 #FVM|RcqV_!x3>dߐG-L41$D䛭9Ĭ*typZGu= (.(Q6 H!2F"hCHT +MCWl*~E?\;@=gb\~)a_͒b־-3ऀ 2XN90F{@a)6Oym.=I᫷B4~Ib2wÃEK灄H&|~ +‡)F)~$ʧ̬ 6=V_0pz!AlE.dx4ƻ/ #N#2p b_) - ~@h~*4aT{d:CdX95|^Q`{x{@p#ċ" y͡'Z_}6|4_~g0*i|,6oa>{GKQiDs:oS +"0_qjBע^l`KQN Ò) +p,DGaY= ?L t7bGĪ#Me7UGRITq߃j`Ǎ6 VA-;e$M\+rd"6O,1fJ̒4$4V]?HkT"_oi^g%ߗyo_QG)t!˪'CV'!MÈB}.aClǖ9mġ8HOe4G8~x_{,J'}VdO=!"J;tuG7JtwRe>ē1c\'Ɲ. šLgxQƖ˫ ˸(1Lqug%Ut|&DbofPBo@`EYhb6T9EgJ!(QIݲDv(R$n% \bqNSgѹLXF9{@paIOebG1}I ek +Dg)@BhH%s)?kN;=j|Mj˫@%!E0iԳć +X +]=6) R DC)FFCȌ$ +Y"U&nfe1Qp KdK#՗)YsV) +Ҩϔ3QSsBM͝f0u̓[C%6,,dہCQSeޓ+t*oV 6~d4Hڂr)Kի'kB^b#N6@A&tBAN= NoHQxu]Z* u\\"m0%4e+ލ;cs/ׂ'Id#Nbb-2U ]IuDa4 -ݘn;iDBkdI=HaOIh{@0rhMq>˱@+LxR@g+ =ŕy PuV@kmiaObiIw*kXTUcC۔!A9e. hzP%4d"!ppB-LfūjrZĜ;(qlLD5V3ܐ%%BEӾlMq+"#^q=xݷA17aÀ} "*PPǑn9$^807a(AvQ)+*3 &ldHeJTPaQfTlQ`X݄JL,w@d_݀+i΁f3/ZC`ټ7rŗD)v[c@{@YP¨K/&+Ȩ{hD +Ry͓OI2bQ(f(lC^&Eʅ9-T+3FkZ؁nGT{@ G:aw~)4y4A57w],DYsdpˊ1ؗ5d`}6\nB#4d̃@TBWEqS%*z1}!ؔQ7\τr(3֠`d^, Jƨ7)O[3n#.(5:2BQc:)fVNDS7l|&Pw\)EK @18ʬ12ԩ̸PS&`D5֔PϰE(N2j9 ^:5xZ?3kp8z@DgrnyZObXP')='Q#EfsKl$mPӖţsևt=8q +[Dk2V\BB"Q*QMHՅUfh$"3֠pEJ,X4 +ijnU),k_IyBڜB8*_@S~VkRraygkuFBa]5pM= 4H9!f a6V\Y*%S5KiZ+Vu^'Myj2f+]h  ~=c6-3:&G^402"3P-v&mݹO93 +Xū}nR>jeXj E"B;'$d2=Z܉^(W5>g5 +Wu RJbb{@4THvradD3"cpL ~=IA>LtEcO; AP'|'=lY4RQn/Z.|$f~.=qm=pרmj!+ĹBo\(|-@+wd{ fN*(BqL5kLR!N S\rg|w*$srSQֱiDY=Nb (;B3>@m|H $}w3J~$ߓ8ɟ^C_8fL +ҳ|/y"fz0͛.iQ&aG<2394ɝI"ߝ"Ae' <%>#L:LM|&|q.tQ{-c^Mpuo+5j= 2$; }d10xL2DR8e-Nv?YE,+ QG,|/^z(XkAFOقAL[Yח8`zHT])Tv2 t]ef'1J-%_^R +>,d'|)O jAA^I wə6]Φ< 'xK9_è' ! f9!<C +5@SyE@O)JXĖ  OOSH4G΄Qe2zGP&*Q`*[&_tkH9 ֧4:B%I*g 64y\2L[Rc`ڱR:7,b>EAL ú b&B AŨ^ C)/\ ?._D`ɥ;0 38ՊsBQ$Y/VV_jSಒ=hws ibt*vK,$و?qYkUd͛2YYldb$ƋE-pҍw&pЍ BZ?TJ-)׳Jx͋De[ ֊#ra(?,Z{C6Omt`ݟ .0_)qHR/LG'~$}jͅl0=l +z;%@czCrwyyT`7rZfYIl +A)cy)E+= V46}!*y . {ҭx?}稐I{@@g |kB$#}1J;Ht 7"4Ը<'T$mc?8`<>sXoxOv0rU*R;9&]yDbobPå&:]eNtwvo.UfgZYrVl6CEǭLHRۃ3}ܿxjTyVV̩ FQ?戬yApcu%5J(o.zbjl^a`ܾ{[m9P7&JzDbO*% +(>B^!"FrZz鉱c9+e%2k9FPf3 J YYH

y{чYs< !%z.= aѦ$]L6NkH9Xل8ö>~~!.̔X\\0CdGy͊sZ=B3y,7+}r/p9RGdH dpyqN*qDa ]ULb:)c}Ybkfڲe LJ[AE#3TK\2&|ElnJiWRb*JwPK#|478O ޾YyS,z@P-c\m z%Y H#qlЬr N4/std8ȧ-&Ʀt9X\FNk?B=~MMF1֑XgTe|&,)0CnƔ); o.E 2ź쌉eXa:Z>1†0f[FnFdvHv +gœ{qI$x yͽP:~#S/Y<SFTZ?R׾snm 4g^8U:6nRv@6OK*o$01:DCUp84QGZi2 +q繁#TɁoHAb^J!2NʋX.>'R>zlJB-lt 6 !\LW3a97 &nzOMp%VnTRK}7N> F!vGf\K"IWl޼Ɂ8= ?JA= A'Dz@= ƒ/w *9[a<)r{"sVL=YbvkTTB&R}3nUDWgmb.>+pˆ0Pr"&"F}.3RcԿ Es̤ DIu͎hV[7c,`VJDɴi E*E?6W +TO(>S}PK)3' +ì35!q!uq<ҦP ٽO(D_s&3n`* D_b!p w-}po# +_3ȨS*XBPKyD` |'F|_ph_f!X>%Ôupq#ʘϗ_ 5^h ДX[vU1 xʏPu :@$H2SBkfw4F51&ܠwm4Q ϰHt ITSQ * sp뒍^#)T_X* 4dҙCV)gioP ^Z׽1}Vxd],zj="r].HDPF?ČJuj- +&BI=LjHe,<&Ix[VvzӽgCgs6̳qUvjJ;fH\Igj6Zygy6% T4P 4,FՅRFm ]x*SCƇJ*IH*H*R*YD76:ib64"jEj5,xlƑLaK Mt}{UG0ha3jF͸ApͨQx}V(=J:B*Hydzؙp2ef٤\e\f1ptbT{@7{C"h^zuV7j!0(ǝR2Y 6#i`udh XP6\ 㥸TUʩb`tl !Ym3ϼ.<Œ.a1pc/!QMw"e31m l*0/ +v{@@0nC^; +,a5S6cڠ޽+ Խx= 8Kig#G1DSpjOš; EL.U菃q8䟭U֪|!b~Õ _&D tYdVig9V +AJPKKB\lh$+^г"u+z6TZI =ܤ ܄jiNaAHυn&6XSHFB-D q:3!љWTUJ Bo:6h*]iR4̛)3C^* 6lce1Ũ0]l#2cJSTJT+72g:6Mn:m76p$R)&Ӣ)2'_ +, nWl=+1 ^ +q=H;fz"j М #Q?1 [6 F`3!1f#*9¸ѡҚ Q$dO4D mhe`J5G_LA7 m\Iea06JmZF̄DŽvCu*@TJ쪦ܘ\K7ҼN6ص>ZQQ3PD$&ԶR.cs$VӃRa BFTU*0 +f9a:BꙝGDxO.5fD< + \ Bp%HyvgﴤZDHaq8.<`ܤZfr`౎NØtT@]= (UT;!]N$ z% sVhwV(c).ۻI$`Ş 8st2.FS充16:3!1i=o= e)\@n#id`c]*~̧Y¼5p>m p1A= X nxmngg_({hpQ#ZR5HV.aP'4AL&J!O\xk}(sMHv^yp-FU4!LTmv 50 q$v &+fiAvlESFd4 U bR͈PqptbAŌD2[ZhPXHah:1 l|khp6b!iF#BNi z/T.^#_4Y|)vDFk$X7.zfz@ FF!ΣΩHǦLd8U"m Th6AU1I8FJNo] +1 + A:*T!۽T+}~ŨM Lxz@P>v_R)jRDZ1SVP7 +{SYrZ_6= 5Lȃ;?aXEP)dlC|2"jeEEaSI0cI4 j‡JeSxΤKNmϓ^ĀXPZR8r=-".#8ꘓbf҆aVod/L@ ܄DA9IMPfRu!b(@D$u(נ{qA*]敥1Ӣj$jWHVCӡ)p.iwC$zVx\@J`-!6.ԪEB֣1w~汖B|*X_ IfᰙZ$A^)Uxj$u['\+$hDԸb|CuAZ#[ Z"*8d3V-Q91-9*Bƫ i9},|GgR~p#TX W| َCOhS &Rv:IE#J\OsR9<2WwY*&;~Pa|:y ќhM,M%"/6ê[y"6a!Mm& ȵp9DSӤ|eR +Vj7@(,r`Rg27$ZoN7gҹ]S1-=\&2b{? aC9 20Ģ>I.@2F*0(.6@ rGQ9)$t+4y {Qт_lv PsJD'4(tAkkN5X'7T ^/@IVhBq<1<p汋QaNRR"LI`}x42MY"Yo*ڙ' dAT]8̡"ţ~}DKX%Cjh۽;q-6<sOVY4 drO(A͠K2' +S3eqUVD3PϛR77U$e4ݝ;8 QhܱÝUGͱFK@Cʏ"Dz&5?f"qq;] mr7X]WUb"eO&% ̱S s^[aUJX'M]pk'ҁ/< %Y\y)VÖNYوB rE\nE\ܦ&Md`< qÅkl74ϊizB(Ie"(gl1E~_p):-" 4d|l; D2!V;>!4jnrZMW_ROyS!N +/$=~b 7L|f3{'.#4eμHGZ~1/۸% q؀9M#t7A3YB߫9εIY)Jf*<+tϻSx喃-Ow%c@VtE29i᠗Ԗ٥U&7 Ih)zb&SZqUxzdd "gٗ[}SW3Hw\x +R|z U +.='J~P8+n*T%`󊵘Yi ?"_u$ĴJ擰VϠHe1{(UqcPveB4Eeq ^^vj,d> vSc1csƭ%t3@^ .XڧÏ{meG#FcMW``ˋ|wW TFwn +.FV.MG?] i#Wf&P!d҄ +֐ ,u[%G$^v09 Ix^r@Rބ+M΢!ŎS9Hژ\Upt40YPsdk,g@DxaבJ-1y]s&=dJ!.5q#Q)q0@b8\, :Nk,%gӤ5;ٰh .B<䀜Dc"!]T:$p?w_6My>Hδ3Ѱ8= `1_M &n(b,3bFup`/[\4z 1qu%"Zdwrxh1[B`Y@rl= +xʮ +*@#g;mx& ޥhќ2k>[[ɺy *NNZ &ܡ9-̠UPݩ)z܂[qXݷtOs;ݾh+lA`!n ˌy;[0Bf`QYF>0,ֱU!ɂKN}}0P 'IQ8Se.ڣ ZP=ZZP,+>&hwf0XWHfiyW)Ƒ&}]ۏO~s_/a>^N:$qفY? [Ɨ 5xϡl:ArOՕܧGE¿?F\8c!kL;y*)}eql Y$ˍG)FVEm0 B> +lٛXOXnOr܆bbKK._&z檽٨ĜHDe h6NyXhmv/'? +qg_|=侕Rg.'W X=Y&9hjc $2\)Zb%}FX~}aJfk$g^2Cy*_Ø憻 hr.~/qz}r|3H w/K{3>GXB|q-wﵜ7ne5 cg"U@uh\g{}¦06]bh0ux8<-!%ހop.MT8<_lCxfbii9q^pfj-ivp'~ʂɄu$3μ#_&/j{,5Pq +˔8Ajڬ|Rkɴ3 Rzig&/5`mAX]FLM*RNMӕqt,, [r!vـ*x$B2f yb}583riN\t6̉EɿeJ7'EqrNㇿpi-Ӧ@#1%1;N% tcŏaO3!뎃 ǦX 87w'*n#OifD[/ I%AlzNL TIZfhiL<';&EE^|z#Yμ(DO-8%f-\[E0` 3MX]Ɯ.M15,SkZCQ_ +T%;z!`)*^/ekq]-Ž͍Y"Wng9\@ +\+'?D8<ɸxc #@ΠnlDs\a љw<8b6l;"]AL#xI$ӓ({ æsgJXh$8({.i ]%oC,"N7\B"xQG{O% y!1oVtbA1S[P2iۘ%s;1o'쳃R[ ɨi^_έC/z>vNM YeJsx$=`rӼLjha80*~?&o{m\x#0pu.o@"!|=a|a_[4{HFWTr'S]5 +$>I4=! UFK5P.ZZYF?+|ш&f0/Thve Ek-hƷhw/O 2Ӗn^I>_t" }ѹr3*RA`~ѧ.T$/p*e4k華eQ#m2W_t*_t͖p'}h PvDdZFЋFuTVd3^f;h"@)'asNfEuWU-A '1^%1f@4%.b#ekc4 1jO:p?[#J>] ̿hG#L\o6$"D5p@tYȳ=ݖ^Tn\2߲f2td"̑K1^R.72)D&|HD5<+@J 36̻T x`YCG/Җ |dD3 頦ߕ[jwXJx]҃mv dOL>^!;cRd+I^r`]?/έ$cdzhpݗ2uA;M!eYS)iYD95ɰ+=^2pc+z1M{M:7|P}7Jls3U|?쩓?R5F(Qs(Ee$RK>fN{8O:Xgl#>Q>4~c_-nֻ-a)ˠIQC%58$Z[Wr{NЕo/>U!p,eif'ɕ$z[], x Ϲ"`sK0ͪ(.ۈG 8P;e.@柍@wDاevW0Qa"[ G63-Z  T" +jU95Th+&W´>I-T_tji;q"ң T=L3 +kKx6/s?0] KO>9iT%`Z\*tމʦ_vɀE] [ E&&U +\G i@ o Qqds꠩饴GzL={ +/tm[XYdԚeI^z_(R窣${ϵ@C`}ѝ2t*E\xHpoH_IZ˰#W[/gwN#dG,Z (P0KZ0[ÝbHHa(/u,E|9y ]]ZXemΖhoVWe.sɾsZG 9J*Ch$j"0~M=] +/+*kMv6|',BcϦN9rigG 0(S +棩TE}isA~T|UĊ0?EtxqmqV:+5?M.LO68Dj\moB${ǝlGq }X.mDs5S=(-R{CwNܳ/6mp<=0rJ/UDq4a$LJ%vj73 Ł,i[Y/: b%Y!L fEn@EdjlxUa 9Iӓ&7NwD(ؿwCzF#30FH1ޥ36'aE Ӿ&D|߹L!#gVxSQ`$^0E݌'0j˥Q>'t03b:~y>hj!K*MR.;r"d!?&#77a&Kϓ0܌暤}V&q+¹?Rb9)t$ޚ59>۬1VNOu,ԃ6Fg?lQ&KN&̥x x2UYө.ы|g2$V_g0d͒,M-J +WK8'63cfM}g g/he7ge +.Pu;Qa b8с9-R%_]7;H:m̟{1D_; GM̄FABj*Z-`gڏi$TэK>ϝDj "·[޴6dKHl`CwBgȰC73j!|FF2ɬВh<4+ދLpjU1'<ԽO$xVJQ$<>?(UJ [aѣz\ #M)yry\IY/(tLŒ*!aJA<-x= I`T0TdṾU!06UCI#.Lzhr/g5"j٬7%k:E +Ym` 72 +&g:N4oĩ}`Z +6s ++QAӐ{P*HY`ђ؃1z(o'E 6M4{JnpŊVV_9o lCw=v^ę3B10K$Ah,zM5@u5m3z`m?}x"6tɶsN6ͬw<ӵf#{c~h@O`_lN?,}SwK{^(l@YU+o$'UPD]ڼƧT!e7TT lhe W=K/ +S`U=aGV 619Sj}MDLuk'uޯi)`rM5C^i n3 w"+ u<֯y>'!V ߀y@(-a o"_d9|"6AM =\MIVf睸Oȯ|BD,KQ *MK|N}RZԌ.Aed@8~'K+,%Ba) 3I0sK w3!M>Y 5AT6f7@pN^P$&SxTPA\y|(3* (r#] +hvާkR{1S= 6,4VDFpޔIy|J.PKv-WXѦ wrШRraSĜMd=5>CkNhsF_mk0A'}qe@ro 8slJRsP џQBpS8;Gq(Xqdo )7#Ōj8$_J0l .=$#ѕڡ d0ALL=<"Iކh/568 " K9ޓCokLZbUPύ,(5jϕ{CEeL{%f! ;MoAJR5w:rW-(r82wUUO}5Ǩi/^VWk'QP gm4BHVA} ϕQRhǝ(}gYKMyr{iSR*0r@͢Oו J&'*WgF CveRi3x߉'~ ?L: v[FW[Di\:̴`%[s֎Sϩ \21z Z>[ |1/fAWĆ GݗD0wThP CИ1P<C^9P0~ +("ci}4oRezP }g Z0eC7)X:c@ET,t !-jTIʍ%_uo~%r}7=&YE4y^/ +>5lƒOVX>1$f ySM-͢ƿ)+QD(5,"!a0*93Gb`I^~.;~011&~QhZ\iLFG;Bp?ӪfD3Q0B|Jbr/xd0=X°2R3z:^@_O7aTi.x.7WfVq愣.A*X#u5] AOprN%E}v.I!fMt8#`_e,,u* Zpze%@૩~3,)%Ja_ujnR֕;a,^IJ|daRzaTC#qzTP?rKf]S i.&]=:Nt#o"mkkIeKƥGF]feDX5LzA&kս~7Rz F 5V$.(GR*n|@ +,$tOmMSLRD\ZmE}>m'!>oÚx G1M +u@_.ֹE{%Bwb(G`mJMBD3HV%{=h9&F\aUX ry?Vlq𧑽=%x%;㼩:|{=5MHI~@!gơ^Q\v~qKJ՚HtJ%Gf)Far0(;fT#^[ @cR<,xn&ċ_qKvW9 I*@D42;I֠eE`nVJ(:1i ːhJx^U:uĬ+dbv;z`آlW9ӦRdxlpo@dߠYf˥(.ºQG/")֢,I Ndn}<0j|< +? %B9]d}Xք") #r*Hn_a; 1]Ʌ?[{iF$ VeӿV7cJpj\F9T31/\,G*9IlV?J*1/N ߳G&nW=tDjEY+QF"zE{eE6G1Eq *'1njͰk *Y_(G!'h~JFW%n0džYi$d3>m=, /_Akpr\'JTE{]RP3̘\p D};G9A7r(g畂 B*s}FiªF>sk+,)WAX@hRU-s_.ƍӨw]%eµ M#@K#t:@͠\6Y2*N"%- it~ИLc*L;d $2d&(ߨKu |%T`Cq ނ#>ԥ<' ?^9@j`$,t1C]o&d5XoJf;v"d⭲J5e „.`?n'^A%Wͩ#Alũ:{h B95h߁aRɚSx|MFx1ZNҽ]K$eJ;mDy A2IF)}H Q2렱#>t&\r.}0; ¾m]طbo{7#}[`TOD—[@[PP.{PJ^ŗ}n\I\o,F aJtrw};rwG8<6{Lm?շuexV Y*_%ᾞa 湘jlq.8SkVxt/\B+sx=2L54:\eF  jOMmڭtj&Vbֈc1BAPK3_?7^K Bv4jEoɳ yP hM+iI[nX>s3Nu(K1!2Gj +uͅSDvΪw2]¼>irtm_xV_(z9ꤞec6&pcZA߭߱)c6pۯ?y^aѫfZPh76;.D0P7Egt"6e@1_RTZJ6?,E%|@ 0X3e).^e0^+lqt`+= F-ؔu.X ]?QvT89Tok1|>3uYzn%_ URȺj1b݊n; +1ڮ3foZ5H <'@\ֻfUS1Yf'I( 4SB,NN M}Ipl'~c&˔vhLhh݃x3Lx6+!: +G4fIƨvXݱ0bo[VBDL}.Z>죣_i$T4r4Sf s;&Zz̉Xi?Wz*t+}Ǵ:AQivGc[|朎^m2A)Ӧ-6z00*L],zOD\P rf_gy<*O%z_cK~{E҃ +uLass*r_%0Y/p^+^o;vj]yUP,%;ܫ <łz 2 !EVj٦ W,`ʪ9I,1d*J<걞qD^]G7h5r 25lRnq:^i8JX aUhz{TwGeqW n::ni<aLfJyQ"D E "f P*U-x ^  識᩿JUKPWB,N-BlrpZ#q7Q8p ^U#]K,(\@VVBYe~& @8tx?JvLf . Ӛ*[%pSLF3"P 郿 FDy`)^:Å#ҪvظF6^4Q1&q/Q~6@M;#?&*٘>X\@ommX@ԞZ3$ѫ]d!рd;ɻ]pd}+6u +B+|XCZB\BʛQEf̥^U;С" fo?/3IoVI`Q#``&!PD-RDXl55Z3IWQd ̨U+u#1jv*kҰ ɖ Tf&5Pߙ:kZ4| A%ET#9jMv"Q-+rfu'EJVl60l3װSbWדjZ\T)J'<"u:.7AMa%R0; J-.eJP̲ΆT*F/mON.erHJiL>Z^)'Pp/+< .T. iwpUeǹxe-M$I5g ?*z ]5D~=TxbB% Rp}Qfjœ4fDڨ8j5ӹZzd7(" 0Qc˒hyND15ִ-&HA?#{{=- NDrMT4݄].&;"5i&6 =BgCǣs w4‰lCm$u'/(f4T(ˍMH5aT#i٢f'屁*ĩX2"8F fkFM$wGMsگ̐*&D7j&o:wFUeшIۑ|{,u֓`D|n1Dr7(HwG[2gAɈ`JPAS7?h*v ؝凐 &ƗVf'\N +E94O⠩hh-iQo~HmFSl)'m.'&Λ",koD  X?ZĥO,P࿠HH!o-O =MEQ&ME KSŁP4K1RT<+Jl*|ѣa8v^>-aA=·YH^,>F%!h:%FB+fgam*k2h2eَ2z(dDr=h:4G7 C:`#m#TY>DY5Ej)+j$ɹbFiZ Z%)|=Î) j`Y'V> Mce \U*~_'<ZQnk;Iܬr}u +ͪkEFd^ (-Q1+an}ṰK3nj@pz +EZ0 PNI'׫ gxDhF|Ց^mѿLjwH,"a2.  >\@c=V\@PPh28uќH߱x:\D;6j4s;5\@ Ӹ8+kE ++sgX +. $%Mu?"&wRZrPcTs8}-ːvyx LeShhL;(3r_R9tb"AA19A <.jNRgmAIׂ *`^-8ʣ$/ EL\肃-b+w~<3{ҽXV14ĚT;. S/"ٰ#`@06'HaJ*avʦJolR5)qn4MEX BH(Eܐ"D#u(SB[HFMl6:ڡkDi*@<Ρ04HJt8H(kU&SpڿqOT1+^!66]ow Bɔ}&jC&UL(#6충ᰶB)j){e01k9u¼}820`Jp ~fwD@X5T V7I#h*zUآ&EGTĦu%j!;)m)A"9 )*T)ӤccٞGS1AMEV=Rѓ+LNF0K~( +i|P]b,ֳdy;Y)ZPɾɏdfTJ b%՞@mhX-S}iZ$:+S2;YYH9"HRאL iGf /^{= fu F>AUe#%9"ޘUv&⹲ٙ]Jpc&f'45dbv\2yHy}OB3 8x0'm}DT +X#h*82cA !~M?b# -5P-?Ț(T(^>Q˒qHq3oު;0 Z4{)ZqPk= n>6wϵ),ܿV +ǧ@WKJ~WÉQ ʏ Y $QsH:3%w"PiѩnY\x*҇lX5_fpKb`d9 +m5t] %/Val4f~/uXCy/ӸihNMH3CF=3Ķ~(^KCHAS@$#( c;bnoa耐n>R* *Cz\@p1_Fv{ ^M0$`Mq5տL[zLKU_ũ06N(}G~_/YYz} FeuHs.ª)(^. ejĠT-~xU>]`J0h"CZ ?,,-WGETqAJbؼBz ^F*,d<87~șpAI5\@;*N"HmdCPSUp,zp?2QЏU@swbes= \@@ZEs-u3,׃$zW d=$~S矿(*BʌRLjYy}&*8Ep~Ͳ# {ڶqܙ; Vp(!iCϚ"{&-s$c06 UQN=15JQ+ۉ#& fAZlv@Ԉĩb̭9A ށ˅n~zvv# /6l6. ( T kf"B@Q! RYl'n7ob{M$n `id{ L"@"ƀ9Gh<ƈQpj + >S1 gu]3LAI1<Fd<ry~B8M< }!?N X0M@0E{2ߛk&{i,F~ۀ}oDm(^9_sP카T]tHh~zנ % + .6 "='&7OΉϑxyr<|#/ +9AӘe 䍌NS,'00IX|pS +Bȹ.5l?&_XʼnIcb0#c,..ATRҀԱ~#_CPQ!l JHŨDJRC@ %Dg6"LɃaT5o1#Qy"Bx弸1 5㉿o?H>ΥRV!O1ľEkg(:B6y pH,1l\vTKvATˑn= ++2-\+k"*nqG9i\$jр`ue菂f57J +L^JS +lFV;XM!ΙTm>aRU:3\/p.UqiIhg p]7?P27DidN<}O2}v{+Je2Ekt~”BLGM-$GD1<Z.Z_}/*!A>+t|*$؜:C5q}r:(2Yc `E>VA$v$ bɍKohb"XCb +yMJh5w%3ۜ? U#(J zeeQ"ɶ5 YlG>c IZΣ VvEaՎDErdBmML +hΩ&: l)Հ6¾u%/m,\S!d~иJՃ1o@[ÑnB>'::6FX}f]($X r?8-*gV:f ܑ+;8_,ln@\յX~"! )[ڵ3|AAdAz;Usɸ8{q\O3ZM"')'@6]<;_OM +6st^.,8tte/.AʯdeMl@"tBGkDm.@+$`X1_Iz! +I +=hM4^1yӃWdlʾ*yicBTw[n +4tf$-f g6'pe8yU??F9x i&IU.Ɲ̄[vdLo0Huh$ikQc=pj,Z-~]z)m3n)X)H3Dtsv~ϣb3AH%Ҝ3nҗi+£0j|$ >|6N:6XU 쬖#ae "DȤU6 Lrm 2 w.I3/M*`_q-Jrֶp 셂!N.V8# ⹯mcϫ,%%ZIfI截PE!TDz3C)"μ|-Nz8rMw܍,pJ{C,N wNt* ]${t-?a6Tq^ln,i=UTd:F$ ɝj#0@J[,Zp.(Z녘,Aܫ{kM8\366Y0C+UNTbqɠdː`-F`d _iW6m hVA59NX 苨q]/UA(>+y|RA\]pA$T&95(g_ +fFt*0:bReP|55n]RmDkKrb] 6"͓߳7iX>j$= .}G΁˖ڈ[?Fַ%hB0h[.՟ڑk`20;.f×FQuf\C7vPbimVX#B_MIjrD>8Ir V-RS@8>E̓lT\]~L @8ZI ?k٢Ү/vR5uz[nB˒u!0^'8How)2:L,d!{&]勇l<-mPAM_.!ɒΣ"(?]/vE;\ +6cSN)oU"HB8EN,x PѬ~ïppuGfxCޭ)/e˅r=s$ Fеz_3}) ljĬKXo8 IC,Kg%ʊJCb`R žrWMY!DL q?d Dg/fA g;2 ghfKT! z{{Q%dp\Sʽ<(r*N|Ke +J)fA_3 e>yD:MA?΂)QeA/HJpͲlmB;UAǓ_5q[QMVcSOpByrV;֐? LߏMN^Q8نa+!h\}ri> Y==o"%tr]MErω$\ $LQ~vkj@FDOi靣[/`Ȓ'Kn^X灯Vz{}{{|%+n.QKh Y?VrA~Vp=>OI +|>S,\* Zվj9]^S9!_w}ڰpS'3y$ +?q?m4j|&.mZJ 2 1_:T3[<~笱V+K(FPd7."Wc 'a( Ҁ=#0Rc"J]t#Km~LY|PU'R~,OMڙRgJ9&(ZN\6ƷXlCj[evT*$6 0e0-Cd1XbTc@&NVcx 57՘Jl)_[W7AN[8m1D8JіY,Q8lq6LfGwYmI4Cur3s*0.biy6R$8*S6(I̵1a2Ogr3vQL{0CZm>dwC%ЄߠV J_ p!$ݟQVB u~z1u'۬c|3$ xS'++Cе5MbLFLi10o +^326Ftru% z4G=zH5STު=¢S%0abiWhaӹ7U`K |L<hL!!v&)K}j +$@uq3 :p&fVs%)鈡_r8+>|-v| >|Q +v]9 @1':,J1CE2v"wb~Do\d&~AG ]5s]M'!}*޸ql'"rK䉠1%I+ZF8{>DkP*QqG6z絨錢wsGbnɟP4$?oLK5 %Cb%V+pԏ`Ow"v5l<]Grs6=T/F +|>=i1l iM4=*F +]Ǫ +LfztYyL D~=j!U#,\>hĒpO F|v {tq.% + pX<#Sdς)1_1G#V۟d]:S3 *tc5^ LELTb2gٵI<)Ӡ1:Ӏ0*U8+/J>eQ`B$l*Fo0_S(Ԅks}]sp}|I&&{Æw.$`sQ:y.1;NK+&D)iCkpO<ՁOoyh"rV6:N9hed4~qغ^ (esx&".m5z1#l3Sj풪bh; `+I.);+zpj}($:DF0d4E0+:ct#žh0Ha~0 q_UYXh?huʆ3? ._th>E+nyIl*GJ&*o+zj/ֲ́T/e4{{&dXLiShJf\gӯ={t$Ej?!6hyL_4i*} f3$7R[`@6U!7$7x',B!7+$7&$>WRFF|f@0 +mEQ˹Hn<ezN.<Ӯ$7:$7,K_gW4ɪ%` Sim7 gΔs^I('| $7^D_ jLMD.w.A$72L@!7mʨ7:zo4F3+0F"eb5-aFz1zM )ܸP˪XCrC+$)nm(Ţ>"f?0[I$`~&s2sHӎ=($~j9$3I9/naX<æS5Ey#ѬR ܤ/{stؐÌ$7QH0Ɇ%|Hr3kNXdD1vxC2HnTĈMX^$KʉE5Bk>Ks,VLr'Mr 3I!PxAӜ@(txHMQ6٩7hu1:zӜ7HK׭YɈ/~e$x8<±vNa.VjYl2s8H3Ñ5Z^"pk͒?Jү%S">&7 Ȃuv\AAۡD}>KNM _+N =(c1p +7'wW7yo$TᓻENUu(pq>@hͭ~eUN2NK]9̛?F_cNL*OZYCD47j51gD}G*(9GZF;&Vm 鼚 +:hx;@z끄2AMoU.m[jr; /gFY%%X{/W1Ύ;8:N4˄"}xK>3J$42;0ne~oUO-)jB5VSѩ#؇\鐶`z,4/iϝX\!'4#h}5T(Y}*F7>(Z߶3.t2jW_-v1mǛ 9_HcŜ+].\ofgx)RaxZg +Ե _C\czU@4pL视7 Sٹt.4p繊Xh`wnH!Q&MU/jE# }PoJíҸ9&Os}xO'+)<%`.rR3maEdjo@58=JѧˑQX-,dK S2guLop>2 8(b>(xW0] u{nי8gɡ,z5(V-(Uni~dZ)Kelϖ?o0vx`8#uR aKY`)s;vj~ЦGjsAZj'HSsSsi/:O-w_Kb"[,@9>(MGuci\jg{Z`9m.2}(al1\ +`'__p)siCdY'P'7't*Wf. O?;_s*6W u[0=C?ЂfmzbmsW֌`BШQ# +r&e_Yoð anRԷ19G+iB4 HڋWF_[ ›Iao,gΣ&`.(4۸\`Kr_Ih |ybϾa|eۥǶX9oϳW>v@;}y( [~%x5t}Q +UH'R+&|]^7HӍBvǑ&h|m#r@^fBN\MS2`Cq*q_vl~`iG%%xZ:!;2F|B m,oF&">8J}, |D9WÖN0 +'rp2Xͤ99M]Gj n&J 㽝Zﬔ$ 8:̘w cH͇f*"0I88 !9 +.)FֹgE>oG0}L-SŢ67s_bKH>| +8PF679&)۪E["tV+2وQ91TqQضO*Ycl[sXo=w#wm>89 Ǒ\x2 *7E1A@oU7P>7cJ LR{$9@e>|uF&+|Axpא ׅ_`ŰO姶&,|REI2`[Tށ Y|IdxC7*"fkVŠ@~o/K sJ+Vޭ4?[mˌ7'iVvmK;8PW"XBT5<;F܎{]M*( 1-)s\F6 `+g ۱5`zcj)O"V_,Uw n8u>3KD`m +51Bei M1+=(=,q +8Tiq*ױZ+S3;j ꒌCt4 c5v+mP~ v\|}[}>5ʷ&O(V[ +j I-zsǠJM[YPлNuÃ- Mv> +.JѻV,nWYcz:A8>\2dKWã|~8qypTv[>|J^Y'UIK\mkkW Ӳ+*Is3f6/2d-[慄t1VW&35Կf o(;=zRbCZ(ALJ\Ѳ4&Ӷ= Z} D/q 6v-:+,U*ٞo,G8v7ʀv^Ahu^y3yPԮ WDҫW*WG^:: +(_F̚hR>Ϡy7lI-S&Bī }١;[Ϩ9a< Ǥ0UzȺjSYje5S8ʣjJ l@+ ċR%S>0zUY'q[=\2|Q\i${V'@yoXSAQ~$$#ڙSZXZ~1*9{(r/"a1!&50_l"$gDb|Y,EJBj}b@x<,(Բ`p>ڪ #+g$DtkBq'P*ݡA4V^ +.3벑gYth0jN#n[gQ;6x_%CA2AS܏TcWLl1!/yvs}r! 3 Ū5[f$1Siu # =h('(џ2/ %wD[&c\9F.Y^i#֧jhe'LlYB> oe4HB !2q1Dkd5 =js1 c 80ǘ#Ul#0E,jkσ1SmbL "DE㮉zbMk!ɳLjd^TpG<`ԛLøJ8" 4i ^ Kq- VЩ$ ˡnGB+Öt%& t98C4- #~{DH8Շ1PTD`/~ya#aAb̂Bc+&ب|8@F8Bq5ȍ -itKzOu8fG*.%o'fA"DNkQPB)nguޭpiPQB\+H1r2%'A# A+#28JʐͯթH@ ?gbPz JzդK8 s]dzUSzZnV;YYk:&}؂J_a4s\v蚥 }Pߦ$v{5nr%w4i.ٔ@ 7a5b(~SItkc,nΡe_JّR˜_Cw)8ʀ#^T RG>OPY01;;! Mb<‰Gy e)+uCp9|>w`D*M+&x~#mq ^H7+*yEVfӽ*?7/ +$Q #e1]$S}a#ŷnP\:"$+j+Gc ۔+Bɕy{ns[d?5!l)njR K8\]"S(]& +/K^}W#u>Kt:V7"RT)KvgtQDJ{M!r+S-aXdi rG~GQ!nI3sRdS0sIrbhs~+&ۿ-ǂaOޙ"F^gS`ҵE:/P qeƑ~k،ޅ; BQm8]aZίw&]XOɊ H+A>?^e7Ŕr|.!ky]M10ODBڱwO=Z3:uWcg2`n#]ĚQg II:3w981Zh7OGZlo=4-%wT1Ue ¤3ndBnz72ĊVJ1Vgh+m𧪋#yKB*=ZvkF +Chhj}1׮$>̥$?bp/P12̩LBDW`>]AjoW +@gb=,gcnOv[n}U6dTuuAQ]:Y漈eUNBBWeYIAW/6n|r2ҖUv 6 *&m'I$[x HH +Zb $L;}Tl/P]#KSwwի"G̊ᖰi$*/O$pUHM=t#̵26!{ְPj 9jFO  h¥Ơ`I#/X(sS^ɚ?/H'L@W`WT_C&RGz״ūһyseuɓvpOIULtȼch ~Qm]la`p.N(ŻFs$~n M"!vOLE6n 4:)hYRP&&_؆>dm ^Zkwh3O Tɀ+ +J9*D+>J4L5K/FK D>*hGQ^_GY/\ w4_iW@،p¡zQ cwE@KܬPŠ %+d:KlŰ<qd .ETdP:Y %vJ%f#usT}m[V>W|$F1ȹbEoRlגvewX4IqsnDӽ*>'hD_5P\3}܈~=JbʩMnQuGvܾՍp`)g{z7+g|Wvc*9"F@\=ѡ*x57~Q-c㜦6G3bYasv&"8C3WShCbHLbfUWu9o9} QE[%BX+BWd> b87m+}zX6v +) + PGq=ĂF&P/A5t +W*a~i"ծ&׍cYiy@JVW=NUs|1UXqQ8O>/?a"<$#iKN`Sh.s4"{X[6ُfeV*Gm\BtCKF s8 A2 ]9+.Ml[)4^G@D$L?QXrhx)Ɇhw&xp[y~frL[.dN֍p O*LiK}r{XH-9EF|W]h`$ +p +5$b%[ $]JZ6xwIVW[B-sZ `twjvXF1w-?SR2RVg#|h:߅zG2 XM9e˔I%ŌijG#W3wqɘԣHNHJ%(Cw٪䱑H}_8- &jC8xwkBF; +YlOtcXtϞnr ׇݯB%wylGDͲ=ś陣?QtmIR5zoJf'ᙔ˓Ċ#@rUN9 P|,[r+tII[xEM8T8+w&SȘQF#f4r>UoOe_Z#CrWFHJ'cb6En<.+y+gU=C'kǹpgtB"|hztQK%g!,KSE^ThlX5,jN5)^NrfqEy*bv:yHW^w!djyrdYȋ؄b&s>M訫E͎fOy*:Nwfsy%tUZOsҾig\5*=9a7URgXw/bGv4by,EęMuj74W#iǒNj7߽!f:4rݑ#~%KY N;/ՑeGH ͓1 };5CRdp>j;Xͅ<~!,S^-|%qqؓ3qxe( Ѯ52(yEFuUxh4dec4cHHNsu2!ăMQ+GTCܰG^:\'&ě1j^6#Ic%lx +׎/!^Q Qe:ipw^pI$͡twT64=ו.j4HP5Q|6ewscԔܹ&G4bQϷ|$d -#OJAYI[F$MG{tP}̽ၮ"6dXLq뚑12uĵ1όXTy$v:CpoNp:ue1T5MX1hy ɔB kánU,%3;ŵ@1$;Q23D뷚NTpfeyMovsb~^NÁePg&Ri8Bg4gfZxXeH=)CҲTgFs4jWeFWIy˹ڂph/tYH5rT'u /"=L|tY5n|LisLztFrn8PV2O2\Q{k|H#UN y 1R:FpO5HJq7bոr9rùr B#R #Ov{LR:!KvRB9͎VÁJߑtN6#TL5BnMdǓj8b'.p +d!8 CHJ( +T@%&9 /80P BPBp +X ` d 2p +x +Pf  3^@ @ 0 `@@H : `Zp,@Р$pBX ` (  HT@h n h`B0$4@A Dl  pJ(+p 8A@!(聆  $x@(<`( ?X > x  +j$p  4` +DL@A PA0 t`"@$p @1`=(@0@,0 zЁ,`9@ +6 C8J( t <`  +6 ```8 Pt`B d H p@p`@< +* |A h HB 8pJ `*Ё8@=<`! ؠg h`8h z@PЁz @7`@ P !zPApt`% +.0 Ar . # +d \$`B? A0!` +@Z@`A(0 +4@ B X j@  !p#rAsX=oiz8T<$}jY'EM-P]vZIbR#Lj Yl?.S>Q]6@Uwaˎ#}ưZv[Te1GЉn3Q*3FL / 91/cD#qH]QuN2X=}u~?Z ;Սŋx tdE%ku#Yfl_ ^dj'Ċ%Dž;IN.7Qsbfչ]; .00"#Bf*ΎBuHbqr mEv zɠlwbq檛+dbؗ5H1ݱ*V#u ]Kc4;|T5MrRύI wpV O/ۅɦl8CcYtCNM)1=J$?bvYue*/4"[1W4H}#c2!>fsNjDX(vBmHP%K]nZQo[e:uGXؗ{h&*j +kUQcҎv'r()O!8lZfE2k%<ȟK~Kn l'unNqEt';N0['X3CV+vM¢\BfVAh,R!W)j1T}ȸcCQJ*ŕO蓳Ix}xZ]ф6R;eGwQMz8)QJ/!)YkB[Lh!GhI{^hUyqrgmLb{1lci",*=j.g&JzXJ"R53!7JJ=$N0at:GA@%֘ +M=<fFZWv¡Dje,)g00ze XmQE/e5C8{YYk)Ma/$7Sy~Rd8Lׅ6o*?m-dNL{ADۄ&|DWVc6^K8e%p8RB6Hɘ0UI"lUt5Q6:LV!˫Vg,UW-3]Kf~_b(:kCҜX҆]UwjKۙʰECĉY"ʕ9I\ eA{ m w^$5C.&stE&T.)ȊAdtRXkLp +<sS&}lLIzXm4QHb33DmRy[Kz*W6G9s:B|ZF3$7$O2D)}gmYДPVTF;323u#әVKs|yq6*WR~B5 M:\K67Վ>u3F2^|깘6; V*aL!5sLSTz5E/92ahcd -^URWsY2u{M|aBDeC6jnB2D;eY*12Ӵsʑw[j7_<'uU.{NpDJ>FF!\-s*͹λn(fpeer ?Y9nV; Ǝ&CѕN(L>]*rByqZEB}ŘWx4]fLr%ek؍GЦ|e%qRP8L#SNԨs͔떾9Ӧb\Z +7EZSkH"up$gA~%%Ơ.d56O QԔQe:Q_bjp<%7>:cgb?;cE=,&&ٜA7]S"63.0TzNƋHHek _.YYcS4Q9qx<2EEPd# ȄسMY_ ' 5U! 9GGNof)9P\m|/?m /0\6"d1s:s'Lwv8ebgeKyvp0kݰC+jrp +&,0POU'VUq}*ĴSr]Q966Rޫ'jc9F{䓓R(5 "#)h,LmGP%6DY=$AfnMJ]H +2zv3p8Yw>?=hdqjIBfZR _9Z?tFD*ʮPhxEe3+Q8Gxam;|}THbvX9EJZ%+ޑ +|rv>d_%]U&=U˸\A3 7ƖVd"󩺚FHFoQ[ӣH==_vg5D-f֫9$ZJRrfrOMUt3"^M7C)y$gXEYxD.YA*%E]婊1"6^6~wߛdtӰouӂpy:%"Y!3* QXg3Cvjs8˧w#U_J.wg+Rn՝DUF }XaG#QlM-e̝.nTn7S#ٰxZROs3bs [fg +]_gn̪3P%3QEu'0SŐC(h쬕x،;lqh +*MS +;9Eet%j +Ezdȑ"SsgM\" U&:¾']6>eG#5"GbvVBOGz)BQ:DHݡE e-1%)1.WTRz+R4jBWYuq,ot8ҢIrq%)[5Br}dGn3u1fNN_5rp}lvGS*>*?-ZX-\BD^Bc#nI'Ǝ8SG.Ѧwr.;eQ5;4Nƭd!CE: TYY~W5SB8W6TfU6w76QdtBro2S>/LBb[MşyGg3QQGڐu:ewrVOQZSGۄ>Uٹ~TX9\!6s#JnWK&ѽ-<ȍg+i[C:diTkײDJMlB0Wj8I]RԟǎR"/G+;1'JFx͇o42g/RwHX߇,velx \D_{,V1+jd̙\MeoJj+zR19TDV Ul\[я_vs:"s=aa \]*NS2%c%&5maze6|d,~NZU>t Lx_.0T +o(tL‹^URU 3|=^ &iguf/uMNCaE#1+kc8*^]'6N L̳VSS3<2{U)U1S{$%図6r,9>dC'U&e;$0utZt75rd})!OHH H62:ٜ ǧTu>tJY{wqO?e-i2ݐ\oJ ̹6hlJ'& T ՁvtaΔԊ> ?ΫVDeB TE`ݤêߞY.Z] [F#H¨L,{D$#v tUM9aS/_5#"?In6zoHM0M%e'X%C5󠉤z +H*1|.BWڌ&haH*Ƅ3${d|8omgJ<1.43U$WUAvFcݜ,%'ff6kKN{a%sc +T&X4~ڮ{Z46FBYELurYQsGG ?!T%+T?ҎԈхbd,hta~ 雴{ԡI,~0M²s''HaV+-L2=hQ;̑KgsGgߑ73<>kE†XQ[Y^@e&J)8:+Ī&/~Gm:sS&Jc!HI/0LSȘȼj-jJ5tg.^1h8qGd:Kbz&"vT5d)jի(t +b–؆(2B:GMEb%%SkU +o]Tqs;cdiǧsSmY` 3];";DԑNuDCUeJqPq]jN"/=9ߝNh)|y>SG6sH;}SG(c_Af+adAUyn@SSl!SrWLOSY٬P`9ݙYQ=Ԩ,sv.]}kkXd=J8:B[5\TN4x휵&xO쥣)Ƈ*q}:7% +|Jçٸ']129)) [~BR^XIWàus M^㹐T,0T8ɕq: ycC 1 kpg\3DB1#:Q]C[wy-0TX`@QEk5̢gfQ:> ˦@+JkJխ.qׄNw6aD: +֡VՐF(l}(=sFGUqqX]O:mUJ(%jĞۚ{MDvx.3YOlG5Tgkj#i TUby훱zCNr,E/4:s6U*FfjpW>ԅ2ΎRVzW*rbNvԳQM6ӌ'+^?c!4o,CJ^C$֔^$Upk1LDW;B0Fdg J$?+52Oи3d,9ߌe\6-HdHl؏cd|OALL{^n3;=>w\ܜQu#֫%Nh^f%PǙD^d(N^눝FZ&+IFu# Ä_CSHvNnLl2$:t#hֻ-c)eTG¯퟈va?u?VʼnTG ݽvd^ulٽ$cd;~äPLT#*̘|N]USfI鑛`zbNjmETkJ!ڔBaoK͉S1>YO˵>ߙ_qmre0I+& !z?V,tɫOK3ۋšk6:;+V>= +~Wu|h]uʘ{2q]qF[.ylLgbCO~p*]O1&+S]<ʳ})ie5rmaB)Ai4%c2<hNL(FDjq,Bq$Ҩ2``0+P4|wnIBY=Z+!nz d]`K^T2]@0ޘڪ4gP|/RD%CA7̥tUِ +6f!^m ɆH"tGr2=!"܌P6HsܖlcT˩ -:.4 !,wEsв孏lˆ\ixVOlh95_6D2#-eVȆ*eCXAl.q,hCz:mqomF@6^ 0o\EX+rqi^Ӥ8HqڻKnQVEah@ʀiMU V !6&Rτ 20%e4UmI~A+nƍBגiнXԀvs"SVSR6ퟅ* KJ݀K)u^"FtI3,9iQfs`D;9[~ 7(ᣤ]9 +XL>}@41m2Ma0>b/h&vu  <\D : iDC5Ofhڋ~'d4Q'#l6[,_dACn! !rsia  S4 $ Ao@[ZIa]QBwHnyuFiXx"ke v.5iPA[;bU* ~צ߉|(}GNrȧyf3F˗cU#幫Q){`p,%rJHWla!sʹMkRjxȀJvc9#I7&D~[8'? +YҠĕ`0`U`sq3|;ݣxHz6m*yjBl̍3čRI'TnR<^${%5:Al0_+g8kZt0(N%Յ5UnQiƼèWM.7rp&j#zЙ@Av{$8=3~rlV W]6ɖD$2R3_RTx|$|K@sᦉN`فo?E1Iv\e0 Eg~"b}7J9JF U^;@m ,՚b7YDmWȳ?3'ft]   lǭ6=`Jzz n&9ݶhy$iqnY1<$t}X`IU}`r&sc +5%Lusem8m7$5/7v" +䏲fXk54m("$`5)gGa] V[_T"3ς0fB:*Gt"b3 %pew:I_N!8;{qT$0Q>|cϐ.P@)n:L^X[QWma\bay%>ygpo(;fkYb0aHS)UANs2{ōB?%"|GOŹ`x#Dg@i8BgtI4}Y4!6#C霂ҝ2|t~D+lW7@A@e-QҼII֝9qx7 +9k˘{i2*<8l5e86ծ`;nnN۟(qR)(tAiAH( cGh10^6Ш1{rY""eCK}:\UwWADgD9\  9 )NL bHV6@dqIEmK14S?N +ul7 +xͧVܡXGD}!ƧV>X; + L艷bFG*^=xcq0!$2i졑mT>4uiOgᇪFC2Ћmþ0DrsYU Ѧ-KC` +"]\T|%+ExcdܰSu?d#-]a>~P:\&8Nz+,uLh" 0I^0 `6,]@K܋) z#}LXU0.w]qK 0{ięH6hԭـk(;nbr88Jr7nr&?f4̓I5 NiE#6L!0ݚyt?(O@uXhD>98G;9H/?g.U<7dPʸouuvLJ 'qdմy5$胋y&z9zoݒ4mU҃~Aa<̢Bo~`R=mdcÍe=!"H0GT{|!,Dw5Su⯇2T4wrZ|We&nPhl恓Ki8s +gw i/)3(quU +(O7ا]\;,J\!%~A~2zAxrQh/7M};)o!gn 4G6)w .sް +xxŏl$/) S[zM.DVB`"CIZΑr?\pQ݁=6D{W Rf AGtxc"j4]l_>Nˉ|2fR R n+j@^TJ;xV@1!L#yCYeėmP,܈7sԞmjU"Mo+&y]iĕ>S.b^߯V I7vF +*GU䖉FZ4Bv+}Rlu~; y=dOd2b'azŐPmRr|Ё:ڂ^iZ2TH@{E6@saP _ =jӮppdxH{6?5VPbTr3[/[}1U΍דM;F~ʆӦ{}@|b*Yw!czSxŦ#~NDvsb=oupB)Q$mM-h 0V(?EY(SK@Rd~}#MQ[~t\$m ї1iCNjKw0q\O$qىf5IQo"ݔ6v6b@J?:Wy9tl& MV3o4oڕ'(egg Y>h2ft +p+(i>H"~+}2{``rZx7-*%#S̈́_‡"=C鐮bXD2vpȏS+ ZgYMy cjJ +Icwʉwxv5qU?@=#^b$#⒧Zi9,+X\jdg7|RԚ`6_o:3""&[Npe-f+sk#]Qy 8'n凤HSz@b~$?b)0zt4Q$hQz]zHIUX\sF.i7R6V$.91$/?=Pzc!\`ԣHR#+bVD_g~ uD@8ͷkG>stream +#i #x 5YRga(}q"cY@Fr-DAÜRYcp{ +D]fx% 5I_!zHXd'f1#AEv1gZ0Ŋ4ؖ=fG`7+q "dom>8+z)?\lځms$~UHɠ6$WU%l)|}SmcEOzO(*=.C&ЛNEJIG<{P˦!98SN +o T:{1L!:*yc]Wӣ:\:!]hqE[8A]% !ggȡvggBb4: +ϱdB<ݨCt6$Y=rM@HLLUB%̈́#t)MlaL\p s]̼#F+Z䴂IUm|kMb77,Jk,2R>$ysɑ5 spFƂ+ PoBD#HْǀZfB Wٵ Cn:xF cQtc?êy(VR^8ٛd f|#@+?<-Fxpx N3YU -""ςΡZ75V 2),0?$"6̤I97C9Rk#ܻ [>&ܜB8i9(>jZ+~'դWT+L5Ug8Rb6:}lk@ +!00^l359 gKOL;#ݬ#n?ĮQIh1 GNB r)ǵp!z'cYy/Dȿҕ"1#7JgpƽRMD+\jMAȠ={ڰ¿rJe1?'SrwLwMDRwVW#+#!"u}yʆJ(@?_mTM=-",q܀ +:%]Dý$2rqc5s5%@:ۛިID%YH{KHh4zrjg%d4SB7=33Ht2Bj5.P>'`Nm`}0V"-!Lt,R1XTw;'hEIQ'|MotFAfU+S|gYQgX~_xwĊ b[9␺$>~, qi;mj`&{/GxzD"g@LWU\) +9/ $xPLTGn~D|8R5f4|8io=5+/CØHʬ$ieN5Ey>3~f7o."1-[ש+kn6PkksD^(IrQJ,' L8^EZ\\(Xx!"q\ E$. + Yl*#Z"R`_">w’8@bǜcr@Vl3hM7=nxLU[p6=O d7UNȿЋ}8 OС594aYlK  $+?څuxlMi"F9@(Zv}5._Rpo$($,1%\V)Ŗя5jɒsm/ncť(+X8ʼnBzBI68I B9CN+64}BoqqlՖL$іuaR٪5le$kP#Ӑ?tOUP EKNQxc<4= ~fg 8l~AAUX{&Vh +gʑ7+AXf[U'^ȄZAFЮ1Pݑԉe@#S>%~,‹ +E&chj-mHVXi+E`v…Pq1ӷ_)S!mBayH3h]a#"yZw-="Bv@iZ8nu\ni5n1{"J[~U6J #UJzqH~ \):!/~ Jqv`vwggcWTb&9"Fg/F{L6yB\9ZIҺ,6pFa +ojwt ZQq>n[ؾ[ jFf֊错9*@6ǻORI pt$ӴSH.+YäkhUҺ]cxtWY2-d2TlN +Q(67l L_2k1Q.GL{I`np&j3bg;E5/;_qrNFGӇߢы~i$ +p;a4?7Z%>5b,pSm/7LYӪF7fhQ*^L4!N,$Tmȯ@s|7Kq-N*6$^ dݹ%>cNz;ͱĘɉ:]MX<~nkv o[n&w!lR3::] -_vjst:DJhjwk齉'irgWǏ)M5#tU~;g!e.U%}тrIW$%ML) %i`$ yIXO OOX?Mk3j+hIpZ(2)oi,SlOt^#~\>x?e(UDR-=⽉oQZC(x)N<+aǭU~^Ӣ~SjHSuk/Zס&n1Gdp^(7/wTk)*Hr_("j>7'oPQ٬}:j5&"!,(.TV_h==21s3KlS{7SWtvc߄nʨB, 'p0yQSVĊ}(؟jL=]]`9,1 w&j:[a~tzL!b]4"vxq!oO>7v330f~5Y2{oݔ&ڐN9^ +endstream endobj 38 0 obj [/Indexed/DeviceRGB 255 39 0 R] endobj 39 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX$6Ra!<<'!!!*'!!rrmPX()~> +endstream endobj 32 0 obj <> endobj 40 0 obj [/View/Design] endobj 41 0 obj <>>> endobj 36 0 obj <> endobj 35 0 obj [/ICCBased 42 0 R] endobj 42 0 obj <>stream +HuTKtKKJI,t(݋4K%ҹH4J#Ғ(H +wqyy~3̙g<3Y9El +@ ]!O-@\+BVKK :OX~WCaiHKL0qY `5ck +X]x= 8 XĿ׽>.f#aPn D^{y8  dp H st:Y׬cxc IV?S!:_9[YbQP~+rA +ShHht^ '0߅™kYXY9Yqqpl'WzEE$%D>,^|t*K)%/`\ҫ:&D [7dplDa5|mb4,yy{e5 3⚅,t+whlA   m k +xYUH&%Ȥ +qO'Mz3KT@v[NUnn^\o]abTrtlmE]e~U+jאZ:zaqi5};CS[\_ۆwCaQ1;>L$Lz}4:%8M7l̎Χ/}XT^]X>\Ym[n!ycskkƶʷ;v{pIs0Xݯ3s󝋒&$WWW*)!$$%!e$cHNOAKIMEq ƕ;KLw@YX;ؚ8^+DspfKOTCPpJ%D=++O%$*8IZ\Z^UK_wL"dx]}>9=;s_G8/̹N!Gz[<=2|B}PQzlH0Wc(Een|Pds::5&89yFT"od䳔i/ZK^&gd:fgQl kJХeJ*+篍kj5U[ZUh0|em6]B@`PpH?QM1Msψ*iϛ.Z [JYZ)X-]R޸Ѻپw?@?5 ǖ'vNg +W3gLC#u!MMMEvAms˔FVNA̝GLwA̬,llؿsݛnͽ+!B²" 'R&k?3?4+:6oT\ұڿ6VʝoF?LT;:>::>:;eqvx^sawݥʕ'_EFO\DKLtAnFF)F|ԭ6\`@z?m+F;LwiAhy͖)Mgw~_ @ZH_XA,"F)%/*9aZ:Q,\B^_AU񡒀2 +*'[j o5[uR1uh`fm$1xJgBdrltlyyEe$feg-g#`dGbwj0TOC9; ܨݿxz6zx8IP=A!.aAxۑϊ}bG-ޒēx`G/Ԝq_O?0"۬խЮ˯ǰı²µŶȷ͸ӹۺ 0@RfzƏǦȾ *GcЀџҿ'LsٛFsM6+1MZ:{T?~ò~i~L}~cbA~Dad~ty~W~O>~\/~|~`Cx}%H}1X}%z}K} {N}׋<_~7A~-ψ||Dz|+E|[s|z} ^}wO@}-~ċ {Gu{Dz{]Ĭ{f{Zx|[]|ϕM?}R<}Ǝz]YzHħz|z={LNw{\|=>|v|ېI8z/r z;bz'sMzd6zɬqv{D[{0> |;|yyaIy?yazYvzݮ[{^=c{ФI{R*y߄yfUy`VyyuKzZi{ <{z%zȎ~+~}͇}W0}3}HtЄ}Zk}=~zɇ}!~Єd*s}Y<9wpSwuuVrUW؈|;,뇔{RsѲ;:8q)PCV:4.8Ȅ2񡂡?Up Vu9S c bփR.ՁNn U388A/ͬδz6߆өn1T\e7݀tXT)$̯̕6;eCʷˆ imw3SƀV7M +\lGNػځNāa5tNzlߴS<H6*-N}o2ن N%է>w֣A}⇤\fXMݘ2, KԐ3g°[} +0e6M _1 ? 1ӣǾI^I|B̯dܪwLe1$: rW] 1S{z|diL g0\ U{[G{!{ ޔ`{&yE{xbie{Jr|/c5}~ +~:f#MKx+Ca|uI~.yW ώәߎ%¡唘[w!^T`^H*- 5GȨ瘎=Π4rv_ҍRGf,ދ̋|,ƕ{ Ҙtٕ^1Fő,;',#h%T,Qۥ{[s:9󅼓&^!Փa@!" y +.Jl6mHju,bU6+s hܸd-ʥ}wi-sun=0Ľi-_*)U_ˈb$na+;ϧT;ppA7C4.*Iߥa8Mm.ACi7\j|fiԫ)]ޭjʄU]3(í whJch-4x7h׿*P0H됎L랇ڡuÂ,{Bz}8vggҲd[!XTZZ.vlAg +{;Sm`vؿ`~?ga. +3Ì{L^WYe4]L7ok!wI~Ira^=C#Zh`Wu}p)"z7ff&3$FJ8Ҷ5m +uR_,^VS&aR~PfLL_Dw*`\-9]q  TI6)>u6 D`e͢/xqY%9ʜ;åOd\˾P&eRz;].R<oΡ]P{?: r̨\ʻb Ҥ3|m s؟W9oZt]RnÅ\cW#+nI&gyAjsN06HiD'@J+a5V~cRI̫vwtUc[3+?F|l(iU^+O?Rs1Hqil$Wþh=(RE +1BvџnF/ BsGMY9>ܖ3ȗqI ڣ5V_1ȣβiJiX0WVH[8g_/ +n3 ` 38A.|f|ј0I6bv%& ;Y㿜҄#dD.).p'3J12K[Duɥ$s8IƊ.z^48e!R6}vcMiozo0'=~i,3:?-?oS,9w#ROa; ?pB +֞IO ݟe#}ԯN$\l?], y,>&Рq]yh0AqK)ĝBFҍcH:-h-ǟcf)K9T127]qEjL<>h;|U +dpG +ƫ`&!8al`83>.qɂnA9 +; `HByg KB*k㰗2fF=#OM eT? +mTm_OBۊV<ɆF('n3uG~Ȯ#7Њ9[١`Ns.P..콤 'KnpF\? B>-`NWOOWBlfxW^b-_x&*/(j_=߆󑊢zF`LdE:SNʔ@S 03|TOKokto}bFz$4-,.m'j*J|)J6BP ^3ewܫpX.*,07xPڳ:2XOT21|"7=0ߴy}ĸB)H[Fs V+̯+Y(I(x&9JAI'tXmyG=X[8TK)2<TSRvxlȓGO|g/{>4/gRFȶ&A52 uЯ*B幃AuFǞѧuD)B,*?n` 'qQIzK֗4{B_g68#ʉ2.A$69!̒ub1&D3Qx" >ɏnνxVG&TۨÓ)sxd-5KxߣD&1±jdGjJ|J{Z ޲f6/vTp̄ub PmBU#gBg˷)-*E +ar>>Ƶrn[ɭF-IByѸP=ĶKUC wG D}"vN.p]]Q8uY{#qCv}sax_oyiNr( d8aw2CQ}V8UWO\g \yk@dcZt9$u +p-1z(=f) +vě92 w u煼ת#{P6+Dq3HIi%BCb!kc5&U ):X$܎[b2*@PkcӘdoTB_L1Uwi")=2#pI9,RO>T@>;bnDPuCfk^^\G~ oLRcHqܮ=-8^5Ońy*9:-\g8:T<?*C;[yX+I;lRL߭$DvYTQ6DyVmfy%/sIsmXP1Lռȭvow)QBb_LVwupeėO*|+](uHװ4WU.{ 4\m.QwR~MAiRz+%BKz?'{ k҉aa{H]sX}da~3_auQz VM\ĵv5I0LM)DŽp1:5,&4 %!$}ocޤA]R^xT◬M&/B:DwA24?cd&g]5b4a?iǐ Ĉ.OA 6vfvsd(5yTH/P=(a;zUs bWxDa)Eʼ $sgPJreY3w`cFo0|U[j5k.5J&eTor È´}I lpjC8c5J=g%Uo|L58E" +ِ[Ak]J͆VBM"{NrQihЦ@Y?6^߫ZWٯ]ذc؋hKSLj:>O ɲ.ݰQ{5mm<ٷ?^v"}ъw9O&vX7km[ ,70nΒ7|eP\I;-wgFN cIP#qWI ;NٶA)H~7i thl~~dzY Cx2>*c&mb{9f1X*L #> + V@g蒼]7n249=MK% ;,F\j 1klZi؊ΐ.|Q9а$_.!;̿lE,ɥDi}D3^a`Y5g{J=mɳy3CM'jM-iЦm n5? SJE+U~ ;q.tXd~~p*QeS%.Ћ"ưBsZ6-6[\d;^z4`;64藸ͱw;|+&AfLU3XTm)lF'l VɺgcGObbɜ9;v \CL, >B?KGCe"z -@EHILp<5'҉$>8#gL2m c1 c Fw)P+rkC qp/u8#!*g°Pa`vu@oH`"Ž:z_Q<,D>'ӅWP .`xW3|!6 +5 El[",0 e[Oz0~lUO+&xkPc|u$k.?{Qp""kr6isVa=~@W_ +.<7 +2#h?c~m'rE_xs6aG+K 14L^kUp^^_mS^dШ'>}5$:τ!E[bJx&n t(m;ZsF5uqX.ՂBqKP *l%{ٓ{'f';,TT,bhUq2Z3;}T9vwRR;GD + K*/@hUv$j!@ vyבm,W|-͢ ^ ~D_􆭍"ĉ#c禘*X/Ϝe>|XH;:)d9gƖ4aBQ4Ew,C +ۯBU#>SV$L-5gV ϯ*B#} npþtdU$Db&$^\^&Z"/˺+-}%Z:}9AYu rTlP0"~! ͚*@5K?߫Z-P=j>܈[O?)a5 +?WUsy5^(ge${Cm> "Gգ+$踿ϫ& Xw8?g,'ō="/xNM)'EFqrf CįQ9ZY$r!6m)4 V9kJ$# FьX٥Cp[ģ)CS;rFP#ImKGɺzj>>X9,ZL-jIbkȉ8˚?vtxPIO}_ay@:|Ve6ubd/e3<֭ztea'cLaM +lz&,f^_!?l2x2Xyń3D)\?ye ~4O+9$  +EVDTSؓ7X?MM!ԼuOtP Cbt;iްa@gW#@4c9.Do z2>M5i~u0 qswQ9ǸLt삟Mz)>kɝI;io"U)]$YL >$$T:gUo$UK,C`sCMAJMÄKC(g]ٮ9sUG0?L5QM%0Ol5&`Ƒ1,x'{k+mY}-Js#\d:i/NK\8HstQ#-ND).s*Zymnf\1l{(E=VGW9s:?wǟQZsC6A1ƃ6K@8OUY^`7j6@9?,yt4&}"T- +\Y&kVx녣391ٵqQ=beMq\`/nņ|2͌JkzDmͫIR4\~5NlօKɁZ]TC3l̅D3jSS)tWw$IX[wV +WTUw^PeUhWE^ؓ~Wchs sIg`wgs (5mr] B`7JfAaA3ƓG?{O[ ?xj/Z*7exXz Ά})C?`KcMՌ&)Y5J]q':]$؞]Yv x(ıH1eU>_0b?*񸨎b¤،D;Wxm]|N7U13*;.=>SÜj)CM>.eI1/QvН6Tkk+Ɯn\\FFV#Xde&~WE7"bju^I@j@bQ Wk8w_D ^z xZKA _`T}] +x}ЁM0S,rV+ KO&ƈ`;E{irf0F] w86f fm_8c3V<)r1p +hs|p!QP'Ղʛ2rӤej4Y r, r?4! Uq]f(*&umM+;1 +-c8CjL=L1TDJ7>)BH*cHY}~xI,{7WjWާʇhg_YovMKiN> QRǧ}AQj^G syJG"?txt,L>֍p_>Po$^<%}KDS4 +*S<ܖyd;éIJ~JMn>ȸcI6uɖژ䩊i77_5W2' 9t^}/8%wd0k)ͦF9kih3ShPBULzs'0$Y/L3ol|f ɪ\AW#siS-O^I+36xas @M +A hm45V-' ѵ1S+ ~*%~k˝ʉl * +lك=3_2~OgPs +Ccd[aے{<ХjA {! ߲ۓ;O'9+wEHE&JV?fiӺ j05瀶bhWZxo=ƺ 0zhK5mov (YOut;e=R*yMVn,$v:QڳE.yVl;svn,Wi.[@34SD_!MF>J柣ND @$Y~-CMu (+lBpБ^#$~2è /@̣6 3nh +;۪.3Fq3\َvZnZ"/vNFNJ2V{#ΚVse_쑮Ta8C¢!Η>FL\M{5eH~7;F AB?VY=۩Q i9J.sӿc%FVbdեiL`a)kD=W \ne>NX7Ƒ†2IYf-to7/~Uas[`W*v3_`~:kjR("E +* +e)DDIss,f_n6":hmh+]AqñQqSa9{~8|~bh6GZĠםN\h+(E30~kTMGβ1:zka'LG2>,gt X&@?e% +=@Ihs)HUOeX^m7R7~,, \jJԌfͬ8!*]JR:WR]Mɚ PZ;JN.8ɦ,[r*Α]MM"waX)Lbjd`>:?|:?u>^G$fa. +ʥ_S%ED8 J=ĕK{6r zGG Ui<Kg"^ q +I6vPWy^,uc/5@:ǹ+[N+li{P#^yv,ñ-NѳH⺣<֡gxV</nb6󴳜Ρ +nhB˾PoT(W##ĉTwZU} w-vT-9O᭺HIz) z9R'dI5aZGS˟agW=.P1ٜ y?2X)r4VaGXBe`9Q1͚@85$W?D}z2* +pt +;Br\ܕ'> -vCNeʔL-ʌqKHr 7I d<BgNelB^փRγF2AqCR&t7߄{" D9u)Cw1t}?"'[7o̩~1{>Ru* ʖdClutqf2[l~{S4>J$.nQnlP#x])By`r+wLH?VD:|iUG~ժ+&+Rb gP>}WԹkQǖ]WSkqwZ +DQdVd24KGMvU35KJ~4&jwJ*y;X߉˔O@5hw)񘴕o-9E:_̂o&6#V(ѽS-te$ פp}4%4mrnzhe4KX*KÃ29ʩ~'Ǥl|O5ÍB +;^j㛑Q`exH;J\*`l˴Khk +&tF|(8VǡܷR:ϳoG*UjSKknRgl ޅ-6&Nŗ7O4rGmO[du_TvY{ ̏Iy\aRKy&P7ݪJ)l"W5{K S_j0WSW;wixF1^lО伴^'1b%OAXhq)L7j}=9PX=n`ɗKX#CùA *7{ jWܴTByufכd=Af]F=_u*`q+_i݋\^`BaE|S&%Z a8+QgQ[IK-jIKr2Tcju=A ʧQ"7{ٮם*X|,Yzѽ}ƈf:jCo[>]x^hlhNrϳEDkcCǪ ת9c Ht<)}z!hE~DBӳ2S͆i{;ouIp??砃46ٺ^"1R<-65sjpCSjqi6dzھİ紈 41.$5EG9:=ob쾄 v#[xﯦAF+T(C@RQF772I$^a$Eq>.AEbiO0]ТK5ΫPÛG ZdJ*$d ^}E*֤>?Ƅ$dO _tl%$^7[KSECqz"$]*B]}W zT[Rk"n]EUYvFUW\B6-RB^Me2B4/wͺh4Ek5˖<1U[tD>Q!.kR涧7uJc>c +l/i^3;iڐ0sĀZnS +qW7Np:([568ViAFޜ~h9Pldüj2dO ++61--1Ewv =JCHW34܏&x8,&#Rc3Dvz6RSyu_N/nmكvT֥Y˼?RFװKzn9Q4gC^5l`P\ܲG&ޫ` 9PҞٲXr6 +V4,{a؄\tcY`]lǿԾar鴯؏=b!&Yb ^[\aYt$w +[R)i[{$7f"o Xp +zBz'hO|Ō4ǐ|-j +:}̴a%Tv5Y9QK d0 ?$ćH|#uD3 phrd@,@XmVKY@ou([8#!OM~.7SoJn%OG" +Ü3N|/'O-R_1Vh&׺ NPz8de 勊ZTH;XQ6}+'h_|ȋCcuHjBA,NOS{3 L`]1> A rxӴ*E^.ؐ`Q5 v{`=W6뼟\9avGOXc& v1w~0W:ʎ~f: 0/˵%m KRKAcR% P#CSߥfmD5oEx17B0<&Yd8"1wܡ5 TaaJ3p57A>+yIMcu Zd?Bk1x-rsV9sH6p]DGgO| y5S$aE`$Ls +[Ym ~u8p`6*I ߕ`S88sn9O3nXOE /7f^lbN[PBFO.9Z_.5>F S̉R'}ΪѬ`_dX|{dHXԾ3QlZe7PRqشO5OkZrx5u`aǂ:*`T), +DPQʮdߓJRk=H+ +*#u)h) )B6s9߹瞏HZGzGT"93hDͺ sr|b4y $TK "$I~$v(B#].qi?CN ~ޱ|ܷLcOnT~vxj̦5<.f\K<2p:CpSy,66>|zC +E +T)f/:X1}J+>_~Q;^ㆪvs&۸>.k7yZS:˩㜍rݖۜaKa!l.g57Kv0!;ڗfe %]"XT J3aժlwVj=v姠αe=bI/gH& :g,(y 27>aba88fVVqɌT0NɉB`( _"fo! t}Wg_0}HX 9,Qx=~Jٹx>ӱe9M2mFS)Vk-eZFF٥btg0O?Dǐ%7eyښ6WSCyeUS}l`a8i g"1лJ"|PKڝc,$+&PvꖴGBoj_t4I vqf熚(eC!b׼^SbYi1¨;2W`/7uh?4 +!z@#(T 6 ^!R S#>E/Sq9z_ /G%ӈ0C9[ۼ@(٩P ,}XTOkpQȫUG6 x2e,> -?ϭQެYz/T5FL^`tީ3\#̬D:,vw[mDW)TBZ`0Ֆ`3tBQ˟kks41y `\޸cV#z`XHhwA0چFTyqӵܫ*F˪%*/>9 +gS'"b'zL=N)cs*bR)W<#S 癛)K +&L\9WtW!Y17i*%wJ_ 閥nWJ!p-0T`:K6B+SzlL,~J#ZLHBEe߈Eq1 +ڸTD}bB;*OTCnՍl$OYQ0mz7o9NŻ|hDV[Ve֩b7YZÖHl~I)ܻJ5oOݑ%(,hZGҼmRd!/NEWutV57z;jjs^^lDǾ0-a_aL؁w44簍b^ppi&nX uƻ-݂ -cY4_g ?jGIfH %J҂[%ϩC6OzvWzoZtA$?z;ؼFT2/+0@@S<@>0bSuqw;j4S'/4sEթ(P[V^5ƊHkg/ۄw 0*֭ ajyB5TC J(_F4!m, RN ?S9 :״OfOV"յڇ1,V)S@._ +#Q`K|ͨ%cj/&\: [Ft^Z"q٤Jm뙊jMarח`VCg +w"~>< 8i}XT8dzQVY<p%HG/Û`rq;Nm~Ms\/Zh:(MXа^F.꜋.Ys}5`a((X0T+JS 4&~|iB!! !)$)ʰ WFY]E븎3x,˽}|dc +|i-0Ws +Q_GpRjy0׿tjT̎ԍD1څڍ›N:ka? 7ek_%]a;זF=9-b= &Mm0-vD'^j+/5(er^+EL F1$1KWE|fOFMKm::1`ڥfXЩM*i9 +l?+Lw?-Nx͈wɳ\C0瑃f sM;iđ`$O0z*RٹB9@"k5v~.lB?ug]ed8JAj͹um.DO^^v:y;ske+,L¶vŝҼخd_5Z;q#k> MU\J{l*͟ґ3Doy"UDcu#H)BPit/ v`_Sʝ{e5mpPpy=-2[m+v6*.WۿSǔ] +^DMk,2.#ɲ\!{^I4Ԉ.~çlDcBU\b"c jvJG|H`_2rHѥ tHHBaG :Bf{'9 +[jaЧe +&hz6Fdy?>gۑx&l$^:^nx-'-]O 5@S Uڏy]Tu _,zWPT|BJ,ɕ}`8ߴy?p7gˢu\JO(_vOUue4+Qbi?A.jCxyRJ駥Pt㸲rTfdd$ֺFR>PaL'v2M*׵T]`W*cD*hAe#"ɆKO9JKL2J( KgK3jԉfZnL5oM(_>FOӹGi}<@w#Ndhoo4Y ̾Fٸ2YAz$W֜5Copli\ 32l;a<;S?B>zprjsm1tZc̥{s/J{c*#3ހfϡneh->Bc9SJ"չO8'8ހ `yHϤu-*` x[c')Oy\x!QS9q*;$;d'=NY ,|ܶ34qT=ka%hs䬺UX7Fl[ o1apuxf9QGk4;e +˸7荇5xB:yZdͫ,`2?_a[0~9iY Fs3g Ë9u<,yx87 1Ja,O@/gO㔛94 |.]16'^@1'p:XtwL,jVQv@wl{έ̱\?R^UV\GI+9D03oyd[R<""" +.2}"!<4tH~(-r25DH@l"K濣,/S}"+~wF}V dRz,:w&?C~FqJ}JݢJirjzEgU#p]ZF%+[PjewVjlW7wR/*C%%jGx @EFH)&0_Օ|Xu +DRNXA\0JSH307͛73 CWc+U#r# aQOL4Eљ?s~{sIy?y>ҒLָKd-ޣJ1v*fH 6hz+~BO:IQqZUՍP[UD#BM >$ z|?^!J0W8N WzXfщ@'h< +%sdR۔e[$z,Z2H5[&Ht L UO 췯+52j&P6uRɮ! +a+rk!o4 `ܗP)f%VQTF(Z]s,TR|O)O?ho# ]6yл)OU,F٠E})gsٴGyҘp/kw~˖I'Y;TdgYU'I8@F* 8 $I+A2((+y8OϋWȗE {բbW"@}@C׌teYgvֈHofE`eagbN_4!/e%O;mhtWv6[iyFy4ʔat V] au #QYm3rM/q{~tjD 7fiɷ  . =[n`4qShBrx_5wԐ %nQ~x'G[ `+qb]Q2Ըi=UGn~ڋJ(Aݪd E7Kz +M]!} jnh-Cզ_魺a٭Dfrj6$-4nUZF)Zpux'@]U/ٳۿ3Ug`iU}ڰULWu+SU[;uXJPvOŀ{$KF,qQruH.}imfZh~atMBb0*iWC䶧jZmn[nKfi c+.&oV.&ʭ{5_s9dmIA. *s5: 1Ů m!|fl'6#N +Z>\oMkCZ8)*bEE@(27{I" $!0a=+vUZŁ`-xEJUǺ +~~7TSsV6i1=2J眆Jh@ Uu;7!0 +߽\醮%-;=.e/T7D$v{.ʫ|ZѮmcDֲ+-Cu_{>1H1]"D^nR ٺ:E3[h9 7TJOW+3 vœLimc @6'[c`Ǧ8v!bR{1_ӵuoPE2\@;4"mO m{ ߺE1dA}C=WB}[3']\PJG5VmnYG Xyahd'J[U~ vWۅWo]WnGnR9H7ѨAu 1vZm]lUrTVA +sj6lhm,My4A*0vJR? Ĵ>2C!*#q0MJ!:ŏCR|dFa?2݂ch3dBzSIt?%LmF[AxYGҏ0m;GY1űh%[sጒ@9 q_8G>r Wn)jodEzC.qJviN&If8bg + v|sd%:uTf&L0~p.(RU +; _)w%$/ t# +~#u`u[w.qsY_-*'̳ɩk/)2* i9$7fUzflc9}],툏WYCIkS-ty7>T! 26Kݲ m&cӣh' ..+upC6&@j5tdP0=I˂Ė +C{޶$tR:(ϭuOR4$=jluq1?פ9Si|cqF!_z^SK}`d%DT wV>;<'V=(5H%jWMV#9YD2֓p~~J }D]gNSsjJmn->,vg&SLl#>^i8ʞ%4'RJDhRN0hBA0(r0K+aMY|"EGE_R^v4/?m[˨yN`K/5[71[Gؒ' '铯RGhqꭁ]>iIX +5'\GB ćd^ux+[^%e ֪pxE + 6%!Itި@Ҿ#% :*h$r7שׁ55׈Ց'I+6*ЮwȰ%U#zD+Jt BaUؕ 6}uOr7dP Cu}FEua7RV"KST20 EN{^lkƕ$vW(,F7b ˢÞOy<"_).kh[n 9W?gڈ7yș*ӼuA@ OpIRrP($e[iVYR +n#(aFq&mq3%\g?%ӆM5XD3b$ʁW ƿ5&͔D4®KcᏊ . +1Zo +^`~¿`6z q aXǰ)Ӽ܄'84 n"Db.yC<K d},{*h +ڸh>wMv^ c8Iƻ(~j? +eoyl/Dl5Żרpy1ܣܵ^004{ .%CA22dWuQ>okL<5.ſȠiffh7S-|^TjX[wCY*sG^1Ve֗+˃L3 /2y{+.;CtJ } ->٫y6q< WxA_PZ? Q y1>yK\.!OqM +0Cl];Sk)=RZ@[ɷ5JBeǐ$Ni"0 -úR4H~9.☫|Dϸah-)r~"eoMK%4 _7"‘e +QD~0T.>"x*O>酧.Ey+HVy55RWsEk*PxEGB;(J X(8hiqmh^ 0`}_APWDLZ‹]<4zG֦`oyZR|u^gCF#nr)Va5ƪw9njyIt +xI1bIy>}-AگOShKFx6xqqQ +3SU\ka椚̩Di~ ?{>J3mtߐZt]YNju]ɒQYlZZsNѴѷW>Sݥ0Bj+7q҄fU7m :8^;#eտ+*,_CY3MSU*LX.jQȖg_IWJ5a"9R'C\y׳qH)VU-Z.\+Ѥ/aen/|F[?SPkr" +^Y>VH9 &yaIxQfd}+] +U.o.=q-y][viRgk*`/pLBu+A@[)&PYQ?im/K,Y*gu(i2`؀V"fJSs=RU@7+>dْsmY)w=U?ο3D qjv83׽} 1r@vy:{Eͩԡ.޸,珈~CH{ksv_l毁@"lOR."0Fl]]C˧Mfi nq˶Q{56ef e l[IuY_(i&;to 5kZ/ jjp~Ch⨿䦿iRs!G-֠5 +&wa7WAƫXUr8+}E)oVӃIÌ}qZlh<gw +A?=$6-ޡ|,)!<*ǘ*z!8߀ϸuPpD|Ŝe=sm4'ҢؽYaPOZ(vj?VGgxI=V-̹uMCJH_-C]B~2A\8*E8PTΔTo 9/whaߣby\'F,Ռo%wU/ժnM*T Ƌ{5NJԢT9L;y _fXD\uַA:x")V%V/*]1# )ԋ@X"SVӅ4u.f?Uչk%Nj;c~?]Pۺ˄WҌ=V듍1 +E ֻqd{q׉; +NYHdfttc #&vPtQjd1o ­R)ʽ@}<7 &8wyybH04͂@>o` ~M`Oi#T2"-!NSn\ z$SC%Q%;OzcT)!M.wf.Po1U=Bl1F#F0HD\u̞rڜ*ujQO5u8E$7:"І(UuANgulWYE*Z"cT\kTxlx)$8(YBIY`[}.Bb T$=U8Oŧ yP-x$]0_ +j(sOH|/=wKR` ptl>f*ӡuU<=Ts(&zpKA?sLo`N0Mq+~*m-~F7^5惬H]${|-Ҷ9Y&=X'Vu+^ϖEm +Y/0X cAdPc_X VRx6b|C6^FeC]o-F?f7Q3V>͝yFsy]ݯMF͊k^NնI#FZ.7ƆQfeϫCJn;AjB JFw +mԗ6t(I5beElXQ͌ i,)6QS 1zJezVBf ۹ʹ/ HQ89SnE%o-4NJ``,)~utyQN]vحp+e"xN6y*,7$'x\CQL[8.d@}CɏE)1D?@晹b$?7 + YM N| _Td'wa}0Z<9|3閗3~o=Y>l0Wb=P1jmE XR[louv:.C=;.a.BřS[nWJ3ǟN1='\Xr8۲:KXj6e g΀ap%z"K1.c1ɇzɭGTRiVBe-)K@iͬ!u@_`&2q up%P +SЧ|NWP !o-t_ nyV|ؤ賐e`HʏE=>\Tǀ|cҎkIST!%Gu,%[IR'+#T}m3\/df)`n2#\M(CQd6flqGv첵).Z&wITe{JQܕQE\m`p`Ҵ\z[v7OVo9ݜQ}$SSFMWdnyuя: *o[3 O FRJ0ոl+L+&oE+d- +@?^fEkoo\fyJ8zΰXmi  -Nw}OYpz&@>gݪHc. ]7Mz#fe"g\a@\qyºJc\3ܔ r'WQVE D|PLs\h_h#9Z-TdL>˼!WS/bniA3.1Fx@Ǡ3UNN^nPOZdtvWO&-8ךshveSȉ`wPU_cař=շ}m`<<$+UV66do88{ηzkG}ڻ<<7\jvg!5M!w&GmpfSgO3x? +wZsLRq/~lK]QV:om<Q' R]AMXyu ^ȩ $}! 9LHaH8hʡrTtD-*fY]]wuu[bgg޼ߛ"ȹ I7HR7HBHudt *Ჲ=eJtj| #TI/W?{ΝO^'`v'$^E=7ITF2˵7-^'Z"[x ;[U7,QyWrr9E6cy'I gIRm2ZQ +{0K,^H/>>G@l`T=FZnZH ѳ$m¯鵩KA3D;w7ŏw^J<`i$M_x8wU-,/h!pbP1|*k _U;N45jX_:]$ %ͫX+é Miwzz{7`fOE5FohX}fL}k%Jq_b_A54WK'h?:lTHmm. m&"X7rV7l̨b]r+ OpK[{0EuwrfӵFajCCPktMݻVw[FR(Y-VE8 P?)p>͛5 #TtF%3 qhk ;`LVOpZۓ. j&\Cʡ <*g!r)J;ȁ&xK0N\B&Գ$bԍ7fpt(0H23ӲG1d?ź +bVֆ|\[w+tjj?b7hwJCmm#b.^VBDRb8E]4J 7LGc.Xd/a&ڎ @顢zQuֈ4Tqi˽èb˕ 43~,ymoθ[0 +l} TCuLBt 2ZW>Eh@+[Řy0= +sU"r];û](̏{e E=ma^2'FKv~.Оm0Oj(esߺ Pk*!3IBЦs4{^|{6k\* }XYǠD=A %$hǹWǂORV UBꯪr+Ca6 Kԣe :Zڿu6&?W&k).]%],lb7MX][H"}WL)RIrfr?AƁY&I~_IB${XlZXE&|w#؆`_vߢfu3fm89?9 +̟NՎ`jz1*.@爎܋`oْJ_+-4α6@/DWEjE}HRDl;Y+ z/1Dѓ(z)oι&;.4aZ#gsbZ+XWi;<~n"( M'b6!G lP<^\nM8--aG+dyXP^s:0q \p3bWu.,R&rm#қs)lej(^ ,=/FV6fj;ex%Dk%!FW@ao2QTvs 5h0B{UHiGCOzL'pbIq+'_1Lv +QA%$[H~}{1fKٲ:HmWS +ëd}2w7 j< O7i2G;SWݒ!@YsZ~*PƐ6xQܡ/9i7cGHVf3R>K2jZxH"Z")vHD} @} YJ64T(P_(*C]miSJqOZgA(ny8}wν37;?߇*x"D6HaeZ +5K e +tE=H\ƒW8 72ym]Ly 1N<8͍@:> >6pӹ$.7$C$pA)hJewT*FmKg-lm*{{v\ܲsJa>3_*ݑہ>V5|WG_>RR_YL!RFjz S5fځO2< `}I\:XiZkRH*4[(xX$u|I9̺TkVzl_׼gC%*wXR nY)N.9+wZ[E9ľWJ%wp`Nj[.b|JOsdW,R~#* ĽyFdwCp*L(8OelL˞)A vfFʹ.Knd~A򥾺]Di(i]YʯJߟ?>w[侾7KK6w"!eDp5V* 3VEa{:KoEDcɾJ#oOU44lTjFk,>{S?ýSk>Su=|j}T +SU.nk.mcŮ)RxbT<TV*yÙ<+`RC;S^0-itp<ȗ2IZ_0ȡVVKHWol9=fd jb%}DCy{sI*{ZL1r`n}+D_*Uz3}i779_kjxL+u ;FxL.mmQ`sKzK#>&ޗxiBV^\s3_XX_رC+ҭj|S kϽ|j|[X +ΆBL.?\DCqߢ7nO(M&JOiݖw0IJLM,NCOYPoQRSTUVX Y#Z:[Q\f]x^_`abcdfgh#i3jBkRl^mgnqozpqrstuvwxyz{|}~ˀɁǂф{pdXL@3& ֜ȝ|jWE3 תū}kYG6$ڷȸ~kYG5"ŵƣǑ~lYD.оѧҐyaI1ڲۘ}bG,{W3qHvU3sIa)\ Z, +     !"#$%&'()*+,-./0123456789:;~<|=|>|?}@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`acdeefghijklmnopqrstuvwxyz{|z}o~dXMA5)ۈʉq`N=, +ٖɗmZH6%ؤʥwog`ZTOLIFEDEFHJNRW]cjr{ĄŊƐǖȝɥʭ˶̿*7DQ^kyކߔ ,8CNYcjnoldVD/h 2 +R e r xzzzyuph^RE7)4=@?:4 ,!#"#$$%&'()*+,-./|0p1d2Y3M4A566+7!89 ::;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{||}v~oiaZQH>5+! ؎͏Ðxpjc^YURPOOPRUY_fnx̰߱ 8Ql»!Ceª9^ɂʦ2TtҔӲ6Lat݇ޘߧoX\[VL=*b/fMq T + p_L7! }tfUA, !"#$%z&d'N(9)%**+,-./01y2g3U4D526"7889:;<=>?@}AoBbCUDIE~% ہ‚rW; ϊ}bG-ޒēx`G/Ԝq_O?0"۬խЮ˯ǰı²µŶȷ͸ӹۺ 0@RfzƏǦȾ *GcЀџҿ'LsٛFsM6+1MZ:{OX͙~ʹ~y~eL~j~Qc=9~|4~cl@~]̳~nf~C~لOiZ/gP8v}6q}0}>ϲ:}i^},~ ׉_LpK-~~,*~&E()D9vyowy=TS3wI!D)J%OBvwN64;>FVWm +S^Di*bPkpة?%"1#!ϼK`L<n-e2*+) X䥂C@v2l Q?(=0q MzǃIz7MEY; Y@K (-\U&>rI^2IMe;Ya"VN,S;o_%sD;fƎ.R?l ;0Dq>8zDKG)3o+&<4@n͗0EO94#ҐnW9 b_7}B2yːv/ąJH삻Ȧp$ȫވy;Æǘfo虔F¨LsI,KhW2!AjHE^τ _wdlXggΩr!jU)[%B\DCfp <_\?k,.wȲirJRݐ=>0+cvZ{HllLVAc۠ ^{6oCҏSمbȏ:sz 7jP@Q;[wg|z30Uq`!P-~|X3+z2lIђ:_p-FOJ*Yr(".O'qäfrCRJ'dc~h!€?`}WzBd;hѲGϲmT SAij9< +ߨ%@`8xLTqė=,Mk $hJdx_r̰gʱhtG,KytomVK0X?R=Џ ]ٛa`sʠ7g&Grŀ?>r&z`b>&z%sxbw&{~څ]"WR%c"zD zA rs!֝=jcf]rmANJl$ے#ؑ >wTfGFF699<׵.'SZ*˺#-Jl.ZZx%m*| o 2ӝ_TWK4eRsu33'jRFBWl| +Fgml0L1, y+Hu2f;[T0BE{:qntoT]okI, + LgV_R:Kϋ0dP?= vE̷փ(M4m\Tk׉o,H=Zw/EI-LQ[ 8F/g֖'$?[u~fghXjݚ- VImKՀ,%ibQ*e97WKMYiHtXTBUDw-49#iԗ/r]hGވ/ + +lD2 h‘%TTT*Fdw">GY?"[f r5ʊ4`TAo4H5rWS8Xy;$Yr'q vUPV&4m/5LJE:S7Hvy.. kPXAl` +,e: E$@BKr.!{A$A,CY[EA;| TJkU>41aƜdcT.Us R&BchR) + Pd;ʟHbl?1;_:i^mMh9Ӝ+,x+(‡j3=P6u>a}&b (0=.À<2&m%u9_~zL!S`(6͟>թVlW䨸m5ypg!2< PR%wC>ubvbF.0UK$K;؂P,!rA5%\v" +[2gwdxJ:_'Eښ_+^Cژ I! v,V72UJLNITUKɎIy/R+=+(֨v6!M @PB%R--3|4-)#ͯ w.ܘ<;b#;*>$eG +>3"و~AZ$xOUx f𜓜x;٥Q h X(Zx=`dš 8b†id, ϐ!enZ +b /޲І2P0~ +1baktT ?g)˧9 С`.ޓ`>'4\DRdPaxԗ?i|9,t Ĵq]"m-9OD'Ex>#Bz6Nk%tm6BDzVQGq,2O: y{iHcy[]vaZT5 ȨR 345N@qG!fYXr{3^M7HX1ey87ҙ;NP9tn/D=}*I:2s̋%G{7abTBm6ۺ4JZmI׶Fהz\FD*rEyք ̣V-8ˉi#7XmZLW:2 +$Iⷱd`U+z3 8"}Y\E^\Qܵ)<&uZ!FM)V"ڟ}&à/ ď 5 O546PW눤0 fGlEbdc 'ƪrӬ[{K("M/y%0=zFBx}{w6{Y50%,40R}ԓvTp>K@fR$7HU( /10f<,1BS>٨RI3#&&pa5j19#yTH9cI[էjU̟~? +7NzM`k|-kqJ}(Ҙ2SaӼGi ; b:`uǤayU}T 2Ftm̔%OpuDU0m~L-_:qWg0~huw-] NVrP =<]x;Y1iw@8,n\(zqb !$zB&5dn61Q& & CuЎy#c%$7]w'z\0Lk{8 ;fGS Fx¬P~Km%t3MccM(bCB$ _ J,@՜ %ӸZ;.6B)PT~~:_tHNITScΤ5_3bO6-[o 7$cn:zNqnE2~7\NT' "[fTT^2F&+c5r~ԕ(jl 48mWDC]X#<n_ T 45 C0 V~ m&AGA7w@w;Q8Q ?d9#1yʕq_eS]y|d*&6Q30J(WG>HN vAg+[o:y1ډGmUV'pJ{"M@3X|*oƙޞ%sfJ<ߔ[-0R'G i++qNPF\&XT~ykPx>–~u2LX'P MOW rة Z?qU\+w>-q}y/sRQQJ@737Ka[t̷E8X,Tp!PVK$`Κ׵bu~*LlBz-f{i8DbMp/ŲF_<`w[Uq. Y!'i7L' Rz$v]c-ީ%HY~ٕ 鞀ws{)Wa˹ԑ`{[z ϡZ& z +- U@uBP.8jz B{GtϤ1ޕq# ^o2N*`DZm錞c@QY@Oy`ŕ^ )H??s %J@f-H%{#}řPKn@u5w:=YX9(5#p 9#Av(~-"]Qb'䠡ya +'£ +vO@%7_*Z-r*~z Ց4!wBpG-q.a+c"wmqk=WfB +k^0>npu5㞃= m]0o-1:ǒ~%ui;pVO/a3;0oKܼL6Ed@ZU%{ ^ ͰyOVNHLmu?uMBEQ1\IُOui@L7Nk\dd[i|lRܰ3"rW^  +19~(VZQjsfb5~Nl, $LAE \Yv3k"*Ie.gj4uDk"*T~~g^ ~<|1cPx7kF84K(/AI\%HG;'6`kK +ZJAFqKq$5GT#.a;1 p't.t-SSUn;QY(sў*M8= +BHZ# GcDS{d',Utl=,}*vcr+](_1rØ@?A[KDlv'”o>=ԏ[?Q ôn!ܘeoiB]u3PzP'ߧ%44Qw L7@?;gSVjgohop7syR\7V%xL| 3n|2Q|-GotuV֘Gk}fd'̐yQ/;^+b#&~ي2(ɚpTֆ)$Dru:5zj,|~0T\~>*,6Y +]7E9!7;au*8Y?Ң#WfiA~\mB\$OwDhE16:_JqBR%*X3 !O:`Iok2+}Y'1%Y GPMJ{rK w_ L&N NyA'ճmﺾo4gz"v;L je %Ɯ{NS6U'*@djNcvo^=Bi 795l€Aⶫ627ICkyV_}B.I=YR2U^c~o\Ƙa3Ƹ2@eU*Tlmcӱ~ xnNU)o`Iχa]PFŚVTC&ϣ࿋Y=d]/..FBXs+$=}buM>RWm6Ŗ6ᢐFX 5x{v*j;zv<_~AVUJϐ^IjQxシuQo=lK_ՑEkZ\4sqU7vOa J?Q)4C^\k[{3y~M|J'g4Ay,$0( jHl:Q"V҉1X&e s)MZ(W |Ϲ\88&tcpҔa͔ CC GU$^fb|8u̸&A֍9ke7;㥦koAvՏ0o5y'M3q"y$[Y@SgÓ=ݎP1)L \!B;U!)/C$N$A³ueuU},3Y'/Jc .8_[ON-<"NawGm_+yj~P]ſ^\y X,r-|㒒ܳ<L^T},^eDR,nkqց%|r,!gJx=~p{"\eeEN;Þ=${q@Q_\?/иLe>u#Mp'Yn_e<q㼅Ra8pLB=(YK[l`BKB#4;c;HS^OA>Ʉx\+0lkOԼ`Fcfup.wlCnKJIi]&fXPAn1کFTKBoI!ӮZ f)~Xhy9 ݨOC5&|T2ӲnSLB5eD0:yP;(w9mΪnWhKu{`wk +kH>*ڲ1 wp5Q݌$;LvvJ1f3n*Tg@oO#9|}?V0M5.ۀz{" NK?C_$ P&B̆e>(qIu`|ob|_0l2WꂝsCܴLTIa?f(/+PIwB WhgšH EiŮ(G6 +"  +"(H2̙dfr $xZEP>ţC~EF:}< \{ +% rH6N$(߫Nᷘ_%1]2:$o-8ȥ I-qt;'kTjJW^}kfQUr\ulNkHn᫂H*Wd6M2 *{`V%VRoJJ`+"yO|s86Vy8 :+;9ɨ=.qqѝ=ɥ^ӏwldG;fH^2`zBȳ ŞO*{M2MoR0i:T~%$9ED~cj<}${.-+P]c=Vzpwz\S;!?C:GFIױqYŞ ݇>;]mS)yrEz_n˕aI"l|sGvmߵ_7e]֭>ГU)i:D΂G}V W5*{f? +($p\)9D$ZYr|(4D܁OHʳ ;ܫv۱jxLr_r ;Wi nV|Rudܦ;@YNl-QnJȲc/14C:'K&̕BOJ{ߴzfsW|F-q2 ?}Y[pXdY<\v+M{ir8~LJޯ vlL: ?@o[g`}>?UrǛI2Lk.}GpI8QRV%܂L0/PUE ?ɹTcۼfHs^QMC!)$ ; ej uIy W6#LMi9ĦͱP*HʘFg]mߝn+|X$Z6K'OQJq m(B~ljSuZ ťbhWP"z@UVJ΂\,<\HA 5Oaf΍C75O Uݮx7F>QL~:ʥ#][eTS2%c Æ~EWg9i%3W4ފ:}޼0_X|-ƣµVu8H{YF"qĔ-F95E!L/3zLw@"FRmOQ&[#ZO/xˤr~9T00bܬ 4Pߋb>_nMFY%MOaN$ʡ˖~ &($~>tBM%^i3ϐEf8UB '`-icIaͨ+ دR=ZȾŁ=5U#5HR>njky/s6H؃E oLyCG/?QE%FvMMz)=ZB.ϡƋ/•3O85&YKլ(ST eҝZVx'xaV4Ë*H]z~h~ i0d,K8CZy{jCF')b|xNJ>V{0e#|SE1b狛*_R"37Boξ(p3_<ݥ%-tɫBetƓpx HuRuɵ)H?mf@Iz͂qrgM_D|Ce +ӯ_wCՄYK/Ԩ 佨/Y0y̸7.]*ѳa !d[m9#{-;W[ U$mb?ci3ؘsq6ĂT t֠} dlv{Fyt/ټt̰KQ8 N"4ʻc'׸Ns6I ][#?wsb,4U_ f)Eď* uä6Go76ɵ{'CGa+RUA=@5_rgs1OUG*ʚO&Q͡4%nlc=%Z vY Zeਝ4? eC` _wvĦ10KB/*Brv4όwM 0r `$CܝGa6;g-N_&ɰ.` `0M/s\PMf`p3 $A7 i c(y jӍ 5!UiMSD-rBFL&^:OF-T4w T3c q]2Rd/3U\;?Up=@b +TYRJ3O)*+sWu.[L6ǼA. 귒hoN_=C|HW Gz}w\2h{?Ur_ס,[<4DmD〷C/Fl Mr_򑹾g"P\TMIiDw$=` IӐ }6.jYx^h}]"]l +8"ӽ΃ǐL"Hڝk:^֖Tm.^@1~qxTlU#U75:LE|4&W25exz*̖̆;M0do^lpmaIS7kD#'͊$"lL?bADINmEh 8Ԍ*"vұE݌5Z5 `z~x[MN&a|b(ǁ$ch |cq)M_Ɔw>bSО$  Dpz!G@o3a]PnN2);K4 U"p+q 7bLay$04iCc9(6>E3a{ R䏡0`?s07y9'`Lq`ScLr&MP.ڽ,_ru/F=܏=1ltŜ 9>1lם +KX_t+ =#ثL +uuWK̹ u)F@jR_$YuBśGbQl+$,o8qlg!) n2QήU>Ytw(^'Y! %GU9, &>YcwU Mj"Zo6VWF9=al mynqA/2AI̐i +qAN?!9NxlbO{eiYQ̶>SZ .&sbj?1_ǡPkٟx`дY!n6fVJ?ffon06l)7BuyMAѢ&m>>Nj#4J%&|E]ۊ:i2g0io*6zXh +҂3;1"2ҍ+O?KjaY|nMHpA/LsI5cu*ΐDx!W {|mpq%qehrYbBt M7uA- +w%5,x+ z!Ί}|%wpȩxeXx|Yy$M}yAz5{+=}5"6~{άq~p^Q~Md~*XŸ~,LU~S@~5 ~+f2T"P{pUIpf P[AE;Z1ٓ0U)Fj"0΂op~7f ![BPY_EE;T\1撠C)k"djpmfr=[M,1P\ǑES;`Ћ1')}"Ρmfni=pkqr^mtolVurX wtDyw'0|Yz>̾jqźjlr`ntpu0rnvgkbtgwWIv~yCtxz0b{x|bh|~j|l|^n|~pp|j\s}AVtu[}Bw}0z~l;fׇ i +9kDmh5})oviNqꂿUtXBEv=/yVǧeP{qgi卞|l{nohLp(TsuSAv@Z/ryX_dִ2f}}hƖMk/zmtLgdojT3rxAKuI/8xσ[c&5e[}gܞrQj.xylfoDSr d@u/x\ębp vdܫg%iwy3kyenbSq@to.wUad`RfWh-xkkemn)Rq\@?t@.wZtf4uhvjxxm0xyosekz.qR|{itP?|w-~zK'rp{sqԜu#svFtgwwtudxw*Qz%x?E{zb-}|Xpzr'zssj{@(t{vxv|cwy|Qy +}>z}-R|~H(oYpq݃^s=uPt;bvSPPx <>Ay-|0m{opzrt?s^auQOw+T=y>,{¹luSmoou{psGrlatqOvk?=txj,{ @k mܖnlprxqؔM`WsNuȌ=&x,zj׫4lgmomqq0_s*9N uI_|2so|u]}@vLO}xT;"~z-*|Ly(x*yyr z$y gWTaˢĮkTd@D\dPPp-HG&]30;sCg( 1DE*n6ܵaz*&>P3ĸg| ,X񦁓`S$>BG DǕu#i#܌-`xJ!wم:(`[HWeQ2UFD`|:Cd2~TvkdEeUb2̽p ʠ~[@QdF!7H$ #dLt!BOK*G-iCrB.UlmO> ,B2W<+367ߛ@ )۠&KO 0ޏO igm82=D 4FB[!AIb4~Z *fz\OtF&ӝN&3xF[Hjz&3n14bM zB! |+ +/hw{V\lsTjg?қ۟u 깮D}û.5ʺ(wM ұ=Ljeo(u\ yPXƢ8p2232"uh0 ;(3-ybݷ3WdsF@w ,8#!H*9)iF^ +P7Dg3I33D_)JQNdOm2ta':=J.۱ +s`d+uu- ǵiȵ\L +kw/i&G1|91:H^gW@-Eif?QF?/KvřMkz݈uN0:ӎ3BJ]PU@׊VVzDPC9>RTl{=EY^ScyjN96b~mwj[ Zl'd}[YގM:tU9WI-#d=sѣS IKuƷ6i/JO{s{c@6oPU,'9cV~M6IQ1WwoT+mlF0\Od?oi4M4MC%HfM[r0p[p|R’/Ld/_c8]׍ YpFKM(Ewo@jjI0/kad[H>|/ѓL |00SVRׂV2Cæav4x,'L82'7&n&CĿf]9-f]i{Ta4EeNٟή"V_ǔ3tf65ҷ, jP6Ex)ͻUSu@6M6dFVSˬGŦwƠuy@>.TȆVOdj?#驺sycA)w,zl<ـB*7ij,\P#;}}~r4fxO"ZhNMBe@(78,iA#FaN}qǖ*lf Zۋ M2HB-7߅,yY#p9|qeےNYƐ*M}"A튘6؈U,ۅ#||(qW,esY!MANJje6Ç,}#5tPcjOf=_`rhTkHm=op2s(Hv "zbtu5k#jl_-$nnSjpDHrB=tytn2ݑOv)yL |triIs ^ٟtSuSHt#v=_.x02y)B{! +}~st(o.w]^`cCcHlVf+;t)i0aldOȯ>tsw[-wnw\-_AMb0ke#SsShA!a7kO|o>#r -v0[Dn^aaShdL%rg{`j哟On-=rfv-vm3Zp]­ `܄cr f؝C` jRNnb=q-vBw~o`^q&ccrfBti quk_wInN1yq<{u8,-}pymjynlpptnRrp/qsr_;utMwv2>@?nC)HKс#Eu$%`^>[ +(?`~^x0_+OËv&"YD>s5x']~-if~>NF" P^OG# ǖ0<7ӆ7 :sXL!kݱrx{6Rt"+@q*7k1U誘Y}(~\H`J䞂\ +52[{F;Onݦ *C{2Hpuw0D(MHOB$vKѻX{'V' 5c + +sh]T4I DGãTD(2BNlz9eB_ ݫ.#JUbGɰ Pc36߅!3?o/˼ 4Ta1l-vKWZApɾ<>\Щހka8Z5$GdW#{{ߢ! e8l&Vlu4ʚ@ԸQWJ"쎛)9(6gf y'1?JL)b쭢l]4LkۘPpuﲹ)nCA Ŷ+2dEH'Hm&Y3uѷkѽӭ1n]_Z<ڮRvӛpjm9G݂#j}dA-uڠ +0\C"dhK>مٸ:IFq\BVhF'$[I&3BtK\ D'`;I ["%#N\I +|?a8+ş3"-Aש_ZZKO%u6`X{cͯw1 $+OM{'E],jz6+~ Qk a=_/E qbVk&S7fg\"&]KOÑ: %ijeB>%j:l=T1e~/ߪg I0^YV)<^ϑ% +զՏQS-WGpaθD8ߠ9D֑ՃXM' +UJ]I"mteuuE)-3`Ҍ SoO6Ju@$ZZǚ;oam>݄92)@m{>-V|WU>r$Ӳ]qّ¸zEYuɔ>GT@蚩\'}њG9mp.d.@L4c&,r;b ӂdlt3ݦ]Q<b-w Nk k bK%H@ j"W4sf|Aa{8c%J@bW\E':Ehsř=}9fǹTW !3ߔ% פԘ]YzĀ&XIkWdPيb]9gbIi $ O1wu_)xS$P)m/UI .mpsf5Uwl}oyh 4;=DUIKSDSjj:?2*w0P4o+G4O6jeu HW)ϛ=ݮȆs51 okaIӽ֒Wo0%>#}?V5N_r}%7 +Լ{!`D}K_4 +!Q\HҽzȔHN>uA-^Ჰbg%+k58W #wi+q0khcuTT[`5Z[`J &-v**cs0:-7o3G(Z!d  z Q}vx'E}aQ#*'viƷ|'in˵Y;eR{E1vikYT24o/;K |O c +Rr_T'UtKyγzaL= zs#k)|OĀ܇:axim&&^cŽoIѓ` +W82K/ױϬ˽^ipuO:JD:WtG<8YJ] + ՄyiZP-|xm4rQe`dZH ;4SX1̚`wpu>7 H2%Cd>zES?+&e{\Q>+) ^T9ZPFV+@l@ A B +r3L2$$x *,^-ڷ[]<**RInpdk ŻΫ :C>KXi<_TTՖqcs.JmZEŒ:^΄hsVIbm8tSX&^ a*Ɋn^m=A2s^mICca|k`K{"Y١:nf,ڱW x_n~ +!f睥# Aɧo(u +gįVg攷E)?n/ؠbdSu3QQIB`\C!d +P,2QC[Pһn`RXYU^',|Y5G4-},V{:T5zGFdx|4Zٲ u'ʦ"Ww[f^'0Xcx2rKJJDJmB|CÁ=55oc/hNL9'0jI. =$!_3s^>pX0]ScԹ`gi9Q?+,O|ekkC)6bf!),MjQZF_Y[-ۈfiv&mH!`5oIxudP#F +P&h_2nnmMsC?wOt[Pk+jnA ǐHځY*zל`L﵋TL01|w:44o(%j̨5YJ_|fyl00DO+/.5T"$8[g)T`MH?Ɠ\fިÕyL/\Zj@Ν(Wڢud>P"Yd'$$ʗVJ+W>pG[^Gڻ2|M 5kci{ZJbILFPCR7<]'wKÍQXb* +$f»~ ^̈́:)]}pA(+RXzE;b1t!9ݠBj` d> !L7gh%7nׅ _Qg1R2Ǽĸ:@n\KX)'WIC0hݤ!XL}4l5 Vh2,?bLb#(sÀytk]:ibP_"2S&F ߆*:/~5l6fݻ Ӡv(l1u;8qi7mL[@Wxlg Y<#nMDyYZOEX;/C<_IfGuROM++c7S +4ƊaZԃu Mߊ]>]o/m^&=Nh̕.g*>d_$ +]koj-]wz`g`@XRSZ^6uV^og~XQ 濮a%{s Tp4{HLydW)YU&R?FD/'gH7yOG +S0᪄g :po)-.XF:e*diG{.㯙nwn.tY<"`7dsSC!x$g:SX9Y%r_']4K . q cYv.㏢Mrm*ADbW냊M1Dqby9mT'buq7Or }yXK8`微.;~1K}wҭrB;ҏޒ &6 Rr*?j䆑lugICkM|vhZYHn8VzQ3N??֫zGP5|No(RGJ[5&Hs)qq}^&2n:zǰkFmP03;7Nsi+ZiӍ ^zs7Tm , zb@p22{96ʄ/= 4)c x +t&83B-(;^SedSy7yG^H@Es7<AQ|h[\jeZҎy1|i-M']|k!3h{&m5&[KiK%}UEk̀u hT[*FkkOZ e ev]G ؼ;GLW[d;oo3xY{OEk[@|l2섐^򒼗F6a 9uUQ[Em'*uWAw:^WfAw:Rc$DZ9-N7~c + +?;A34VfO 5*DvUe_Rqr_pMv]{қ[;f4( c5ڑGdxEjO-n +| g8 KٶŲ]{r3J(?ұqlu;S7qWA}ǰ=o +nxg|GCTpTaH͗O0U`llڤClt0jh~pڱY_,x',IUjn\[M zDBb<Ô]T7S0Co}2%sF͘MQ ś!7fSѕ&.!mFk(+O Oȏ@ W1fG 0JZ-#=qb>@@gIxFz|޴\E=Yg6atҺ*SY5T9vh  %2{}n}I90v zRf8kOʼjVo:*xH3_ 6WWx4\;5juK::i7rʶYAd~X:J1<;e +(;MsrlڪU[y5vw(k +-OlHWeG㐣݆L9sŠFp6i&xИp0C2}TxmCH#ѽZyڇm{+EAaWdVSy%ې8bש"SLL14$Bs&Bj&d@Y?O+82}-D^ݒD(PR{Ѭ.s!$4Pڣo\i(#u"D8 +:]C>6ڒ׶*m@1GQm lìOrusg# tk-ۤ^G) yۂ2b+PgDWB;T+4Qv{9輵;!f6~/ė|@r~EM$,<`2+oMҿ$ȵk뤆)<$\nnu|LX+z-]:r"Xꗺ.KW;–YFC :Aǔ+IU u+U>.+͋;SN@] LUXKx6 ͑8=*U4^qݗۥ>S韒+Ż eLsf v?m!'粈Yv0zْ2GwT1e{BHM, &fr(y)% P Ehl% +$EVDĶt o \~6-s//E 2<뤪t :mbpVn(Q7:ziZNl*3miИ` snX +U\Пbi0^Kc=!!{pwpyKH&Ș/UDg#M@1&yf_sIrŔ\ Bc7HexXltbu!hI +&) ֩ršbps;Cu GFq~~c6RbO'l"<͖z [T0}5y V|EWrф\2aAA0 /ɷW&aA +AK]מ q\kPU"Jѻ?W{j#'rG^$U)~VHDTup7eÊ⚊R"I^w0^+mOXiMi-T5ȝ'N]~{e r5Ճ-wA-VYF~UgBOJt8y0.{KO(vlJ uS0փyk^?6Wc+ +Cl]Eko%ݼ脦g}h0[[tVۃw,U^|}X?4:a<X s%هU)<@ZQ/[6 . 0A=fxIҗQl3\PBoJ]Դ\>[3?,ЛMOyIOi> '|2kxo6oy*Zo9XYifNP?1k𾠣 *_BupֲB[ 4Xφ}P73d"dٮ&<ăT>x4Y"GXF%Ngt2S 8.hpq܏#~2HleҢ(j =~n$ Y9PKC‰/q䢘&lrS1|8+ۺp5q Z(QӸAX!\$$$CsrL2$L%,*OQuOłBuUX뵊]xV~n,[|nC +-bY@X?(e92"կ)fm6@>_|Xȼ L N+VJ2v&ǂga:y*=>C,꽅zqwΣaVbP$Ԇ3H* +|tc^7CvfCUʆN\A X)MȊQrK{Fۏe"j%hCi24.$ҲɹDӮ?2]HMtaPZ+C9J*_r%QNH4r{W) |em}^e ٻ +.v_.e'T)V4(FoUgzf0=rƣ[(hGjKҢy}%]ʟ%(y쭬0L1sR1w^NJO7 نyoxõO`i0)¿6T@JJL#״C[!)9!w+@,&TQ0GU5a +5\1(-9]s41y3yʍ/ G䇫~IĴ41_35g%@.1N§ N̡Pi'74@rz8Z? i;f +cENOri@Du{A6.ѱ>1_:, Jf?/LCNN*E]٭!mq=p)ݍ +cFMH?b;t% 7r~L&3>ﰞ~6slD'9?6T­ϙ^ 5; +k[}gX0^hq$WKJm3qV/f̔&|}31sO[9"6ε6 9K+|dj8a&kɐ=9wUͩ?|0,lugzeU,}* e-^uGSoy77bC#Qşn[,( l^ 6!ʌ>":jbiq2$V1\$ǕwkGԣQ%[`ѐJ Ή `]+Y)u!*5(HIdaoElw17hYxЈrMyA39ScLYgBل*dlQ P/Džml)IR`i?ĞAY訌:et/ ysn琸M>dSG&HPe*p:vFӫ}9|%*CdڌTm ؍θSVkq~VQ< f +CB'LH? 6ǍZWzjxA|+cshi#a43 KZr?'H:m2AĽ eЭdcM^k^Cj#,@DL2I~tHGǫJ̀e W`_qZb +"pp߄CH I&d2L)xʪ*jXEtJJ]EZ_=@XY#>(UT#tgE UO4E]cDix`Ffw0b(U +Y]sAvjfhw@A,bx#iu+E_Xx˼U-EW'_@ce2b1( h^EN +`V[@-kbn_Pe:60lu-'\j|Dme;tHGD˪&աD!ߪ@M?B=rΕtSwo2Y!;DLž]򮆁˶Rf;˷-r0ۏ첸R}"?5#mk+3((.RxP{K$ ~?uX m(U$C[KIl9vL"F]C2q.OI61Qx 1iQZxle_)O&uZCj7$6} A~8zXmb|n^i>]fQBchJDj^ k]rou#Ih +8ЂTc1)üW+-*kxueI~PE:LR] &t-¬^*$M4-bB c鎳A9ZuKDۄT}pp;dzx0w + 7 ? rlJU/3BK3hf@jm1RזD*p֓2O(Vv +ndmMAO;1S`M-a6)N˛,_ +l[c.Hі%Ŗش+#]lcٶ$ s~&b~In^Y6-쪸ʟ/FRa` Ei|o$Գh:)=kZv6g|V'E;R^t\"ZW +YnN'⢒LiK[!6bjnf$=+ *.ӃKvIchP*%zډ,1-pGsD8DC7x&X8e!j5kL4Y &XqYLA)$]s_g^.[fx́{sHq  o݌ KFaa)1$PoגיDO̐Ńwq?0$װޮxYZN8$8 _ُ$`lcZ6ݐ?ȇY+0H5zቔkQ}Ö!~QQ2&P{BcH|7gz9^sylu^A ;RckU>)vQ 8:oVcsK68#7>^nNk_<w*>mڹ3"ΨŢl` D#ޣ7W-#hD:G"DxA4 >X( 6b-X>*'qkxOOX+{5| fP|~NEzEy?|S-2<3}=`[~#ltGPj_ _߷,cn$kaM=UlMQ"gɆ 5iЉ5M%7R%qvLSG[]]M vKsw>q| +7pL=#.[CjϨ^wUOlTvCe]j20uuFfձʪ:AƆ"E*S'_ +!Z:Qpt47rv윽Ys9{<Fr׃d+G1 F~ /bm1&&x, ^ LtZnDz4g?x7o߽06m3fB|=ksΛ 4|K5~Xp%&(*,.0<664^?|X@`PsB#b$ PX<1A͹O3l.O IrOS#?UBP' +BPT;} *~>22 +EOL_~[ g ,v,cy]zFl(}FVύPq㫪J6A$*H$Ρ`v0;f×9zL2ٞQC|QM5xzAR+Ԕ k*xGjsH%Ť^Vaݼr~Lȡ3h5$؋#2'$ +,FP].V!foDc&2`* _'ǹ{# ݰw%{2>aQ*X SV*5r1V/\2dL9x~dE ]0 +^z[AKmILŤSK``;m\ojc{.]w{]}A][UT5䄚T9"#֑$-QJ֙ +(R;7n^윆a:VVTST@e& +PkLlvw6ԷU8{`>5#8-Eʦhc5Ij ɱUx(EUu=XU=ux}{tjG +4a(=Gr(nËqZTivU肝 F7 :&|ؾĮȬ8CLNlG\nt{Bvx~T2?]ъ?:B': nAS+w."nG%PBRBz^MLpz&*T@ mHh؇Dc΢&ZT_Wj 5yI5LOї5m + һE/`v0;fˡp;ϙ־A}UlK8SQC#kדtYFUVErAF̾!b7E|{e wY쓌E8T@V4U4<7IIiA(R@: j:8vug*tE@EQ*r 럄B; !rIC@V@]_ӇQ5UW/)aY/-Ry%F2"  InK/i"tY{p8d|Q\Đxi'6ĩ/UUi5gԧyebLY(ke&\1q(h-Ev;wΛ6 !5kC(xH@m՝N&וy UFeaf5n\+#$,۾.wAڐ&T%_}ؗY6"s 9G&j ơR9aWLt~-m ANv$&! 2p0t{z$?5Z uTj]Ġ`9t& f,h؈!%gS$&T<6ncK /'z&bp`F*8b(@H3x!}': yo8IP&\P{C@Rt(ɓʌ*rH1𵐗&dx'McČ`$f>m|S~䃱ؕ$x0mq]Pe& i#eF6AWB~8QChiTɞ <|]z[u*nz!bg9Ԓr3lq Xr3" >4SPh=m@A8 {Ͼ+\Ǖ--F3a@4M6;ҩ'Z8JԐpjj6 DzQ0'չ=;Qv(X N#0-z#}2Ң>ƾ#Ahw8Vw5C/[r:mU5fYH7H)N6S PX'>}<5ӽe~y'NNdtOݗdjM Z̓x3YAdECM&-ڀjG ož>ْm\-u ZTS#%xG;Ѣ8]0^`#Hƺb~ںnA-9*ViTR8 +`'yM>aATm#GђZVZ˪ݐETD_l }mϒdo8zPc)VdjGT *:YϪ z*MSqKP}W7K۫Ov*om;Czzqt}JeVl|eryItV2j)kb腳h ?|lIlN^mzQr}\E+ݫl([Xp1ٔZ[m@_Xi䮠pvfy?q)?GZ3=@W =T2lvsdrڰP챢ށzE     q5YTp +yOCŻReb &l[Ghmb9M%>]8!p~{gkl’B42?ȩVnI6 +e%2G-8o QP6ncN/J/FQ&= }-9>#, +>nƙ,Π z,>3'ЏԍI6Mo$GWdosfܐT:jGyhKڻ)k[Leٓ#ceA>Vl oiEǪ2p˪lMe.{J~IT"Cvnc53}-"ÐhI'ِ,kHM"D[YjsUZCM:fD˂+)U +Naa␽Zfk@ 0,"IBLtrAlĐ  N9Vr:#Q1ha x!coDjԀE_dLqi&]8NLSNIS/)WKlƜ5==\[jTv]٨@(WKsm!fwO)iiLڤ?鑓#tɕOL=?ٯ9,o9̳t2UAP@C6-!d!@ BB6BĂQDkop94Mre9*ӍRMd0W:rB5*G1GRBd; ib"P'dh8^`B5yϕJ\ L΄*nW2b߭L)3t*E&' sdr* i@s?/=:Vh,~ߗ;{u15k}6EnA;xobhS$u,N%ɕ8j 'q/qO=`S)г ,Tרs=@o5-z$^˚Fk3(lUA?5(!4v(_uw1ff:w-}hXKvzqAOQ NϜ@:&z$B/ $Gc*8?z0;ߗ]/ZZV#sY]X&qzlKNCd P¶GFޜ=;èj!,z5ϥ+D`C^n"NJf90 2?}ɉ=yΝi*mJnL6M$_e A ($eEU Ȁӏ^9,>IoGs}YEHBWh֯յYTwL3rS1MOeS-)*d`[hh%؝jӣ͓\$|[XRK@-_JoЌ+כŋ8V"]?/&{d_$]B?,kʯ2xF5xun#s +[oyDs?{how1,8 fL?CVAyE% +K.?)-amU [5[ڜȺMtM0o?s}*Ϝ|-.̩ {JZVu (lIneC6%FQnj̍;\M{w 564q@p${{bKXQVx &\^fA{O򒻭m.B0b @ħ/d?4m/o +y0wA6kloz=vVtbd.RC{,DŽ4]@Г zӁ4#L#y,xK|}]XÿC>A𵲇i6pD1|܎,HψP(@c ii@Rq2[eaU^FR6Jz!` {v' fQm)0}^(6Rc$5 (r~P,y9wM:(^։gDHDϡyl"0A4t!5F5bl ”#@ +)ۚ+Ou`;\ mqׂZ4++'8bqu2ǬN Gt$ F7 G,)O '6bgSo/+WuQ.mlc`rj($oQM +0rIF?i#@I_S>8Z7gW-[ܫ J?&[1Ck\B"mф;[ + 7qD +$fØt;Sj͖%qzfg,;-^Q`-}"ҘGHv- 35Sl.J7oÉ@ 5pNgmwٱٙmu*ꊸ/#7H NH  @HB\$77!PxE.ov[O8bD>Π)Q6AY-aWjLGU-oF7k1Fj@3\=ۉ <'#Gޙ?uߎo qxeP IÉh1nzY=Wu Mզgԥ'(e]-gCGi.];^ɹ>~o[?) oOP^M!=aǠtRl69m^rU4\ O%%-,O]TB*s;?Mw+Pmv{ւC)#HܥO)ih\LC.!K'b1 HQs.w{ϟ/2Tp c6#s6"bI)i+˰exVz:;9 sYAnSKG?vOW{$a R*ը1o7l ˯WC^kh+qf7 :B|J+*u}B2#PCѦˋS%e*:g cCh܁li) +`Fm5{kï 5!>s^sUXt9UJ厓7YΆ-P7 $*gz0W]yl`\:XA>s97<5'&cE=ffӕDdyix M8ZH6."4Fm Iz9)d1 ź F+)mju@a7gDfFiUcԝRڊXxi>6|XG/@@+$kaQbќ0/nMҋ]%:c!רZTxY jq4Fּ]Xyw?=5a'v:u]㌵u=,"@n9 $$!+E@AHGBBpEA."(hA P뷙ӗ}Їw +oPEiԑ9qͩ[ q)Q<\Uh.gY}WS(35QEJYj)zS h/Pk<^~'?aS| A :8}F/R+|cha + 4Y^HjZU7 +[C1 ?w<}Aw{_Kyē]Pmp\+ؐ- TźˠRVYĐ[tX;-i(i7[9GPq4zg6@0=4kֈ\c-MANTij *A+7V |ZQ4fmld/ 5@ +ݽ#]w̋Usri07mN wˌ|!WQRQIc fWlerU:Gg&{ q? +n. |f0rg$u͚B869A$Vˊ:bVoi L,EUJ@!Og)Л@v4>4=A[+g $fy4"nv,9r1gJc:5J-AYL +:J匞Y*ϗȭy5Zg!W6@@6,GDOMBӆF`+٘^-+*uj/iuUcnC9K)7hsz 5]Nٰ;Td~>TJ4& *ow} u?zXcΑggS+~P2u.3MV&*1Z,_e%I#\iPpYRg/PphmsY}~'kGs4Tj`ޅX~>3en؈24"y 'ʸq~tZh/5kofصOa8s߸F_$@3q˰>'n9;7^^^=1.5?jD'_X,D,Qn?t/J\p &w!ב0؋gTStZ*j| D„=bCB3WYx{ot}5[,w$ 4LBA#oaQQ\xąʈ}IHNK ȇߠ Ke's}*_};v$p;$p\,1~ ?$ + + ! +9~|?}SRwp^@YH{VDrqQ"Ş'VpoTU$VdDױJtzt +*BM"{i1a=~oضR[ Q!q/eUV.yVH[(`IʪYL 1KWiE2c9rg0]DgQ])ܚd]ѯWiMU}:o@:vN?ćѱ@Fq?.[cT(y1oM70œh~8Jh.#lQDҭWF[3j;E#@O<~.;YKhk&qtd=rT}J+zPUX}Ψ9gTz<#8:<1)y/%O$yevUm:>Cn^!R$,@P18Qr .eFҺs&o|<#AD1@q47剜_NJ5yvAT8a@Â*2 +hc^3~13JEi颸r!:Aj$U^NMrs!&xt~8ۀ>4@sWѴm)9PV-kQŸiP8SYFR4c4Kl] IC4<Q zás!{2 ЅfNxfKH~JμΟuF^4܊prfJ@г:6BRBd +Am-[[ꍏm@Ch[kd+>~r`vS!CkBD+Y]d=a&JD;Dlw؛7c_so` + y툈z6tk4 6֗7Z *-Kآ&%ת#qfB׆cʡ2 GMTC?.X [ZH5:Wt6譥dUEFIҬŋ(ZǗkxZ,z0= >=P~?Y9=1y~4tV$aix%A!jLsLdEԶrV!tZQ<s`i ,{߸?xQ#/Ne`%zyx+UnGz)xVY'iNCV`k"|FyT&`y'_z>#n/F\Lz2Cs/)Tb%Ӌ\8yU B+|Ȫ/: {7Ӟ޸ho;A[,8N(V'O7* xUzjޝ;Wd(aCV%l`PPyp<}捑^gՕBkQG5wa…g7pkŭYlhd˿L^b/IİK(9w} ۿy7S[Zh=(L0~l.}-ZYn@."@P +gSDFd{W5d˸:n8 \o3K>^=ݻ_%%4$&8 j%| A +oմĶ^Ƿî:fԌ& 6-LzH| b?ӑu[}U +^^_b6QYU82Tݘi-434o'iͩZRn +ZoH͟sӹ?}W>ߪm7 +b#1en ?#s"*aQ{u5k ixtJK} +LjH +0}0:[gAM vtv3tљvZuծ]uC;rCDD @ !`BBHHBr;\BZPXnŋu ؇}f~/76ذQ @Bbh\Yuun^R! lQwLs6H-M{#RpRʒKʓ7k׌MrM'?gİkS!" q8@& xw3KsޖG!禼:􊑟 %X~H<齾vmWkaİu~AD +(Dh>F,AC~I)o|J"&xŭԤǮ03bgF}PM}3-z[6|ǓoK@C' 룐A PtD`#c{xʢHjl80bÀ!s'<jc/q/Ӄ@ | +8- QMxFeU>iHR|/1{.K<['-<+AIgPW7 K g + N H]iD/X"IYEMo( +g]Ytd_6]8|pR~ =)L}Uz{@ yf4HsRA:VPRX[CYqDu*ܹr. Y%3XlsZ~=*UN^i\U^,t{gP5y - AEr(ӣAeQq>IY`<<)`?5Y^2]b+0gnϪn]T_\Vc/=˚%>x[@A#I=,-B- g Vm<Ǿ_%߭PfZewJ-۸?{5# %SryUC ݠ>Ф'XʂRlFyCrsTI0%ŭҐǞ݌!Wi KFMvWZfC?]>jqF-VTyl?d^6b#Sl0bYKO̹4KftDuE5spx!DGSvWLv|j'mmcUZգ_E&Ѕmc~0 ֑ܙyWk:nv}þv sv$4y4A֏K磻2nuJUaDG222qwQ؃RpaWPgM/ uLnmXivu:3_0%yN䍡I/ɴQ:8nj %bP,|Tv@^@q;$8ΐBOGhOtP___r:!͆i`=li_(x1ra q#Ь$ $v@mdx8$ F{8 +;("a)^STS 7 +Ә>ɟAdL bc!3쨠bUom`kRS2i@1ȏlr>>^@=͚#K+ڴW+lc4`}_81CQ~u6hxF 0l? y;H !?)|$Y"3?iV徊H!fLSI̝Itx#{vMH!!M@0cr?H+e.%fNMcH͐/dLk V-I9wȫ_G 7^P6P%Ȩea-\`XL)jYFX| ך3"紒jro/&ꀣmjv;!NzA1 +1+d)VasYV.o*X0N?'Tg<'TZs{ZI=yw)=?S4О\ p|*N{?(ы +Q#eMeXqiJѳRSFz9XFRwOMnUzwOqKqOVgKx}E5qcu(:ʢ2 R^P)R @JHC"BE0 A\ gnև}99? ^!HyYz@-F*#1KcH9}b_Rh2/s/gf 97y7 HPa 0WRX3aA *v=A)%(j*5ybf?7 +@\MH@2 P7]APeB<*#q +r|h%x\N/bz|VViè- +5(n@ +^$k +$ub +wkd߁zf0]1>F)\d7KheRUr:[Dx%2Q5I%euaYI+tJ^%(G-il \~NSyU0.FyaM𔋵dCPq d&؜L,QdJ)BJ)dB֋$SC wNyߧ6Ʈ6/> +qJhMIlm"Y+q &WQ%+ŕm +Tbs@@ӞEoܭ-~b0䤶2'rą >UepKyBBc^3XVVIqUz1 >7O;AtzB;~ICțF-LZ,8GK(^4#J]cz9@YA}O_\;nzGPLh%%lƲ.I*\Y(ؼX%mK$ik ^-!Bs@i +?lu?ov9цwD%HS2{31| +n)c!5*!/Q)Hj&I A |sPsp3F>M/Gl|tĺκ>mw3ȭUNӑ98żbt,Bw2IjVs:L&9Z&9&^ MaݕɤvOeq'Ey+_hbh'GDzCȺB(kAzE*f5Ό0"4ӌ)ftPnjXo]+o?سB쨅手e36M$Po(u +v02`Ry=0^G/z*TN k㷩a#3 +sr%ۿ +Ve ˴?si1ߓAԇaqIw3SY*v5(Y51讆to40xQ9rl|Wӆus^Y~mKw|NQ^#Bqsғi1s̈9Zn0/GϷ`{|{cn[:6-2vk-oVZm-FC q4Fcqƴ(c j&Rߕ}L{#}9,Wϼ3 , S!VCfi}ؼþMGNK?z8O.{—`bc?[BD/b>bSPo93){J<#}Yw:W@F4 WAZY۾[hΪ8,v +]#xA7̀}@a zZ`C? O-"ܖ#>65ڷ;2"{+vM%\ -ypI^vq2_gQMg9=ǥ=Gg>(*(Ȏ;Hd%| ,심@EERVOU0l*wo{_;Ci zCg н|_H)Om;ݠ0ʃ]ʬ_Y4("65p`63q' ܭc~3!>G P~؎wr+ ..:rN@uᎅEc *lظ +zHMQ xzAԾDkW pN8t8@`s$@fka;PYln "b HQƺoc.᮳cً9 ܹ11?` v뀍5}wG!Bj/YD}鈿S ++5wqY.棇xcy/q14o(v7kHx AAn8x|A +e=1ı.${5pנq +&+0ȋ9 55l eԄJtJ{UK?Mj>"k>G>EOsE7ڙ+2k1`0)쉑KxP{ +]D#؄t +J2:xՙ&V"_8Cj71RuӲ +6YPsMҹ>jY,BOz;[Rd:MRhg75V]={__Зsbc kAENBv?k|?0j78H89PE +-aoPoꤜYB#k 5*a\pP&k, +E|>O<3KbXC㟡m+y~oߛ`b<&Uȥ\59颦lY€VɋTg*uũ 6cdJ3Ft@6cv`^GKq;}^] +h;c;H N]/eS  VUfRe $7eMZYWF0W-3|@oΗ l1a ؜um%]V;B=vB\pW-%\gKERSy*ʐU(E_0}&79 @͟ +S߮\tncuO:>hp{+!Z#9RM2Ǫ* KH)T*mN6M2յ4\DgB9_2?B p%MumwuL@#pBA^ ST::8iQimlY"YY9}^Pd9(R6 D)LI3 %8)|'r2$E9)yW ro?(}Sӑ) ֩ COǥ]%c7M5Y,iY!iFy-_RM-ϻR?{9,Rl|RRF$5tYqE7 )ɏ<ޑ)  Y4PSF5;/xWg-^f72.ԊU!AyW2*R/}8Bfzc%9gʥAgjĥ:NwJCrgECzu6Wzsmsw~a5eJmN qȈԪkRbWH:&*_V/+w_rDgfIkU[4Pe1vGO}MO@ٛK_omϕY' YwFHNM?x=G_sb:Uݔɬyɮ|ɭRAb/+զtU|J +WmR}mNW)6'|cDŽ6%ňw3\Heܩ%w_J{1 GV(d2*uTnVyxիE5.vmyN5ҏ.b< >oDrZc}[-U$rD$j {.TB2/^#.SjПS3gi{ݒ>'Oqb_B]\~gݑ&ft{w t\ ꨎltz9)z68D WoZ?u#ꇗT ,iCzҏNF<,iQL?ЛO`S,W}ueyUL+vS;3$~S' j#*eߩ]o^T,7Y+O;'=#e4@ӑ/rdbO,B&xȏYhuX#wvݗ +C3깢L!rL:{NFN&&%ST˴}P<4Mt +/fVwWkS%*4ҩǡ; Ra:6p`F~ 0cFnuF##G! +E$Ks@9]0D Te8v,`X` N70I>~ r>ę["fȱ2E>ރwf6uw r3W)˕ 0b +WS $x9[LkpXBA{c7$;C#@!MO/ X/AbAh)c52 +E0"Z+l xj=ir$5w« /Urc3\嬃hD1w!av%8?)b|Jؠs~S6$ o=OQ3MAdpm:f2ɷ@Hq$KˡS YeLT~Sz7I}t _(Âh#t! NuM5exuH،x1bCp = Ȣ{v)Ki5)Zޤw=@0A}N7PF,`Ȅݾr<`&OlX+m$9CiFg#Zd= ̠W5o*oQ+~(F{.0F0Lw$sD% lggEw:v/@2ڿ.bϰ=l.R-:{RUp#V$BB Y$9Y$0Baod(PW+^!,E^y>9/yw}qzP!qO( CT=gd W o#oŸ_F M"#Q/IѯȷP(7b5. 0w~B~`9PXT?9; @X\V?, !tǻ4̡Y%ԴjH#uz:~CCoX}:No\{5MU?ͯO+r3nwfB` 9HY}LpuD(09ZMF5M.t+y&A ?,'L2򤨈2% `uM%;Ěsy~QC| %'bzjb72zjRXMI\I-)'Kb mB\@ḨOH8Ww~rCsk 3s63Q64r6[!¶K&~˙F"D]?L 49.5%Y =7pH`1],Y1W|rTMOweC/0m|L"H +Qo\JhKٍU}_6HϵIӹ{n OO?|{e/ʏU{Pu''L٠KT2^fq OhgK ^\RQ?& +lLjwxѬw݂{"YMв֞\;Tw}˄ nʦD֤ctB5YN7)S92 C'NEEC,PGI1YR PJ[rY¹}'}K5Uv Y/Ηg1c|I'SCR(NYd*R!Z2_ɞ*!hTAc2px3H]}=@]_Y0^}gwt# cOU EttAVJNSrY&U+UJJE1HaU@5ikwxN|ҹk5zC'KԘ<^-j3$/K5u&-Qp5 J暒Qr4rn,Am@7dK[>Tluٰ}së otxՕ`ߦ*P'B2p5 (\R' G&w5\gZ׻^<|}WwVPr9꘩{.+a%R!(Pq9g83mRa. $rt >SWV:rk>WX}rKEGK 2؀9ZG@$Ub\TDc+شB-h.YK}6(E[%XӸ$.wBly; +OU+ڼGr꽳ݳҚ7y(n)(A=Ǯ52:ZVf$+̂J]#EOP)=@/q֯/qxpoӡrΟ}=K+3FNȺ :VMi ӒLC5vDS7<]~QmP.rF/Pm`C߽yݏ:6Žў%GVg  uDЏ fB)7^^Lu)6Z2>u䝆c Ъh](VED$ +*d/FI + Œb#ngT-.uGܷ0n +B39+r?%RC]9˻RzU.y;w;l`Wqy-g?cS_iy=*| BKZJO6>b)MSXT*4VUj^cu:ZvctWn`>ӳ~˴[9N;W/9'%j:f8#mϲLviTv:^֚ۖǔ.[Wd1uV#eߴj%?Pbv$k4mv!&2yҶ]7tG۝8 /t)]8IWN0׵^bvWrRsLyc?=*˷ /m $KQ TL eP`F80+c_ĴŦXJU$& U% J>=r25j"#C##KnD]=q=ɑgDGw>ѝW!p|!ݲ7=^Jp|Rq^>(9!Q( HaY1!;BG.;QȞX?2n )~c3:Q/H&à r"d(|!/1B?T`GMG b ֶj+}<Aw#` 'p3nI`ǃѴ(ȦG@=# :d Ry=[9}Ʀ߷ V|aStD}Hp GP''C>i>ԓ}<9S|P6%_z=P5uv1 ġP/r. ܙIH@Z^(%Q| DJ/&8X`a:$I!a xa;{K!Ȉra93aӡ@ +eqqu1Syn-\Hnlf裆XT?go"aHi9C +crY3aaH @FVҖECm<$ 1n&x k&i}V3 #~{Pi کaa5, >.A C+Ĺ!<20DC:oe@Xu QS|pS\(nD{;rPo,'!6@f A c8Lש( _6 hLj] +䛙āh'#NwY3a)X<,a&Fc42Q)mkD,Bg_ ܒZTO.P&6+%_e- / _'E}4pR4Bo`,L\jV[x~IvX%=!+9x-7+__)[T-=YsSn\V/*G5f. 9sPl8PY^X#*EP.r`i^|onI)k-筮EҗvElSecM셦Y֓~G>A^W֯;8"߇UcPwGs-}5bc)pڳS2$kw[4UՇ5wtO7T]KzuᔦplylC0zm_ȊI k6ݩxR88$ H҆d>zw5V~#m7q(VϹ+qX-/yh5a_+as³Э_,[|cϒ'M?h:kSs;^ҠHɝ٭0B;φZGh&4^>ƍh@hE+^B؛Eoúvs 蹖O޻&j3wr{+=ajRFvQetȮLfԈwzG[r%f2Q@1 ljlGmXsk=;btX1>HcGVʾ.s1ueTSnPE&~iA=TBX!\!  +`2؜0`Ywy7gEyqc]rm4fm4sN[³&b(/i5e,uIHeJ!+KGo'x  +$P¹6<ؽ.7ҝv-ekg yOKC6++lA3 ՒJ_*(7.h0K{DX_,+WPCrǑ}y;a{&ݿ@m蚞[ܭ6d8' v~zY"ULKTZPT$UtaK!81^YhgPKFcYWhr;m)8YQ![b-֖5&>̝8s_B ƨ Ch50/Cq"ޥWcxk=''7|\ݓuv\Nb5r5LCkSѬ!|-46Rkfٖ!R.!E=BBD2r}Kڮ\NhmyU{Xg.1ө浗r*Y66p{y7Gt7rI +(dܼ\ZxjľwR3w+d%^2K~5\!'JOu0N݀~b${~gt>cv`A~p/@nE fj1p睭1*>_S:FNugì1n"m?EJHɩ#.ɑjzH9>,;ҟ9ICm4/liTg("""ldO$DQA[GԱnc NkGVRǵ:ܨڀ *\y/i:"WOH]=F~n ~sj^ 'G,mŖܱ$ν:ݽ=٫];]gSO [Nlm $}Ŗ֤HlSE;=<^a>㬀텀+>GHͯNdgE %?w4ֲa أ >]ɦnT]>Xm #=ђXaOy"ۻu])}}5ďwio?DZBRD673I'O\fb9ae3&GE1O40KBS2, #=2p z:NBl h:qt5B6#dSgt*s9w5"n)GK!#5 |g:91rhG8y(,Pq.t FDs +ղ((*C-]t*xi pp}AGp{9EX&c]w)7̚0Z/ fIT_Ae&LxO2D?@x4i'9Bp]|ziK;1%< m 87dx*Fz"̦  +fuoHB|q-: )U`Zw~!%—2@E2dlO !0FCb4ڞ eU*{9AZÇi7 +ŭOb裸K+$ rH( u4LYF E1(RN@>0X kY Cڦ?*(ʄ9W'xgL\K(f ,~дm7lL}V z5{=3weY'uGCf:e/tPP5hCz0LXiE.X? e(b?d ͋_g-gw[qgmwv +8 m4'/5皛6Sc[Yݟ~W3n~\ASw jCV L,u8w,OqXF2X>+[4cΟ9ߤ0+n˪>5U<_'l*Sq궩Z}xD`8nfh_2Yo6톓YvcnhT=*6T +JY $@Hr(@( B1P  @*-Ā"*qQutK{#H";s|>ON2Ll}5a oc2츩Njc>V/!f L:}e /]fFқ dD]"ӖH25 $ +d=`+?Zv^k {˓v `\n0-_RܝTޑXEhoQĵ62T\xHehjJ_"KH D[1o;)5X>j;2˙s?)8:."93l\ߙ!nE4%$QR{ʄ4I4b[Zy"KX_)bW> A,1H;dG +Grw~{&*Ž\-%: n=,\;?_,ϼ!K/r)Mr%jI08y!J~Ei-B.LJܭ"O3/hZhs0iv&CyNMrtTB݆f!eVJ.z۱~սS& >;/R3 "_uaf$/74WU#-̪x4>2#;q365G˻"D$~d5&7f #iє:Y,QF $ B^"T釤D|1ZW>05 +_m0=V+Gd(PQqxCt%.ua薚Ȗb?6Ly+6_ʅذeb\?Yb +^6GN1>j2[&'7UYl @5H~q])my~6[!S'o]יג=b2#Gb`4 @SB|!!C|FVB} +n/!5n&~TPǵy-3>ROxyv@pt2b::8U?%>gTx{{3䊟m_f?w@SPr#(z#x`)s ָ솟G#>#$<ۅ?e Kw u+rS`LpE@I l ĿP·iLX/ o{&:\7D?>&:xi$=4>~z_g}\{Ϳ@} (zj rv nw]3)b%x>*`.߅X t}_2lݿ`X}uQyE:ꬽa礛E}s\5 @O?@8 F$.hG8Yq3 lg\wHjʼn +r*VHNH^@$B_)ZnJ]<9-G\:jwFED~kӧ-d#d'/䬞 sh3<%Gp*8WxRK o'$EͿEQ3"Y1nDCX8^R:7IHcEcQ1LԎ ZPlfqΥ 6"(7*{@QT&Q&i0-t1 >Xx$BW,ҼĄep8"oHʾœg?nX O.bq#JQ(̠S|Ab$M_nJg#X 0pC t} +<&AGEXT{`(4 +_ aDZ^ʼ@=҉ϛҩ `K8Rv1/(pE3Xp],pXHF'.@N8fy@ztY~PB9{ +C YQC;#!& +CH[ RNĂg'6x}l'O)` [.@Lf1P1ŸØfV + +f+!Ąd{_@t ¿ lgCp*W<}\. #̡ g鎌x/d +aS sn A,EڗP1&{ِArґ0 >/Q G2CJgpIH it1;P8a7:|`B 聴zVrbO|_^I=N{%N.9發T2ˑrKM %7JGz0Prc=Q(m Dfa3*\kXۣ~mV7%QJkI~v\yLyTy8@>r@pG4. !f@Q8CP&@Aďn[uԫZs.c}vt{uym)5ӜWsSou;UZH;uTAnHGEU Q%]d"8cvc"ۊ{9l65o +oZENeUEcy}ޙکE \vlܐG{ +c`k3O6lWuңi ++#og]t-wŶIs6хݒE')]eeqs U[:TPr@7I,"fNrC5yўx m܃w!K#ώ_9%tZя马[%29qCsڥm~Bms&LwWFz2 s A]R,ܮ12/kŪ¨3;KO._)i ?hTMoR״d:?uٰ7뱡Ȇ~ H'瑮9×4,ֻ]yrVYce m%ˤkoVۮ&Yj8njr7t7oycښ4mɅ!<V 5w=Ydy}`*ӵk#۫fάX,[RdzWQng.öc7l,跬/0+0-2PL\;Ҝ+hM=xaJr[ġ%y콋Jw/@ueìU37Un3hN_Y~غ{۲򫶥OK+z3j+k+WMޡb齣HMC8ԕ3[8C;6z:8k#rʭRNd0L̘H"vF뙄0DQvNQ:5מJ)N_??{hu`<ھ8as[̦ YesUKSBK%bqax\/%ʓ'y'̕|s%bbb yZRmx] O[~L-2&o:jeWE][ykSIg]awU~RNYvepqfCX~F?'XDVژ(#mZ(#cN H' csH,$Ԅ?|ҁk r'V,ګ#mƹImgBWHLlV,nvR\_Ϊ H(.V{KnA|Ɉ˄%aQTAf a& #ek˻٫;L(ny}RrԔpUW7Vu+Q¨a]9fUҵ.#%=C"[ EqMۣy ?F /? _ Q\)~6TQӫHGFhS.u,@~MFoh[Rw +sOWwlg_T4@$^H^],6 iE^HbI_i$)02L1tB۸9jYsGMO +ix"y`[@g<Wk =s9}3\Nsn`{nQrXK5atDr4!WN1J/k^`륝߾6eo\Ԇ8۝gEgO纇1FkX6~9ߨ7>Ώ=@QpL?I?N+4҄)#Rɔ5-e{/O1s5l0k)h6)M8r'J]&O}'<|&<'ny.cz]^k&; +0x @%2TݠC]U(Y,({N[5vݶ"O_4?cH0 R-%6lEKU1ȜTof ~C-|$xkJykC9ӷy2|.e1߇{iߥ:;y+>Hu6}׵ةV 3 f#Πu_"S |->d?x4wd7g00D*0z5&ZD ؠa1kiENT3Pt . x +L@T6/4$y)7Ўb.nDi渝faa՘02>֩\ETtppvbC~_HnΨK5$4!Y%m&@6FWzP EY~=Rt0#ڸԱPO[rB"bMF7 +27QeOE+Y RCZLXzV +]+ ѥk1: x'eMτMv}5}a'E((32 {dބ! d/T^PGrQZPQP^|C>>urVӮ`=nr@#N M6C"}`3a嫁\ &ٸ(nsp?dG-t +e5!ֳ)ҬgwDbqna4A@>_xA5mkQh(:3j5JPXgx@$̒!D@9Kx 6d -O;<0 x4@H\5A> @e51 6z%:3_ökSWmRǩ` ^{ lK<-5@p҄@Omdf8U}eWXΰꭧ}|lvA wؿaŜ{8F0y.`Xg ڻAVs׆pAPѬDf:%3/PYM Ͷo9{9=o}^9`u)OǬ _}/o9Dh!\P1.ZK÷aOPY/7mƄO]O8=t7]ޘ( *< x@ !xFY$>QI ?K}Lĉ ǣBV 7 IxOx"Rv[QQ/cW"|qQ4N~ r^^DuJ-CAHACf6:ggbq&GX S،lwj`˕]nt_O 95(z^rzVzRv\?- mؕhwE 5FcRI󵂢LZ@gt'9˫1鶗"sG‹/V {y&TAG31d es0~pt, +]n0α%/ť1[QU%AWgTnkuii'Eyise\٬ W|7D R1.Yݯ\ݩŮ7/F-gjiKxz[wB -1 ۓ\j +wPr% +2S of*22~33DL9({bʴ5:ͦeP.'FuU֊`Ʋ(sE̽Tnr9m|y>azXeee@ eۮF봱-:HRlznGC-{XF&MAV5vMTR*#STV [xECbi]d\X0#L,AR>x] t'xN&vQ [ ~1vw{{}dV]uuaDUM2liTgI "  $(PpAp_E@,, ++KRPGϜJ:նljgd;/=so>pJ듒hVযU?R֠\O>lM&Ɛp:La<9΄{XQƂZTŁJ'rќ3rPNVQmzaán_l#7UC ٙY?2.lEf2>2!eX±w 0dEl KR΀P[c +5%5 +|+fgY,[tu걩px>kNdW˫ ͻ 9V\ wPa'9w +ih;CC9:T6BidS'wB꥖{r֊dg7 |)Z]O4'$WS\Y\zPD񃠈So (m"@u;*YҬ 'P4^kl +0Ө4OiRovS҅njvzĞ?u.GQU^u^VuUZEC*!Wz3,qb5@է@^6dZRΌ-"ԛrC7][njM V4w%R*4axSGh)OE9qPD8w@G=Jgh"$i:һ:jnhm>X/#xXVZ|.}}DnCΊ,B[@,~ZƄ7?,񹁳<&gQ\PS pt {uaC=ȆЍVnh IefnHNv]ovU:H.;J9H:zߛvEN:%5 3`6{:z`ʁW3bUj*Rղa8EO~`#Y~31ꄥXU钕V!+,7B:'m8A[$ H~ʆ^m5^{jYV>?0u(MYOd`n=a%9b#c&Lx/Mx&Y;r21>cAk2T+?2%#,Rs4d4^]8xl&oDLPFxMt_?;uXyvJѵ`.Mrh'Wb6vE)W4tAs3.&"'i1PD/ (&z&kG.Ga! +qq ..7E~5`+D9:G/K1I;>#goxh9 +I؁FB@~RlDi6zoE Pn&H QXA% +;nibR8hV8b1.BLA4ɞ`GAl X>VCF=mä,SW gŴgŔ*Nt;!wT s9}%B"}!B?dCc(#ܕKE,T>_àhZtRa73ShFZVYJF$%-֯%?XOwuo87?ƅ?RhEa%v4F910Z(.Wh~\=oR?x,8l80: liPS7aWܨ +"[ H-BB !a#" *`VExqT[]ZڎW3c?P~s|zߥJv|YbLvǫz‡].M^ +qWa7<·q&\ĒCö ɽ(̂m~yg荷Lo22_˵\.F;,P5\Gjݿ{zE:LĿ}NEٵ"3H@郷 m/$ftX8{֟Dm&X[M9LNy 3^IfNlc(@K?N j_П52`PC DW1d"y/C.mfP?+ Y?xNI^hV!е]ѓVݙRHocu43IڤE& U,$p%c|$i= `;d];wsd-JLcz .WT2JL9ER,)婯IeeiO[  ܕ5̫lQs>z'JƓh~qU(;Cuiz4uR& +4T20=E.fo2~!2>eH ~%@fa + B=\bM5]{Tvtgr궮Be$پ9R/xhoW**Z;Hf#d},Zs_\Hg#7*0q r <pG )`zRcW vtF~QYƴ%<<<FʄҜ6XO '  s2 .x$`Y*F]NԹ 2 +٤0k.}QWh[U椒qJ sRBIV"Dxa^//ͅpEσwdE {> +ܓM\tFcpnrh7%ohgZR1l)%n2EgA7_q&2_viE@!]IL-%'˧YLS2K%d9$3xM;(p [QH>>Gwhƚ=U͑qL;qms&۝_-RaؕJljED$D+orH ~%pH;ϑn45^Ts^M7n3D0+l}ߖhӒݔiLo$ו%״ i)Bf]>O|L Z"{XL#'cHCvh#h>drQ b Ҿ}[ztˬd;ASVdĵUŴb-)-8J8JGQ 륟f0$R$5qswFa sGFemObZv<|WZGTڋ컿/ٮ-$"BB0ρÐ!H a0 +bnowiZօ:ۥ( +K58[/Heeߏ>9aL.TƝ*w*vTvwpGm{vl*X[†"X^&Ҭ1sJ8||ldi9Gfzf,^ 5^.K;&tǐݡ#J}yeߕ Bc,.$ߠh7IAb< V)TE[<`{:3T?2GY WH)_\O_ɝ2bsrm]Dd[ ˢ&XԌtK+Œjmd c,3u98˗Ưэm"qDc8uq]~OB_Eʶ 3WI2ߘy M`j@)(XF|mNciZbZY[fZ捉xԖ~.C(q9WAnP{|Cү'k(0/ ƵMDR8*;ҘaY̐i|Ϭd]ˬH>}Yy~z3®j_W`C +b{9Cd'} +H*p@C&RoM Lws1]ֳ~aI K,^!Z#l> +mD1Av@>3H|0<wTSPO1r,Jg3p1k- {ǰ9k3|7H>@B @H7.?9tt #< *@xP,̧(\Il$0( +A CPCXclP+lXd[QAaJ'Ont;܁aR!T>-0B`"Z&),Tf[cLT|6bзvX`[8(E^PVN2q7$k ʻx~@tx-G>!董G6~B5-c`0QlQgƠr9!PBKHq^QT\+(:/C]!(TcE +} +5DBD5|F'#Wp0bw[o靂z.Džt5]-aEx3Oi8>"zCܪ+y9$iєJ5UNMKN5wok^8_׼qhEƢW@p_Lٍ _ +3lfD1&[LOc}n>I{Dج_%jJN{&[ov+tmupޠx?֡9Fx FY8 p +/G蚬a=2ڴfd>ǹ>3 %eqKC$mvWZCE}z߳fS.iaʈRd4878U8| HfGVwmr2W&ΕԙԌʭ:}ǹ3?N[i'-70kd%۲6aS` `F6s`.9|7xfQ7?Zb{y$ŜQt7X;3+*񂯄0.8Pq!'w1W?]4Ǭ l;>޳ߒ6iNF0nF1Vo0b_:FMǢ7ΠL8. +KwcI8_)=t]pcu` $`- g)B͹Ap.k,/s&'jlW1935ɐ.7R]88+<;˝w2OTHץ "0ck).㊂ *B9p)՝}6w8Ɛ3IjY$ܣsQsrߒuyIn99dYVmphPqa\;RR?C{F&P'q-| =Oi`[ii_(jFFHahxxYշ5|RUa͜deY9,eR~Q(5*z-2$ L-D),|ྤ)?QE!oeV?^n +<n@~08Gݭ +E0HtqH7މ~C%n},( GjCpѶ2A{х.3ݣh,ݓ3:_=" + 5wjp(QI?J<**3!?]E=D{?6Ї귍]Dov g@2Rų 3']XS=r.2=wM|SĻNOV>5DǞ{O0$,]ؑ ?1c}h<aq +@ْ+,@r`9ֆ+|rCRsR[RޖӋ\S;*|N,w)CW#Ϳ +l uw.cacѳ1YØ},~<̑֒+~XHM)4؛ ~4vOF@)8P  f) ƁSAſ !3| fx+?SoN}{13+~;SӘRYPϖzs;A@`"d GLJXTidPM<T[]bHd:P>|GJlT}eGH9K QD^ +=OnvQ%Gv FŠ7< G4UcC9Eu6=}UT}/De1 B6'._SUc?*ϰ.eۡlaߨ:ת~J)QJZh%Lm_92qM#884>w,nWWߨkik:O5}'XGI_Bm{1LNh?s0#p,W#wQo!gU>į[۴ƭ-JsI3YIOqO>z-E:-Z~5``4K͈@N߈nW^{p~-eXѳ"'k$t%M&t{L j?&_#&5^յ_Z^ԡUC#I ``>2s^E^D +'C7,_:f +i]:-fWW-.Tey!y}U}mN$91Ƙ&8z\=ыiM`6&oGgFN_79Wz1[eF<;bUMV9Za[zTov'B?bKX2 bA&8:dВj;!IqKcٸ_cf.6Gh8jP^ye!ՎW#Fu*ʢP+ +K9FR;ƀi1He4dpˠ+ Nm(~Mj2[%9kztL s+Į"HVa_L㞘]λO쌮uu[[-1ncM(j'н7U3Yh6o 'xΙpxHFIeZY)6{ڕ%J:駄 [㷻sX17۪TzU *U` Kk<υ{pk W'\?VdgVk3#f{l%c9mJy}׵[T*=V$1ɭ˓{i hK$MÕiB&3L4=nҬ"u 3,4ke85wٻ WAjjzz~'#!?<3 a߂B*BETDQH IAYDQ"jԙcgTԱZgqi;nw^`;QrpNmjssFo^ӣjЩkҞ|kv2SCܥNv*}+R-Azq_': ( Պ. +5ByF̆hRYa"&em.p!NOmW3`g~I:ۢ\fݘҾ>;թFRt/i2|Kk7i|I@-9!TIJR,T)}'PJ?6 OsSRg{18Vd:tC70¸Em̏SVxe9 +EgQvF^域/T!\(n3 +oL6$;]2pWJs9T@OG}-1DKT\2èQڢ8*mmyjG}YiUj|G?7!(;g+?K7T8*L>&U o +V`CvᶌRt:JkZQ-NS'FueQfUkKlKt)Ei j#;;?+>0CʗRU}BB:~UlHxDpu>bʠ2A쨲DkL]ê٦k+b͋˗Zk˒KNJ}$=X㝡+n^J9#\RJaCX#w28UFTQ::s4׏G}} SU?`m,1\MMz]n|YV&-L][⳦?tcP\($QJ,H,bTnhiRw5 ͎˔m g4EY(6$d֧8ץ9f֫W輒+}U-<__\g!߂+w8M38FuЍ--Fh Em&man\܌K-%-ɶMbUeN͹.Iͅ˚*|-l m88R ?[~yÓՔl Z{R]DA+TEd#H3T]ݾ*yjۤR +ޒmq[{Ĵy}z'O旾Q-oԦDYGPt6ʀHPMEv7?H{q UF M%pKJʲ[7!f)zz繝[\gwv<y{D1s`)eP +l vzꡪ!}6X灔#|82I<2`i|}& V,+DVmq޻cix>˛zO:4Ϳ߰(OzhQ4~}7әQy H1D (̦hיOoԿjbՄVw¿|f-a@Nfʾή'Q?15h.}!&`Lf1ӆ8SLNV 7 MßE4xik8EWttvI@Lij@ CL&^+^Б(F- Lਜ -dF9[9s;E\x>x^c5K'[_Kρ +;k`ַ wls~*<ΆpG\r/?Cû8>88<8x#z+Oi Low8p4?Y1{?~d=yXхu0ܗ~$nh qzNA O4k@ 6oưe׶~Ã7X {Sv90`,}YED=A, %{?R~9>W@Hn?r +X ,X3pY YϞ|N?LL f1D"A.l A/>zGA @P3k8:G0S,:._}]Tbr<Ϲ{ܯQ:y`54.p \!cb7F2K#L?X +ҏƟ-ma.X "0sJPf`? ?{9xFƈgL>`jܰ3'Sh;  %S`.r+1 Γ6ID>M>ROde#Y@V˼oyϦw!};6eǙdgn1ʆY?ްb 29/ú>!߁(@I>8:0F2FēYaă/ȻiԐ}un%7̛37hݘYumvU&6l۵m{=8k3vtNٍa ;z?2ˍW#.D؍F\g1;{28΋"MҺ458D +9yYfS-';tprq_t˱a˱Qg\v@Ǟhh=qݗt ιNhj߹s¹TשRS iQF8t92tu8;6:4bI6/`gvӆluј>zc(b8XH , "Y< 9yz2v*C.ی4qke2:uX5ܰFؓн6C?󋧠w⨿7L'V"YoL ۼVZʍ\oYgۣAjpGpǥI[=NFT'my A~0`6:C!X=;d>s=#9T&^ONkoͶ(u'm\t@\GRddⵤW~{':'|گ/Χ$YG=J ꌘ8t${2 n +Yi J20ڲ8Ϥ.1̬pf:FI +X_2K8|2kyoR$BgbCQz3FP[l%ʝjޮ l]ɭ 7 Ud^!ZR"Z+*0_j*8]4bYp 7y"@!:й+N磶)9~B*Xuсo¹"c IFk3L˗ Š%a墕ՒɅ!-+B!'y!7{:7 [܇P.G#t{&!ԞBmIƨ9YԦ/VM:U^ElҨTU9aaDxryrŲ&:;4+*3g 0Pb˿X|2g1΁ +@MEh_ +Z4<ԐjSm4ZIru^iBxQ*٤@)ȏƬDWgFoHEFDNd*%4%r +>N ݫ5vemhS4Fu2M<՛:%PI1jq:+̌ZWaLV5HU{TGUujLi`9`>,|piq{6P22GNvad..H Fh3SRi9BMr()\XcV۬bG[ib>\=ݯ 0nC5PUTK$ϙ*dqrYYqƚ,3uz(.T"ZԴZ)5ᚳ>XepV \Vk +8)"q]QM_Y/ ['Yhn`*T," JU* ザU2U7wΜ?>$'޽%VeRW.M%ϗ/N5[+R&D/`\5kYÌeG#'ɀÌofA%hRivf%,eˑDFK&fh%dM]:L?6sd/3ĤǛG%)ffYL-H٦G|XCh}uhR:,VrPשgd;)&5@1"siH*pc >N*o53 cDE.E,1""+2,zRwg6(dQMɼ ^BT#T}_EV$H,DF'|ы-*#\P5oCnpq(ÙEbeaM_b=)fB~mڟHmP3۠5lrZǨ9Tz`S1XfbĕbQ + <ؼ2At83JCu#mky"[RM&l^cyE6tܶ/~jw+?=b' S'f߾5}p͢?ZxHClpB@ij&\૙#,}II)ްMCSQ]sIP[+AzՔ_Vgs/0zhs\ Fȓ~:M!<2XڴRҔ+p:E8.é#B BuSP}bP:εC唿aM{_X|zp7 04yFsp>/S 5;-P@u! o]RشúVmP\<,.EX`-o v:wvthﱇh=I?g(<`Iv}]7T0Qd,d&v8@z'һ!Iv6  +;~Ay^ 寭R_޿}RvYh/MڐvB%aJ@hA7Za΅77xTJ( +W@K +m({t)l^#ˠx:sө恔Mnm0~@]-[`\Hºx'%&ڒ( I>%9=qqj:?F+h5u7Ld0qKH"d#)#׫&5zIi$?^++^ 31S1gO?vJp[Z側PƥьKDAzRBII(^KRҌ~-<:{.=sfN B + D8IE2/a͜ `W)rfӊӼÊ+CIcz^د!$T/hb[J܊ZKћbt\T,*:̢ߙǘQ1Y:YǞhN'<ç{w&{(Dp5"NG/A"&f.'MpJB:"'RƥӧbM1̉RxTwLQ({v)׽ >[Ǣ.WsDڣՈ0t?Iܛ{~R(p948^O "D&Q'R #\֞+g87ǹzc;ݱCޝ1>1Ӿ1g-1ͱHܱ_~DD+>w1]{v: LӉ`&w0@:NFS%w{ jY} 'וTٞX/hMl6}Q_zJ\0/S/I?JkO5Kww*ϓa4\6bO3B8dX ~0 +) 4.ա崦Yyͩ垍NACJw[WkJ*5'͢\s_n|![uYuIl<}P p8x̃\9 m@R9ҖMk2%1\:f1]ǭ2<+ =޻4ͷX?(ǥYEaMz-2$E_`/=p ~p``c… ΂Reٝ%Н*s&ۑõKLv-ֻ(ET`Ǥiyqaɸ IsVy}p-֞+ǻl賊2Ir]jua@a/`XL\[_Weɫms{&h>*7Ϯ4F3̈́`&}gRY}̎ 3J,/Z q4r4;b-8+6BeE ^F)qDѬjFAy3n`ryeVϬR@_^--I->$NɓmkTc%^x&UUu5|vQjH6g(й_O7פxdWYYU9}U!?VQ+Lh%;ĉIIBIi|UY\G;!I(&7q :<:1w :W6p_"&ݑZ+w阺#;!/'u-q h ʹ$Q9ߗjD8]qԅ ЋQƂV& !7`x;H0rFkWR635jƵT[^>qȦcEQx;D.nu?YhՆsW7@^L}/́>i +Rr@,EݯgcLQ},ety +=!=( /\)^5:,tvE@fHfd$n/ye/,,Hp]PUY@hX1dbcZc&ت3jiD媂(b +bD!TSz  3;w9)1,){0)bbV$>k4.sYtbyd׊Ljs!8Y~K!x3w|J:%Tio֥Rd9<5?$XL/G\SĢ +>" +f 戡+8ZKɲSd A7;*s20l՝MIw5Kr`Z!Hkbt="K\^Ehi̥NXt6[fKQb5U4X$zk +}K|r_C9-t+;EWF"bt7F` 0JȪQ>U+wƼKgu-HvE}վ')U@l FF4M .2hΪu;1D0TmP%Ac21B-[!i/Q I% XC2}~`i/NO-s>Ǡ S Iċn d.Ѐzu FGPEAGPA7:hx9Z +̧CuONf@wpm4E@z<}^ tz-/zPOA~@a +O{DBN^ZPI}jFڱMз^N + n%OB:Jpg;܀'ɳxI+8 tx \;=sHpPp1Rb%H!YD.Q(x +.pɞS j~\ !䇼xP.OI+i&k_5qOw4Ы4ilEcn8uG+:#،k>ڜpƙ!~Ci8'|\Opo=XB3\<0K*ނ~ŽAѷy@O:eN5e-)ʡ2ה:gI̸*5eP9l w$rg9:'8ޗqJԛ~^ܝ~Mҙq[ڑHڞ-3ikfPe>C"tݢ+wkZ.RˍDVaN1#F91ss~uO]ҫjv:CvqqYyY֨)*$)ReJWC_4?(E5cpN/x8Y ;1OfYAWH !x`nY~R=OqC8NWbhm`Qg`4n[A1*hWx B5ܭ; K\gd9#m]o +xL=GY&MwB+ġu/Eo^8fVM:NcQSTw!u:^m; 1𢢢p&Zx?D(7VCP5#XJshIύW%C9El :v1-dV%)K ڒ~M-%tNqyHZn:).(JM#Mw#M%>/%-ڇ7]S?'h}C_ݶhmF%[ĸ+2YV ZurVVj-YEITzNQT:a,]4;}0l_><!.cNYrXFg MRؚWe#,-;PܚȘZX5E5y|mS@ U6ve5exOӼI4HTOP 7e/Nz~46խK%]+a^cO, +{v3d&'et8RnvU/Hl Mq*|_%Qb (}Qbg3Z jNY :N(?DF5dYCzV:XIh' 800{ {&U{|te(x=ʃjDU}Xv#՗d_/IX 2_{רsct7zmd;.?观 3B,<@tiI`%.xqj3Nmǖ^|/56 +1`@5^43wW/3kwoɧΐ0vܧhi^42:g$X7kg"zv!jv/Vϥ|g΀UsVwnD1? M܇| <7Q"ŗ<͘(1ѷ^C |!(H7/B r#—A.M@4 ҏwc_<$Ү%W uHIsXH0{(庼â0;3w) XP1ht`ҥ(K` AE"b@ mqIPc[KLĖZ1ؽyqg} ={wP ն]8x /A$^B:  mZ r`Q5uOXvUp磠93 v@ٝ?pqeyiz#nCMj2ާpThuSWC]EuROn[6#QC +=xHO<`~" 5/׌ N M-+d}[vDhLH Hd +70/ϱ ϰOQ?P'؊G؋8}\F#w ; +Hl+:?HI$xF:^ ͢V>ZKc6RZ8~UWF#] SKa84nmBV8L3S8ljrNUDbjF6Pkspըn\;9sM(ґqCnތ8 s(<@{8RMBj*~S*פ*-BHkqI*Ei+I{qVi) 8qL+㨕+rk=VZƢ# /<Gn0qE_tI7 u3]> +qZ'u}j{pL_)T7 5q ;dW;m]mh\ZE'4zc~v9Dv1PkN_i6wj"iU-prtށQl7Ca,lo- ۬l"QE(╻O;hqq\wi\:t6GƢ@TDwDk6[]W +;ۗ +;o'lP#TtenxGY`EH}kzI?"awVef(Dwy'k + +ƈiRsbybyry\Z`^g+9ȉ-dGF +YS"*3ST uZxMja5iDŽmՍ?K ?OKxM5s{}@]|{?ߜl/1k@nl{vAv7b0!o_1=bb`eZHUj8i|$,ѹvEQQk#+tãE!wKݰhYK48 TR˯^K mCd뉌~¤aBB D16~rth)9.M=2.fD,aqOcWn$' Ϳ/tdMyu"+gٳyX&*hI."tDŽ$&%ccŔ$ŨO#'IvEuqwgfD=E"F6!*000Î(( Udb +TQHU1Z5Ifu5&Inb<}v}{O+KՕt˕ɺ:>~&1~v<)r׏5t&!^T9aƽFPʹ,NҠ$ 0y<}Ѱp&nѡE2@A]|uussu3C~~|OP|/nkxg쥿aˀCQ@ (9eG8ӜiWCX `a"3?_!_P.di*׏ޱnN')@rs$.Xk+.lN_yH~֬X _cap7<777̓XĜw(x]ki+ 0&pleN~<`xc ?x?eҟAT h7"1$d*Cb +&(ǘɣ ľ*BA(d>F(\%, ବg8%_jk܃:0|=TبX5qE].+Xr\DT nPVzWj:ΘLg644iM4MsRc9<{vVn.5qoiJ_pq8܏P(cyZ(-jC$x"=H;x{n vHBp3d nvj7v .kpQ{qs8-'G}h^VppOdžcD|L6 GMoFfcd\bh)·V\hΆ.ř85v N݈cc0Î82`W;^a߳{:_QYyB%WMdx8^a0?U #2ˈ< Fxd9EHblšN DŁMՇQuxMvNm%:Ya[/LJ-Tjox\ qhcS8s`@:7JЯ]-vЧkc;u]lmmg[ީwp=NSE4X]*oSJ4{0>{VŤcgBl`ދz?ۤgQ6軹uMZnnMa~UY+f_9=~Ō_Q쿏%דiJN q0 ; l5@C +ZC)[WV5r]q\g\÷ VIajGٟ%E>15GN.Uw7~wblބXlHH+V'HJaF70vcfZcb\'4 }㠪>-.XW6&QQȇtҜa5f5bi"֘f3v3Y9-1yX-6Uq F>`ZיV 5ͪjS7+MrbYyj?PwIr@9c铟-ǢAe4NE-$lhJњVs5 +R-K +JUW,M>gMkuMQ?8hfȤy/'?ǚT#)hvbG +Vcw*{.{r{)Wf}f$u8uXhC,#i܎mWknPg9E9tS>:0,KӢE +C4tԦFdB4R:+rWrs%R W$BQ(:%PI4YBNBCKzVJ8WIBjlg=yYIXF^3 E3 +UipB3>%ș<|YĹT ݢܦvd99?_л?0(Iw0ϥ>!/W3y d:g4* (uʱ(Pr&sɹ,Opr/uBT%3- FOCAiAOIQaަX/Q7}O9 ?KGT( o^8_'_Ex\&#וdr\,̯3[)K ߧԤ$'jR0(ֳ}fE4o䧑T27EZx +.|kA.LDNYiY2 +]TX¥yxIHtl^W[<'){S +S[)sQ{y==''9qd&/7}d:#14D#1HvY-{.qbbϾe2xM~0Y41AOH{,Sck˷ѻ h {ZJ/΁$99DXpN#ޙo9΍Fwv#ÿ)܈ɿi1-1IZeHd3i# 2CR7@z. +#aQ ĕ[ڏ&5nQDDA -}G';ŠM#l=i ,V>zޡc˯+VVV]f4GP? !Hi[t ?758,;P5Q5fjOʎjLZT[|-9"ZGřVrJt{^4=eH+&,~{> kPаs. *jҞ\T/nrۭLO=LC "i/q3r+U .4|+;nN*v7un$Cc+3&m"EC(1NL6b6?P,;s2RW2\ϴEt^;vDDG<M$i͐ɗ\HgtVHg46j-O'V+ +->Ԫw8݆X'Dҥ;@c' zI:3H@:H:K9C\TktdvގcQKL__Lo;DK, Eqi=#a*g,|JgtQ,ޥ& 8O&EqcT Xi⤛.(vCV{NONtSAЬѤ=٧XѹM"G'㨬9K5 m-&oX2⦎>V{ys%SDNXp i7CFM1<#]ó4z.koxURUp}ϤT*QrwNaNATvh=MyްM6l]S[u&V]Iy'SmW]URTNczl Ύ=i<&qBHe6Lf} ֆ8XӹU5LYvbiӸ^eQq#B%&N%HW}zhC}`jûSBed#bM#EEzQ/, KG͢')Nx b~T%POaBQУ̘c1gsJϿKFN-#;le]qo8vL-d*,+),$ b^00y 㘓<ɓK~p$%̔5))oZLMhy)eJՕf>;CF7iX܌D +32x1G(r2ƒ 3b܃8=F(TP[G\7@ $@$WB@!c5VkmںnG3nwtv;:Nw~?>soB.s~Sۄ/[aѕv@L;&yJS'M-c5+~w9 pd$GPN$sb:ѣ@:j=:&hS;Ъn-jp{ES_j HyGdg).E#:@Q9 ?됶'H 6v[_l+XnjtjjRU[nM464jEvpi:.ɡq٦}VQSKEu5EU{0[4yZcF{XckQ4h%Ef]uhå3NWN¦5R~Xɖ⠢򺢼Μ⻼~GB,&2-rY.d񸢬􂢴Xcx: +T9灌?~tR"P(X8LJM)1eʤ\f(77M}RyH2%g+寑 +[:~µPy ä5u6̺\pT,r+`LB% |-z,&YaEX%/BӲz^Nߓ7GeH~>2Xf佽*UѰT/Gyk6̖R[."JQl@ow"[ڷ +_*3 4:mPV/1(jZmZ4oB~syPuu㮆],GdtHuOH)R{ܒ.%7}MBRJ=.ΓdVŨi G^[r=1A՞dz k@ׂTo[F!{R$z/ MlPz#%0HxZts3yZbPdwAFw$z gRz"w6cO>6LH٠5ao+|~_P."c{pO >zjW3uZƣ`Ӯp$GAٿb0k /A߂X<6+X? _#"s,=,Pk/'[Ѱ1W?$ ˈգxl4+GbLcɈSa٘Kex4PGn, bq`с# +CدpE7aakq+v6P`|̘$sp.E!qWbD +Ef1Ă /O | 损DϐOvK;-t7m8a@'X4yCEAX0sJ(jH'fs :ȉ >xFgFkl"۹s)]OXFe'S?Iًi)v幰p])߃ u7^>5_Q*y>ͧ}-ɍe4e4忛5Ǭ1?9DpbgNoD6pO8y"B"F.$p# +PB[Lkն9Wۭۺ+h;Z_?۫$H{!MQc }WQB[̵8}=@]Oꎣ*`{mP&m|@D>$l-|L>!>x9=uyȷ|<{?fLN;8 2Q=I&97Ϻ?c!a9E|xȳ7؄c;`/|}x wh36W>?$ȉ#q x2SW_A|jkTR M6ꬡzl;ч+z|麂?~GGsr?~ƀbGFgNA +rS8R>f%ZK \bK׃8wp&vA_7Uk'놯CN`Lie,sQNjjrlfvtPc߁י..P<ݞc4g$?0יqN_#:\-E(F5oZF:+gYS+8®8cv/W:zePA$0.oWN̡7ԊN +cɢ|\LrfDZ:iK#a a?]c6-]CcP ; Hv5ȹ>Ğud8?DC0-ۘkcËqpx.>:]ݶm9;Ftc~l;-7t9.\?s4G9aߘ 5dž`9]tu)jJrAFkG]XN4r׳X6_MBϸC[+xcme#0<9X=AF'=-hv/D\,XƉhK<:PэIP3M?A#TyJϘ?Կ=~@7lv<<_L F +˼thJ@^YCW1jaw x/CU?u3Mݏ +犘QPNDI?ޟPѾ.zY3XkV9|]8m +LG",Ra‚jE+rP(@2OFo(# +ˢ 1;k/"|-tE/KSRG8& *0QEy eA( Dq,03?Ew"'y_d< Y!3ujWV6, `{TFeCQpFcNME^Xf"795";Idw v<*KS^FK"?I*x4Cn{6vnÖK=},J[+PtEQ' +#(̊Hr"|dD"-jHjVjIYnRP3|=eT0uɌP@HgNP笩JoV:e-UǬjdw u3'{̲2ȇtMhcǞ2ϖgq_n澡N1/D>y7Tƨ}^<]y˜Nyr;&׼r˽'grg}Z,8 pQ] '.v^(gˣ[r/[q\[2KIKfɩdK*PUC/XƢ/d\DP`4"d@E p+ ȕBHA1%rz2;9Yh1,2Zeo#;Kl-֖$X`YƄJxc]@3Sy0o\ [s"xW/ǿVU1ZM[`gNȯUHI:I]?AcqVX8ɹ?5׏<=~%ܺK Ws7io1?iؾdn'#<s<`=d}>da?Q:N8 :B 0cG3fXJH*5]KZ;,/uTzKMOWF|WXFx#+O2t}q(mQxtCJ{Yty3c6eֿKz~8/4O#GR]$ ZŘ,L~O) '1+jK}MT..i\%4i, ٌXɘkȼZUMS:L&*ۄOxdbDlgSj{f!HSq$5t8~ɼ%qHKq+ըMG-i7n`zfmy'$[tE @\#1Y~Ǽ%=ı8Tc)VhVmu-aT3U*/ONwئll6/#^W>8Hx&q8&㘊#]'O6j>b^ J3lZ]ZmsXZWyg*|CMs9r5q5:io+շ=Tgvoj;*(7j1QkiZc*c*aVkF-sC*u:*r~.UbUGp|։#+ \%ijZ[\ɹhK/Uhi*LTn20ikTȵXUVn;I*|Y4s$nrruĴX֛lW+jY>Z9X#T9F='3Z+Yҕ?<46m}Nc'q.'qۉs8974CҦ.&mV]†`c[iMh$@Ħi`0L3=K9\yB3p[L%ɁL.[=0q\e hER4'r,1I,%'q8C ,2a.PJ өH=d2i_e,YF3~Ho|W|ƾސY-A}7s8c'3Rc.Jr1DV7ƳG>Hr$5r/3 y?`%"wxH/΋~ղZr72t^o, h,ehc`¾N>Nпw%|5]]/*>;LD\gIJjS-Ӧh& b7fԔưH\le\G>s.z .hoqO :,h] +K[;EqJdB%%XHf;[dg1k)ޒ<%t^:L[EZWh)?OsŷiU*Y<ٌ∸OgJu/_8z.[Ogy1V*pWhhC5@S$ʃ4Vjg8_0ث_5mh|EUMsA8&ŌMadP[_bT*wU.UfpUۄF[+ .5~5k穗9=Gm5ulu?+^ *N9y1cP&ozkIsm,⬳ਫ^ozjcsT;R8CV 3C~`:#"_]lIqDDP ^6{͎q8؝;6QPFUT6FpPZ4MW(izNKBn1uX _SbD:n77]oy7Tsl1am)FyV7=aqOQS>I2g1oar ̭ +œj<$ń=­߮eVynw4Um[祿=LJ;tX(Nag fOg?{={N`^${]\O^;#;"IXάSD$KEiW 8Pؓ'3{{16A8پ|d.{t+=2z?#GU\Ήv=q@쓦nCt{;<wO"ǟI?,̡J2I%50BJ Dr!_'1$ 5 CȗH'ƥ9(mzrbk頲_@gx1m#ml7)$4n"QIB=ACbWp3>Em}ŽȗEi1DmCQ(C~審3354vBZ rck(Ȗ"CUbfgl1y 6OEXւ~n"zi[ǠHqx2[l  lg6)lac{.6w.M ^°C#s\uhi# @!tA8WTB^Ocn;ahMSISibr|J9>.19D]&ȗtNxgf-X:@u|k>9 gֹ&i%W5亻t[,}'p%({>b@&zlЋ0_`2:J=|@}}{;B,ϼA~눮aKWMG#Wm -xCO䯟dqzD[鮆˯/o_^q _jV"{:888?h){J*w_"b^cAu%=#EˎN̨X>(y9uaEX)QkK?" +;uS;/mG9ۚ<<B,L$0tF_kYJG2~>.|v1m!'[_Gd{2X_E8E]4P}\ЉaI!2~6|l|j4&1qQKYNh5Od72*d)'K~ͥ,,1KO[4ݘSg G' F.Q0 +|I^G9Y.=,/;̲3V0бjy367jIB-j^K5HkQ5 ն٭kfuzޯ)mhrۛH55֓,{`'5,/o.ZCNݴةҼ k9U۾f;j`piίjs&LQMtY.k5uƺkgU-qQn\`i?SU]vm{-puS+ުu L7Y4ݦ)q${wA,;CC=zfw\ >NqW*ծUtRo|R߾[!WnUmU +lPAGTcpU93KnTqo *RL* ]4($HBTbVAU) Tо -Tߞ%ӳB9a6K 2Sq2Ÿ{xe:3uvcL*Ue8qJ\ N`pS ݔgQ1B}1&*ǘlczWVx2#ʕ9Vi3jZ";b>dehdkf,l9*!.0G*7C}L]c^&LfeJ7(͜Ts?٣*%j3MEJQe;V"|6tWRl3&Cs=WMBA1ʈ PZL1J(bS%]>J-RB0Uj8H19އbu(6=ۊƓ£b#?9<NV7٭^J)CV kBrP KbbhPm5STjȔt]If h'>B}>@׹xmmdsUCI>&*6,&$):9EQ)dNɓ)e"OTxj+a );_F֢-d#h9C69p/RTŦvPLZgE˜"Sz"-H)<#Cƌ\2),\=3)4V?3]&@Qgq , "XmD[AV[5\((*lЪcx@# RMDM0&i3jbǤ5MJN<,セq6kp^&vO}4ueK&I6(,H0ui ciI~ErLSJ>HC'hOyFq)48ŬXs*\:E_PԌ]3W̏MdzEPl)hNL"~VQӥf)qi}AiqI>^QɊLV}-a٥>nQ֩Z\!Ӭ#RO2 Efi@vώQ13E9ꝓ^eꙻTNةC +9 PY4U_^>d)hcӤX[dʖbOAzWA +#ճpB R8Jd@E +VhWPx +>V@ +QND8 4H& gz4d6'RxBJ}e* TPY"dE+emlǶP޶5ʳl:QzE˳[Qˉs>z 32Ya.5# -dz}pR.VxnPI>0y#{\v ^ +ˀEvn`qda`~CXJỈERlWoK$e[M UˠQ;a$ԁ!_tï=+܂p)ZX +v3 2 f(Vz Q6\ l4hN#ߓr@ G״ڿHwC0r%,09y!' 7:xtpOPU@.NO_t\U&-\G Hd1>e4^׀P}I,f,(pK:CNQ߳(Ǐ eH^ؗ@R/pZ3Djo"b5GKKl2(ן% W᚛zt-/X;<ỻ^3Пwix +죓;7*`7-Wu~Ξ{.]fŞ'1A?zkX+p:r XShC/Y)M1W_b ~ď!~\ÏlB/)W<8Y?4*]NuX>z@Wr&ga?[_r/~5_ݵ&ڤYoM~'Xm.ɘ܅O?bCk8:cјzGG-irޠ.Uj;JVR~Eq.?-CD,#x'a{&$KѪyد>؃Jl +i3^J9DVNr\J_h l.{poc0}K  O~*f`?W/ҧфc+~4NOn:2uunހv.3+iT$:h GdϤ2zXN5*׼J|Q߇*"cWa5<WO[u~Fi-0L Ta)Zi%[@JUl\"R5ոIA7g~nފ1֏Gbi5W?U\U&_- +2iaPEf2pViLS57,kEjv<,VN +enTfyPNvM^_OQ+,{tǿX(Uz~o6m4)I$M6MڴI/I/42DL(9 XD&uSQCx;g0;;xp9gs[~=>+knxfŚI9Z[\6hmC<)Ԫ~h8 +nP` wkRUJSo/$8N*Fjjnxx6KX&iM +jؠ:7jĩhWKB/4pz}K=;,߯{0< /o/!qBO{& 6rZb'PE"V>]![WWUWͨ0ޡvq<?]yka?G.F} vf9c4.Qb T:K!czu2Z06_*__5anuSj5mtZ]\9gE0cc?ƹac۔)O2Lj7Voޭy=j1GnrjSu^7 |琐ÚЃo6l0¹AKx,jdk)bZ'*Y͍mjjV9Vn mVoSxQ W-=qкxuLQK7;ٶۖՖ&}\5e7phã&?<*Ks\ 2;yLGTj]oGK&g +ڇ6FNi @?A䚗mK5r:\.3W+]%dqիmV'SK/ 3Z&xvzHխUL՞r[]<X c A\I5] l2y+TUmU5m2=*;1[T}T{>PY%Z B;h̠15~B["Sgj:3e_J ~*v<* T5qwmTQvWA#wsT0ЙEg +5X!A6XE +^ fH%֩(ԨK!CaGޠ6eZ~^SfOZWMhZ7Nim]{b+**LS~$SyWiѻIF_?(-R Bg9anj#YC>jP*JRk9,(PF\bVj̯e][شv)9vDKb'8%c%%Jh@E|܂=ʱ1)g|]R㩺.\s/x8PRܫEqnOaHI h>EBњƣG]9@B5Xq9o6.Vʍ˔t#t.yBA3ofsߝƨNMO\Sl5D!>9H裛i< Vm$-ڊ്݊g{!͇v,/Y}E%)w}=>zr]E?'%G.hSo%s!}+K)<G{`0(Czxu9q8ɚN'wp<0kz YI5Թ|M<'16Qx#=ru3=k4ۇ4ׇwKQ̏^i]s&%PeǝI{tI]?et}7B6-MڦmҦiӧ&M>>RB@ 9 1'q8 瘧LomÄm7ܜs* ~ɽߟ>|ԫޥ+}_MD[taoN=]+$7zn5D+y pcbp >RheMeW#|Mq#Y8Kgc]ݫ0NY8p?·t! =S6=;tA\'P(՟Ga{Qק֩p&^FF3ЯD?(ף݂|>Si荡بݺ +W;(EֶSwRQۨmx[x^9%A}7Uџ~Ea4Wmr#0|xރO!vK,oO<7CV2_Fq ܮeSvkha-\@e LHӯAL?d){[.&ۈ֤8m7h]YkiEZ9\+42=F-oP|&hI fh ܬޙ(&WwSJib78v`"Gm,\'x^ͱdXƒ2)Y#IZ$J4hԀF !"5D(S=N^5e&uA+j<6Ӌj5] |2,ye~XLRL M7dW@ M6U-z-07ܡvsuZ8|KKjJ=F)5X~w*np Ͻvr1lGUAK=Z-aSHQGmZӂjNkԼ6EһԘX sV~z2κOAC=x[̏xzniSA{yMlfm[0Śf]kn5*`QV(Yu SmְɾCs{9*oIU眃7}ls#谛Nh繹s&5U5D\FU,tTʓUBʊ|*- +]ܬN dLrwK'*yϾfeքeiտPe_tvwe ҌiV)W1Ə{WMa5;EG5ϖK=6儳-EԳk7W:W9|G&m'uٌ[G~l7n6zsFGs +J\,"{ +s-d״F + < m@wn80+y/3 ң0MwC-<_qz@W%{&NY^+VJak7wy~ +]"[B&Gj ?z^j%^d}?`4|'=zq8vWi,8JgsI9ϠP!Oh @p/ą^ЧU9{yr*BWH샗@ xWW^"'WMq+[,iw{$^A>ݷJDЗC:PI }{wQ?QCoƮήԮL_#yI//x U/΃>AgޒEj(}ʄ@o +.]R=DW~oQh(_4/9ŋ]P!lx>XHm*3_D(ApC^Wq?ŏ,^O}|uL(Y= +^W ^O)SZ#_X!b! K`eخ qf#|+$Iv yk%s{n}[~. qc#c?Yz{?R>v- Ż|<5lTW^ fLJev<#Hle{~ +3"lbAVcB3m/6i#_t`m=kz:Z=]j=Ƴ,w.a?Zi<lg]``s[KRAXmdjl-tR} wY'l;}mŝ(طa??Ӱц ?Zu z:^_~cK;(o3xgk8V_Px,pp482ȑ?>㪖7iw1?ƻdGNNRE=S'>tc{QVVr4j_\&xc,6 TVh<;HՃ4ǩ*]$ +mTv?Rn>7`@Oqՠ,do*Udм Wu@WU@*,,Ȯ J]UҦRҭ\Cx3z<@cMkϪʼn/Nc F9 UnlCJ *1$nY4sTh,R\ƹڨSMeRݠOi7J {6cG3Gm=ẊK0_Cd7TlS9R17)TF)%ҨaJird#)!*^QɚyU ָ;TyPǿ*l8pX]ae9eQ\#/FciViuZ6$NIIMMS1MfZG5V;MSs8N&;>=ݪe214ܖ)+upч-l>kRA^@1Jvc + '!Ѥ|ȘbT(7N9M2͗1K̫mެ,>e+#}p_r=-eo&{ _`z^7l\srd7˘_i-.eRf3 ?Bҏ|h +bɇjn{ZZ%̓gUho1cC4?~LlD(%Fc[y˭0kQ6hy vq0@>V|@=bs.1g ?v4`9Vw\G/~,&^ρ#}[G ?}l?5[A-i+'"bV)G H1]1Ś`+c~Ə5ehd^d5@. KzbݯU#?^PMKBWy,WqkfXź 6RF>v!^rC !~04?M=vbi']7:o+-l$eI0r]s# gN=\w=d/9ǂt?~|!x&?Ha83 {\|W%Br~⍅u?|!r"!q0*X1zq# m\\|q{r_%pISZ))J!=a׏"` FVGJ Ûq3{89G朾EoIgym;b#¼aa!ukHJg"<鷀K2~\cFMrR+|Rȫv( }}zs9f.:6:c TEH)]GC + +Mw& H]>twp5 vA?k>CgEDP +}Z]F^'?a57`{l'E{HQx^& + C__cgEeB:Ა8:,5)T+E4/czBCP$t#0 x>c[dKzGcuVĐ7 خzZrmҬ/_@MA]35@6s|vQQGqíF+ LD ]c~lb{v;,~Ə]m<6Mt&hˇGnxG`? Nn6vla{&}؞TSIe RZkly xΗC%0R07Y {,5$jccjipdÑbTSO#1&7=;=tNa9|E!>~yV| ×<\ΖzBI,6JR3֯pjjGV4"v-k$QC y ƕ/`YS)[vHe+LgS~ 2z)=Ur=M8I<2a.ӸJk6k5ljجAc*:"\EFYFgZT~H骽Z]uHUJS|Fqpކt1{G&X<}ZŨAEkv.gnQ9SiKJ)KV[mTz^uYޯ벢oC^7o0ZsSQ60 -KKk3jUTQͧ---N[bAu'U[vE{vPa*΋MBs_0 +cC,ibIk\IYq]:^EjwFTęRZ;P]ڭf7|}5s6gߍ涂5, /l;ћE~y&yCvB.ՅU +[5ᵲ7Y5QUG9O ~O{h{z3dMB ڈ)yqrնhVUEeF j̪cD ]UEUƖdWE*:q߷dxWh mOp)&hꐜRٻL-„5Ǜ xLLAU$dLlUYrV&4,C*I< J7(y'hz 1A{cxlfOTBUiLi*ҵ2*O,ݮtRtV% \::s`24!MqNS=k;o 14rjA!Cnskg"Y, Ax2HG铇lYI #$p +~} ?⿗O9 9;Ч /j(/e*m 1eңIq9z4 }q +'HɧgZMhhxUu?GXQ@X[4еIl03̓qq9<<|gO3D;v=*>G'':,k}Q0,<&XmP/36kWWY/3ȯ%~$սT} +x +sǶyVq8ėϗ_bNl'vb;WIk҄%ڌm Ji6ʥ؍i\֥u 4X/*hB6`HӤ!`HFESxr>|=}߿hȁ//z::҄^%_r~Z%2q"zS9 +撞E] Iv{?\Wp>} ޅ7{O]_?C=G"J,XPX4ǏNP6wh%t +߀5֧yY(-{)$ߎnJ\O;{Ex +Emll#3E2 +e>1 +8 Z-7JiUNlSiz8A_>|u +vcVXFAk3&Us^-6kK8@v 1ބ!lb{[S؞18ʼѝ"\=F~.״ C."]/vÐv sb ~ #ؚK(n'#sH>i;O7 Gܯq~?'OD4Zeص`׎]@4aE ı8-v'it'}DsYbNj2LO5Sta~}2Q8.0\a>?ɜ6vѯ;fq̪E|7m6p+QORdv +e>FcD엺gIY:Ɩw|5 x6z9fNT G3>ZSӇ!lѽStNvϐ~ؤ:|o f`;c8lk?6;%~biO+?|`w+͒[Xan|x/[c=x`ls3 ƹ!aofsJv \/kSyX}FM)1]QTWEIܡ|nݼ6ʚ1S +\kN0>޳~4ayg/SJ}5VVxe Ai^ӭekFRkJYޯfےl田*\u?c G zlw=EIv +6r6m^emAel1ڒjew*eߤ}DM)%35"2v׏P>KYQVîRوH(a(̫YT9k" +oW}L,9'Eoo(>n2i+G +,C<-.)S۬&UqFwz5cx +{Vz9}wTu~V\)g_w&c/f8C) ʳ44*(+sS|NyTW?.OpV\#rz#tYdUG7qkfv5uyEl6w}dyd $!aP)y)D-XBAgS> +HNZgHg(j[Aꤿ$a9~wAg޽2Vt ,W[k#Ya#{,ÍcM K +q>:EN]Ģ N:GG/`[8ϲ?WQYg=Ew2%؎S]6S98@x7&/=4^k}FrMntyoKM.ױ?^S&CyT^Z,s'ږcz߃@l͖GއA.!!6;Y13gx乂GR9Ě ֛Yݦfl,^g1F!G!Mna|ǣ}l}$w/#3= }A3w"9f5\6So5>{s -ǰDc~ac<>yb?JfqOm մh{?Ge}SsuF08jk278K.sv\3%b.pV=KShޢH`BHNϓ1CX{cB88'7~ >7Dz*3Gw0ϼόyYS6SE&U|sI,i6KL(ޓ8δ<,K +I:# j\ +< +>G:3w^N&<IQ9pς;w+ ` r;(5R&)wQ>@þEw|p/܆w7~{1ĭ( b]Z]D +5pvk CCy y |Fq9JFD 7Krt0ݰJ`K[L7j'CL2=@ Q#;1Oe|;ofRA{#e vbX 0cPJ]KM[o+myp.s)Q #:Y/{`]Mf&TT F7>lAcVx'}WaepQ{+ p. ˈFw|9G-J=1[v&y H#NSπ |TBҎTlղLNo::hqbih\?˵ +%^]Ri1>nTkᯇ yT"_.%-dJj"2pd80\3}\y]ixmo_H]W.^} ; 4h̀u>NZvVa*19x\_٨Dojn`=˝hZ5[jH6WTNi4jૃwQit4LՐj194nu?Zji A+hkwZ5˞YY tщSN9:ULGZ4d%`ǔ[vh/7'KmC\+i&03iknǢ]59hݧ*[&[#J[Vr[&TfϨ~JUݩ"GRA%#J8g_Mhty'Zx?ϧ +/iUiC.*^;}* 4'gJI*rV)[dnynWݡ_A#B +/ +nUj|8fi4UeaQaS7G%yJJJx{JLWAa< +u oƐ^)yo˗֡EAjvռO㥜JR R~l bG.[ᳲ*kC" zF TrPRBa +YGl2ynybܱ\rcI9ʉWˑDlvYJ+K0ICL0o?׵Eͥ5 h<x `Ԣ@4KMބCK)rR~ed/VT3]MW?v|sqlNĉqBb0Ih’&Y:hc ZjUhP)vцX]GX2mz MHݭt*e4y4MǟDDCSR@Cq+Աe7d dY<&uPgURk pY(s Y + FHP4ilv(| Q6t"/e+@YP Jyym!4PV hh1]+&NIZ/VqnGl*6>n`<` !*^x~$!m+km;NK?RIR#n؉HK\7eKz /8xm1&D߉ҋts^rXd  _̐ r%5r+J#zG=WMl  p^Qj:[ѥ`G~/7.8P#4 5\0D#r + +yZWo!M+ci 2̢o~L bX.g;1r9+$䁳F ZÙ8Y5"Y:a/,cS?c f3epM ̉q''Ycxr +$tVkPxתw|K46wج.ۈ.>>z7ލ{1nYqr'{oK;]8[9~T=示d+|[@TYeUr9r~y?'iG >̝|v<fei&T8+&ݷsΨ?"hWE"N"8$r=N2#pG鏣(w)v\oTS=9BDQ dUPD ɋE WO.KEf pX,W9Թϋ +p}@P3ɋDp0v,\H:߂ I$]b6k??VЙ_;FnmOȆ uq&b +] +m[_7 kh%9[Gq%r] )p[~?kbUWW2ﱝJ2~,vEy{eK{"=E$q'< # +ym;9{ 2ji󨝓  c gQм 4Scx#q /?'KJ+Kd2KIJ9%5Դ?K,к h'vmLj~>#˽ yRH|{/:!~J/n3Oxų (er/e/v:dłZۈ&h.즱 +ZlQ4 +oVw Lf&t4wj[=jKڳ[v'l 1a=PD`c)~6l.2'9Ȓ,U boۦܘ{ETvv˱}*Js*_TqHW}cUIeL{FY7=Dݏ0v{ C4VS%҇t+TUKѽt~V-PkY*ذ}c?8vdOae\Rd,&9iHе @xM&RkK)RһŭTBrUcRjKJ;e8#.eq鮉|vsͷf</صRmӋf,fTRnrI\JMRbI9,qS2"+ƺCևaY΀b3>I×Q kh+zJENF)fbM\V(-NW"Ĉ%6{?kєXb*zB@2v Obẹ,(L&Lf&'d !$Hb"`+H!DQJY@B%a  +TMRYB*TLi9v;?sfsA0bOlub ֋dILV1CA'1$ VYFJuXuYuh-;a=2hs҈&I p݉ .VlV?ZlIE/FK& ZDoub$MϞ!;DW|SEup28h;9vQFSc(5 ^pi׈+VX L6z;4&~ND6$^|BSDJ"}]@.NCoj8|,wQP#($Xɽp#6Xb&GK a& &!O/A ,i7 SMIA~D25ֻ15 āhphs' ЉR y8Mp&<Űppp2F(8D6K2GzC?tQ\G%.؀4b[+~fa3ll$qL8HǓ O?O8㔌# ts 2<NE#v>-=#ɀ1v&KűwG7HTܘ@I̋G@MbH:@kxgmBLo9[)NSi@do#ΔAke6sc6 qxvx`<^+2^nU> ֽ[sS iU:6峽# $s5 yI.FgcY@=5l* L(rf 9Py?Gm?WO:(Jf%ځjIExR]I4%RߦǀLʂxe$ƒ0M0C8NQVŋg+7E2e +)P*O*0RR-[/;1u8S9ysQiƟVe9:,Xyt*+SfTe8~o~a̱eޱi ~Fr #N̰ٱ!` ` +`\vc%sZJ&fM~pʴ3fΚ=y_heW*(*)+`ղ +oBD%2щP"Ķ]D'"+1I>z ty_o:4]l4giZְצ;FWO]5w 9M9$Ƣ άܺU/}PbمE:8tppcz!8e\ְ;ewav [4m)C)Z+ YW +8\awLY-o5%oADEbRM=hRROan"4?r6]E6a&Ocfy1%KaVƊW=ÛQlDZQgtt9 DrVMpOETXfGEUϰJ.Bb0Œն;еaƆ`CsCsC#7E-Cƴ(޵Qq` o1Y a0:a3* 8YH "#Yr ++4\r=oy8*Qo D*ó~ ^*gEF*j],]Uk&f6 mB_99ps&"0i-^bxͭ$lLFInǔ7 #N{ 00|Uw/a@4d#DV+vhRܶȥ&752jOly0|ܳp + G7-v}FjV+FU)n)Ns? z+KPE,FCV$=c^^q&'ڔ\5kkZ%-Wn5vwÐ> ሓsK؀[4d3^Zs +o YGĪFCސL=zSty~b/0<#9_qrpn6bK4业U0X4걶V/+긖!шohe}/=둧ye'/alhL{i* kL3-mO1p&bhEs;K_/99ߛߝz.E {a*f3Zӛz +iʍhKf@F݈6w-꾛]z| yθywa0`Q`_՘„ǁE26Fl4-( o'ٮ?9q'+(  +a/]P&uu• \3Z:a"Iqy;v)(|18 ͜ 0Xi4gp  .NXFHy؊VHNp^Q q,oZ3bY[" +τ k(=  g8's y)HQdC +a^B(rYt]*?(&{mOFPRBJw"ɎHN@$#N`;q<^h_+`<4NyDP\A1B͈htbb4Eh2{:mZBϕP!.VPoN5}%E,yĨMєЅ \03B#FB%_eioUWjg{bxbxbxb7lkz_EY1 >%ye*I0unzUOrJҠ%ۏ9a<ě4%K1F͸{ʦQCeZT>9̕sي%JV(Kv7nCJ051&m'1|o:t`^5XWA ݸ\h8)6 8 =#"75:Lp0'Dpq)ȉ@b:XiKu +ɅOW62SoHӿ0|⢇x0 E.(rqą!I8pVc :NffK:t\~sku?&CmZ$e=NН0\=!}5{@]AFow߯(ͷ.0#mg]=99~E~q욢cj瘚Os- iEt2, Vsuu-ڻM{Eq>})گ~~ Z9m9p;S9U,x' fwc:8 HVh׭[/6VcK7mЂD%Э^#8~o|_y88g:- $1U<?~GZC$K$toC7½sa{^S/-{b +1)+)7`8CA|.)DibdXYP50P Z*_ u::5ڬ=YQ|ޗ`Y=2&gbV*gŹl9‚b#JhXY Q58<*-gj]ӁYe 9ɮb(DJL'D,<6GbCѥ M1TSMA'8Dc~wxc?Us!\9ͨdR%lT*r‚ iiX;2NڇutR#X2|c1kqAvڟS\ *J4I21eUlD7}+#fh4sHD֯ cp1h`Z ?ϩ·p@4)BX¨`f-e7|L^ݠbAΠtÔnjhhLDpɰcx~ـhU9KFR -GUH1$CAeib꿐1zY(ȝyv²U66beֆ _IHu/^bŷLs7Zsv{`ȄMY]@L'Tpt 2`W^e! _'Lm}/ﳉuJs+}䝈;W. Y1Pry.fb\"5J _GwU ."W>c 5% +Q?1f'/{YpTTsxC(Eᗚ+>_} dÈ[/6n꼛c4  (=FBpgE#NŘ J rdu}mڽ5䧫QmW{ d(T?,OKU0`Ska˕,z.0;gsiLBWX_y_< }OߢR g^i]l]k^mK)CS5d81*êcU +TҊ]ܷo_'Mg驝'MSHfn IZ $Ƙ`bc@mKvbk틵ҫ͒}_l LL3ʘz{o~v׻q[tvƟRKkX<9ObQXhO vkc.e?XoZ?|E wq߶{xuzϞ{~lR]_?b/)Gaf`fc.O߹î뢳 a1'${3BXZ $P%!q4FcdY"JT$xu22KETcIG3h7{jx,>w௉ψ'}͈ci!'B gb14%'#DE*WtkȄ1H&4`F:` ;oZF'P8bQP2f,~>@K>ŏT8S,q#5Kևڽ*j4|.zARA dxDJC0 K^ +\U7NX沁hр%u H5e;\YoZ $pLɌaf:(b\NWG)7I53fq@4W$&rd\7NU TGᢢ *yӪ@BMDՌDX$q]e\tU}L]!4dsEIAr-hn9p,~U7nhTN4̛\ +$HT %C*F?(yD s,tռ4SUFC0͖o4XĀ>5[{tH5>4޴B Ezj2>%T{ҳוL12 3LU )|-^ZZe[ݰgAXKty҆?1STjKŸbna@qC^sFfC RlFMY7 ~ݳ`CJK#'c>O # +XMzAż!s7O\Z 8khnH0w0o%)X Xq6u'P MFWTZzMTwpTz9Lw-5LD +K7pi kcѰ{Yvv+HRt<힔;w\_1't rPC:])hT$Hрa pll߶>4ʶ}=Sѷ۞|N]V&ʤ`fz,ŠL(jS* V75F3mi}l?u߹{slo:YWNmC\Qk mS+4lTf$HX3D` &$hR&05z3@n{nz̹X|8@<Ō.LJf( R\ZfXU9A4s&f"}g lVۿov3څ;B;Q#89ӺIԜlq +)Vfh*"2*)ap x[ njR좦yNZv(OAy".Qn + X. F/cϮ7]pU$,$.?zqQ(%.pӒ7=tAi8!88A?u,he vo(;3Wvo=CNn#I |#`1rEz1 +n00'-==yIt@ĥ #BbA{Y˒$K^lI֕t,۲1e$2lNۚ>? aǨNbD?84mVo< zW:ݚ <no'wJN7ch;3Jp"d7zH!YB 0>L&2oVK2=|F~{]0¼>U)7Ic*|3՞"$C x2E3$|<ɶK 5嬸]HBE5[ _Uxזm/\^^ >;tx<4}K g +.] /ZURC-+~rhTEtE"r߿U{R>yS{A}_׽k?ʅ>(\6,0myDԏr{-$Y]+q*#ib](3 %a 3ή ?3a-bb 1.kD(5a+yG3A@KC:1j FR pF1!# 0,Ȳe_uragEIj^R*j +syN gI1|*AG HgDh팆ўH0gwᯈaFXdyi  u IִM +y @u R(+!ha +cP7x.7MA4CQj^^IoO辤1(1H{g4Lm ę 'ĸ>+ƺ!&"l-b˅xQQWuii:#T_RDž Q8!DgN`)7º=l ߗ yU~NQ͛d) ٗ110HxL Κa{.3ՃMX𮘑f ,6ª%]Ũ9U9oZѠ:R2/!c2N(*"a bHA"'j^}Ȏw Τih6[ ?X6t,j +QbܜVjF͎T'ƗPP1;p Di?3Gԍ16b"$g䊫ɞh6f`a&Xxq^[=Lk*4#͗P lh@MقM>%&$Ӹlh=i5řRQ\qͦeCj\X4{t{W 32uFST%4J>8fȦmTj&7+GSf<5nBCYϱ)A0C1uORuqju]atIo"`b#q&غUoh#9='w>ثӠ;h`u]Gւj+vewPQ<@Crr'3I7Mr!Ut-Vuǭӷe_ϫ1:zKQ3Q]>MӻTgѢc^T'Pm@ [QCht8h0Kyړx߱=Sn[͌s6nk8 +U8SY3YORUu8[+nWқeP1?;{>8B^ve^0q[e3y;Fb`2#c3ӗyʵ^k>Fh[FIQJtj=_.͖5C0ewώg|wGje$N)s+.13]BcP.a鹞 +M'B7xVAku#u@5 -|2ԓIg[ڻZ꽉 +PVO4 l +2ʌl0Ժ aqS r767t t~j[p~TB뽰 +d&R"On]争4{VeXkl$+NKoir +?A@0l\ ߾l~ڝW"{ߒ|'lޗQʙ<9g Rt:Tܥ*P7XtK>կ&a#/ֆ?|r]H*bϥRKYwRb5B=n"N'Mܱ_m[=kinj6vw@}d*ϽO>#kބgq~r|,8 k^QEbUm*—tfUy?R~+L^ty푕=3?_izօ!|tP"mtubeZA7l\,?.Ṯw|d.ߠJ[fȍӤ*jR9ժ& BzS+R{Cdd{ Ar<Xy+,zƥkA𩵷y֩ +~G{ Co)}NfC3-^uA ߆0Ff-a9!6!U_UUt^b,%-aᦨn"9>gS,6 b]*G mA G ңai\4)k<~aωBZ41QV :Hf4;4EE$6H1(}5Cؖ1HOG@CL̢<Аf0-d*U/oX9R9Hd】bti&fvtbm@et"@gb7fnJXs\,RpM\9.,^#\]2\Nw?E6R{44@,6tm@P? <[=;S>36OMefm*f}(x! +(\ESjkj٭.?ӱnp; '7=kfpSF8^G,z[Z&<_C%Ԕ!U% Ap1EI?+{0"T0ˤNl듡s`e m:'?tŬCY -Y왖V.USk$j߮0K̲iIxp ~P/hl\7A#ty?v~7AO(VwLV +k#7ن[H#: uGۅ'- n" X7XCpsnw^Ϩ iJVnv!Cۓ{]<0 5V-нJ0ӬJSp\KFʥ !}Agcb,{q>=R~.|"%ܓQnʢ_%11fpQ>QMlB)"ZP +JlH_ uQc;p|Vj=»(d8eRJ$#8\xvurUoN0^M+IdF:/>Kg` cx C9ƣsw1{YHѤw6vGvcp/kMh bpA B_С3t,iwzmmA` 2?W O0Z*Rbň>6.s ,@~quͥcfئ+;YQ-:CR$iR*+8cB:++`1D0un#`GSy6gjssf< +yn#\r FwOU +^Wʋk2H1-"2_+bD_8{1ȭ;{-g"+fgO:Ŵ2*Ƌ8_5Ҝ!,km0s-K &˥<_zwt'H~ؽ~Lf +oYiKfl{U) Ǫy:~Y$z*  )!b׎G _ox>de gv^aU_0 M֜Y =sHTJ"'VN9;)P __ ۴CAn' j^=K~A|.*Wt'"f:)s1z! +1aHt>F[=GkEuGOIm(ش2P{om?'׼$J,}Y4*?׸eIw gV}*VeuMrM *9zKmbgm"K@n64P02|˜Ʀ4gW\1"Vb_G%%M-9̜yyOaEV?`6>l)Y~݈B 7mfWMݏ$0ƒS1xx?:u-$$}Dwg##GZLjvl׸D+b߫dPR|^6zlM _Q 77?e&H_rS^a}2 _ ﵒ`PUankOo w崾d?g꼇2JUۙ{Rf,8Fy(YB5m| {B;:B :;C#:*a hP(T( + ܜ&_&o8 lC+Dr3f- -X@qTX[Q _qF(;\MdH[gMi7N@:MF$iڴѰ Gd<*8,duR *q dbNL¯trM@/M%WARZ_H03x*5?F(;t.#Vĸnjv wS\ Z wʝ3TР 4U% J@KM[TKSK ODѺxx.ӔDVԺmmWf߮W kvlPBР`4ݦi97-+B-*7IHM'p9O:[ܰ}slF9j2sfh>.4h.@WN_g8qeTɄ:= ]v϶plDuN̵NXS5ւ'ù.xk<-4B 4c gF&TghEQL@wV󶘲myHkn_pά;acyРVh0 YJ$~fbH|UG* h vfӹ.jw +BH8 571OtG61 CР 뗀,f&衶u7o)m6 +Cp?޵țGf'kgzpO8ە/C Р|X/A[iə8f ⧄@9-Fn6U͛K`WF G"wީބpoP4/ "ݒp + ^Yn^TYϬStL"!s:eCVPINuf$=a GXL<Hƣd_?:rFh 6Ǽ zh  $<|I9OH\n<0Vw"w+s.l>.xJ^r}!lx#hR7 Ь=#4f5KZۤ v}2idY D[s]#Rr<|va\>-|4nmyLkz2pf"pf"pjO3Mt@yuwksp 1ڃN&`8b̳GR.,r0(NcW%o~^)hY@61 - DXSw4î}U`jS .9CDaDE&_C^d&?+O}Z~iSOI'e$JAȜX vm"JۍM ؽ-ɀBe[z?k8 S"]|K~S2xWg('9A1X3;;BP\QPnG<2B*ryAj!H hP`znH`#eF'k'w cg?X1; +CG R-ldyVVJ͡JFqAE!z"lRmA;4mxa-78.;pRtm X0`vZB]f@ҍBncR)HRd}5 msN;I#H 6H$H/~/}[ݐ&uuUlOJ@ +F#X\Iz:Gzi0s.q]% l#w5}նN{HgPfU[TABBnrCBHH  N AE(r&DL@"ZV[7?fP[ `E(@A*xA,#Bܸ ?.X `!b`"a ]  = x/lSz1EApfrYvLwO8l*t*}ft7VǏ;3m1y{I0W 1p h_8F<9JQ y%&YOGtsR5f$wܲx|Rv ӫƏ*QU+qT՜=:= p 1oW 巛<) +TqPIzUBD?S<.![šw+H$Uv3QuVq;ɼgh.G4-#tY}ro!^ + @s('l]a?T%Vf=e͋93͒hdf:fߡ7~8oҟ% s yÕM4"b"ˠ_@w>qRVg^(y2'q%)FEMQ5A^j2eI.2X\4ةC`1~ +vWc:qeVL99%E2%V({N.v8}:VfbY9`3A,1kg+8c™|g +}ߊ#ޮ"\Us"EPkcWi.g#ulZs~gհN)X @ | \6oy;Ϡfw$G}Z.5=7t+Z{ucfuy .VuVp}rnM XT~s@A~hxWspl;{~t{Mo4blroq'i$2*'rAG)v zjC!傀eo u@XڝPo|z&.j=S)FϦOjȼFS^VV+6KTK+%X z7A[`ؼ[?϶Uj昈Gmu'Nؚ8m'qZȭ,T\BeM=WWt JBYOIv$`E ĈAJ?{ DAÖ4m_-zlϾMSoҗ<҂%5.Qd'[+5L?WOvyX.Psp~O,!1b([WlZ @cĊoqWC{ï1xp_ʱS2-Y,iDT B#ݩt-l77h{ +곱VY9XPBy__4oXK峃ۗO^qybD N[8=W^1HvS ^mዡsBZIPfmlkĥ,@$'E㼳1%(J>ʮQOvvۭz~1 JAB5H, [X'xC := +xJ8L +c1(r[ԨwY >fݡ}y<tkɏFA)̡@rbE;!47աХnDb/ҲqqdTxT>BV .$iν>s}Um׿|HzFv jPS rAeȊrfHlR"99l &;c +jHxJ3@^ x)6r^絥6g S +ߧO%6:jo'ژBA5=,hHG|<aH %EW0X*QU i'})kz;o2ɶgw2$2oHe^$AC5V#; [`# +c]QF(9_Rr]^MU䭬nm[HZsnZrk-)Zs*C KM2|E( +u.(fz E<9ILшtgTSy XցQF]+EGaP@E)RCBBi$7&!4i$TD88!"T;}^|^s;&6^SJ|,7e<= OD~C1:g7cg qsst}i {M@!S=wə9~'`ş+H}$IR^S4" aY3:V_4#f%85쪤:i&K77XdaLW@pdv>4X66M&5v>K0qjTt=[FM:c''| f2[<+O`u}4 =& {s6w +䝵* ˢ^C3OgbudicJwjĵ +;DMZ5V\ q"$?ݰ6}l s +],A,_xe^y\\N*ZLw0#׊5a$I"eTZjyqQ.aBL i 2|Un[A.Pvzrï9=- q+S`#ݜ,J+]HQkJs4Z)/Me*$J$XF > io32"@e#F?.~wzê~}I]Ӓ(78< .J/5|b24S0uX&Jsc1U+Q Ґ4d"7NP`c~}Ԝ'uӵNW"|)hU`*Jbr| +*Ҍ&8?WDThCO3q>JY .YˇZ n{?pnMO{Elx%,FK"Œ<@]nTlրFdl樔a3E [ AַF@n +Z*m6~׍Ƿ-옾ofMtX夤")O/r| +3*WU@=$qGdtΨaE2Ґ4p&ZP}CRM{Nnw)ث::DIH(#ʊ ~>TH) \[ +*9CrpFlmN:o\ϗ"Ґȷ0꽫?ۛZ3?qժǾ-C\|=.NQ%$ Ÿu< ?O GSSBi} +:ݧ-ûa_:yP7 e^P +P5:WAwVCׯhxnFzSɂ!#yi?lLp 6"t0MV`g8Vi Hˉ>i(ϏOS +.:c{ǹpW/] sӽ8=gUAPW!iiWB%Ob,le[iт\~Hh{q-N`D[3A\iq$Hy8^.;0aوN&?%! H:tQ p0!'q1) 7!zħ1n# OqATu:P +)6OD\-"%D2 V$B-iAQ0DAH8*BC?| E)2ׯƏQEËh{AQ N#ND!0IoTC\D|@{"<␼0v͜~=-r ܵ.`EBdeH@b^ QQ$;Ρ%u7 $_N7X z[(Üq(g3g9IAL5zWHݠ`z@!A*2S$!K(S .0Fr+q<1 ^7)wr/tjq`+ܠfxBM@"#(H*6B/-52mbs %.X<0o|Oca-s zcd'OJ5H} PmzraPFCV =I0 h`98``y_SDK(kX3"Ꮚ;$&$v@A/)TY+t1s`LDw9 Rph,1PCVI Q= >gI.m&AYl;+xK8*+~'cTlAPu1 ͞|`ѐ +GZf,4 P`@Vņ cB@m +-O_R'89a+E/Z!V>QݑRF7r'Hi81|`А-Gf[-KrZ!O> - ?5o5}+#7ٰga}PS TC*gh (ٲ @HalɔC ](Ő7>Jfanju7!9+UÀ䦱OGi}M1zf v i2R *A;9SQ<;cw7v3WbԘm< k8|eUݣmwN+.:-R-7}9-K >Si'-ڧ>m|꾨=* ~O7;5_e2]GY5 Y4郞mkSu]7Ϧ7zN{mGϭ}d +}Qz:DEM'j|Z1_]iYXT*[w\ٖq8S Zt?}(&DƳæC޼Y mK`Ye8 5n8q-KֳV$CkI;兩m;me{%xAs ҳe'36l7?-tZXk{&7X9EU+fHcG7/<=ʣuFjoWeoTR[KӮ6=vPd9Sz||QWٝkrV[|i*>+vL;@Ot?T4c-,,Q%!Ys-1lcA%[֔,*ԍt3G{+=|x>ΏsΡ ۀ%8g~_k޶5n~pQUЙV\;?;+3+9荼nAiڽS"4_D<ɘ0| Ô=Ή\KZ*.5٪H/8hηL]&MZ߯ wq6jIS\^RmV2[®X y?sYSY9׼L%9ǔa{=^iLC]Ynύcn7FS.W&5ֈIy9"inAVuwQϼxS^41ry\ ǙcT [ -<.?MIzU'z=Xt5F;T[S~sQwwi2ssO,45r9< )aTM$cAR&D9[6*cnZ\vx!rƸڤ*-+9f +SD}¤'”S3t,-a3s,Y >JAeCµ!cĐA~󎞃{:½bN7ӢϧSy5̪>R@OWIS]͏Um}r}x3m4/-(=<|4d0>pJHw]R@׻&Ki *t=wp?]GBOQǬ6eքT3cvfE/Oo̗9ҞEy1I >)<&g+t4j(ȧX[}-&P,&wJeLEB@7kڞ+ kg*/jλp3IJBGT`q:9`+xIڃ<熃<$ 'ss}w$ߔ zQЃvã;QT * vZqc̣>Y}?!C%X,'.8}]N}>(lB[ޅPujgDTEpE3%W[䯎_=6D.l ] +f-ƚsuYq:g;ᾛ-uYyY&َ"pq +(ql'VDء n37ȭno)fmayPnl,&vn;fDzlw. ٍDt qCt t1`D `஽׺B##;!a5n&3(0g@ff @jj@˿PS<\hჰ1 fr` Ȫ6@Q` s2>L e1pl|C5uz:_(S62l9 QPP((n`@phV$K3'm!6Q4(%=*}j^%*P4`3.K PBa +@Ds5-[30"l+6 `M4{8u$m'iB:DɩB +0WB2c1 2!_53 (V:*PQ(" + 9 $B !BP +"PEE\E:tY[uW3nV]Q (ww:+u\]m mځ3 A<2pVg%Ffuֱ | 7xG  { o}< p%V௷F-dvu\!įGPFl~h lxwx}d2w{;ą|/A , +B'kH |vRu,⬭Q_&>N2d~G8#?4`*S@g ׃ ī!_mz;hgA˚bJrFDf< ɧCTF` ow=`Hޯ[0 +>N3xJItUbl547τ>EH;".87Dz~ +aNs%U~u&!aGЀG%z-|/-h\)^Lʮ&eB&C qV/BRk$E/Ntl\C c$HNPd_^ 6^KZ__wJ_Iܒ|lL:&?6&o5RAL{dGdL.wH׎(\4ݾ/łgUz!BdȞGܔ G*Z#QEchd}Q|KHXBEE"tr~ܭg~5[2#^ӳSijߍFoL2 ?lߏޫ[İI1:~<=UU!C(y#dn\fuv(t9YL;\]سOU^,D֝t5mQH@eQ%eS̅69-MskI倦^5R)́$[K|/YbB'[NOKoWX~VumG2=%Sܖv!Tq6Iݠ9s^{}Xu\_[P6몵UG]iBow>mn@ST Řad't;WX?lsT_xspOea[gSOdק(kSUb/¤n^C.g3 hrc9ɍgd|9y[|Zj9tɺ˴'{7jVWZˢg +mvʀ&+ePmuPϱED"c+-_4:Y?N\U*0lؙ(i֥鋷.TZPX}Nƺlx<7k^"d0;[wQw5nM66Nzq7:֟qhҺܛfn]SVfWVQ8bߜֹ椗?Q0{óY"bd0ĆmЍVtG[xt#5sNU6E ʎ'ȋS+#__<=kOIfzO9)5{jN$t'z?m3~|Q23{XfM/7rvq1.[RS=pg^8t$-oi%d;eiHK>T>=YCwܗ/;?kO`-a ~/'Væ jCZRT{mW=:OhտA| ffp&QWXK+hI k^7O68_0?lTBs\„WWW'k_/_)To߶KdKeK?,tTFTA&ђ^+"3+''9ք0(= Y@,UnlNO{c& ޛ׼3цhD) C-R17vX nvJHq"c/ +FhkFO¦1v1gw\熧\0@=fgV\#M4/4p)vpfb"[!G JZ+1>f ,dCF9`v0$>k E.^uP'7ۘ>CҗBP@!~*HCH5a RET;DGČ0wU7jEPCs~P\@q_ +3;6OZ  L- Vl SSv0Gt'DM@Ģ0 +h@sL6;Pe< +5 W0(t5[S7(>I$-$a)Ñ䄩Y+#f%>;3=\wRhn6 +h{3@  2JLZYҫؗhSX {0Ȳ Za@ wp3¿; N0 +~?`a,$YBPBXEՐ'^ٱ ])TkX=ضw3I;~p'~/ 3 A +WH0"\fA'uMgF>QaeCK2gyK+ǽ}^~/H%^ŏ? {?Bt !"  ݌P/I()JHh {R$~fnz#Uny)Jo^7"O A S/4Hg& `A 6 q(Vaa >Rw.j_Tʷ*ښJ_X2y,EUr\DiRi&$;9#Q^GE`z!xذ`] 4}5|έZEh-3 +Tyz}.KUOՈS2Zd*yB]4Q;!RO +ҦyI;7YbPL_&~4/M +}֯j!mTWTqEe-a+TΓ e"~uPP<%I \aG`R-Àg0 ε;Šo-wsϊš#'_m).)@|c"!>=L^GYJX\\0_EcV۹+qGgXB s.pGGU `8kÂ. 8ѿX{`,]*O!mvy+>'/[,tJs;rIjcfogYezG *h6wJb:Qa@ښk2[-ΖG&!698'tCpEG?ETOhIhZ!PkSFj/ )oi&v&.}A|NGz}*czפa4 |i]#щD{&-?N>G RmdP"q/h; l}x轿ׁT+&p%AWn;/_o +0 J 1 ,  +K4twĊ~bE/"p v|~7-m&h-W^T*B8/.|+,B^)Awf(Q'òROqA1x(ڹh#Vfo#f&B@y''B(b :&v xq(ƠK@գBŨsüa3&']"whZ;Qq'Q+";, -X +HxRyqPs0p0spCF1?Sc0K0 X)71-̝>EE=D&o`Hb ű~Dac630F@tZ=F,)nJokGC8! 0vCw̬s&)"*|͂ j86#q["xMPDCE [45b5Ս Y0 +`M’+i5cR Ç[h+ +|$3P7y$aOɀ pT298U|djp Q ۴X猅yIVF emR6==q0@b⡿tJ H2 7B"n(CzV-<1MxDqqp= VC ̟Vo,lZ3Rf= wTe^i~ +r]RFtU8-K'> +-!v1^(D4 E[46ke!,YOATx5L]=PjSؑDlΑxg)% +JeZ-C.dq~x.0O3//q)%#.MFTm`h{)/z-7GMaGk ְv*uȣ]diy~e%,-333f%ɟ\IbK33 3SMg(]`\׮k^)|پOjp:N@SeđڲcU)l"Y9?-mbgx9ɹoɹp9*A4mPi=X·I.6ý50uƻ;=vⳮ&ڎ0Xye{aG*/ eҊXɅ\LO O({mS(EtQiDx 0;`S&T0ڻ0r0AV)V$*OHS*Tay3E)n#"qK+1d_hڠH1w7H[0ѣKB~{Ƴ*yu{#Zr51SܐX_BU"ϴ3ÔCMN'WVhb#F"KU+攀7F/@t 5^$\ۢ8)Qۥw9%KvKn+ o&I&%״ET! Jx >vI~*?@8v@GyPqTmY ]9? rꗸyVU2GCa^+dF"ZӄHz Jx%xT00 04_5V 5YdkKXW#FC.; .ȓ&/H7eYM0|ȗڍ|' 3Ż ;T?$FPtgHJ~NbnX +22Ֆ=)kʎR4.~W?W3=ܽǐy f &Ը޿@@fHjA8;.$o`g6v'cFlE08;s{̄삝{{.r:>'6O n7\]Jnd?ԅw@ĢN"QOo]dm`.m.D} 껐Bbî㋽^\C_{\O#dZqt(*zQd 'o K{OzC6{]6t۸ߦlvyW]{Ïd~K5ڥw0 Љ7P{xlm@YG=TcyΟNu`hJjU\7vG5yqo @H$$p\^RQJI S +GtڪT܎ԊZuw?9ozIy#1t!1b2j0h9HȐm"KY` Dn8i-M;S{l;?ROH Bn!ؒ8%D_" D(5#F,+B<4 g9Xq: Yأ,A=t=T I$D?Dz\B"RIDo"Dq%HzDY , X fYleS9wRGsr/}~ %DLyšc2q8™ZҹZ A2K͡~EQMT;u-PȔ,,B3I|-!.{jxlF[x5OW^q=|vg=|:9JrO/u64'NÔ8Iބ)`2:JPr@i"R+LJ[Xo&:@a'H@rQϦ  \ƂTS߄ aTT NBCge:"k t!5P|o 5AuA>O PחrRσNy(q/7AE#D10080X"6<slsBx3›\ amnPv[UoQGDž@}" TC|=M|FoT"#YA \x+ b]26kp\s'Ӣ%-ѿEw4/k5p1M$P鴞LH7p:XRó*'n#q =0~,ghkh??3?[ckz]^#g ==tw{S\h6+b/aArlz"iVQ,i.é˅C5^6yLl𹑰z>.5ӟ.ߗ^0>gx(8 dDo GDPDgQˠt*;Z)6Z+H<_x3zvGj5moZc= )mN&I 9r'T3ew2TSL4Ӡlqt9)r B0׋yQ&arFsomJ^<ۭRjsߓ| ;tfS-a]]EIq8`"PPd!bO6wOx: zO&(}usz滑 p\|Ӥ,=gfV*zW]A~,S葼wE4#SӞ}Vivv_5Ovg.4MyڑHJ:$g[:si "Grʍ\\[\zLw83D9˦*Yr`amE[խk~?E<`S;f܍m11 /vK!4!? xh-Y'\^!g{cx_.Mt-u,?/*uJey}ĞYv6fQnh(>nV|!nk-3 KM b6 :J:e" dh |ܚkCq!ӫ]+-v;PU,n]TRKժO*֪ sc͟6n4YٷMGj0n0Cތ31C:dZ=X2C"W5N@{]Uxf.7/5jqUX[ eו}l0am3Ӛ +Q]U*uȢP!/2XEޕ,֒/՝i"!R:  +h`A@EzQzGHD)$b(JLňOl֣1FY9[ăZp̜9S*P*_דjԞբ93κ!-ٱVT,w+]%*J#ɋɉ$͊f%J@ȌG]݅O#~Nʠw q2eT MʕJbC%~yasNi% 虘D>a OvJձ`A 7-F[NWjKTKpҲ8”UY"aZ6I\nOLΨtG]':br36 ;3P9ā7qprjN72p6][e{U0rxsEWxiIhMIh3r +E"t0`.E/0 S~;@?-kZ\^ppnvgAZ{IRk宖]612m"J]! =Aā =gŁ=EU( )~"kF R~w7@3?u1S2hpSJ=A/7tC[Mw.NԕXQzCA׀5~߭kqkE7tߏnuC\T{ԋiE>9٘89*mr.P;l^(3FMם..t\L[D{ tp@q\Tih8 +PFy/a X '-9^+jW6jr_z9U_2wxh}&n1q6qZ:9rh%ԇtPhrE(@EltokCl#dOJ|'yޓT='5'4ڮ'[Nw'[y"]Gcks]T@ @0E%v[,G.)VҤfC4>Ѱ~|)Zu=Q@+@UD_p{a4\gL` fOXς"˟s,g)(W6{5y9]kܥ/qB,fQpU?5@3Ps _` л~O887K zko_w@fo,q,lUl>vuq8:^qC\4uC/B7B}|WV fȇhhh h@- `41XF 3UdA<<}_?' +)?UH]9 !2(s,ą`Z:ڀ + +B'D1tS!/?ZWzl7xGg% Q25`EugD̉ q"bO6b!rĹ KbaϠFBFlԖqP+T&ҩZqe!Ʉ2jc2K^TPzA=Paf2kVų# M]YhAl\_ ?)!)# r?L?C{_4k0)$$ĐlPdF aSfI@((VPW'vPZۺSVSUCzkN}c56k?,?L\Jb8n9:*$p$=IsP5C>8c[ aF#I +8\ľbmYxLjcrx:c_s:P,20QV`lc0FyOvLfM2O3&f3.\O'@Hȉo7 dG^Kv1M5 βFfXG޳Ne}MfL}sfO`1łyOX`; skOK1)ޏ;^\d%w轠O:7?_F,^,-&,?Z>?x3l~Ox,hHeCnVǬJ[ߑ\%ylsC<[1,%1.Hvhޭl A$E$ L,}2R*((  ˟X^mso`I]^xUz~Rz_.J_;¾#ˀ |my+~bl,x%}IW݉\Cnz#TimpzKAmv_n8H|(E'O|"p9a7c 7B8Dk:$:?6L*:BTʅ#Nu1?r$3n 62/d'Pp +nm( \r\3hx&m*MY{2'K\I#nt>1T|ݱX5HL },qpUQn"wF#9".qGvɖH F@Wk*pᆸd!Y=Gk)An&Ąܗ|&3h<=hjXr"}=q wiw-f%f;(o`=~o4oC x+tƂGǧ+qȸz9 CQФ +M(] +@C٫Gdd);RK[k\7'58}<{vƼǝꈻ-l{u kIns,iJ_q޺s<]UBtV1*/C+({I7ekzeݩΔ>~[vMI'EI7D /S.65)Dgi8yHhTUSщEP9_g8 +n+٬Lϗ{s \;䵜uM C:gjٸRvU=iH>Y!6Be c>BU](Ag*tѸrDU\Ұf``iM*Ѿ(YҪ(qoʯ46yt 7{WY$%Y}T)Jުl7O JO8]/DKjW:Zkۣ:k} 4Q 2fcq{mSUY*%yG}y_(~(? T@|e.xjh^ K.Bhi䮳yXߴ6ªz]sec}Q]VQyKGyь(م )~x~n*q=8Ss'gElA[\V^wr0˦ۺ$ZUmsyµ]**s6 +;1IO!^ߋdj ]bi5,d9!41|[ڏe<.&ѳOn5׭_ٜ`nJ7(s*9f^zMWjVQRAqB9IBNaR%+RQwFWi7ծGx l=X c,#xч&Th| q5Ț5Mޭ#zbpDVTWEVe#* : 9ft I;qc/A7"̟UM;H~-ѨrJI4_IquA[-'HGJ#Sd(B ",O_k;*^>ǸwWsЃuD +UDG0Hg{)'\ Kd(/' WR~WK|.40ndJYkge}<.{]`swV"$5sDy$rhJGXCΏ]?5-ző=Tާf +Z`ͻ"zOdDV́ELªUP +8G \=+g6,T!P M7f\]GOE-xEv(L /]&Z(]`T)/wm'l؁eG#ՁMv&ϑ7BD!G>cmvW*&/[M: +YM{\[]W7V4mw6Mpˍon)[^&'!!JD$%m-4yː=eZuy=~ut_莘5mm}{e~ŗ-.زAV<#zG<^^cŶ$ɣ SM͕-7>7rMcXaآ^_jvM׼Q_c~YF`|Yo۬wf8̞!jjL?%xSsoTyPgǟD!Μ\.ڲB \ !@;% \E#Ap=ZvY;ݮLutm}y~)PĦY<ɣ=+w?vMetYZq}+j}Gn&n˼=xsYm<~ ǨηD" ? ~#Q$[KٵXhPg-f\c.ؾWcGܗcfh1Bt|,xw J.9DcuU,^/d:3T.sjtTZDjpD08,Xb32{?1$ 0TiFw +vVp`/*˲hK2gs󝦎+\'u^Y>^[JH&*/%0Ʃ МA!;|_@N;r %kJ:\QQsxtqYHA`~GDݛ>)g匳[ܦkA?:o.ubDXC^=| }K·αVJ륶p˃)seǬJC~Ե wHZ ZOF8:\ Ր{!ZɧA>9|O;uh^lަ0jWV1Ɠ½}'ݪj^ +.@Y})*ǃ5!Zh?%•TN^a 3| R2 -vof{iζ`jK -|d{mSQZ{,jdMܺQnN18"g.VN5a"| 9`os`貁v;PCu]ѴD[uGMO*s+l)*8U۬ibf6esSn >MNIJfz=a1ŭN|/vttѠt JVe}qBlG|I]lxev|;C7YI mc%Vb a"flƳw`o4LboDv*G}A=J-yB>§I& g؋r\Dn3uY@~}_{H4 &1yx;_>a65{ Nہb3lt&7ͳOӲRwO 'Ji]M4'<ǧW#Ǟ{G0zuN?6;3%hE;x( Դ`>*i>sW|MEыU{yF#ƞ}I׌ˮCs-|闹W,`$*<{4=|@&ZA;$`:qHJ)zԔj3"M5&d;:nii+{^YjOOWSqLs gp?g1 ϮG%Ӡ-d_Hn Q{!r @_<8@ LʣUbUkn5uƾ+{닝ĆFlo;sVO\0 PTWs_,, 4,. . +.ҸFX1.Qcp%.% "0":&*ʸK3?qLajᄈhv)PFdEk8 Qu:HjVK'ڑDkcd95BNMA\)P?}H%lOپ"GrOE#ʪD?c-Qvw^A*2\ғR/w&]}4iJ:y_M!kz>(%:\{N+,p6"%VJ4gj^Lj ;4Q9"KDWqו4D;D{DΏ'Eh! p c>p7 %ֵĞfbU'beW>)FD`)f(cpc@oO0цcr`1˳0񂥩0A.X섽Pp| F6& Xb? 6b^ZƁPG v/e`IdC`.`3A XZF饢^(YpfW A>ׄ>-ӕ+N j| + B`#ת¦*ͪCI}\P׋FCH$hX=w8mE!XS`C`8oda~&_ڥJ\/i7F]x#=UHuG{;↡If`a +-"1&~ %>MJM]2Fm(2J7LOAdgul2NcMwq|U[\#pu oC͝-c,= +KwCv8FdyTo'h^"ɼ9vg:s}mh갗NUa8Ca\"Q{3;#O'=b&EDL|bWk%̷?fq8ʱ:|ӑB݊)Z+-\[)챰v8wE~DcOX7zӋnFbtG,(aUw+G+g+**G-s.s>,[T%GԻ#VG=lb(؊-@>WD/Kt=΁nrsuTJGEUB?2>@Hw*rO.{}鶳bUql(6}{V˜-1^bN{m>kʋe8 +$j'r2z$;:߉j{Б6TE'I{R%V(Oto~ԛf$,ܐ{]|ź55w Me :uy-5荞Dg ::HNUj:0DebwZT(68qsH炔6 O6yךEڕue (3.W7 _$Dz\uq sGsĊkqL#vۭݥ͙vZ7$9/cjuGix.wΠlEy)[SK +R0;п8xO!=O%}SҎz*eoFEJGF86yy(Uu^N2Ub߹f|43P ӟe?/->|=pq(zFY>}vvc`l[EZ3Jzg BB)ÀS`7,f,cRl +˽W1FUkQyJYUR|eъإI K2# Š*dF\ҩ',} * /ڍ3|`cg}ĀE8gk'A5u@y qqMӻ`Z +~ۆcʶlqd1d1tQg6Θ#c,61eiaP љ<6~<nǫz.'vp>vS|DH ´?onV1K~k{}? ;hN'?ϵ|4lϼL`!DX-$ say +>oHJ:潌9f ;}`Ƈ00#@u +p;8 XC +!̾Q|=@Dp w~~gpP 9Oax80c@)qp<~ X^L.NFlaP \.M%xͦD ?QE| <(Ř]ؿbԾF;^D{G'hC6 +"QNZ [0(q񢞬EupGX2qWpsA~Ǎ~%.CA/l}b*"gJb-c*,[G{ + *u@&He +g&1G:΅h+|GWs  OM~#p:gp]LkB])a]y" S+k~U_uɯ迆࿑:G><:3Ӭ|z? {4α= _N@\ Y3EmL[_E%@ZQjX5Ƃ:uOmfm :=t{xex?&}_L>SO>`9|; YA0>'Na,TGz7u4>R i Y;7622$r\0rw~/J<_" +d>~7jy285*x--R#

45C^"IJؕ<̥ڒINuk]I56U^%MK\ ݲm&>AsLQp&TٓRؓ  +-NOYgg`gl 8˨2zG(9Jk[dULn\KeKOi}Ge0Yu{[I?s~3 M"Xozv"N)ה.eYR#Jj76 +GYS?kџ[' + k`wQ`O@y|_pY2jD5T~uQ0i{nfZM ['7kהoNm{UNQ )=ܟA!lyؒXQiTJ-+~]S:Bi-(YKSƘ)>!_| `&JC.aD&x"Il8!YlACYԕͦ"Xe2[4]PTaZJlbSqwVqXVQاJ/|GWx7*(tY h?, o( _$H"Z]aUg}ߙp8%TA88d`jMbxMR4`(Ah@F^ZV1Wl|3l?n>ὟywYFgcTFcD@67NJ,bHXeJURTorfeEgEe#sui0 +{aof@ snגd.a ƯFfo\)HXWrtdEd_T&ꁖLMK6R i +j[cY%tƕ;Wh="Hg:l %@tQen,yؘTYߖ¬ӤPkb]c-T[+AVER +,b^hQͺџOw*`iR iUoU ʀWѧFD"&5 Ijg]]W.y핼j/H^ՏdJ!{n +-|IZ{EOJzS*AI÷A;Upo0n&z4%yO*t84g¡zrMa(P/)?sgm` 6ooF3f} +6=lz@M[0u{R@j& :Ge+?qΣL z׫pn Ac88 K)/'yF{jfN4't8?e87jJﷀ;( E-gYqΙb/Bp1 \ex\¿n??S3XI;!_L[HЫ@,\$rM1퀛wzyQ#Ȃ|E 9C<*`.`,4(9k? ѫx}An]rD~p<=q"̉Cذ!@<# t +~@p2L!id6YD2Jb!J:RO<t;@hz7Hɫd H> $dd-@6s*/Zxg7w;/A8< 0d2I#GXQ+ɧ2WYpp5*?yy%wz]]3kBtGÚ#Aޡ>k=ɤg=JצWo8#Ea9ɗ t`Na<]_(`f$-][hhMfj,av$a$GuGEyQ ׈kjը22,820("+M\غAi +ښj$=dqki֘~F;0}yWOccݿK`d{#\C{XLRh[RxsRdcEڜXДX*kL ZPooTƿĽZwB펻D<{+^P %rWca?YL{ g;NƼŽt&KAےQf͆9"!VdH42 )"ٚ%UKVkBdʥߧ.ӿu?Җ'q$ *t }i}X+Fs 3}~&2g؜ 3g.oWlSF(6d Ey<,QgY $HjF +9pyV28xYf\eߤBΡ5ຕ{ibMy2S8nd,UbBQPR-؂8Պ:UN^bݩͲeXLko:Ud +j9agy}3oqmYJ}eMw,$R(Y(.)N؋S69^d-* ) +,]\AmЦ茶3:KP@P>A8wjv1Jw*keNpO@s:E6g8xP2F<3|́/v˦5Ȧ.Ȧ4&CДF!h:=<~/Z#+AO,$" 1ӟmix-W4DIFIdd--[[gdQwOgTRk@%F1m]v&Ucay8DtLYx3:ߕ + +j: (cQxǿ8| :mk9ZÌ11Gaqx$ ?aڝ!f ) tAw ǮC{["ݡ'|́ 9Ԭ.R`7`u~ǀ̦CO2zP& 3 y_ +BrDPA@e t|1[8zꮠY8A4o CcKf槟?@| pX~;]?v.j;5/F ߁#׆ihLӔݠ M^,.G"{y_ݼ<XDԝp1]Wk#3|}|$VӐ?|ʀ9 m_wˡˡ+/~sV^Rpj"mc R|Ś8iN=p0y>q羇s}/3_*ou4{ <"OS +ʇBˆiCbxkC0~&T|a|BJH0 I$BRJ摥d5&6!&-oK$Gd DHY@5d=u6N<=+ʢy<~!—>-!@X|L(BGxZ-g +Qg5H[5]}Q +6SG^u}}!LM T\Ѳ1'A$N깩2rNRjT.ScWFc;3p?s7=+wp֘}\}ђL9oF_rPjFSEL? 묍PIne8yz|Y:Kg$/7[D#0,Q_-D3c/tPՃHMnHq.w񸢚oŸ.E,W8و/;qZ{qR?%Xf SǜhMZj3_<0B3{\6F)n5 |))8d.j,羕8|HӃ8Դ^þ+l)m-ё~f\iKMlk18:Zgp\j[Nv|iWag-jl+w:R݀'xqx]Spm3cqOSvvbŋm]ckҥI.j6t쒪Ik.ȕn+=w2/ԭ]_<řg~ӽv|8[{ Ǧbi`26z.0G + * *WUȫ+U˂R-:Zz^_s{ +uyOj`oxN+g>rt {̏9{gkl>}Qw(Z"Qiqb%MZaɒYr%yejL5߲H]aY.l֔Ykf[괥~Ԗ{-'4 X$WP^Cx=sP` `K?-6oQ9'VZjbCZhM[ru\nSYgYKԥyJmqpnFݴZzMb}L +$k11v-gulj P9+tX:󆅢|]*f Kgf. +-L-름,S&S&燜0|k@?.T(cCnl6i>c^g},M6FkcX0*l1'/fp8!^(n{q;82|./0IBArLHiݑ9iQi#h935QIMWgz5i)㵮B%)LZfw՘b]ח?M1FGő$$k*믎Z. `KO!2>K7cLFvw YA&=v9/zRU.O&=VtOeK =ȌӦzSD3CDG %25.j}#>f2\r4(&X2 jٝ"ޡ.%yco*Qzs41ڨ%"k>,`eu2|j>R2#vGEyafAQTV! +V3*WH jDH`\0(k@2wK[$FSFm4966>9w.}}8;L$/[d95w0#~(Vij|49>J-c[k36vjt.6ېkOU!MhPvO}gC,ǁ Bb|fx+7&yarr&%ǔ1!LRf'/MNW$X'#ltI-RRD(uzD1hZT)XD~_ʹ/sO*iNx30A?1IRm \(}l~ujabCқAˊNJBJ  HL,:ҁ+9d,Oa< R!Y +4d  U ~r~Bdƺv9CkqŅ;Ԏ6Z3W!y`p7q '5ckLqe4JrøOr/ ? +YN-4,co\l`-R3,zNs9m VlN +Moҡ_X-[L,Dp.AҭUjFҳКC[,$mD +5 5#u@y r#ZH7YnvQH\T ǪhudSн:5 $E cV}v/a_!`_NvtQN<` 5SI ugn`1} (Zg=н +f;(aEG@2O`7YPfΘfκ's/E 5 kI%_wꛁ{R*6η=G g>~Zyrmoe[]$_)-}oSM:LMojP`( 9)>%) <˸;}kWrTqu?3{of[gjjN>O>'_ p 7cÿ¿ŀf2o#w3":YY0LM$jRw0u=k9@y\'ߒ#gn2&?sPy0x}< kb??Edn`.}X>_E +5NnX'L)GHp)0xƽ˜F.PS ÂN:VD-t|{DGt2đed%YMFb"eԓ&L:&ܿ%~/w+^G' BBɯDK\K&d!YBVL~!݁34)1RCtzҩO -ܳ QZ/%$D(3>R'zjd:Uۄ(51eT ԛBB1Չ&2N0RʍAM~AŨ*|U&%O䗬mj./ffAzBRi4cQ_L %.:jDGG*/Kkфb1__ +1)4|)4Ja*/b.PE~ʞIWl|GO?]a)^up[ֺDlprQa3 v[Pfs6[dvH֣zB)ט!C +ɳ]gQU_XkGݗ-2OCK?k1T| ݮC# +%Xd m'ǔYMN&{,5YdJV*g/bSE Ԟas >zjZrpTBsJ+#auJFIEU(* +삱VsHW3]g ׋tk44UҜVRC2Fi#eU&ŵ`@a^0Ӑ6 m]&dLGpwKiaI>-*'Q)IujU9FU)j7oW]":fzԸ Mky +9(d7#9LdxHZu +:op)&y)@im)RR|*7RB_.kAsdoz;8y MFF{:‘]{d q^i}5Xyx. ܣ}E-xx~) +xH@2~qc +(F#Dep 030&@ + +.HT0.DQEQKLuzQkmccTRb ڟ3]z_ M{´r(P[+,B?b~ĽC7w;N?ގdo,cfOP.5*1 ho U-s{9=z'cJ6>} Ցzޡ,o[\]'GcM4b0PXv6>|P7hzb2z4fVsBM 3ʑ +xدU48Dvr/:OAX9xESQ⣊WxwrWE^-89CKm_5sa;CQ;RQ0wTf6׊Y) Mk0MS-4 Ef(ִ"+QwU=y~ȵ,Ė+h/Kyq@ؑ9Nq!>>[PRm:Jy-JQ"W"IY2UJWENQ@( ێ&pg=Ψxw P6a,J'P1()(Х"_#ruEbnRY!)KrS; TETq1^^3vїR:4PAO#O)8蓑DLgK)RIJodEAzU؉5D6.P^#>@K(ckXw@A<>9ZdE 3€  H5CH2DC$kj9.bl6c }9&B:WذNRhlY`ItE$$4IJCd c8$&A" #n#QUZH2H"BQI#HP8VuڪTkK_Hh~?ޯyXdnγ^fhDD-Z"ƚ10ڴD13^z0 (#Wb586PZj`\G }7~$PhLHRT4#2!螰蚰%a%,%,%,%,ִŘo#5A"|x4+.>I~\=(*9\=i0uQW[Rfetm=F;)kmFDh7xx$7&CH}4Θ6h +skttR۬FjLY:ZeGev?1zɞ 5D`?* +Agt0h&yE 0CN":ۥ6(ugU'ע;T݅6u.S 9c~*~TrWrT+iJrqspߚ2X WG/5d+hp5ΰtܢ62$r|K]{)}&$Vc?(v_A/E&g$+1睚5z_W@*co[ʬCG' f{br \ +l"f^L{ I{h 8HTȄE Vz(gfݩLOB"yuS?~GNm kMJS^N;h +Hطc?.r=T 9*RtY?m-.g>x;7B B70tƢ1Ai +3tG3?ۅ-,+(Om\o_;ƷO }Cv-Փ8}/͎- +)450CW~\ď rЮ+u˱%sv>Mޟz '| <§{6 Z}yQ؏I@q +?Nh16K~hC6E.:<\Keԣ(kVPUNo[3l1lٌhڠ>B#q`Mæu4dVV*TRtY嵷iiZzRWTVE{G~6vr/[n|YSkjs`mpuZSJ=cVzr Z9YK$! $$'`s6`mlsӤ$1rkeAlՐK$#YUiҴMSWM:MN[K#~=>ÙL`0k +fDl}O#;%D=!KrXA1p +j33g,2Whf*d8SRdWa8ۈs؛G4}FoN#"?Nu!,{`ȓyZ7eO;vb,Ɓ/ߊl-P"kWhFoaD!t)ѡDXy{TE@yE?E +o_£ L%pch}'yT$#܄, RBWI5:J^jCXFH@PՉ* +:ww% TXb͆٪VzF {#j^Pe?@jWDj$m-:c#a06'|`_ Sz5m!C5RZFTкqQEkj1'J\7DkN(]J?!'4Jn#2I'$Bڈ92OCߜ4Td@EG +O9ʽzyP{(Q⋠7 ow Y}=[$LܒM} 5@I+7s3.Zbm+PO:U`+Jd(i+@q[)A-A# +vzQj<y  ݃,)d/!k3@vJϲ%'äI [9]//Ga:t!3lu*U.,DV;"-r["A.a"a WK#{I''M*bqWjd GfDF4"lVb[Ԁ1;Z9֍MQlĆ%n#%RCj }O0 "C?$ΐkxlZQ; "]| 2 cVg~ X{)H`;jbb2Ņ=&I>sgyKBSKGn #1 ǁ6;4/ [Khϧ\B;"<̓mzɜ>B^އ| BsKlfifMs&C\wX= hy1:|`7 M -;ºʼn WgW zJr>85H\_>5Qsuj&IbCp. O8/cdo}.?8p>~*=f7rM,x_˿ `i7ׁZwh-6yK#9_Ќ&-/COXGL?=3H8U 8̯YopqV(;ߙ{{#o^%js/ +Mҗ\>Wk]'I7n|]GNPǥ~;ݳZçp b .!*\oCrra! \<6h@@LZЧQ Y0a*C#4RX #ئ0 Żw0?m~mW1|>ozBgC!yPN5ǜ{9~ƏokWڬL73QW+]!2+Ex>xAWlFW4LFωn4cc{K0M]J\ D8@E];~}߇ΠIFLţNΚUg@>γ.,~A'F)-t d䦎c}x~Iu#wzI|iJ؎P(v#6QktDb{;G~ OR;/w5x 28 б~>a9*~2~rF_&;XFD[?_`qЕ|yH$OT/~^ďO5,2WMڨTA<:5lլjTGUpԾ-Ýۏd/4}iV4:bR4*јj"bV3,e="K:]Qs{Z܅{Cn}kεsowEl~a)L;Ufhe7VA\|5=je`6ji=坢fo{>Z3A |5ߧV>s4w|WifQ]#jMy.ax6ds pf.V}ŷՓ Z/F'i 쁅5T+U?U3g6`jZ55` ڭAԤA'5qeU^C<9εF hmIs,E h ClPp )#kjUFU"p&CJTQIC8+g< +z|[/sGߐDPMi#4ed&X4i]UU9P*TjhVaö(U~°*0 h!V`)5KԒ|5)l&btG'h|Me3iX%r(rܑM*\rEPN eG} +)+0e8aƙz$WQA *H0+/1UDr c.UJN 9an,b9&Y-jȖAG'-O$?mG%K "sOZo"WRrNWVUNCVb[+dMWQ)e6)ɶWۛ2W%Z=2'wћR؏ o grlJ 35Hpe*=-I4rb/>AVT%d(ѾAmK]kZiI(.ţh}_U.dˡ$yrywڻɑJTGRQ:L,2;˔x,͊qWs"Getd(8HZaB7d#S;;)%~J"KHs"dfȔܱvU)U'I)5Mzdȁl²<6A 44(cTrd3s1]lChۦhJ~E26׶OޥpE>3ɷ!CSְP`tK V dD+A1B +.cA~a Q>a򶏖%nS7\$ dVE7=!X~2(@3 y?Jfx5g3{Ȼ[rkihoi@kb35Q@Mi«<:E?e1kC Adz9Z)^ +h $$7{I-s-4^Kh4҈,mkPkeCV. 2@0<NѪ,%w*X*jhtC0T\AKhh>ŏu?6pɴqQm, Cmn๛<9F8O5X!JXotL2|H6^BxFm,`B$ 0  +Pm3m}+f2%> Iu) ._tΛ  +a&a!S*b=Tد|??4z"N"+u K]\49> ͺYpơF6-/je;~|6/0{IP2IgX~)x9}X#bֽM,n0^ $3rC K]JNg]VRmhF)g !ZtH7I\)Ug E3 Grҡt'𣝼Ï~CZU8=D.2|$OKSVWFN,:O~sm!E.f56밹@[J6R[l ldsks]Vu #}N<:CO~ a5:6k9^F2LUn3ŚSJ9*]2U*5NpQhN:hJ>I )j4R_jLJTqf_PqST柡RfXUPY@?%p+7->SN J!lϋaħYXR諙AA*)[x󼊃G(x$ЩW^hrêekTv2M ߤ?O&G8uگ>? xwմR/^* WaD}ceLT~PMܨq2G'+;:CYѹʌ)ԔJ+-fRMbڭdqM2ػJu(.b@i` \^k_ +j&K~ 7XSДɚė)9~&ƿuz1a%؄5\yTE +"62,ð2(ʸ (R &&qZOw16jfsKs$mMrNDmcӚœd#',}' wcK$n^ҤhyDnEqTT=Em+د팿$Lzr(,rex+BR9LɕJU#I skөXg3lX|Z5F:h[ETY&`:-0\;6ɊvV)e4zj*&\1c]Zfi,PNft-Pk6*B]BkhX s5]#lDcEP,I**Hw"ܣ4pwF5ܝ0]< +LP< ,`x~ ? +nsmk-[BN 9z7g4b +h7 "5 +f([ oy4;Kx+#ݡޗԷRfj +kASN"4m1A +Q?_cSX\A+wnC|͜tp$[p) |6D;,%NE{9K>yR>꿐櫍fmO-PoPkgI\;>}9l^żaCaMP#|3g3sN)FJ-[\Fõ8X!K]l\tx:r}^#,1,ncY-ԠO}tsi +/~هo5qj/XGywdM6PLs>۸;+bX<(A)ԅRBFw<&|/ϒM-c+벝uA;yEadb;Iގ_A~CF [亠ְ=\ nim;@NҔ! +G Y!Eaw#Ly{S[:lm,a1xW~Qx H^ +'JN^!>Cx/穋 ,g µ/7s`}(C79jpހ\m Y%e^zp]敛0ߟW^|`Hu+I~CbMn GRPw; |*.'@a  P f|hn;=]mm7XIW8/t yOy>=x v{~ݾ@ȁ}*4И[kaA__6gl>+z¹7IǤ&}#p;A腢7Z7 <*GݺJcߴ"q8z4av1},I!8N^e8' dN™G HGxUD*)Z8Y|1v^Ž}B'ԉfJyB3Ax"?Sy B+N9Gpt?Nj;Jas0v]8ҫxqK79,]5U3^}£O(Z<`-j3 78X#Une]$_9,~<ˮ֜Aѕbxn|C̣9p͎t ?.y8ze_f_V/u88G8%9QIOeH{0܇[ _ç3.|*XN3~8E8S8ا4Ofr؏ENbEJ!Lyw |T|@z[3̫*ud]R:˫CZq_]9sڛGNi׆ڙ{S4fs?PP&Ԅo_|;fRRFZe<*?W +ڻɤRLV-5_ԡDqf/kGK+YPd&KiX=.XA5ަ !ݟp|ğP2fK5S^^٦X[SQm*R(Hag4?E _-gLd^2gYtygsǗ2m)PR*MTi[]mȖA ׆PvFڤiYzG^k{W=u@&//SeHBm*Rgh]F(`S@[[51"mZ-k;t[&\/'Lc3z- \`!G|_"2Ҵ^&ͥl^A{|N x2$o˨z[nuZOr9^wrfֲ{ݧ{ؐ0a +~G|"mV*Y=vuw>(w{X]1qtuI-ozEM=GM5?™=tRztp;90Bi#O=&uwYFuv9%_rjsDM j|SUwAgFwйBKrM1s{ݞ 6S=uj뵫C-{;FoRCaWMKDfoe~cjz2#Z=0 0 +O/Wj˒@-ETٷE6M>|T78 TU忡JT[eVT˨r`8FݔӰ /tҪ8%;mF5 06X-;e  +*4М*B* $t]š* +HЇ2+lY4|Da0hIlUm1rU]FT~W* +G\Gָq?q8L@D5GЧUl'sU58ZfVmev!6XLbGmeGʞ*g2 G 9ny`D)>meJȖq6_ eژ(7Ѡ rN i]?$F2A#a}eTMϸǬsC^]h':Z$4󟑊hS Y۝Iz$ ?IMS80L-Mlf*IYK Ƈ]em ~;'\, 2RFf-Q,S,Sl J4-f@z4MA4fa s;DXk?9ť9I҆48-h$X( 1zYvlK|5IOͲRԑdyT_70 06쫀"  + 1zQڤ5Ԛ͘DMh%mڞ41xfpw5X?]( b=/g(ָ5RBbIΕ4e\54|b=C#KN#}.~Ə^.^ec!79hC&9}t %t66pp^O3H/ {s8J3vK1"G =*!'3Ydq15ۉs*]9=ȏ8~L0Sä98ǥ|ƏOOٓkpI$ uc7=^Y@SXs1Gx4y/?O^}?ctGþܥ9s"|@=@A`ÄC`#@,0a*́DPNg2N|ʯ cu2 8>?.4Xl̤95o`rO#Sq ?.2߽˔z9Ix[NQx a8?>prAWU$n 褣2"; nl<ҵwS"+)hl|I(i^-U o} +N▏r"\zl76`K;8.Q^MDb'ɒ@qmޯMi`t|?؏>{Vrl`צg5K6tp-ǃ5ڀJެ#k)5ɈV0ZXO@F58qSN%:ci$؞E.&cWh6=ɮ~M ~!n uc}Gj|v=bf{jP?M)C͚<,I^i䕥|5{iwZ0|/и5և٥jC9>T9*}`=Zcl +Km#57P;jƑ)jzC EgX814z4UQTnQ)`񐊌o + +nsQtwrb0TZ}^|y6҂Ҋ. -<ƷĦ2r#}U0EUhb)PNLcjij4CVfަT>Yͯ*|[V[)i&CSF\<\f\ʍVvEYq)ʌw#Tcfi2M)EZ$V%X~xˊ|wy%~]A`1ꡆ%|W?y.'KY e&ʑX'%+-)]&+%Jd[W(κEf󊱞T2QL[&0'qw)"cPʳ,p Qz~*55FV[m6%2h/PRzdNJۤȴ(!RR%Kq#e)'L19&E$**׮l+,F!ff)еT/ kssbL8u؃]`h!(% +(A:xh4b&:M1iL{$&iI864~f:g'g~X߉f L +!/`cTxpI[4ġnRܩJvi;S.O<%JT驗óD񞵲{v9$#cB 3 f-hX< +| +| +JKnbӚfA0L6fF/>k,Bi6ZcBOqio尷ɭjWI`H]> tf'/-53j13&k[$V21C(04aiv=vR\ֱ'"$xK`=~``8m_ :^7z?8}D* [."-E`L +c)8-&- qA +9эH"; -m`6t7߉Ǐq8}luc9ah'3ZuXxrXG1}yWysLpq ?~BM:4<7\jUdΘ2Xgڭ"*Xi/rgc}[vg->1vu I|f/UY4:ˤʬdUUnmWYvJ*+QI*ϐM9+c@v>O*~ށ|gBȦw Fu4gR/h*DŽ[]H _ZUOWp$*"ga +s(,Tn[9E. +VԤL4e)uR]ګd2N\6|!KQX)amLk.& Ps7Cߝ(IPNYTJm*u*D2V6^6;^*{+S~ogJ,eZ^9mȁ P0gP|w{Yqz(cUjeFlJe,J6읬$%2JRb+O_c{ߍȁz'K?QJl,mK|7h(!8B +wB.cZ: G)0΁,d9HUZ,SL2,H3vf2db=psuptr&h*HNubg,؎#4d0P[ױJ>]&Ɋ4poG脻8ɲı8s./,@`lt/4ޢsҷ仉aְץ-$jN7,#f4]$-2I+8 c=j[ee/zY.@ܮab^y5ٮ|VA3O:m/F^.\h ٓ̓E]N6!\?Җ&fͮ#Yo6c{ }׆H-19H^w\^/Qp"d\ +&L12DQ tN 95?"" W +pN\b^\l?F4 Q0L 0lݦ8@|de1*&>/6-]o3_ p +N/(?/1H;ł_cn\'wQ9WQ>oޤp^C^!?ee0ɶc>i=g~~ m>3~2z*uUc?K(POQ:DiE}AF Y؈݀Zw/j\V+4M؜1 .Xղ5'D;:᯸ -Qn6Ց!mbdc?`~2r>7Ji'K;ȐnYAl vr:N8wӸhӑ։(o"-CWx)>*|шfvI'SU/U >H#Gh(Z2\yb"cGa,L{lWƟ8wٱ8NNl'Kb'q͍$M[z]54l]مn݊ +mFWTL۠PQ !QJMCTn#!둿=XS]먍kvc 1M}L^&8Q#j53;LQC<8qӇ9;Vgs3kFt'<x!O<0wό mete>>*zzzOow tq,K\πIO~\JF1h^æJ[+ieYRٲr/U_[~++UqXɊUqFQ~Y̫qmw0&q-x?D.C + UVjܠ>sPsTiKz-= .jΫӺS bn}ZQEjV-myE x"rnȟO "MD}+۔;cSI){+ZRѯ?nLبSacI-aW7$# +p<.&d(C`gr!n,SiQiV٠xMP6t)ZV5kB- ++ާ&cjt}F^yչ>וW=x%7PI +dAg䄭U'tKSX]mE=^Ej .P]ޕ +`޵jn~_)'grzQCru{4r|.@A}7H"OD|jYPV +4.cJ ~#g߭ZgjzDN?'mߒјPey}]=0 u$@[+zA#H2b9qeɞHɖ%1&sb;Tد88JPIbFYbbϲtrޅ@׾vɃ0誒=i-5鑅1xUC10)LY( IrB'Y]yo3) u=X7IJVU ]*MdJ3i>29q2{q!iK(Ȟv{'!9u%7L13N@8DMA,m&"cyK ""sM$X@B=7)8 _?bXB?䦿uR<\[ |P<ŢۋG},QǃØ y }H ڰ6_=yzq῝>Y׀ޒE=.tG. ς}< +Q8qcU&nҗ')=qKs?4 g {_(yliPbWK6|>3[f3s33SL*bOI0u\&3ϼrnrhwQxK_f|{|\Op*m۲ԛ? w~SSpt]Kkz~ +\Ɠ@<8S)*yxf{Y[̘/2]#6ÎY&Ƨ0]x\"FF<Yd +Z`hi4p֯R +2|eWu h; sVO1Q>D{9E$FN`q8C?L^ԃxo#_ + U:v/$t +_ ^')w`,}pqN 2{'؁/,1n#[b @1~U+(8x7UTpA? Qkn$:DDiͲK9#3|~>ᕒ^,CŲT,er _,⋭d @nVBc;6b 2;L8o[i}3h(-`Y{zꭶPwKJTEYժSMJ4WyF 6{3Pk +~USՇj2Q|A4w~m#` ^7ϲؓ-SnRjUPţկImRJزSmZ +O(`R ߔvK^Ac?zK3`XZv'iT(Y[6]zmVsm"F !!1FcQ~'Ug\xA.U9_ o¿ہn~gmؔ?qOZ\jvYu*(jPVНPݡwI{\/ {np{ziwAyQ ח)T_`]^^A|1Ru?.^Y1ge?'{ fYƣQ:A{qiX%_MCu:yrr v#8*{hNNYBU:#s蛪 +;௪ |@Ay/zӌkAV@!>uMrk8dD\'GIh\hl>Y#N%F"ʢOL`: (h[ћσ>ƣ $y4<羫\F,G&[ܐ5^'KvtשX` +;fccc<{@b[ `?6 f;LA}𝝘G7KX;^9},`$C;va2`=Y&!w!".w=o"E~Vfl]k_}VMfND{>3Av1z9ax8H\>6Œ[;C?^TX)i_j:FTqrs7XYe5/=w-n1׹\ۡOe"3p\oEHWV>{w!/ֻlw1|DN1= șx(+!F)}|qnQ4.A@^@cXUt~/q!a})thֿ?drdWԻ/e%Qea5Et8~ICOi)6$O4}o-pzFR5qMs ]Gt%EtyT98C>NӴ^Cqqq m2qEO9د?>&;%^>-|,n r +{ +{r -sr8S/д:K|N,mF;!vþCUxT},тjBWbOvS-)ޓ'hS#Q#c#@CYGd YO;+>`9, f6_mffٰj!4Vs6C  +5YM +~mwR)K{f`r ^K.=!4s4}؝HELg*YͧuDm{T)ͥ6w621v-a=dMѰiæ B ½KcGUL:n djNcgRS)t}䬉cX#Gd#+vv-3a?.wc_7݉|UL`Uw~>2ޫ_M( _> e4:w$r1Ȟ a|$G#>(`JqW +_ӂN"Cح{H7Q7ĵgGBF㙌?z^NS[UN+j֨S%&K_|57Z~e-SQʲXI*-RۉGpF&K-A|܇=9`ky5CǢFM9=jpe(k*cO)UIGA xŝT眥sΕ +9QOgya,HcZ ܯRCKiW)O WXqw\1wVufE])T3K~"<+ex6ƳU^Ay?ۋ3QxQc< YIdmMb5ny Ek +)TQhRZc cbyr2QkrW5ml/ I7tB 世R*TgWWϫ'/Zdw;0CUxXUJV۲n|McG.6hz!:b ++ 9U';,WHE2Y#a s"o#>`.&3jBZ2ȥ$b!Pت@BMF!o%wF_OPeG8C{'`hd@3ƈ!v19Օtgob:R)ν(V*d*M8NTN!Ud l`h 2kS)Nb$g'~fw|r- 1b l$*U#(cx6n)8rpaP|M屾 4$WG!Rr2徻*gMF\ ;"<<1ω37;DB BdJ&$Y4k)|? {INYBsW4.Z\E-~EUyx(0t+:ًbh/NB1WQ^0ȣÐ b8GwpgOzyzE/vb/Uyn6{w޽L6 I #< ABx+dhA+Dbk}RihNC+eLZq`ljm؇SlU-:ߗv2||C]^m&d4ë/j&`G7K- fM<o &}\\q-~tGptsЈtNfJ2@ua~2Sp̑9'ynk'"g-=DͅK~6~̍.d!,`򱀡rzigc.쓈gL3}s0;k맼,%Ι1"g'xZJL#;w/(SPߙ%>QL(V:&O)+L#)ԏ&L3W#Y&9/u"*",2u%qJY+֖p?>0\A _F1_Dn]xIֳ7()ޓ~N Q~Hٔ{.ps^L ~H%N3Ga9v?4 +~xaq@:\wfCnLnӳw(o~I^n3Sm` x$XJ̧(f$$NdHFz(~+ᛇܘj$( +zׂAQj"UVUQ!VE j+hQ60F$3*[Vɲr_{_jQ7¿ Y\S x6TSP>R>j)g@\YU*m ڔD ;t%Ŋ[kd[)ޣh[(|[O %ppCdilks-O-R1[nQ2 Q)۞=]Q{,z[W*?vIhQ8O7\ A + 2_i\R2aIDc'\ىbN5hPiSRЙrOe&Ġ̛@;qK;yMAKs@s,H'&J&rNTv2XVM*fd + +<5Fen)Dj&rN.>$AQ˱? NF1Yx?T<)Rn@I7$ǵ6"ҶBٔټʲϢrma!Gr@]0|Z + xA14:Wd%&TH `Cf²*UJ + PZ``b+Dj%'qw?WyX~[EJ)ZbJQRed0EiQj,5RHV(ioړ4$C֐#~:u\sϩ뺯~y}VAy4Y)x0EN%)Q"(F+q "CDjkbЪ50(ic5Na*:I5cbUɠ[\C^QLdT&j"Dl(AF|:[^B:Cn]̚NRt4tZ Yh = +(3"RNJ9Qƅ2xaj0 5 Ԅ!nYf9 + 3T{4tMJ'4JZ$0Eg(¿X 'Sxa$b)25?t#0E6 Hcˆ!Q>s}@14K<Y|wW0RKx)RhcxX 'l -L $5us:'stf`Cnc`&icb*d|W5f/qBcG4/hkf9x؀=xcC ;}\ؖ㌰feSHczMO^sbcfˁl/glCިȉ7 +/,چ5GLSbH4Uv5C|<.lk$1FG6U4#x 1v^ ɍ!" En>bȯ;>Km6+ϓ-!6䑄?퇖 x$6Π>O!'(#hqV@>>J!4K!Žl\7V#ƣ>B^V`"0 لR4eدdE"A!&/IEQWJ8Ƥ[#i83GcyCYdH5 tx'!&p{9jkAwq[Yʹɍb&yFc!e@9hdu4&x;-sD"#O珐 Rғd'+(*MԚ3]wogϞ3fXpReW*5k׭wrٰq-[yxzy  + ݵ;<"={cb|_;~I)gϥ^Hs)7⒲׫jjmjnmku[߹=~2^yG>(QYT:խ zTnxs~1/W;jj#u6l>P#D0" ^DQ3Q7a!QjH"9C-9O=”,Jl)RcjjMtPw==jP?Zz4KM_Fm&4"b/"BB""@|8 ArD)X1IFFnE8O` +\-Pgx7Ξn%$ \7o gol GO$>r.5BwKeiJ"_#O$U P +c| +_@񫡡vxt#˗1 w8sXI7Wb +h3֣uo{T#V鶢캜])9I' 1c8q0aC:!LcCƍo9^{}ϴ_- , ֞slI2pքipؼe} g3F*+Au9١-]SNH Pmkiv]n7Ǯ|S8"(* VP0Y:bL&8\6Rn{kVq$+dPoNl% 1(->4}gmx`rHSInX*ylF+;˺}ywl-߃Q=Gvw M䴇%hLL(S2k&Ӊ}ʵ:J:86ӝjN3Mwɹդ3Ie7]PE4LRDR\P6ZZYY4s}f^ss3e!vMƄテnF%n q;/go3fzR8~Hv6Sg==c^bi|mB~L!QǤGбٌ d:+uVx{uK屢Gu`~0le.؃썟_1|_^Dcs>ٖ}dw6۟ և8pڌdGC O/>00Y>z/ĸ|n5ڦ7-ZtoXS!_?d K/p+wry:__ +"m 9PZcI119~X@a ;.%-q$e]t2y2Wۖ K%Òaɰd$Cb(> C c?zW > &hxAx; z=PFoNna 0G4؋@a]}䗆_]O+d% y!mPCŞvFozQ]1#^>k8AU^"4pImK(]EtM rYx6(At`HoOj;WQS.=bEP9:&ؔ\u#P”>mh߻d\;)gct &EWX]^IMeTUI*f W 1 ZM*/zmflɧg=qTퟓ׆+'drR0ZQmAe״  495l{`fikT:6R.?/( eJj-EN"AU @ UM>1ypZ F3sʫBjO`vl' +) k!]%5Q +zy@CD_=J@DzkFCLJͶݜ8n~ig6w]58̇q0uAN\!tx*j~XeyܿvRcЃۺ(ZU/pt^Dwl12DI"ވtL&6K۠ 勎}G_:C1kiP 6WtΜhJ #ј ^D$ntXz4>F۠tyΕnP?e⵩N)lS]97 WDԀg@4 4*w'zO& [VA)U4J{ÊIHLpR q;#[ZBMFB/Q~jK%Òa7d!,ĐwB>HΚAӜ8BL{>@w=ꢤ-<9[(-2BYkUHyAw \2C@P =cRoY .`̼ǧ'Drň$gš<kumS;:j;Hj +A6CB a aIHB YزH aR78w7^ϹxsәB}+ף4IR"F/#)zK1l?@mAZ3u8~ct5 5.H0{2̜O\bRQ*-2r:v@'G{CjA u-bhp9]X] zUN*%T : Zs,57E"hT(5kn48t.Ḡkm^n r,>AJ_L2|S]nQ9OR%C%R#+hD .68+?A.VJzJZ4_aI0?t m |PC t9~w6J(j((]5OpsL<Qcf2$&5f[;,92x? O؅uZ}}IQ+L3L=ue[Ӿ+ݖ-DMlk w)Tc1LIҪXĈ2 F MAd3GOqYz e4PjVqJV3AKWۓݱJJ6!1Fȸ86#r hy}d?^;qc#~=0®4^$YQm!q"ԁ1bJhŜ{ǶMv/O>򺠽HBy Ź +Z/AIǴ#[Mh39Hj-h +Pu94M͇MO:~)7P &-$-̰LeReTKuSt\D7,/O ?1uh،wY'4>>Drn$0EQ1,X\AkNJLc `:!Ŗ?[<3b|Z#m_8q浇OcLh΃PmGN3M%E\IL +Dg d뗀%,Zfxh6 +\~恇k+o\yld8$Agu{/XŚ2_`4d(8 ~{C!tbxA/8@YpQO`"~B[a"ec|;p ',`m'v8$n+x,$ R`!oT*7Cqk{Au3Tξ(%?Pceޠ3p +( r4F$DK J^]k+zڕh```?530mW17j=@rDXg!796;~=+5E+(O +FE$D :^؅թڰ hB޺^]w-l5("eA7WM&HLQD˾(`USȂޘjMwLjԺ&|Mo iAN+CFESRe윚4v]oR+UOh#ʺUxe2MiFpn + =Yu?7:J:8niMm9sj2-w;t4R@3RPq%De%TQIPT@P @;ML5M7m̙ry7.ekrEfR%~b(-TV1s纳묺~%AinWd@ %Ј4x@!/ЅuFOh5SEdiyT18ƞ"R߯"5ڥF$Kenӻ_>bC JĠE ]zyљ>!Я)5$PWQ,01Xp*΋ZJPe#柾v9zcb3:RWZ"4,.vzMۤ,d p^@;y-nו>8f1Hw.Ġ ^0&nO2:M/ikB^)579RYRβf+HJf14X C'b;5e>ze>$ŗ j bsSVm*M2;#qZP] DAԈ1wCM#'2KrJnVqx<Sdh,V2tdo mrmxo z6sd^*$UujM9mu jK,^, +NJF)o5_jЈ~~NQ~#KH8459QfZ\bㅹ'yػ%GQзucG_L<Ṱ}j7 +yp!؏ a!ٓ7Y1Hq'_Rp'&b^'`QßOD)%~?7Ӌ3<k|<ෝAާ!7bR8:r#)$=x)VXT9={+pynnsiޯ%EBعRwS6.<`q ?c"!/@% JBx C@RnfL +f `غ Wf!ނ(mCC8d<yB(>4s{BŏdNwS]V l&|;[`2]ap`m? H nBA6R@[t)`"@_? +΃3+X![A>*2oK)q̔r{ԻiuŷS䬛I-e7mф.޵xs܀p )_ iXӇ*RUΩЮZZETEAnp#@Br@A BHHCE(*2 UWUWu[@Uj!E8共A 1|]hJK5;dNt/ǟ>Wi@[.P{7b%AⓁ ̂G{E\~8AD59#ɆVDwޚj/(] -%Pj^A IByKbP f|^h5rZZy6/kEWl=Ӡ5 A}wPFA}܁WҴ]nq8F%+KDd0/\VՃZ{b{)4(_4@ߴA?'PƘ/S%Y‚LjU*bOڟ]ͬUw7p k&Cr[j4`nj~!Ⱦ] %ZCM3H׹!:]Of+{rNP\xb]ڜӝ*O{cB5jG >#QaZb29ԫ Һ^ +SUXetVGNm:1͈(6C]Ci|c 5(Y k_O?'פDQ[(uW)2Va֗[EҶƂF?&ıƦSƱ9y7 +3GTܿrCv:3\L8ۊ7W씔u/i/ ϕi2 L349>=b հۿdáMdIBHޟYЀ= PJHDE&T<@st,c^ϧ>{} +6Ž%5BVC\zvCs ߛ}q@!9 1p0N|}\}} ~ n6Yh]לq)b oK4nSP-HOu `8Ǡ~' +DuY>Ν%e4X5 /ȃm2 ? ,;ˣ!jE$į<V 0(\sJPDYw{A5qHk?rV,nRB]n('NGᦾ"y3E|}̄'9?.x=LKu>Û~7nMq<`^uAc@L(pKOr sEUfT0]*1T5AyED3婙cIK&";H +AҤ (Wne+f z/xJ=+RV0.~諂1\ob up}!B#ed(,3 oik n?IB$AƘ(Vq\d3 +zy$cyuqm\CdW@ Npcވ2f9}RxMz gVu0O`@ְ'{ɕsCM sA}ڎ6.Z"޵Ŀd[D*Ր'u$p,YQ_ug7vaWV57To_0;WX;zNxRTVY6)kǫdcMRSn\.ZVk%7EM ld4"EM`>֘zaJL) ?6RX\:!5 7{mUauw˭fo&b!q?Š? X-&- 5cL|ҎI]R5.!+,*й&{j%wʜvmۮ*(J2қ>1C`ґ<ȜASH!'ɒ>.SbmF*uv á t9zlK:qŰʛ1WAbmE`B oPOҒenqR^R⪧l0k%!'*)0W]Q{ ;r, /F75u15B ##1&`ЀZ= ]OغC'≍JNy1{CrZZKʖf)U(_`.EḜN3&b j`8C [;9{k~nqF\)VPtKRAIdaRhq׻D~X7MF 5A4{mE;dkG>ٳJ=6z^CҲZFgYdtK]Rq/l& l2:w/x׻UO?}b<*tl,>s9 +]wKn/6XlcZG3 UQVm)L6o`9b0l }Ҿ%OY1yރ#z'c@6W_*nvVj]e7 ,&-ۤ@\l}z +_Ps=c8Zڊ[:l!3 cf3 3fdq `-6!Rڬ"icl곿>y>SkGY ydӀG# + \Nɚi2Q#+wˮuRrp;*2VeMeMHݪ ]_@&%||cϨuCnW.,yO0ȿn +' n[j\دRSܢӮZ 4dkCNm۫Pgo|oP\] +G،!,-i3@IBdޘT|w|LәP):*JάzMP"7e64}3bu\~ẘpvTѲ78u0762ccS$'d'R[_Ӣ@:MPoԄzwxB_upEkg؛*`{y*OqD[.2.~3ƒᘗ\HnHcvQ sT~1ݼtebvՕNo)d?cD:d!\S=s,4#ח8+`~S ,"z2P +5U%ߖnnչ +FkTpR? , PǹePHtSA In> wGW{Un\\*]T/Q]+4`nɦ88g#4p?Jx6p}oX+oX{u+l]*VcuPşWiNppe,ztA{ÀA4xn+@ 1qwy:xQ6hB>Ȃ5Z2ء{Æk`f}f8nwϝ0{D>? 0;` i@qp1n*Eǵ4`tXs) Gޅ7X +n9pd ^zgo V@b@jm!|)f +'!c1=:j LVB:ՇDWzb"/vW(UgbK0K'Aw]!G1A0f9xՂԀ`-c+A|j$| AB6,/9O>a*blH%iRM yOldL3'^cGs0#}QB Αst$Y};@H e b t_J KM}(gLҮޒoq&H?rxcø'~Aa$r!4# D+ W փ+694Hs,(T&?BK߄\㽦^.$@>~/ v`LKPBY "CK!zn +2+f 99/fbeI~s""U$W)Ւ~ z({(o Kj ,.}`)$"'Zȴݠ0l9dPda$DLZXdp$ 7FÕ_HY٭ޔzӄ[B4D" K iHGvVfP|7c!9}`b1Q`) W< -V))uyVU3M@Ⱦܓvҗ\E,D6}K@lLdZlBPbI'\agDRGe}|yJwxV}V~N<9:vZXMnϫveVџ$-(AW䇗C6Ґo JlwADzŁ4쨂M;bS[yY܆:5к⊐{l5'X4dg)MVl#|隓чJow8b2yn(7+zGʫ/_eהJ Ess9Wr8) 4$•C *(1*mvt4i1~eщ RE0]U:{kN8~. ED@vwA d [ H (l"PZJbyQpBw3s3W`.>n(WڜsCܔ/f_Q5f9S̆܇5@ڐo&z?hv7\wlnQ3.fFO +'dU27Xkm 3ﶴ6wPR7*`O6V*Ei VhhQnnA[wL8)})C^[XVYU9aC1$TdRz]HK9i]NSHhCPi85AN] y>?P=q)OxwL̯\e+:au)NmQ۩ԻʰJyRkP {ա=Cv|3tYkZvxqg`ה<2Jq#r8%]@(m&UW[Ưf*m EBڐ6-M12@2Rt-փb3ܲaWӅqÁ.vu$絶ٌznac%ZiCU VP#F_{N(jGb*(6T:A`:,6~0hgS3cCaiw"2ٚUUՌKUKoc׷f5ńF$Q.Mg̺FemCƒ|Z7ލ]v6irbаhP~)ݝBatfVJV2'֔)^nbqRS8iHrUL_ XFjv@df?ZnYu9#3n!ҡkYd,ܝS{QK2NKU'%ċpZ{Ԁgy /nW{;ߘ +jyˤ+ +Js2n{*n͏%jl +GvM:*P)*t>h1y˭/ =w98aUŤQ&.S3F+㇨|&;hh<0]rgZ(݅z] },7}䩱S>gԻlѾu?}QctbK£<Ň%Q3TZLuE *pFzT1MicuU>(v<ێL4QW=g~y%wW~@o I i )I/gE==~+ 7E {ϒqO~&);0вC\ y<\خ2lN䃝ѵNfup.DZ gC˙ 1˔Kao듃RK}_Ӽ_^0@BDV07ܷAf[5Ys8Tzh6{51m55y53~5;f5/rVZ'74aߧOHHc2:{kl *ҧI!x +?p :9h.Plw?x]X/Nc~u:ztX`iR/ RI`M!h8D@ H;YPp(V@A 8l3npnU jtFRz40PеHXpw@5}{ zBdrîp uyh4s1Nw0>p 6aJAO- קM`-,w/8atPm bhFg!}k[(hl<e +3R+P` &UG#j&?؊.` \vv km1OC%$랂4pECP9ЕT}UHB߉ MH;m . !?!;4dAz#r]/$>? + k¿y4t%ER // _ 5 &Nn\k-(p!D Ͳ,=ΐܿ.Ө&4XeZm+*62A-@FB! !/!*(P@ @AQK8~<`J|!b}#Cdg7asgNGLF̅p8`w,ʮؿ +X^Y7tV.`=8$!Ix$,`ʃ?ֆG7GuDFcM]z?8z=4,۾h]}+{nȟ?S@d [.:mLckt;f.'y qa41q()/E|o8{a#$lvK urػG]A| ~ @n`{~.@1'&ǽT&'0ݖ<2~:2F4I J }:D! gHoBZ3'q8NQǛ8w1Rqot;Mօ7Gޕԣyc&Wb%&g`l^ |O@0,g/z1Nj1OLFHv*a4[,Q;@_hkT]V++Jg` =>:6:i^z]o߭sNNc~U#mBâbmT9 i (jK L0aPjM,l8@F MR!5X/:0r)rP}B?j8_{{fuWbrsqTc4 )W%V5i*)6S$YdmSO,&l<{ q`w9rȬ*~՟5X5nm45T] +(f%PVSlfi(i:1BN]cNt>AyOHTx7C#lt2~\:ssguGG6TuY@2L2ONʖ]9k6dJ~Hxā -O}U[^\sC۾5wNlk9w-!"cqD^.YFaSK|bW-(b|_ /hF(rh0q9or|4vo6-gygw^ +PЂ\dj]R&%SDW%J<"W\Y lUWJCJyE# ]/AE[6,ذhpMc^+=u}0+:֎%Ht& o󂛴\х +sBp.J.Ea.FgUalg]qtgC t[❷_Sߥʍ5pt/~'=' и6Qy숷ձC{b_'PWi>,+ӕ54e}U(kSn_)»J~C 6 ^;Bt<'Li^iљ)5ö忏񖍳1ITXN,{dǾgƏq"[xo$O<凍CBByMyOh{OSkV.SWy|[VBfh.U9ALUQ]U:=[s1w!2w5:l>-Zwj 6DWޮMvM5N`N-ln[cPmFV&\vAhyDgj(8}C~Ax'˚Ds&L8:o VT`â|/¶BxY$!p5 VtבaMdؒa͡c-A8hrCV;C-|}ЩAjX V_>nJYB-"* o]5XAn僂QUv:p ji A(̴DX˅B bDq0Ln^`|lH6sh+K.1wFX8b[P=Ni EJ(K`ɂ6 zl"_xK!FN-=ƛ[fe6ld#vXxz%U7`[kB !3Af92 ]bR+!85 >`쇄 )?ČL&B'?EِHnlCB"YfA鹛!*wBAW{ s#;A`u LLDӦ#f) 8$;=B2o䄙#n @\a7R?K!HN'Yfot@$}636MUذ^|]H!s6D v#?y<t }^Hd0RoDU*nEx?f61S|c1N^?ԁ]M7uVx(PA^Ȫ`0~@x1n0>%NpFIqc<%}[tc*N?7$ӆx.6(p2@2|JlQ(t"ߥՔϒY)*~s4jGn2QWV2nD͘?Ƚ˚ar !&lb(߾ +b +-J拲|3QәSi' sKiÜCά7 }yW{qѭI~{4GZh"kuPAds3~ߕ ~ݗfd1a^HoU\YT$W}SVw--d?M͢֊ ›O* +{JDăi@LnBٛ{o ٛ[ qTupStzN4 '*(QQDE, 0 Mj HI!@ $BQt82A {r~|Ӆ~㹔\f-V!dtъ2dVRcNKLИ0ې0.MgW%eT˒I@6%H<6Fcu9[Om>h{bRMJOa22nCr=*$J)? BkF=YB]X]ʐ߫աl[,u~m~BV3S (޼+t,.S!bפ*R%)-BZW6/]G%JQ{#;Pe5ZlNfdOO:^/ ,\&bPf5W.c +YFّgIeͥ&+Wv?EP{HZ]oOwyk%:ܒ{wWDŽ)jQT͖y¬2A^e_sCb61#f27)j Qt\%?G_NmX8uv~wd-^ʄؚdJiACe +E<DɮZ ^87.fd?a^7tLjW!֣|4~Ds7V:OGl  wu\RWw%B2Rs8\_(`E4|jn,SEOɹd<] aIOiʇfk^޷Кk f> KMqхIIt:"*ɢKr(BRAS^|Aw~\,'1>UH[ C!}1U}6aabQ!/=5m1QF->=-!WeW b*¨ȊQ媧YvL|"@:dmC.6wnW|0q~g=e˗xWXTJ5fjRK&+IX!mJ;ۂ&yvXy"@C6ʷ.no}3vG4FvtO:[U#HC|r#CY}q1)=DRWjrl'ّ +sqeV|l}/g􄟬 9S?xHZ$] \u] n~ Y^ "/R_?"-ǩL Mѽ^eGuL敍eCբ˧f,7-OXv5^;v2x)"`l̰^δ\ں_Xs$99}wv2FpK0Ki@A' *ʨAʿ%_4diCm`gp \"Gh݀u@r *O;@{贰Ä ;kW5ކPPxTV @W) U`ǵbs/0ݮfH}NϨ-@5T> +LE;jB!Brr`+ +*p8'᜶m!#xQ¶[ avZk68 oNBns>{̠ӿ,.B)2_!M QM95npLNk ߁s<π)1f} @ +tAAhVn˟#DX -lVrN؞؂y83s ̢h[9**ATT@@VL2Ȃ$$d2dT[T.WVQGO-A +Nܿ{^BCwE[h@ ^@KVCUpĚ>Nbf&b,;l-P~.d4D8\mn Avc=H6S"OHf_ ҅ ^Bw þ? 3Ƅaܾ!o֐n_B.qw Ipa G,nW!{rn/p Ӹ(v$ڈxj2f%5"f !7@C\oD ! H;,vAs O45@;6G=s`r1 F4)/ f3}Շ2%B986Zs 6ۂc(|@2%dl76`[:̨ͮt5AH7zc>[(7N~8?~H{@se%c$mA}>h@Uú>#|d1 r#ƹ1Xը1zS-n%-!.ALiV0OhuLhFJV8~\UvNS"=Iҷ 40VXiM-B1U\m&Z= }ٽNOlitP\:F ' 2fcWWK*EImisu9^]wEbHe+,s 9J]okv}^^Yzqj-O%53j lQIV@[U7ZNQ+54_60 Y̥~瓛F;~Em:L +?]Hh>#ՖK% +nINd7Hs:Rߪ_=zyv*#k0=#]j}9, D|X|js|{M \}vVbXK-(PY%qK5¬tUa"PJoъ.:qAJlx#r8dX@yPy4رtgX7$!EPA*CBʒ! 1aAQ\: ԋ"(Vl>G +8ޯ͇~/ Ql{qp&w]"6AXyT*+qܴ-EY{sK֭),T۸MiV=,a(/Et]_wo4 +ϠϤjy =~f/ٞn7ɃL8fmjaUAfޡ-kϨ[)J׸aeť++T }= slLn +jL3dÔ~syÁqgzKg EUmͱ]gd5-Nέ6}MӏIٝX} ȩ1 kΉ?Rpt]F)TL!_kF^Dr1eK?ex-U[%Ғm–4EnSVB֙Դ Nm[W_VY8oE]C~T|YC_YUk.`'y8 ȵ{Lr oqsވ`]n)vJѪ܄Rb۶+Z2eggIgZ۳}֗MUӚd]PĤ|"y|N;\x$?= U[j?~m_yqSĞELwQ{kbdWYp*A뺐WGR& +.ņ~SG#꓎N:ie@<1&'Ъa;l|wyKK#/JɅJ^Nw:b׾#}TD,%T2PCȍTrC'w ȱm˟3=3+zd;̵Űb3䃹Dۗws9UC va-gO<]WIB:Hs襓R1jW:j(uch|N,J҈4JG&%Ji[}9eZ۳] ~woFo\n$Bj>)DvYP72\&ǽψPJǣ_ ly_#[uS]ep Bk KD뵇.]u47R{ bL‚6p4L"@=cO op;[Qw!ʑg"i)I&X)1Gom P\Xv;g< I'^/!~11Q^ JK tA@GP-f"-*9R ImBtaq6䧼!kbH-Add0AoDA.a |$;BbGCHvG2}^f5ʹHK[|G/dr8mG#bA@E 7 o +H J@zhQ@#X᪳z:i +wߝ=?649IYyibiBI !O}GC}M +='D~c;@k1{ G] @(:ˋ924xMKS|(~䶣=#+^~F=- +8pX +KsMPl<վe@T89%s4*6!R%d~,K+ Ohm+Iz?L}iw +PE5X=T4;8ϥ@2 tTÛ";FPQWܔFr/Ci"2nHϙ)K Y<[rYb[k4 NQ2(Fya z`l̆s8k +uZOU%)Hx56d|Qzd4%^l딃ቪ8+A5X0.m@漙.6fZ۷O- 7zkc۷Z/ 4ˈ*ZnB<;SK%KژZ&M}Q~j4'F=IըBXs٫l@w6cծ64>lxòw#k~(F֑rQN͈3ScY)I\]B(6HEƵ(q +,R7"Cpvj zĜ3 aX͕ PyݎWZ|}[]ֆJ +p`ȓ2s,5+>#NFJIhxE.ISє!<Ȓ&hI .@2hr9ykt{@Ǯ]-\-[jj {J+i83E!ɅPm^43&W.@%pAF#f 0s#J'akvol@3oWgCwv}g=?}ǓM]f}5hJ-C%QteQ^D<14LC7Ȼ"Q$,w3 [=-@h| ӹqa 4п֮o:7y|`LXzxђ{Ʈ*&GY'w6%㪜&K-vH?Bb/ '4rN$ɮ/̺f<_쾪_]L3Cxa_Ql^ܾdUoMw Wې);.e~BӽG tMVMwIg>MlgYS]Efɜқ 50ye̼.JlEi?d_ + [{Q~ -e0˒=DYC˄f-4PKԻ@^6jH ?Cx\rH% :(='q +>L +<.@%R="GXC̈́.zt"'h.P<՞Pl+?H i xg!P~ e,BOS&`"tTK +AĦCɶ.x[`qA +}|?ȏAv pHD@r;Q?=%~3!y/F̨Qo$mɇthCad3PcPpE~u*aXςnk;CK8T#>1P4A~=~F֙0)M&JG9oӜT Q@H"C! F٠l=2TR|Q6a0순퉙=?98>S]H~!eTіV$mDr-b: +)/< q@@:JyiET!_@=";)4aDFi7Xd d,[{zY[OY.뤞c \*alâg[2{ +teVKFաkVnirhoiˮCZ@"h.(hȧ/=oб>QLl8LnNvchC.EuqDJΓje]E;ew ++o4jm5`l1\̻7w1Ts 3%ȴjKTުzF]8c>nt[s`jj "}ӹjmņuֲ+j2~c]u,X@EPB! i@$B  Q"8eWP"Ȍw{pHgtR{Cn +}-շ<[ȭAXn(ޔx$#~ݕ l־.8E.q i1xR[DH ǧ/LAUvpjmVzsh?u;Dz¬g+G@]"ք#p +rp([mX3ǣ:Eߖ4t,иe}#5~P$$_m hëhFF5⎆*B+oB*+e$+D^e6( -X3}.܍P~PUU*ϔ[pFZ:߾GCHy6'J|rMW꘥CIB20ccXa2y|TNO#OmMU}7Vw`(fՓͱkOti'x֥V%e+%Rzal5 -ʢǹ9 +i#K@ f^lη4ý݅x@wd`vwzCjהR+PI}RsIE܄*Vv|'CKIko|L]°RyVj@VFfPzz],)g%_$ţ8#~BڿI%%Q 0*cxd OL`k7v5͎[;=4]&Pٔr) +BbV^ +)M& -'e25i;/R:HޱbWqY_HqGn7k-,a^ h1þۚwQV. ufzKD)( 2Zl^322;\y\}_aEPy_GBv +}U]݁augݦ7_˒yLj>ALV&Ɨ%ԈbWb6F$Y.D} "mP$=x҃&2;C`dx;wAˀiMx-DV3GI#)>6U}?*3*fV*4egQW j9QR|A zPjtaMz`dTonGNW:)etN#qdbhDo+du^5 CڠD ߠcWta҅ߧmm\xql}dR4Hʲ9rb;;͛%#u|;d@λdb璟o'@ڠTK.CxC=6.|1C=o{r$|,Ěsw&FYhzu;qsDMtqy<=y!LǥjtcݯTOCc#P<1[KYyǩΰCB?L܏jVךZ;!,t q j@fx +ګ㇎yܐ3"qD^?33N(AzG(Ƚr m (UAXQ@% EDPhWW!h,f(F%k(vw_v~s3g1fcI2gl*̃PcFK[a+?|cAk3顨NUsPTCJ S*649bx3#"m:.\/ql>3DXkF.Mgu_$PTJ"ڔF4lCFs>B~X ڮPh;#^):ԵC VYa%Z,Хo#Dߌ''@0(o%HlB + m,haG% +|N`8 a6c6x +3͠b"EE/Pej-}kc:fp/: DLC!B 3@dV›-[cvl+a ֿ1bxg 6y63~  |& х$DcMQn~%xـw68m9iv |xDo~=3דRO} FKqBCDCfYl x=Ds ^g+.ݺ"ۧID.8q&y!vCƀʃ <-$") +4]n +[(;@ΐv"$!9Y|kJ#~od&W^F"aDXԇG2?ޣJxWrtIKud Ë@d )2X ~J).z;q/b:G~<ӡcKae7XJ^*އމFH ~p|U3{:4wf8D6 +#?xj]ղ2)~K |мWUۢ͹}{Gy7+FR>߈y +aC X8FD\K #O#͆ϡW e uJFo' +vOg<,^xwIM?5XI-E|:*R^=o#/&m2X4=@I ن 5 ,eNtT} ym8^)4+]sr철2}^~=u jJkNѥ '~YTDTf*74NG(2bliXBs۷,UdkM [7J9{"VIPAQa82#-mIkL989}Ts9様e`&XDtPtO:_ha3}և.Xgt#hFjsZrb@i^27}'G3[u(.=?D޴ i7Ui:3ʺ!3r $w/"}̲Άq\x;7 omX_Q9_N=WWuSVp(N?I;gg==gZ3-9VU./+^!Aޖ=f{^gS[r$6Mڜ2Ҧ6OpC29{1rb)z3eՎF=DjSMю}I>jZge wWJA[1[U + +NͿɵE㪺)y}DD]!!Jb15`B=oEʂp-л·8Ө{jC{jr:֬XU!V:V1tguǓ_T֬)},,IlDAٷ&l @@ADEAEkEA*EQQǮm Sc͌85=ʙ;U/0sA($Ɛ=8NUk:Y6(4iԈ U&e1V- .i\dVE`af]hnF8;r䉴̌gg#AoB@=dIY w*ëfUiWG{VU j/Tl,TULJEyeLԬQGR% OW@F>`)'{ LxUςT.UO4Woj]j٥6Ң^ҲiiKCq &/)ý=yә깮|&XҚ; q9u"xIҪऒ]'wρPT^Is)<@ɀL0A]V[kSFw"_ϰJ%ƶ))!5XMRU B*;c+1FDW [E g+ +=$eX.xROIFp* 7՚9{ITWIaG5q 7s' +|cv׷D] ׍׽迻}b3Ka + TLI-9h ւa#zj̀vYp7hrY=)݉N]wdxmn;Z&k ] +~ } kEb47` Uhw,Y#;a/=ɠ&1%;ۛƋ~3D^# |WE"(W>_(Awmy2?UL6 ݯtthWuP>!猪=sFwvݎIuzS4\vyz^C݅=\sRj1nyɿ P?JA `z =뱭?j&M $< +3ipqۃZOHEvj̉?~cb}'gN"c˽(80 p +ɿAI,Ȁ'ʐ}ʜqJK;E^X牛|=k)y}Kދ-x3g_yOьdZm=$qi +^)CB *6;hKp] P)v*TYWd) + \7rg gFN1reƈ3w#λ 9ow"@2ÁY6|@0?2>pYsU9_50 6o~ʝ)ڎ:KV}]k]S„[=Oss.3@fEQ?p +~J~_9Lׯ.JE/Ӣa +kܯf)f(؎4M ;xCk+>$~ڂe |RfI~"Oԥ&MhE#F(bb1F`+o*XTCW]+%2d*$@Qx/ .N f4sF7E 17 ])R>)}0:\ǙZXd%6W% $F9=7A%$=o6.9L97 p349m5её.t6 +KWP +R,LIQXL,ED2h3:r(t"uUBgetPED5K@[&TѺI ۈhu&jxG e;-ݸJ"TFn +tާ4!Zh_dЮvmA'{O|"oN<8? (nADAJ &KX"a &@`ؑMAP `B둪OiťUQq[>{s_=+ a&8NZݤ o`th%]mԖU@2JPQc4 u x=ޚg +)`oˑ {\wЂ ҁ. RYh +Cm4vL>l@f;O7t ٬&#_C@w6hf1tA$\?i%r 2N)[~_>2/Y3cM=w?s8OB 7a&Z@lF0DwX1N]U$-k;M\7Mp#r-#\.x9!|~Ufp ^!8FoJTE)e/C o#=n[d;ӭ*НnC?x^<@tzQ<}^3v\x\:TH(UC;}nkgEgDrF񺢮;#;cf:^{@4A2۱KJͨWn=^Sr̋X]q$]mj.y@%=uVn~[h@KyAS/WfFsxg 5A>EҖ> +}{Sc5k)hdP~C92׾LBjWjOٖnN5&KG53jꤗ5)Xہ^'J]~u4LH)[f{ dJ&3ՌBaEނ$trGv-ħ9 oԦWz*d\fy:|*2Z A.E]DMW.DSuпͫ. N,;RorXbݫr.gSsue̪ZNEF+,}@v8P!'EiOPM M/ATը&[˻VgMJIh.eݨǹBch_%~۾W߬liTg !Dd'@"@HH ,Mʦ .ԽnjkQTE\R +2mZhd}<Μ;χ9Ͻ&:m?c,G V} `ϚŻ>Q0o9e1rbsdxsTsrQ1.xm +.QP[PuwĬŠG#[%8l<涶${eQe_..bb ʬ5 3 JOD7ץE(QbȬBK:77 p}@C)sOQ{k|'ܭZUV&OYQ>sɑ /[20zEzVeZuRqIxbquDBqCD|q;9{UIŨH.FXH/n{"'g= + ޓhcv`y{}"3zo~3Im%V,VTU4uj]E2bX[Aq(wR Η$58rdHMɅ+?ևJe Q /&̻69|sz}Geή%SK]WyJ$ kiEK"j?4uM%5d$ߞK[Z a+o0|-cg_7ͺ˟u-Yv5.|DŽ+Kc[ָZ>lo.4WCġ-^6~>X;$=p + "fu7[Av+5ݟqGNMjK4Ohi6Gk]dٺ>uksHkUv!"5޵Bd*JIMeL{2:x0R:DcMESZl3}^~9?DBc-bb`gm&cW?%Rr' +IwK2 !b:;0Pvz29= U&~Nm&+5;~Btx {ޔ=Nl1JjjiKyLc&mi.gN*3xud_#$@on1 74)h +hP+r tsR(LPJq0b284 +p>D%D8KF7"rJdXBTCg*#}?QFTrqh$\t ߞ/!9dK4`$~Ɇ(c9wpQ(1Aa9q8C\2A+xLoz#w俄h<N0ȝ`BI"b` +- (4€%跎S8<PTCM(I@n>Qِ1Wc`; + +U4j!äLTkXccp:  n2#(CI)QnDkD8P%y!A~-%E^;Ao) w0‰(4@aT3Ar3 o98`58d5,?6፼zP~z@lJ~KR~_\L#%x&G' +~ a0ZNS5rƻҘ@/7X-uiżMV4/{/BK&SU&(7*|27K{jPF(Icj2dύP8ݖ)4zz$ qz` ?b-AitWXӃ) .5w\y} ;N]ߊIuE5aa 言U" 5lo@B !@  {E ,Sp^X:Z;g~0x|_<4d ܈8߄;x$? ަ5%1O/b =~8Rj}DՃol7;:uڢE-ں kհ/#dr t Y`n}s&a +;aZ>0tx=fi&%'Wiu;ftQnDv9|جjRU җ?i" sz1YiL 8|=؟` ^qHO|ϊرH2C6_K+2F3mˁ;A/Y< DV W=37%ܑWeqRy la9e٪ +v+ljmV71˲փOd9Գ{C.rk`#<;҃T@Q0efR礫n;[E3)?Rzhm[!vqK\ EdGJikndwrjYA5j cH5W_I> h-Mr= ٰ6 DigG T$[l:l6~K OHn,ȸ޵m~No8,X@_?_EEHe1rkR-bo +iuSua$(!U+^ee-|AW`qPp!_M/ -(}-]$D^9"a6:[_wع pY uas7t0N6Wj 3mkCe/ eȮ;Q8bDe[xv}X"lN$ *;N4+bZ-%Mv Dʯ)H|5LIz*$^ 5S*QwN 0̒"fP6 V4]={6{YǰE٩D k-p.l*):/F}]& JNN HQ(D6ewj\7'TC۠w :*ϭ]OD=qJӬ8<לv9#M!N%[qJ#d"a6s!5|K'zaq=h0 ;ٸLH (֌Jȴfg.rԐ[(ǻbc>Q%H:w%FȱJ3ݚK%(PsV*pϰd]SQ{s'ͳ'2,L3vIgĸQsH[H% +mx̓6;R +3i3D;q~,E*i@SARv湈ݙq{R͒ƟXƜDUهh.P3U}%D<%du6 L:q~|`சB 4 +Cp% b@./9# T\QݮjڕeEZAEEYzXU XZ9->ٿffwN)'rfsfq^9̇3w]>vGTmWDqF~z3zDx =8d:{J6RU GXpsVPhAџp1 c ͐#J6X%Ib K +#pڸ9\3wb0Liv iv ./V} ݃{*<<$@Z;@RT6%ۚ΍neZ$ںHEHbmwAmG%w$m]Ah;:n:ttԿ@}d5s 'u@L+DwBDg0ؐ ;=нLݳ߳^[j[)**{]^(o V/Rhqw"g=瞠}!z H`|Y堞*(s/?㺽:2\œ:s~s~s9 [nXK?@^@Z{S:G@OFP=x +Ƹb # g0X{ ~JpkI +I3#O޲`OL @}jw^" ^( C8p`0Xc8Xac!b. `X,e W-_XaS>!@P F5H4j`i,@cL Y1Zߐz T1`fQ̢O8=sQ^Cef([E6[>T(9m.爁ܦ;H? ?SۛA,B9ElzcI ed啤 u*}~<#CF1FAdd0XŢv +b8)Xh賂kDJQ!U!uNV +Q0H 2 3 >,iYEqqryf8 P_ Q!DM*I59az7*ň⥪[BBTFԯFcG~Up< ~+2Eh?r0"a9f+8yYj7Y[aMՐxPsL<?\??t{]Qqh ,:SߙGoEG"G\,c2U`>P2|%m? lMW>^]m]]Ƅ_&Nڮ%mЦ +C  åԷLLu`0"HŴHHr@i|E_RikmFA#w8܋,wqNq疈η#[7""G QWq•h<F;u5]iL)ރje43QzygZw۶&~n㭸oWr#vؽƘn1''^$$#rCYmo]J#N%^S~Xs#^nթ(;i<&P7ݒO4960:Ns9 -fc{iBsˤuYdب>2呴r*C'^ߟz_ZQ=ĉYZ0YL{ 3>=ߵ^w{y8(lambyK\xbsšuwoN}ݙG'ʬؙy3`Gf3^nA 2=i9+H1C" aq {('G8zgl?([.wYw跩f +ښSْcԔthJC\)Cϒ|TXNs׳E,.`} Z>@"L +L>8|eS@@$adBI +AE* E:EGT}[|' )$btG֓ `vG_ܓYAVOd4ҎZRǂRfSn)}7p!1^8A*;,5E:+#|eaI^8!QS~[ ߣ/%wQڲ-YzFv>';\ͽ~Z2Puو!]";eDSF[pMfTYiLgPI]oQSwaqM(&)Jz=Q4CPe5NyN9yv*+1%]x"x}2T|% >UE5p2r熾҃]DGCqkkQ{X]_PL)Zob'ي܉PY眒ܥlY)DO|MAIV_%9v>}5DZeZyF,~nU<~K"ͥA^[ﭕ%tX(+3QHG,4Px/Pc5HbDJ#P `AKGLnup6GjqT)[kʏn*xUž29MQR()cIۂ +zC1NJ@u!Dȿ0SP:ޅL/. )Z=ll4'dɾ +˒SW Fn) JwâϠ`{W3 ׺ZĶujij5n +ϣJHhu_^n;Td(/+osҕB2Uqѳ*Քl=|30ՊWatu8B{d`jvnԴF*o7HY +uܚR:qTvjϰ.yNEi:DPM)/27MxқP2t޲MXI{i)$mS2F=#83a0818V8׀x=K#jQLwƻ_g:alwPl'[FYO?ߝ5!SvtQG31 S̃k- Q0>|J<% wp +cn@=jQE!#;-gyC2S f9'sK(rWzk꽎YGZAzmK jf`mМ9IɔLyC3Aʼ2mc# qrcΉ/s?^5vsXα ȱyUF{p ! ;nE,ond͹wΏ:JLE;>JCW6El͊ȷ:i1>363ƙYq\^u\Bȅ\߂,@C otF/] Z'F/D[!E-$Y2fZF6FÍBͶl)`y@<}5{@WhO|VI5x߸Op~KǷL،8`v-PX! |yPSssC%, šNN'ob!bD,0 TW\Jp/uA}ZKbQy3;:W01F ×YB_Ge(_?\}?Ck4+4 4{5^w<|`F5"р2ZH(K"IA"qtV0Π;qS2bPApY԰hcѬ, H+i'Ea9NΐK7paPIux3(Ss!xm(ֲ(EQi&hF]d9BNhK9yϾ!aozP2LP_<|9:e,:rQZEI,CZtNEwsArV;$}˾"9y?O?^gpAL5h=9H5&E:W|>i|i#[.{>;Q[y +7ScGo:#oA TQgjkbˠ?ϓA?}'TkzWQ.X?hPl?Wl?St(+N).7+(o+&î}mh-D EzGiz>=dL5O>MuFT ~SRP*EGW}>h +.ƠѥOQ)`9`$B| g%= 7`퀹F7 +-5gQWM_ ԇ߫{.0U2;hzGG;~cITG 4Ǹ3ϣ0"qpo\cr%xw_ +{_j8nm}S߈N^w |*:VѢ+C!1 )w 㨎)B1Nҹ3H1T!"rOe.%r&Oŧ cLL7?=۪+Vo|=l;#WJvGIwFlw-[5lSĀ=t$0 ۢPDFp#h;Ҹ0g S!S + nwZpJ@RpOBWSfvUtm@y579-_}Ĺ5˪.+c^Z&}K,ڵġ =xp7 ຆ9?z5p:G]=S3r-hmՒu  USV[ۜu.;wcqS5&1 Hťx@ :3pP.t+tcμ09-RN\Y(^]V)]:qi%΋[]%mq_c~ ECҏ?S>Sѡ! n$attѲSh͠k3tj}َ +kr,[4yeZYՎ2_d,viH_ϴvi_)kӎ{֤]NxR,'E*>ʿPJ:u,ҙ3eCl* N4Z]-OZ$eQ)I|Ru̿jֿT2:ՠoD "DY7ME5' +ퟪ8K/10hi/7/MGN[ 2ÝF`l@]ql!emDECNq4]DAVցc(@MN&hCx?g1#it|#Ezj髵 < |cԠ$`FCoDoB~!т`]ph̠8C.R@WƐU?su +y^ũ;by׎T޹#OԱYбGvLPyrU\[_j=Bd>]!ZH.eEJ&_$O!dww>.# ,p{9{9_9˟z9;=n%:J/<|dl߯<#rEd9lCs>%Gd٥Q]w 2yGO2aԑӣ$zz {q?Ɔ k%#<Hy"nF6 k2 ^[2Sύ x v H0L2%Gsc臁(C~DkD%lWdˑmuȬ !3$}fLLLB&!Ɉ#.?Ï>: +.a򐟂| QM"d;hB"_τ ;p/3 j0[1+5Ls8cPFsL?gzYPӫ]± \[T/cJ̗(WYzsk Zxf`+nhZQ8 :zAq}F/L ({O%'&wD{?Oy,R!ALa4@3q8 ܀=1Ҭ{aƸ̌O9&j Rb.6h'?AL~H2P j!$|+9I-Jr!HnkL5kKM_3}o7k1} 5b-!WOk U:Ʊ‘3!|ρ'SM>c齀 + ;F_n67i!k~-W2.g^y.0"!ADm xh# "=7a&ʽ8ʝ,d6ׂͮ7Y\d|y1p|GX)pz!pf>͙Y>aX0~?Xˣ*dQ +$olX<;/QTKbڅ- +-fs>tz.u2tx^cs8zHЇaT8A68gI&$ \a9-F(!z6>~*Vjq2Z:Ltn"#ǝDL"pGq7o"]Qq<#k 5>_fRL:JcR:.fifGSČCIVӉj U oǵ9Ξv9927^pS_X;r="!ӑeuܚA:ᇞ:eW^5YtYCqZ$`_,y%c9ߣEV0~E#Qyc,˪G*a +%jm nwu D<+Dǽ?{kDsv!+}e=swmT1a j_ʈj@qͨLRdXZ2&YcS+U緺T%e)/䘷JrާXrק$_U>qQIZJg_R!:Ug4w7)9Lh0Z h֙iuy[I8ǦAoS(e^yޥTy{)dޅEUQ@ +pVqeW,\%,_JV:*/0V*B[͛4̺,ĶRUP^fTTō|(!/%Ux+F~WWeJC^YoQ^n։X5R{EI^H+k%m9Y2g3בB ,-#l-WeEz#mVƃ)5M*Zieͱ%fQSuAVڠpԗsk9u-|a-v\HѝL}<~wM4]'egP`z+ ҁ4uY@mTu@y+4D ;,Mn.M(lby)-=Qׄwpʭ"z0ϠTzJP<Jao Uoۛޑc)4JmҍJZĞv\O7{9.W]"# " e Η,[p?QdOz0`7o @1f qguXiVZhYڨ"yDb0ְGu:nbNqBOpCpCv~ /uu93 :be@dPWct\j4Mi6h+wAe܊ɅK`M;>zJ539ͻQ,فڪf\܃"8t50$G 4x=8#;bE#E^0\5`zH8A&jRMNΟ哘?1vm)fmot17MQkr)j4FQkVKsx`FΟ[8q4Jw`3Ü=1iGHu EMex™^хs5Y޶u;uGuu[7K}U3P3k_ +L,K{=`>Nqؐ 㟐g903 Ƴa8w.pz) ^c̟Oao3;c@@:0\3zuFonD=ZHh'}xB^ +/-ggxKm֝Q?o x7yA_hII?%|7oM̃޲x7=~a!?{o? +m? : ~گڛP +XOF߁L@kt(e\:$d_$E^!;w ސ(Hu +4EQ.f*RGTKz@ڍ,!,KfBzR5YHLR"h=mb8]o =_})%~~Iul!Y?d(󦐺}LŴLHjZǾm"'h౶hOZ;?$nx 2 ٣#מ${ ۏ0N0,%axdX#ag(w .*dm 46m|*FWv  b^GOnv' $qh1M/Ry/n7DypZq6I xh$t^!{3O;C^lapv-#*nZf +efblY..Zrŷ8o&ZJg,+.)NvIy[TVQ%UБ6dmސv/(#kV[܍v$4бЉ}q:KQoTQg]ںDyҺRyš&8ˏk6/NjڒS \"p>璽Q;թ(OǾ!bOhep-CڍI7$-;Kk6qaMb171't۸"IgY-; ٟ=H Ν?k381 C`) + 喡c1x&?m6/m.w'>9>kİ"uiYwiJQ~O[zoѠG/Ҥ|>Od2_k8}P p +FQQ6lX9L?rzMxڕ#CuG5}aI=r%:x;8 D! ! n ` PE\ZebZ":9jWNt=뺮[w;'>}jy#ٍdzY]cgNJz3_8yEʼ'X֝+ve3|">ϦItܡnVʂ8 +0؄)v֋%S#Eʠa.]h- o { Jrǥs=KܷO*mgĄ>ʝoӕ=2<(Ǹ:5z3\LYtTҫ0\%aō"[h k)l*.F7>i%43"[1# >ʤ>Ƀrr/1<`I1[]2kP؟߫e!]r^G)oS6 [JRbDVF[Jc̊Ě22R[D<ܹXIPPMyLU` ƉpYG*v{{;t`v?ueh̷kU}XjQ G֪&U7bT_DW%5QÈLFOtQrvmz8amCi3ǸY@en@8B͵ Y\Rv0R;]}%F.G뾗uU +HgW4oWIwFsD>ez<8Tup'8L l) 1kyڪ@_,UwFhd*(0[bz4ZaNVjb"JĈ|>>ܣ9N5ϑ v!#1lgaunfՎ9mVy,DR+k/mj79Er{oD}Dḵylw?De!ͱ1Bkc>ާx4^"ߓ=^h%̄/H?Vs}~E꠼Æ o_OKx[5$:-N;tAu[z]߈vu3´.F@}%^RgGȃ4n`1 հ8(oDp +p9v>Np_֐Py``MA;7vpOg[o +RO)GO`·/a>h/uT>uItqÑ7ȚHDV֞bNڸ/u}!pX{Ж nyn/q 7܄n(1ל?Mk{zpPwHcG4J#u'13{Y[gY[f=;iIqmo +y5`g> Q@ٯM30A~KQp'ᓀkhIZerʣYxH(A8$\\ɛLlbWu^kb~Kqs_qV]`8~sGIi ('ݒ9`H} Hzꛡxf^UDY-%>Ewc&q ^'}M%ķVH{=!h587x+a:-DrZ +.f'O}Ao  Qﻩ tJκ K` ]@>-y +Z:Pl PSf%܄@"UkAڀ5q *<(Z↖֥V뾌kZUЊK]O}b777$?;73pns3i{Vqg cuD-oLڏf8eЋs9q-՜%@]kw<1,fVܤOQ}ʇ3>7+ۈ(0{7kwsn~˜5ֻAwz#zLO3f“d&Ÿ^5-E<!8C;V K3- 46E$R(@i6bZNkhm=tu}z9= /ތc!_?;4FR,G%U:Z;xރxӌQcdֻĻM!qwf<<!t ! YLigX +Xs5kn> .Em<#p$pFys^,]̤-9 HԎs$^%x2,= +iocm\v{K5z~7 Ohc3׈Os uD<6q(GN;ܒg<E&W⊼卸$oG|7Yϧ,YH'鄗3"Z!Zy@hiys}|[YvqgF\f:NDu:m_'bm)8s'|hߤMKioS!i*5`5)!p ]6_ߋ/9_o>NqI1!2ߗҁ櫤}7J{R?_bK L_ySSOnx$Vj[qH-ma[Van+QlQ|k+Wn-SnSn تpHU/5uU/UBP-Wy[ mTN 8ammiҖ,Ŧ _)ۋUk3U+*Jr&m}vvqM?i +¶BSh1M.vяJ! m㛎]c.,Y:,]24["4O,chtP]RVR+ Y ds;\}^*t 7Ҿ=֯h==D3["u珰K8DKK"SU坆:kD΋6'b +Y %[ 3".S"; =O$t#[cO~/NEK]ƺDet(*IQ=z8ճgiJjgu+Еt>k~jR I]'vhei| 3uBOk3>67q,k{<Kb[<=FJsbz)JcT3{;{ehq+g~BD%rQ|㘨¨̣vGE*Hҿ^\KS ̟}v맰~ZT[Ps(MJ{(U%?L6Onll0vatT f)?f9/f׈޹1Wn Sn!uP9 }>ROR$3$aV LO*&&('SK6:!GW0R?Ɛ?86 IhN陕+3;#[Kz1+%=9=I3Lwpܷq`f@{%NS\MwƸ"=ҒԹiiڡa 'Ɓ^Δi)XRSX)W-'T09L!@P|9wG@LAQfK|iGAfG)o`7EnFoЌ~t6+=-5=Õr8y:Tz'dIr&:ky|dNr +SSdhPu86yobUo`l`Bc<0NK Q@%"J[,R h,&v]ʰY jQ!5r}{!Ws<{8Ϲ0s߽4g 'md2C)q1ĔIiO0.HHTsl!瘤+8& }\g#w=Þ%y% 0C GdgvDF?3R3CČʉFO`3vjY S t1镆izSTO҄HiBSwL!y`)bE\G!==Rs!97!D+Tzd۸y%RT2}dzÐ,cxY YB7$KHC2_sI-ԮT}r/>?K)pBWL*ń+ +) +**/UQ(H6+v\MD\kua;Y}h#]hޟ +mpxE3=h`,{WK!%m1؈%P}[_6$\]2\U, +/NU76lCvmj?| #}ۨ_KE@Y)0 &$Lr =]QFDE,blPEO]{kFdKyWq>e1l3o+{*Cn;е]ѹ|.ޖxxY&e<-E`YvZxX>8~o.s&n[_XK+?Ș&`<5cv o/ ܣ{n pmKCw87©?pl Gk  dzƛ +i55"ƝA @g@7ٞvp>a,A &O6uMS/Cj$hN%@3'n{W,ƝHo>hw0~Hd'5I=qK8Օ;,Y˸H+]+\+ܺ|A.G7"^y|OgH+ou{Pכ'C 0Tg|O+ \Ea'J{,̂\- o¿Mw{ ;i"WCKJ>濒y~Coo'PW_^"!MrKƂ܆6d,G~?H|ʗ/|ichtEΑK/~KaFj1f@N|LT/toG”`(x"瓀F6 Dt#} tu^#C'hbK( ЕdKR 2,$KH5YCd3#;I#9DZUx_# [GwXGL"HL2,RLr1YGيgn3ӦhS"< @A8gz +Od !Iy3,+8 +ꬢN cuSc'm]iƹ'n70BBQZً|Dь5-̥",N1Sg3uq^\op{\\Hkx aH@ AHB@!@@"D@$^Tx+EEۜg]OOlg֮;u.wSOs~s=1_219%sjocOb#Vx/K^_/Zzז{|n|.ŷNA;"g'#'_#+~AV<&:RIy GO +Tq'a$,ZW׬kႴIm3ZrJDm临LIwRǤ(uXzXל}2ދ '!o`8?s|rn+~ $-K|J2or=AȫȤOMȃAy;5MS9R&8)'C)sAMހ3^_#^o* ήyW1ۥ8ߡGטů/'N%C{:>Aj|zq=>yQodmB8^ TѨ`FO4&2S}jݫwVnםtdM +fUw? [ԏ5GxJape#Y7S2=ip^Hou3]`^7%]݊G)ѳ| nZP3kq<'їEw$[kۘF 瑶bJ\B/7PXk(v2^ϰ_52Tޔx +C)ba^Gw16ԜNr2O ,נӒuZ - Z TlvopjMu<)"Lic+0sg%N%o_r;̬ifN˼wX;h*2]|c^C͇p˃zMCehp/:j$-q mn*UVmJj7\]5zC"o#tiqJ\_ŹU0c Hw +("PEp\a"n81nh\Plզ*z'}}rKHyǥ-R)(GHA5+}>RHx9 (ہb v-BP*Jd4ڗ÷t&|J»4^Ж:)ivShEBzM7l` gqLX /1 8zUCCv<1d <1nIpu,#JGU5ye _cܳe{}G8KJ@Հ9\z@^6E.gܣlœp,Nx'}Efvxj{rsr+;Hp'q =Uj?X(!ZXH]w jO:Sil4*:M(F11g3pIZz8FdNoA*CiP[(pGn *.)+[)Sr)N)Wj=rqL NUjUU8r][#jܛSAZQ T!BJ<վhp{₇g=hPz"DԪpq2E_jQ);{Q=:jDO3J}dXёG=rjW4 7oԶP? g`O<H΀tTf,0%U8ۃO0: +:~:ǂq($ ա=Qqvw"C=SOAQx +Ó5|1YҖ|)7.DTI;;Η]H],%k^!ҍewN֋Njt(싢H3醣@7yM@nQ7K@ʊZ*Z+eDFm-[uHy{iBmӘ*O2R$7)TSTSL_L2]#M(^bzE#:l=v?=&X;fE^HGłyl(ic)'K4OM3'ɧ*&+'T m.̻]͵qKEdJk:v@!iGEV_,a-sl}163lC鶑TiDk3t|E5Mg]t?ygfo\DADxA" +"#$DjTتAe5LjZKiikN6$k4^ujs7[y<Ȓr[ghƒ@l6B 9srʀm"Cj ]Qc|U3ƣ8t6f LhKbѩkEadج+0 7?[Ar3<"lP_:d+^r_9jTcNi0ʥQ(`DU2ERhLR@rkڙқ\iw$Ky}tkEGD yqb\3P.DR9DəErP [BY>dEK4iǩuJ@<\җylSJMQly + 0'|s e!\(0U9湪ls`L3eeM5cmI@OrY W`1 k*Xs(JzY#`Cum!ےk,!ǖ+LED̲9UWe4kvm]C]\ץXiS&@SN,Kf'%ȒAO +K5/ \qHD#G&9B@HwSG*վD=ɾFloN&9Βk$R%E zp#no[)FuהjryI-[_s9P$L Qq0> +#!C&bHC{$ X홍(O ^,GF#\F~˔,}{1z^j b"07 ċXM@?o +z^Y靏_x&t[ c k"rդQ:I͌{ YK +/`h(m B@m"BH_oD7]ǒT7ѹل9mEH*wz_;oӶ'ު xSc/^8x&qE=y;-m` z'w{5 tBOO`'K 'x|E76<ff  ] HC#ηu&݀}@† I -<\ZXl-9`r=E%Zƾ~Lm4&~@[#Za:5 N>a3,@[G/~޶3ӄ^%4Zz^θ-7P -w@0oU}Bs< +> >ʆ'W ؜A?.̏ + +|F^ Jz^ĸS;dQ}+o#Bjӓkzw,7c8Џ0fm|srfߡwhKǀԓ3ԧn]q\">O;o=#Fp +$b5SX + +zriκOb8AdRLr476G> - "q?~/Ƀg#wmwઃgDƐ$22JjRc5||N>>05ک%nqIno].P\u&d#$Qku*SMX'{HuggT;ĒTXF9JH0/»R3 ?@b-ԱS5ԨP-9;2 gzq/yQ;w~OJ z!.X>+1 _.+uuDuqU*j}+(dx8<a5QRDѢ75o+jYqum܍fnw7nصiQ7%/;;|*j4PXOwq#-N4\Ưxp|}ZFL6Ý2H+c{1F55c'O`:^n2\K8ܓ<7FKp+\\^gW9yϫpx"OƧr ~ +Gx<e½Q92ScV00n+.ۃ38;*μq&|_O8&oYgx<OoL ? n%f\K +qqR9YF_߄w8:$OSp`c {]әȎ`z!^ +< f:ܝ9 +'[pyZ(OTUó*phV-n¾k7 {bל=9Ͻmsoc뼏%6@O"6fkc"a8& +UKs'\58@} ұw cl`[P=576gvl\tPt/:-/.Y ~*:6"bXB폙b~:r,pi_=G`:aR-b<􄸰!CڀP:Bb]hXvBְRsiuRS"5Bz߹?RA2S9N˾3R`w$1艌BF. +:4iVSVjDM4Eƨ]RC1T=$F&FQ^R?)ws2''8>o3]Ax{yږaրV:ѨuA[%QR=J{Hĝ+rYDKi$O S,:`5.X4'ƠQ :+juvZW.NWGA GrgVg(Ѱ8av!ÕtFWHsyJ:dI:$'. D?3}֩J5 l66iG}5wdM8jJ"a,Cj 9Hq.nHpJX9}W.}"GcJ%ůX;I^\lkhKq5v)b*a }e+ÐTGD +<+"S+b'}XkD |0w}oТfE~Ņz'Gݭo>޳@v|qZ6{$HBDVS5RLNbDrŒHb I5Hlc$ 1jT1F3FCB'ȕsr{w = 1"Nm3驠L? +V`VZZe-cgf򵬔e-\WVѱf<vM 5-_B]ZF rA4B$V+Y|4_>!W~<# Fȭ YrA\79BNs%92A61`$]F#a*?cYuCzf"ɽ\.rz!rF'{kO5T#X5Ab%,*f-f-̺M랱W|43nzn"[藢]r.SrG̸>hiFvv>0 (4r+ga1O)^MОi%hF)4lz7Or: 5<|[@R@PA3~)*iJ+#)z4AU*o@Wy%/YOYI-=Q^||BGs*1)]OJ^b_y.dCj)\'&7>XҰÎ4i_s6(u\:WBu䤎u5 + jO _}pH=IK9O\Lv&b3p$&bY&N/b' a2̂tȂP` {?~?wg^JS6lvA$t0&4 (G?k%؀6}zCVs||V}eӬ n؅ZB^?IFc\}S6׳&ށgj$urWװ>zd mE3EӫaCcn+c122[ŽkqUEYSB7w\)S5  f#vG%akh#F +NEc.hd3Z*)=TS:ƪDϪQQiäĘ*~7Wg,oo;^A/:{N@#E']8#ZkuX9e:@,SrGP?P&%1׺΅=׹ZԈ,Q=YO?t +MD![J硓R4 +طHۉEW[js64z&MJ7^ULclc/Q5>c?@;a;LTTmq͎)KV8U&sޭBjqVR#幚Zf*Uڹ`J~ 'Jgsծhkgmu{Ezk*vU螤S-x[,Pgrʴ밖zI>2}M-a.RێRƳс>ggogJ='@Ea*lͺy_5õoMZ&"ehQB-lQ[Wz<МS!9_^E:#.ڀPfvZUZ5W^@FjinSYiQ eԂqJlYY!G3׌6imSۙFh<{< <£džmq2جh㤥meiE´}wӼ;B:Q3Biz9!S)49HiL +?b$7&D5GsMZ11KN'vWL(2iIHVxr’\MJ)s4!HgM;kMkH?{5`u!hnur/1dMtOe PH0gѤ M̌PP]25>k) 9ZdΪ1Feo1#O /42[0wmĿU38J _^T*2ע৻hbNOM9 +S@8 ՘\F9埗QyS52D#aUY Sɿn䙆Oi>$4&-ĿݪPʙ^?J_RtИwҨ+50HçY5lC3-_E35h-z/ڥ~E5@ M/0@_3[Z6:L ֳDV(|Oŭ4tV)Y^Re]Uwzɳ|t C=]*PwrwUk:&/VvO]1=?dߡY+^s/UHQ0`0xAϊrnWn>.AΕITԾrVRmjUqP_[jTۗSK5 A%χHKXҗ˥h>+AխԱָuZUQ T~YÿO5&&b#p}7zЮ@w.:ER*פ5RZC=RǍu u u=7033⩧i:[& n-ꆻMU-%hjj&cm~"mڿ4 ?G#~415 jmiI`#K{ L^$b븏6|uZ@.;@3,%{>e@=Ly5s5sțEH)>h>B=NE;udNNwI=(a}Rhg p%,'=XOo_eC$ݦ6wXTB.Chx⚇$^wz7@$@L0bX+5M=`=w&܆pMu.-AO~ +Pb}˻RWaFԶ]7L먮cRW_a +| çp=-909DbϽRay+U_Cym>v@IYi4>xC+P < buŐd4&_3~)t?98jZv-7Q[?YޔqS>n*u2O].St~ʩ&K_]z-O5Js6(=f*ҩ׉s*ҝR{UfiԼuKN59=<6Rʟu? Q?",XWC999{9:~#Wqh:F'lM<̞Igtݓk9Sv<5|l?>c)>TϷQڽ2՟C9358#~ŌUq}w1Kŀɶl~ӯ).ag 1,?(cջ$x-+ŝ +ϱ遌FoF"/legp);fְmf#[fyfB| +ևe]ֆau1aXr,5"|?0ud[x.UF cWx(gŲev*"y>e Gֲ&vʨ!GmdY.<ч>ҹX1`qWoL^G !m1S471sX7Ī\V<:8QE>ǀ|tL#;֜pҔBCzK.ZK5:sTvS7@E0e[PPP\ 73H ڇFMptc5FkhDjTgS_ PV{a'VC.R`{ې_HE 1 +|{u]*[sjܠW(=S>m~Se6r[*v[{,e(,PPVD~yz*ȭXrdU',U1WS\ 4^ӺOKZ΂Xӡ}EMOUPXJAUȭRS@NN2jݘkW`rldc/inZ ct0֎qKku;u4u_zWKik`#Ȫ#a> f yJXXMZc3&Mo@rIͯ|ğ$6Hl?>~+*EAKs +@8HsFct&Lg~k6)$V@B[mk&}71':?$+۪U\QHں2}vywK5L]Iq +&A|WR2ەGLW)skn%HfJOXw%}RZjMwʍϫ}3m+=FBtt7xf՟Ex!a7&3Hg+3< \f>A`cӼV>b;i6h[mj~/_;|%WFP#h(DBD]w&y0iL+SV K>[E1!l/}#.,"I.DVtER.Hb*Rr+V"Ww0[X;c\2cb51{Ƙuy|:ss`V63শYeiVkpY(4h C%X`6~πI,nR~6c:pGPe!+,%c'.t7`12y4Qj&,#HC8KFi07X+^_M_\N Bp݈&7KV +<0M > &\(je-Yh7݀G4$s[)opI%Onqd[܃k?jp__@::}Ga(G;/ +ˈزV,:!x֠/,H%=0ù\q.G=P=Q=M_O. N@.EwVgG;Ny犞=zA{@:YZ8òvZ:ׁEႋ~|̐ɥ"/Ԇ| *&=y{t #6/4]5Fr=բs('xDLp}8b8`8S%/ž6b{.h5a^BKQy 8Gχp_mHp} +B+ +D4R)LbE/~) :'JG ;8xq8OVnGCiԾKmq7MߞEAc86\?~C}l4a +2Z{|݉DM3/hnv?%|8O].N zN8:đF3A#PltJQ^F6Rx); Wr[*ѭxhi)wqOpOnyjg]{2N3 9SN1:󱻔lTssM|-ia@U3w+WxrfZ6TW'4{iC+ij(UWJZ6GlEZd=G *kWv =kJڟU X̚ +7m}5uOO;Z&VZNUhuӒ2Ek]Fh]u܎*bYe?_3k::58Pcw271+h~Џg Oi7;Or'k-vp*uN*ٝhfD蜢"1zy9is +.K׵ZnSel׫&t'.瘧+-/ZsiKWpuWa7_M){&I=Fib VvsZ^ۤuvRctJ07Eb?HraĞSγ|zjjo'P&W{^sxey$+#MY'Oc)oF-W&Qqx_c|@Gϸ#ĐcB/#Ztx/wez*;Xc#4DQ>铣~4\%.pWGߠ{07ib~ZFm {ϋ?cn|t^T(%)?Y5,`(hhRL !!w'>)ͽ8$fl(g(g|遶J tRJ`w%QR+1(BA1  RLd 0S,RthvhP[xA >L=?s3c*F)~$#C)i(!Mqފ 0 E>I@F |S:C lgCg24Vt|йڦlo=厠rQQAAPܚp%9㒺#dZJeJmmes5]-+iry-x~9<<*9r"*.M1^2D):"HQaRDl͌JUxtfD/Ye +UPzv)8搦Ƽ _}͔d觇Com%#d#cpTa" 0(1!3Sa1 +Mִ,-Pp\̮QwhrAĿ#/y!{`ގEKRr#.c,j'MIqUPL +H դ(ML_Z|kBz|+4.Asع5-J7k,xR670֗,+%5) _eZ241c2G7[2''sgk\VR䕝1\rȜvy[I|ܳbjg!Zز{^%ŗ7pkwrGhLh68Yi1Qnyr[yeJ[咿G'Qy7,c?߱{rVOH#Vd2y(>" y˵Y# +5K +`\\Eir*2ʱhke_QvE-zU6Eoe[@vf߆ކJTSýPM;^ or+9h&Hٛ/[4٘e]9*/e9M&Jc9JK}tߊ^suX%UnVJ!|L +Ck-e[k'ZZW`e ^5xj8P5ki2ꗹxX~bVuҬmĽVۀ{҂&itTc7`4Xembjblr&^Mx 6qhFH /29(ߒ2׌դk: MI-R wpƌV|ola},<xss9mk 4 . h7[f CZ:Yi۟ah7/ݏMM0u׸YkѮ!mEЙ]O7%'Rh@Iu._a@?PF]zN! Gၞ|vEqD%ۃu ^pb7$`RoS4ygC*~e +2^DGs=ҠfM`Յ\pa2~| j/z ý*Cs</qےl~ ?Gp GNWnGޤ?n1$fHYsGȻer`8@DȄ<(TBC3&=`}6{wwحn1=󦮳|!W2|v^kK !b  usU~R ?wol߰)^e$~Iϱ|YEzxKZh~ic{]G)ݬO1?f۽P(Q?8/{9#]} +Dg:#Pt~ZH*ҬxkhHsWy^5gFwAƁӉov6<'N:҅TD媲Vܬev|~Y<[pi{{'W' vTtVZORMmf6Fz.](}ڗԾBVq*vءR]Q^W?52=gl؞R`1Y’`(`HPۄBC IhJD"@i?ڢ"RRPUUQtQiR}yyk鮖YB [(7w(/)qZQR싴gk)T[Lbl -`KaU +5huXVu/W+,|;Գ`.8n9-6@]柪3OEES#?mYpef_K ԕP*_[ ujO-ѧ^yV9i-VjH>z۪H)_u6ˍ{AClj{SZlRWr:nIW%W-)eZRF5!uRW6mjҞSu!UZ'^;x(w激n_ %i A[oуAjM7=V-jfjSDVj2TUef Wθ9T{ O🮓Q1;c11Ғ3WYώRmvU+O]*rUۤr?m*vR**HPQ;\ᜤ{v/BgKv4RMIfU"-KNMxT\ Ga=** +h +ߔqB - )P`ȑs }s䛰;bGROArUjQ}v<9*tTNt+_C)ݣl1e:+R`PY/NCtJ;7އ?9bq: U3RDٜiw(U\K9e.kVVy2QQ#JsT9(S%sЛ|pv#3}9?Uq^%Ues6+lEYLezlZY&VR\uJ~^IGX]%Լ{<J6f ~ +WJ#mVAqs6v[vmaJRZmRҕR+KCJWb}z߰F 83j|OMwφpq $7"Vp'&|WdwClVbs-f*[XSE(e"ZdnݮzZa3gC-S8_p<݉,ViƖJR-9QJ +H_"|2Ҵpx٤.tԵU]5j^׏35wh з;9}[+$Hl+7OV?CAi;4ǿB5ӿW3+?"ʏP-f(76 [--UaO1߳JlGP|լ ’ H.t`p@5sorњ_:UN1 +Ү.i%o YR--&0g<M-&hb?d*2C$!x@bC,iѻsZףwOptL6B,@^^E|°d&0w̖iCr&lb?L !}?8EDBahybq/b>r9 gpHbLQǦ1 14c)35L%Qm>aC߂{!_ut8H L'Y,Ase841qu4/&qqmTIC{֗B&8&\ܶ5OKgg{qqpH|I|)v9BBAz$}e/ _~qi;܃쯇}5WW9).3]f\"phR tc>Ic-[ܓmm6s"(:釻=zg|wysXSE +aXIw=b.W}}~ÃZξᮺx<"4>0t``:/vMO/tѕݢúW)¯G"8~ }]0Ҁjh~;{t]؝Oqta^#u\1i._ koqjo% |x>:w/aן:ߣ<:~Kg&o?G:t^Ok0'1pknp9)T~'a۽\<]%Zol _^gI]`v>cyQF +8f!EW⬲^jćVlwb؟DB/h-&8vqHnm;v8?Ksm8>K,\BU`Vбxc^[{4CбϢcVj &do{6^WqKԽ%EEW~8C%kY>8Zh >XRVkOWn9IȜ9v~6{%* 0|/“G1Upx:qcQ,T6y\V~_ճ&;w(vlCFu2zR)cDž#X56x5lޘE,f>flgȠ𹺇MSc?!͔$=".ጀ WZ4?%=J֪O3[ءi6[i^#vmMSM[g=a-\P6SzaC (TG4Z3FY4}].QWpSgHCZ:UCg5j ]uSMa ]>%5n5ʯć#lSbP +=84POASciHR!SS  +4P55ج&c|jqKUV5XiDρ>~}GcvI/;[3Gqj3&&D)&_T=]豪Ӫ1]Ū[-*?2Uj~W T࿏W(A_,$9^7Q-!o4f9H8Ǩ>>I15\jU%ԫ"Y;T8C UREc*L>M*`8^()g /ujTdRuYIHRyrJ URRImSat-;}\g/儜uW=k?HߩV_ (x&U<ͨX'(=C9*o);c\㕗٪9.SNzeflo)+l~a| Ju\+^r{ц&tEGYV2>ĦYIlQYY]pVۥ(QJ*GY+g=GW pEE~,Ld__F{-hF_q*'GV$'LiRJ)JUrUIEJ,.j%4(dJ[KRTʎ(,;orsU;X8M;%h%&UÔ\F%T\ +*슭,Pte*eȪ^ET?$c*+Ɯ{~ڃ׎u]#-<SXhFK!cZ%7H1c5$׬Ho"Y2z@ ^6+[uRBuTF֝QT`'[<\#{mehq񞵅 1M2B3*hQHCjFh +/e}/r+ *"ȡ +P zjRFkMG55Ɖw:ilk6i;d.xh~lkƏh9ljh +Zje1fj%#7ZRY\r8Z;]B=h~B?ž I:DC|hǏjtpvڎ㇏Tu[`} X[hFg(:6bO@ jy]:^9Cm>r c%g0|+Dtrvπatht~=\t@cP +7ioRosa!OUF =uF鏦MSh^Ѹ l+n )]Ÿ !#cNꢓw//1؁ ؃! 2`*f"&%"L ?(_k;c+\:I# }t>7pޅ_wfo$lbs]%L0cBz@a/o`ף}^?>|/Go21CfJ~lVfQ_my ̫qEIY.i~I1ޝ˳ZOkx@n>+k3 b,g`-]^Rl/g]tJd` e̶ 89Jtè^H F]\-:!XQldlgb;Ӱ>2,~+ڈ6]ڃnb -DվjmiI͈zy8A,ˏ5 AcGkRL֐\`6%."Pj`݂'5dr#U4?+=[tsX.~yYAINFR<hBcBUŃUXl2*lr[ޙOrԾj}.Z#rg=>h3 h$F;"KQZcE>)ū,"V*]?i>;m>y"%GxqğFr$~X E'ĠGƣSt_I,mL"YH|򑯿8kw7WN=zRi G_/h0D'DtQOʥJg`K=|RwbӮ6o+;> 糪ezhQ[oͲ TGizXJԴ)흡s4v,$QNp>tJsCi.)ipXW0zhອ-[J[XRAWݕGSiK]IIL :Un3@n˔A6i᠒ hD`}J~m^&4y/vl.1) _SkD2 oQ!\G(X%5_SRJp_Cqb1:MJ6(K}g +V)L1iWXP)-ToUhkpe ++'`}Q݆n3f*Z(]#B,pƢp) ?禑~pE R"c4, Qi| ZAA+\= + +C.)0BUEysm">rq"5Bd. 2jXп.3?ȩÕPKA@Tփ]TdQAAC$mh֠2V[&C4iiNکjxlo: {}>~JU|D"6**z"cJSإNv*4ρ +FVsD ++`M|ŗr(F&ze<5ˠW+.K> RTl"bLOЈ OБ @ +J{3%PIVя#X\/scףgF# ).JPxAa4\Ót'*(%_)U!Q M]aeH=i5:vbq`YJUt2y!'&6Q#4_+ -B7:UIaE2dЌlWf<3c pExfs?Ӷo٢i%NN&,|M&gQ$$M~Y2'+@ƎalM163{XyC]2я`a9YR@^tr@©ODG=[|A<"DHkHx 6NT.9q47"[>AyVQF?VH+BMrKB8woD΂s2< Ħə2WXVG I/ĉ *:Ki?OMr~ +x@0\_XKv2*͂/ O%Cv6ۯ~:nǛL8Ns-W~\`i"y}%zk wAs+N/ ;Im|ǎ =p.??Ujs?>Mܥ/'}rv@> $,0 LG7({Q=_59ST] +x~Ln#?t +*p``0h̯5.vnfnu~\EIw?HF@IO?*]~n:gpp_Uwк7U~ {YTE{}k8gQQ'V'K˼D'䊎z W!N \!1 +؞Hfq?Qv-뱽e82)?/AKd{` vn{Zmⴼ'gap$`4(Nv]B,xj +,*:b[[CAGla` +C{ێQ9; +"H~:2&a3? e +Wc{1 Zrtk8<1p$a5s<']XL8QG  zex68)utBm'Y G+aOVsNV*3?Si$&5qn?S:{*,≇' xr)ɇx25t-CFF (3mL|\;\{jvZia-j$/ + \D“(NG\9p2U$;TjzMBFv9x5ro(>uxpb *u?d{xWBM$M$%I-%mZH  +-]\M&-0nu PM6*Nc8APW72=s2{B7Qxsׂ3ԤXhFg.@cP(Z5!mI` _ʄMHح*3V]?a#|kmrc3X(@S D~5>)Zc F ah!GUBC4XJU$)8AeSU8_%IOڠb.LTdzE+*2DzŸHYTn^uHs$ 5YUaJS2WfTbo(UE*H^Prl'mOV-}ЋȌ Hn~xe}O}Bj=RBmMz~Ҽrx-{Jzdˑ 2T0_`EOPtL EV=Κsp]x&ƶ6Vk9z &'9R kI>,A2d(T2 &x2[G%GOXX;Yd؟ID3{[ qe$9)O +I&9qVDRD%&X2)DAŖQLyXC9J-+-CG9=8 :u +.%p7I:b0̨afSt+*`+Q}n_kZ +#< Aqzb{ex^K^*ȑdQ'uhń R q8Bl Q M&"բVjP5(Țg#qM/̕a0}\=yK^D\hAa@6@ nhwXx3~zK<^ t!N?2NmWw2cgI&jV<'䢅\ &0͘ ph +ثIU%[%Z\NfJ Gs8s,r1 v&>w&nhpkm$E̸ca!RX뉷/+xi%dlw#>!v.vr&ZH=RЅ,j:6Jq1. 5ļ5lCAz?=">N Nxt\\EG3^+ Cx :SPb+o @@msDc<5ptqmDCm$ z?#ZN3tl|D5΂mH+NGce`0;?EG7tstnk7$]7uqgBmjQ|̕k}Bq0;_c8HNx zrCG:ri6kF|KTb77 +v  i/ mDc!)Ű'#gٳg^WE/ok2kc\q}zoO4U>}A@-Eo0S΁1 )&>:CU2-sO'2]x Ex +?W]y@?%yuY'5'ρg?2/75D^('8M|fLk| +xI^W&|6x~#m׫hxH]>3e hOf~9[tXJG8/p㇧:x0iC( xv0"i|oh _ ' j65K\q7esyٟ˝K9*=O5DZ6µmJԣu\EJdSE y>$pflfdѦe*-Bp̈=#eI,[[ܩ-xŲg;Hj0zc +(`P|;s| "cBi f5q%:rUoUg(RWȨTQ +GV;)P#|΃*uV9 +]T#yiޥp_϶a7,.6* +VӪ +ӭDer]"*uwp wWgZr=TAѷ(9 +rx2Ϟ=;ٺ&4RP,.@%REPaIRnBg=!}d}S6O|%{&עGf)FՃ|KL|;I zjT5򕂠Z(kQ)#/{`D)Y1y{ߒ9#ros gm$GkJj!'_ + +r;eA@j+"UZB}\rdTfywy{t7=73KqtaWgXI%}SJNu9ʯV퐭PHAڄrTף2ÓDan07t%58cy`qp qu_XSr!'X̍r2EJPf$eQ%Q6 1f>6QbfHZ +휏; 3W?=Y/șȉ%[Dʈsx9D4qPa'.p0& qL )x.{˝CO}`w~ Qs)#7ud)kBq$ /4uA'q%*U . !ڈ ?GsCq=`lK#%D,[@^cĥrs]JK 뤁;n'N'vR}$YsuGZbX5ƯSQRv1hu'ecyr5c~\[E%\½&ԣMt$=- T gMæ}ɜDG]+15}Tv |\ q b 4wu0d`07ߏ1GRu s2CUo,a> -qLqL85P'c4CclftMҟ#  ?b/ic;u: ax΁,'/'p#z<G +mRH +]h)ztNc78j2Nꏤ5ChY;8F.p.0ϳX`2/>#J̑9\@s"BZH>KBTA@.en<}g!=dio Xx"9M7u}E$+&ylf7 !!7 "DE`!E ^bIE-`;0hREkemEDAmkja~6?u: ={=6IXtRT΃R~FnMmtS=4bCnqMZx# ˏpe>_;1+;&8~e1ARaq*^t217EcS}3_{1ҋq};}#3s$^%A 7tIⰢH"9(#4$ʄ2\`֯g1gq>N=t\u]Dǻxw6N-<y_s~%,w4p g]T~}7:n旸^:bа~WqRNRIJNRRoQp{nǹ*؟[%;\QN^ٜ@OG7~8ysgcRGhbAF'ЫDvݰ>vk8?K)VfgK W:o{𡽌8@^pOg>P KXviKzE;T̗oXց/xLb/62h.~vcIbJ$S1s9%s9pώѧ$iȭ7X~|@a8jdDig"<ڋؕTF zTjs27 &s\1':5T +v-&' y蘃YhPxS؛O3?SKuDoQAdN1ѻ 8oDpmgfŞr)`/xBTѹRup5pbk +M}|A׉8ߓ^?*& o=K<4eflT$_)K+ \+W\p ԄQYE,**'DsJ9%\@A(U-@b_*=^Έ +Eg1@LF[ToJUѮ +Te( H +`,qJ'*Ԣ@bת(y +T%.kDޔM(\;JF#6L&?MkiOTbVe]!Se&JS*I+R*Sk3Ry +,Z*r?zHnʲ^PFYr&R>2 +63CMLn8YTlMS5C>k +ʷU(6X9zeۛOW>V+./>!vcj9 vct'N I-cH Si?$æ42q)QLGX>FNT;[p=c/[ dY]sT{~vqX-MqfuRC $7cTˬL].S93 + +J9\Ô {dٲ^.{R=Jt++:߸?cne["l4M&r3Y$7%䦀sRtp+͝%'eˮ5g,9dνGe{@Iyݫ1*!*JƼ: FghKF!Ĥ|JZd:ddȜ_r +)p )ô| >MAV{xƒ =[bĤCf8;Y([Y~N%X\RY,lx f) d ov87bML\MY&&%ȧ~2IZQ +Bvir^9:PL4/W0V0KWpT`"Bt<:g4 %h{r.h4q&J~bԉuQɃ2\.40N`j#[m>h. 39`>h8j,R)1g[/>A:.\*wjib4Zlm qݎb茂8:Gҁ.6H6Oj_bBc XRʖ6hϒ=wȗN#AjArA@=$;^Sϵ^Ҋ\Wݏ\zi!̧'<ȹQ<.ȌgԦ>>LMj1%GwX.s +:8~?a_q=d<8;:&a"!052&CWއ8umM,OebOa0cfhﳀG:3:fԞ!yqes.|U3xyKz&fn\ƼnFM!W6Vz Hƌ+.s=.=rFJ.~nC?@?8rQb\.x2|.r!a2{NN$q<k7&)2g`8?K'8c?:_vx=hdZI>ڭ[V*EA=7(ߙH8y} =?'9?bU/Rr>]p,r5llk:QJ;zjXVF89hf||&8K+ 8BpQG]1%TS BxٛRrԢEh-{X VısJlU"v x 8p(Rx*jwj=\TSzc6SSwc!=I,uY$ ./<x“2 589Wsl",_A3d)-{Q|W$(?\)'Y`"VV&򲆫ge2NMgzypM๲"pj"Fm!TDLTA ә>/򙘛zZAI䤎cM-G7%YPnIqe +2MRV<)P'.ϼA^sR-y,r[e(򾌤OeX3<5;u[XEmEԩ4)M[:4b(`I?)CI!NWZLy-˶NMN{~FvE7x=*F C +z[H栓Rj3L6!#Q~gN]ؽr3rLWDN\9-J6dxQƻ^Qê՗-5IJl+lu'6rɥ6Y8@If6[32l b>xY`y]%1r,&h6>0rLe[r(.Hi B +p`㱲fYY6CC :%+F^7,K5 rCǃ^&Y$)yTUka`ꈡ(:" +. !;.i.Cff{fY+e%&,}xqlsιg߼w}{p9@I=qRσ>aBg>ͨFKU6apliOcx7tI;hIxbN: ؀X ؀ @4 \6F=BŇej!nbݴ2Ģ;7Lä>3uUS\]쇑0 m4i&:ѐt<_B)I#Ţ1}k /4 q¢',z,L"&Ä&LlM,bNsۍZab@]<@2c'CyI* |5L2'\j6\lBoٿ:E?X􃅙~фM4}Y/UI 4B.CO8TIB/F~k3K=ŶEÆa`$= 'G,Â,| "?hlCҔ\rɚ#ES|?+AOQbc  /J1H4,\~VlELQ8#H4tCTi6!b~* hI w }$p@ J@ $rBGX?`7"~Slә± s&y5Gg \ͨ`ӝfh6a{b;.t4J]MSX%Sõa#? ,;t kX:-XǓ;Q=G%MvlGW1R2Qѐ*^EhiGh\-p ݈E x +dM_JZE\gs^U)8_*GCv5mR9;NPxD' +aQ`LǡsuRz=ԭWAMkZ>[桶 |:u6w}8G^ 6>d谈Q1#G;n||„L}$9%56=cYΛp%K]؊_vyOl֧xᥗ_/ؽg[yp~'~ŗ_}wߟs?pWrƯ7ov-y:\=%DTn!q"pޑػH$@#@,*F 80$ +b$E&,B#˄*"ɓdPv +K*`^ۂ=as8')9|@!tV]FE@.n Ҳe]ub综ψ_Kt..n0ZM(VYQc؉&@ +XCK%4LRLƌ4yjrjz,]b՚u6m޲u"ٲ+V +С ($H$L$P"%Գ½t]E$׮_A7oݺMwJJJK˴ mhCІ6 mh<~y\𧒎$T̑m"R0Ia"2BGKN)KL![c2e+e҂PP1c>33go{{{ݢ(O=@^@%\Su\v=kV{$-q̯l +Q-(I;E%\$R<7($8l,VhjP*qv쉞/YӤ{T%\~:)5KN\bBtT?ҝTˁ;-˜ \_8pߺ׻\JQøQܗcJ/{MXy2bflLlʭT.>Iݎ[i8gD*?K/Zvf[ +n~eZ?GzM='/2F^CzUw(T.i4ݩj x܍cL+@#w'Ǯ:*:RXш"u%̈́@WRGk F1y"3 7 +|򒐞,9UFkx`iJ<l9` %0raSi l Pk)h|+%*<(!رyoφrdաysܹ~¥[\zǟUMomsQ/fgEA+? =6Ng")(z$܉ޡD1@g,<u) +`Y2O+;Ura~3{𞳚UΑ$ӫ&0,'^f[1ZUՂ5Yŭv~j3ȟ$ϷT9DF 浸`-9(P.au6-rӱeuho([SSSҲ^s\]\)GM1MEO[PC8yfEe}K3z2͔֍@_m#XĶ}@4 j U D@F]d>/g3JsL"LLhS=&M򥣘\_H3ޛ^{ֻnhȉVUur{)g*w\6aZ1_AWCrrHmF0 \F0@ .~ #8ČPjpWyWb d UGBu _\r.|zFI.קGOJ%'` E~ *a:̔br]k)jl-E&ᾣ4kP&H{ͭ.XCZV`WqX`(,G@7Є9jTjMCUcAY;96pCp3` 1& p` ƱFQ<;ɥ7%-{ٹ(Gj\ +2Ν:p྽?F팀̛Ԫ%h7:x2A^IN-8p@@)Un. +@Adp!G5H@|7#P? Sϱ*;|$CSk'YUݰ,OG򙂊T{ywOv7ꥵic RIx9m-͗1,Bt_~p 2 .Z`i6-1Po0P` A +|H1` u|U FDцXUTZ.oB۷E'Kz*.OZW.g>%'&L ӑidn=c\xőծ{O"Iy25*TCUEnK*T$ )Œ+p縮[˴\ifh@)b&Xtm!*Ry%-Xyu\E}*,z~/jv(8<.[OԔ6W_B?z~,$r2Kj[3egj ?>Bh1l=2s '` c=D\YG7ᩚ)=]M&JzI +*tvy9?ώ=㧦JTA:՟7d5=D#mb_TQ|}B[_Xu& 7&9 8L+ +endstream endobj 33 0 obj [32 0 R] endobj 43 0 obj <> endobj xref +0 44 +0000000004 65535 f +0000000016 00000 n +0000000147 00000 n +0000047473 00000 n +0000000000 00000 f +0000047524 00000 n +0000000000 00000 f +0000000000 00000 f +0000056786 00000 n +0000056858 00000 n +0000057278 00000 n +0000058845 00000 n +0000124434 00000 n +0000190023 00000 n +0000255612 00000 n +0000321201 00000 n +0000386790 00000 n +0000452379 00000 n +0000517968 00000 n +0000583557 00000 n +0000649146 00000 n +0000714735 00000 n +0000780324 00000 n +0000845913 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000852045 00000 n +0001242372 00000 n +0000047915 00000 n +0000852345 00000 n +0000852232 00000 n +0000056460 00000 n +0000851470 00000 n +0000851518 00000 n +0000852116 00000 n +0000852147 00000 n +0000852380 00000 n +0001242397 00000 n +trailer +<<7DD2E7F35FAE1044A9604A7A41981FC9>]>> +startxref +1242588 +%%EOF diff --git a/static/assets/images/products/appscode/vector-logo/appscode-cmyk.pdf b/static/assets/images/products/appscode/vector-logo/appscode-cmyk.pdf new file mode 100644 index 0000000000..308c1ee0e7 Binary files /dev/null and b/static/assets/images/products/appscode/vector-logo/appscode-cmyk.pdf differ diff --git a/static/assets/images/products/appscode/vector-logo/appscode-rgb.ai b/static/assets/images/products/appscode/vector-logo/appscode-rgb.ai new file mode 100644 index 0000000000..70fbf88d21 --- /dev/null +++ b/static/assets/images/products/appscode/vector-logo/appscode-rgb.ai @@ -0,0 +1,2064 @@ +%PDF-1.6 % +1 0 obj <>/OCGs[24 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + appscode-rgb + + + 2024-12-17T09:33:27+06:00 + 2024-12-17T09:33:27+06:00 + 2024-12-17T09:33:27+07:00 + Adobe Illustrator 29.1 (Windows) + + + + 256 + 56 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAOAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A5Lq2rajq+oz6jqM73N7c uZJppCSSSfwA7DtmcBTqib3KhDa3M5pDE8hHXipP6sEpgcy1ZM0IfUQPeqyaZqMa8ntpQo6niaDI jLA9Q1x1eKRoSj829N0nVdUuPq2mWU99c0r6NtE8z08eKBjkyXJAJ5J7N+V/5jQxtI/lrUgiirEW 0rGnyCk4OMd7Lw5dzGpYZYZWimRo5UJV43BVlI6gg7jJMHuX/OKmt6mPM+qaIZ2bTXsWuxbkkqs0 c0UYZQfs1WU1p128MpzDa3K0xN0+msxnMdiqjeXdvZ2k95ctwt7aN5pnALUSNSzHioLGgHQDFSXl F5/zlB+W0D8YotRuxWnKGCMD5/vZYjlvglxzqYsp/Lz82vK/nyS8i0hLmCexCPLDdpGjMrkgMnpy SggFd9/DIygYtmPKJcmaZBsdirsVdirsVdirsVdirsVUrq7tbS3kubqVILeIcpZpGCqoHck7YksZ zjEXI0AwK+/PLyTbTtFELu8VdvWgiUIfl6rxN+GUnNF0mT2h00TQ4pe4frITnyx+ZXlTzHMLayuG hvWFVtLlfTkam540LIx9g1cnHIC5ej7WwZzUTUu4spybsnYq7FXYqxrz154tPKWnwXU1s909zIY4 okYIKheRLMa0+7ITnwuv7R7QjpYiRHFZS78u/wAx383z38bWAshZiNlpL6vISFhQ/CnTjkceTicf svtU6oyHDw8NdbZtlruHYq/P/RtPF9fLE390oLyU/lHb6TmTny8Eb6vOa/U+DiMhz5Bm8ccUMQSN RHGg2A2AGackk7vHTnKZs7kuinglr6UiyU68SDT7sTEjmFnjlH6gQ9M/JHzU+m69+gpAosdUZmWi gFbkLVWLDc8gvHfvT3y7FkN0Xf8AYPaEo5BikfTLl5F7ha65ot3dPZ2uoW1xdx19S3imjeRabHki ksKZlUXtAQwn84vyu0rzh5durmK3RPMNpE0tjdoAHcxivoyEfaV6UFfsncd8njnRa8uMSHm8Z/5x V/8AJhah/wBsib/qJt8tzcnG031fB9U5jOc7FUBr+r2ejaJf6tekfVbGCSeYHusaluI926DCBZRI 0LfGVv5NNz+XGsedJ4/SCahBbWKICqUbkZ6L04jmgX5EZl8W9Ou4PSZMx/5xZuDH+Yd5Fvxn0yYU 7VWaFgT9AOQzcmzTfU+q8xnOdirsVdirsVdirsVdirsVfOf5neervzNrTWFk7HSLaT07aJOk0gNP VIHWp2X2+ZzDyT4i8D2v2jLUZOGP0Dl5+f6nsHkv8v8ARtC0KK1ntIbi+mQNfzyIrlnIqUBIPwL0 A+nrmRDGAHq9B2Zjw4hEgGR5/jufOotdWs9bSBIJLPU4519GEqyyJLyHAAHfrSmYlG3guCcMlUYz v7X1sK0Fdz3I2zPfUHYq7FXYq8h/5yEuQLbRbYHd3nlI/wBUIo/4kcx855PK+089oR9/6F//ADj5 ZlbDWb0jaWWGFT/xiVmP/J0Y4BzZezOP0zl3kD5f2vW8yHqHYq+EPJ4H1q4PfgP14ddyDxvbn0R9 6beZGZdHmoaVKg/LkMxtKP3gdX2SAdRH4/ckHld2XVkA6OjA/Klf4Zm6seh3nbEQcB8iGXXN1c2l tNc20jQ3EMbvFKhoysFJBBHfNbi+se95vRms0P6w+9i/kTWk0PznomrSStDBZ3sElzIm5EHqATCn esZYZupCw91A0QX27e+a/Ldnoja5calbrpSp6guxIrIy0qOBBPInsBucw+E3TsjIVb5v/wCcXXjf 8ytVeNeEbaXcFF8FN1bkDMjNycTTfU+pcxnNdirxH/nJLzPdzQaX5C0kGXUtclje4iXqY/U4wx/8 9JhX/Y5diHVxtRL+EdUT+bXlm08sfkC2hWtDHY/VEeQCnOQ3CtJJT/LclsYG5WnLHhx08y/5xf8A /Jky/wDbOn/5ORZZm5NOm+p7T+ePnbzj5O0C01bQFtGtnmNvem4jeSRGdSYmSjqvH4WDVB3p75Tj iCd3IzTMRYeV+Vv+cm/N6teR6rYpq13LGq6Xb20fpfvuW/PjyYrx3oBWo+nLZYQ0R1B6oXRv+cn/ ADvBray6zb21zpjSUuLOKIxSIlaH0nLE1X/LrX8cThFbKNTK93qv51/mH5s8q+XdL1zy19Ul069f 0p5po3kdTLH6kDJRlXiVVq1HWmV44gmi3ZshiLDzXyv/AM5Nebwl7DqWnpq+oSqg0qG3j9MLICeZ k4cmYUoaAduoyw4Q0x1B6oby/wD85P8AnOHXI5NdhtrnSZJALmCGIxyRIdiYm5E1XrR616bdcThF bLHUm93rX5yfm6fI+kae+mQR3uo6sHa0aUn0UijCkyMFIZq+oOIqPntlWOFt+XLwjZ5/5Q89fn15 n0PUfMun6lpY07TGkM9rcRxoz+lGJWRQiFgOJ2LOvzyyUYg01QnkkLeiL+YU2s/ku/msw/VLu7tn hMa1osxmNqWjJ3py+JfDMbN6QWjtDUmGllPrVfPZ5J+XVil9540aBxyUXCylTuD6IMu//AZhYxcg 8T2Xj49TAed/Ld9RZnPpCm9vbySJK8SPJH/duygsvyJ6YsTEE2Q80/MT84Dol9JpGiRRz3sO1zdS 1aONu6KoI5MO+9B0yjJlrYPPdqdueDI48YBkOZ7mFav+aP5l2FwlvcX8cM7RxztEkEJKLMgkRX5I aHgwNMrOWQdRn7Y1kDRkAaB5Drv3PXNH88Wc3kODzTqREMYhLXKp3lRzEVQE/tuvwgnvmQJ+my9R g7RidKM89tt/fy+0vNrX80/zD8y6+tl5eihtxISYrYorhUXctLJJ/CntvlAyykdnn4dsavUZeHEA PL9ZLHPzO1bzPeazBa+YoIYL6xhCEW5qjhyXD9WpyFNsjkJvdwO182aeQRygCUR0+96z+UFrFpn5 ewXVwywpO813M7bBVDcOTH/UjBy/EKi9P2HAY9KJHa7P4+SRXX5ra/5g15dF8lWsZ5E/6bdA7qv2 pOPREH+VUnwrtkTlJNRcKfbOXPl8PTAe8/f5BKbL83vN2ieY5NM8yrDdQwTGC7MaBHShpzjZeKkd 9xuPDIjKQaLjY+3M+HKYZqIBo/sfP3k//em4/wBQfrzK13IMe3Poj7018zf8ciX/AFk/4kMxtJ/e B1nZP+MD4/cx/wAs/wDHXi/1X/4icztX/dl3va3+Ln4feyvU/wDjm3f/ABhk/wCInNZi+se8PMaT ++h/WH3sEtra4urmK2t42luJ3WKGJRVmdzxVQPEk5vHuQ9T1D/nGn8xrPRW1L/Q7iaNDJLp0MrNc AAVIWqCNmG+wf5VyoZhbedPKrR3/ADir/wCTC1D/ALZE3/UTb4M3JOm+r4PqnMZzlG+vbWxsp727 kENraxvNPK3RY41LMx+QGIQTT5W8vaN+Zf5led9Q89eXpYdPeC5ZLa8u2okIEfGOFVCTVZYmFSE6 mvfMokRFFwoiU5cQTH83tB/OTSPJ5l80+ZbbVNIuJ4oZrSEUb1d5EI/cR7Ap/MPlggYk7BOWMwNy lP8AzjFKqfmWVbrJYXCr8w0bfqXDm5MdP9T1f/nJ+8SD8t44TTldahBGo7/CkkhP/CZVh5uRqT6W Df8AOKGjQza3rmsSRhpLKCG3gcjobhmZ+PvSED5H3yeY7NWmG5Lz787YLGD80/MMdigSD10YqoAH qPCjTdNv70tlmP6Q1ZvqL1f86bl7X8hfKVlK5NzOunJIKnf07Jmcnbf4gOuVY/qLfmP7sID/AJxO 0WCS+1/WZIwZbdILW2kIrQSl3lp/yLTDnPRjpRzLzH84YbGH8zfMUdiqpbrdn4UACiQqpl2H/FnL LMf0hpy/UX0H5+/LCfzp+V2hQ21F1/SbKCSyDkAOWgQTQljsOfAUP8wHauURnUnLnj4ojvfL9nqu uaI1/pgnubKG7/0XV7KNzE0iI/xxOCDQ7EbjxHQkZk0C4QJGz6l82TaFdfkfaz+XF4aIIrX6tHSp VFlVCrn+dX2c/wA1c12oujbR23vpDXLb73nf5UXEcH5g6O8hopeWMf60kLov4tmLi+oPL9jSEdVA nz+0EPpnM19DQmr3v1HSr292/wBFglm36fu0LfwwE0GrPk4ISl3Al8t+XrZtX81adBdEy/Xr2IXL NuWEkg9QmviCcwYiy+b6WHi54iW/FIX893rH5r/lrb3cl95qjvhbenAHuoJELBzEgRODA7FgqrSn XMjLj6vT9s9kiRlnEq23Hueda9pWsaX5N0J7jUpns9W9WeHS/iEUQQqQ/wBohi/qBvsimUyBADoN ThyY9PjuR4Z2eHoPxbOf+cfdOiJ1fUmFZR6VtG3gpq7j6SF+7LcA5l3PsziHrn12H4+xgf5l3/17 z1rE1ahJzAP+eCiL/jTKshuRdL2tl49TM+dfLZ6T+Ys8uiflNpOmQ1je5S1tZqVB4rEZJP8AgnTf 55dk2gA9B2pI4dDCA68I+yywj8r/ADZoXlebVNS1APJeNCkNlBGpLPyYs/xU4qKolan5A5VjkI7u n7I1uLTGc5/VVAff+hf5e8k+Y/O3mKTVby2e1027na5urplKIVduRSGu7eAI6d8YwMjadL2fl1mU zkKhI2T+p4x5RlVb6WM7F46r/sSMztaPSC5vbcCcYPcWQatZNe2EluhCu1CpPSoIO+YOHJwSBdFo tQMWUTPJKtB0K8s7w3FxxAClVANSScydRqIyjQdn2l2jjy4+GF80+mhSaGSF6hJFKMR1owoaZhxl RBdNinwTEu42nv5Pfk3rt/5l0vzC1za/onS7yO4mKSMZjJbsJET0+IIJYL1NKeObX8xGUdnvdBkj nAnHk+o9Rv7bTtPur+6bhbWkTzzOeyRqWY/cMpAdqTT5g/5xZkMn5j6nI1Az6VOxAFBU3VudhmTm 5OHpvq+D6nzGc145/wA5N+cH0nyfBoVu5W51yQrKR1FtBxaQf7JmUfKuXYY2bcfUToV3s0/KXyuv lr8v9I04rS5eEXN4e5muP3jg/wCryCfRkJmy2Yo1EBIv+cidEvdV/LO7NnG0slhPFePGgLMY0qjk AfyrJyPsMOI1JjnFxfMP5debbjyl5x0/XILY3hgZ0e0U8TKsyGMqDRt/iqNuuZM42KcLHLhNs/8A z185eZ9b0Py/b6/pY0W6llurxdP5FpBbnhHbvIGAZX/vQQQPGg6ZXjiATTbmmSBeyc/k/wCc9A/L 38rr3WtTcPqOrXcp0ywSvqTrbosa/wCqgkL8mP4nbBkiZSplimIRsvMvKflnX/zH88MlGkkvrhrr VrxR8EUcjlpXPYdSEHjQZZIiIaYxM5PTv+crdSijuvLmgwUSO2gluWiHQK5WKL7vScDK8I5lu1J5 Bv8AKnzxoX5dflLPqd8yy6trF1PPpmnr/eTLEFgUtT7MayRvVj9FTtjOJlJcUxCFvM/IvlLW/wAw /O4jZWkS4uDd61eUIWOOSQvKxP8AM+4Udz9OWSkIhphEzk9A/PT8zPzB0fz3LpGnXc2j6ZYpC1ik FEEysgYyM1PjXlVeP2RSlK1yGOAIbc2SQlTDPzI17R/Ocnl/V9NiZ/Nd9bmDzDZwRP8AFcwlUikU AUZpVrstaAAdclAVfc15JCVEc30R+W/5e3ll+UcXljW6xXV7HNJPGaN6DTuXjA/yk+FiP5q5jZqk S3ZNMMmE45fxB4pq2k6z5b1k2t0jW19aOHikWorxNUkjbuNqg5riCC+eZsOTT5OGW0o/iwz+3/Pb zTLax2kOmwT6k1EWZRI3NugIhU/aPsae2W+OXdx9o85iIiIM/j9zLfJfk/zTcW2q6p5mvpRfa3bP bfUmPwxpItAzp9lWH7Kj7Ir40FkIHcnq7TQaHPITnmkeLJGq7r/HLo8ThOo+W/McTzwlL7S7lJGh aoq0ThqV/lanXwzG5F5CPHp8wseqEvuen3nmbU/zPurbQNMtJLHRUdJtXumYMeKmoXYcev2R3NDs Bl5kZ7Dk9Fk1c+0ZDFAGOPnI/j7EX+eugSHQNJurOI/VNKZ4HRBtHHKqBCfBR6QX6cOeOwbfaLTH woSiPTDb3A1+ph35ZfmBL5aS9sY9Ok1Ga+eM2sMJo3qgFaUAYnlUdBlePJwuq7I7TOnEoiJmZcq7 2Gao9zJqd490hjunnkaeM9VkLksv0HKjzdRmJMyZc7NvYvN0mr+efIM17Bo0tithcR3NjEx5PPAI yrlFAU7cuXTcDbMidyjyer1pyazSmQgY8JseYp59+XPmvTPLetPc6nZi7tJU4EhEeSJwQVdA9B7H fKscgDu6PsvWw0+S5x4on5h7D5e/MTUvM2swx6Jo8g0RCfr2o3Z4U2NBGFLLyrTap+jrmRHIZHYb PVaXtSeoyAY4Hw+sj+h8XW88tvMk0TcZENVObKURIUU5ccZxMZciyqz812UiAXKmGTuQCy/RTfNb PRyHLd5rP2NkifR6h8iryeZtHVarKXP8qo1f+GAGQGkydzRHsnUE7iviFO0806ZMxWctbUJo7gsp ApT7AZqnwp9OTlopDlu5GTsTIB6SD9j2X8sfzP8Ayz8p+X5xf68Jb28k9VreG2um4BQFVamJRy7n emWYtPKI3eg7H0/5bGRM+qRYd+bv5/zearGTQdAgkstGlNLu4moJ7gA1CcVJCJUVO5J9twcqGKty 5+XPxbDk3/zir/5MLUP+2RN/1E2+Obkum+r4PqnMZzkJqWkaTqkSw6lZQX0KMHSO5iSZQw3DAOGF cINIIB5osAAUHTAl2KpdaeW/LtldteWel2dteOSXuYYIo5CSKGrqobDZQIh8p/8AOSOrG+/NG7t6 1TTba3tVINRunrn/AIacjMnEPS4OoNye5/lf5I8tX/5V+WoNY0u01HjbNPE1zCkrJ9ZkaduDMCVr yFaHKZyPEXJxwBiLZ7pGh6No1r9V0mxgsLatTFbRpEpPiQoFT7nIEktoiByfJH/OROqtf/mnqMda x2EUFpGfYRiRh9DytmViHpcDObk+gPy78jeWb/8ALHyxDrOk2l+VsY5omuIY5WUXP788WYErX1N6 HKJSPEacrHAGIsM40nRdH0e0FppVlBYWoNfRto1iSviQgFT75Am20ADks1fQNC1mEQ6vp1tqES14 JdQpMFJ7rzDUPyxBIUxB5qOkeU/K+jNy0jSLOwehBktoI4nIPWrKoY4mRKBEDkE1wMkJqOkaVqcQ i1GzhvIx9lZ41kAJ7jkDTAQDzasuCGQVOIl7wp6b5f0LTCTp2n21oxFC8MSIxHuygE4iIHJji02L H9EYx9wR+FvS/U/LugaqyvqWnW95Igokk0SOwHgGIrTAYg82jNpcWT64iXvCKs7GysYBb2VvFawL usMKLGgr4KoAxApsx44wFRAA8lSSOOWNo5UDxuCrowBUg7EEHrhZEAiigdO8vaDpkjSadp1taSPX k8MSRsa9qqAae2ARA5NOLS4sZuEYx9wWy+WvLst+dQl0y1kviam5aGMyE+PIitffBwhB0mIy4zGP F30EyyTkJRP5P8qXF0bufR7OW4Y1aR4IyWPi1Rufc5HgHc4stDglLiMIk+4JrFDFDGsUKLHEgoiI AqgeAA2yTkxiAKHJ8z63/wA4qeZxqc50TVLF9NZibcXbTRzKpNQrCOKVTx6Vrv4DMkZh1cQ6Y3sg P+hVfzC/6uGkf8jrn/snx8YMfy0vJ3/Qqv5hf9XDSP8Akdc/9k+PjBfy0vJ3/Qqv5hf9XDSP+R1z /wBk+PjBfy0vJ3/Qqv5hf9XDSP8Akdc/9k+PjBfy0vJ3/Qqv5hf9XDSP+R1z/wBk+PjBfy0vJ6j+ Sv5K3fkW7vNV1W8iutUuovqscdryMMcJZXb4nVGZmZF/ZFKd67V5MnE34cPDuXrGVN7sVdirsVdi ryjzV/zjv5c8zebL3zBqGp3kf15leS2gES0KoqbOyv8Ay+GWxykCmiWAE29K0TSLPRtHstJsgwtL CFLeDmeTcI1CgsdqnbfKybbgKFI3Al5L5j/5xy8s+YfNN9r1/qd6ov5PWktYPSSjEAUDsr7beGWj KQKaJacE29Q0nTbXS9Ls9MtARa2MEdtbhjUiOFAiVPc8Vysm24ChSKwJdirsVdirsVdirsVdirsV dirsVdirsVdirsVf/9k= + + + + uuid:9cdc0941-436d-4643-ba07-94d58218b87b + xmp.did:cffae184-2f57-864b-a539-5245c8d5eb79 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + uuid:87d7cc42-d24f-554d-97c7-b76979e61089 + xmp.did:68099ade-e32b-42d3-94ec-ef546c954f1c + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:cffae184-2f57-864b-a539-5245c8d5eb79 + 2024-12-17T09:33:25+06:00 + Adobe Illustrator 29.1 (Windows) + / + + + + Document + Print + AIRobin + False + False + 1 + + 5.000000 + 1.500000 + Inches + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + CMYK Red + RGB + PROCESS + 237 + 28 + 36 + + + CMYK Yellow + RGB + PROCESS + 255 + 242 + 0 + + + CMYK Green + RGB + PROCESS + 0 + 166 + 81 + + + CMYK Cyan + RGB + PROCESS + 0 + 174 + 239 + + + CMYK Blue + RGB + PROCESS + 46 + 49 + 146 + + + CMYK Magenta + RGB + PROCESS + 236 + 0 + 140 + + + C=15 M=100 Y=90 K=10 + RGB + PROCESS + 190 + 30 + 45 + + + C=0 M=90 Y=85 K=0 + RGB + PROCESS + 239 + 65 + 54 + + + C=0 M=80 Y=95 K=0 + RGB + PROCESS + 241 + 90 + 41 + + + C=0 M=50 Y=100 K=0 + RGB + PROCESS + 247 + 148 + 29 + + + C=0 M=35 Y=85 K=0 + RGB + PROCESS + 251 + 176 + 64 + + + C=5 M=0 Y=90 K=0 + RGB + PROCESS + 249 + 237 + 50 + + + C=20 M=0 Y=100 K=0 + RGB + PROCESS + 215 + 223 + 35 + + + C=50 M=0 Y=100 K=0 + RGB + PROCESS + 141 + 198 + 63 + + + C=75 M=0 Y=100 K=0 + RGB + PROCESS + 57 + 181 + 74 + + + C=85 M=10 Y=100 K=10 + RGB + PROCESS + 0 + 148 + 68 + + + C=90 M=30 Y=95 K=30 + RGB + PROCESS + 0 + 104 + 56 + + + C=75 M=0 Y=75 K=0 + RGB + PROCESS + 43 + 182 + 115 + + + C=80 M=10 Y=45 K=0 + RGB + PROCESS + 0 + 167 + 157 + + + C=70 M=15 Y=0 K=0 + RGB + PROCESS + 39 + 170 + 225 + + + C=85 M=50 Y=0 K=0 + RGB + PROCESS + 28 + 117 + 188 + + + C=100 M=95 Y=5 K=0 + RGB + PROCESS + 43 + 57 + 144 + + + C=100 M=100 Y=25 K=25 + RGB + PROCESS + 38 + 34 + 98 + + + C=75 M=100 Y=0 K=0 + RGB + PROCESS + 102 + 45 + 145 + + + C=50 M=100 Y=0 K=0 + RGB + PROCESS + 146 + 39 + 143 + + + C=35 M=100 Y=35 K=10 + RGB + PROCESS + 158 + 31 + 99 + + + C=10 M=100 Y=50 K=0 + RGB + PROCESS + 218 + 28 + 92 + + + C=0 M=95 Y=20 K=0 + RGB + PROCESS + 238 + 42 + 123 + + + C=25 M=25 Y=40 K=0 + RGB + PROCESS + 194 + 181 + 155 + + + C=40 M=45 Y=50 K=5 + RGB + PROCESS + 155 + 133 + 121 + + + C=50 M=50 Y=60 K=25 + RGB + PROCESS + 114 + 102 + 88 + + + C=55 M=60 Y=65 K=40 + RGB + PROCESS + 89 + 74 + 66 + + + C=25 M=40 Y=65 K=0 + RGB + PROCESS + 196 + 154 + 108 + + + C=30 M=50 Y=75 K=10 + RGB + PROCESS + 169 + 124 + 80 + + + C=35 M=60 Y=80 K=25 + RGB + PROCESS + 139 + 94 + 60 + + + C=40 M=65 Y=90 K=35 + RGB + PROCESS + 117 + 76 + 41 + + + C=40 M=70 Y=100 K=50 + RGB + PROCESS + 96 + 57 + 19 + + + C=50 M=70 Y=80 K=70 + RGB + PROCESS + 60 + 36 + 21 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + RGB + PROCESS + 35 + 31 + 32 + + + C=0 M=0 Y=0 K=90 + RGB + PROCESS + 65 + 64 + 66 + + + C=0 M=0 Y=0 K=80 + RGB + PROCESS + 88 + 89 + 91 + + + C=0 M=0 Y=0 K=70 + RGB + PROCESS + 109 + 110 + 113 + + + C=0 M=0 Y=0 K=60 + RGB + PROCESS + 128 + 130 + 133 + + + C=0 M=0 Y=0 K=50 + RGB + PROCESS + 147 + 149 + 152 + + + C=0 M=0 Y=0 K=40 + RGB + PROCESS + 167 + 169 + 172 + + + C=0 M=0 Y=0 K=30 + RGB + PROCESS + 188 + 190 + 192 + + + C=0 M=0 Y=0 K=20 + RGB + PROCESS + 209 + 211 + 212 + + + C=0 M=0 Y=0 K=10 + RGB + PROCESS + 230 + 231 + 232 + + + C=0 M=0 Y=0 K=5 + RGB + PROCESS + 241 + 242 + 242 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + RGB + PROCESS + 237 + 28 + 36 + + + C=0 M=75 Y=100 K=0 + RGB + PROCESS + 242 + 101 + 34 + + + C=0 M=10 Y=95 K=0 + RGB + PROCESS + 255 + 222 + 23 + + + C=85 M=10 Y=100 K=0 + RGB + PROCESS + 0 + 161 + 75 + + + C=100 M=90 Y=0 K=0 + RGB + PROCESS + 33 + 64 + 154 + + + C=60 M=90 Y=0 K=0 + RGB + PROCESS + 127 + 63 + 152 + + + + + + + Adobe PDF library 17.00 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 5 0 obj <>/ExtGState<>/Properties<>>>/Thumb 29 0 R/TrimBox[0.0 0.0 360.0 108.0]/Type/Page/PieceInfo<>>> endobj 26 0 obj <>stream +H\WK% ܿS*GI}n^Pg38"|6~T*S" ˷?kzjuh_~v}w\׏O<ˮvYw~ev^5oq}?Gm==h/u}`oC;p^OeJZˍ{m~?X>x9qZU;i-q +U'm^۽ˎ1e4k㹛LMWJ/ߵޮ({-+y )t9; 8vd([ܖ{~r; jw]#(Ͻ~[Ga[L3Tcā}{D!N'ހ'Uc1, {f̠#" +yDp 9`!> S OGatN+pxh`箪z: $` |q{|>@v;ֶl Bp@u Kq!x.A~"}1"| $j!dOÉHV~~Ud#B6y3A n2…MlGYwVIH)x*{m[f*{őlgK z(SsWY|+_zϵ0E +e'(|E8dC>rOC$V??.JQA- 2OxWkAHYu(YOc7tE# MPJf[(J'iLIԻ!廊^/Y7Z~?4$.1fIW|ܬ|ύ\d:0W'E 奔6]2։?)u屩n>Um mHڱvܺ2X&>(˚N=An|K9awč*N)La'Cv'E}BFA˴'e )u]V0(;ܣIqC +(Ybq01MiTDȻ 4"VLRuqAAWς^cyJZͼԕ.kZ#v93+!gx5td yHL o.ΞM981[4[!8<Ě[9A{쥆J\ڬU҆&I%z[z*Z!nf&4K\9sH^PVXTŠ4#DyFA'T:5)`?SA[*z{uvkET*QZ֪k!'K!O5fhc{09٥H=L|]9Cp|?OyO>BXaoM󥍬Lvc0ɽBXC(*PDͩIJ~m%lSjgWbA^濾}zx |=மBGp } 6@XG5"`Ks?AsX8R*kg/!^GѡطR')N[VJ-o6 +:>TL;R'yq yjƔۨԤjH7Cx%DV jwϛLT#Ǚ`4Y'G\Q"?Y$B@gvmhmF +1ʙj% +D)%w ]%S*ybC)'GArL#iTNV^8X#LS\vgQ +g=&ǙzLDkbmJ-8ڔaTǾEa{?F|?kjaB#UL2$Gn e1ٝ#&vs +}pi+Շt_P Rѐ![eT"vg -0z;Ck+X3]rd'y >[fr-2'Zd%vMIթtQkhgdnv$g@x_xpx+%@J]vtD@'0ͽF9[ٟC"cPվ*a}58竣bzՙP7/x(@L+Wn"ex ҈^m=2qr3$:te=JM=DBFղWUx ]'Wk٣ڒxP{oEOASwJB ;S}*u3:pi-PE0,qJamvɨZG[P>٨3Y`RE٫p8sciuh*bo>mT$ Si7RW~mѢU ;2w9D>Eik;N5,aۃ[e_7-X^kyP[ʡ~Q{FgnfeV +mA/ SW;2VI +h8L\n +#OYR0K5Zpv2:YH潻l里Ju%D<qVԚ+wj4%VX 8)ԓt`h2DspQgϡBmHzF˓,h`/3s#rhUc[ uuCX7@ӦD1k2Ce4-;:V@2+ 䭌]$0$ )-u{݄CA=t eJذИGK|eBʾVm2ѓh]Z HM}~p( 5!mJd-;0D xnwx\-O*y/0}Xa!x7n 1#l:8 ޽ \cĦx>UEIn*kغӜh0~b(.Ē Ry=x"ࢮq~%Fka{%6zZ;1GU[a 0ph+ܓbe/(qs#ja'Cq C_qt: zޠ05R +PSL +DZ?_3<ɻ3 +q^ TV-!d}HfDGզl4WϏGlwz?v4s#  +v(56s΀;;Odc{~\ UhϜ;ΘQی.H`UU +-i sFh$NKH>}c!p`}~Wuq  pƩ=A@gKU/JO]0 F':=4"k΅)s*>)J[r|[Fkveӈ/:0b`'#冲@[pryJ[,YD8F/An@*(t05KGwhs+?TAdm3 c9!b ȸ;*52c '[.m7nX4L%\nAԵַyCu0auYB?Sl#/G0IĿ3쭅9KNLJ-*v= +[,YK1}  :XL1ZdC2n[Q +'#r ¶%p[ﻖ*[|i<y3I3'ъ_ϳ3GhP9FHbQ=F\G?+%_Y((OQ̱"|8ứRo[iPTkm{,)Š3D+n*TGp/dCd,/hrn mD P풢nKEY Rw5%jރ#j>>$AnTGE?(KJ| ~K^BX%[pj Pn&COZ!N fP֥wGaD~3r>*ĆkSn .8pECGId\ܢTچ0sybBfʽH$Nn|4R[+ }r$[*]RX_4:Akw-ASGT&1DKkr + Q;@|ۮcf@neѨem(`7 o΢SA4K跴+H2AFy"Vs[:_N(xa4 wb0~A" s[R@-O\% x) kȈ5q{l=u8U*LZő+Ƙ&[# GEH2W<r-OlىTM+Ѣpdzm3f|匋{54 !q "+yQFϡg w襦M'czrcgR8^"nzMG]~@}UK_/ż\&a"x}2y.d56?xHRb,FbUӓbPB~4x*##G7i÷jgSN6Gp^euE:wey;fx\| Aooy|ɍf-KN]B&z mB˒L+ 1h޴ u?ʵ?pv^Qn˻9 MMVjEy͜ސ{tnis4g$&<[@s/.E(1 s;'nbB0<߿V!ʟe6J34JaZ1/UUJB,_^E(I B5w*5柎IA1ȳމ)d hR2KKSKYԱNʟ6ECHވ+cQ P!7m%I9.KPDZ0",hThO4XExġxEUMTޕԿ,.(J}Mb_tvuiSњf.BE޹p:5HE>s)G&tG/xK\7DZ5{S/ꒆ&ɜ`BtةH;n^Sj⛝&+X%z%A^DTHިc* 4[[SD-j,JS MV=ճv8&5Lrӭ$TТll%qhAX6tϖ|H&X䣰Y!4[4 r@ &;4mqa +E!*tCCQ@0 ICȭHj#4CQS sH!KrkwME%l1b,w;]&G lM)&)dڳl[ b+D7jU >n£84Uzeʸ!7$۶ n3o>!vDA]R r}N[,ƔC +Nbi'];v!X׽aWRrMzHGi a6|%=_?:Xw>^kLe2Su6 ?N2Em$ ^0Uސ{ +C4Uv.j)yiP_sqΔBݽzX[JL-]+mgW"֔ Ť,.Q.e(lCCMb> UHUX` Ymtzhxmxm/,\K۸myv5yϿnT +endstream endobj 29 0 obj <>stream +8;Y!@0bVAX#R&=t!*&fHNJ-DYS(R-'][5W+RF +jgnlf0u +N]SIL;Z3^l[Y-O^I7eW7)J>N0l(8QcrYmKj!!*'!!!!$!rrW8-5XrH~> +endstream endobj 8 0 obj <> endobj 9 0 obj <> endobj 10 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 24.0 +%%AI8_CreatorVersion: 29.1.0 +%%For: (Mohin Uddin) () +%%Title: (Untitled-4) +%%CreationDate: 12/17/2024 9:33 AM +%%Canvassize: 16383 +%%BoundingBox: 20 -87 340 -21 +%%HiResBoundingBox: 20.782799999999 -86.847601647185 339.217200000001 -21.152398352815 +%%DocumentProcessColors: Cyan Magenta Yellow Black +%AI5_FileFormat 14.0 +%AI12_BuildNumber: 142 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%RGBProcessColor: 0 0 0 ([Registration]) +%AI3_Cropmarks: 0 -108 360 0 +%AI3_TemplateBox: 180.5 -54.5 180.5 -54.5 +%AI3_TileBox: -216 -360 576 252 +%AI3_DocumentPreview: None +%AI5_ArtSize: 14400 14400 +%AI5_RulerUnits: 0 +%AI24_LargeCanvasScale: 1 +%AI9_ColorModel: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI17_Begin_Content_if_version_gt:24 4 +%AI10_OpenToVie: -115.705882352942 116.764705882354 2.83333333333333 0 8179.05882352941 8182.76470588235 1616 906 18 0 0 -1874 121 0 0 0 1 1 0 1 1 0 0 +%AI17_Alternate_Content +%AI9_OpenToView: -115.705882352942 116.764705882354 2.83333333333333 1616 906 18 0 0 -1874 121 0 0 0 1 1 0 1 1 0 0 +%AI17_End_Versioned_Content +%AI5_OpenViewLayers: 7 +%AI17_Begin_Content_if_version_gt:24 4 +%AI17_Alternate_Content +%AI17_End_Versioned_Content +%%PageOrigin:-126 -450 +%AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MS +%%EndComments + +endstream endobj 11 0 obj <>stream +%AI24_ZStandard_Data(/Xl^m .4mT8xQ{f:&%7Wn`">[ %QHbbaPa`G( +%IRfeLH"YIbar;'YU") 'WYpI\qƑc r, Yǂ, L($la+8ś0_;J/0%̳DW 0#y%Y Kؒ4!F[XkZ_2Ȥvޓ<Q]E5M."՝Y3CFw*֦mZoC 3PFvL]"츏Ē YPP<;M$%Ȓ,V,KXH +0 +0k90RHYa8Qȱ2AxHTҲξw W(aBZ 8)%!ū_ЉJ\≣;BM+.fW$S%QaGr24C!geejjKMQk2zFa +>xc%_De;u;9vM}% ?S+;Ѧ՞C3t)]C/T\ƺ"$N{Qgaz$HXQʢF +M1'D$JrhW "ȑ#X"v,Z&(EIKy-,I vOyPB %.ta'^^Mmx ,]ҙHkxmtԱ/.nX:Ꞻ +钓zg4}Ȝ!jn-mĭ!sxtK]ûC(XM0S +0TW PSl1+$9d#A$QȰ06!#$DBAdDb$q(qht(Ka^KI' Xa I!N3rnږ0 x.F% A|a,_ + &GZ +ÈPW!eB( 8C-$[^JJSZ +|%0 *("%GA^"aed] $  u4Ffcwwf+1Tvx>Qhz0;Y] +CѕkF|/+!36р!"ABCL(0 X@RuVwN htCM,B2CD{-oEv=CFuO 6TwzD]R^!StVT:\;|zh֚(US޵F˪Cvuhi=dPӎ'#":dC_!yPo27IvEIa(2Q^F0+VPQ+Z*Qd6[ -Mm0R=+ DDQZx[ $X(D%,QD%.AeACRr(0~VXB,}YaTQ:L^H!:hIIo1II7a)bG̬0ldZJ:jK+ ueUJxĈi}eJ0 +@뭵l.[Gv<8C9#qbC9H",r  + 'XrL2+ L#Q%\redQe%'D&6 KBID@H"Ih4J&y&楥0 .&"W>u?q)qzy;;b!VeV(.` +.@Jg3SsH$\2R+jꡈ& UB.K$" r!8#98;cYeEvW{kM0 +paq - C.9Kݯ|^?< R{ )ƕQIE\ +/RK-^hI((( +*WN) +),$ &`ĒJP@DA0 +P( $@JB£; +7d +$8,@4 â v y 2e1 +~0ȫ<_;TUJTCVC.T:kfCAu`6KT`p@0( Cg&Ձ2t05 *,\రØEjM  CCsaBDC 00Lhx!B <,CgDP!T se8 +L 1@F2EC.$fYy2Kt.̻cgSQm4)<íʟ5S3h7IK2Mu?+1{R_&gK4]Unjz霶izʮY>ܞ1җ~VhSkBK23/j,U=wKMtMV*U)J۪O-J:3rR+uEWo0k>1O+ײp6W9ѻ[kz{dUg#aaCC +"2 /*л4U=yаHЎyHGNYY.1]r:14ǣKǯ\›jRmVk?{ YꓥRr0莅,(SH,HzݖXIJdYF@B]ȗAQ\ҡ?fNJhRave;V|_9M+t?-`rF]T#Ci)MR ,PnUgjjefިVR̛GtEh;}҉Ek>Jrr*Ir RwL%qVN6dhb0mI'Y[baYE¸LOZ X ͦHVXXIŧ)#qo&db{:M I\ala--+:|*vʻefJF5=L峵~ +>LX(Ka~,XJ0KDR)3ST D#Haj + v.rLc/WRMZߚqQW{nQNV%{ܡX0KKl-=S0Dza$Z )$H7Jqg0RT3AS_raeѦC610k O}MKaPa]a`{$ zadaƁ$Ҙ,&T&wlau BQvqRH*GbqW +LDӯ +GJa$E90"hČXya$ SL]Ni r0%A48yGG.yH +B_CuD:jmLt>!HghDshlv;d(wSkLpsޛl2XyHg.ff̠qa,]aɒp.ia(qVIa\q)I,  $ Hr ÈHʡǑ?~"Hna)-0eIJH~\:iqʬlg[4XTR,%=E',ՃFѵkH>ˉ[Zgx6gDt2[;u- Q'[\[?t6MD۵wpK&KC.["Ž)LxAbjiEWQhuZk3>kSּ[Wݩ6[*c뤼M]3чwޅHK_ٹu{jIEߛ|r}T=ezkǟ]cYoOtzUyk.Y2x{<}OQ%]_kqo׻NtUE<_C뢣^OϪӻTU㺎E=WZwTm[_頺𾆄gw4ަ{\MyGyjڥ(f._g%2=x΢tflڭ#.C7q~poųgڪtQKڲTݒq53!wt{u=v6q3=6V;u*u}^m=/1\I=bJGᖓΝvYy'e\߱tU6)զ!ӳYq2OqVQ.L{tg۩[xlZl艋7,'-d{ZG.-:UOo6Uo빤I{L;vYj_e/TMSF\u.ձ]Fu'buV>#M3Hidc?I=?^ܣ5x]WoTm=ޫleDq[hnRu˧LQyyuեTC}BD/jIyR՝j +T}~FYtrOzu;SToPQvG,Q*Ah jn; U{|_{j^GnkHoo3=\=ttWܺڋN Yզ:5ԫ/j| VըJ΃wM;;«!Yk^qOFYO޽ϴznzB_dVBE=/>tyl.˄v~OYT|".RNT;c>ޢ}zJ'zOUgAVdFu.\}3wSJ֞#!E=?'C%M:uR"2[}כVR]CbUox2GԩT⡗{Nj?e] iO1O79u;7c<-3c{4xDӮЙͤV;7By)?{gFsX?ySZCFFv(-:}5HR"4KjG ꩒ޤؙ{ꛋvmvg>eut̙̻"A]/ O2*:Oٖ9T[MNhEUiZ,d1UTIu|wUl^jKpLXIdZfuLK+JBpF;ӝ4^EXf&Η{~'5GQZ^C$ųиVWf-"[m]q F%ucg:Ips+b%SZYe'j*\)$$ik{jm}Ft{r۫:-UR(}mmm@:ڤE;{Cc:|tE_)ɒ(N}0StvUV>OYKғQ%+sxzx\L:;,]<9,cܼC+eޱȇfiidmދmR⮍d:TóStQʸyjUE+\$#OiuUwR|-Rr +fu>DS Αm?(W^9117٣K³G7զ}w&яs|LU'3kOn+qNVU]{%=/t՞q|IgxE-~ZwH2#{Su՚GQ }y#^j[kw|!&dT_I}jļ]*\=XΕ[L=fe[Uv +IvkUE[U6ҫ[󞒥u'C[ZrRooiLK:j|o/ٝ|NR4j[ghT̥[RED-uWLW!Ϣnͻ:KEc*SlGjg~{KVD=Fe[KSosQ]ֵdWi[EwSWXҪ\UWSEgtETyyW2VWuT7 +[Uk_SkUҩY֚sJ#"/OTz[=Mn}Ke[ךRڕW{UJgej{\f\oh{B+ibZ?ˢ3.{Tdw׳gtf1N)m]SXS-*W=pdc5y NқwMIDe1oZZ>o{eD[He4׍ߢR]awNkU*+۲A\4[fVk]2ʖm1*ۮV2*.Ӝi3owweY1k.weuIJM;0Huаn"<4Uq`f:0F+j%: ½KͭcZ7q eeϖLz⭡R!²{iٱPgWOJ۫v+}Jmo+.wUtkN[]YVv[jkMjutʂ8D`X`*H^阾{tLrhx{ʆǼw)}>:,JgRmĥ?kvݴôOӾڒ1x~Dz%;IDHxK:[2E\3͉2lSfDGh{H{[h=kIƳR=onD{2e)R&ϻEԈIct;͟vh[zh{g[<̩K״FǶinJGmQw`m73M|rLvV4/iDC=VV7ΫE4ӗefk>Y^M,} Zě"ZWBcWfvЧ!v kFvV;y|K;feh+}{\uV[\3TFx;S=VeL׻1Ao UU +P2";YIuHOiҎ׬mrd5,:E4sչiuǮ\:Y2k/Y[)%^ϭ*W‘j[yjL(Ϯ|j]OkKZTWsMKsGՓz +p'aTOu11t斆EIE˳tT30V^V/ONqPIq\zeuʥxHR>/7Kei3[˃TjәND)K0W'ԹS섄&a Y c݂oGǸvQݬF1ѽΧ8wl\%74ĄpS;V`c_η1(ٌRtvFćd25oA`KbE<ĉbӺ3e3,%+O*yd($@ZG`b7"V,34+) r~§D?@DavZA*ukMC=ڏ>+$-v']mOKߗ#f%%׸ >zEg +%zǬ%P[{9NCnZP q >GiQD0`2io5$'߿Icԏ?DQޫq⡱w%ujឝߨ=,?[o8# WhUw!bCIgCfqZAq#5k'$dK idt-P#@0ZqU` {I~1 +1*! &(+NJWH,Z.T`>2 IgNsl\3ho,ڢ~.i- 2zBJMdҦ$"i)0e ^L.mӵZ0Yگt_%Pw5})-+؁ILBI:y^%u9IZi3OԿ|!Ac90Ar1Iq91<q7(GT6M_K ^!|#1:_6*:X!A>H "ͨϴ>;[7lyC[YN_KP*y-̸;B`:E2q p?j G]W?j2S +D5k;0p%9f + M@n{|hC16s\;kT1l@4c^L&<όGa[]25c8zbŎ*J]M^ Lޓw8Q;+wEq]&˜%U9XFViG+Y*)¡sJ-WF,Ze<4~dQ'V0~M䘈fC4R aBHS#4&K>,YGOt  +IРTdZ=cz2ftIxCٙՌE:)Kt78Kf8隫ЃL;mtN1=am#YeB>)! VZWP6]>\4wJ~kP]A@^ EDT!׋<;‡·qd٦DIf<Ջʇ{w닕hf*ndp*4WR?7S(GYa%HW'9|~Af.##t 6Gpmpio &j.4flK#zD^+9g&Qj\|rx)J:2您MQ +}Bə)Է3E߼3E-DqQ) zDCZN_լk+9L8Ye[[0WDD%eqk#^(4D'+ӥN:xtMQe:e֚k‰v$J12EjŁ{["?0AS(;Y% *^[ز=3tL4zEĈI )``虜ơq3-šNS uyR9to UNCa6M2A8VjޅCgX4 TCسENe1QeW݀%IQCkf$1 Rz>dʻ)' W{2a^׾f+ڤM:@%$ߤ /28; "(- 0օt3]t)xi#$*0:̳&6)mid^% NJOB|R*٬yR&xJJ)hCJ ]y#ɝ:)^G`Hi(ёRL +ݨG)9J?(-`O*jM|Z'r#}RUExd7FU*B&x؏ +#jU9F*NdQd4Awz7"͙fUJsZhS hb!7ܺvS:r\2GenR^y9ت);ah:a.C2*9ekF(ڰ3ispa.6M@*sf2E %ss͉^ss|n `uqsF|lsfQ9kkڹ9^n.J[<) >Ed*#D#KEJ?qR[FY|A:*;!z!7FۡK;3vZ2a> .ܖ J׿f`*fYXʌm&!=O2 q[NGgM(b`.mNJs1'N; #eK| +l$+i чP(V |ԏ#Ć.1T3G(|hd6URȅ2 Jn%?p"芹QT:p '&N&ܢ:#]حlMbChĕgԺ·L6+sߗ5cԧjvY8A G8+9[TUL2 G9COm@ŀL/N) !DE]tx!Pc΢/B aXbV?-kҴLnʣҾa`M~>Wȥj:eijLx6b=b,<(^Fg:S&Xg:0"8ϟf +4-Prm,X./C=UzP46bAXU b @ zX}ru9-G~oq]G]0g$T, z [C#8Cΐ#Nm¹tm(6ZC{dH?Tk슄w pD8(s7UHN]Òh/vɴ/ʯ Z־>[@#Bč{O0h=?\%ܒ<uFEzY`+*iH'!xˑO_#XS6]f!4a6BnF RH'XjkULuY(h2LT}e$Vvx:*X r!-'$ЎmGɚk?{ yr>>`hCö'[ǹ]U( eb7/ECmZ6d32U^yf[TJtŢ6CHs~J-9P-{ g&CJpW+ى H63#̜OA燿L.XL'(wf~e2Hri%g$6Caց:Ac %AtH@ +LD?%3PJ+?!}]uƐgW٫wR6ǀMUe 7-fxH.r0*w9/6PLPCƱc,nviSH{'نV1!FsM5Jg/lQ#Yla! ($+^XC_б$|=чwH4owтc~ X*tPTAd"ΉD1ҮaU]ALU! c_yž3/WXx^㯞hXݏ6ZRg8Uyznti<1X<,Inws=ahBςb|sIQ'<.'U}jبx$?LF`ذ<0]!Œ{Z ݑMQ#8Ɛ HH1"ifBޡaA4o#[t txB  +Hk"-zۓ a-,aJg땒LoR@ @1sy};qw0M}=wڛT0껽N += u4vt6y)I&G;u~⼕Rkw į?1֠YIwޝCu=Mfm%f>]J3PNV|p%b$ ITX^*,j<ٍ.Ӫs%'i2b<9fv>5irFMva禢f-*8͸™ւl1|J[Vw"퇗֔@läb "#ejYkv$iw|jp@T`XjC=qB2+X:By 2\'=x IȆ) A9"PAHGP=U~Dq\uAb$42[|6؄>䌹%ڔ^ѻe .OM-nJPbO8HGW.fu2}h%eryiTRE %?C.<\M>?< *` (3ڦA7!9R!~qLKPJK>4._Qi(%U0Pq6QkyNpsDCz:)2\Zp8.sa@VyM1(~"~0Mޔ`?[t聄OCk1/ؖD[ˎ] 5Ulr$g@y0%UH2\lipL*GtQ5eo>m͍loD+Md28|Q÷J4M( +HГ{S$hBw|a.1 }%'\>6'H|8DPёY#V'u2[=W=]}FPt9/}%%adYGS%5ýh BɷXhNS([ 0sf-Nמ+δ;bv[yAX?XʏH|d!&o(Yz76:y`x?t8fS,#'0$Q? o@|0i4~>%iAZ ۄo ςa59l\ Ct؆{״/#h +(SX:ɛe>n7k']bҭJ!U/72<'&p4JjP`6Dٴ|^.f!pFV?8KofH,,׋v [~cE` w/\%*+@kғ&O]`eüc+Ӌ_ʣ]*?7$_3(+Kz eЍ9)XPp3ޡ|ꍃy*+ U:}'kf`X6h>'7::(˵^}X]aU""کO +zDa>u_w]wSYBݦzDG8m]~.%Y*^#RHU>/9Q|^:#ıݢ:F1sCv8zi-Te=: 0QB6v:Ej5Đ ~2%ZVG])oM5zƥ@_K6n}.Vdn(;RH.`zQ\I@-V@ʵm WmqwEt+n?l+u79G??\MHk$tWVվY9{uP鶜>I#xXII w{h~4k/0fإ7a." 2S<8b5}Rr@*9j"x\4DiO֣3&xP3Q20tf"&jyjV2^_P Fx`9(] xGP@P*tW U=~0'N%gʑH87!(uI8tଳuB,gSl,9q6*=6Bzbl,6Քƚ&L_`tV+_Nbye +V|g\}  m8΍֪9խ_QWllO}ĚE{&j-v}RHɘ,8] 90CVU?zhZC(3P ]8誵nWi֋qީihSZ3gIv(VX(s,5Q1 VjJ a7j}\A,[?Z*/{[ IY!3,mV=s>Ή^rQ%@-Կu1 ue0Q(n(fI>,w {oԣ `+`{?Ԟ,q~\J(`Z;^._ŝZ9U>Dh4hu|TH;hyC)g$JzX^z1x5ADzHoi\yo$ qm(ϊc+X!tAgFnҠIqqĭTQȐ~]<$ [[0Y_ݝ渮Yr"G籤OvtC,enU E $PgM-jDm4}ѡ/]`yP`g + +Zf|tXA P@F"0mUM~bK`~pv(b90&oV! +L_9~~Hxk7_LA7}={5OV@x68ST`, ~m8G.pdm_W"Ye= +t/7'D<$[ޖ wc}ޢly ca)kX{@uEEw Q' +VA8E|'; TpマQ-u-ٕ C{|}9kiE\d9"ϳAhч}X`&8YK& =6C;]"C B^fϮ9Xyz )~L6L5eUS7m F[aPyVzwPiC!{"u*70N2op[+̥\%50)E𥬐G؞ +]?R ٵ2;+A>ӗL+yLuŮDUM;E{И'y +{LTza2L zFJoFFpŌLrd pZTM,2eE]$ho.z^!r$w1)=D?0|ȼp汼k XX-S؎۟y +.dZ OSF;FD<j8ޱi|iol(F8Vmu5aH-dH +Ô9=S¨E^x<tyb"(F|{]*4e^r:kDi ۑ=ffg0y# %y%^u L*3eL.c"` &7j}vnЍi=?7 +m5 0n4MIХ.N<qNe)0ikyo΄0:/R 1ynI0(ƻnmuC_s +/1*=@dұ4e[c JkY~x>b/%`l&mXVۙhV{y[?RZvL䇩&LV'4QcK5eU ,,++4T-TOZ7ebےStIųM +_x[qD*&Ew+HQր͂T<xՕ|XБDG?""PrϑXYjv`} +ych/MG)70^>y0Ql45hoRV-5ңxHkg/>).hL8kYT9P@ Q2_ S]Iu8*^5擏uf}YaR- Qlxs/#Љ$ޛy䊽*`H"_K:L4=6ZlhL'6[0ɋ7Za JӗBt1(F'@q/@ԠBfK>=O'}M:fX9+ԮD(J w\r@ֲ4 +}b\L3 -9h-6q ,֬b0ku9?{pƲƘT:8v6{|Ra4VA%V-IB[=IAƟ8鍁P c'P݃~u?,ʑxѱq;Hh +F(b^D)~aQbnnklKI8r +b|$߬GAkф TўTY!_FѡҸ&?!3R2t +m tܽě_N2)8BR UD0 +ìٙ̌T;=MKjGӟ6q:<N㾹\am Й1d//Y8\sEtyakO #+4 R 4Gyᰏ)Z!up8d cszSLƧw/]# ۛPjym \QK(0Xp +Ҧ)>?1SN1wVy|:Zw;\*Pʕ%g`^}͋ye@$e- +j]Ё W/`)Ls/l>֛b(0hJ`> "[/~-M`cs0#˭3Xj²NZشy=m鎙adH1.O:񻕇+% J,Eo0 +d +lY!Zܫ,Poo8w/w}APz[u>ŕjǿ]Z { +/?'޴M$Ŗ&mВ|gҸ+;xC2b؂^3M{=ԋ;ǯIYȴDnWW&$e<O+VTl9Vq `G5{=llA}L>1@͖i9Ը1:s{fף2g Art& c)ͦդi#gZC2{X[;TȬW2{("O,o}XxSuwl^Ѕ +^'oPNUA6\{ø* #sro*v}A]g 9au  +7ͩ9Nh 2Ξr9ph'4Fm8gs,AmM +hgM J/' =a*b'䮝;“Rx\776i[A!Kx&/؁yy1X%_&WAL!/Uh"XiDNc~[hK k]3CvKI3y!gG* OωxŚo;TTi{sf8N^D~rf8ㅓY0k1ʉ09/?2G?左^n 6?M%zb ;Bx&)F( }smSWnY]ӃM/G +/V>s1\ / +PysCwI@.zcURLIm q `ߓz6f^g;coO{g?Ib>_f=yֶ.pZ?0'ښ $j9O&TRu]Ǹ^ܣƁ|#Ñ:> +m;ՐRR-\$ZWf0DP9Ȱ{ +E +T],~CM-<׸RL1}eHx}^vGyaonߞ yr}|~< d9 {W/9}l&jlw4I6d"fxe$Ҝml}+a94hӢ`3b\ÜVr>az 5n95]*u{K?s&tn>VI}K'փ! zZR'8w洽%3s\@^PU;sLrHB4WK@6 Krz@U (P+kh>_sY5l3$%6k&m7l9@r̾^D]"Ԛ©ZbI^Ҭ2!!&UM\7&I|;5Y j '#AtAwWzsj_Ə]j$v!0oj㵢 Pc mp(q$Q2,kF'4ovW pް%÷zkq+H3cY0_Jܑ,i~ ++nxp֒ +St <) 18:dAG\'M&1KbK-cKM:ط-˄;.A?t@ݮ-n* Ъ9'z0NH8]mXawl5Оj˄|u586$*+礡eM) +*MT5AЎkq MY SdžV(/%JV;,z]!9N J貚Iy]#0 iu(z>+qxhC_ņՑ ?u0DeN Lԁ>k:e55aQlS$\MhӍ?L=+h=Σz2l}Pw{Ol#mFz^ LaDUE1ڨvG5l3'*8]WPH/V0@4͊?G&v^~ ׀MM9Iϒ 6 m:j}=aw.|H'4Fv.YktMH5̛\ӻ(nOSpa8Bjֳ"GH?9AF[x^Ƅ< = rzGlRNM +.3iC'Lu )px/9h}l+QD~ gܧ99K|>:9A^:n`}2ᥧ9`W: ^0TRnX_=_m}c3J(K`uo D/"@<θ K%o*ty[gW?WZ Þ`o7 Cu)*۸2St04]QMK͏^v׼rͯj{uVsQ.H⠌bU=;q<7nEnd>d#CFkHս74PzWKD!MD'“ )mY= z߯D A-aDWp!uJ"|Ia\S\` {N8Ue.I]O'qTKVJwJ6lfTB: +eJZI,{@; +/oүɬW Up;R 3{ꉐkWhbƠ<+:n,̖i㔎$:2z8Oog\2V6VhƗ]ZɅBZ0 +i'9QsCufJu;86y^8rr{nJMQSY~H[dG.7klj V2s'44 Y-3aԿIGmCROqn?V%tkоDD{|@cמ!_ FUD ]'y:nG;󣥀=@Iy\{|{-m45b?gD2b}pr 2!STb*@C8iS•߄`!ֶkQ%ԕ=!Vgf].`l V^n-bgkZ䱈,j'^BMw( < / ht_{m=d8okʌm8"T^Jd=Е :deN;lpX^Mm7{z/!VR^;ʃ ;P@f&qG +AjФHbs6!}8byʊS Bbu<>C+e7Аtx= VS&T֝48†"0 k3DA;LS@&?_ gbB?{YH|x{(TEt 1,F5 &5T|LuEYj7 ADZ%xc2rMUlD_0_KނL] g^R?|4$khUId7/$srQx] +DK+)(q?GaxvAVHZt%抬mj;TW|ŜG.H##-7WѾۅ0)'kmR.Y'wdD""1#Q[?#Ud$(~\X5T]Uy|A*36U02-7>%᪚yPS6l<OE +!r1:uʜb*F<> Qs06*E}l>\_BS< _B5᪔^TTE5ڥMe{?Ezm*5BVAQg"_ !$}f{Ɇ>FW'N78UX* 7=j|T+$; |ozig诊q7v -65t  +FF93zᕄ! m, N&Dr9/+| OF"E*WH&CʚNAʅxo*a+DCN҃(cB#xN[\JgJLA2^XԾ U1B8!9גm!MPY WǝY;"/59E*5uy&,#hDE2,~%LBPHnj%c5XsTmCp >y/ObuF;c֠(%Qlrː㇡-2W\&r_#83 BU-LOk3O4&Nh Ӊ8B\}B`÷oBr +{,T˄1$)$f̄*!\d4g$otNmytTȺRиZwB 4+^4ϫEN_Fqq]{IGXU"̴64{8}'R#<Bz/o2ѣ,jo+=S %A,'̧ x +[4P=͋Ď90q:amW/`M`-\`ptCd:iU'yRȖ4m* +%^JY ^*֪2D:L)o#MCZlam4,Hy[6$vTHI",`b%‰ab_[6$ .iKge[ YT|F899<\EQd9ӲK+x Nܛ8i bU2V컣>yz]omy{%QÅL=dn( .a|{B)rp(>k0E-T P{ +وEXCC kJ!:G* !-Jp5bvǰo$守;f$t| %# <*jNA$ wK7O^M!8BEgd#G$:)ݖ(oz}&N05c1xg QU'b?$hv4!6]E 8DnKFl''5Xy?f1E*H>7g2xSBfbZQyfs 矹!A>D9XŊP)c@55_QU3P8w CC挚 )Μupb3YςFG)XHcyB6_)Ȭb7&\N_e%+r~"\TP3夈0H)t +\N.uBq:)L;\f (DIgC&pŐW..&NgЭ^, +>ܜ q$*bpbg.I+Č3s֓ DFQ&f&%Add9brΉkf2 +9h ( ,x>EDz~Qp˼w*1La\&ƄV8՟~AH(Df^ +Sq +wd=& Ske퓑)x˝05^P2 +Ɉ,dƱQ 0ۜdnS/@%8<0D*puϱԵU({(^ _ a)Fx%|BQI5. +wlhѭTvhk{$-XQ*vm +eQ a4l(>X7?DuWAjsLN#m$^)Z qmMXDpN(I8y8#؋ᨈ֠2 Rl4(FH]<8HAӢWr4x}#(P,3c +\DQh,".㦂qqXSQGEdB $'Ķ%()OlU<P{/_|p jh83Fs8~NU(Gd)uB-Jb +zcL3x9Ac:`~?!Lk?:$8CwYMU`ⴊ̧d5߳RU;X>{ioZbPA+E-j(a;N<"I`\w): 6 +wД]9* 6(Ϋ$E.#ȕ vO%ȳ|D`.RT)`7$Vd، S"/D@b7430cغfȩT^= ^$S9WYO%47fKUm9כrh 3&>U1V"Uaa(Z.ʹWbmdR#qcV$:V6F3پ%\.pce%4#{b*sd*cU+d eC#lNChB1)5'I.=@C+"vpg^ x>w^b,ٔ\:9 rաbX6;բijPf$kF%2)Yu[Lef5wPXE33'7Ĩw_JugŃ?J5ZЁM{eZ^2t7SQIBi3"6W iq?|%)!Dh6v.1ِ} gI5/&*IcMPQO1(x\h^L15x OELyMyF>w1v8f92iYGG cfWn$=2DD),mTm%V8)#O_& qCymUPPٜъ\%gJ^Sn <5Ѓ= +4j<>ΧOy~![G^[)4=˧΢$LH%uKڼW%&FC/JPic"Gp2H$7mh>'U8[TNQRxH(9 X˜ +(݈tF;,q{=$O Q.啠sz"GNJ,DJZ0 -+$z-YբW=ephQ&"~. D#ꩊ*'SPI0ES~ّowP:CSzeR;Sbķ\9إPg$+:濉&;`TC߭'"EEӘxy|亙"( +I׉+ҁ<?,voѬ +maNE(̗1sAH\hd䁰Uea)DDYJde(LJMf t!?žK^d7;)>&e*=!5J/GAƉH)b̈\~ziQ61= Eڇ=.Q(Bz'E1\,,:g.e*=Jb>ʰTS'TbiٓPS[\Z֗+xU<:*S +E'歚0`X\)D;[IbZ ZIDK71E guʌŽK]c7`T#]=ê/)J96맗 ~!c:V+"(C5kQ7A +J0(LErW‡Si5w ~-7l%HBC-8>luT}BNU,~ŌT +Fei.Ic}fFTp0%RgEW&|*8"[]*/Fsp3}9iky uH:rNACoͣLji8b\%LiOx,-\ӪJ= >rNUX*IvVS$QɅڤBJ֯oUfq$_u\1A,&S].+¬+Z̮IA$-QK&dK%:r˙p[Sp§,>.rTRzIIW"qE5Q&DXRU"Ȣ5K%.xgx"` YRUC#T1Pd&bf&kAXE)3 c~9 ӢڙG7c.,UQP#\(E1XE-bENb1!RM(e]տП9"Ͻ!EIΐA.STG~IltP+8ZDp`~:|l # -#r]E48 mCqB\E8ChHxkۊ(ZfNŇ*JZJaW ҪF㆑iP2z0a0iSlq'\:"%$ rLr/.`_>(%{F}c fNH&ARr8l R.2E"4 rTQM h'\ͅ{B},#RH ŘVM.~P;+RFA.!*}K8[BQB+NHc` b!WM(\ސ B;U aP*UcghpF*񌶈ia%,$[H5TUI84Ao<:P=D)LH3,[ R Ml%z@'&Bԏ@\x((kzP#`{B} oPBM)`M +;) 2>DK7+! Q0_;VKî")x+zf= Uԃ`j쩩 US zPc.r61bSH4N +h읚]JMv +"*"9x3ߋVA"^ e⪢ S1.iA$ $GTi.J C2G-Db5pd!ĞD8lb +1.1N&ꖡ VM8Y͠从(IhrW,L \@ B 4 H Jh@ +B` +A LPh" 4:P xDB}HB.Pd@8 ,$ U h `x" !( +0@,Ph4 4$@X `@HNđD:1ΜyT_8#NRvШgњ5^iϠA D448@ X ,xH!T0Ղ| :%<2A ÉzkDi ѿV.jCDD:Y5f<LjUQ"~ju +f'29 +Ahe +ѱUՖ&5! "]U>ӈMvDn§ 4UY4VDM_6 +eJ,HPv)2On2HA +MQ $.rL'Dص}4NCiITRK*h;!L-jh4a޴vkhO;AE~5tQ+>Zm "b!f}*(\$圬\ejWÝJAdQ/m/cG+2&k1{NM eٯ^~k"uM)D6INOHP0XBJx>` љmB)تqnG9B,笣t:8Dݗ`TSŒN']mo{@d5Uaj񠯩HتPIlCPQN--CŴ#T2\UA6hT]s5V Cj$&Ph;TN $jݨSӃ"Oɔe"%[rp\,45)GWcGU NhhBW} L4:sPA9X-.:efs020=^$;| /SqX@:Za+ "ϐˡ z[s=XqEV(1҅-jQ-+ KRvv:/?J]+tdHl֞4r +QY* *Q9$MIpL]WΧ^HSTrk<(8ʍ[{(rFZq%JjbMQb{é_-Oyڙw2ZOMx5Ejp4ˉ +HךrX"Pȁ8f.qEfUy)EU:iZ? r +x-.+JDk"qYQ\$fUi:EH"+HU[M%VxԌ(Qo1S$NT'v:z秘r2-f8F/`b%T%Xm=֘4sIq_Dcϯ|6- />ۤ1KzM Yh*]C/䙣ƪlEZi|*jb"rD 2\7Dsd\3"ݮW"BdWצ1 |F>RQL9^5Y(twU E*N0mѾ M! `N7!o* )G=TU|Tw`J@:Ն.1x3]FfJF-.a 4?B`sF"2F<MFn$coyБlڄXߏUT Rk:ZP=@'̪yϓHDj +p>5qEB&9CuH>"JU$H/eܵD%RjemDaQ(}$xhk(h<$]P?!~Y!%HQ"+U*/ugjvP_KAz +pH;?!I$ԒK>T,=CFdP'LsJ68 +ќ,B0@t|g@z:z>#D vvz¡UU;?p(* +3)Laذ\ ]*/9e`|'Y@No57΃1Z;~j)BAY.%D}X^L50O|M +Z6eij%8qKieSSZ0sL{c^q֫԰J"4\QBlԛF.K^muMH'vӅ 0&x}ql(~ K,GI"`=: 2$?זQyYYc$ .!$%F3][Eia%9+v )j 5˴UzTy蛶Ȃǯ!j֠#o}w +;K`ӈ7Su@L¨[A +vΊDG;Xے4Apcm.!"IHזEV7a  +H׵6 IBe - +74WC745fk; \lBe3ex w{(.ro+$#Yޙb{hh +f d!_V[Gzr:,  r&ʤ)+ka6]ϋR e >| >_Rwl*h򍣛 W %VIbƠ&At)^G<d6_uyNJzV5'R0ۻkPRCatMW)-)r$)[VF4-QX)l$"OKF9vnqPT|͋do1B>t +)%XtJW}$ˎ}DSӸt;΅mTzg2^|d$ۜJBoIo(i_F)$T)>C<T!eԼ*3QC)JlV!vJ2 ?g,$z} jqJN3 Q*> e3j`~&K$n{V:[iP +'ՠ_K.;y4,y-*ʌy6|OX\x ar)=Hoz VGN$?zb\$gA=vS4m&Eʣ9|$]`ZK1L\\n▎[1S' XRrd~O%X>*j-H놽V^wHö@ n +!%夓F1O[%t&Hkf]*[J~\htHq'?K˿FJu a[ &wAhq3M_yW2sڥ8Q4J}eOX5BO7-ZBrt JSuc28--v4USW>^}ߡҁBꙗ<]OGzui]b;|` !`zPV05uaGkQn70nV] Ǥ,xqW?s\ H p0%&@S_fa 'e8Pq터l̏: +%V8*V7}eJdJuisYm`tսZ\ /fǻm'vZP]Ŷ&d$WAUHQȼHɫ.JqZv'%g%؇  J$'#,#p~M~7)p +ݕLc_Q@02Ě5 _ndYt Va9j%*Gw 1"ӎHH+Hc6`)XA<,"|u,.ME@ +9{H&D +pT7ݝ-+yJ{̨J0.N_ +-gMlN-:eI"Fp@Y3pMOuJġ7T1+o`@n p'}*{Pa=3^>[.v4kOzRniR(A=#/8X!m_#D 1Dq@4Sjě3} + $z&VZCdښn&ʭepm[[&B" ѹg{V'lBE3uhd_="TX3 Q@1 1BْKhP$i'(SGQl+TZ`DURYHR7oL;|b:"Qiݺ1о)gI!N6tZG @Ӈ`/C7;bx~Tp9R02cSɛ 6x9JU|=+-V$i Ӹ[7 +3;T6) :J{γ?sfyә-p&.F;^]/إcě@de#5 0 WEtG1MS'pW.˪^Nيk['v= +hl/s}Lp-z)y3sFT$ tO%̄~OI"Ikό'o#&r[JAˢT 7:$VA=c->ǷQ#ڿsS?<k=cH{*Mb<d3 Ă؏9%k,rC%PPB$+,\~Y 3քF9ݱm}%hgP%lu8 .݄>#%%BŃ ygITP]5_J aF&sq\ãN_>$gӾ8B&Q_+R4"~%o9lrLxAB7zN V$d& &xqq7#ʍ V{x\knt1D:釰FW>2f,J&Y|XIKb[P#(d&`-yf.wL d51jId$4=rLN XID@ .4%9j^,})b/V:|"l}QoPBdxYv@#$#RlAz1[S4}JS{L'(1SaMAâ!N"K`ff輔9d/h8~\[TIsˇp(F}vkжs#MF_x?q xoď`vw^qIpxM a &J]2Ikj2@$yW;TTBޢw,E J]DtF67^hj[i~"ZC|44,lO:+^|CYpE_z&c_C"|8+Vuh7<_jkK/#YCnf ??4*ϖ) pr6EBr s d NFYt}w]Kh&=xc*| ޵V_iʶ.Ii/!֎N#@NũP#ʘl 80`ydhj /Ѭ df{X +Y(ہ __)HJuQ/p-w=LtP +a-~>L\=X!g"85k`<3,2w`Zj,/H-n$į2c9Zx8jIj\'9ܛ*8=b[P`L5igCmTL+7xԺb8AߏN>L9zRuh1Ei&=ߗ!障3ϒq-k;TL-QCqߒ\@cr*pd0ࣖRl/inO\$nK~+U_O!=v8b,$).5qiHL}PG=u>\\?8&wM-lњq;9z}qS P*2SHݙ n(dd ʞiM/Y˦|X4)jȟ+ BlعRatfXr<5dnLRs]ĕ$}}+ +B~ +Ʃ <7vɓzbRD2uw&|? ?eEBH !M,b Ec+_x +1{L%{ @o%]JDP &B+/10^`~*vb^j+ %oG]Dqξt'i [@ +А{ӊldž(+#Q'Pؠvs9lLgұ:-]vDͰjH)W>m=m){>G4A,`@enn:|B& ]wY}Dwr&$/ތ& 2Y/G)`^Eg*!::sY>AdnsXs{#44SsdiiOxhfh+ÁotZUu>f4s3.}H^ 1Z] Jg 7S(bӋA47f>jdR$bP:g?S񛵜1]rRQzeo  %G[^n.yR3њq" ]"gb*rА'эz`t/X\sQ~g0FGNBq6ZM0V:+Ÿb,aj`O@`aY3-L;tDؽx"H;$&ɧl3G,|, (u3\PG4n:#7M?Oف)ÑO -moXm]Kiup+1|>q'ԉ.-ppOWxIrded݉&YIJ)cG|商G,VUphdae癝C;poY.m2iHdZ;]I>]xEUB‚bSWw#?*V=z:V|U$!2 F>LsyEe^p%P&=.e^Bdb>z<)Ou B ע2䁥  K/O'UQO .GǶVB:,_ M3o4rhOm F劋8EzGXãc(`&.}/NĚdp[r&ԡ^%V86"HJU\رK 2/0q69B؄` o-‹^Xds*1ܵ=Z] >ߣ>w&aoIABbҹ\c. 3Z'@#:G %E"3A͡wkO!O\b#=,}5hvF}䮑tGR+7(]xn*Rvyq+Y;w%N>U/g,Ve֝uő0ORP1NŒ=}[^$ȿZP (!1Ur`q$#Z1/,&L(~JZ"X[r..sM +Z+p%_hk[nny0~/ܩ9p81lC8kXBտeҀ^ @ +1&=0ogՠj@QC ;[.tA2lJ2HB5PfJ` i+$eq(ˑ6;B:9|h|fC]S-tw+>5ث0ݚq +}ʐ5$0W>\[E,X]Cn-?7f&G (IvڐGz>įj:-j(NXn,W_sa+ y ur4AF NxQ}o,{Q's2Xg:-`Lܭ`UV?LŸ/%EA=6GLڷuG9Fd|Scg8)Ӻ1{ >1LlUXisFYp>Yzlӡt.3]νjLĵ&հ@.L&#[. &nC,D, -)KLB)w\p"KTj S Qa/'s< %AIjoB2BLӇS&oҟ1Z1zA|=.I3?hKsI0[ Bh-I=vD=/ &䩕T*Ņ&-vOA/z~yщqMT]½"Ϯ.?00~ Dzy[icJȜ)n +y⹪B6Da1)wG+ا/.X"Ë p4%S,|Ơ^|h#,kHgpwYEt"DvK%Dy4r~Br;ϴnV?-h)*au(w?{hULnkDMYu"G |C)7eO"(ū;ɉ + r͐((ԲIR#s9ӊY9<#:V) .eD`_ L{7i?&_;p>X)&4J-M.lq0]|ۆpbE-8ýF_q#I I*(g[׉ C_8(!/}qԂ9|[iSL+f3;U;;UeV ;3*{cK ]9y&ÊqdE1&!u(ΰE!^EYbsE.g@DXFIM)`uH-O5#| u AGq `Hv@#J]? M?r8[Y֚4J:yB +|:8t/ˉ$|XH2_/m!F{FO +/]f ɨYn8PNlQfTUO tIcM(Uje;ީJ\P7&(Vag]|jwo0)f$2S90yE]FR&SV>*'2;Io@Ә\R89VRhKTTb4&?45༳VEƲwpG74 1dF]7@+to1|AŌ +}Atřt?ܣ҉ .^c{P" +TU?gP =X]\VExF[ _MV =j_6gNdDbt2rd)N`7H W>(k] Ydk.M˸mr馂?اxZ6 "@z5pFCdtA|LwM(7=gs +1[vJZ3'LV0ŞH+qI }c|aץGfN=5ȟ$K-|UTG4PX@P=| l툓viņzT3/_5P b>H;py8 !.AիE + gW;"+a$ϡ$ U{*R}Go>I Ed<.v1e]L5 eƨaayb3Lq vCE``J!.֛cH̪lFkE> +O*gB^>e-nDF_ +'QMlQohvx | VOr3z-D'v&+/FjY B[_ގߕA6f+AgA̝).#0l6q8B 2b,&lPx.; jmwWmR0ʯtV!1l_U8jRd*wnNCHܘ[j=\-py.@ xNxn4-F?ܕw8.o " i;\tl3z#Fow2_ti-) ܌^6s\ں,m$T=p wOUMAA!&864oI8 +r[ou_-x< GL~x'F,z6q_y>b_qw7΁Wv :p q5d+۫e#3$g07#xQ,dhXtAI8sILA4xPvHIJӴ MF| +XX+i.`)U +Ppq W.k`/w֊Ćw!I\^+HU{VLV=~I5%Jq߽ J)?z~A%:^[ !D,L7fĚJ 2bQl> WlbNϖ@ 7 +oG)ȠjƵdzeoEiT 5&K&oYf+zUGnɞId[gp]L̰1MlF߸ @¹'h 8Siʋd [AF*$$B^"z Ħ~K#@?8a?fu];s)# 2J'@F:߹ ̍֫36b^,"pS[8ymbc|=L>iF0rCȞ8L"l50DŽc~񷯯š((!@IM2@@ dI&-@u?c.r+IVBɒw5=dGBd$Y-\–ݔ@3VU* fNhl hɁ)`" Ti7ihNaEe%`#`@С#@#q햁GqI'vgd1XL&Uئgco{3f\maBiwXJ^arST]$s1 0)b/ A0+:.1ZXFvcu{y:#spV׻!)k4iEx@]K ؄n[u@+-lLyG[}mD] &AcImZAic^ZF[ǝĶ9ڍ!bu@ٴ fɫR;–noX`tjI 1"E#`1@001ÿ;f%f(l$ H! _d-0Q<] Pqɺ!TO:$ +d)AqAgBa ('&a^lu!krm$l +*X!ê[YЃk V[/9_l̉0YY6)U͙ +9iV7F$`U3m01At@̖q(yOq:wA]7I}h[`"+!"9A`He~E\8A>ԣSCh$h +p +d g#R'ſrfٺ]~!àbG|4q ﷛PnPe,xy$wp,lѼH:2Rpq(y͎ ssBucQ |;u Ў)vqPobȄ(d .lR O!(dA @,ք,OA%d iA 4X;JJ_hϨxO\  9΄ Uk{"ߘ+xփ,zD*"~%A,:A^6V!ݭNʜ#/^?G d,a|d;*{}]S(o;U},aDKn\9'֟ zS1z[D +~݁ jxo] |Fؖ~E@6yq"1l`5Kcp],t~g\! ?_|DZirtewSp51n}r yc F@!bh_~u쮧6gde [A~|5 յ jk%Po#pg )uVj*nC!$-24X_. 8rFz_6Ǫ<}@oH匒i'X"U#ϡ x,((90HA)iJAy{;;EXH1 YbҮ +Dʇ&C [Ay=%no5EGn fX[}{^B7/@nE=džMȨf1bh±~1:ט6m}.8kZB҂P:2#Qo.B;|n83΁ B FRͶЈ$[[Xᭅ#mj.FYb":gF!~) *-dYg+0VPò4[Ձ**c.U8nj +cK2t21ۢ(fzg=.SUr +]+uvg[ +, \k|jUSvzMo(@ݱK{]X +q,[Rs>u1ax QRLtP,O;65YPVŸ 4P d[K{b:eQv8JeĪQRV:$ɉ#@v8$~t3h9LWI6$g@Ǐc4YTd\ +YQ$!QrҲHL~ʠ`܋$ a⚂̢>A>^|Xd (!K9HRρ(XOLQ X,wV% +;: P6 GZ@N +Q< *7A0 +r_$ 2jF6tE0A h HnAK%A g@-UFſo>QƟ /PǀD,,3>Y=T>׃'_V}*e!YOC/r36O p*ȣUw]fpk`;;^˴^}mՕ^q8}_ґ7 Tt| tmWxNHL6+ͷB^a0Nפ'k"RA> Ԅ'ˑi}&X(qA'3 ™3;x7c|L4-ھ2ڽ2p)LN +22ٺh;ӷ*GYjI0)"!fks_cWzt[aEžvgv/b.7!ъAW Mj&VAbu.ä.&Z GcORj+~[WnYWhuQ-͏y qbДb0ĺ)~S½rb]b9}XעAY1RF Gq6M-V&kp:QV:d'\(5bA#ٮQ-"!LZ,FGb3db;i,O8{_D̆~M$=6ADVv8C1]Z hu'Vk=cW8X5?`- BfZʃ߁^(-;[^`T|q$żÆ d)g=Y%4H%jG"L Wڹɩ\.!^:vʋ0%e@#S ć] _n*bUzS,OW?&a& Ex}X$1"dxc>7D`'ʂj7ܺ'0)1c=ShCr+ ɿ^^q/C72:~ڎz#9>w G9<=(]GuDlQ`Kq@_bQH9 +̻@7e*{*=Kyzw9591S{~Ģ +9uwۜ*H0_ksɁuZ,'ݼ7Ѩ80Ua%Ldxlxt AX&Kh8_Eŋ˴s.=03 #Fg UH5w mE/\DaF"]s+I4Rƭ:,C}w?Ќu^`2N4B4lh#O0J^v"7H]qޑ4OJ]jTjnQ߄Aȇ\d5~H֜?z~iZMdW|r/Lל +X oEߪyƦ]xmByJL|Ҽ-ߞ̣<3̿f]LdVE-9>fTq1G-Fܮ5sPEN^ErHÒ;ZkS̉A:uk \\s~VS[a`"P1O C1/ĺALcspnd7NGBL|ΐԉ=Mtrdb;JujFi=z-T:`:Ģ9 +JOteBSt.+u{~;ĝt䞺?SsFi`Nh*/6qpuhbSک%_nUקSru![CMaV?L܉T)zGf|sHR`h0G7mrT84\8}WVwSƇw +e@ڐj#%J$-+>k,yU\

J(p˛":K5?1[Fu’ja\iVy< [bJqyÂu<XJ6bKh§yv9}_p~(]4C$:ɅJhCivIba "5\Igx7bxҩ) g4$)a:վzުaR/d ژHDM{Z>J[ mVM:в`|4GaO$S#DN1-epzdgͫ3Q' TJ{54Qm?=pTk?Psq ~>ͨ? &',&g5:̌lҌ%WCcyn\Z1#:e;*ډz:1Т:bQr>&nN[ QDþ J?&Kv%9hsrP5Ֆ+W>I9 +p-@\߸|Gmie>:@*4{s,@[i\7ȵBmcp=/@Yz[Y凣 7 `HO53$/ϞǶ凓(0[>hk3\9m=eřWC5CM7h^ [~[eKr6[Tuԯz0(Mc wE%@#Ofw*wBY8' rZw}2H|˽|0Cj:k+Vk@b@ %`u#,Y3 *r&Cgz77Gzhc=Xwv{`Zƃ ׀#7<~I+t\SB^+@c>}&ȉ#FKEG0FƧnP ^$;]Lb ۿh"vxTX6hm'ӆ,L؝< QOU'yR!jȬQj + /Hbtc߂Zw GjgPӱ +`D Ju頻4!~!t"85B.E8(oyG ՠ6ɨQɛ"/Çc?_f Tpn_Tà9p= A}x ^NYc^RǞ"n., F$ׂk+$.iE4ND(534,əVf}8+[_ f{Ţq P{)C<-!\&iT +q+?sDL<91~6E>EǰĶA$ea$2eT=tTeЪ ZpހGl?i ˴VTh~9p0mP؝nZ-P`FK)jby ]y8jFb#,>/"~,ٯ gGv$K4!qM/d{4T6?^&Y\OkM=#:~ q$ u( E" Fw#PD Zt [ߢt>Q?t{܄C]b? =+0zb~pB:iIåAe)ZqVsKz4 +"nDz⪽neW&<r'iE؄"8tkķﱠX8'Q^[.:2fxZ?C/eE@!ͼP3Y0T}]bƶ<UҊVBQt<6q32(6 BPK. 3/fKgRHɔ.vߙ6/Ic"+H06PB?9 žAOD NZqp0l묇k[6A2ҐgY2+-(Sޗ=i +kie"IK Ekij[ T8ԭ5>ƌb{!>uГT10 {]~ A gvJ:W(e +zfj>ġp;۴Le- .p9KHNEx7i&NCWJ|Ug1SWfPSǼG*pxX~=@BWH]c$wF#yyh{ 8WŠM~F#PBz#;"EVweضuP?#c U edBJ&i&4go5[LG +eZ8^}G `tO ̅V&?0(K6 82 +]X_Dĥ5#h/1A2цRûRX~&ȆLnڒ21"2 l夿i<l'V*]5î!cf1UGBIx)Jɘq@W=Jg\d [ ~gbv&Wtɠ>kra7j\n"Y#A[t +6Zj$foC4npp&(fԵD9dWA+!{w#/%k6x@iP7;%$*j5X +#=4&p4 21<|C-L (uCގR*aIzS$]CB8*>0Q&'h;o+hӕ7z$]]fX@RS_MI'yťaEG r()N +xovK<8 ?kQǢ8"aQ߇,V)U$JŃbqi.XJwZrES|}!ӹQ ŕ?d)jfo;R2? ~YlCR`!$# s +F2N*l@QK) 4xA%$@|ZfuRjj=MAj0)|=BD4 -uv".-Kь\C`v ذF9%Y!Ԙ۲,Ss +\*P +\Vuz(VTP1 Tyw2uE+,Ti:Ⱦ*JбvGt40 t6'yv4t30R+΂f]>bPd)PDs|Y~pUP&}T`0a&?+Hׁ2ByXa=Q >f;q?WZƟ)KBYG?/)D֓h(h" @s6~Pk3?j/$T^ʟV6ض@ׄݑgoo'"=Wo^M{eb0WIgﱓM:No~H>:4+?|\͹XSqMT# ^4lĘ%B$p_yľD J2lkEmXaR)acfuv?ۄKA}N%ISD$t@yr$1 p,> &,jֺBa֛qy(^#=LɊUOat`gx͇lzLP >0 Ԡy|bIf!-EI~r w)9XwomRJw6A7bj2_˧sHMYS``@?{0>K% ܮviG;@=mۚ @𶋒oՍ\.u^DQ[q\0ZwJatw#d–z>mX!S".sppa,^$W*Do >a*s쳁{B!p+gOa jЂ.Eմ61m:zK"`uL o3 jm/hmjɐ >b3*{bEJOBYnzRe)C&ӔFJS~3jߒʬp̞ȁ5.CKEP [+'(u[=qpA` :Fjڞw[ۮH~1{>_ 7ryWD䀹&3L߂Ij[KWC{v3f$A$ WGB^~oN"+\eV[i]*^V6EmK(|Sӣ}Fc0B+JDž e[mէ<%;+ex04Bzq@H90L/sP ЫpAuA}I4*7=ѿDBSLJqvQL:sc#`Ahh@sćM[ Y#0 cçm&D^@y +,ȹ;4l%e/8= =5klZ܍I(2g@ꜬRgm8hcQ.pA|t&2mW[f>r*q;_)zko + +tER{QEQNVxP!*tZ2Y=GIa~YB% +㗝T p+Ljסխ +7WEn3q*F/VO +A5}t穊*—*JgSU(3f>Mb +*.ߘ\E&Rf(WADR7WQ$ \u(e+*j|sn=%sST >9WQb +tJ1m)+[ʌ~FN4& opq J1 1LFztNASv:jYǖPh$ 'h -,c!d!{Q\c\nѹh8K5ZwPɆeʆJ}>^5)r\2{w +5mbW!6?Rw:"b!bV<F[/ 48B 8 +ϛ,(&'Ni4+HH #,-(@ _0`*ѱИ,/vg{JCR'řXP| ßEč1gG1M9v.ܤ'n +ƸִJ!¼%ɘ_5Yq4貊J}nIY?fnXj4QR(ٓN=&A8p1}&3׬gi. x;$z`ԵJ:i2< +]DЈbBD-oT~d6d ?a.K'XM B WQS`Lc$4tEH ^/sq~\oNCN +:!_hx08R؀G|9uj8U*Ĉ 򟐔9_3&fe/VnFNx"$֛O7: 9L9Fgh.UkI&BHL dL CɆT +>[]O#(V0 ,'tQSմ퟿$“́>ys^4i-ܴ lqc g%<%UFA\p +É}4=54vE4;%*$F=λ%I0cBfQh!?[?ֺ`6dʍcKWe4P:d01Hۿ]QE4QZTVsz+Rۄ/B,r@Пy4ФEf4< +5̄c8̌ + /|mxqS4.$sd$. *|Q-bOű @ihꄚow&l;Qp QmqLMڢCmt$!;AtRA/ 1 ,*8lG<F-*A;Z7dd ʰiu|;YwW:i Nv_ U&yCn\T8dnq' dK1gH\+4pq.ʦ$fYP.F3SEsۧIG\Z +yU#~"%ldҙRH}k0S? ߹:]NU8{Qb0SM:qѼZڄpEдڛ.L(桒dY.HK} `R.xUi"rXcetZi9;@ņ𨧐b09ō_YrXZ\X)0E / 07Ty)*k&*ˀr +q;*Aʌpn^XrE4?u=e*FYևX_X6$؜qv:аpauP^9j޲JqpqSKY.~:hB F+o \тF?8Igﻦg,^уv8 ñ8,Ɵ?7B/vvf| +9@q\ + +d%+(w3RP6QfYDn_'vmX$BO'|"2{ġTɢB.Ū̒='bs +.‡Y$7-[&QcX,6tˮX4LmL->ӥjhg}ش&;@^|*R'-t%J²ƅu!tO/0TŕRef9Ɣ? uEX7S؊|("QC$v,="U4 9UGUcai#N$\ICQYgN9Lޡ\̼)V5Q6tH H;a-+\抄0C4^ԛ]X9ˌ+gqƕS*a[Thk%Ԏ chʜŕT,̇Y,5J@>Pj,  8Urpj765~j7,})ڍ2l->7$3{J`I;95~ߣFp6a +z!8<$Y[AD8Y̝ +%t^hEJv?8iW]Xj !%r +endstream endobj 12 0 obj <>stream +f΃GqU}˼9(HZcq0{.jhiErJ NWo{Qe00Cg]W Ԉԇ#FZڻ]!T8ɜXV +/d) +r=ůq T U >Inq!i:";H~G w|+!Op`)n(RmoArHh53`-grbx$@F:TcI_\lhpnG<,p<] QsPЬsзx³e@L=Of%?4Fʼn^+>m1)SBlvķ]Kju* +Y ޫ U涔(b._Ir.~E _3R8Ĕop9Ϳ+?p vBt쏞)p[Rf?Gc&nm?AIф3<@ `>ByqyQ~=_\LM\/`ojS +,V'xc!٘Lf@*֓#/W[E87R2B> ?ʈȽOS8"iVFa31)+!8]0#{)$d̨A.֕=`ƾK. +ʎҌW" s! qF`8gR3Aь6f|A͸ɕ/qfDQ`fBցUPY(՛3Ź̨[ Q tn!'t߂zNJo*ͺnTs6k3g1Yu YsamV?f.z71^XlVr<7kOu@:怳ɮ3Gͺ}']Rb&vcߏ7#N UD +Nqs"kjE"# 4c=Y\n.-Ґ|Ȫhl'cQUta+W0ָ:u˟qmR #\mkm 1AJp +ӹdTƅ +pbwculw/ɿ%[$Bs4 y“7ҵ!Guk'2zs1ԏx')~1J=-.Dd"8[cĬ/B7!:ÕJ sXV "^CKq+M(z-VcK3QrB])?̪yM']RiR(I?!'w$wpIɲHϷI,VR$ DT')Gא%oXlzeB Sqp(j J[;m.)eEҏ>~p״v=jϡ &Ԟ>kX"yi1<%u%9#TDi,ĔF°`5t8B`X*'Re]8QG( …;3ACQO*多3%ulh" +7wHz~+5rFc;4}8 +x'61۝ +kSV4xI d=EvSOީ$xf|xTGU!U}H[!*bUGG!ny?Š:F7UOu񽥏 ZDh7}f>Z$e 8P{II8bȞ^6)f|RUNnU2CDE4/YeEio4N}%=̯/_X93EvD^C~yJ'ZD (O,N%.lg_[a),5:-2ʭP}U.5ex rrN^)S{#']Rb(T+)Q M*Mg \I~ NF܂ftr~%H͎ڣC9c/#lVMb?儖\4IzgB:軗!{N4`1%& 0p !Ahղa0RAz`DoA蒤f/zk(OUdċi؋_uLʎe('yġu:Tu"RpFM cq6䢙E &S2j2F6 8% +g"fTQQFbF#5C| Qh 7h 5N-4lRv$pDQLȺCe2 X\M3+RE3o\^*DLP]4a|TSJː|\ER-'ID<QՉT$ڊ{1| rekH~r5x譻Nʣ4Kޛkp*tj +J^0aHiNb#1OPDĽKRtN~\ }s\5okc+3jv_DH"(ل&ъ 3wd Fߢ9dVdK2P$ _F"J5B,hr?W/oh~GH7D艕 +2rkU +Q%y`E?ϋ [#/4h㥑GF{LsM)`n22  +3i(U~U#c!u{*.Z3$c9QWԝ+U{OA8 l w*U;,k`%Sփ}ZNzh٣uf_Z\TE +d)2LK4xWr3TWP笔_tc=!NP.}M*'+&~M!*TY5:-$(=e(-$"bkQÉCaMS/DEj.= % I{L= m>EzT椾L*1>C S$T hߜg,&S/%4nd|wD+5bsu'Ú-N>PI$~?SF2TmA3NURC'4%K.̓d(.oI'-wJ'7Jj/*h*E]1 9YBUx],23>STůLCnMՆ}xR,"Ϣy:m"%{ +I4wZ"}} i8i%dqgŤ-K ~*p!1XEE9HPf A ?re]ûŦRd͚M-9mf٬=g߿$LăkHQM#%&qYR&>*Sjކ'OB#iD&}$14]CNP Y4эDHOkw}w8.3|_>)%įɂM͏W?D90VR>"6GğAf?t5ǹGo cg$RT&wX/-ҭ皦}S{2>Vbe0U[STg*-^;]<_uETW7ΪąqW]\lC:DZ_u(? nkť懲;2Q-(܈68T=O ^ndyg!!)FࣕSwqV6aMܒ,\W)/y"HRפU{*]*TH圇?ZOb~r'mB) LxA::LʳqRRKrB\T|&MLa#*%era˪2wLB#3CG\86Uk]DgP*$+{BQOEI㕌HIݪd^L,#:^26y{"|,%#L?uZH"cO#84bSAMy>!]((GX +)p9zR^B7'0ĕQd4y>&YDC *L?hF}OK\+FUqa#.16@~~`/kƳwdhF*q+M"434Pϒmm粹rI<G4CҞc?-` ^&?H(AԇRoWQ'HEb\\4("59]1t_hIҍ) N*T֍cdE~ZjIkI:Gye+ +:ns:\DSRaI XdF!YBY3f㨭V5HLEN h%\k-\k殛Ggb=jF#:1]dsK#.աŒBUSBU˨NK$rXBtB` xbo1VD R(!O\BD(UթNb[Dk8ќrn)eZi} ew(;]r-j>^wtDܫ}clN#bwR&5:HH6G؄)+iUAR_n,E +)H [y麨#yp(k~!HL%BNBmf]x[)ك!{\=zCp2]:F7$441ZЈ$itˣhS[΢JD:D“gg&NnF JLުyp6# +$Й03 Z}8w6w:9D<)٘J1z/ukϯڤ6frk^XL bKtF"p\m՜w\_승' 9eL[tŴ$VSX̦/bwD gz>"sP^".-T)I, )(q*D#S#!Ҙ;ߣ)!#G)}Z'$FQ~%(-pL12%uHr(UQS5?mTJ1nZL:H E#?8r41W_I8MP)Jڐ*~?h,C|hW˔zDX_7>;3ICʹiQH%mӈGU1|oYjPO M46T" +Y%\4fIIW}7dcDET¢̂%+ JF܃\mN;9C]ѧ˅D큛2"46DHr8p(-$X\$P$P'Pey b+"RDt,KR∑LHHE?D(Q.췗+BqūZ +͐j5hus3R29HdZ>IK_L{h\CYMfJ#"8^1INXܙ2PLA$+(3VMd +R?2e ':,at2>Vd(R#r[>dsN}"k=hɔFu( c=kd_Rk75F5Kjd<9 +žW|z(~(2lH9\?,A=aIc(!V4ZbK;Sz=%hB%N$-BHDR|ċ',2 +:YQE,'U$η:hPq\tJk^'Zjǻ+XtqpHz +VQX "͟B \4ڪ&lЫgHEHOXQi*ވPE*2ƕdpInI޲MCrQh9JLFVCX(n 7TKqD!*؃4> kf +5c?''?A"#8҆-[ [}kk9ھN(NFq;d%u`筝Mc*ƅFJ\֐rHWT)F$J"kU!QyԣIU&kjdi`ڡQcb:D Qh2RQ5YDI|1UyӘTRZ\LQQ}ԏXAS!SGSu s:٫+[Z"dEvg@j%? U\%QKIbnB%! Z 6ӈ&FG"Xrcr& nbOWnn]٨D/樌QQ +e'sGltB7X.E Uʫjk0jbI=%ps=#ERr~ + +rwp% )Cΐr C~:lITToCHSrq,g֌ L̥kӷ(}e]SjQf]$`ZQE-[.ʔq(UX* M2Aj%4ԤI3B|1Y?:BQ'Eϒo̓mD iTEuÊV /vh%'S4VM<#i*(g< ьAE!5i-μ39)C`63GTFTjh$qcϋ626%*"IǭիZaUn\n\QDQ@Ox&I9DP(,IXJGJ;J_t_2h_uJ4aG4ajŚWJщ*/U.eѺ'/g٬1xi1]#:-42=R+"cl^L,ZEebԜNBDezDeϭȚ.E+|J,GZ&t?7x&ʡpPDM" +ǧX/!=.]tc[+55c /H0}ws + PH/{ Z_-,)\x\8K ܷi6#V\ QŏNQy 4n[ӸTC$*\UVje-YձH|QFxمxM8Hd|O@Ys +#Sar@*NL1 G%~pU T]GۨE¤6?©w\{kLޭ'cg/}E(SXr=d7K)p;p3Ť@Uӵ[7MU2tI+CTjMKe +3񇞅i>5&(O`@R9tDl&0e2&[M}@"*iJLY *$%%P6*.`;%G[8\_Hwc,@!1jF/b}-F^$p6˒v"G Hg5 h> J7 /4V$kD(4DžjF!"@{a )y}\Au5Q@F?2!3 ?`λl8o>-[ɐ/\I[ƯNA&Ku@`tLCe}=Mx?`Bɜm3K}@.^@c)AhĶzb`L#<С98;w͖LsJc|!xhp#p~HhzP|')|$Q)A@E#7o@( +}Rm2l>~Ś>8Px4Q5 H p*$%!%.AɩԀ[0%5K?e(t^e ?ς +4yjFiy/bj@ +O(I0VBMu)aPJޓu$$ +_ll˻KtIBL[pSVB!5g|Rj@ K7zRncdQi%.!RIZcpJz3Ί5LE.?]jR9:ɎX6ڥnPVR PG1nGj@^]$G4`a̢/b'Ѐ7atVnO"#sI&AQYL 0 ΀wc\! $- \ /r޳*+-f\+jBۣ|ˀEM{tf=%s/俻.e@ijS({o~3diĶc@x=.P[!{Qsfca.뱈e`~~ߟl_6O,K +=lSxH`tvz$0 ]DŽà HC5P9V0ZOv}t6gw[S"l)ugqJ<<r/Ū@w  ^Zdvgˆj5O5`A68&I˶lO#t> +-wT@0(5dZ ]O| + +7jߕm,]wLj~}1[*Bϝ#+ J4|,y۵Pw +CT`}Q=s_C+[B8W@b)_G ~!v͡A4=S> HYmA5T[hH !ز +%X!m$ +-oV%a̍V=X'Ӹ_YXcȟn&vDM_̒"52V,\F1{Jo9Q<;NhrZT(V)x'~w2~]EB1=$ l~=i@.H+ɟѮp@3aC6& +Inw\DR#VCg5C *9@qe6%M,Z +8#l>P+;3pq+==o:l&W]bv-Ւ +:%X(4HJ 1 d3YWR{S׸~[S+ٟ0=]V >XYs#X'- rSB.+jaT$ @^Cm`&ЕUZ%@K\ݠI1t I6ZX<(S@N  chsJ2]i@b&v5}}OL,Bcl4bOZFtɘ4'e jKfry=FGF*O﷈ 9ܖA+6%t@ 잯Ekc3Zihv=#^{ytOnz*ַ΂ԩg~A\,@,pSnpn!OA +Nz_&2hqh~*T}S}PT;"AvvV t@cҐH¥E#\T8S_1moDf"0 ƘʯAUs~5ZL$i(,,wVFω$F{ܭ覇'H@M#~pՀ z8"=#l@ Q+T20% qē +i{LT;CLIOc@N?(5ڙ@[1f(+|]`Rnl utZmB@8pcp8)Ez KI|@@ҡmB?rE]y9E E:f,9tX ]r]oܟu^%Oyݥ`^Ҋ-Y:xw(䭃RF$ &A +%ւ FߎGcxA{>ꖫ :Lr< RǠۥO!} |Y;WH3fW#Y1A-!:}}:O@ +`"=44sp=,433[`>XW9=W:_+3- +z?1#'BTC6 V&N<8hfzConڠ/WF$M' T0uM9zܨϵ%%S֕ ʍce?ߌTAutPڦV>Jb[(7VZoL$B sVhM7E@cHӥk/1T$}LK1A/pIe! 1E{^.3Z’BȢoUhJU`fȐ_G(z)R5H0ZƿڡWK^thVr@ǡg +Jx=,#彜tğe J߀Z7(KcL<ǐ +I7bU.vB Dzf,eb~h:Lgfq򖾍`T|h.f q/=zK;AK3[ 㠣'r @ QG#(`Glt"< PHŇlkt 1%ar~rKx:D(?X6rs]#5<;t@UG \ʁz/D˩٢Id̏U?_ 79DY|ŋܡ6 d7GNN-VUSIK7[/3ƯTuoKXMw1u7#?ɁNmdJ: o( |>y%HØ3ʭB/2Sqj]W̒01o;m@ju~"m4A2 -IvICEsSLnO8JWS5g/pu@ +귆?`jN$R?٤6ӿi< Q{m^2A* Sx|1;ڰ3ߜΟ!~)x:ϸi; p{j%yis*95aSƾ/I;'P WܙIg 5U$&1چLKpZDզu5m$+jnmIP[OyIwXYf% "(tt_UK)S*bf,;n C#JS`C%KR#R#y 1q[oȿA&IF7BŜzΑS!3\棏kRvwW`5XGAZCR0TsATetyk P3š$`-o!KH~H*|`pX)>PGg6aDG%;V]UDq27@]s̡KsQ7SőXaA$7A>I% 8/\:F]IM)@_(#Fa^s +sM{7k+@ Zv/Ly#%M5Uoڪ!bܙ@kNGk?N`1!9 ړ%4myG +"J;H\)X+3)螻,E&L$'K03iEJCjoGI[OήZ3'MMc }Zq>v[ KV. j^UyI7#!>}fފ*bnAޜEץr`;+T!*3| (p:ß=|j;)?rw)9-0FFq ψ8)bri}iT 7Ӻ$%E++,PZT2l& Pup4e[˼(Iq5~<dA^ED޵i%-W F-:4?-gM៳X{ +2q}w2}wNsOŀܖZ8zO<$>Go`cs^߭:X϶?ɇ]urNi +\UD_5rz' B?Q*j3v"PXQn<ıY$qw To8~NtfH&Te_hM< / AkTGZR?Fom(߶9IWlY'o&BtSTu-^dwL^5W#)Up ;E!ay%_A^C#ED*-/qƠ FШ+3>)$(gt"jJg]Q-k~$= y3埂3;_? j׃F;1A+vAE6U.E1GqBx#]zy Вs |0+EA8OJAh6HNܱuOֻ'}2g<~NLg+]{߸ʭ~@6<qRO>cS$A{ &!;8@ڪXX ?X _ԯ. W:}ƨ?ܤtOvrن㇦g\r^F22~sOJ~&R9HeUN+PO{oJkA|kוe{=CéyA$XċcV('Ώa<1t'Vi8.F9vrvjK1b<6Gхx )&~Gq;}L.ťL vU4pKőJoa!?B=`IYKeI`<Ǐ* Ϥ!C ~u0f~]>ԓJǒJ.uCEC3fd@}0CH+a0 3 Hp{TR'1/FٿM] +\-9U)})zXL@L,d2(j4˧cn}(G|f;ڼe#'͟BE&Vw¹6-џ6>;v4+cT +G+N +ғ@$`Ky|uekw*f1wlﴠ${@e5:?dH4I1 47 + ݉[˴ro2n]vj'DH+]Г 9`}_"-س=5TGS?`>VI.(VSJ,\n2sBAs5h|s/Pr#!J#?n~wN>n];?)VHLMQSL#?7ҳe0T6_pQ%7#l_'o\f!M?M74?6,akMl3M9؉pg zHR<6:_;ŧd`to5q&Ap?KQ|cҢ21UTu]̲+r9B(mZts_sLw~8^%Vfg >;4 `R Kt(#rJ|Or˫cRazc*Mf}fhB\_߱7{-AQ!KC`{5/˝H=Vr ɿ!6}M^)wIE%/'#@O"#ӶQAK="-cĝm*5^'wfd6#~JbK'\W z&>Q]C]>]TQu .o|ޤbFW\k7dTdK~Μ*n5LE7Pbm[)f(l%aRU:x QZ(d' `ۧຶ7bX?FGr[GHaDɡ,^+UalymVeGsAe6~Of :PWzfngqm'Iwmoq+"@j^X?ym4|k{fФ4е}ҚPtP\/mT_-I<4k-껱%P<~dlXUjg IvʇA4uUJ7;с~itX4[G:2` K8,"Xx"s |gVukaJKjҷ![^"xbTz 5CNnw]W $V~d)]YX@{0u y:vGJp+}~T<Y$ZY:sEx6dKC* T7g}T&{;`"?KG+fF@rWHeGRJ'@Y͏ҐL$=&Qze9'H3'Qڊ@@`wͶ3yMtwRA?, ] ~.uBedhb$<٪i8–V +LyWȲ R S qr&uRkbItr.aPnog:|܊Ց:)v;wP'((̥0J -hsאhC"PYM&Sq܍MF )F H4'u,R:U20J'>32$cDaK@JUR^:]!B?-&ZLGKQ uq K/~cEq̟rEt:RDha;7q &3ⱋbPe*JVĤR3 ()ɠs)y{:^0z^tIJ[LrUTGkO+Ṭ<5|)N +̳=T}B@i]x:=ؼo W5a|3 [7_"QQ[p\r 8JQ3F\ 3ւ]tIHBӱ?<ݰ=0@%mHqn#?Z!UgA)j=OvrWrV:Z:†`IrIq~_ROg,kZD`ZƸ @J: +E}=h juF^nxZ޺f/9l0\_V`IJbZdVg%Xsu{:<\ ` <tII_)bIIsuJCY"ZTcRAJ)ȎYɸXUHT)es.\4\c5辤0:.iQq:8RM:} +UM1XǦ Tv̠ !F:ix܌Tҭ-45ڻ4uеg;YǝRucǮ+':R=WT.殢JwFHo %KFuʲ9"$;<ʨ7Zc|7x4A<8KC~hf LR"/AWԳ6yZ`:E%%!n0UTWiS +))HpŝCLqtSAm@7Ґ 5PPtμx^F)؁.e¹S%-W}ÛEM;uAzڐn*]V)ixd NqA[Vr9Czآw+ J_[;;1=eATx:$;{+bdgyϙ'?Wkj<0 џWoIrUz `bEfvi'>2Qx0+eENӧaRhf^ "'̐ ʗ_졡R +xeNfdP%qjH^4Het+"G\9v5[Šer~ ZZ:dꗈ&1[vyAMP,O 4d'y3Ao,irߔdmr\](LWpJPh~&hpp R+HH)iqз 8gT EA+jqP\#:8ɺMe?s1ӷ:%pYr1M+PHpUtd|AQ/t5X65A`5CP(N^G44AϦ׬b, +'NlAȢ)g,z_ڂ+\}ОjAu]?V!P--Mh(bG*ZP`SBf&-.H xDY]r+@Sϖ-r˯l:Y/HP6\Ulj,6(0 Gl} 7 /Xɪ +/,ϦY$Y4='Jm&r,S8@3T/Q`'1fe,h 6E 7@n9NUjX?ϧ{L +`;5їJ +=אl<"~RI[p. KA6k~`m+ +ؽKAi%C~++ Qv+ĵMK%R{;?61i->?{< +28cعߺ4&,GuY-/tڬT}>(m)ܐ=mv s!+]e53fP0H7gg$Pt~0j"Aޓ5ZK\Le#YiE;asrl&_86%f^PAGx4]IIJL섩/x>6 +}g5{۰)+lN^Dz}MVPΜ~`W`e8 m 7釀' $h¶ mfP/{Oa?P$ 6r_"8xh-Ѷ|P_n).S"} ̀UAzt!}c c9 3 æ\"xE0@uINsq=k>mcnO?cI"y Օ +Ǥ-0T,D6lqU{sr*jGØrh$0Rao7@ƭk1 Z ? *HmA6YB,Vl!S&]+A\2KLB؎Z7]rcuZmԑ5a4^!3H2n2p}Cnw{e2OPCm 5Z+黇BUo0-7lߛHϤ34ϺPko}1#2.E=nv1dk ke?(͆b<$VC]uOD~ЫmQ?w*~d/Ϙ Q2Ma7mE ((-1R4$1Ȯ.=&Ւr|XXT1KOx:r|4B0͈"&G|t~}u J4VUBYOe!H)e:W +XmfSCqwC7 ӰJ#oSy/YhaV i JiYu)n/x~8&dyv^Jഛ/8v> PFj.}x +6~>y{J%wDTƟwOx"0E`9<ݞ|d'={4I ͕C=ꕝE|ahaQ|=2\z뺠Kjn4Ѹ[ HHgl}-IP@BA-b14=fYZ+-#S!ɃdBTrEV0 &Xk0xs 7v^$ρD)r^bnu%Aܢ1>lx{ I&Ea VSx0<d"43L?%XB%H@%%%.|Z* "tSޥd) <lyXneIWNpULgjbVaN1YUDa2&,*AŒ^o6Q +USS=]Z.&̘r҈0"G? 𦉄"w4dцacΐV"o:l\ -)Y)T')#[пW1Yd: )PYb}E_uSՐ2TWA\il<\GL2Î6eلN:n3-6bBXʸR/!6MlqQjaKiIB0T-ih}TC*jЖOsKb'K.vAj\**.&j`B?`J86a?L|S-uhMG:$5/^? *tLD L6xL)oB:t\}@Dn tL8G:bSR(x0ћABKCPd 0;MX̗ZP/U||)"/C ճIݞ 4S`j$86.&ܐUBc]鈣~ڗ(=T+׸mXWRH42%m7,l11 uT$Kk, `S?UGq%Zp.Ї @0 d@ىğ&f#Ѧ"l"΁Y4O]ۘ\{D>.B4bFuCn~1}n {1}YDO *2=@{ذڐ*y1s;g}lI,T҇3<%9گL^E"`)y7-L٧cL?ᙺݚ*nN"j{ mS3~)즾kHMbKxܹFNz& d~ +UZ,&7v#M: Ԣo@N|xX;|;12c:V Huh@O{%u(MDrqjl lI=plղ'j#?I'@)9Kխ;Ku_hgxNY[E+/UV"@/U%h4R<#0NJOH.jZ*urv O7Vnrْ~>l6"乥*<4Bmy=͙QXW*72~*jZ~` [*}a}UM!C{Pŧ TSP]Vuf/PשfN(rڡ' Luª*qK< vfz Dڕ( (GЭ-ٹ(4S?أNoEYKK'ue (! c863Ƣ{퐞(KrQ|BH + Ӎ`LMw?  5tJbiW'ƲLV!. 98&!w> مFQ[9xn1Jr?aX̺0ԗ +u'B BJfG)0J[Kbڐ}=CF$m[QpU1Wp1~Q(ffRC#dh0J\젦Q FyhfJ%\ä߅$ obh A?gXE v&;2ʚIllQ*3sfw<3J^pzD8՚;Y4J#Y ɪ-](kT +,vQ)5ϡ4O‹u,dˑ+ѩĬCzPzEWK0.mceڐYKtJ_ ΪWDZAsG XCKGHe,n}g) 솷A&k܀g…MӤU^ bY,Ha7xMYX,O*³A|ZK䀷OϢT6:óvCJEx'8D':[YmE!d-0hY觭B jYD:BF'$69JkoQςY-, ^]`x*9B 6I"նdžgQ/ZvWx5^У(MDvmT},ϪaoLggiwg>|<#+($,GYw$K~" OzʳM@ʳh}#[qS9ʳyMx*"4m *#7t,`"˳pɩ{Yjgl2X<;냝g0 +ZII'j75MvQK>( }'[wIu\.Szs`,tzVu ,)Az:i|ޘ6-=nd|qb<2ݓgq6ؗ C%q],NYY"γ!s,,{漢JY`o aKAo@ϳ,ڴNdEr$J :ݟAs[ :]c^YIMN+ʳKrh7gq  _\#Ϫ&dX񓓭"y*PӉgq"Esd/;yS/Y/PwZgՇ +gHY߲;ܕ0F輳(d5O8~g-څAq%2G/P*;Uʲ%DȈ:#; ˁbY-}+Ӡ"|g:_D0E3Nb:)|7 꽬8)Ac=ptgyߎ4^ҵ)lg 4b'&E;gwr_4Y kkcYkcON|Κdca1o g44$> ֐YؘljFJw)Jrg&_h3d:'".YGA}hYufYɒ痳+Y zvKSgDGٞ:bj:e dUV @E\R–)/uA :Kgwvw% Selg%:(+lK{FH\CUYn8`0,j)OIz9b k?Dl%YxRhEX Hp޶ϘuM,y6Z.8E !CY,BTU(+>:A;Ն{sA|i$^/笿@ sŬ' +(x5$I1wrVڴK$YҹzI +z2Q5p=vZ6] +8Y*͔@Y 0M (~1T){rن⋁4LN=8Ĥ .]9Ϊ`HT…Ď7}B~ b5Hc'Apʳ8 +r[6d [^؅GH#V!$Pjg=h⬺ +wYAvAjkEs`sV&|! +?e#fd4jateifKވUW;n,i@DZ0h*<?C$ e p4S{eQY3Ͷkx\{sgYs4?lQf屦H&]Ac͊rU] +#[z_өCRְI)pY㍼f+QZy^F !5,Zq?<_@3.Ef֬<#k?G~?W~uHo Òfݧwᙥk* [qA!}jVVے6VT͚ .$,fU+/4CMfe'nWjB4j+[2V4SԬ"K+| +HY,8{/ى/jߣ`kx5)~zrP4ٱX$Vfɔ,9l_}YWC@Q$z_S fcYޮҬnyfP͚V!9q'DEcQMWi:™3xxNE1.J2sR+3w6K&%jD.]4 z44h!6řf!GRI͚{cN^DUAʼnN835 IHtԏK 1 15Z`j" ԬCҏ^ZԬ`ǓHez˥ɧf5ڇ֐Tmj-[EdP2¤YҪ PDL"Ll;h-jVYiJ;-5 ظ5P ,azP;R +nq# +zX F\C5М vYێ v,Ud톞J,Um/YSvtzj,1LTq;;C>5*&\,\ܚ5]KyD,6&8[ZA,, kM"Ef忼s8YmW,!LjXyL/9S~Tu!YϘf)X׿! :5 HhmfjвS{ [sԬFY3z4PLWb`Ou:g\A~Պ^hUi}c{O͒&Fg*F,Y)E!r +QlaˑVLzޘ'mͶYȔj:yh*[H`=1#YE?U"kͺpYg&&,Qr]ɳnfQdQ_4Yh$jVm5zL,{rBjx,%08(ԬͩQDm%5]c6k|\杚-vӕ`yӇCҦfq%X"Q 1 +fu4K'լ&t⚪Y!f"fzך*@wnz6qkzM>]=҅WY?d]\lk׫/ŵTJ׬8#1?2]51^nh+@xҝH`$c5 ,eaͲXBfyӴΩVa$DO5H5KS] ξu.YS. Gzdzլ-i_zjVIo3q45&5͝x(򙚅6'|B\BffC[5:PĞ΁TRVDP^u)iI,(SmHYfcrзԬ[ -ŋ~Hx=Ț"Z +'׬e֬Ɛs +)YJ9XY8&ӬFSe$8Yƙr"ь#-ZM`\K)EL8dU R"5 iV\0Y$r4KzKa[ׁ'Rs3YZu x@[ X4yoQf1-CUw*9iBHl ,!NHͺGTY4!׬+*kqd\׬ű + k-jR8߫sݖ>v0p(!f'kW,JdbYM7hf]!Y0p4'tGze5,F[m |(Թ,>5Kc< jRM6]ofm +Q> fΉI,ma[;f6m +R&aYD\N͚,d{S5+@m@s'Ԭ7<%0߁.9s`F3_y&*NflVVQ;جHpl\k,.xy,>l։ڃ`fy+ F&fv\ k,Tub׬j5ߑ|X X5%*fz1pGԩN( t_e) 5+Xx[NlF_`!Tkw!Z*k: 52fPVY Sj9l2g&bE5k1|QK8x"Sk_3&>5 ](ݸ'uIAsfq +Ysڑ@(]͂s3T8YF:j 5,9 5W]S5. C=f~ۃMN2f/:#DRgew<#:Rᡙ.X5\[[D&EK!kV(]IkfWfMW.SڭR-\kYfQY7Ěŗz3eJ"x)w*֬W?V{^7nYE7\].4],j`W, SD(|F)G ߖui}?t[]YClֈ촻;lV^TzrXa/׬Q4׬Y=# d|{WUp!yO9t =x`Q1{yÖUh _zcnM)h=cbIX7b7LTYP`Pݬ-"ͪhۛeXެ@Pܯt97p>uz)QQ *Cr<㣍D*Byqӄ5g-X.q܊M>*u}k,d$#PK&V~gu&>J^Ck߬;wfIf zM’9$RP4˱D/+Z5wf+gͼk +}tw¨EZYjx $!w +@Y_[LҕVfV P8mE-&qs + S?g5XCB*6qV_%]D8@c)8uSq ǚwqV*vDdYۉIf(r'N0z G +1=YqNNEvn8)- Y _fX±hfGW^P,H.O*U,3~M rlq֙>.qrYHwg-Z8+[HG΂[dlgh#Bpr|}o5o֯HTӪ˽aioVRYOgѨ'%--WDߜ7-ͯ.ʛŷY9)?v}XyM`(T'3fEiDNfB|Zo${_yL M.됗~, +@ܽ>I)s"1e2"fqtOynVC1Rbک@X8|c٘x_Zz(]h&dts^27 vd}.ROk 7=C%\C_BGZ.2\[z = R.Đ,$]^=eCKyAmV4_I2;8Aҹ4,+J1Y+Dh!d|o0ӦXC7?ҩ]ľ^,~|Ywڌn>pG?Tx,@䬚oMdqxm [>L"ms(qe՜N=r'ܸ0+E Nu|GA8d|tM5•ۊrx'"feyrm%/Q[8k] Bg%i", P +guPukps˭p֎m%ntC#:p־ ãp&:4pU'[KF*eVȮ"S8+t\U[Q,Z<+ԈHR%?Y}RpֹNnKlÛj]cmB{Y%f8+6|#>8*),G_+-qo)%M%@$Y!@㬓59ˠ?9,OНY1QH4Dqj1z-`R4;΢`I<_SMʽM\ ;3 8 ĿߠA@cmEE$]%0rY cpZp]{U_,(9ϡaY-?N ʔL8Z=Z^BZDOCiօ?L[VS-ZYΪ RlYPr\d h2$KT9HiY="r_y+BdH9kV.MDX2Jz)IR(~)g~ 2?f6h X@PeRTRJ4QϫYY 5U{h4U,/ahI}VN +e "gquSEKF}Z4,* gQp)Fq֐)jeMZBѝ +ҹ` L㏰J1(iOiu$Ȟ>Ot@\fjORs8Y};~;*${Fʐth?;TthyNjo@,9%Җ2c[F|RW״F :Z.ZFf(6t E Z0!:dh} Wm1{.ƅAcCb?ԟH6N +@Mϓ(K<`:zV6lΗJO5aț \u9v:65w|˺Mu$6 qxpO3H^:3mfqE~% KyW0Vz̟:# j:(d[ج,!Z,$ 5j3wxoŏcx&jI"ծ'R[Qn\WB>z6~d_jIK[Fԋi.H"4Tma$ZY_iġa?^7\o!֜'/ҺxRX|㫻V\O*v `F^<:$\<'ʋ}[+[{!>tˠb]'M]Xy+7!qH4÷DGx64/>MCQs K)pO-HUy;鬓bJX,J2eoi +3$6Vʐ:PZ%d[*ӛS9T"[h1: {,ϋūҵmlr[h+`/Z2lu: +l3#zT(´1xuڂݾ܀cCJ\V1Q}G7+ ;"e!@hSz!5o6ȁ' ħ{"̹Bo(M]bU@$pD>,wrpSbALqtR/հtU<ق Rq6!#jڻ(Z8¾: pӁ==GYvd-Ng5qޮ~֟=7槄ߒKlX) J\ǰX zjSk0T0_#(.ܡΐ|oV-/lDQacڤn)]PbbbEd IuHћ !| ۇNLl DRVnmpFh\KIS|gl*t1o>UBG - \i#m"C/@M J 3 RSM+vSV4+cr,C7ꞓ\ Pl@4o̠IIk 4&!I#ȥ9pjt$F†y2[pՖۛ?Z9dq$>;_%8FxpK.jc] Q;;T )P~+fyJ$Q"dwTRHXYDE +0ojX֔>FHW!)|OjlkBXvHNg2!Ёl8) pRΒ 8vmӖiݗx}J+b4F+1{0ZTAK2hw L5#5B=ƈ;g_$]J(o(L lCFH:2U$ Db @ b@5[&ZMÈ=Kfu(`,F FQVxQt&)GWE0 -%Bۗ/"ѝ3"]Su@npιa "cg-6ЫӖ@}z`` DEB-#+1rq GD,5K/0adU?\BЖ؜jav𑖬.EUS]K{s@2E\6>]+#E96dӢ۹)tRFA^8C)3s_sn>z0e}?+¨W.)g`I)l +мwoI7w݀D6oY*Wm-Q2:QU0?ѮB d W.R4X<]ìu_8,9LmL+MBUPQ!]E)~ z~jkyQyu +ɿ~Xq ttE Y_&t>q̬ÓB]f>C +t*}/yͷp{t%+v"wED~W5Oftlb>3&CLRb$=,ᰘ~ѡT U>ό; %1(2ʢv8DP,JN!8)ù!6o!(d["0:uaw/R_N/{U3"-GϑK4~ï4sy;2w* yxǞ/ԭ=_.!~Bt{.rJ־K.G3N=)TDv`uZ9nu| !q${.]y@0C2""F.t@ +2 +M 62rs;AܼN*́qd$J&a%|8D᱉Ky:yx +{ *s|w+4j̼o2m|ģj.ס!jj;Ad|^ ail:A~RN_咕AX"ӂlWПCY9.\S^.o-z6*?4)I'# qu4`"0yié#tD(p*">@T`bb"?K`82$;p+~L8 2; +X|8 ߠ4BD# +vcvB*/?&y_S-=ghw^Ŝ-ܲ11E8R˜S*Hv CNan, X؂xRobo~nGgI#^F,K!!&1OtBJLB;[.ʇ'y6Oͷuc![<Ȯ%oA&~EYBjy9Ǧ_c>yn;M ! σcfBd#%=LJ p P-F,$0k_KvGH]#ȱ`<ܹ$d{jq#sp``0 Y(bDd#8^2"4@Io8B$a?ㄆC[h\!\в#0qz~]wFҨnRP#H#,NCNA$/僭~ܲ @`i`J]oX2K3KiA$ֳH55#i,L +ՓIV_%h+OhteKD޿>i@÷sJtaA_w0Bod4@s;W Heu '!f:#`:Pz,$rT 8dtQ5jBMp'"!3,"&b}Iƭ82D43)Bك4\ZXh/o 2zrwtŢ!Z!aTs0(Cšeke| +afBx4BZݔt/BrՊ]E;Z4<;{.jp d9 C Bn.SX(U-pEi {t$p ]z; @ +gW_94˖Z"x(R؃j-#xΚvi#E "Ѩk%s_{[ aJp>GiU@G>Qk1iёK&HԟF+ 1Z:qX ㊴97!{G9 =9C]F?`7U6}v36BThvI@ I#rhQvbHY|a}9Kxnm[BE(}2g{B`ůɱ8"Ft=V$F5,s1^viwo`hPFsl6FImU iG8f }YA3H]$jXW y4Xe2838&} AG%HL&KeOh6L9d]p O>=s|_MظJӄ0!*@pCEGè9%oevޣџ$ј16.0UUx3dNGc8XF>Ϊ-h8Q?^ez?قWY ( +en{*T{xeRHhlWM#[OiGBlj Qh#whh48Km  4d$ Zx3:)hJ' ..`e !UikO?v +k-~4x '_ 8ErE4-c.kZI- + 1(K5.gErM;*˽Gþы1ߞ!os*,5.2`C%@P?Yeה\(Yy‚+Xй?$|ː#%Tf |- e^41¼GiXՀBC~%t:xve_d|}4T:GŎGC =u$J3QXH8ˍɨ9&qHnRJԂۥ iPi.G#WFɔoLXIeH>SPO V"0T)1 hD?ycLetfʰcA&yx|m~G5/yi RE.*E/ !+HfДeysZ} W/GD}M/3eKhڂ!t2< 4xvW|Ș)T *ir L^ϔ-0[!t%9ILnܶb(|RxSU[Ց)_e}4~dvΔAmPu\S!%NJNPhH>f@ʏsskC4]CBwVI?$ӔA^|yj>yYFghjјı@z0+`Aw',4|zekB]Yh1S4er?wґrZS+VP'1Q1ӈlՔK,-hc9m VVFHW2M g)hNXxIkBjlt ɩUtz4D.ba. B4 R@374ʋcA%8w!Z '8]w1l@Wϣ1îjsy4 nQZ)ScA6p7ImKMj<̓֯PLjka< @%рc%8RJZ#sN{>^su[#֝C vZXƲ_%p3Bng-p +CC"y4Bԣfi#-fƨ1ql/#c:{4(mzy`jRGՒd,t\ZV]+=UѠdy-oq*Lm9^z 9Gê2AM}4o>+SɷjuP5hz)P4=_hǍa4VB \RђlYwM%( + h9ama8 }4d7i|Z؁Fwڣ:Gc'GCbg +C/PT I#\#s7pdzd=Ahx@)_i y4Ѡ81]O}AOx:.jPGc;yC(@O]*h`( +0VJ&sFWhĬk%h8GK(Y%Cq4쭌,t@ٚH4h.Kbsg}^hlN5rcr rP\sx/GTzO2 \ң[D.1xC\MpЏ|JeM,dR`{@h* vA+ӿl5(s.pf)AZIǯHFuw/-k~_R8ĒtSSG㐑{Gcu㜖p:T14Y/=EFP)IQ2`q҄)#N˲matFCT2#k>sgY廟kF,h$d8S^U@O~FQ;ohȳ^5X$K-pzzp< ?wFd.fP\%h Eʈt/+xhpu}ZФы9 ɪ1mv c.ʍ9yƌ4 ܂~lF<t&0S8'h\VIձQtLa6F,76hO +#vFB`5c. Fʬ{$h_-KyЎ)R_Hv6;@箦;dmCB{mA(V ($yFq4Hb M? +`ZhJ ^%9!J#68$yb|w~ |!ل~_O@MaX[OmP}uĊU0rJ$೸9R8qmWZu(8= ܬGR 9ǵOLt4~FfZZ} 㣡!h쏖:AO,qs{H?j%vU;V…GA\~3'Wwky4m*+=YP" ̉~ LG9[(aЗ'03a+uTp,+lwk~ajVyWlWSe0ǓGtXrB\VrÚʯx4~@yʂ׆;`LVhl9v`i|/h0"ͭ}ynOktۑ(dLtGwc&-r;2()P;Ƈ;W T:Džt c`|FFn|H(.,༣qd*3w4AOr£:@ dC}$ӭv񳙯F Vhw9J=Gc`L'<\t+t"[cZ6L;j \YIiF8S=7ÈKgjeU`Z}`ܦO_Q+TW  <3{%no@FP+tA"S hԣP+<X[Ԇgh٣1\Fu]vϣAM%&U[4/ \ӔuBR0ZAtDܫ"kli[= +DFyG_f*Ʉ'4~ZFWbҡu5WB<|P=?gVЫ/>$_p %O+˲_ےMx)%rsCO+h9܉"y48.:0X1KbEJ蓙#E`k+2PKxvQ ly<<$dF؊ً4Ѱ)Fx4g-&_~w42블@n"ls* v sK2h|͘"t7ÃYF#xE梑cƌJ4 c- vИ6Ph>h/hh̔e0? 3ޏEϨ?eJ9%D ;#c;P*Xri)d2+)fD:&b3B͈f|fc\3#eF,ph=86&J8qH"I<9M^vqGe`5G0d reV2\0(y5e\EX#da'MC }{J7VdIUaPoqy1FjO\{ +6dDmA iSQލQbp'1ܱǘǠت}t687PcهkcaQ4FF3c62{5fcc󡍕Vc+t_ =]+lk1Xb(4GX1$^Ř՘×640OK$4'j' n%q͈AP9֪Obpc:fO+W=!c%on'Ƕpڰa|x1ch #e/- "Va8c( D&Fڇ0.?:fh`c2ԧ`*+vkOXq`/0dqnP[1çM _#,wl/R:&0~IY:a:&K`t,,Xzr>c1 2)lX"p̀, ?#X\EA{xdһHIJfɸd>ɬ{2 eS,dARS@Ċ G``e[/[ˬ|˲%F̭.L 'O8jaٛl*/{Ϛ|>۟ 0ƀKY1%'4 ]BZX| 6I4tMѤE.e4i,\]h楑f?iQibi{v43ʮt䛖Xͧ.P5h/XëA8 Mju M{ 85/Jj/@LDh3vT-sR `ZrJq#m"xZ5XZjVj+bRjCM}ť,8/t`j I#{d]j<0 [;+tk2p 4/_зvbdqvLY~a~bҨ|a|1`||稭 vuދEsvԸ 7 , \ZIj$ɫB[j󢀠aX^|Z^C9MM.ʻTSÎw>w.r_yIY\RMm.ɇuAwb4O +^χU.ʦ&]X-5ss3XImrr3%ͥ!\`bǏ Ό:QÆ 7N|o1uoWjuy -8Kmt +g [x-55Em ~-.,-F/REFZu> +YjAQb!Ԣ8M-sZp[-kRc08ia~jGkW(T Eq6ТUY-< .tugc5ř F³O͡,bL#2CޏՎ},ұjj"k_\dcj`V䑮汜}lc k?v'l,^p뫅j<5侰5pdcMcgp -k~bQ hӈҖYKtb2#bѾa߅Eb <۸8X8ֲYz ;` Jcxڍ1MZ+W̩WD= ^zfzEKXea-+0^ܰVW +[&j&kh)W̞Wy.Fklvš[BdxV xE T_ kl!kxS+K 82k4&h-~֚"CF+:.kpw@k/G +mj5?jM Q.e= +[4Zsq,HW,kkڷݸưsMx]_W7]1sEUz-Rh_{`ފ l(q+F;0܊ȅ9[@lkENŪp['c3fVi.|fEJwDeiLlB +fS VXl*ZWA6t] + VUxy "E*lUa׵eZ=l㭪 f%bFxoPmP6cTTSAlk*b*ŭR!%x(7GE(VkT[dQ ∊ "c !T`nׁ +sv) -OѾalPox +u-gHj<қ¹Dm +3-q (M1o3EIiqSdoa`p-"9Uqp)/ JCpS)(I)@)IѭJ\R|p$#)RLjǷnܢR3^ChzQX=FQ8W]ˢ=q@* +)nEEa!zTL&ayYЅqq% +(v8tE~In"ԎPv ςc?.BjՊP\ÃB{ o%̠6X:C)sTiR{-r rv h_*9sc3Q5lNA8gP08(:|b)]iV읋ՠgP՝+< +hBϑ&=WzNAY?tu5 +h ]y x;:] M[~}ȁ*Ny:D:.JciPN]AS]9BQ/5 Fn]匹4+H1P(=H:(8xOҟ O}}b~u }Ol':zBgn/ArRln'bO<<1;Bmm'rN8'1l>҂[#Wձ#;;Eu%TuxCuى3kWkNhrUwKV3Y::5S߯ N“ X6uvID$c'u!Pu +)wW$;:Qw1NE u O:Š%*NpߒN;?v-2nى5C,tXM +-CKI' N$겟aJ2KSƚ +ҜWnW*Ȕ&sy0ӫTWyiiHgNdVuVGWX>_&\g; F\nuرwaWr2͉ˎ7;@ל(j +C3+M焾eup䜸eНvUw@A(D .rD,lw~s"9)913ɜq;C:;! jrl+eofgw! ~1Mwt̉YO;'#h8%ο컀"dN]]Dz󻮑y&JoM71 @ټpߡP(o;`Nó,/}M(DM&f +}IË4̫vÌ6qx4oK8hoGx tOM&bO<ųZ='"ә& ךPv׷Ip`}xDoKGhb^1y$g"&LU^3u.e//~<~&ޱy G8//Gؗcw(#©g8=w9&#ꈉɇ`кpvv#ۈf#"r=1*1q=UΔQ&*4ݽ.l`sFh%T@"#1V-f=#f/b8/"lupa֓E<1@+"*QD||Ru(DD$Dl堅-Dw=V + Q 8""֫&"^:D$C)D`AD7CCܿC4zuT7 +vC goLԞX^8B +G![>f2KBUrHһ|OGBl{*DG!b*qXBD9|A/.ČNe4!KJj rXBp;Bw7ͱY\ $Jc>Ok}A>@-WV4)R^d&3iai qQ<f88 +5TL H9ujc: ߙ ~1R5loO!v^VZ' H @O/9PKU~L~?~.@<@=LɁ~ W%HP0W LF # >闦``gNS_=AJ_ڇ?j ߺCb~ykg~]wv?`U1D`R]!)W:I%ٟ1 eeryP'?A Ԧ)ppo\^Vr4PotDž%9Pہٴ}~&C#ı?! k 6bmICƟ`  \3AW`lps j d-)(*b q8VRl1ʱهŹB>l݇އXe|S}ZICLI`>,|`pf\Bd{yMPP C z=TH%R /C~<%v:ɚ b6!AsRŃIͲzR9*vKݍ.\d0jzZ3qv8iqX\qPat *_ m8\J~edo7AYzԻT@7xo7.s EP^`߹ndu\7=ʠb20.D[7Ty28C2cGTSuHA)^_`L!pX7$KȠ o =eJLPu ">/-@;;_!W# `Ơ1vs?(uqq1hW7d)ÊY^ IpY uCiO'knF!-A pC 7,6_bD1(1(ob0s 6  Z0E!B%(&aP ܰ#p0HnX oDapX EmNy``J2 x g=:pB6  )%՝ ᆗ1\5GCAM,)N\ +’7$a㯃4̱c`Q 0m` f•m8cݟڠS@( Π !ـdձbeaCnl!0}\[C_550 },= W^b!ybԠ?F4̄)3 h`4ߥAy]N. sCzpT^ b mhi%/8;C +> Аϰgkuw\\;@3L0G xl]h/T3 b52 22@%pD+xQ.X e(wA') =^$͑k"y%28!apfCnɻ.prc>ᡌ# RWGv<\T~C"0n;!M]P%%ṈA0C0ƅ@4 .x_.V Cy03`XA\pkMI#_c肰<U-%y .N~E/d]ǎ/@axze/X__>wl`e///tA/t {s I9^ UωN-;z!07wSQ[,: ݅.\eܹ.<8vAn]$;օ@~YdBTzG]0ٻ`uA+ՅU^!!=z7Oht0dULݝN ,];P]ߝ@Bt) 5N$fMн.vA)mNv'dy"iR R> wۥ+\N_ +`wޝ̾.) N3ewB=  +.TU̘;3uBt{<.'إqB օxAMpMx6{ p ӄ5F=N42ȄTDLHuAA eK`8Mr] D]p|gf9Q]BByX0 Rܧ6/xv <-d^%x+/ r%BF@V<Gyej]WxA6wAf}P. Ra X km!#.Au .%oTִ?GKCPƱt\bSf\Jv$ ] u^L] 9`7^dN#j+q@0 h-~0<~啠o`ꕀK@>Q @R' XB %% Kx8J -yaJ"P0٥K,bNkj1 -ܘC?0p{Zh|%1?\ Y":, zFWW-烄= FB ƈAI$w#H`GP y +w:BNGr kqL#:#l)#Ll2b'F@k$)0':/x@m ,(XR +T$DDXB1{ BĖl"D"h4ISN/G±plgc3bqB B0QB@ ft`4!Dÿ, TU  JC41D ++ #P`h PXEH Nm@Z+AiV~P +XJJ 惟Z~+DRF2D||GVb)tt/h8@1_VMA<(0鏑vx2\-=IypyQbX; ; r@̕X0'VCxl`Кq `#d8 ~pρu}"ȩ~ + vtqNn7ؼmP ® 00JBld` + b05Y0xz5p`U L ~jAAd4 tJ/"hO0 +Gx^Yp v`@\bc{ Ylx` ġe1@ c1h Vt^Jw(_?1F ཆA0a8?+L0 K) 0t/z  NFo'=2>oA-onPu#-Q 'J~v-`-|"ނiw f aZG㹐;V\ofy A܂óB&1ap6H~.*RlH@-lf!^ ~ P߃gdV ӂJ<`_SfYpHwGa Y03>uhI  En*- +: 0AxKxWov  k. źڲ&R, r +JPQWT]A/"#L[ 8_^ƐeKZAUa| Q_eڦXe**ONyYnF%oleUO{B诓7X`^E  pڧ\]l9fceƠY,3f_X<"K9m%u- 0vNŗJF7 + +_Z6*7g|mMhOq :a8 y_4P( +(DHKu Ť=Vz3'c C! [;?wJyO'p8ӮV)'xE5`O U&& zlOkw]2~;] v2wkz bO1ANĞdsXJ &q#qqVhVf\T E'r;`.Ř#9#* C9[_As +ߩWKAiS[X%7Ry۸B1R7>ͻ":{Ι@JXwr"hBiuj Yj,e)"5po&T 8jTl0!(m~3hȨR\mxS A~xlhL l2e=2"C09Z@f[&y wdRQ^J V$8DZJ_A &{9"] p#$?"42 t՝OT"7V\UHiZ!am83|Uf.gNmcۇ*N/)(בȜi>/S*J2=R9$) (d~Hts]ԝӨ<е pZT,U"酰A; C '\F);dMܐ$ង@&[ZLT].03֟΁ϥsc?̹ewf#tҧ,~vZX +3pp@vMAE`.cGv2" >AorR(6OYx`FÁߣdl70X;!58­l"o]COuN4pZapQDˇz-%C]kV~#\F}{I!=mև6V׽)g8zPĩIR.Ob8k2ό x6ku~@!2gp`{9{RNԘ/8>Woʶ1.M6~n/n@Xw/m;*[8~{gs[IUW]Qz~?>dY8`30 fKZ8lB0IՅZ?gV X \y)PŠjY10tzH ob֤Гp%ŰhՅx=ˊ@**F BAM!M_LO>|l< ٪PF})m 587+" U +0 +W2+s`٦k/})ՐsrK"-⹉p M9E9 f\u/#J +0 CE*˪-ꁃ{ ؉7쬀 8_ cl]f<8'514?mZtmakרGqR#MↃl~UcW! >FhP@8p&!P#aa#G&,Ojf}˩瘼@*90qcQTXsTnjUNF\7ۂZ";a jݹC%=<7xWУ\8W?sG Bp$G 8[<BB7^t:pM*@z* )IiL/9,`caTgީ?U!^N KRz *[6Je^fVHQfJ g|qDt:Z)-׹GZvJegm&*ю˔!^YDFՃ%;ο'?QcTcL+?S'H4ȴ?E Z~}5:6ujBq?Lx#x|Ggh_s{"(0oêZT\V cnEIj$9&Wrֺv7+\Wg6b$UJA>y^@$nRɧGU' .UQ' \(8=jeVCRD0=#^#毇B4A3싾0vЮL"/X?v_^.M]Xم*_Th3 һyoéܞxe)eTtou'.Ye2uMaPǜ\E+$"iXY(om:eb!FA/Sdz;}HLeR)fiQڇ5-DG,Af4ڻz=)u?q6_XMQ+"K9qMNeٰ͒lXcV++"U4ҟZ#H1&$%Z~qLb\~.Qѵ1h|U1ǹ_/fsNCIPRT"E-D4X$>U㘎0uAv 9 `Y/ 0pF@ +@@A L0< pSRz6уp<1`rG:Gq uDb?g##-QEv +\f23&2^Dv5d#p5}XHY8. +C,L?%]GI -Pٵ]mDn۪_ng6r:?Q T37)F~ +{5#RæWq:?1wE}bϏ\IqA#"'!#UMJ4OD@r2G(<2u"pɨFHAhDs*aT +=MUKq;".xf&P*i:?!歎C(U!F#*J$H"+J,­i+j>آ(TDM(_šL!j y.#09#8*lhfa, x#HfdBԎ 41&,moD"G '7|6RPM*جzZ +k:S/D)$pidIH 7W4lD.SYfB}To 'n>:a\+w'miT +_t]v@ K3' fqZ5*eȎV (KH®P!G+t;ET;2 Z""Tq@P@Faz[(p +@j0T@B'RfW{x%MV\e8{xCRcЋne_1 \H%ɺZġZ'-v!i0R^0r#j]vāNJЍJJaT|ҍ?plNaWmɉ@PTTWZ5&i͌(,6^RHWC+X4)eAa^H "*dCThS07)W,1ӡX?Q4KM9j(PSCsf.]+;vr]0wMtgFHA!&Al/BG0~u$uy6~!ňHV[=wf5n[5&GZ|ȏcrRuxH.U@0x~ WO#7 y +QUpF޳tn')2*B"} V`uwSBX7d +߻! #8h +^ڈn}Q8(c1#T).` !3ctv~967  [j0#5]G!\yN25%TֻDHOYKH)-7@-c _6B7 +رVx9 tCѦb,UbXG丐Y+}}mX(HbVUzyt;Q-4@Q $DO;_l߇a2b +~y-gQcGPgy +xVgOӾvѴtJA?\o >3#2ͳS;$ AQN*/T?͏\:hKi;s_'TޝHgOE0_PգqێS EM^ڀ +d utMll$t-h "E[`i@Rũe <I~? vRs +m:#*7L:"u(2ﺫeDi(G6Qxakv^rJ[u0LoтpCp0 $ P߫TPӹ7hp:U7fX5bab?խ~ K+b@ y(u^F'JoNV֠aj jFb?2Q,qk~L6*s::< ?]}/*%fzTH-ikl'!8yIQ6#[gLX1np&lcm08~X%0uMTfsvEz h=9&ҿS!oP E$eA.no Z0.XQ`g( JjQaxU +endstream endobj 13 0 obj <>stream +k~h?M+q~KRw8ML]aE + ] Lovyx6fkSRR[J=؅a*5`;V \8O +|u t9EΣm;0i]g( ee>=ۑt:9{72\+s[`Ƭs@ ~θEWo;Dqnn -HR #}v+H;teJͲ#(z"+)=C'#AJ:Fޝ\&G{p)s3a8Bx1 ;jqSQ#VkHsUiKڥqXPPzo^j0qd +F7i]M$[ps HdsċZf17рo^n E m9e4iXAīUf0Umg_sX}iZIf H7F3aXQci{7&m*~c?+-f0CXofHc+&+GK vsQ5cbS[L;Y_ە{&sX%5IG AҤ~fhN5UY2L=:E-AJߊ12\KRJ +习Pt{7{?JZ%j+ԇCyJ;b EFqUtxm]„ h>&V(\Q d'&\>ᘀeg\8|\1ii?;] Կ8X)y_kZ401qcTMY~BJCzq<7J;c㸵1~} >&_I )( =B4)@._v, cw1C)U=FNhQQҤ11xݱ=ruL;owlw6Tu;1Vm +gk"Ұ + AVsB; nv ( :*D7.:7:*tq'RViHO`ͥXit;wPw)Im(3ӣ: Yu:請HiLuuRQauy) pV43\jCN҈͋u4f,5uJ.l:eojUTif]Ժ!:JJOsΪҨպu_ǷZg74ʯ8ޕFk֝wuT4].%VJ^]yV'YFۍ8"P `+~߬XYSi|XVJ#?VᔀugsT Jþფ`j*Tv5@FLJύJCx֍"K jŐAC%RiJCC.[U`vf$چ+=)`,Y+ .s$x. !NpA阳S8hi:L`!^Xюßv4+ڵyUvW;Ri*]Oiț,QiĘ/}RWQ/5w.RwRS \x%?F=о3O0.P* RiQi{gw@JEOiL޽DȌ/U/w/C9mC5) +oK'09p nhno!+xj)/<ݔ|J2mLez,gF4KJ*) kJb}!ZRM`4Ȕ([xjǫKiaJc@>>JҸx,*/[1|ӌ:F`E ϓ)<S+e`j]J'y<@ =J=!^қCtӋ 'PROci/1YnRcCIiu) Cza)<*^'ѓY-uTíwY2k+{4H[Ӯĺ^/]/`\Eeo\j4 + Ì_zL 8_.ST.׫.h%&1(#J( d);CzxEc ';i]:*'.CYIR`|'{M"5i0ep=˯+ ,>;ƠU9i$#߿IC'˓F\'oc8|}4X'ɧqӗPߘHT>G^dŝ}4)̯}k) '>b +(4 [ "/ј=J#xEW,^~W\F'/YP_5jDi;eוܓQF,5dϓ`1~XHi/-~5_ U +>T?l~<$˗Ҙ.S̑'pW^ +tؿ0<Ԕ] +njKJCPby{4&4PBi< p 5@j4?Œ `QȀ`sG +?~"0r 4G`RK dy FE=c8Pu/tAРWCA_!8$dTIi8@[ `M~TTPe-^PAϣj Lm:1z4x4Gt*h` U% O@X ӣ5mhȣs + "QiPP̣Aם׭ԣADTj{4 C,m]XL0Af%4;\42*9>wЪP;};hGJ~xO !`* +1(HCq`.Gוx EB[" i+cA<ʹ2`eP t!2!b+#s-a2x 8ɠ/o("ɠ KP.IUqO륉#R54>S_2آ^d0մ  L%ѫddM0HC1(lEc,2h$cvZHݥ{D0P̙4D,H4f͠W۵h " `fҎjH#Ǎ) /GDCFTs{4P4)$W: ܐFbe q-Pa`?לsyn@ °C/zʆ4|Kɼ6;[U}\N^"i:)wI^'BwAxAyH:wˎ !T"Ҩr_0b$UFJ" &"3-iCi9D <Ǥ.i\ED]c} y!<vALP4] Lai< iJCx (]0X\i}HǐRKq_wAu 0 ^ 744F%␆ڀe-/44T  44{NH6oiiԍVHsYrt4y ]ߑх仠㟗hpwA HC^Aˢg $bRa lsA d@Jư5G ڕ +Ҁ sA]PFV q7 (QsC]PikBr/4̶! EYvA! I-S! #svAOH.8@vAeƆ4QFkBmh1! uR3AS,YH+R]duMuAo! ]ОƼw*ih ;.pƄ]pEwAcAgҐw'QƝoMq4} !g hb^0 +0H7c.ح7aԱi3Hqj:?'w9%5>$8 ԔrwA CxE64ov%_1[4O͊ 4d^7Y/8ѸH#ֻ+ +y ~Ҽ Ύi1i~Ͻ4ui<yA2^Sw' 6 LfG$zA:^W@h4Q&1/&rt(/4 ?Q۷ +:4@?)./#EY@Rݼ +^3I! ~`UKAݡ?Pr;TX|bҀ`p i+#X9aYAá1N4j`Ѡ F~4Dh+` S4J@? & `(>*_$ hvҐ a`X0HŠ|4V8qVmGcD0`PGyz4/űF4`J_fhH{4Ha|4weFM|4D&mAۏO\sb,ak0>[c8&, jR9z4$A nAL +=0xJ 7z4TedakGw +wS[%afFA 0h$Ձ ]ڟ0^5IP)sI  +&C8 CA͈lRz,"zF"QH<h0U9B l˛;2 Taoi$0kh1$KZ`(pp -o4bc0`BJ_ +O0hp-mFK|Jn4 +" I0`0 G#Fp47`ppoG&0臣-<-01q4n0G+. q4[TFN j4c崂bU2OPhQ$TЂr4ph$ Yd#h}1ATCcHeB/'. ko] P4;]8..3@ eFH{d t¤|^ͣAȣ!RT<*@H%U)FadƦ8FFE" &ܝF@3FqHZEB[С)r@0x#F^7$wq0WUsGî+n@GҊB^!a3?ţ_+9l_>\ TfP`/R +T)MP0_kq%[Ј[`MYsFC.nz#d,"@ri1;IEsy4p mdpAN6(sk(e<?/5h8ѐa{$/GX[<0Od$>`oϫP9NGcxEhhPRyܯhIR@z4ݿ&m.{i"C <t oNg~8'z4fX c!Q'l)"$S ϜGiT9ZwcL #17ѨbmDPz=?" ^YZ}>GMKgif>JNt٬b IhLrGc}6@:զT(VѸB8@ŇYRưᰙ&g⾒`be<@i8Ch8>2pm# YKMBX0*h<w+1~6%}4݈g,4s 6+pũ"@< qbȓh\+xɱ>qg?\yyK~a)j Z8 [e΀ Z䇪v 1qHK046vG#^|CO>!HULdxۅNEDGSXKx5Sx7ݒTwNx4Pfw ͇CcUE{4 + \?5k V$A#_^"ns_a#iIɍ:H*Z> ihn#7)UQ?]H+&LBOOޅ4*1T0ZH#HQZ,ҔUBԧ|% i"%)ݘw4s"( XShˠiYAi% Yj?q\bPy5!AkTܤH~Ɓ*πYjJ<޶YI- et`F%ۘз#5=5[4ǨR h~QP+hEiLaS_5 v諲=2HaV]j!v ែݸwh}^wp7q 5y֔4=P5ؠ#Ԍa^ #6rkD8 [,SS;AiT iw]eSHG2X*44 +i4¢M; +ú5QO$*/nꥆ4qQZwk> |7WH! i?|Y%A$Bwp +Le +K|2pؐN\ 9%y]!8r}۠1N cqc[c}W4bLuWZg =na.lYsBq9 + EfԌ&lqw8_ixoɃF!nX SOwĂ1z@z cZ8-fwP{C7dݵ!=) +w[];a +v}р4 +Ԣѧ`+Ԑ)v4&$#к{Vm-&Syb!~qƧrFD6h +t;hR7ӻ24 +g SBI8>X.WhUR!}`\60ͮ(\WF7|#v(t%bojUQa9>X6LfESl rvSq$v io?@E퀀)Jo+V;ۦF=Ogv: X<,4PDI|/Ui,v p#+ "*C o"G" *geT/G5R&4z.Ƙ[3K ڴo cr%'`"jlQo"mvM%z \;繶N9S*CJ'%[bp +qC@qv,=z^x8Y~#@kep"zdF42L +Hr) Dm^k FoP+283ɃD9D\4k;`XŜ+2H,Xn!%bo \" Mqyi9p4z:w$;G2^Hh\ @.Yۡ`"5b ッ'C;Њ 1b(̦0i{hE٤\\zGMQ/"Ҩs1r4Xۡ]UCy!^ 7ן#B .˫g{*" GFa" `G%+4ĺC8vM% R 랮Gb4&pif"7,<)%Pf*X}{nj +:|G4R} ԣGOqC3RvMξOH?3mBEK?%;׎O(A ЖUD:T7, w0*^+X XvH&bkܓH>hW & U٤H iRF}˿A`uIQv(u(,RPݜv:D4NhHzzV֒:bpu"k<5IhAAZr7yB/BSY1Yȉ=4zɑ6r0vLae Q:%JAHIӉ4b'0"%\YUGm ix$_mX\Hy ܲ +ilK)Oq`\Hu9O +i4h ùP2ۑʰ1b NjYtg~|-cf4tĞɝ"RʞM0HߐFJ4󎘚$AfZ.,!G,ِFD1\ idC+C\thAԬ !N4M^X33ӂ4|c?`L/e4#G0N@Qkfa8ߦ^Ɓc= C `/mYֿ!VRWJdA>׭XGJѩ2A[ r{=^! Pڴ~!^imE4CQA&~,3*%+7DȀ*Dj|_裷 +cg_Ȋ.D\o*oH4"k'F$C,D 1ƺQh&GQ}LD RȜYTtNDc4H48Lx`߀q#`PK +-H_"j)8g0FT[}|1aVHsK T(oX`* d\Fv{ĜH#a4X7*@;OD{x_J$H +) úM +X4TUCeZoqzC CLb>&/7CϴuBp‡4rcc`]Twk! mzwr b[l`+d0ggb)o:tRHa/Ux{CT(BAi@7}]P67,OLs fHKDJ"CZ|w bboGY6{H䬽.k+CvՅ%Hj> i);7Gr7FEUEw&(eo(@PB%pw! 8]F'q0 i$,Ħv?jHU 巽T4?7%5A/i[P`Hc_frM + IA&ِ=2⠖(vH,ZexJ(>%>AV9ѽWAHT)±4œ|"v V*m[@?K8q}0k +[FbTJ|4b +EAVw 8٢?qR*^p܀rnܵ,D~ve, Xlw s i(Nn]8  haHWݙAL3Vvh/{4X>-D0AohfdCz4> c :HБWfAY.zi:ٸ ejr"idtI^< M\cX+« $ξ_-K]4tS\-f~}7Xˎ")Uq֝DBk1 Q)%0HIr Ai_J2A|7#iAiAQ`Z˩Ynp_*pz|ܜ+pժg!H G& ;5Kixg,44_]4c7ò + nO.HCש +2iA#?p"HcGЯ!8D rG{6E{͂q .HIeG4Jخ5h +SCFƌ`p%ALMy5;?U'AB3L#%Ay+6TjP~Z`_kH1aLvKn`,p7aqȐNfڡAރ^ Χi|87 rțC4*/mn`qF{.&AH,?d'bZiTƝpaY g-O>aeZ˗4=4X"䙛M!A"#NDP B'Q~[KBx#>\y%B(BARH?S< d7Q <<:~t'IwҝtC-b"{K؏(3$:k9/X|RrF`bwi,"^'@L$Z͕?o"ќ>)>i1EPĢv؅б'rH)Qn@0hRċ-n׎ Kg8QŐ7G5_{-CE;b(ih 2ҢeJW-=rUQځeDSoYʠD"h 1cƇ+-BL,% +! =7(uHi劆mHt:s!y {pe>wWw({[UU~"*ӋȳIy$_QX11j*x`H-j +E0;zU0(œuKe=z!zcUJk%Z*0&OJKF+$0HH GɆȉԇܵ;%iT]>/iV!wEK2e* >T" rW{ZT%ŇL*tSB2+K>2?R +t[5_PKnjzU˺f5*WqKڈ>`)9!;R&xצW5ŬCpZ_i+VU|d[g^ϒDmH4\ OWfyvX1 '_ڴ?GSf(ݕ)!cx?71 +k\褿GV,珖9b5%-Ϣ!)=Y/)C:Pl[F_/EI +ZQ|厫.!6,CWN!vjU9\FJM\t +D '(&a2os\a(-{CiIdG-Cr$:̾w~9rn)9'%A>%<&5:i9]H>U士n]H DQ*nElx$VE/6I9ĆQ0e(z>.UY'vN׽Z iכ zV4R-! +O|n\/QpXB˦%;i̢^s}!22Jv[6BARw zUhIy5&?ۑzcjSU+:rے/ 淤#&ES-z-vzΑ67`|>iqu5z}t g^:˦GevHwAKKjN {O e,Kj:J wNĿ.F-o9 i٣dH5Ir-%H-}s46xE"v)/KĢ4kCz,=N~:9p%iEG9RMO)].qxm2!|R % ESZr(zS(٣$>~fۑjŢ3L(v&>:#+N~&x!}P{zWZT#wBϢ,.|xdU*BKv*v?呛7?ZP/Sw-9\]B,΢z`U$O:. +fSm)G܌n[y^v$IpĖAy v (tN&DXBSsuBcyu^'׿ۖnZ yű'8WsyjYƓ/ fw~'/|5 l'p^N{S6twgwzJ666jP~)VK;kLůLRn5?iZӊhß5]eO*ROQj^{)'MZb-GO0棳wIN`v&^f&zꎣ8s9;{$=b/?I{e%7fp;.=r=17 -ͻmўǏFùp:Heɇ}z(Φ t0;_zs۹ٸ<B\enӿ4 # + +Ñ76p︽;7qN6tsB%(O3?1A@?k=.;ۦRm9n:{ǐCV4mkMJfbW& 7GҬr."ra$Cgɋu HAџU?zR.,堨; d!)e?&w[u vc( ]eV9\:i(RS^ٴ]%(=CrY `(~Pծϫ`$=&yu[Y\UASd!IMӻThk5OOIÁ7#}_Gwِ Un{9v6(4Ů|(iNÉUZMslQ9I3.GLyPt(@NjZ٬ZwN wv:TU漶(P l rn8fCwuqց;I9v7ܜH2}oYr:j#s~,G }f{q4ўf}y`Hv8  +V4,1(-uRCP:vN?PT޲1;4jV(seSO$?5)z_~iw\e1[vܯ(f>hYRߧ8د +>7b'|Ԍ#{qשs1?4a;xbN8A?M簓7]p=o| r.Ar8mYn6/ݧfZfce;"duA9(Hm.[,<;wDDi'r@3A@JOAafٿ3u5Aaoqhm:7u,9ոVޮk7dqTun@Љhwx:t8v8lu3Yr6ZVwqJqfYٌB:jYeY֔Ժ&CP޴nkNلV'Q}4=&z= q1'wR=ղ1;=}17/}n+9 y ծ1\礟kBn3ų8znAĮv}Hw]e%dvZI=rpnS5NqD&;S'4⮃mt81 h{uجv8jOq[$anK3mjZ2םMD2q0ǭgN3?X8ݦi:w\k7h-' O(A@P'wݟ)׻V?RŰp^ɱ)蘟=RlmͲ5ĝ 5Qك鐛-}9[vg CdW,z#:ǟ s~Wu d-C(fMlEQZW 'Z<׬nAdIs<)v#2?~6')rY[g}w1bGQdnw4s{LpNg:d8gn8@ .m3 sۖr6&!ETqǝ͹٘ f#mi٬[{ӡ@ci]r=8ZM>M{8ֽv2dj וeO{m4n[qiKM{m(H{٘Yj}בVEVm9tHGpFg/5\Gfԧw]AkJ]-*!؏uDhu0\ lŒ xzמy=(r6DlN洛Ms,:\oC3I=s[,*2PZ~в:,׉<>Hr3"=Fy1O֡GKY2 JO&ri6{qbZUM{ҳ?IzG~N#6( +nC*zNşG .9dEEz=jNuV&޴< uQݴ!7(`EpZM74Z+9wpehۍ@6t 9T {L4܀[ouץBr6Z&z}945ZMK5-2vzqH{ q +f{\3uS}햕nEW|Zͦt m<ᗓ!(=yLlNG2>ʼnm6wy^o.Xr=uֹ0AZ ᎻpUϽ9ZGlMK҅۴8 I"Rn=:()_ zjؕl`{UIAvdSy|mܞȯ4[#{?y T"AHٓNS,u?5]3zQo+hg1je޴bIQ'E${rh]|GL)oKqZl~9DhIjKCYV܀ؕ7M;_nC9V^-GR\nVmCΙe  ACYv:f@Qn6jnۙu=op,[3κeqM?K쯓MEnմ $9wꍳ;/(s[z+&{5 ' ٘qyVeC%n۸ټV`moJ!Xn6uztǹ6#=~3a09Aco,qIİGn==$Kl`eSL$*E^Wj_`]SzudvM4O~%:]Å2iR%WU.H=t= !4]RS_.OtVm~Op[d4$z8ZeQh8^#]QZZy֞e.:-96ҪN:d3n@J:t?j`8s\ijnm fN٘Mjۚe8z]OY_EUn+BQ>&IJOnGqxfMִ= m;K3mOśfwJUSp$;;4[g?/،r@E:9Sd{o[e&so)EE`T27ǐv] EG)Je##e{6 ^8UCgُ $Y_ҚT?KIގ*xMNS4,/,ws?I$܉N@Fm"!)R2:[ y3A/'5\+R']^eMj|<>ŭhEEɛiDbjAQ (}TxP'E^ L_EP6ufٸڦ"5?&qWY8wܻijv8jn6j6LcմbMk4WdnO5}L'Y~ʲ:=rq4=~+NyffzrͲ6븚o[imc^}lI]C'*BS$){m5Gz3LJj) \t9Śje&2)f#MKkjae栧/S"n6(}3F%3^%SBj$PUjՔۚ5dF㕊jⷤY.RQX䷴׉P.UQmY̖T?E%,踡"eR:#5?h٢vSDO/)4o5XUԶŀzG)~NR&<<]Sq 1|s$o([bT +'Y3u$ {^lp0qt(VM16T;bN (B%s!qXsٔu#5IӪ~J.-~-A ~")Ims l<'F:ٟoeMuMnմӑ98 A:OIݖf餚nm8y0"["l{˪\b.~wr@z2G~oqymW ׈z"?/Y 'cHA1q^2=6XA}[*'"5y(7bї'7z{%*|W.kGizZzjMz)Ӥ&~4"$J=5} Xs(*e{R a0ZSQz%Ɇȝ2ˮ?Of#n@NG2sR{]KOYMA8wܻilPܪmy]"O9t<5L;A@Pő; 믛687TjzȐ61f.$涙M8Z6.޶7m>I v:loܹ\$yQE|3qb.{lmgRMngC$ȏ r䈃1Z4r/`EUu-C;M. wm?J8|`~})6jN"/-]EAMYc(BKԚ\ɜ zƏO\+.\'E(<)GZE)x~[yݺSvp"(BEiIIQ"Ȣc$ seZU|9`YQ/1o/A$i41CDIʝС+JY$=8J]]+9\ qET!ZF2YZْi➗{h E$Ym! + +kL]C4?J8mGH*>1c\W*Rї8{ r:)v8#U=/y1,tL;A/<<nS7(\Cw,nKjrٟ)5l*WijY9.ßa-s:VE9Rrt=k XʿHZ< h%Ol٪YVWM UF:DT;X&{?_=sr|=N'EQYH2KOʑ'ZNC3 z#1GNyr%hN.{jsUM9Z͟5Y7&);"æG'U1|"mvIf1)uߦ%%}yey]'wۻeoٟ mrZ4Fķ(XpA + x0mԴiv:\==$XqrnV-ðGr"ӴAtB&gSwݫiAۮ\ 'H CEC?xX,RWH1Rݴrv8zX{m͜n[ue)ep_G{~ǙT3dyS#ؓ(%A$~jA;j=.l^NA/;dGլ3Lٕ?!()55_|ۅɳ)O(!*J"_w; ~7bkiGJMmЛNhЫCOZ赋n>y)@>嘓I%a1Kr-a߮L%*-]*"?r(L*M1?Њh21Ej~vb;,Sʏay>1J-byQd9λirםY?Pj^s8~:d[l܀.͞כ^(fr@d.'ETֵ=2tEn$I'yZOSzw}סͻi4GA^BMT˒VNo:N)ܵ˾J?KњhIRJwqrE4z)j,݆-CYh-arQzŷeD<]aޏ%"vN \Ϣ)XިEYs{ߨE18:zSC8?*3iEIuyNRբ(3%Ef<)bUfHjM֫EwQ>SMC%DhMY˺iZo9H^v:Ԯr<~CgjSZ")E?*IO{ M+ gr̘H|ɚI&*$M4BL-L$HTиء4`)&["]:O͓85Fdm44|2N|}~{=9q{l4M;tu|^!mozcry<i8~N|N}LMky\iekiݾܦe54A46/ q;wܦo[|sseZszy~]Z{]>uu{<}{{iZ}}u|mY\uymwoۖoo<˽{}:o;zM㻞27n5{}wo=|yv~=muu׼9:˻%^qsos~cݶs^]-;/;y紞봬罜9y|;xNz9]xyu휷s;^^q\;sw}봜.Z|uik]=s{seZw]kuZukiuZyޖ5۽\2n׺N-\v.~r˹N7ۺxMz˵yib2Xikzcń5#%dɋA V3ZЂFryVp?nET˶bW8LDf^ݓfftt%!ªABxW4+LcIq5SVG`Epo͡hfܶfo#%qiAK Q"x`,%2LX!?~Hw1R;3@`vL*dT@dE]57UyNʃe$E*}7e"xD ̨,k9<[Nl]QBȄiR5T( >#T]GoU-jz|}n.OTnp`YiarRhYWH]ؖ7ZE|øi nn"Sh%'kIRJ'~U&.~UEvʤ"ErtK*fh{֡n8j[Xll <]9㈙q"ci1R#Ej|4!0V^Y|Iҟrۺis]z^y4îI28~]YP(]ZvU%mͲec1T;W#VFkGmJ)RIvB +UznwH"{m- -4(#IS eu"}^.fteJT +riZ'u"|rWzh+ǥzmn완9m29bГ0ÖtyoZzny݀G0ص;.9BncE3X#RrZ[33k*ktoG<=,VIc-Q+$4&Qh][s=J=Ꚓj/IFfV/uKi)~O>>YymzԄ`eg<=Oߕ=<,iqM4}ic9n8y(BQ~ny.# qS4.JAD FhC3.4&0hi՗,3(ML7tXO4VHMAmkoӝahꓤ4gIх;̈1nY>3%(bqeDx1#?(]m0d7p>馩۶r\u 0Q"u%M~ŊHEc,㨏}8) s?E? dN?9Qbp9'T@./4"%o (rHe@~7^S:7M.ں(&#F2jC:ßv/G~M]]~hϨQ+Mov:(@sj1>f^RJ=HD^V(և+1+iA:rٗ~9~begsjGhq RƇJ +SVStX@1Dk>Mc>("͋ +e*϶,FD^E)~ 0H]侯ׅӈ#.Kn) +!.IGKO~b1P^>p!B~wA]<i$gS`Hn@ șuhPCQC;?Ei5Gl _l( viҬRie('LY<:u$ D[˒Y,&.*YzTK?K;Vo u$9` iRs?ꉚV@(%1#)$RƣigQOĮm84MHyA-#$J6hNOQ^;> <4R8c +0qs3Un^ C4-趉~8kլnY +ԩ*!}FK&8V̤IhB$D4ӣE{fԦ*)nGݣ+gu0Z^G=$#{rIoBŇ$-#T bч +JSN:VBd^ e g"Ѭ\џGJOzؖŶ$4j=>nIINZ!}O哫xOMk9 -4i ekv2ӗdYJU' V˲6\PHSHIs +pqMFADX#p6ɏa{ +wѿs}(NhZU-׹(=K/[+QO69AIaT>8fEhe3NLTF&4eгAUJ>RBx|C%Ej4TOZ[=w s$zHQ"*Z%?ۣђCyƟwv8:hMmͱGOU⯣AJvE[0ZP%-^+  v{p1!x *F^#}i$Y:=:Ԯ/"E*TsɘHzI Ů)?h U@H%*|(!.\)x4}{a89q+VzIiJ`$|yzSLףc=q!h!~&Q8쾄|(#4_TdcY mja-~mz7Yʞ'uC+fiƉ 4E+*JMRZ ~xYbOUZoQLQ +R\ [nKlrbbGKp0-!5HT)]7I+낢^(Mb/CT\ s*$ 1cljkql 2^ O)O)J|B:}I'cyqǡ6ŢWMg H 8Qš2 0'#NG +^8daM߸q /E=5ea> )ԎpIIJpyF5AB-v' c1'8 $\Ĕ|~EN4fE:( \"೟l`߮i$ )R@-Zjqבxm2IQѬJ/BT*R#=ۥȁ !C*^z?7uVQLnZ]ʹmi6px@)!' e&BPX\[Y Lc;IA+ߒb̎vfq:W).N֢rmCۺۂ,z.*+~AYr8HrR[,yV>U=yx]nZ^wYwus8(GiD[eϦ5ʖ[:g=Ux-I(䨓denǽWz(WmWM(x@C4,9PX5NV5iٮEg"f^ZBu q,\vf:ՈD4eݶ2a$^ء7r#,b=R\ChiA"$):q$}ꤢCjۙedGղcPOY>5}l2($3Zh 3|Ĵ0YR>;LQv|(/;ըH+"I~grd5~y˦OsDzёB%PJh]KwoGw&zOz"fMhuiI; +~YOsBOH"}Q[=o'y9Tp$-j,3NS*,o7,Ekul$[KZQVd%ǩ=/2ά3r6\@-yn筛fۯ;vm  +>MYS9.C_=UJ/BX#er_ۗfLuJht$yt"c?=(Jv#YC>dؓ8jz]E˯z&oZ`$}N_QWfug~t?M{nF^yԾ(>^v\qe8jO.7{4?4 +4I~qYFቯ캪eMiZSfvn3Գ _owIeɫ'+@B~UMvGIjƈUr9Ls_$z老@0BX?(Ul9NacDCt_QO{BBx񐛪Eb5Ԟ9(M;I1'Ǜ$@6/Xn@xQj)]Il4˺'N6_nkMB4CDN܀bX`yp( Xݗ=\?Mx1q>zׅS!>:r:k[qkƛ ˅ Im!BEK ؊5ˣU=ulRTմiM!zRUO`8+bH˧~Z&EN-#3][xz_[Wr̚eU_wݪ^;z}i\7Բ獜MٜYכT+/"e*HFmU[:ݐ3z*}I{eXaL(=?8],v{& ,HTRt_J-R~ɭ rk0f'r@ X[oZ,{ier: +f ~u&9CGϖjt G:,Օ5,nhmO;z[^=iH^:`\<BMQ=2cfZ{ue>~$]ziv(6(FU` ;)x ~~9NיZg'ωֵCJmq٥ق!dn@nL{] 164ڎŧ^$vUɲEɱ>XQjE%&i$OM3;Xnf?O~pZMGQմ51̞7 7UǡuAh|fnEa3 TͲlVr"t c9v23pdո<8LԮjصݴϺpQ;jn[73mA +M4J,Ī#5!}nVP%I*0? 5G0/Ƕ G8TPMre#nᐛ͇bj]eYgJ)T;8(d7I4rIJ=9zD'[,QApB kϞ8R,#ɯLwid8MroNἀfP]MqLrc]]cl8(Rf^%S?OdBB,Rd8ĪY&nZeb19^'oRRt'K[$Λ.pŔH.M> *F ]q`Yu{UnN󤤚68Ce$bsC8m2uۯvEL@6} 0aqKlUuS禶iA/<#^(zd't8afTL 7ҷ: +z̨qJ,~|)_7{"}+sn@܎s=etx7n_Ʌcg3M&yUM+kGQPb)n:]3s-puQtm=]Wd0:${Cw[}U4&ɱ@PZ7,ٴ޶3k˒%KV~C;6%:b+&h:j$=feuq[+hֵK462x%hq79jQ1<_Y mS$,IA,}dq O&}D0ޣl}4:gly +d8ơIU\$3rɞ8Y<*(Ϻ/ݵ?觾wbHHIOv3.M}Uk| ٭nii^fo!iqQaR!W"c>1ո7iޗn\| tDNm8+yD)ẄI +₭H/6|kVN-|w'ILԸsVsԶ=pBHTR RCcEN"XKs9?#56OL7`!!(g~LˊkHi=ò> x^D.7!=,~^Ph9nPcr[=[8x۳I*_QCOW>M_0T=7E-KZ'i9]xFuo3OWD@6-Z+09ɞf--db`HJFF)h;fh⍦X.*`D F X +d`@ h0 D$q,j@DU/G҃ƥF4RJLL&3v D&%  @ (p$AHL`@F >IQJ~T.m]ӌ;$ 2N. |F!X!ÇL +-*/%=?Vvdz߿hz0x`8X`2` ^8B``!(A(; Aや%"?3 l(|~`jDd&A`*XA@ a  Zp5(H'a Gm[6I~]cQly3r +4|2@ nP! +\B@! beɋH2>`C/6ٳ-jC=C:Y [o6Q4_֥}bbJ,q c &`^HyITZ`&PͻhF<~/ M'$ I6aI@ +d/A C0&(vڦ^(iv8Y!lH@&A H1 g0 ,h +b(-BPBpؠ h+ZPQz~:z)@&4 +V80x cC@$8 f8`1, IpA RP@6LR֫$yiΠv}i(@,P@ ]B0aMB . h@ .XPp +d@;tqQYy}~TMu |@ X@@ Qp %T! +iP@1$ Jh X!A5`/hT!%Ķ-"Kt5f b*P XBp+t Kv4 F(D3Kƍ +($( JԢ"yt$Mr_9mrKD/֍1L$z`*P +CB2 t@6hbbLDH\욪imf$-&$%*`-`F CFK +e5jyhRDXzj433b"ힺ[2,(-?/"qhT&/uG9tO1HyF~hECFFa"0Pw],+d v!5}X|B)>t!#JeeDEʋ$o# z&5. qV)-m͎IF聢mL?WYX,W/,;e#Y72(4':/vwd9 5/ -\VD~mtPP5)R`P|xp%SSz K:0HX$?/tfRUYNMrqZ@$}]Vn, WKsAo4,#%rIdk4Ɏ9'5W,"ؽO>cYj_7ǻEt"t ހfJ(\r##~jz^)8f$7-b#6u=M8<Zx1iA5+$\^"TS'A˶:Or)>jȜjqiH.Lks\ yTB+\%i:x}+qNݷNOu 3T3b|`U,{w)鳨$͒$\hUNS+XidꦉTYmղ(Riː>(6sd!4ųui wt]=lljJTj:e|0En2tB e(!(=zӫ9;YwW<ʇO0n4)79d + O,UK0ᔑ9`U2& V?&"EAlBY`P<~acjӄ?/7 W!*.~3I`Ԛ.ētXDɍ(~%UٱVH|YQ>\NpňJ$.hYz\K깂zyP/9G 2iQ*2f(@=\NXcUZp~1(?*ނe$[#;j^!*&-R?$$_wD?bZђz /g?q%_Ϟ5TdQ}`(u2 fT9:(헤i$]R.I SD<؟o($ɫ)m9l/'%-@м`)}^ܲg 0@:5@pBWDO˲_GU$+-s >(xR +J +'I4C +?M:xn[Ԣ-u!dV|h2ŔX`"P:tr~7ŗgF + +UsKb~$"+v&b  EKsKө6e.ZVn(eL<*#'!%>zmtG,pH@&٥AxwR_OB|ɧh!hrY$}SSDo#Fz nd1^?HrncN"VXJBW9D~_0U/M׽J] +G֊/BåKqSZ>FGJˇ߃JbдRu)քHB?MEyr̚\U5?z JhWb,oԅǮ;V0ɏ>]*(a%*(/Icwt^') +O(IHq9DOcp!sbcEʥ +rS޾PGǒ_AZBI .Rk$*#.|i"0^<΢fU!#jbbˆލ$~]\fmONٟEO>bez*xvWs0+EAX-ZWbvDQbQCE P,%5TJnmУu1brYFF(&&ܪR0(p!vm0VM飊]' I.=1):`N|ĜH䅢c)dj췌4&~"=~g]5W@U 7m4 ]D;5,.Ҫ3*V+Ӛu&!2ce$QB,2da +ЯOrz"-!%q,#/"]ziDQLnxѯNXT8&ა)1 3FX1fAѴJ$ ;BvFL ՊU+BE*F!M#Ѣ%>h!c.+RFh214._W@< N]s,1>~7 HB"ybZCI G +0& i+åJ r;RS{"c%j=U09eEjÿp6K=k)fH"EbhT3<P +УNjQl/\#!'V4?G!pIFv;f!\xt-gF-^hJP!:ͳ )⇏-Z*T^8V%:=M#E5+bR& ,@L e:}N;hqc$DQ54 z'峧@fN.+#7TFNH  JAl))b-``P"OMQ˶vBJVixI@L(!qny`NΦ8VDR>$t,$U[v̶̺Ϝ@MX / J/uژ١ *0 7j~HT<99E=f``a" WYR piR 3(.^PRǰ\O. jTv~19ѫ ؀"P{-JX5(\z/L!~AOj A(YR@*޺iUA=GEk#UcK bukÌ&|jS|R iŰR)> +z +BBLhl4y^e+XxPQ!R70)npZ2_J0S"\AYr J,bdkZ+"+'QӸJ:YZN~-~s +j8Jb춎OrUnǠD,BT,%ʖU~=CEje9/OɏB$%joYCx/]ſ?X#EdH!D 3*5ש*jY$yHCEe]D1`)&1(4N`*Z 1G⅒9RD(!?%,"+ҿQ[Wu|_dmrQ@<'7lK"Ee`bL~_۫fjINW@I1ACGoˀxcDIh&&k,>bLnl^N% OMWL,x$1#&+6VBvaAE1(0 cDc%Fj Yt<E%մAniZ"Y~n/{y9~IzJcDg7kNiY:L`-ނU +"+P n,bUZQ;̞J?lZZU+0h9zhu%% HgF\LxHB QhC,bZF?=U< U.">JX4BT-n*Z80ETcvD 1$ԛhץAJ/| B}"%RKZT M +Akc )0 M%qݵ=_IRE܎V!;}'ar)DrZſGrZeˠ]+;ɿpbT%l!揖?ZxE4nۢSd;  +Meڟr}![sv^/!J9͓˪x^=qR.E ۟s,?'UXNZĢ*?ɜ _5'|ݪϊ[9IAGZsJnܵy4A=wd2 &K=Y5"ےےHA1.!&7|jO{z^e=-O.Qս,qУ6K$KbJҒDvuJ;DT4O+y57^hi i~.i̾XDSu jS,RX )擿8|:!ET +(0#"Z$!c,7HP-}5^F1$P )KbUJ-%٫N%w-e^ d:)1PkS{]<˖uDm T+&/$(܍($2nW 鮒+L^Lб2 +jxĆ '*},=3N<_]qMSEPzq" +hw{ѯ.oyNSemIr'cEɛʦS1s\4$s0yNٗ`v6(]]7m㫘eͬjnmRE0E"yfڪeV]H=UZR,;-`Ī+9V?yq29:zȩ^uEVAp/Ǔ?J(Q]pMkQ|I򧹛chESkxV~EˠU4U$s(uЪWy8dZ'4}34Ph'*pS>߷gO u"]<6]_mCl +'~-(>CˣeӱYسcc}֭##({zJոrA;6HVeR g%)Xhf ptN|=}cEٕzѼ! H%3:*wHB!Nnr[٤ncgQ^b!I?J4/=N/ζp]uPju8Xp3{Jdǻ[ɂj^FݍM7>(R(,DZ$SLs%R"S_r|?z V&ɘEМنn:_6Ms쟠\z@B +!qZ~$QTc32O5C` (G + +'K`&;dV U!Xmɲ^ ߓ;5aqkV &L2` Zp$A,@BX|%kE5>nuLd{ Mg5ӟMx';`@a@0BqjᏼX=(a =ahU3NzKH-@G8)IHIPAd?⢭G̏^n~&X t +^`@8aK&Na&_3/ay}y7VxJf#&^GX@`!l C +P#d:5P0@Œ`+PXVͬ8S[(~$8%;D@D/с$#`Aho`?*k=.R٘>W^mK]jD%cP!hpT(XX!@@cF͜v +? '=ieUG4L|zpLc`  ԀXʱ[ǚIr6ȮCqܢ&xh.(t '|`<F )&i$oCogL㩏BV:'h6pBl #(.(BB`@"ȁ Fd0DPkryx{l(#6rb.A  +`DD@#\ %8D_#Dlƒ R':ٵ5(,AIxAp"\` ]!@ha ~x|"HUAmhC)M8P)+0,E"($ K( +b,с4 c⃧|za-lW#4@ $`ae`PA Ȁ40|XA Z`C=H9@ !l؊ʊ|Ec1"FnFp @~ 7D a +x@ 0Jx@c(ŭjhM D  @D P%tMx`"A `j@ +Pn4!MqhT~t{A_6ݛL.3~`@Xtt5DV @q FNsD \ޜŪw]qy~@ Ƞ3?v&=h|hQ1ڃޑ'#N.{Ӌd6(B +壉! +Oh* 11#dNx$bpĊXhj91Qڥ| ,%<$lFz?hPA8@&JhG\D 3HbEɄ"\Z'wb]}N3ÌPp<U 'պ$6K랏:qpL&%^tࢇ#HddHbF(*KܳH>Go߅_lG-ZS9d%NP(x dD0GXEC DF_+R|EzMͣ.jx${J> AP*0hEM"聒OEj}pkfoO]$٢di}>|8H>ET=$ %7(8d'+.IÝ'n:c` Xk14IpO VB#-+r M"j]M|΢I%7qpHLhgc<AEGl)ǝyA1IqIW-ׯ QՖ^aueSuA6QkT;[ tf +m9}~Go3։Gne0P`%"ӝ}ؑSU% +lvalLmsőV@!qS 't?׫]n鈛MwE›jiS\q<̶mS ;q۫럪t0TNj}?S}iф?/QT@֕mIғ?zh?ϝ$CjjҺ7n8g}G:;Q'®,J$O9 CB2, K!G6IahnX_(cyin7ii:hbd(=^Wk[(]9z! qbA"B`شFqcE ٫EH}mx^֖o\a2U>]]U}iqW:K6ݻ6J)" -`x>mMgM\oUUԮ* &i% EKv` WYeɎ~a&\u{4nu]u&n+M}hee0|OGQ]pgW\]YtsTu >f߽ΦL(XuE" Y<W[[n1GӾ}uU6g u4oM(+{N<}mSe9bY$oɷZ{ pu +Eg~srՌ("8!AwREKUt"O1um7NͶ4`SAn?{${5tGI)dd^$OѹhuA詒c/GmtC lKMS>-OkUL!!jhҿj~Q YX%ϒ4NǓ< p)~]vM1/|`F%cI$^7?]]CB"~h} 0),?'ѱ(kB"!e p_2Ѥz`3IR7vsM>Oȃ(QN|uiʟfKiïE*Ì4hGH jGZj$KjSPDh-<fU8p +mBf&BpE39a@D,m$q\1JA "Dd cwsG  (@#t!|b2ejݤxĎ@N+ 4D#eꅫ"txB&oG3K𐡄 4F\2"K=캣FWT$Q~Kht{I΄11ejDžUb&JE"G?I\PDjZP\BDH9kJ<-n$qߵd1) SF~'ponhx'I_*@Z3,+A|6,HV"d?̶ )1imMKqc' EWr_<sLͱ׌Ս%"]{bEr2ŘDZ[ ?]Ñ&BzigjEtڍs9n45Zr[yUEp n,5eIT6ٵ =療[F(ɶQbu(Ҡzn(9`RN%xa*íC3yUw¤+[hk]p"خE +nCym38IFkc%d>ءEv[3K%xR @?H5mD ` -d\LG-Qt} m WidK2vu~ @oA G!b aG&b& tDH`Kl X@?ԀqQ| 0M+#+,J Bi\IF{P{MSo# $?bP <X$ 0"?AE)G+XtĔ 0&Fc7E_-kPA-QR2D 0C>faŠ1)|r4 '"A@< FFjjtBK@: x357`RpĊmboߺ4WKo_Ԯ.{JpK-%Pd*b- -&5TFhBZʦ3,vw4ݶ ޕO>!ЧDn|@J$Hoښ^%TMö4JHd|* O(D:P"eIJy@&*5mop2/5I!X,Or-~7fd, b/KʠD=hX1/]'5+,κ-Ͳ߲ {ٸߗ"ͰX5/VuS5:Lߨ]N&^D@#$5#wt$IpHl#(PXם?O~?1פJpkŊ(|ȉ3f\P#!PKUL5N^=Ȥ(AF 4*X']o=w9`WZnŬt1O.C.=Iڳ +_:~CvԻ19ACPD) E41PR`nΥ M( /@1 bfX,R,`4B_p @G)ZtH!Qkvqi(yT5p}N3:5cj QajY,aA6܉#Cm\5?^R,Bhb y\wIQP"[|a=slL.M4Vbi;S?dPDko,R #/.Z$WKBpDAڑ"E:RjYA~k_V=RFxxXvh ȡBgEkZ%\ЈVmnuِ8"%dwڡVbԲ]ަ'Qe]a>! C11eWT%,''^/T4-=XJTF(~0Q vG$V=Q1rYt$+-ˀvn%}]N*j&ҌTJ +Q+P鳺TIo3 oh2) O[t NCr:u9e#/ja}$C{e{@ 8l jYqCF6^,A RG bѢ&!.fVPAcdժcjyC~=3~R%ˬ^u4'$; P#j`B ++0OS%eY6{G/KPգDž6,je?m]WST(i(qA{t=s3_  &$Bg mnc9 DSMD(7Z+U,R()" $ F(IّE10fTPxz`9F jמǐ24*,&˦Exݳ f )HJL6=aP˂5%)yS&Ԏq@YSQ%ȫ냳[ s!7萜ݶ-5'QL3S +=Ua\L>3/$DajnqQSC,W<| nܖͲoŐ/N0l^.'(c8Ppc΋;ϣ"v%JB*qn' =d(  "6X`Y)`X.?Iج#{(+%mC,)OEC($ 6dbF>|jp26I-GtzQTpH +ɾдlVV1㤤e5Iꧩ2WLb2`%5FBT>6)p†6H]Djhz(2\ cR]n8HKH DeNEC!VLq(X.-n'P(ee{Hq|^/}!biMhG#K tgU4hDIZ{&FͲuq|xNj va7IVՓuGIDC&Ͼ3)+Ac4,~`c"U<(i{$ݭWU_0[z$T}ϤJ*Ϩ]=k +yVgG!Ƥd_Nc?/]_;y$?8ҟ'w^]aջSaTJܦ Y`YIHBSۣe Ѓ҄=o66Ή6A8 ʿ>;XJfhI .014.*S REDv}CXN'%wh:H9im[LktP:'{tn:{CꙤ_s=r_K)|`bE5W0+3=j`9 "j]-}ZduŸ^,ֿ%}8}SvϓdD5\ZdZUh,7#9n61LNhXOh.7`{Q=0jŰZ6ZV|P1#D0(vI5,Qsg^(%gr;s0Vu&Gr$q^_t|û|%zࡂ$FʋK5yqs2znPAƍL|zЏaij6A:_%7}(v%'5cT58l|D&E.LȨ1VD( X$AkF  hW񯦥zմ +K5Am8?={QqK1+2aRWnf؈4XIcej";}M6z`I(z,l{$QM@6'((@p쳯ҍS=PGW_e뱜62Ln=f)wy4 XrX̔%19|peCP v24둔CQ8:s?T~־ +r]˒ޖ?͑~VЪyCj[$  -0'vϫɑ䶞tU=0T'&SHӸX6VNN<|+"F2Zx%pa00"t@)6Edz:L* +bv8!p")y!E>%!2cQoɏLgR\VԪ)"?@FQCDXViH&ia^c]ӭ7P+'SIeP!3)=rꁅ :hz} beR/UCnj]K&GNF"=lǥۖf 8؝C5yUU{,`ĶuU5-?ޅktoMt9ۨk˨k3d#ezEޞu|̫P*liR{fM3&3$*XXAbL3ughӺ)jpeKsi_oo8CG,Cm1Nؓ'=ŰIRΦܠ*nIlr$((5Q|CGEaxz'wЃ9 ƈTFVt<UqĦ!q2&0!,GP ?VBZFw5~LoaqqgswhUI. R;U{(I0/QkKrĮ*Mq'gc.z׹,ִQ% oy8(a)E5HjʂߏIMi4}1M/EHlz$OtjOes}!1ZSzF/ŏYV)JQ1"_'E~VuݲS(,fOɋyבzU%{PXrm_:%Ieg=U4MY}XIː n$wI"x +nUv;~Ci`.~wmqu'J͞ CvZ>{=Or]'si׍`8<몟I-A9aIT~]ъ"({u?z\v%'")W%nI_NjI-WxƉZҊHyXyՈzS{&AGj~r:_zG,.~\]E=ex`Xbn -PfD=Cje.8r׽Z OZy.' ~C7A; S{rǙ ܕa>: 0L˔H.A)T<:OHZ;p0,g uoq׉uHM{y!4g=y$,E'Қ8c- %_s|۩V-I[v$i֒$]d~OQі,Vu)ʈdP|QIJz<ص%#RJس]W ~{eNӳA,SMC 6+מ]Cv[VKhٱ"B +fUIk]jI1Czœw5'EܭZ`פ2?/zKgMMxZFԯt(%S5NOgo,neH!P}t9mMnYn=#(wZeKxFJEywDGIdf?(Yӟm477r#h ?eh_C`8O&%6=2Ǧ5]tlfM ~;,ץbX3]. w?/Ů,-꟞99ΞNjyi#oieS- Zsʖ4oղV1At4aOleO-1}qKe$hTdJq=IjSJŢ+LQ=X Y Y@^+x4BK}XZo)C~DcYR/[V+؍ 89 ml2 vC6VUqӢjڪi7ф!\F^>y +NQ0Z㢷IW=ˀ<'6݋`~S|U5 &I5MmZ:ds9-4,W[9Kܦn/I-=ؗnq3m3R! VDtbB!y[r v"Df$?jq +o_4k^ si-[R!4,, y# +0vuMPi@~BOi.вre?牃u|Q3Cenǽ^Gb~떩'=T󦭝›lqIfXXN:]jeP3^,c1G&Ǒޣs_nJ q-Ǒ8O^/ǽ$َ+;]MXcx]+vQKM~bEkIu/ Ok=樇 %Y>2%/޳VǯBZf@h.|$7]WE PCJͮE?fN=)PI-/Pi֠ ArC/IyX/Ghǰ/Ş $]arkR-wſ:ֹ='z<_~%6\sYm&55O.({^›1IvɯjvA kW,^ܥ&-٬[E +eW2%4npf[ղ=Sڂ]Ӫ)99 3ZnYu|Km*oQNIЬk!u1n8O2,OUQ'RzNĦ%6Kr:SmA@n1 i-Ed4m3;IXjH#v#zz+j o T 4(];܊pKfKoaQ$Tt؍ i[0[ZQSԴC"2\:M^sREY у,Vi=͑?HJMˮXUӴCOКWj՚ +yf!MG䏚y$OZa`hEKl"m4'bѕU(]zR/[GЀpHq찇+s)&~Β"D2q`hlDZuweRS?O7>(wekA;\ C)BMi{4,89C:BQRzur\ѳ |!V91V0KB˔hIHW[QzJ/}z^ iPAN^֢uӒ0\pHZUŢ(6e1#ϊR$KDSJˑd(rۛcrſe@<=( +{ U޶:Jbe +9 AP^ŝSE?I.lE 85IvoӬqG>MqS.}!6ɐ/̎Zփ!rYoГ 8ZNcՊWrUE;9n$GC$] I/G|I$zwP;mCXMMiTZ՘,9nth=Ef@; +cf&ˈGn@/\3tBm aYP֮/}-GY6P7MKi_eg'i>j\$Qg|c6h]ݬo vwdR-NЊ6)RfP^:>lzjW~&EZiaTt2Q<-ʮ`C r[GyQQd* 9R: zˎhMEn[ .bGy_UMp ۶w䯦9O3?Mm5}e늞C+:ZMJ> bW5C+bXFx4;$Ygyl藣k~_@)חgM=*_њ'u4zų0`=kXR붝N.zY({_]utP.U(=Av=w8~(PYvMsUT[QJ@%ˠjmݣv}ڢ|D96>k4VÛtUK9~}ic!~]])IWhðմ^ Ql߫Z7ǖX[xt >Ā<+Hʎf w ~GPZدJ3L3KסHAb{R "lEm\l zF5npHZrr=g]b8b-}M]1;JIS%h%k-MĦ%K1&! ɊGwpECY+:.߮UqkK,vu8ZlE˰N%{ΪDm?O^U?l{Orn!z.D侰't,%gHJ_m%ȉ`uXMCfdףewqN\ e31lkP'Ki0/~^' <-.dͭMT7QHNjɛ,]o(ZiˎO/ BOzm o]_y C<(* +e]rסvS/ɽ$Y~]ժo't0A6:RRPt=n6K.W: :,BZ/~!Lmp<&u +B:>˾P&Qp?Mmfn[\r6 &(R2>P]f7S{$t5&QSz11 v S,Id/I4Mna cأmdyǕtDeKeliֱ/ժ/J$ߥ[>~0SsXKM-bZ~9\ԪOd?ĠĐ@Y刋I-Oy59r VJն"o'AK@˵f+nwdH)m*a9 _cj " ,=YrU_E6U2jEqg'i^5Ar˯io0nv!%)KѪue0y iiŜF nR6$qr * UM  +趥D(n3-:\,ˏZ7ˎR6P)q1>p䘢r:e*g#w\ +fKi-,ۥdwIgjƉ&UhucJ˂d"4o ++ +>`T;FlN)K.]mq6ǸI mvE#M/=(wMƠW%9-#M~zjĦs4 /XyLlgMEv[DE?ASG +II^` +endstream endobj 14 0 obj <>stream +o,[F ,W \~t.K;~8PXv%IXE+, z. j8 +N.n,붕$9߾Yfqt8(H5* +v}S8XQ.<1[>ݑش'C1,Kjţ犎oz`c%do|v +֩T׻YtWFJĞY򻗣ecZ)Q Z5Y@{]qlɰ]h}`Xet(xr+JnS?K~VE^ T̴@+MoW?SD0 [8-n_;V"6_Y\S eT`EKk,X\D*"7D`+Ϛ9NӮx}կ+fYZbU$U3;Hj T-um (@izeB, wq6˾ƵJO̲^!Ԅ5m/^5ղ=z->sp4l_gzWq4gOS|qN l2_GzY, ŃcjcfnϓsY تoʺv^EOx܅AfJ!ܖJɌ +m 3\VE+cv!uˮ%!Z̘ê*LR~Գ7GJ<+BV(v6DV"xiD1Et8~3`LjĖEnԪ$z=X֞JxԈ6FZ.OT.fHhq-G'!Vr*My>{Un+!V Y>)4G5w}s%x-HEy\;|Ne iX=߇Uσ$!;qBD+ esr=.lfnn퓦:MWD;ʿGؑRZtNjz[y^J#}"K4e.KGŚ2V)/','-OoanYBRDa~&vph97J`?ZNfD?MhjgICnei=_{5BR6Z$??*$&0Ns^1cFIKE10h|`!1Ls\~{0ybӧ5jmCGǔ~Qx+~GzGEK$UEd[xGcYR䲡5$j~[yg|5o˒û|Љλmܶ"R"\fI]_ #_9Ǔ-KB"xa,h9F]qQʲf`mY<:H>`h1ɱEb>EmZzR~ԴN~OJC?KwYb ז̦ +^1EP*uTJ6`I3WJ;owjS?Oؔ'A-i<1f^/: 3Y[w-<(-{.tN'dkT)OzڣIWޖ2۞z7G^vaZZ/Gp(-{s9\NN@#f`{TjXZD^-( !7\rÚjzؓ Lūe|n;P^7HXQg'50<9_E5tW (MsCķ`~rA烙%mEi. Ur+bђRNr%IT\#i=a%a\W@ C-z/ +g0%+Ku1P˛#MExYԞ6Uͱm!cEd$g)qPœI@>`Jv\eԦ-uƶXwO2RĶ$ыE[Ģw$i(]G*a_&V eaѻ$]Qr#fOSIȋ2,>N) S{ާ _F@̨ȀbD] +I7dPHgdN!:]cd3V"*j R=~3#Yʋm2Q>@d㱙1KJqx*~Y|̤aiZ|o)䦺[޴WQ2BSu+HQH U+űMԸԼT)Zj$7`TNB!Y<4Ԟm!`u_"Q0TZ'Eϊ^E!)ZF*TC"9eP)`/酈 +^R`9x`QIQ̺v_`rQ=]2Gtzg~T9~!c&$E*:Z_'[z[iz|0*FPSv-K(9qZ'Y-&*]I&AbNiQNz=H>o)mKKxv؎yUa{TFD +mX^ZuĢ-Z()VE0?Qf`eqLȃ/\'?EX@i qń<3&P gWx rOJ\C(/&풚 }LC1C7O*b<`-(IMϓ,:u׍ԥ4V]wfP#Skv|̵:Iy̞uS/!9rQ6`Fz6UImz[)CĀ4=pp_*`@Aذg$jN,Ѓ $VԈ o`@B@ a^FFJtrU4ۤ$DE4G JJdezWTHbu"~uJqќI-в/fHM%v:Y%U,cif9Jݶ1^%"#%f8=`Ntݶm?qˇgZbXm%J#8(\!#fdr1R>'mWLV@Sa-Q@~ JdĥbER--_9]7U=x#*"\HxrZF-\ӲF%z;5(jB"}^@԰|P{DKp9dnyhÅ *%!x [̎Xԃ;Ȱ8 NM>P^5X)@xcV,Lt `ɟ+T%@ .&Kvg@ Ed.g= C=~xI 1J̨aMCFuR3/1-g!BQG/*+X'&$ZXZ_D2^O4,iT"Ӎ+$3\(iZ{XAIuǑ HPy,yn!.^UåVE쏖/!z9FCV/}ղ, H&N"4LBOW묜nK~iN"iYGEr# 3gJ?TVbHȜBD$X``ד;dd#E 'Ģ}z $ac)~ljK,M #b2&M6`D+%n-݇K M+~Fi@(I1\_Q Uqv-|U_QS0Lˬo˶FzfhNpU. ՈGO?Cq2@BaUFL.$)1!7bR\{r3^S+zUͶ1dE:B!Š*hQ*: )(*Ϗ C<̋V{ڳ%" &?ȕ:RTAȐ:3]Q+#$MyĆ[ +V.޵IƵRtkeF WuNH!A׮ +JȊ'!J?!#djRRGj6^<!8 -kKfW;Wmy>`T\H%ϣQj*ɜ>*}AY }t`tLZ܆ +h3Ħ[@!kU.K$|1X=2,6^E7}stBU$rr25R9FKJ)~u@0&9\%O^J͹P>= +(0]f_M+`^tܗ + +X";E)&!\eG؀Q 4ʎ^' >%%*)}2<Ӕ>)MS8iMaw%v$AȤgO4iO̚U[IeFHj~=b% g#bEJȉ6&= 0xˈg!5|)=+:CEKIG[>gdA.*fa@L [Fk]-1  + En,=J^+]r˩+iM[@V)_4""%"(=?!GwD59CUM8v]Gdž B"$(ul[N/`u\FR $8@gl +QnFږgC9Dfx`! +Z%5H2#5 Mk1G$.?p8#p2&̢ Q0V2~Y@PNfjA(`|G!l݌=3(~h׌7iLǚb1.@A7O[p\g>j& +ݓ+Ci]=),Dĝe,ݥ[Az)H]4i aam}(=C)#f`#ڭJ E1$Ei\糃v yni5jիOl {g6l^U(KtIfE h1^4[b ]~5YTH*-Jds1ݲ Ug莣HO W"nQ)9]yn(@0-{͐+-~|'߈ʑ W!KqnHYv!vw#L>]tA6(s.ݧ[Aת?U<0 RĮp=u |X«]Q"]i(_A_ r֮ uwbq; ~M~OPt*+3Ɲmy;kmd{IRjFn̦&6Ӛ2Kܯu;#13Ȫs4–dLb"wƸ>B)NO%M.Єm;8%Ekڃ**ݔ6f +03C4ɸJky1*z@ҡo2DM8 r"8Ň77.&2|P 7_Ga`xN݀ID83m4ҪRn=9o=ԍRʧǢqĶwhk+W2 )3[Awnm8T;W/3cYXEQd2c +Rݏf,}Ҥ*D6 `:]ɠsx}ʲrXiwz9Qk.Cd"ZBXU^%N25{CXl<ً8JCY!$2V? g ϣ3iRcv& Mw[0G#Ɂ){lZ`X."T]_/޵ڣT;P:IQ,&,HQpB;U-mE5ViiyI)b1τ)|۔DvԪ#DD]7?>Ntv%J̩p;PcmQ<a>Ǚ,Z~}xd} u{=%j+$K1D3!^GhvaIM @CI݁/=$ȋe%g-p/r2 3^ؑ`Y p+\10ьt# nWY .$488[)gA=ѷ%*&'a&^MtMƢ:ਦ*i10Pr+ +mئpbvP$FHI% ֦ *PMw +,I:?׏n}2/keiGU",&~&=؁\uG*7ޝ߬j̣SVT_5,U^-0saUkB( l7 S*}Ñr /LLAfݬ'kНXr gda &hS Uqa9:JYᘜF~̏n8 T>H-,A .F n7ԃh pAP +ep px?T^D=6&OD9*v'^ a-ⴜz_6IbG2 vsSie'0[:TX ѹ^xǽpcq\2ףPtJ"'v|F*nk9z +DS3dpHz2%]`3cwi 1EQ'G@49° ٮ+[NX[jL!#HH(~{o n2UD42F zJ +2J 'rYAO]^l[mJW2TݞPjIWXV=+=C0d8#*w<BwA&#y'07MiTWD,0˅%K:1ܛ[Խ75&>3)4x^SѵwMI㐦.gn= j~Ou馟,A ħ=< X*8b W8#xʗ1.- VCKfҬfzC;p3M^oۗcŢ] x-s >N=*9 +%0G*"5pv--rjZDЋ:m$n0kم0xQ=#ݣšS:C!~ + JAdV ,X4:]͘_4QZ¡t'. QU=Bɿx xd6Et:8 +O(~MwZǙ'^6,$b ?p2O4Đ] T<vr[>4l +4 Hw+Rm"B@"롏=JpMM%NH2*CHuI"0)UU@>N@BBmBײΡ |]2K=hgfQD) +W[YP!WimjN_m96~+u}ˆgeo#s"˖Zh n4޷!\,\B"^,`d6WƉ:Ӯq2 kusmJRtgǁatBmr/<2#S =aHl8F6?[;l)+(n$6CHQ&>KO$a E=kfu{ Bk3 c &1##F a4&H Q3p q3Wvn-H^O^s e8al^5QmQ鉼_;c~Xas|]0"0ۦ !t7gLL7ldzl6a~ ۞X7]Q$@|Xa`db͙Wx )!* okꁉ 8J9A2Ḏ9c y>8HqJW]Bu,x4L=G']b`@/|* +(LA2@0  +|US RJK tR^%6Yk<lL 39P]6XXG"$ˊZsz?61l}7(pa=Y981ֵT6Rq0%<(To vplV1)X/#\'֊Z5OX&zGSh~.y/Frv=5JΓ4J=m[\B7'=fiA  ԈIdjtTUkn+CJ)BvF/+>u|$7FҚ3sȈ*Ҝma,9 e' xQ0RUoft*3` Cx?`k_`(!lsiw @Ϯ Tb1T=Z)"$ͺ"P%-m!B{srQ67y¼44(+Q6af <6 欜E]Lyvd3ȿ4{L6L*P'.%ڭq[B֣r/TqS]6ylW`syh/2,'b[hm^t#d +Y&+mKfAo9`d[2Q9/K_O0t2Zֹ)LhjPrG9b ւp EY&д0@1,l@|r'mQeUkud,5'#]<q;QW: -2$Eʶ@Rn +P'lR._P{@.428w= _vtTs%i⽆>. k?f{s{華{KI W_w㘃 LoNx!f>!yf10½ +A +m]W1 +ͨx&l.ӄ]{U ]hxoð\]Ndt>he(#h)՛:Ft=znE?!D=ٍNdm5-W˲{"O=Tŧ@+WD\p\[2 4%B3e"/%H#6|-@ʿpidX,~Y2Bzp|ϳ# iv{jG96M5-@ [`O,0iCW.'0u7wD;j+^k:3~}lP2T/QxAAc)Jg/t,MMTx0ItXv72GY=v*g7`y Ga+J d=cAcv,Pv@.tSW͍&TH YLpLeQ5[bd& ^wڣkuk#*R5" +ŘBUcZ e#؋1f&$R׊ݢwL@lȩ bz[ۀ>n}:n䍪s b &+[<ҽ`S< 9 3`~SzɄWqvՅzr8ޗ3},(2!Q DbK8)k"E:$غ \{£1mlڗ6ǔS[\o#ޭo +t"VlVd˱!s./G,/4A.UOŁ@*eyNn9_{h[83T?:}jdviZL+,C}6ZU/jKc }GJ O:Ǵ#REVUIC+RkQ{,S"g޷ +e+oH/5m0r\:m\uӮ}sﶱU|:s0ߣhbo%HYtb")=t [>סf*_*C r&s?l٦ @3tZyR$fαt'˝ :f5j4c T 5=r|xJwj\^M5_ &m[_ ЂS(6r'bMpK:Ginf#|#~̐K/A + TMy&MnW՗c +EET YqⒾ[-s _lHd. l>2D ,UJy.sB}Ega|Ck@Gu8\muĐSxT\4߹[H"T;7Q {P#%F^˴K#|)Z@:j7cNfi ἆX".M 爎bNqC߇r$ۃ +j#s`Ju[:y^+n[be\}:ziM4]߱:`E%.nnbmiyfP9/#+fO*tb_" aD QxTx;,K6^lHUq觐Kt)wgu~*סGOJli*R$SP,#\ 2a>|km^kt;ZuA~LlGׇ4 %GM dYj +ω8$QHZ< x&j){vrL A ^ 9SJ{ yV"ALs1**W<rv܄Mt)j]v^x%ծdv##/Qyί:h8NJ6&y RƓ:[hHz9VxU`<>bĨۦe|a6ӵ~bFx\Wy8bUЬUQAkf^4+ihfjT`u'H~a`'`T4Uy$ՀI3);P+ \Rd聍PE7>< J%8_{OM.뺝5{})W<zLUUkf~ƮvxEm9c)j[]k]žkf +=EOAtM3s{Mg{;E3x\XA׬Uk< 9COb@vU Pۆ_D#P zA|mގv%2 udC (r7L#('rg* "&bʭIP$F# C +5HUj?*}2 )~$:p~I4cP38?A) AOF֖ >9j}cW$c2$dc9beae-62b7-4ccc-b9cb-bfee00981a7423fefe87-c0d9-48f5-924c-767ce3ecba894188m10SVGFil/ : +/XMLNode1xmlnode-nodet2;attribute(fnodenam(objectvalu/Arrachildren; ,y0%yh10xxwid) /AI__id12numOctaves(2stitchTilnoSbaseFrequenc.0(turbulencresulteT1ope(in2inSourceGraphiifeComposit/Def ;44fractalNois-2y14x4BevelShadowstdDeviblurGaussianB12dddy(offsetO12surface(specularConstanExponetyllighting-color:whspecOuSL12z(-2000z-1yx5xfePointL1212arithmetkk4kklit33k11feMerg2Nod-x1CoolBreezdilaadius1.ieMorpholog1bb-db2b2nyChannelSelAxRxs3b3DisplacementMapmatrib0 143M(b5412additivreaccumunoncalcM(lineaNfromto5tofillfrestaralwayd5beg0anim8cc1cc8cccc1cccccnD_d12n66Eroder(66_d(_77R50 5PixelPlayspliNrepeatDindefinremov1 1;20 15;200 200; 15 20;1 1 11212ck2;20 20;diffuse1yellowD;green;blue;indigo;violet;red;oran5elev6azimu8Di1rearHFf$I +8  ,b*K@P ( +AAA(Ab0%f\:J4 %3bZ8`vb'gQ&s +{(4f]/9n?{Z@+ +b31ۑ?tlg &A +D)H;\3ϊ.',E)Sb4L;iA222x{h l8-QgRHFBfuZϙf#oE6cvzsLӉC%,VQ<-wr +ܙAşJi7p)+y~d v1IUILڰ>F:`0IqzSH1O깯qB {em,3h.pveҥd>RR෹!-Ł*/ +{B 8. (6ksz T +? ސ7CEMdA;n6LA-QZՔBUjIZ!CoL}DQi %)cB;h"J*t>ZevV=b(ebko0*&=7Ыg* 4ʊ\"ƈo"礂aT̕ MRЋݧ~=xoo11{e:Pwt@1D|]jMZE*q%_3{ iq%B'hByZHDȀ?y2` +ԩ;CSw( R HX( G@C 0E+ā|i܇x|Pp?U7}_ΝhY[7Y.}|/AC uJA*^h3Ď`Xy 2%` ^777!(v퟼ xEhu^C\.9v#qܹ4Ϩ嘑^VX^z VdS~,LOv(==zQbjS!Mj_Ҝ6X b&:`Vmv랼\FKɰK%̳x}+3 *a +KDRqmvzH0w!إgIRHoa /h,#fDffɀjOM6D u\MkkYBGWV^AeNg[ q+Erzɜt{/zՆOJk$2BX79_\.dm5cOLwJ6؟Ս9Hv@5P7x!(hsی6.8ST`eGړ#- +" kPh]X` aP~U4*Fk=5=ncU!|Ht uMK+>&Q |&-yȥ2{NG5YJ U#)Quf=jWQ57,lDkFv@c@Zҳܗ0b$sAGz+g:LB\4gbxZDl3O$FB +4JI=FVTF +prW} ++7j)x 5P'2H +X 4k ^=d7+Nw!5#ZbjS a=\}heY4U Ls}|H qs 6VMEŎ=go`bY \*4uqe& uipЬ(QCsQ*P X|!xys-{%?ggD?oX-UuFi͎[Evn}ge6ip>W.>D$;(t…iqٰ6 wEB¢8آE X_p_*g^͢ +- oU%H*+?|I⃺ C'wXv1>)cndDXNc?l;# +:ĸ|wcK44mHO(?7r0Z] )O;yO{Ldn}j<ʁoa [/+А&I1M!""-]4 s( EH)sZ5Qal" CT[j- 9Sv@0\rLjG怐ĄDvLADEiLH(/\ K1Fm;"ڱ=8 2YQhix@@6c A_C;A@(|N6I\u\Nr'hQY3,^[k߬ʗk6 eOĮR_: ${!q'JGo2A.< 5ˠ1Xe=jNX8(CqvZ AESs3|'z$5Ek8-wCf@q`>u+3зd>O.M+ K'U`@7XЁ!ku vb<Ǎ!H?hWwk|Hf~ b')$g!< CFrb8&3<kKJCdQ> $IK }nU !!iCC|71yc;D|W2D`"< ƒ 4XDB ,pa4n L 0\`a͕p&zC;*gYnuXc_s\qxDM-{qǨ6EJK9RHwdGHI[< LPZ3bhtb40 (!ATƣhQ0ݷMJYuSYki䭼!*bLΊ™'rQhAy*BW|ŇQTQ**)ǜO|D 0Ajv@(iaVP09"f͹jEa1LP(*(nPlRF`b +Wؕ[q~q';We&UºSUbI&K]ʲ4I+H9(\DҔá8aljqܠѾ(N))1&8<rQ8%~Q5sBS^TS'i Yd^co|&q(uU1A@U;dw9cRU'VQSJxCn Z*{\Q<2ko)=p\8>C7:AaǨ b'$NC +Ǣ\`H(L(.e]Rz@a}uslѣxwQl`zWhxk9!D,0`P@x@A"8@0` z"F^@8LP5EνR-Q_: ]sbH7@ pkIPP蚩 As5fEͲnb\5 Lw76m󙛾AК r]YJyfjmЋt5YFi6Ooi֚.^S ;t +cEFnfaH(,@,xPH @  6__**ɺ_|yfv[P-fSUXiW]fe]!b "wG9XXr͕]}\+ٶf"-5򖇘Fy_~weW]v)oHUzWUMVV%VV˜UVTmҷpk{ x6wuwXswX¢)a)^xiw[cY+-0,s-y_gbNZً33giU)rUk] z= jW[i|Aizajj65\SS35P{hfk[7tf6fkkaW!:|+:C稵ک-h^ cy0o6[)q.NJ01,r +Wic?/Tu}vS69J^XYdS֭~i9n*{7C2qSHiDSH73^aeQ4t\vԶO5V颞ZmtH٩?fgyz=5-uܺWx+Ժ}@0 $2-05432xGzR*ٺfgmV֏Jeu5$eZiK"23:.M;sYU+/Z/ +@h$`  \fsi^<愕7@# +tuXM9vI4P# vE14rY#^UORX2,x101~MJf`jsLǥIG?X.+b(Tj[L7}T*),ըx@U%ec ~>{v āU j8EPsЅa 6G)-6;> 源OtDT 1/+ m#2LujǴ%B{U~gxj:}#HˍBVpkp63I=OߒS((2m':}T;F':a{,E|k! 6Gm&14 +i(mTN^R~1Ȥ&"Fr<2{ iM-гKzy~.Ao1C& ItJ ? D:Ƒ;L% +5-`*cEL6rgaXRQ!) +O^X޼n).bd&ce.V$ a3(s&sJL$X*4"o>h1]zK )1m,] +pS'jQ( +=Ů5*DB'2GAgbAV>^օrjUMq &r*ۮx#N<;PmR/&YvX֭bŨ m0l ٘TUhK5rSʻ-0@=l5 S;f52J0dB;yj1/Oa|{g$|p|GZ=:f%{GڡYRim 3mIUs$սIf>I^ګQ(Lzѭֆb^hhr +:y.83#T2Q)a,\T' t+&hȎzJܕ~ś'~M#}Zy%1'N ra,."@jzmxI0I2hٖHHSF|q% j" 8uWB,lxmH HTH鑀9OVY,7fb\5TA*` h節aYr~LGJ1A$Sgmٍb$dҘP&=HOp olIgJB3\*ꔄ Lk#Ó##AnfbG½yr69{"cJϓ02F/Ot.@$>* iyD!oh '}j9C& +-c@ uHl3hΓ,ό8S +5pG{+a[ !L ݻ"FkJ|ĿC87coU LPnjm7 wY ׊!E9m|9IRF0L@)~0 )kkddaOv'gg:Wh|fHA7jf<|-x!1P9YHѨQ%7^l6"Z5yG Qg.YP&5v&X% AP" %'u xDx~iPM_+Y$ x +iD纀NNc7m.0Vg>fΓ@4m^.i]{s,Q4MA2Լ* 5ˑ&\M?n@?pʰ}3?bR* =nt.O KtDk"6K{'2RU9,%[?Qcmɞ[CwES&Uؗ6>Fi3zHI`GGe^Y]Uv1MouӇ(%acF6z߬!>Uۙ3L,5 gO[+ip|(:,lZ^H*8X / 4IYZP9jRrZ2P"L%@3R Rl[!7SؾHÂ98z| { {m3IPcp e= g$i%ؘ:+e4ZrLKfoݶw5e @ Ij kc;U1/\n*hd.1&>-jqDDuLJke)ǒCKg""3va [V~hrDd@,'ԨlԂ K +6(;=ހ@8K LM!\62RȶAb5: z ? {(; ~n2k[N(YΔ$#jҋ9L=A-UzXr鷡?jbl}hL/ jO(0Op#+:rJO1 Tv K#cIQt0ţep4(YK"pYQHբM9=16caČ?#t{>CȪ!BMHCIw܎.S.F 58{IHGMD: +`\v%D!hĀЅPW pwh/A$F㠽cmIYذ</&gs@Nj)DTVאNB$^eWeܪ$hzG"hLSY?o.K + RR|Wy4 +Ӫ)i``lBRAܿ2\ m%ʩ?2&ƾObjh=Xޗoж7ig ATFBr)U|:D / fq:sd8ڧRIn'US8JD5l2Ci 'VA$P#1r6@nAk= 7>n㣖*8\OtlP1&đd@oc3/ebBacjdpZ\unGԹZIZ}TRmAue;q5wYcQ>;ӄPcN&E? hxCfk#t4 3K<܁\qˤA74zbkܯ&[ZTXqjxXq&HxYy&*yjqtHYzVU:kx^`*LW{<`m J4RN.n-%3waZ,vU(kqћg+SWjS/PL-LC+E/|iKk8+MGd$gV@΀RB'Ŕiٯ))}JbHq̉7Vsw0ܵ`^$ΕyY[b76h7^Ph }rM31 ThlfhrE0lKtJH,QIsFpi H%ez+=̳Oz&CYr÷Yb\z90}Aƾdq$k(?F+;܄9b5^JE( Ym\=jqΝ> a F2]ʠtEdI\u@ r j=U.g%\&fc?Hh/ KCo1A 0vȔS]9)kPǁ"E[ fLF.޴nĂ7L,f-/,KIZ 4*(+ +KKi+[aL]}!Y2 6x>6f͕8E)l4ĸv /csVj2C+ZnD~kIM0BU(wTCwj1@ `@ֻ٧\pQW¥̓=2ˏ)OY:Fɪ2]:42jVOA.QLzLOe X]_28e '?y#<@'  /&YAjUyM^nTA4?DH9[ڿ-}ffs[ WBd +ѯCks-$/w/A05,1>6`qbE ۠Rc%s!|saouy:?@J1N讨2ݪ.c0f-s%C!-j)0`4|)w ny+sh:m Ba Tmx'UEJ . EF.,5`+~əҙ t^q>7rp)|8'pHrpkʂI4%0pι#hܙKKVoݹ/ǨI)|)7Ӭدepq!Ppxz;s+w*ҶH ulT|yVfڊE&]e]n.c^ `,'Kedv5#x_,.`*<wM-}|lDh1*7rt ix2!C%M}7z>*c»wĪs>#q-?NhDJ.:Drt|! L@M̕!DKXWl-@ABĦ^3JN^N ecc +B0Jf&Jzd(*^3ݢƦ2%L̼8> +'Ԓe /׳:O Q>0e6y2F-mq4&U3MHJ`IRf h=^X{7`^г+ -pMyK7nAl%_Է7AL@9~@,O@BKaߞhy-l*:&<&c,CMOR\ 4_jW mDqC|^28ʋJ(uW= W`[˹@ !efPO\I>MP/\ YkUN_ը2HH6d==1B(LX668VFc3u*(zNtrxM>$+-;3ˣHU}Sފ,q&=AШ Ia4{ҹ$XHo|5uU4 1/Wآ\X~Psu +IIApYD,7h (R]Iu@5rXB, +3I ΋`(UaV i eu6ӈ0PLHF^ *`=7o +R2X@7=Nqr{jWálɵiF`aDkq.a|:N 4|K-еm{RK8m0<_)\ٖϓ[|!̭=fRfD$yأO^S@3Ң ϓ8ថ)#r V\a|>JszE'Ex+RBOBYȸ!8`No/mr}E^"uSCdf IZ$_]x2[Jb!rP\<|BԴX6Fv&lйg)S-֒l\ +2̸y8JĒzfbvڭ[GI4i~ cqv1K@Vv +qЃ{ӉA-IM.hc\SM髧 Dih3n%]SЏ5R$Kt[2* W .ƼI,Ӵ2B>"Cnn1 6$F>QKc #[R%)dI4/3~L^ !y-!ImrѭG!Se̔5d t-cfh.a5FB-d4E1wy&''}-56E Xn)7 CSچe\Hϸ"KG_q.NPf@ff9$B<Ѹ-GL(EYgGJ($d׾-UFi& 0TeIZnd;=imk66qFp +,nt΀ւs:SU08\dGAgW=鯥r3Z4Xt@ aK1x +K; GHw7"*:#%ˉ9Zzjp +ͽOSsƨءJ{>e-dF#W&zO،uFrUvWIi<0/G4rUÎ1$Ԣv.\dbhǑU I6 q&{v I;*k׭x1_dmeqNYfQ/- AIKi˕&5gT +Og*Hot:uY4@-Ȭ<.AR+*Ֆ|q7!GqzԌzc{.R#iSX k(͌qq~_n| ѕeɠ+ȃ:NV?lrQ8EH簗,Qඓ2o߱g)}n_/*tE6ed@Cv ?j֫FF/w=WY"O^& +LLVKL&@3ƈFxc-߯W¡PH5mV,tvAVHv8x21`6($4HRa;Up +9(^y䒏D&#>́H`!4k>bi|"z`p~A·!^4M!)/bSJx%5I\~gj3^z'<;ɀ$[&a5~,1H&7O5Q )*q:2Yq@uCNـ_ M@|.Ȇkޒi" ?yD-ʢ7ʥ8 9b(P4}U}Ј"!8N!"-G¦i@e+jP7R]ۗX^a"ޠD$Cr~VBdn$iPL +' +o5'2:.""ךCv8Y9X7971~wN_eC8gϒzȸxeITPsOa4+in Vs$y̱9qe3=\>ճNש*R$N[e5Z4F{&@ SBbJ"77I ǰ&N.dzlP1ԁ3@šJAu:ę&_mQjφ0[σȸ;0.OtڿDLϏE4ϰJOjJ^\bڸYԖjQm|8$N4&)o!We5:_Q"%WɠAI/#(hPhEL$X]㏯L%`S6 - vرǥq9=6rӐ `-- xoK%F@@ +G黼X6([M@zwDK:"V.nC@I 51(MmL-1HbrFXXO8efUf GCvCR.us]*Z87{|oD}e*˰ߛ;6W /G#9""@|8& -H$ӎ{Tx;e98Z&>*cH$zǻIt:h~zkt+vq4ǞGng.12DF +e8"h켞ŹTcQ|qZDz飜"S9]2yf" tf0cz>|v.ps `QMTц́*™TU,k*ni/6k iVqՓcUl$Nw~\c*Cl %9 2(U-˾ 6-yd;2,[r@]YG±V-E~$!ȹ tm׊&VCL`6} +ekeR'WcLjY, +%@eט:Ocv`wfݟ9ZI{u6āB(]F\#a23)r"hwP mF`#^-X5Kb)D~0ViTsxA3c&>u͉LDWBqNJ}6fU2`*9;Qw*Qɳ85\^"Fz3nm;<6Fyn%?^e."8G&G/ +fTTzrF^@! + <Ջ aia*ʣ'-ɬ&.S-(f"eJF?@XZ\GX{=;N$8REbbˍ'.3i ב`6mi[C دM)璙- +l I*:!z3V6q~RG*S?x IdN^b PjK`jc,sXeg:%)J(/ц|%O‡Mpz?JT!_oq{c#_ ء*u|v(WE;|C dϨ)GHj!BoZ|*{R<\Frtz:\ j6o(\oȝc1ܷ7y KC 643T- nth 8bŏiIcŮoT2Eɠ + TB߅#mٺY?>[RRͨC8X +wYS?h(NUZ+tQ2PDUltd $ikг:ƳN #ӈ+q.,,r\jbO`:L~m=vI1* m(R-6W2 F-N{f<\ m*^3t}qAT |z;oaR ":r4u;l%R]@)JlڄCOK.0i L\EqUh+SvX)fCm$YmN[Gj:b"Rᕑm=0O%ދ!7ϵ2ォ}4qGڪYʖo\'egf·N<Ѣ )g2g ^q+d1h}z"`],nԇ#nIpdfC *KP&A @cvI* ~£ Z5hWɚϱ.?]wP(伨=\5oJz?q⧷ p+8F#&⤞ُXv}QEoWF +VͰ!2xt6 1hxTޜxph7/+c7O`?,t[.MY+E~FزXrG9c*I65kC6{[761)uh3Ekqj4ʟSOIZ"Z71'1Z8Շ+ T5^cƖ1 2J)WDJyK40U*{Ȋrbjloet3>#2 z@C? >5ei:m>`쨧(RhBBOl fr 琔v D6C+G\Yw#Ґ&eD[2GjV6q@\es ׫#McA_i6m@CD}OT+!4K*£JoA['r$GyYYjY=.<#B"҇a" A rxGdwS-SfT4m*]Nl\Ä SCe-oibbmDx"d+ri|ܧPvCl4udKK 8еhDR9I1HеF7D1iitDCܔ>啶 ,-Т4Qհ(Ď@JHX <#NQ<<+YrBQ:h,  ~X+ss +ɫRz̶`Grf؀i>)lq zKS,Qk1lpb@-\@vfG 0 W;7= TR*2DF(!D&qĦ^4eDұq0"M~ c+G}(Ė.nWgwYpyԩMW7"DlhGk VN% ,!UueO:v46TۃV%?o:uh ʧ?cq<-)KG_ wm;Q%$Q*,?,# BɸiX"*/qrtCпxrbz->wR8RCDҕm<9@>.vwA ^Gdؑjß?2HB۠ջ{j9;ei[Y-;5UV?Wխr gxykg*+W'Eѥn{~_#oGX PSR1@ڒ1X!BPO)}+,9嚽Š_,|3j%1d Q?:أ{}٘W!E+آwy &N飨cJfo夊7uQv-?oHSi6V:OEqGh133A.#%(k_eKz}gjY7k?X4hp ;"[#NBV(o9274D-4X/oS7|JzU¯O֘P' +R끗)v(@y$Үn͇L*M@UrCUSHہRn@"@2a^P0& xXtsO?u9ONЛ6(V~s&*d9T]x{\R ߍD `ZK[i W^%44r &-~C)7`ל=.V5PD=;Pl EոH|,:DFD# +Δ 6WP"f_-ZRR1%O"_ĥ^n&A^73O¨ጔg&~W+t)s8I,kF* J#K AVM~2ةdFVOdD[ұm$/ )fԽGs$%1էMz$Y?=6O:艹>y(q7R9/IjhM`H͏3U.7Ͳ5+'{34}_2qN_xDִ"d*02XTg"9P$c1_H`ٖ-eL6Sva)m5״[Dq)]P l3E%ޢ]k0so':3A~(e'ҘbQTZd[yÂIo4uF  dXXa,h˒܋Zז9쏖MlȜʗu/9`7E7K^9P) gv8BˀD +QJsFK ~ K+E;_.y~Q +MwWnʜ!2rr/gRjj:y|%E+7m2U 4jzH2*Ǖy-*rcǔs]Zo.$жl +'M9ݚWΒ *ad(7*e)޸׏F$kӜLqWY7)dO}K8Fm)"K%o1{irȡH5)[g.[r.vFρ +j'u{LیX)i})jjk=3mPe^m2geY?Lc(1I=9C>g+-I9|@O>eVňC[1f8}pDlK*#1l?숃JA}b@Bj?3fV`:E9:d :R yM\F.FA۾F)ik2sKk[7sIփ^uis~OOu\Iw/O䢻x@-*dPɃQ 6{s9ݑE~U/W@11]]Wb,GVM3|ԊLWhp`toGw־@Ǝ̎w`\dva/+z[L +}`Um]O3 M߰"E`o:n)7,cB +}l'.%},>fU=5Fszȗn\x{,$Tֵmu%=^nJx8p)oY T?BbW&^ gF9gA4ǵ'qaiNY J%bb7vm렓ŒtAc:4 +.hehU뉖/Fzx+ JOͲElb"`r|(b,v=0Le]HuYR}XWBnB}--臅2M¥B.-A`Sk6hE_ܹ5]QNrV]p؂QWl:0Hl +<0(G 6{mnj#Ndb1YvX3Snauǁbo"{J|ތM]g2~SCx"軠DZc uxH!`$I q<}3}.qqW1q|CͦL|`Enkm38ݏػ7DtȂCl@I/Tzֹ+3۾Ծpr' Cu8z!|++ m +g*7}?f@4=MV_L7zZ̋KKk:*dx+3`p)We父{,yRTI/ Jد=_q@,aNRݘ/VfBv=]E+v@H` |MݳgFpgϹo%7bdaq Eoقepdлx=CB6Y2L{\D:% +NW +L= zJ63+DX``YN(lZ5֜qQ].&D"" +V[Lck~mk}W1^n<l?g!f-xۍom{;pl8-Vgw>}/쭷:_lw{nl!u{bZ\ݶww-sr߾w?jbꬿᶼ[=c-o{rv-1^gz{;wnC1wC߼j{㋻ΟVkouh1߼vk-c;m1|pg|5ڇk_gWgY/~ou[믷[k睭՜moqu[L Ys}kZHWg}-8__n1ǿ1WnDsSlTu$r㐡b1Ըc)fE(\%eNQt4ӓq]㻹o7kЭ*o~ǻ7mv o 6D pvusvWǛ!> 8~ߝ5.VsYc}@p0]͹=ݷv=ν-d}sl]<}yNgřNgyx g{{>ׂ{5ox79[o7ׇ֝k;A8ęc= 8?/ӱ9yՠnxc \͜zͻ}W[mǶy?׽àv_ vxkᄏwnΜw;mZ[~{6.w3̻]׹k0n;6ͯ߸}rޜox}svچw3u39 1bεY{xy;y`yzwno vܘ`sۭssyN8rCo6ܷ_؃[׾c}x;;;C{3ec߽ŷ9Ԟsr~?q9] ns}9ۃ]N9LA]kFIl{W}[e#-Ysy||}_+bnl6w^o~!EXkm=\]̹﷗g\ḙ햇߆bn0lyYsWg^jٽ<߲޻ ξjkA[iΒd7`@¿EHj2Mve|DC4uRD44Ils +up]Ghɍa|hQNxyw@1322{^"it  -2<.4dnPBӒ8?>\inw@ !] Ɍr,18҉(4Bw@ φ4tÁWUjUNU( yyhy_3'JF 7P%XOT~46#yr#;;XQ Ut4ɒ65,DX5v2h9 WFq,c iS".j(z95Dm멆j:Kd!N6X*I[*JbK1G5ULki]U,G;۹7OٸRS83E1󬫲}D mD";9J-cKu5":(LҦ'm,~RW˭VLt p+m,y 3E;r5E*ˑ͓iXd)˝9,Gh%K1֥*i`\$5w:{EuUU31qȎ$igH[S%4LDK{gL#64H*Dgd):Qa)2#.Q~[MRLIeJ'XD',Q:HvvV1T+GWQjq,7eU;KXƺqS%ϴ֭&;[v32ud昊hE5SEl* ;:/Zn'v?Ս51W3]ɒFn v먎)KGs\:^&6|TDžbyij2- QG8,g@1g+Υ5 9F(lR6\onMl0hhM5hH1kn +fs25 4|M1GĠJ \07b(^`4pIu,\Ңl1\,,// +d6l +Xq4FJ)CPQNYXH +j]&1xrD?a1.|'cQ9)>CD PHLfj H +w_p^:T|5|xhz@ C$ @~&q8[djuD5Ҍ.`:aO k%Y"ex<u fƫYZ4\^xdOcQ|/2Ka{ + + FqV.{UKpֳcy^K%6T +$w<8<4' lb:GI`$&Ї$tYI`rȹ #\ J.ff`SD j15sˊa0k/j8TiOa +dZw@f#z@3Uà_"1H(1%J@u 0P +rq !a,n/L!ɹO,\ޅbZS+0y.LR~-\j3yUU1ZyTN ZT&w@DҏWYj%<6H '`뎱JA  Xkr~D(~.B +2! x,ҔK; ltU,%tCUGqT]"^`x 6#.G5 ,e^MH& J80i0:x ,,3H}%$`< 945V"]Lp9\j5RX +]BfSfi`͋YcA +Kq Wë*0"$ĥنW+Zr4nT" "42N:[gl<rKgl+0ڑaFF p(`,,S) ! !QM&VC.X^BBX 2 0`H"LB'8(冟sxpGw@,E#_ 9/:"vACfE y-%"&&ñ&`h1<֚7*180JO@H&ěC 3T,8ZfVMZ`P /1Ys3 1$k[D[7)!9"9K? @ilTb#&uDKP$c(!H\KUgM t;/U1HJ\1dS)A+6QpHLn`D<0Bx@ryyBN +Aj7ui š@$R"Uc <LsB,eIB&\"Pc!_ h|6r7*1߷GvQA;$ ُb3@HG=7\#Ie40/&0zC1CQR)fG*\(L*­+0" +W B ,; NJBye'BZuN7M*%V?jaLPւ=%P\q$>8.Bcf9RIZ mQSЮ8( +dž6&0xc&yw@0J) .]I]"W|nn!2|Ģ+| JUMb_AztZaF1%qid4%b|(&K*S1f$;``MCA{տ a3M-z}dlj0<gt4Bݔ; (&`a<!( a5֌iH"/ hTb bx"T|ED]Xj*D׵E0qw@X.j([z4 9. Kw@/!Z[HV5r<b ʂ6FRnTV; T)C (|f$vbPTs AVzb/KV@ܗE`BЅ(VWw %Z ]c2o>qE}˥O Ķ/) 'ѦPw@p{7-qKrie#y@jM8O1ؑ a?4tEʀ.SV֌aMK򫆿ޕ%7{ K> K2e?ʘ`e/n i,ib`@~vX"b @QUsvɠÕɽqtIAGڰ"؁UUNy}-`{p=7GPj HyJ%uƖلްP./%әOE0uh|O!g3/2*~&;~&DF׆72" {y +eŽ H'kmxe5QYaOzզ- +о`N*vWS*hxĊE(H5NJ ]4UQhzsCkD&;S&[F lcv_4Nh§|шCF mA%}ѸO-(P/z, h6%'27U/x:z*X3}IgQB%!1Dfc@|4-?4?ҀA-t201!:&WA%dNsegU؃i;ec_V4Ͳ2f207 T,lK ~'vvͺ3V5},TRɁiCCsd[ڕ`P͖1־U +9%?c*TI>g. +6ke6 HWJmW0X2!@,fiR" NݸJGjLa&՞=֬ wY}?=X›H{ۢHtXNI %zg3$1@mL} \oo_ D>2R\]b)YWR:+lD. a5B(FԱ#ԙ&F*aO~dS}\lu٨23ʖ*r[}Yl'b WxX"ǔMȭ.B 7=XLl'SDՀE?6谛~VĈ^zY<{Lo[ Os fq@1w-rcvǴj_eHIߟͥv맣F>Z60pMNZ"Á(' ņVN64T+R*48y~Sسż*ګ֟@|YZ8UKzהP5Pf hRuK=zNQ 4T{\!( s3c?Q֗ T]Vd\`Vw=5@Ո:8uӉ{!'% j6%짞ˍt(i:} +6ZA/_K]RVƈ~OK~Y(YJ4k Җv} 5>IJy"o؁;y%eAkF%qw dj, +dCH$I* \;݇_'iz"c#F.'~|{PTzosTu~inj'}-*[2̓.6Bu"tu#T q7ge(D lnGt +""2XTD]4tJ˭hMDa;vt{)ud[X +:s,=8gbL&[ 6;[N1_#頋\faG5cmv%/2ӬA(w: +'c;A}H\SG͂.z8 D>4qȩ4#j`-7 J/_o IJ#ȫaV fRZ#?+.4cvwj 4'j,[E4m8iH}g4@Ժ0oBK:H" )|f]WNfA)}k<{o+ʁ&_d~n.' rڤZшi㇓n0!1;!sM}qZ?('=<20pOyܻ3ӂ>ٽQ4k(EU>iO%Et&<=_:]KK4|3da:x rܗ\ڻZ +g"a$-Dn_Ak)~6M|+0pNj0C叱𨁵20#d<.~{^d0=.4³1(,i#opdԫeh$ڷFUDEX|D v&xEI(71Au]v7sR) F9aPKH$_x a0QD[rY=V2=OsE'EmQ:CCG@j_k6Y1XH敒| .Ws wNӌKSx'4Hgd`4ghdQDDrH/B rpkDUŖiadR/K]C@RO|t+Zѐ0.,#i4\F'+M8W D V7&yD!/31U3;\m,Ow&Z aD5]aw8Ym&_i\#(9iډi! ./ +m5bj&&xY~1-=gJ,9P0ڗ$C#a {@rn i+|հr~dʂV1q"mߚd(& +#o)y~uM,AW\=tWM +)y&:%]ٯy״!f'0adn8gt/z#T I$׀7?<eO8Udeqh Om=. ,W%(?!&fe.@Pea1k:+G"r.p;gV5&؉姗cL-HSؽN#%ΔPa*^1Xw)[Tca.QFݘo5i;5Yús-[`"PH{Gm19YKҧ\9 0]9M_Jʹ^n&!M)RVomQD}g՜RL+574Aa~p_F6T~aB=h9P1ء a$tprGt%\\ꀻ)I2W5 +Sq+{K3 Dpc6cD6sgZË=onS{Fmp +.;Lk.'Z# kTy|-2-Cfd;:M?̹ͬfv>EG&nWF./Nu''YE٤ľnd6Ǖ+P13ld#Pi*Pؼ c ؏!#9A@Dža'lhr{ uݯaA}ci(zuflˤ.3Nc{@7f?Eh4cYGC͗UVeagѥU):Nmt>4tdf<В= ! \M*JX[!8,ӶD6,|9F =H)~?%;Iv<`[V榲o|k^7`Pnd^U18˗ i|< voJvת +LįYOP"A5?0({ZH#mCt6-D:p ܨ~nUbVC@,Ou520%uW/"ZȫOh p*?[оuž 42?KF6? q>I|~HHabtQz@y&-JHћVhjh(Ery"rO2yZJ:+{r_֌'OiI`yqLxJq;z$`6xck2>_[}遶?Z4Ǟ ӊ<뗧6`΄=`'.w#U(;ݹ(C:h▆Vbq;@l o)7N٩^Ċ4]Nb.`ORC˾֒DԹD:4N5%Jn R%7f RXyDH^T%ih(0+6Te >/'v~\)&@1 +1[++py&bj2S -ԱRb]'S}Ϝe !aHt~/- A|97jGy4A6HQHVȻ@T!:C;T#pOo}2ңf-4dyB$%xo_}:%<v5vy[,V)#Lq>ʒ٩Vj| kT:Բ+†ێi +J/+^m%?G + ]HIGz חNVOl %FS{|z0#fQFB,KD۱ \r̫ p( "u`4Z(6eڢAV@ "Vq^4lPѻG`t̕ L7$С蠼K r*~!h.Õ7bՉ]CB&.$"'^_7b+ )6cK +$PO9FF)bT$Cv+H9% ah?4 ԿӒpd&IiRxt,'*_WÒͨnfvl=0\d!jVB,JE eS&8k;0%1O7#iXZ@RCE}z .()EJ}#WcVnՋ[OqөCj" &r~Qez)$N[3cF`. +"٭F"o_| g^8]6{*s{qs^M}7dDͪt*nF(cL#O=}4ܻ}U =$aƂ\o +sLkRI(-AM4&#ڽij +UKAu[znR)aD/ Bd:*{Y3ؠG,Ky`BJ䮃ȟwdކKm؃P6dÚ̈׉@E+aJP|IˢVZHxS*>B 3H4$?t(IJ_@P +P +HL5%70" E{Εf.^m\ '$zʗ%AA8 ׆W:BzCj |I֒[#֠beFBAa_XBHFe,Y#|E\ g@ƍ3mV3P1Ts_`X=R][}H (ԃUXNQ.Kk%\V{_Mrv2z~gAv]{ĔE&!;ʾTkM ꙁ89k +f v=E0\o0IoH@Png5݆~ej87PY~1aBP@(IQM~gjuiD{?> җI/+1K|?7B (e2!(iPMƒ0Yi<g%F9= v'_jVz2`1d] +ΌG* M7I {M&;,"^ï (IR`<rO8Kh\n<ؔ& +xZ%M" +LVN嚭CWO8 kA2ֵy9y/=T‡LLd|eJK TY{7IY{Z?.%1Ƕ?2+Ags(d1f/gN 2E;+Z-AVug7g뭬u& +r4fH/Ǥ00l%2?'zBgMfS-!Yx>M:VtxYr ) ̮%޼2RMP * ydHV=GI~0/$W\M oSj+U)iPuAy, +lw=kiFO 9vi1abI@I 5ݯU=D{P1lX)$A`h8 /0M6zh$f7 CH !N6cjOb9ԕh7ߔEF!&zLGA`rwTщB9,2x~r: &Y͏ ᅢ%Ec$gRo./?ȭ6 n%lTG[D!h{ "Hd}Kg%~cVkvAiSg8E~!`"o %1nZ۪ NJ>q-1KtjRl.=A0gDWpSM$ŕb(,DAGb/ĹQ@ ;{%]4T3iږРXT[r|ۡau/p±ne~}vX:;_1z~8_)dܶ2)AB\A8C.0"#]q-^b:rL'|(e[%~ p;QL!*S78:9Y @5z3x +t.7Qg0CLYj$TAVޝ(2XM& +Q#x""OW{ «~g9VV ܶzDR{݇_X&/ 975+OZc'~dvQ_~u +]1DGĚ3"2P"P*WÁD`6+Oo9؆G R=f]X껨ۂX^]< +-?rؒI ?bh"7nPinYևlhup,HޕX-s<ܼ(SħgbOE^r($*!Ȓ&9ٸD&!-4t0(B ]^ ۉ XU7ll=`xxX:sbՠyua tG07b9J: 2cJLydkcKd&6{O vb^go$>xhG$1Ex_y7K$jfK)˔qQ)]']#ƒi@q/ڕۧz*< nl8xh Jpf:,hW~i 46z o.!J fʎI`4i᱓{ Dq*?>eVjgpCGh@EnAYex؁x?/\ٔ_ +@isgetaf7c/o>?UFXbJ|Mxd*1UĈ1 Etүb'($F፛k| sJNDTlovz7 ҈5_l"00^z)(E42nx2`pl2n|x:/J+˞4P^\*W6fC;oq o&s^#ua5OfNd߄{]:788Tg2",,BĖ̽bS>Kb Zv9>Q>t͘{zQ<^X-Pw@ +8TP[t BW"s1Ճelr2B͌X"^}@wqA yݓݿ1Ru׬-T~pV_ShOʏjs.Qk#Hcz_z H\׳ƵE [߿,E4E1=)s`$v}().cGCTTm 9^HiPrv1`3ns)ґeMa(yB+a񋲜`|)Cݳm(>ZH}jXH㗓"daE똻K +Ζ&~̓(+pw8Ѫh26շDUS&jS7 +^'qM,@90 +َ,nУұJ;aI[ܖLz×*zrޞ"JQ4h‡9*N3BAUQTqXdz7L[rdD~gTd,;BbTJf_-jl@cdjII>RNk٘# +Uڣ٧O{I](Wų 1MJD%7k¼ _yTUc%xeN< X렌 ,AK>0pTEN@ȴ?Tࢮ -n# P%CE'uwb?6,YW { +endstream endobj 15 0 obj <>stream ++FCjK@?Y=A 7f.vO hm}'&$xe ʄ9X>Y%Hc7bG=h) Pwv0i.ts`TAuq j w/]U )&u''^WYK 0 CR6q"(v&2jZBEheQcTʞ?.0m:~슲8- +_-i.߮rצ3,0rv2R )0S@HԨ*R.J_a?X`mh#;PsײݹNlLI?wwi`@D>'S#S@g͝byC@Ro<|_1:YEGy?1?|L#X,iP#s=1dDž㪔hmN'kjV,YdH/9R@YUOge%?4݉"W_Y*jݾ$1홴ڑ"%}S c2,a$*ҙڮz/fyuRi:ݔ1jqc^Xtƭve +mȆ])gy Ț6k6ϟs` Kڼ'MT8!3 +ב?+%Ar092O96GT& gza8]< ⥟%M=%JcLϷUX /%+wt4FxP@~ +Cuu[nS|e*4"!o.c%So3=*ߓ~KEkTp6a7ؤ[2fo( ܓXARy&"m s# ZR fZb"٘7΢e5о19]~!pRxiTc{~C|(IQF똃 G(J%:QTSU2,uǠ[=qPBʠۈ?L@@]? DC9sqoEkֽj\ҝ٬x{؃KG '{=C݂TǕDPe"Xb*?2^UWc-?Ш@ +9Jrjb_Sn)ǿU/3 W2u" J㦳8-GK"33϶D ގ,9Ic\&o*R)QEu3^ +7%ibf}#~FdE+>XYo4Bm7A[:؃1V{rR59)|T*|F-دyKG5 =)j^y4367FYp33}/oRvj#(Na[]{Nz\#Ҷ-1߼tEi-&v+ilMC{ BYy&<2OkY?0_hYkm+U`t ԃ98CXYWԵ8 H,%bT0J_@/L)k  =A5eA͝R|Rq6͍m Fm(oV"Kׅ3z|ST5rhV JFn*Ɲ_A-Ő::R+?IT^ 8I7f-IK>CN|xF ̧WHr@'O4cTv]dEe?g_zqj(V 5(Ε01Tňĭqx'w^2)aL҇FVSd?Fc26?l,˒90H l* ! QFz2LH1 p?N so)5Œ7WزD{M*'wb^FlK B$"0S 49b"M.w< >CygP"̯À aEd 5]V&,ͥ!f߄~Α>KQuRbAC--}8&"8{0䕡5Q )#|H|\tB<Ћ $7/vQN>+E!XME༸ qX\^-R][4R2>'Hi筊z+tr؈VJܯH"xOI9r!#3Ҥ9>:\(}WxU)xx(M + r PIFb6D؉M As2jwUr+WaoHң(yˆ2d#͈3hۗBz ]8Hp<χO,$1crU@6N ߠV%гPm3B$>)&Ǿz3R/rf!v%UJI텿4$8}BGﬠGxN@!>Bf`anh_ (r W&t?yΊ'"a/QHS1Hz`~DO]mVJn~ws]H ~ L>TI3VMq7a!D˵-74,`Ξo#m=@y5xtQpGۡXW"RhO" 6w4("G5S1S-gy1}EZKIvoeu'j&8T5EC"v>g4 5%xL >A-ﴓ]'; \^\Q\'"kt"$| +x=c?t=wϑG]Pr1DIeDˬ?%fk\`f"O Cqq$ґW-6ʩtMwW3~bV9pwˉ hDpK=w3,o|Q[;5Jo9GLHf~q,C1!5z ĄIuy䧰@'$RuDs b>ZU[V/)4ۊwth)5:vV^RV(>9:n|^@ż4,jP"C+JV2TKv +lʊˢDIt_1HP==p.rwN\!"y=/hps6~epqf #ZkҾ0 ,)Ⱥ>~Ul,`1:W{KK(ZC*kTFy rap^?n40:I~OD[Ǘ%bn篻8@ίL}-A^Mb+@]4#>s׸aGyIBL<T8 +Rf4PldɍĊ@^# On2Y9W ddR|5h JFꞦĨ<9.@)/tOɣa +Xu: @ e-d4'`?%|2% D.w>1$5q[>] + +fm,gS}̵eTVް@U5[HƺE7,`4VlE ӟϴ9!?'?0T_U>vנU+S M*&"ɄOOjϬƺ-nWOeԽ ${V9gQL8s(Js.+t(ÌR"_sdF%JǸ[5:X"s5YIɋWs(O@\,śa;^8!`3? FېܽO "s EVeZD%q4r#}s"N&y* +-ǐ #;k)[2v1οEM}NؑmJuEO.9=A)R ˞}`sRn|W_4Dܝa]o`pb:J1Ӥ8+aSvXN1P{np,NI"ic#@ BQOAY + +V**fe +m<}=<[ӒU,8Gn(Bp#@vİҹr~EC_ }6zoNac1M>wE%"_d2L3PQ`lʪU#D?"xJrSTUۘ2Ux9^J9TORFj=R-:b4>| ,Ȥ#MjKJ./<g[ک[(/J6J()Gn]AqZQXA2\(Nap~3ܘCR{MKbUb\łިWU$Z3]nhp8m;8; wFA=}30qYIa`YL` rdjjw )}^&oeUd+ a# + wW_-<9?xT8pQng̜2 1f4^^^d̜_ʼne@bS6cp_ߏzr0M~~- HagV{zOoR=q +=c tI/.%ֳַV*N϶0KkI=*+9Rk - -  ԕq(N$OAJ4.#|h@JUT a#*I`vd\E%$ql]9N:>"Pཡ@Pl ֯k6fk)0!oR +OIkn}ɸI]۫<*IX$ЌV(ӘWTﴀea?ǀ0u8&eD紀ೈtN CQ9( Aᬈ,C;q7%a$QɋI"'vojvR2vB&H۩q3Z/9BB,O7qd9xc)hެ޳%0D ނD [&6H1k\`*GaԈ^?H|ZpIb(??~U+^+9Frǵsl&˂Bab ԇ`#Es^p@ O~{7x) ӥpOp1B> +)DI)ʠ }=Xwb1h餣rEu$.7">?ny|3럤S:'u~3$uW/iEb- HQte`#lz3; 'Jp} ٪nE1"<+Kq;mB&{`?ܱ!s64Q}mN(Q^74-0c ,_6M_ f|Y|[ <_60UHh& d,ҡjH;*%?EW/\ @#w7Ҝ72")N}sO?T+*j@!!E }Jy~kS7\a㊚o6[]cY&떗,/";Jw6M b-Y8ƾ!ϋrx&aZ@`c\aLueQSfĐ Ւ]שa @_g*Dq~QSsiԔ@JI#T:Ѫ?3 f u߄’;- =kk@ +(ۆZidC-錝%N_!y(9Tc j]GheL w@>OD!s`2~?\q:Jm}t 2 yysh";WG-Y$&.v0EӗyDyq:,=փV9m]ņ Lu(L d*{E=q%np>pI7R$p?,Ju7YouǮ Z2} +$@au4h2fJe"f2 3}~Y< \6sdP aP_`A#nF7? īR,aȒK"[Xk%saD0\X0󌈗DI kJ+ U!#%*|S8E̫>G< yu]ppnD;*'t,!]hq^Hw)cK;g vܥv.C2TZz!A.N@IbDLzN} Rx|G9D;zrF¯>Klc&gA߬Y,"|IR 2ɗ.r<add(1ҕ'4{`1qM`9f3DA"꒮h%/MIe1c(D4.R^O?[9,N5E9bD@I?ypLB#jAi`=.P{ĕ +q-kH$K& !8sD *glԈx+vp2a5@5" )Qo lqZd"@^ʬ_s ȴD!IwǸ" % +ϑ̈'z|thƗ^&j;tݬID"QWmyP +E9䙲22rSy>!+6!ߠBIm6$<Ic8HMO4RΨ`} , 7E h2RRƘ!]l +3` eE"Oy(-ZF$}蓤|%o8u֤"駇$* ƾMb a Z@\;ꔪ%IwANl0wmSF+\:?j2ϐn\qrJ^+= djhr#UQS-;qcXȍ~BhBRY +3V-Fp9[)S$"}/IN#D9kc*^p~ - hL# ݫ:`_Ǿ$~_ d秐It@XA #f@@ Ie'5"L:N*4 (,qH$ a$Fa +bQ1i[^tnjtn`KrBT9IuDH)iJDMP|ԫ˷./-']p:NZNFmkBPRP~2;N6TkyF= EۙޅGIG߈cr3Mn"zp9O.>#b"&AGOS% q,5Kkv_MXevA5Q|9ҧZdϦ%v"jٙF$*G#m;7-A6Bp_q>\%xQN0Q.xXOVP2FT3!VI1BT BI elfAٚӂ@63uz!$,]t?* UHH-ɒ !؈N~PMʶKTp1(/;Ck'|`/4֐KqjF46u͡'A=~l_FJUݚ:^!E4\`1n:?'1'?e.]<.އ|D* q e|~B:tDMѤZ@1FɉwrS{Hag\Pˈ-KO Gܪk#ͪ)E"uזEtŞU2-pۀL4͂{=|Zu{n|6+9:ȸ$XX +Z$ԳWaKrQ 9m5KΓ0S3yxK4"1 WL {_|Oړ:GGRh'' x`Ŋd`bf\wAP27z5iie\; jOQX LviOz 120 D]L>Ruz1c푝Y3/.R[/ lhek)f _`oJWŵ3 YW1m;ؓ$w}SF%&hΌ%"yИK$l@u5@cn]zy2I@[ #m2\%_ư'.`^[ 85&6Ҙ0;&;aB|1GV븇crp`Fs + QN6@_ں)E3D)1`"†)Lvgfc +$iebyR'bDAAZ,Np8x]1}\b +ȹl` bxbZ< B{uQ'|4_߻f7r ~52a KN*4Te:zb%M_Q2́@LJXfя6ER$D TkbC3唚 !GJ'8a/K3RyGz#VѪ#MEth}ʻe5DLTZL6T:qv6{RE7lh:8|\OрڋPd2&dK L7h͌kIp!u؞hҡ^hlStT%$DŤ-h3#j,-}CAaGM JFFhL6 ^F4a2q7}Ԅ/LL6_4PO3D/et @&32f l&|96[Rf&6 *q_th69e&*[E3dݷհ]/w2la}!zzĀ3-etW3-3S`K){JE3:zd/ֶ*5Hyd48bɟ_2a3,s5n+nKILx+)8ָv†|Ѯ_ zxh9'[Ѹ٩pqs < xkIqC*xV0<>1 Pj;_+ي8,u0q}z.deKf5I _I~ywMAk췵4/ZQp5n 6Fh9.e(gihp2L4ڞMLO^NρEƍgs]]3,x/5niUri\hF+yl=#tl?|ҵt}i3-6N4n{3L|CAaI72s.n͘lhl|yM(n%EJ"OM`ADCiܬX׼L(΃pa䁆s\~y y/:"B BLKDjLƍп hH V}L~͂ĬU֋T6@;cpWNIMc쎕=p o| p"gr~L[8́"+hsn25 ĥgPg 7,d(c4jØp)[$,tq|Q:np8hNz8H2QW?r"Ha~<"/r8cz@dUfUuU(A7vBOKur?ӢtW/RTFӯcܾ^W.gz[o*0?Q눒d`Օ'TQZg,9|aVP wDl2e6h,^gĬ9ilo5ڎqDlUʗTP>ti~sZBl Ay1rͺr0k -F )O5G#Y8Ws+6sNa}}(R޼7n/ݠrH( a()tāz yj,);O!As{ݙH{W̬pQ,GL|mSL, ޕJ6[bC&H_PsV} GpF8/-yH@/F-|TLϤ;Rf#o52)Uv:`,A+˹A}~[iѥ9]kIѢWd%"#`^e Qr6DSKmӆꀜ/mjw!jӵ03^ eeJE q'o @gzKL"+}!7XhȖD5 xWSqHy +Bc DK K| S HGd(JCdQu"8c;$5o9Ư0ٺW֖YJdP0˕Atlݥ;l]i#7|ϬX ╳}gNk{%raEK|z_(6OɪNF8i-O0" 8UK0SpTw +cx . + +Ⱦ4*1R2fԴ Z!Z)?Wښ'%~mST-(40] +)ߑe^Uި9ⷆ%ao +3Zʻ,b i1IzpCrT`U?*$6dJ>Ū&Sɏ)Id*X#|;E(+=\5" T|/+gn;:T>zŲ;2>"U. EǍ2]p:BݲmI1[D*.54'H'jE^\^%EjeF-&} +Wa~'\-oR s@R9k ,ǼB .hr!1Hmd}5czF$IFAi +WUQ%VdJ}fGȭVdN,nxNMc8] A~XKS9YՎkI2#=ҷg+fW{奸|<fht1~;x ++D/_~u cDvi|t:gY˶vń(^>|jXQU%Aܠg &YV~5`f%nQq@[t,b;|=eԚjX!9wymR^kiU?,hȫQ$8mhX lqe L&*$tw7tH`4U /vb(FY u-y;C]5}{]Fq('N'.F[ez5rUci= <K!&8\X6y4qT^dže->HvE\0ޔiY'GYWBX^y@)ƹ]᫪Q][l9 fd*hJʨ^EAXػg/zͭoٔAV%",9<(U=j"*kw*wRLHs k( +T,]{6!݄V%HzvW4zCk~,詉(I-8Ԇ1c덁[Rh1~U3I*$Wȭڏ(.5,D q)@Ny5iJ5Sūk# ud3uO1~1W~ +ח-֧3Dfk֔gx3~X.V `O>k$ZRRCd%a)~c]-zp)O,ځSOĵ̼GшVSK0n~C`fLOXORkegӾ\g=z:Q:g8ydI.!(kV;t?"DOr*nV&)18)KD5툴f{8Z+vgZ߭kJTaYZvkYbog]/=bl.lkV#fgS[FݜUl<lA})V};xWlּ!U4q9MLyt(G^ɒĨc x9C~>p"s%_8"8hMA.Ĥt Y!Kah.eԻ832 9Hl+ R]\˫#:7c(vP1ktT*}눊 4,uQo󦬎Qw3@Y96_XK#t:|d+޲P>&Z^rTޑR\#P:2w +V2!DH*M#y-cuVu8x{!#Km0ȕبZzU*S͕WD=m^LfNۋZ jcz[yZ~I6>e?P|x܃(-B{Kd%z 5jZ[ߛ;7IA<>ҥn2*!}h͞F*$/;'Z/u6BzwrGAbm '"tsogy'-5 ]xR}tMV6fטa $f +Y(bCYE•!79_cB(w;ʠzpc-\qRr$t3`b~jkJk3.Q3wx цH_H?͂иv,cD:_ 1Zi;DB8q(iO@UP25 8J +%ng-W .Պ6)VFڹRY`D\W6&pt#mqy^B}Z+t:j)Ά>'SCK$~gP= ?{pSDdDuKm}*ZmN(7I!)/m"ϲ{&omI&N`WZoƛ"yOmzuC v +@!XwP8" ~zy &^lִ8"@O٘**tLZ:)T neCtfN|M ZZ\o#`'GYj,)Řyo*q1/ŋQ4*(|b P{"}];`jMQ, >qQ`FQ7DJ.7Ё9J8챶pD8!:t=.&4"Q!>Jʍ +C|h?}t5CGi 9)1qB%7ٍ,8Wz +)o.o{:쾤?.Q' z.;$<,VN{j7I+BhTUa.@`${`;Be3'k7L\؝ThpJ"Y?ҽ('죩t+=[Qh\Vr.aw P%hЖja*/H "/Sw/^x*L_ns6H{:m;Tc 7IBe ¨S[#BuA0cWN`Jgi3QCzyAk&׻3'rt RAVџHb?] X' +uK< +\vma-ng #Aw`ꨜ!4.W `|i3(xU?#`xYnt( `lTLy!⢌z,k(0w<~^9rXU4VQI)Me*W{LE.1 a/q|yT^{xU)Hy!-w ]i* @pBF ?@@ 6PD:? !'W!lrR"r *&3D>q8Mjo'9#=[μ/Ijqr%rdqG ,) SI ŸoQ 4ftw]HvjWJnđDN]nŠ@H\`E^ 3{2/-x72fY-i785#K#Ո [ &Q8o7RYu;Uܼ3zxn* +`Jdp %rHg!Uü@ 'O\ªTUIP5 6tY}Ub(?(k'j4wP4Y6^:PIu($"Pn;1Da@rEL54YQr Q$S &p;xWWͽI)ƭbdyGӋ+&67M~½yh'}Q)8qG+_+o@ +L EQ .f_/HF kn>w9 PΡCl<^I+>%PѼ7 &"[tvRD]$/~ +n;5lqy}G"N8Y犏 bg3aQlRL&[EԐ/kՋnQɩRU`Qrty[  +t[^!+#yD^@g $bݐzw7I/8Y-׵by6p`#V7T7`w[$MةP$[@2CyH E bV`BNZSpK({0=6y QmBCxhy+`|/Pq]A Rs*1v{{JdQwMGϳ1sFPh+~BI?x942*[ +ƒMHIGܦ-N{˘9Deԙ%j7ziBy+~R^BgRǵ1Jo.eӢ0Qr_X eJ3GF/&Y; *Y+r^Q4 +KE]GPpE~˱?U5+9VDB݊r5"B\±ЮyD(Zn@&~!^:1#>YZ@\Xq0œ۽A@~]dz_wҰ}mm V/C>rt ^舤vm׿ܸ󛤹R +|ހćyep߶]CG^BsxeHM¢gK3xfu=7J]3;@w+$0J IR ^m8^`xpA.9wk:Cg<~/c)2aXiI,j̿! rI,ZJLTGIV%wEKT“ty4'0-?|']o@wDq|) aU7dmbC]^q(yzg ;•`k?X(,4; HC[>mSp74+mt dtd@ >28'a,Ei)9>`ӭ!~  +;Mw=H.ظ0\/f8愲S8nUVi|쮍8" f"&(gkj#tM!q$r +p9茋%g~t;VeK i:EUТ CN\N:-C_Y?FвW FC;JeZ2Fp .&:$}.C2QߘQ7.xdirY-N!6rw>@.Tl(ĭp}XFnbn&Gqq ؓvaCạׅ" Vds̩1XA4h=059_p3Va)˥ν+O1!K(pBPj٣- +(A.:VS]ןR)(?s;X;&ڣq|V/E0ʘ43Q9y+ZCq_XR n,$lj۞ͱ(qoY%ITНVP\iNrӊ܅ ߮Y_=d.w%k)kL`Lũ]Rw5mg6:1/#ϹߍMjgi%FawL'nHb+B,bucw13 # l#Ui3}%]~A5F. bB>M7M~o`$c%x@N`*M>;uHǀĶE6,g{ٱۧ<]mPdQ$$נwrl!|4&< ԩ+k +_?tmB/XRXE[gIt"1JAN$\Ht8 +(IԷQxc^y0ʚpNUC,dn9jtr @79+r:sr^>?}r̢vDþxyCrҹ!sڈOVIdHALYAc]=xrIYQӪ_ J46sp@M-Iz늘c.gIc>Lj6“=FH|7etq(F?cp|ęEhfLox0uUUc.6-"pd+yGK#3'!W^"zSѺ\Iks1uH^݈;G-UPT)ލ9[0)J硚CH߉~ hK ?\ҁж`.Kc`Qs/ؓgY>(U>bk6_. |  <W=#`[ & 2p4\ tʠ̳z.̕ҫ3-vm ; <\m`h5{u~6Z%$_+ ~nc 0c~Êlv8?\-0^F`0z=}w %yxfμ5qAmol\ i +H搦Oh3~!'AK Q{Utmu);Ƒ&тt]]she_3N+̓UzKJ<5Ģql3KS`M;acw@&OY_Yx\{a:8Top}K68ު ]FjQh6TS?;q˳}2QH>|A{Ә ܵ=[b ߲YaC/= lޟ:jAM-(ĚYV^*p>O3]Mא19)n3sNnQOa _FD(cHE`,7Rk?>*޴!̱0?V%;XWf3,]8S+E|,E_DDc +S/qC*XS: SE Lm5ScJ#˅-i; 6unts_b, 7QcNcԬuٙHS9XOאO~6!Ļlxe m]yaV)ї*zQΧ-)gxyS8)_F]"/. + .K721Xat׷ +GoԐߓn)8i vRC;KSۋb0@ƪ2wyrWԑh.rG*ۑT!+ڳNĐ3:yq0 $2ag)ptD k_ҵr$0_L؆ : +wXh_NG۽y,FE x{~)fk}u2/uJ^9Cf贑_2٬F8I(%.5ٟMnC]OVA/3 I>&{튓b58#9վC' lٛxU S&X0$Q8 !xߐaxlZYSD]b'MOniaY0$r%Z{.PR +me Qڈ}L;#?3:Vk +4$c +:btpd\>2rSkʗ8qA獮dƜ9fGQ*]IKE8RdؤQ[r$r~~Ǒ\h+)Q="ocvQ %!#aɱ<5峫n6G")҉l~Ӊ7yw~kzhn1utm*;e˱5zPU53WR\tCqQ\(w #A>[bEefɸ鮬{OfkYēfb + J  锪:z1[qxGFDOr&A;N9#[=RVdSCB7 *nɌߔ :MC6:_McnU+*v暒妵3Vy"ȃ\u2VGO^_D%c{ц"~cز8f&ZrkTv(NJ=&gN¹݇xu\b{ĺJ+UWW%!>(#2$4Vǘ7\VF5Q lJSOΊwg )qnO$+<8K*Cf/)݌9Xόl3=}Ohξ7:yvrk +!tPiz li]GJxZ3wW]cbSFæPGTv\JLT}^74fL15כQCe3厲7:_E l,67b['BrDLyLe鬆JlX5,ũaSb~̊hLl"G6DM {\'ohĩsxZ|c3On"aY W\.PȚՈfH; 3łHUhxr8SVU#t?CN!ikDe6IWgs,&T̍ iMN!6hә*NbhXc +<&!ʘ5:)؝- +OVVǯwsVJb `> Daab@&t \H 1 YH-V. YPP\`  +0؀&` & (  +FF 4!` DX!xb0:P@ +4L&A! `4B"`Q`F A6 a ‡ LP@7HLP 08h\-d ĂbC +6 `H^68:0p>C0P PP~ :8at +hJ! (ab@@0R@ÆРtF  HPhH!C 6@P6HL\ $&6HL X Ba*`XBb!/8`  `H " H@ %0@p pF| p`f  `@8"u5;DbB_FefPujXF&(qРqF]15z1/,dj%^ގ+ \ZE<#Z3UZ3FQfeFpMF6GTcH{%&@s%&*}-ZԳ](<}fB)ٸhdmlKMNZYKkθj'-ed4Wd7=dcSOWt([7k] YbUF%RL!wKw._sXGvf44 OӨs.%t噖"5QdKK͌iEɼ,ߙ6'rGnCN)ը;Jː oXЯKUf/ͫߣ+ĄcW/y\QHNEZV?r79Be.aO\+ ѫT2e#ΈwbRI~IBݸƐ}yF3WjJDFm|ȽtTD3TtH*MNfF%RV5J2[&jm.v,٥]ְ5Q*dt(v"9i&t5f%&DP󉮪NDqҢGbuoƼReHbBS>Qd:RJI’.'GZ I:dSXNdaI$=oAbWFDϠz"#dxv!tq<3+s2CR^y\ҥX1JLl٘&3Cd~MƘJ a;5q颴ZXk1.#uN /B{]#a_c MzV<&'9J +x5V笓j&]Pn;֤|#) jy;VEb'G_5ŇEy"]"hF%뢹Ѧ yFl4$C1yhb"2XM-W1;dDl*6$_bDyo.Uqvt,d8%Y͚S)svܴrt;1Wx+"gu!TM2ѧŒ2c:AEQsQuuW;f6{2*oO؅>_>h朽SncLWJheټޔ+Y20pqBiVH4 J\DX82\EtSIqr_P/F9Ed9cO22K:Om#'+.&X/s"# 7RgNJ56WIQ$;]fFgNlV2$DוU"$5E"U MI + +^lLQG*rة Д/6RHF"hURXyԈG&Ux-:A*HUeo}[N,1!fvgǙժ MWLwK9 ͜G^mFg!I~\Ow~YUO?IZ4)՝Rc:r%ʈ۪i&1!jbrW2UKL`mʘ{rh8:\+#ub˱f$cE[Z ]D8y:Kk[ώc.1Qa?^UHzn7t+FBwXтf +F2EKLT2z؃lѥBE O6<ü(}]k閘qoWYsvS 1Au +q-f"#L!}W 6?WCI3jћ3ZAC^zcZm3U %&* +ˎc95>ĄjIlq玬5We?24%(^Ū(b 7MŦ.YQ#7flrҧq6JgZQk[6QbgR׹YKRak Dř]KC3#e8юiOb);40r-/ӥZ% 2XILHXq:xMG멪v//p8m]ɴc9\Si%&DЬ+yqVrz._ *_j:[󗒽ˮXcĎ:4 K)mbi VIlyK;T9#+r*B&؏\ uFfd8nglHJFugŌu_kGkxF.e/'RvD3ƿΰh&IR.g6.ʹ[]䦟88ɯ2q%ܗ،Y1&&biZ ^Mlɳ̕2- +?'h[)C ublb#"_׬\h5ln$I_NhZҞyXm6N~OΧ]U^{.cî".v)ʠkI YG*>ʊ.{/Oژlzaq|غ ӱU#kgAs)"uR͜Ubn/][M- Rws"70͝N*E4R2 Ni!RmeERcegRU;ԣu;GW'̣Qxp+rn-áH%,_DGυd 6|wK{NBgc tyu;ߴ*{^TI1oKHH$gQ` 6l +0d X`1BfVXXAF̠ / +P+HL0PAXA60B*yk|#$5nlYTE>:Ok6W>n:mocIꡉi+4cڶOb## d߲UXr=TjkdxUWPF9bbEb*/eU,.h^" sqv5ˬC=&tP%bGgRʉ iv'}(6#ODeReQtP3#>^BlV99VMbFb~!f5tF~%!:K4Zd7m+ʲ\屑6ḌrkԼԟ]bgG~gIojMM:X3L2T4rZ:!25z/^:bs|ʾW2lsT$Ѓ:d?zv҈T;#1QQhwGnUfsN6h5X~ه,1į*wNfӔ_&çˌ|ۭ^"|f +T/?v囥<˪>FD<4=sD$WNM7cE˘&΍ժ4JN?9QUzCdnfy9䝧Y$^ҐY4%&*^5,vkYr(KLT&583B.gjf;:AwkbiϯqU>Xc3Dۇz#yi"z^LZ3:ȵ%5cdv +ׯy/kfiVCD"Q̋&4$y ٯm-xgB_x>ѕuKqI'l22d,bkuc7fk3Lu2ۆgo FѢGufa Zd$C\4܍r ó J:M5H]ic_QRRGv'7;{]7Te{TD/?}7 8V{Xϝ2j7w7TO$wH#_3Q +"R{ebMKi1$JSt}th$K>΁,ehf"p"}y6Ȱ+1Oi>3ȱR"ӿȂjR!1`A[(yG'yʕWu!*Ƣ#U#4ޮ`5@Xa>|ss /ph+Kf")Sk&uTq_t]FD7F +%2Ieճ ؅|`Hf]QLZ]AHrCQJޠXe\ KTwY~I=䆴!|L}5[j(OO,Bjo0F`aR4 w^juQQ3<Ȇ)҇UO!]gVs\9qNW[ +E)%$u9.'hˆL!ʋrQbH>K \)`{E=/TKXR`#*k}"^-x7>wmj)|3("o^ +كpzBMF e6u2nrD\,mBlG/OVe I5dgƍwB’Ճ4^HDK0/umO`X',$AzlTaʒnRYti!nIriwqøeRfJ~j-PE ZT [*oKPf&E4eFZyPLv=N#+`2|Dp֤|jTGQ"30ohg8;UݛeH /{Ҥך/"6_ +<Y%1jgd f,H_jhPRR}ѫIiKM7J@1ܶ.dRDshEIJ(PELѽdfVE7{!Db!)kEL%-E [{QH."[ODu^TYh.<`/rg9"E]43'c^$QNzIt)HOoֽs;C{̈F%Uf^`wSQ}9A07Mm™?E\A{Y+_~wun9/zSqxb䋺"SMr|v_( I8o|' sQ=[z;mF~ ;+-}g[?X,{j|%92`@P/v$YjH(VA洰a*V$D+CS@4:qLf.Qc 8[zFfU~0D#YZI% +{b %z: @A>tOnOq~ +KI_d Z G9܅̬!/OKsIpZx*@cHu0P*#B5ȐpTĹNgCq:ڒhԐ=,zϹch:>k2%lΕ>AarPƁ+ɠ*]C%4=,x/IZhÀ#^eb(o Mne fK ;''ɏ8¶)i(݂B94S6HYZ1?m=t6TI:2 MLyT`BJT0ZђHD#S B*Gs>VćX +Awԫ :ؗST|;e +M{>0:3de1n0.)2!iˈb?RlU-p& yy|$-yppy'h.!2^@Og"ޞͦJ7餇gPU&A\T3P vɸW+ҟ NSOd,0K)dUs2r]42 ~:N\J^ 61 朐X 20O5> +HW\+ދBY`2! =6RK2B'h~#,6Gz#g+ %(ฦ6 #\QmKS1@`,8wnV"vfEl48W4$f{U̕v#&+`I.髝OaQMbT_zr-QiO +T8QW366)/LR.FWTd^Vf.h2+bx78^+˜[./NnyPJpgWl% pr%L6QV|;>}MfY@BS?PܰaW@ba2#3H"gfO ќA0QVu UU^Ƒ%tNڡ)hC3:ؐ8ʔ^YF]%Zbh~%1x/7؁#SLe'jcL$2I$7wiI+~n lQVEZFPeQ/ㆆd ƁTh=3;5j1vMڔ+Qx%2б(.>tւp1윑4?9@lN}J-H)ٶύȈ38@yU_FD:b,>R +Zpڢ4iAv*&]uf\鲦+~OtˈCH9A\Bqm7V"8c#*8!A?ͬ4qQc9nDW!n'&at@=T0HXizq@H>4xf3ȩ:|TG60apƸ ӑll^ KJ >ݹp0[}o1Ƶz`hr0g43@-hFS8;*[Ze7>nXP25naz ;%/ =@zmTtU"ܣL yDrX ĜQ,/<ĕ";HOd"!T_V;+47!pO(z0T{hHV>8W^DVGcʊ筡É,S' ᗉjĀۯӰ@qe4aȵ0ŧD~G5,DۦFfyT*tIfE .U %!VM^ KؘHGgk;'B+l26OV!S0d%aѺTw|k,J +wE.4q{} +@ 6sYǾq뢈I.!Rop;c|@-3:D=?Og&U"cp\I]"Esm=kiU5/w VDxQEG+଒$*PoFԢ3aJeZ\~ッ|1\lHTp8tpj0&*FG&^H-A,9ZGyW)ގygUP04 wQ +ɔ cy\(a^t'cxv; 'B&EPp%yrm^1Rbܐr5g +iK@y*6Z-$xkX&ȒLEMB%pnYsoցf64*$ w3IYI^Z*#3S@84 <( H* ӞU`=:@fdw@aMwܨ>i:@i0BPӉeLI( 6#R|@4ɦU* +E 'YP˜v^><-4  q[4 +jKCWPߢY$hdjC$($d΁> +1E/_+D%ud&cudoVf&lTP*=Pܣ CV.u? yIMOҁm3H~iL֓@x)&do2$)W[",W :(r0ފ.H&Po$ EsѪϸ ("cLiLPE\93c$k)-+фQNu,HZ}fjsfֱ3 8g270!s~PHĆ%Ѓi_LbPӺ.-Mxb_h3$=aKj(BNj@5BZ*!nҜl0({탟~f +)u .ym{ۯ#9ؓWxթHN @Ӿp:rPr5ka*33L֢J#^Ae)T +/D ;~[0÷Ҡ4gy 2ʶB_#BwG^BFw Jѧk@?0 z 42mQ{:mtG]onapB+!S_/lAAO)J)_9 1~p!lAޕ4OS9x?U +5\gl (QSCY%CgcSd̄%IDhse8 +d&8$avo-BAypةu+6B+`NDw*0HR&H$^8D݄;E{*\L*<2/bRyн`+VOЭ#D[Ck`_z;ٝ+^/P_ m\sl/ENh̡ld;/H)n"N{T74G5wNܶ->̞B fJ_{65/%ǣƻ!Ǚ #Hh(A+fZljN( +1%čt葴 U%$Hu{۸GPHh4-sF*WBHŰDevח#Ry*@X +E[lPްY}򪛩NO‑IzdP^NP{6{,;rsܴ9U+JMnЉBXg-2S5qaWrkڢ!cDzy.=#94Ȳ-OZ+=Cm#:_eՏE+Egw orSK(u 4A^|zBnd<B$ƋER'EwДYH=(6|OnCbFM!X l` SC$b0 nA_άw?eUs)rܜbr2Ë>9sB91]Zࢦ_jBHx-':6r-aސTV,Isi>S#S@;r89;CHÉX#6px8ԾIZ? oV +2OfFń鍬^:uN:^$6/ڗ{e]sQDG~Eiݱ5'_pn`v.ޭQ:5|$D髙1zhj)DQ֑ [yfޥko +Ccƫƙmgl%|!鞷mu6 uu C1 +>wmGzLtQ Ps扃G|ZV7Te53Xb.!w6 Kq#2 I!?g2.hǏrmEYP20pd: +[ Me]fch,|֌,y 4N;Oo]Z].hg1o8aAֆ0pA =Heϸ&bgAY + !z)OyZ |g["$(u7RGs{t n;emĒ}.=釈6.-i?@;8)k%'T ?9DK^]WN]%VacVPEx_l'aܗTVg!2Qƒ05 +U%0 +;?78>͒R2M'f-ɠqr)8grXqN0}%FVPqGCN$WrF3I=IB:Yڱ4z)LF9Q("#74vb542bzڅ\#"}.h@JŃ*+G{6|!Fٰ:-Lz}%uT8G/B]mG~`нcBX:/}狥dz%ڳr{fjr]\r_x(/d858Kpy0,wskZkB}H/B8+2 g| +<,/qZmLSF@M iD60ݺ&rUx30&yVW<ٞAeA/=LYj#@ۨie1t4S~+0Ϣ7?hVd<`"L3ȩ=AGnD @K$WLiJ#*U&>oh)iO u.,/tp>* F09$?GKr7XU 6S_%`="zP'ty4@`T߫Qow8~GW.(kڔ`)9 `\_TȮ;L>;AffH:!1iQ|T#oGoz,)RAlT8h[ҵVY>.;?_~L`f|NS/]^ N^VT2vKshOPofj V \` ]Ĩd>,m|¯p⩰7'4,,N\Ay`b Cߦƿ725,٫!-^[VDT.߲<#N;4@@$ ،Pli؁cvR&c}ViN}!,D9z2* lX ;6z >XUUihi$8ѓ+/zS;ێX(148̊\DAF0C=ۤc*QP@Yu۷-ĥGtpo`DBsȼ+$o0]Ψ[KP bkt :%Ҭ}r6H*L,gl_ChUR4V"_֚_?lN>=^,3,[Kכ,3e*nEᙝ` Ĩc\fmVC]h Вnq]\r{N&>6،GZg?4㚋7#i?*<sFGvтI?0oJIxJsi,+KLfwbf$8CZ_kϗPx7X +`6meaKbQT-ng+iy%ERߗx҅3+Hh L{鹝Ykˣq4jj!)`7{9h"*z(LppV԰1:pWImDm?.h#Q` KxoI঻j@_E1w!4Nkl9?NJQEc%.;ڶqL`4P;*~=2ҟbIb2Vo>|D.ݚ*,CL̋KskozC:b/JLbUGvXW; _R1tV*w 8$E@M6 Qa-YmcЖmΚ9~!ްGDvH"C*ۙqdʤrFtːv}Ny5]e,: wth3c+OS ŢˣӞE (x@@ -;E'7UGd;(jL}ƟLgimNSaVP(u ZشXzȈ,zmiIVG ΞV$?>x}¬ +6c !T! ++AS6·l[ae4㯾 Li1\ÜWAnFG IY%1Z LY +^ɬTMn:zAP땧>[ciEiBṣ>0q2Yc*Bo`T2-(- wn\ +ϰv2*ۓKYy1J>h Wvq>mTU'JWQ΢pݻWFSZiEOl/<*jSu26BzMAtX@Bg-7b3JGO.!wjAyg9?կ5%" Axj9K; ؋($d%)% C1 $c<)Qg(hn}ȨopT7 '\EM O:Y`to‗! +g*BmJ0Mp&m5474 E_g7Pz(I +%rr9o3(OXMVdz]v /)v귵M8:K!m#򁳗e Fy.&*S@j%lԮ۾lxST5NY`?sӚl֯saQ 2pU1E+]b =sS藑ϒ[H!`p,(5`~\Έz5F_j<;+9;)9;ƫj5;1!FJG߹@q y"aF(|ЀB2Z"ᒝ1I/K7>[IC!3K@O2poA|m3gɏ,Z^De fRM&ׁXFy#" r y+Ϸ"Cu܄g!=17+EXG%Dy^ AjQ\P//@V6jp{P) 3,D +H#|Udvc?vtn iwo}TLÀSDd+;al&/+;Jz@ MқMy49&+LA\EWR O-L<&^ypx-^fGTF|+$% ̡T|I"i> 2"9ꯅ8T\f I,@`7=qa@TW)<:1q;Q&\XAfu!ǫ}Ga[v 6[CBxg <_ީ%uxJECA:_`OMczP$4euOi+^!hbzp΅^QO-PT:ALhLTBG1ETdi‰^MvfQw63q:>f\`Z6ƚscP~нhz A?0_nE*!1Tu'K ti7"sZu6]\T+:J0!A~Ct+KT|>#g̈́)4pKc +` ?br l,f5\ +r\n=7*#ƃ]c|ӵ&KQj^ҳ69 ͹0^sT$(zYˌ Pu{2!ñ ~Pf$R#pUzRRA8׏%qGՆڭR +)okMl@`>#5O̳_EcTaAU( CyeeuIK䞐QŁ&/ I $d5_ԸL`m=ʼ^4`jbTHT 2M_<2xT)49b.O]y +@֕Ke- kjY;jNv(9{>Q>-iSw LC+)yfpzwji&'AX)6R8D $%K]3rdm5V!ByEN51٧X +(vn€v7-_"t~u ^"b0R |co;"^hʾskY+!i9tKcIAŮcnmNƴl rp୽Ean%ʍ]h[LP!.u@0Tcq&Z@-"7@A܄LR ikB]2F@J\L!kgG\61Ó4?a6nF]<&!P<s|߃9TPt'_L?.ln;w?`ȏ%]ueXĻ(N +s2I>$N,h] +x)m0mP0*Hs7P)? Uۀ"a=NF* - $bs%mJ`]$ܸd02B V3X@,ٌ EAiswC.ו8=Ш z.˨2T~\ QE&;$)8eb֪ ;-+ĉf Eޘ)nfE7$zojF&v_i5tv;qvzFm6b?"Kn![%ʼlN(.AJVd% +ɜ{Y=WwJ}ƊUgwgTs~nTG%5 Fr\$[cWĽ$.E$I&Mn^aė~_l5ױ* +x1U¯TN3bT2V'쓊:cKֶ"fcADX +3;Sb]5&d,i2)nre jm}yt~yĕJ;Ueiui9X!UTLkC#G8_)KtL0TWTNjz _:Uf(.cĵ*H7Bvf,T1ʭ`5G5Z%ޗJuB>,$L.T._ VVg[ ݳ_ x(un`I4ƺEa©-r>PaABC ߐ:D^ jh6K1¼R,\Anzo}܂KA Hx$=L&Ғ$zjCfLzJfVvz:.Fٿb}դrEk'>uOBU60b"޵X&jxCg0RSU$C#L-8oZHSsDBzbcxhfܔ̰3O57@Ʌ":IMdq'xQ] ݉NՕدq{#6l5-,ĵ+iCS:Mog<屧3M+ãrJ Q_YAA{xԽ1Q7dFf}e}nTOz;f=4lD?vzT>- BO* +ʡkZ{BNh)M-bnF@k3wWɄؗ.ڔ%9H=Xs7w |k +zV..[!~Ka7l]9`=vA?tҠבx%E m-B& +Y$[r>`X5aVJM'nH2a#ѓXnIH&$d»Hq餌fqJK%T`>p]]Sw9mʠt9h˵JĤtcMn1?\2Q -M>TII$(D+ݷc>^EjLH05LI-}Xd㓄gր +6=yP_K&+-̗@~3R[b ڿ h3` |3*|f;[#c|NS='[mU0Wn`af'UlbBA']M XudqTW}0 >}Gi~rWU%0! A ,M(v^kV)zC[W@ڃц +!ơ,( CI} s'/C(f9^qx0|P(P[Q-[/axԤo<y?Jӟ)sɬPN~ f+oz1 =ݎ6B=BڱFK7 n}{,}>vQOBjچ>%|yޞۼ:#-expB0q0z~VYaV)QC +^QXVW[ӭ7 +}k .p5AtX|0g(!{mI2Y}/$MݑO]D+n J &y1Dv@::D QgD4b\F ;#R,%V%UըvqE9;%, +פdDD Cx L!˶.MO0ӾAt9ka]4LUDi`7 Y;% oI5ܫ]>\Sζzum*kXIږ@J3#Oqt_c,ifnn$O}/y(x& +](\J&ņTIHg5ey}?10v0/K:uƏ7`XJ=Jf_ `JW j4HʹRڣe` +h5\0݄Ԃ`& V/lmyB7Qaugo %`Gd#VrRmo5:>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX$6Ra!<<'!!!*'!!rrmPX()~> +endstream endobj 24 0 obj <> endobj 32 0 obj [/View/Design] endobj 33 0 obj <>>> endobj 28 0 obj <> endobj 27 0 obj [/ICCBased 34 0 R] endobj 34 0 obj <>stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km +endstream endobj 25 0 obj [24 0 R] endobj 35 0 obj <> endobj xref +0 36 +0000000004 65535 f +0000000016 00000 n +0000000147 00000 n +0000042379 00000 n +0000000000 00000 f +0000042430 00000 n +0000000000 00000 f +0000000000 00000 f +0000051671 00000 n +0000051743 00000 n +0000051982 00000 n +0000053543 00000 n +0000119132 00000 n +0000184721 00000 n +0000250310 00000 n +0000315899 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000372535 00000 n +0000375528 00000 n +0000042821 00000 n +0000372835 00000 n +0000372722 00000 n +0000051341 00000 n +0000371960 00000 n +0000372008 00000 n +0000372606 00000 n +0000372637 00000 n +0000372870 00000 n +0000375553 00000 n +trailer +<<90FFF7AD31482E4C9920687B1FD07CF8>]>> +startxref +375743 +%%EOF diff --git a/static/assets/images/products/appscode/vector-logo/appscode-rgb.pdf b/static/assets/images/products/appscode/vector-logo/appscode-rgb.pdf new file mode 100644 index 0000000000..a03839385e Binary files /dev/null and b/static/assets/images/products/appscode/vector-logo/appscode-rgb.pdf differ diff --git a/static/assets/images/products/configsyncer/features/configuration-syncer.jpg b/static/assets/images/products/configsyncer/features/configuration-syncer.jpg new file mode 100644 index 0000000000..5405231685 Binary files /dev/null and b/static/assets/images/products/configsyncer/features/configuration-syncer.jpg differ diff --git a/static/assets/images/products/guard/features/cli.jpg b/static/assets/images/products/guard/features/cli.jpg new file mode 100644 index 0000000000..edc2040e94 Binary files /dev/null and b/static/assets/images/products/guard/features/cli.jpg differ diff --git a/static/assets/images/products/guard/features/identify-providers.jpg b/static/assets/images/products/guard/features/identify-providers.jpg new file mode 100644 index 0000000000..73a4c28991 Binary files /dev/null and b/static/assets/images/products/guard/features/identify-providers.jpg differ diff --git a/static/assets/images/products/guard/features/rbac.jpg b/static/assets/images/products/guard/features/rbac.jpg new file mode 100644 index 0000000000..f9c8795c82 Binary files /dev/null and b/static/assets/images/products/guard/features/rbac.jpg differ diff --git a/static/assets/images/products/kubedb/features/availability-lg.jpg b/static/assets/images/products/kubedb/features/availability-lg.jpg new file mode 100644 index 0000000000..81b6c879ad Binary files /dev/null and b/static/assets/images/products/kubedb/features/availability-lg.jpg differ diff --git a/static/assets/images/products/kubedb/features/easy-lg.jpg b/static/assets/images/products/kubedb/features/easy-lg.jpg new file mode 100644 index 0000000000..d4fdf46e0b Binary files /dev/null and b/static/assets/images/products/kubedb/features/easy-lg.jpg differ diff --git a/static/assets/images/products/kubedb/features/low-price-lg.jpg b/static/assets/images/products/kubedb/features/low-price-lg.jpg new file mode 100644 index 0000000000..82330d4d66 Binary files /dev/null and b/static/assets/images/products/kubedb/features/low-price-lg.jpg differ diff --git a/static/assets/images/products/kubedb/features/monitoring-lg.jpg b/static/assets/images/products/kubedb/features/monitoring-lg.jpg new file mode 100644 index 0000000000..2ca1978768 Binary files /dev/null and b/static/assets/images/products/kubedb/features/monitoring-lg.jpg differ diff --git a/static/assets/images/products/kubedb/features/multi-cloud-lg.jpg b/static/assets/images/products/kubedb/features/multi-cloud-lg.jpg new file mode 100644 index 0000000000..5a06bc0b7e Binary files /dev/null and b/static/assets/images/products/kubedb/features/multi-cloud-lg.jpg differ diff --git a/static/assets/images/products/kubedb/features/performance-lg.jpg b/static/assets/images/products/kubedb/features/performance-lg.jpg new file mode 100644 index 0000000000..eb53ce9372 Binary files /dev/null and b/static/assets/images/products/kubedb/features/performance-lg.jpg differ diff --git a/static/assets/images/products/kubedb/features/security-lg.jpg b/static/assets/images/products/kubedb/features/security-lg.jpg new file mode 100644 index 0000000000..141b0e2205 Binary files /dev/null and b/static/assets/images/products/kubedb/features/security-lg.jpg differ diff --git a/static/assets/images/products/kubedb/kubedb-1280x1280.png b/static/assets/images/products/kubedb/kubedb-1280x1280.png index 41f8b6d00c..449c03c1ea 100644 Binary files a/static/assets/images/products/kubedb/kubedb-1280x1280.png and b/static/assets/images/products/kubedb/kubedb-1280x1280.png differ diff --git a/static/assets/images/products/kubedb/kubedb-1280x1280.svg b/static/assets/images/products/kubedb/kubedb-1280x1280.svg index dad36c24b8..7cfeab507e 100644 --- a/static/assets/images/products/kubedb/kubedb-1280x1280.svg +++ b/static/assets/images/products/kubedb/kubedb-1280x1280.svg @@ -1 +1,25 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/assets/images/products/kubedb/kubedb-1280x640.png b/static/assets/images/products/kubedb/kubedb-1280x640.png index 41f8b6d00c..51b7b8334e 100644 Binary files a/static/assets/images/products/kubedb/kubedb-1280x640.png and b/static/assets/images/products/kubedb/kubedb-1280x640.png differ diff --git a/static/assets/images/products/kubedb/kubedb-1280x640.svg b/static/assets/images/products/kubedb/kubedb-1280x640.svg index dad36c24b8..32bc22acc8 100644 --- a/static/assets/images/products/kubedb/kubedb-1280x640.svg +++ b/static/assets/images/products/kubedb/kubedb-1280x640.svg @@ -1 +1,25 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/assets/images/products/kubedb/kubedb-3x3.png b/static/assets/images/products/kubedb/kubedb-3x3.png index b70a95e686..0e8089dae7 100644 Binary files a/static/assets/images/products/kubedb/kubedb-3x3.png and b/static/assets/images/products/kubedb/kubedb-3x3.png differ diff --git a/static/assets/images/products/kubedb/kubedb-3x3.svg b/static/assets/images/products/kubedb/kubedb-3x3.svg index e64b6bb9db..781df10f53 100644 --- a/static/assets/images/products/kubedb/kubedb-3x3.svg +++ b/static/assets/images/products/kubedb/kubedb-3x3.svg @@ -1 +1,18 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + diff --git a/static/assets/images/products/kubedb/kubedb-community-icon.png b/static/assets/images/products/kubedb/kubedb-community-icon.png index 19603c5837..7ccdf3bf7c 100644 Binary files a/static/assets/images/products/kubedb/kubedb-community-icon.png and b/static/assets/images/products/kubedb/kubedb-community-icon.png differ diff --git a/static/assets/images/products/kubedb/kubedb-community-icon.svg b/static/assets/images/products/kubedb/kubedb-community-icon.svg index 8a15683e1c..e1817367aa 100644 --- a/static/assets/images/products/kubedb/kubedb-community-icon.svg +++ b/static/assets/images/products/kubedb/kubedb-community-icon.svg @@ -1 +1,26 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/assets/images/products/kubedb/kubedb-community-logo.png b/static/assets/images/products/kubedb/kubedb-community-logo.png index 48b2690784..497defda21 100644 Binary files a/static/assets/images/products/kubedb/kubedb-community-logo.png and b/static/assets/images/products/kubedb/kubedb-community-logo.png differ diff --git a/static/assets/images/products/kubedb/kubedb-community-logo.svg b/static/assets/images/products/kubedb/kubedb-community-logo.svg index 83ee0f225e..7ee0c6c17f 100644 --- a/static/assets/images/products/kubedb/kubedb-community-logo.svg +++ b/static/assets/images/products/kubedb/kubedb-community-logo.svg @@ -1 +1,34 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/assets/images/products/kubedb/kubedb-enterprise-logo.png b/static/assets/images/products/kubedb/kubedb-enterprise-logo.png index f639f12a30..d67850f55b 100644 Binary files a/static/assets/images/products/kubedb/kubedb-enterprise-logo.png and b/static/assets/images/products/kubedb/kubedb-enterprise-logo.png differ diff --git a/static/assets/images/products/kubedb/kubedb-enterprise-logo.svg b/static/assets/images/products/kubedb/kubedb-enterprise-logo.svg index 601bcb549c..5a3d9bfa26 100644 --- a/static/assets/images/products/kubedb/kubedb-enterprise-logo.svg +++ b/static/assets/images/products/kubedb/kubedb-enterprise-logo.svg @@ -1 +1,35 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/assets/images/products/kubedb/kubedb-logo-1280x1280.png b/static/assets/images/products/kubedb/kubedb-logo-1280x1280.png index b48e8add40..314fd70807 100644 Binary files a/static/assets/images/products/kubedb/kubedb-logo-1280x1280.png and b/static/assets/images/products/kubedb/kubedb-logo-1280x1280.png differ diff --git a/static/assets/images/products/kubedb/kubedb-logo-1280x1280.svg b/static/assets/images/products/kubedb/kubedb-logo-1280x1280.svg index 26c82dd7d2..4174034414 100644 --- a/static/assets/images/products/kubedb/kubedb-logo-1280x1280.svg +++ b/static/assets/images/products/kubedb/kubedb-logo-1280x1280.svg @@ -1 +1,18 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + diff --git a/static/assets/images/products/kubedb/kubedb-logo-1280x640.png b/static/assets/images/products/kubedb/kubedb-logo-1280x640.png index b48e8add40..5f564deebf 100644 Binary files a/static/assets/images/products/kubedb/kubedb-logo-1280x640.png and b/static/assets/images/products/kubedb/kubedb-logo-1280x640.png differ diff --git a/static/assets/images/products/kubedb/kubedb-logo-1280x640.svg b/static/assets/images/products/kubedb/kubedb-logo-1280x640.svg index 26c82dd7d2..aebc5b9c5b 100644 --- a/static/assets/images/products/kubedb/kubedb-logo-1280x640.svg +++ b/static/assets/images/products/kubedb/kubedb-logo-1280x640.svg @@ -1 +1,18 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + diff --git a/static/assets/images/products/kubedb/kubedb-logo-white.png b/static/assets/images/products/kubedb/kubedb-logo-white.png index f3423fa37b..d471a64ac4 100644 Binary files a/static/assets/images/products/kubedb/kubedb-logo-white.png and b/static/assets/images/products/kubedb/kubedb-logo-white.png differ diff --git a/static/assets/images/products/kubedb/kubedb-white.png b/static/assets/images/products/kubedb/kubedb-white.png index b8804e0d63..d471a64ac4 100644 Binary files a/static/assets/images/products/kubedb/kubedb-white.png and b/static/assets/images/products/kubedb/kubedb-white.png differ diff --git a/static/assets/images/products/kubedb/kubedb.png b/static/assets/images/products/kubedb/kubedb.png index e7735ebb59..e70f3f92b7 100644 Binary files a/static/assets/images/products/kubedb/kubedb.png and b/static/assets/images/products/kubedb/kubedb.png differ diff --git a/static/assets/images/products/kubedb/kubedb.svg b/static/assets/images/products/kubedb/kubedb.svg index be7c279100..6bdd0cb832 100644 --- a/static/assets/images/products/kubedb/kubedb.svg +++ b/static/assets/images/products/kubedb/kubedb.svg @@ -1 +1,18 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + diff --git a/static/assets/images/products/kubedb/vector-logo/kubedb-cmyk.ai b/static/assets/images/products/kubedb/vector-logo/kubedb-cmyk.ai new file mode 100644 index 0000000000..9fc44f6be9 --- /dev/null +++ b/static/assets/images/products/kubedb/vector-logo/kubedb-cmyk.ai @@ -0,0 +1,5710 @@ +%PDF-1.6 % +1 0 obj <>/OCGs[31 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + kubedb-cmyk + + + 2024-12-17T09:27:50+06:00 + 2024-12-17T09:27:50+06:00 + 2024-12-17T09:27:50+07:00 + Adobe Illustrator 29.1 (Windows) + + + + 256 + 56 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAOAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9SXV3a2kD3F1Mlvbxisk 0rBEUeJZiAMIiSaCvNfNP5/eVNM5waQj6xdjYNH+7twfeRhVv9ipB8c2GHs2ct5ekMDMPKvMP5jf mB5o5Rz3Z0/T3r/ottWFCp7MQfUf/ZNTNli0uLHyFlrMyUDoHmXzp5Vaui6g5tq1azf44T4/unqo J8Vocnkw48n1BRIh6p5X/wCchtIuWS28y2jabcbBrmENJBXxZD+8T/hs1ubsyQ3gbbBN6ppmraZq lot3pt1Fd2z/AGZYXDr40NOh9jmtnAxNEUzSzz1qt5pPlPUb+yYJdQovpOQG4l3VK0O1QG2y3TwE pgHkiR2eJJ+ann5FCrqpIH80Nux+9oyc250eLu+9p4yzT8p/OnmXW/MV3a6peG5gFq0yqURaOska gjgq02c5ia3BCEAYit2cJEl6tmsbHivnn82NYfV5bTy/dC3sLc+n66KjNKw+0wZg1Fr0p165t9Po o8NyG7VKfckC/mt5+VQo1U0AoKwW5P3mPL/yeLu+9HGWTeXPzB81Q6VfeZvMOpFtFsQY4bb0YEa6 unHwQoyxhturEfqrmPl00DIQgPUffsGUZHmWFeWvzX8+an510qG41RxaXupW6S2qrGIxHLOoaMfD y48TTrXMvLo8UcZobiJ+5iJG30xnPNz5V1P82PzDi1K7ij1uZY45pFRQsWwDEAfYzpYaPFQ9LSZF MvJP5n+fL/zfo1ld6xLNa3N5DFPEVjoyM4DA0UHcZXqNJijjkQN6WMjae/mv+Z/nnQfPF7pmlan9 WsYUhMcPoW70LxKzfFJGzbk+OUaPSY54wZDf4plIgsQ/5Xb+Z/8A1ev+na0/6pZlfyfh/m/af1se Mvp7Rbia50awuJm5zTW8UkrUAqzoCxoKDqc57IKkQO9vRmQV2KpD5085aV5S0STVL+rmvp21shAe aUioRa9B3J7D7suwYJZZcIQTTwPV/wA/fP15cM9jNDpsBPwRRRJKQPdplkqfoGbuHZuIDfdqMyl/ /K7fzP8A+r1/07Wn/VLJ/wAn4f5v2n9aOMtr+d35nBgTrAYD9k21rQ/dEMf5Pw932leMvQ/y5/Pe bU9Sg0jzLFFFLcsI7bUIQUQyHZVlQkgcjtyXb275g6rs7hHFD5M4zZV+cPnu+8peX4X00AajfymG CZ1DLEqryd+J2LdOIO36sxtDpxllvyDKRoPA2/NH8w5JCf07d8mPRWAFT4KoAzd/lMX80NXGVrfm b+YasVbXbxWHUF6H9WP5TF/NC8RTSTzJ+dEen/pGSfWEsOPP600coi40ry5lacffplYxae69NpuS 7y1+dPnfS9Shlvr99SsOY+s204ViyV+Lg9OStTpvTxBwZdBjkNhRUTLGdc8z+Y/MEwutavZ7xAxo CaRoT1CIKRr9AzIx4YQ2iKYkkrIrvSraMNCheT/KHxfSTsPowkEoR9ppPm7WLC6v7CwlGm2kUk9x dgcY1SJS7/vXoCQo6LvkJThEgE7lNFU0vyx51udDGuafZyX+m82jcx/vXVk61jH7ynuBTBPNjEuE minhNJedQsZwUvIjG61BqCaEdqjcZZwkcmKnpus6ppF8bzQbu4tHQfFJGxWoG9GA2ZfZsZ44yFSA KQae52vmnVfMv5J6jqOqsj3iv6LSIoTkEmjoxUbV37UzTnDHHqAI8m27i8kzaNL0X8jf+Utu/wDm Ak/5PQ5gdo/QPf8ArbMfNln5uedv0ZYHRLGSmoXqf6Q6neKBtiPZn6fL6MxdFp+I8R5BlOTw7Ny0 pv5X8uXnmHWYNNtdufxTS0qI4l+05+XbxO2VZsohGyyAtA/mf5mjv9UTQtNQ2+g6CWtbOA7F5EPG Wd/FnYH6PcnJaTFwjiP1SWR6JN5E/wCU48vf9tOz/wCohMt1H93L+qfuRHm+xs5VyHxRrH/HWvf+ YiX/AImc66H0hxzzTb8uv+U88v8A/Mfb/wDJwZVqv7qXuKY809/PP/yZWpf8Y7f/AJMJlPZ/9yPj 96Z82A5msH0kn54eRNF0vT7Myz39xDbQpMLOMMqusYBXnI0Smn+STmgPZ+ScieW/Vu4wsT/nI3yM zBTZ6kgPVmigoPumJw/yXk74/j4L4gZz5Y84+XPM1qbjRrxbgJT1YiCksZP86NRh8+mYebBPGakG QNvF/wDnJLUZn8w6TppY+jBaG4C9uU0jIT90IzbdlR9JPm15C8fzaNb1vyn+QM2u+XrHWJdbFm17 H6q24tvV4qSeNX9WPqN+mazN2lwTMeG68/2Nggwfz95Nl8oeYX0h7kXiiNJo7gJ6fJXHdOT0III+ 0czNNn8WHFVMZCmOAlSCDQjcEdQcvYvavzuv5dQ8ieTr+Y1mu4lnkPi0tvG5/E5qez48OSY7v1ts +SK/ILRNEs/Lup+b9QVDNbSSxrO68vQggiWSR167tyNaCtB7nI9pZJGYxhYDa2V6bf8A5ffmddw3 cMDPd6FcJMwuIlV3Qhgqndg0bMtaHw6DMaccunFdJBkCCu8sfnLoHmLzW/l62tZkLmRbS6YqUl9J WZqrsVqqkjr9GDNoZY4cZKiQJp4V+auh2eiefdVsbNRHa80mijGwUTRrIVA7AMxA9s3OjyGeIE82 qQ3S7RADZuDuPUO3+xGWZObFlf5M6PpepfmI9vf2kV1bxQzypDKodA6soU8TsaV75ja6co4rBpnA bvfvO6JH5E1+ONQiJpd2qIooABbuAABmj05/ex/rD722XJin/OP3/kvl/wCYuf8A41zK7S/vfgxh yY1/zkjp9hFaaRexW0SXc00qTXCookdQikBmAq1O1cyOypEki9kZHltyiJp0gUBR6Z2Ap2zZDm1P SvJMjN+Q2sqeiXbKvy5wN/HNfn/xmPu/W2D6Xn+ZzW9U8kQQeS/Ktz5t1If6ZfxiLTbU7Flb4l/4 MqGPgormt1BOWYxjkObZHYW801LUbvUr+e+vJDLc3Dl5XPiew9h0AzYQiIihyYEqCI7uqIpZ2IVV G5JOwAGFD6K/LvydF5b0RBKg/Sd0BJeybEg9ogfBP11OaHVZ/El5BvjGny15o/5SXVv+Y24/5Otn SYvoHuDSeaJ8if8AKceXv+2nZ/8AUQmQ1H93L+qfuWPN9jZyrkPijWP+Ote/8xEv/EznXQ+kOOea bfl1/wAp55f/AOY+3/5ODKtV/dS9xTHmnv55/wDkytS/4x2//JhMp7P/ALkfH70z5sBzNYJj/hrz GF5nSrzhSvL6vLSnjXjkPFh3hNFLsmhPfI/ma68teZ7HVYXKxxyKl0g6PA5AkQ12+z08DQ5TqMQy QMSmJos4/wCcjv8AlOLH/tmRf9RE+YfZf92f636Ayyc3lWbJg+qvy780eWrbyNocFxq1lDPHaRLJ FJcRK6kDoylgQc5vVYZnJIgHn3N8Ts8Z/PbULC/88iexuYrqD6pCvqwOsiVBeo5KSK5tuzokY6Ir drnzed5nMHsH5tf+Sx8h/wDMJD/1CRZq9F/fZPf+lslyDJfyV0z9K/lPq+l+r6P1+a8tfW48+HrW 6Jy41WtOVaVzH18+HOJd1feygNk8/LX8p/8ABWoXd5+lf0h9ahEPD6v6PGjBq19SSuU6rW+MAKqv NMY0lfkn8i/8MeZ7LXP039c+p+r/AKP9V9Ll6sTxfb9Z6U516ZZqO0PEgY8NX5/sQIUXmH55/wDk ytS/4x2//JhM2PZ/9yPj97CfNjuh/wC8j/8AGQ/8RGZGTmwZP+Umu6Rofnu61DVrpLSzS2nUyvU1 YstFUKCzE+AGY2txyniAiLNs4Hdmvmj85JvMtveeXPJ+i3GotfwSW0tw6tUJKhRmSJKkbNszsKdx mJh0PhkTySqmRlewSTyv5084/lharo+v6Ax0x5WkWWvFubgV4TKZIX6fZ6++W5sGPUHijLdAJHNT /OX8wPLXm3Q9IbSJnM0E8pntpkKSIGQUr1U/7Fjh0OmnikeJZyBDCrv/AHgk/wCMZ/VmYObW9E8i urfkTrwB3W9Ib51tz+o5gaj/ABmPu/W2D6WB5nNb0/8AONXmsvL95ZgnRWt6W1PsqWVWUH5xgU+R zXaHYyB+q2ybzDNi1sk/LufToPOmly6hx+riUgM32VkKkRMa+EnH5Zj6oE4zTKPN9JZz7e+MPNH/ ACkurf8AMbcf8nWzrcX0D3BxzzRPkT/lOPL3/bTs/wDqITIaj+7l/VP3LHm+xs5VyHxRrH/HWvf+ YiX/AImc66H0hxzzTb8uv+U88v8A/Mfb/wDJwZVqv7qXuKY809/PP/yZWpf8Y7f/AJMJlPZ/9yPj 96Z82J+WlV/MelKwDK15bhlO4IMq1BGZWX6D7mI5vtDOSch8XeZURPMeqoihUW8uAqgUAAlYAADO txfQPc455pdk0PTPz9Zm8z6OzEljo1sSTuSTLNmv7N+iX9Y/oZz5vM82DB2KuxV2KvYPza/8lj5D /wCYSH/qEizV6L++ye/9LZLkHnnlrUfOrTxaP5cvr+OS4cmOzs55YlZyPiYqjKvRd2PbM7LHHXFM D4sBfR6vY/lb+cs0CyXfnCe1kYA+j9du5GX2YqQtfkTmtlrNODtC/gGzhPekvmzyj+dPl20kvjr1 9qFjEC0s1pe3LMijqzxsVag7kVAy3Dn08zXCAfMBBBDyy+1C/wBQuWur+5lu7p6B553aWQhRQVZy SaAUzZRiIigKDWmuh/7yP/xkP/ERleTmqy+0gyyNLCwDMalG8fY4xmrOfI/5zaj5Vt49M1HSIJbB T/eWyJbzdKcjwHpyHbuAT3OYeo0AyGwd/m2CdJ15s/5yDF9DJYeX9JEscy8Xm1BVkqCN6W6ll2/y mI9spw9mUbkfl+tJyPKBpdzczvcXPCH1GLskaqg3NaKiAIo8AOnhmz4wBQakwvgBZTAdAh/VkI81 Z/5B/wDJGeY/+2gf+I2uYOp/xmPu/W2D6WD5mtb1H8sLyLzHo1/5M1VfVtkhNxZy/tRDmAeJ/wAl 3DL9I6ZrdXHw5DJFsjvs8/1/Q73Q9WuNNvFpNA1A4+y6n7Lr7MMzseQTjYYEUl+WIe8/lT52/Tml /o29euqWCAcj1lhHwq/zXo30Hvmk1mn4JWORboSt82eaP+Ul1b/mNuP+TrZ0GL6B7g1HmifIn/Kc eXv+2nZ/9RCZDUf3cv6p+5Y832NnKuQ+KNY/4617/wAxEv8AxM510PpDjnmm35df8p55f/5j7f8A 5ODKtV/dS9xTHmnv55/+TK1L/jHb/wDJhMp7P/uR8fvTPmxTyv8A8pLpP/Mbb/8AJ1cysv0H3FiO b7PzknIfGHmj/lJdW/5jbj/k62dbi+ge4OOeaWZND0v8+/8AlJdG/wC2Nbf8nZs1/Z30S/rH9DOf N5pmwYPq/wDLnQtEm8i6HLNp9tJK9nEXkeGNmJK9SSKnOa1WSQyyonm3x5Ma8/8A5heV/KGvfoh/ K1teN6KTesohjHxkinExP/L45kabTTyx4uMhEpUxv/levlP/AKku3/4KH/qhmR/J8/55/HxR4gV/ z1v4tQ8leUr+GEW0N2gnjtxSkaywI4QUCj4QadMj2dHhyTHd+tZ8kV+QGnafpvlbWvNdwvKZGkiL AVZYLeNZXC/65bf5DI9pSMpxgPxawG1sG1r87/P+oX0k1rffo61JPo2sCRkKp6AuylmPufoAzMx9 n4ojcWWJmWefk3+bGu65rJ8v6/It28sTPZ3fBUflGKsjhQqsCgJrSu3eu2FrtHGEeKOzKEreXfmf oNtoXnrVdPtVCWqyLLBGvRUmRZeI9l50GbLSZDPGCebCQos18x/kV5r0ZpJ/Ls66rZVLfVmpHOB/ qk8H+akE+GYeLtGE9p7FkYMDlvJ7O5a01O2lsbpNnilRkIPurAMMzgARYNhgvumjkspmUh14MQRu NhgHNCH0YKLLlQAljU/LJT5quuNWtYqhT6r+C9PvwCBVPfL/AOXPn7zUFaCzNjp0nW6uaxRlT3UE F3/2IplOXVYsfM2WQiS9UuvI0fk38pdY0xbpryWZ0uZ5SvBebPElEWpoAEHffNbHUeLnBqvwWwig 8bzbNL0X8jf+Utu/+YCT/k9DmB2j9A9/62zHzZ7+Z3kkeYdJ+s2iV1ayUtBQbyp1aI/rX3+eYOk1 HBKj9JZyjb5+IIJBFCNiDm9aEZo2r3uj6nb6jZPwuLduS+BHRlb2YbHIZICQopBpV/M7y7aP6PnH RV/3D6w5N1CNza3p+KSJvZjVl/pTI6TKf7uX1R+0MpDqwvStRn0zVLPUoADPZTx3EQbdS8Th1r7V XMucRKJB6sQ9kf8A5yZmMJCeXVE3Ggc3ZK8qdePog09uX05qv5J/pfZ+1n4jxSeaSeaSaQ1klYu5 6VLGpzbgU1p9+XX/ACnnl/8A5j7f/k4Mo1X91L3FlHmnv55/+TK1L/jHb/8AJhMp7P8A7kfH70z5 sHsruWzvILuGnq20iSx13HJGDCv0jMyQsUwD2j/oZmb0af4dX1uNOf1s8eVOvH0a0r25fTmp/kn+ l9n7WzxHi97dy3l5PdzU9a4keWSmw5OxY0HzObaIoU1usbOa9vbezgUtNcyJDEoFSWdgoH3nGUqF lQ9X/wCcjdKe313R7tFItnsfqsbdRW3kZqfdMM1vZc7jIdbtsyB5Fmza3rPlL8/rjQfL1no8+ire myT0o7hbj0aoPsgp6Um4G1a5rM/ZonMyEqvybBOmD+e/ONx5u8wyavNbrahkSKK3VufFErSr0Xka k70GZmnwDFDh5sJG2PAEmg3Jy9D2n87LGaw8heTbGccZrSFIJVPZo7eNWH3jNToJcWWZHX9bbPky D8i7CPUPyw1GwkYpHeXN1A7rTkFlgjQkV775R2jLhzA9wCYclL/oW3y1/wBXW9+6L/mnD/Ks+4I8 MJ15P/JXRPK+vwaza39zPPbrIqxSiPgfUQoa8VB6NlWfXyyR4SAyEKeP/nn/AOTK1L/jHb/8mEza dn/3I+P3tc+b6kznG5Ldc8taDr1t9X1exivYgCF9RfiWvXg4o6f7E5ZjyygbiaQQ8n8z/wDOO6Uk n8r6gYCwNbG7JKGvZZVFfkGU/PNnh7T6THxDA4+5INB/5x8833cgj1i6h02yRjVUb15G91VaJv4l voy7J2njH0iygY3rPlb8qPJXlzhLbWQur1KH67d0lkBHdQQET/YqM1mbWZMnM0PJmIgMwzFZJP5v 0SfW/Ld9pcEixTXKARu9eIZXDitKmh40y3BkEJiRQRYeTf8AKjfNv/LXYf8AIyb/AKo5tP5Rh3H8 fFr8Msr/AC3/AC31ryzrVxf39xbSRyWzQIkDSM3JpEep5om3wZi6rVRyRoXzZRjT0bMBm8t87flB d6rrT6jostvbpc/Hcwzs6gSk7snBH2bqffNlp9cIxqVtcoWkH/KjfNv/AC12H/Iyb/qjl/8AKMO4 /j4o8Mp/5X/K3zBYxXulaxLZ3fl/U4zHe20ckpdXArHLFyiADqwHf9QyjNrIGpRsSCYxIeWax+Sf 5gWN/NDbac19aq7CC6ieKjoDsxUvyWo7EZsoa/ERuaLEwKppH5FfmFfzItxZx6dAx+Ke4ljNAOvw Rl3/AAwT7RxR5G1ECmmp/wDOPHm6O+kTTZraeyXiIpppDG7fCORKBTx+KtBXplUO08db3aTjKN8o /kf520rzRpWp3RtPq1ndRTzcJSW4I4Y0HAb7ZHP2hjlAgXuFECCmf5m/lB5u8yecbzV9ONt9UnWF U9WUq1Y4lQ1AU91yrSa3HjxiJu0yiSUk0P8A5x78znVYBrLW66YeQuGgmJlUFCFZAUpUNQ75dk7T hw+nmgY0t138hPPen3DjT4Y9VtQSUmhkSN+PblHKykH2UtlmPtHHIb7FBgUqg/Jz8yZpAi6LIp7s 8sKKPpZxlp12EfxI4C9V/K78lH0C/j1vXpI59Rh3tLSKrRxMRTmzEDk47UFB137azV6/jHDHk2Rh TOvO/kvTPN2hvpl8TEwb1LW5UVaKUAgMBtyG9Cvce++YenznFKwyIt8/av8AkV+YVjM629pHqMC/ Znt5YxUdvgkMb1+Qzdw7RxS5mmowKW/8qi/Mf/qxzf8ABRf815Z+dxfzkcBXRfk9+ZMkgRdElBPd pIVH0lnAxOuw/wA5eAvRfy6/Ie7sdSt9X8zvGTbMJYNNjPqAupqplf7NAd+K1r3PbMDVdogjhh82 cYM1/NryDc+cNAihspFj1GykM1sJCQjgrxeMkdCdqHxHvXMTRakYpb8iylGw8Uh/KH83bdTHb6fL HHUnjHeW6qT40EwzbnW4DzP2H9TXwyVP+VVfnL/yx3H/AEnW/wD1XwfnNP3/AGH9S8Mnf8qq/OX/ AJY7j/pOt/8Aqvj+c0/f9h/UvDJF6H+Rnn3UtYh/T0P1Oy5A3VzJPFNIUHVUEbyHkRsK7ZHJ2hij H07lRA9X/9k= + + + + uuid:a2b13d60-5780-4405-a589-cbe15c62470d + xmp.did:8337032f-816c-a445-819f-b04dd70f9231 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + uuid:87d7cc42-d24f-554d-97c7-b76979e61089 + xmp.did:68099ade-e32b-42d3-94ec-ef546c954f1c + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:8337032f-816c-a445-819f-b04dd70f9231 + 2024-12-17T09:19:17+06:00 + Adobe Illustrator 29.1 (Windows) + / + + + + Document + Print + AIRobin + False + False + 1 + + 5.000000 + 1.496732 + Inches + + + + Cyan + Magenta + + + + + + Default Swatch Group + 0 + + + + White + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + Black + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + CMYK Red + CMYK + PROCESS + 0.000000 + 100.000000 + 100.000000 + 0.000000 + + + CMYK Yellow + CMYK + PROCESS + 0.000000 + 0.000000 + 100.000000 + 0.000000 + + + CMYK Green + CMYK + PROCESS + 100.000000 + 0.000000 + 100.000000 + 0.000000 + + + CMYK Cyan + CMYK + PROCESS + 100.000000 + 0.000000 + 0.000000 + 0.000000 + + + CMYK Blue + CMYK + PROCESS + 100.000000 + 100.000000 + 0.000000 + 0.000000 + + + CMYK Magenta + CMYK + PROCESS + 0.000000 + 100.000000 + 0.000000 + 0.000000 + + + C=15 M=100 Y=90 K=10 + CMYK + PROCESS + 15.000000 + 100.000000 + 90.000000 + 10.000000 + + + C=0 M=90 Y=85 K=0 + CMYK + PROCESS + 0.000000 + 90.000000 + 85.000000 + 0.000000 + + + C=0 M=80 Y=95 K=0 + CMYK + PROCESS + 0.000000 + 80.000000 + 95.000000 + 0.000000 + + + C=0 M=50 Y=100 K=0 + CMYK + PROCESS + 0.000000 + 50.000000 + 100.000000 + 0.000000 + + + C=0 M=35 Y=85 K=0 + CMYK + PROCESS + 0.000000 + 35.000000 + 85.000000 + 0.000000 + + + C=5 M=0 Y=90 K=0 + CMYK + PROCESS + 5.000000 + 0.000000 + 90.000000 + 0.000000 + + + C=20 M=0 Y=100 K=0 + CMYK + PROCESS + 20.000000 + 0.000000 + 100.000000 + 0.000000 + + + C=50 M=0 Y=100 K=0 + CMYK + PROCESS + 50.000000 + 0.000000 + 100.000000 + 0.000000 + + + C=75 M=0 Y=100 K=0 + CMYK + PROCESS + 75.000000 + 0.000000 + 100.000000 + 0.000000 + + + C=85 M=10 Y=100 K=10 + CMYK + PROCESS + 85.000000 + 10.000000 + 100.000000 + 10.000000 + + + C=90 M=30 Y=95 K=30 + CMYK + PROCESS + 90.000000 + 30.000000 + 95.000000 + 30.000000 + + + C=75 M=0 Y=75 K=0 + CMYK + PROCESS + 75.000000 + 0.000000 + 75.000000 + 0.000000 + + + C=80 M=10 Y=45 K=0 + CMYK + PROCESS + 80.000000 + 10.000000 + 45.000000 + 0.000000 + + + C=70 M=15 Y=0 K=0 + CMYK + PROCESS + 70.000000 + 15.000000 + 0.000000 + 0.000000 + + + C=85 M=50 Y=0 K=0 + CMYK + PROCESS + 85.000000 + 50.000000 + 0.000000 + 0.000000 + + + C=100 M=95 Y=5 K=0 + CMYK + PROCESS + 100.000000 + 95.000000 + 5.000000 + 0.000000 + + + C=100 M=100 Y=25 K=25 + CMYK + PROCESS + 100.000000 + 100.000000 + 25.000000 + 25.000000 + + + C=75 M=100 Y=0 K=0 + CMYK + PROCESS + 75.000000 + 100.000000 + 0.000000 + 0.000000 + + + C=50 M=100 Y=0 K=0 + CMYK + PROCESS + 50.000000 + 100.000000 + 0.000000 + 0.000000 + + + C=35 M=100 Y=35 K=10 + CMYK + PROCESS + 35.000000 + 100.000000 + 35.000000 + 10.000000 + + + C=10 M=100 Y=50 K=0 + CMYK + PROCESS + 10.000000 + 100.000000 + 50.000000 + 0.000000 + + + C=0 M=95 Y=20 K=0 + CMYK + PROCESS + 0.000000 + 95.000000 + 20.000000 + 0.000000 + + + C=25 M=25 Y=40 K=0 + CMYK + PROCESS + 25.000000 + 25.000000 + 40.000000 + 0.000000 + + + C=40 M=45 Y=50 K=5 + CMYK + PROCESS + 40.000000 + 45.000000 + 50.000000 + 5.000000 + + + C=50 M=50 Y=60 K=25 + CMYK + PROCESS + 50.000000 + 50.000000 + 60.000000 + 25.000000 + + + C=55 M=60 Y=65 K=40 + CMYK + PROCESS + 55.000000 + 60.000000 + 65.000000 + 40.000000 + + + C=25 M=40 Y=65 K=0 + CMYK + PROCESS + 25.000000 + 40.000000 + 65.000000 + 0.000000 + + + C=30 M=50 Y=75 K=10 + CMYK + PROCESS + 30.000000 + 50.000000 + 75.000000 + 10.000000 + + + C=35 M=60 Y=80 K=25 + CMYK + PROCESS + 35.000000 + 60.000000 + 80.000000 + 25.000000 + + + C=40 M=65 Y=90 K=35 + CMYK + PROCESS + 40.000000 + 65.000000 + 90.000000 + 35.000000 + + + C=40 M=70 Y=100 K=50 + CMYK + PROCESS + 40.000000 + 70.000000 + 100.000000 + 50.000000 + + + C=50 M=70 Y=80 K=70 + CMYK + PROCESS + 50.000000 + 70.000000 + 80.000000 + 70.000000 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + C=0 M=0 Y=0 K=90 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 89.999400 + + + C=0 M=0 Y=0 K=80 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 79.998800 + + + C=0 M=0 Y=0 K=70 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 69.999700 + + + C=0 M=0 Y=0 K=60 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 59.999100 + + + C=0 M=0 Y=0 K=50 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 50.000000 + + + C=0 M=0 Y=0 K=40 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 39.999400 + + + C=0 M=0 Y=0 K=30 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 29.998800 + + + C=0 M=0 Y=0 K=20 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 19.999700 + + + C=0 M=0 Y=0 K=10 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 9.999100 + + + C=0 M=0 Y=0 K=5 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 4.998800 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + CMYK + PROCESS + 0.000000 + 100.000000 + 100.000000 + 0.000000 + + + C=0 M=75 Y=100 K=0 + CMYK + PROCESS + 0.000000 + 75.000000 + 100.000000 + 0.000000 + + + C=0 M=10 Y=95 K=0 + CMYK + PROCESS + 0.000000 + 10.000000 + 95.000000 + 0.000000 + + + C=85 M=10 Y=100 K=0 + CMYK + PROCESS + 85.000000 + 10.000000 + 100.000000 + 0.000000 + + + C=100 M=90 Y=0 K=0 + CMYK + PROCESS + 100.000000 + 90.000000 + 0.000000 + 0.000000 + + + C=60 M=90 Y=0 K=0 + CMYK + PROCESS + 60.000000 + 90.000000 + 0.003100 + 0.003100 + + + + + + + Adobe PDF library 17.00 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 5 0 obj <>/ExtGState<>/Properties<>>>/Thumb 36 0 R/TrimBox[0.0 0.0 360.0 107.765]/Type/Page/PieceInfo<>>> endobj 33 0 obj <>stream +HWKdI)u|<~[zY!Xp0ꑠ/afSEAB#MGƋŗ?}ݾk_[۲-Ǘ_??e-m}Y^ֶQdz`Woƞ{Լ˞Gٞ9~{=ͺ2uq8)gٰr5su}q~Lg{ٯ.}n }7)ű9yLu7_iT\UG2uyг o(ݕXH0\,W=>fƞr`\04'D/k5cժU`ڸMV)zdGzPĂL<ƶ f^AHQz 8awFnii_O[>D+H>Ldym&AH T0a;gGiŭ#}f>Rjdg^*j`44 ePە$D҅{Guߋt4-$7y`@XvzbR暷pf0r?98 +݃;tlov|$¬1e?ZbA$0:Q-$4? c`D܍`_`.B80$"+5d-m2Ns"9_R+ H;_(XS* nȷ©0zkP*HYrI'Rgg8͐o]Ҟۼ3/w<> +~xC-l@?5'O\OA1*y/)'i27RdRܶO'|6h-MMsA5O@A}̓AɶEWqei F=b/-:'smL>At20Y$L8l~U I٨CEv𯴦B8HHKH_ʫnGnvBm)y6wqh䚻38bl;ir!wEx}vd4Fp`,WFzEņ5P$U]C!N\D2uj9%cوbxRYʶ:.y>YdݒaIU87Qzx0k3vwo dv[`G8@]r #\Q˦ռKWX{hUXTjTrA1 +ЈL+(%#I +=|e)__ly +˭DexVo>۵Oys @8 BW?gG0mPJB^VGW|Xq,;bc؁;_]uƍpmlVG"6Gd7Ɵjk $ v-H6QlER_}<wd6?"~ T*VD¡z:muyXXq6cSQ] xU}wpugb'מ*UA&H`|Nkz#+Yڝpa.(va&MW`|h|.飯9;v=R¤y9 ε@bJ*>";CB-.*hS֖mj6I:ڤbKЁF@1LpݤLb IQv:I e<091X;@ oCAwt~1QɡYʖY@.pA&ܑa z_`]Erpf\F5$ktШ0: 7KDۅQsH4rܕcN|M y,[<3InC7,{z#%洚nnߛ)V]\zjhnÊJ.癌Ÿ-7ZA/]na#_[f7%NCjD79ݔS5q\[P J8 0HegĦщAL`‘d]HsKNL]Q`MvjC4$=a9i uyyO+^y0F%wPBП+"ͤ5eIw^ ݾ.gٹiJ`[' "PBYĀEŚgڪkj2))ڏLw7nC5^e׿<h b2E< +ۢlXr0P VrUlh9!g~`m_8ϙ8|"\\g`G˳ Y7cÅΎSxT_nc R)lT'I!vE>eງ WB+.#|\cf JAis= +NҴ}dڬEkgWUY ¯K 52•Sk& +endstream endobj 36 0 obj <>stream +8;X^9;$m:H#XhJL=,.[.3_Yn43ifEL`%K!F3Xd9.p*c&q$cbhjMnu+lU0g!rMQ,C` +bQGbQrNrJ+K]@I3WG4bbm8d&hS(/?.A3XA;=NmX'F"q;el#'t%Um"u8+!u1dC=&jF +ELfdKjb6ldr"5Rd!WW6#rr<$!s8N0$[f9SE~> +endstream endobj 8 0 obj <> endobj 9 0 obj <> endobj 10 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 24.0 +%%AI8_CreatorVersion: 29.1.0 +%%For: (Mohin Uddin) () +%%Title: (kubedb-cmyk.ai) +%%CreationDate: 12/17/2024 9:27 AM +%%Canvassize: 16383 +%%BoundingBox: 31 -216 329 -152 +%%HiResBoundingBox: 31.1251292596107 -215.04187345102 328.87487074039 -152.134597137212 +%%DocumentProcessColors: Cyan Magenta +%AI5_FileFormat 14.0 +%AI12_BuildNumber: 142 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%CMYKProcessColor: 1 1 1 1 ([Registration]) +%AI3_Cropmarks: 0 -237.470588235292 360 -129.70588235294 +%AI3_TemplateBox: 180.5 -180.5 180.5 -180.5 +%AI3_TileBox: -216 -489.588235294115 576 122.411764705885 +%AI3_DocumentPreview: None +%AI5_ArtSize: 14400 14400 +%AI5_RulerUnits: 0 +%AI24_LargeCanvasScale: 1 +%AI9_ColorModel: 2 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI17_Begin_Content_if_version_gt:24 4 +%AI10_OpenToVie: -232.882352941178 -9.23529411764594 2.83333333333333 0 8061.88235294118 8182.76470588235 1616 906 18 0 0 -1874 121 0 0 0 1 1 0 1 1 0 0 +%AI17_Alternate_Content +%AI9_OpenToView: -232.882352941178 -9.23529411764594 2.83333333333333 1616 906 18 0 0 -1874 121 0 0 0 1 1 0 1 1 0 0 +%AI17_End_Versioned_Content +%AI5_OpenViewLayers: 7 +%AI17_Begin_Content_if_version_gt:24 4 +%AI17_Alternate_Content +%AI17_End_Versioned_Content +%%PageOrigin:-126 -576 +%AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MS +%%EndComments + +endstream endobj 11 0 obj <>stream +%AI24_ZStandard_Data(/Xtn3 ,L mćçko3Ev3nt + 9gevte1ܱi^Bml'<,7D碢x$m1P_XJDLDUܽ؎VWiO:sj V!k#RH)rERD22 +E*TGn5-BDWKґK2{ڮ (żr1n*fD:HGΞO,T/{EFKSDP#VHOI"BY:zjdXUPܤ{B֯k" ʳ;K|*:YZ) +v)+ϒl+kZwK(F,6_K~"tM9;zy)cGnu.Y RŰM.C˷>˒ })XG%w}*c%%U<@(4@$"!8` <($ (PX AD" +(4<@hh GP8 B$F@$xHP"X4 z(h0;F$y"Vp4 ϊp\- QNM]ZPeHb}vc5!V[rs "!r%Q[ijL5'Rx!IhV)2+`!ʤ]ڳuĦ,Eu&ΫD0D"&",D➈ĭ! W!VDeB 8;5EpH0a("AW F\4CuR)=h5Ur}1 E"p,F$p4;ъPxVH Db8Z5^5Ah0 q1X, HcsXݘ5hdD4(X+u(ƃcCC&@ī20 R!TbHZ2_b_ʉ IÖ!RE@$ cHty(*GP܉@$p0 Db[ DzD‰EE$<"#H0H<yyHTR`(W48Dqs0htE$j$"AFff4ː]˱"qJVlrM! X("QCģB$nH\`4N Dc8  E:.hK s~œ«76w>H1@$H,*"H w< )) Fx(TvbX0)&(!t:456789bØ81ĴVWl}]F}tDTdtd:)hA j4բB$\/E-Qrԣjdefghiư9as=:;HF6ґN# 7^yW|qwQTARHW( CP8"1.hQ [ b`, F(1dq`0 `L jTF6 ;z^ Db &pofyti$gRfV) R"%  (@<၄y +H`P }O1 +CJYC,C̝rҗ!W4G`,wYu<±Px4xHTA5A ZЂdJJBB::2**""*!CC:h2fثJ81YbtfDpÍ7P4E`4Fp4Gc㨣r09΁t#vq +"p, p4p<G}Ѓ=q{#Ï?P<c`<ƣp<\&G:\"LKJ@.PGc"a!a|Ǹ)û=a cvF1jQzl,^E-h, +@$BŠT()7~7 +v}6#VH` @9́Hup4 FcP4p#ظ5A6`8 `aF2q ce p, b@$ +H "Q#C @@A 0DpxP88 D   +92d!"@$f HXDe ,!"@$C +,xP RZX  *< $PTP8P +@ЀA X<84<`@$0d ,p` Ƞ.@hT AC +$PA! \A8b %唿g:M,!ۈ^bS楱\f]|鐦drEw4Y[wS%{`yw,ڳu?Q/oʹWwǬMZowgYVޫ*13kh3w_Ow;L~\|DyRcjL|-uܗoףt 5[ gtlq%MJc>/uފXxs)k˼ݬ.~6VK/;-d9,)^:hSXBels~Y=e\S|=,<5ծ, oO+iJ]ɷd!lӄ/k[l_boDL4dRV!k'<"coWXLFDdi+ޅ/k3W-ͩoJ,2cӾ1,hF +[=m;38tvrV2sxD'lr' ]dMTy$t/|Z]2LfRfIɻ)34*xr'x~)])xr+5 $hjMI: =ϵG8iZwe[JwӴ4::˥#DT3s9nQ )mvY)iJ|iқ=eY|NӍz̲`ݝsw7URj?Rץ< +?\yw3}pwHV+^w6a6|3u4|瞳yn + }]T9]^^/G4 9̪  qw3>XM]ҮvBv"t\.OՃɗ;wCY1] 땲Ѯ2uV +7T4|6)|iezhGQUkY\6Xr9ѭ2ud%tWY;Ϟjv8SgvӣE_9zS4][>|f8g$$W̳yLYMם{B7žV%}Ss.Β΄B>̛4o&ٮA4m1bs\毕1rT"際^\ D2fU$t%<7)2Ihx-<*NHhT#Y+eeg}ֽ*ߢ,3hP2FS{vK)ihu"ՒP3]:C.˘\LhTXi$S6I$>+Eld5]'zLe&|"$Oو͙2%SUK,X< T,iĭn^I6b#6=!_9!~\ze6RBjQgګXzy,Ckڕ2;+zBj>e yaYՔ"oc1/v35l +S;X8/cREc._ IY9lb,zĖձ5ffk-FH˂HZdf,"r)J4 YJ妄^ygnYN\$a4qȊѼJib\߫ϪddVɺ]Ė!$VN4FfLs)BYJX,h5#7 IѲIWsx'?aGB*5%U~|:)]/gk V~dߗ2r-' +"s*;˴R#XF,g$ +11MN$eS(kNve]j͟|xSU8UN? JIrVHhJ!镜Uv~鑓a]Med,ufb, [>DN39 XbjqblM*HLy^)!aӊ8nh%X<)'l5@dH0Hp0 H  +AD" 4@  *P +bAƖuyTOJ,E Is$4%;=w[ J0JY d,XuPaɩʫ<3OH +Jri|W6b+;CVO&}׌4vTZ] mF(Y%QX!i;Ryqh.Z+it\v )uiSX<,Β_cz9*2Zz6^WTKhԼB7#2XtHI)l9؈l^=Yr)=.4Y'*xiK+M߈n;^j~YK*GJW6J. \ қ6 ݴFD<%Vbmz^>GfY%S=gSܿЎYZ"Ƽ:9DFye,HEe97XI[7ii i6tGZ?k泦vV,x;kO_Q3̲*?_%\U^].wId)l!ewW'g;S*\U,4'IVBRHv.+L^N,Mu,*lݽY`Wf>cV oFVkɰoUBˬBO,xvveWŧkxg9ŰV4YghXֱ#Cj*%SnZ^;+XT^jB1Y ߷TTX|ԺxMj]j4 tb}3wOe6Xz٩-}j.e1RNUɼ:Y*iuYNE`d/hzUɢRVٍC4v+5.p?zNe#cl9*7B.E2"sGT$( 2`||pc. bׂ*R> ]PN[يrxb/S ]+TI>Ķ\ ^%̙J[enuUVִInGS7'yKe6zTS4*W"<'oW7YBE7["C2<:O*cK'g`XUlh2R~ְaVV!,GۋnG,i6WϲrK2fefvJjts"J<4<.G,p-z9+cf=1}ϚvM[mu87T5ק}Dy-š36γZ$evbbnV>wܫԝko?TWv\)"(ӥ8d'*'aً(dw +FSY:Da}>Mu,N.]r 9{>{ YM/}.96-eh'+lYcdfnֻgvƗc_*=fk-uۇ^.5T'y->%RC3vhOM։ƊzHYȈ^~DDg%"Ks^Ur~Ϯ4FK{Fxť$*EFd}5D{c4sUke 掯9o\ۜOfwCu*;g|gbڇX+8t;=z"}PJWM8t݌0W:yىEJ"j*8BkZWU{J_:vSK eve|V,^e^e;+&fRN?J+C>"Eٳ Yyy*XHי4,><R,;#ݔ͹6ZDxR0: +%V#^>XTe +: ҍWǣ^N֍o~F>:#ׯnIZd?3؋Yяտ"ʲ"SL+(X ppAyJNy+S6|<\yZZdI͜7ds+2̢39s}Z,:zg|]U99sC6OG|ͱL7Dx] q^jsTXuy6_d]ͼT9=~2hi +Zit9ۊ9JMg`ź@:37ݬ-)ɲ@UG~5Nr\\s,㴘-Ln"i-q. 3TÙ~"5x4:b*VШ7}={S:Vy6}II5ZW]޹NXTʈF` ~fqY5ƬWSPT:̮vW͞-/'}U(oy5hYRD$y3#ؓMhM8{44xjnZNRvaҸd-аTu2eU*,NqfʲCʟ~46X{n>UEˇyavP HR=kr%QvwB,z:;gwy5iu4o^|yв|eBtdKwn>{htϾBh4ǻ,m15Ge4$̈́Jl5,+jޒ\Yx*dä)b⇆JFi=yi$QUh y35 K%fsVN3ORM8%ۗ_ +,,Uvx ]/\KˊoT*4GEr=OW93ЋHf",C_{9 O93hBH+͘|gv{5"#08dvZw9%y/e99.HOpZ%GM$w2M>dKk9'xfB @8+ CM ZO$Og>Jd?r"yVxNx5ay2R}LceUarueɢiُcCKBCg|zY*l䩎SA\𳆨yV ya9^ջ\Չ|zReer+m)sX!̂.}fP_B֮NFdzT;:RFte5=kuu2ȄFu>w$sUIQZM*G2uPY?$ROcrw&S_˼&8F. {7"wQYwvҲZե"KY+l묯ʬ:TF+Coù7^&yd3h6ղ hkUedLOШDv)rT:σ49E^ t*̆]˴V/lZr jZ{g|ʐneG-?^-򻜢:D9Iы9Zv#KVx~ ]\<"?VM0)J!ϋ٫WU3[/tVG֣94c:XنƧ1m&DD9l9Nf9kTjD02ex 6ET5KK9eǙY66:mk/ Ms+;&s:Df5U͕CYXeω\$BY3m'ާJk5g1vJ#׆~Yb8Y]k0T1DfDi6]bMN$ v<<7 U[ Y7єAߋ^d3D<e"cmv>sB|scSfv|S)+oNy6+=Vc>?N3|UvUj9jYm1؜F+[ȰX5V}o'La_5ìZcf9fӳ3W7f}+LjW:V?MլQ,2cѕ>*gMHk +qڪ%$~(j)4zs+LBV5FpJˢ2ɛzʎHT2'39+"*ҧ? +]tڊiTWUUXW]yUnkKӺ!UءlRa KTi=m!l22=U{uC*bUeE9)+W4R'uK?Xx3뚅uΛg/o>)DwܘoUU⟯6}̧bjiJ_9RtUi\ռ\kB+^Gn)T 0O/K;k'*FP~XuUl>)g̢ؔbYc @Ȁ0Ͳ +3*f;c7Jΰlo'Ӣ#JO8Gٳ(ɥ yWI^S6Uy:/N.yN*yBOrwmJHiD NQNKF?`YsYZ*^TYL~ZUR2~SuJtў<ԥW̭ iŒTv?R>qUbXmmH|V}/JZ#W8}ԕ޹jTdƪ^*mռ6+UWGGu[*X:YͦZ|*Ԫ[SR[S"OQ ǞUnRЯY"0$CC +@&ZܨT1cz:BA  $l>wX4V8"Eu#Q C 333G}=Md0`kgSި1![Ic4j+Ębs-.JP.y77}w:-]LJ͔S[@= !ҢIKdLA?[ʁ@+1}Pt+jx˚u +Ǫ䕗x'0Uņn?D5 =v>ѿ&*{vZJ0+Vu2' iV$?-׭|+U!xKh4Jڑn"AV!!og߷؁:X1+!-̊J yUQ:%ilymMr&ↀy=uµ ^%U%#pN;bاT,iÿ>E! ,}S|R' u$*BLjR {U;yQUyCQ0z=&@4چH[b?Q{+Y;#^4s)%n[.Ř*=Qx='\&T{Fл!Q,ʴ*va>Թ[tO?%eSE'  ?1TOPXX~;;YWj􉫬Პ.$Phͯ$PtD[SKlFjGp7HögP'YA7kH< > x(.? bWrcvgQs,04Ȃmh@u~ U09ÊᙌXf@= \yLq@#ځR\և40DS 8en+(l֬hq +er^%"h nlHRmn0 jtL,R%)Wm/MdڡU4ΜVO;eNBb +'L,DXm"aBE/01'w%oЪ*\h`LA.jsW& +`zh"fxu~Kǽ*զ{=, %,WM1#C51|lc6wW^k1rlv[P^K)5}ҁ'Uh<;TH*ޯQH` +6o$>Y`1*w߸Mb^Ro{n)J[ 6JJn87Q\Sd0<1'9$A=;:oDajW@[DQH"V%C8g )S$J3X.yiĈ(3g|DQCEۣa"p?Nw[]`0Gep4wmJ|xP.`3!Ԏ>ӯwmExH+C`zKOGLx}'D9 +!sʐ;˂p!kV2!^2=WDVa .+1pfhtP> 1Wi&< +?v,fn ~mM(1wK+omn\]MaQL i4 +m1Lpƶ]ETZ9fӳБ)Πm:#BI,$3Oz50\1K|#*7kx&,=bP00+/H2s&"J8BRVl|ts P)#4qziv&=!E}c#\/Ґ%&I.ȈoSMFk([.Ө"GO/ +2mp.LȰ<MX(]nh&=_O,_1ä<(I5׿wM<)YuӢU&r.O"a*$(97Z@Ĕdf .L뉞˴D%Wol SC(ClЎ +mON[%zZ jPu,{mI_[?(Ϯ2!pA  +ݥF +8)BAS \"8k?\$9PZVH{}ShM2$}lXWVb۱wHH۪ y!n7HBdW /0'JK;3$ +Df| +F(,|a\) K h1!aCVo{{;!nbaR2VHIhZZ2!Tр.*aſ^ v甕# +8 @=o3lt9!H.?V0rDˆUgKIƕ˩^2LG)p1doxJ +њTl,sMzv2Df{&8k^B pҿ D@J"J 5| DۂjuYHP6NqtJ nGahA^R7JPxDKHi@5ҿ'kGRZ!R6D!cjG~U}:ԣ%:-Q՘y4ȒhCJ)xJ=;cc;< I/RzOD$p"PmِPݦR͌ A񱊈DMFΐoQ?q{ 1Ӷ.Ynmj}!udjtAoo0yca$$|H ^v,_sT3 +/-Zg=y5ŧd?>i#28 B GYkrP +ĔDe}L1/, .uhǐڅMg2)ى9- 9q"DN4)d.a' +D,;)`1bL=b˕=xWj6kȞ舠=xMxGwWҎ\=+!Y,ΉfH7P\!(z͚bᐺXŠ ECI':[?dBSgχ=q4Ɂ8>{9'(Ȏ퉂3k >RhpC(밙b"_%/Ő?6s٘G oU ]T!ҙś'Ee#v +A:G` +a86{识/Gs汩CUMϺ;+(J բcTCLjaZPU0k!GʟkNuP:FHC.c>hPAU{fPjHBmzPoyJFZ~:{6ľq5g"ƛtT73[/ՠČ-@l/,o }rph0ڞ]X؛C,}@PHN!#``AO7+ \B${3[aop^!fr\yތgCtBG+ZFj-mcgCoͿ&^)",:1cɭ]kHRں&U"״v+Jh1>*"^ͥ[tdx>Zo/rm0#LHe@b.h +=TRGyE|K5ҹ b)R`X^7jFĥ[I %t.%"n#S Y80eQ (9?山~y{dV&lu(z3P9  C*npV؀3 +!`.+,~4e|{˸5{n Ҽf,k~5c8jID6, 924' L?oc2PJ"#ЄMLijEĺGeelB*'Uve0vȊCNGkΆI!1]R)AVcj{R(2.3Xu`7Swx[w3m{ 屒p{&m*KMmI2q!لi3M Mp ۏGYX{ҧ2sz fd9۪9wM\|9Åv +ιB 7XR#9&$Z +Z{9J< +m}p9m#\RUSkM]ɠ>?^'s:y_Hy]KcnЌ[gC) wGKj :3 K:K_\N7hGp#*ptĊ_0>6)lI'PS +]/Ha"m`Vu@S/#" +o8".H&ٷOtF5wG ÛyXWGj:.Q^eHɂlU3#܂娫UgC/YE;O1[w֓TV+YS̑"VѼ9 kI(6p$7I5X!Z4Nj5MGN9%kmpi3}2ޣY>!& g(!b{!2gXOs++&?PM~/Ha7|^RL?Ĩ,wle{/a+yS&" wɻѳb06U"K2^a7s1 (ˣAԑ:VyYElV J,?" gֳetY\<χIg)H,ZNyzzeSИp,*g),!-ٵitZ:6WDNKERyЋY2mϔHK31N] Qb&O 7pn"ąb2j@ 4.eZ :Z*h+-Q!J]o"(hHJtjD}o 5'qUoJ4[/ƧDLC"j(Q NIƥ"!xe!che&e|93;J$( DW9kULt&Hi"vX4ڎ$}":ͺߩD &~da(`/c/'țpE:kn/5 6z!OiMA΋d"peZQcH8ru?_17[ 0tDZH>?Gf0~BPq+8Fk7Nm+8Zq G * wu*}\m$rج\8$rWs$ryeLDE <+4 HQZ4%4aӳB:¾Йx\C>SxEvqlG0L V]}A#8w@J[{:z{?h8ó/HL-W.7ap?TlSH1I>|+ HjQxVYH\9~bӃI@`jʁ@/Sd[\9&8kcMP"<–otq2nXHs-|E xҠ' BFJҌ,98/n ܫTHY4wyw5,ҊW8y]?/; + ,)~lU$@'E$fjd!QtF 5wwmp0SgcZV7͑ ,nu|&MGLqt=p G/pǿ. x^vT:}}]\-VJ ]cdYHt 2υ4\I9D̑2[Z6u0H0ĠN-9;l .0<۬l46tw(ДUvC#0sujH5/jȑS$Ym#Q )BIAF^["AsK[zÑP*Gqdb@~k^rHbbAK{: !4&__aGXzoc@0ˢD򍜂-m။Q=w4R?cu- "bОqdNZ,L +j iLo/ǧ9go|6ǡk4&عQ}"l&R An?N `U&wӴz rO$*9}sK|L^H +vO|lB.ڳ)F A_9:<#4Ffy(&$~ (A +̝}AwKK ۉWLbƀ\4rq=+%Bv5*3LGZHɑEW꬜ +TesƊlv|UKtpmuOb|V$g?*h8TŵL\pf!y +gVǒ{9pI>cĨ:vrdAo?ZiyCr'sx5 چiˀa(.ߒ`rVXn)Gc۞b KH[@򏩫A6pC3q䝗Nh++񿑋N8;qJfa~a'veaJ:irЁ54`QZ$~8{NW歷δ?p֨o%q+>՛M/]#I"v3{5;/>FTAoShh._˸t_ĻQ>\?ݿT' QaJ/tX"tO\1$~>IZ7"r Au@CD1S>k('M\_LVC)jA L.)ǹUᬌ +z<،~8XXt˽eq954ʫ;L>T;rm_#{8%TSDI(5w|roDb؄85L/GcӀow +K ص9ىenJ>E@b!|*/2 @Bv󿰞SṞ}Qn%#$VK@oҚKąYVyۺuPUc}xÌVAw%ǐ e4$;-`. ܑg +#f`_,`Ț9" Ig 2(L:r)C,/7J#V UYu_ȃxa'U`]uʾUCO1rUvB8{=5mf.xp62E՘ܢ$- T|^0CX-J 7 ✄\S\#^,E5Xu5O):^pmhV6w'z}_K6t3}ӯGF;Hw8,tꦦfj&YPrj$pItk,h7O=MQ؉.MF5&9GFOHH5ɄvW7 谼.Xh$B*fP\rJ@8|>ϓy>ҕO#Ta763m֚gQګ$?MJVg|VߢI>A5rp *=:?NT| Oe +,^C+H)%&m$e +\2':a+PMZ$G$RfGPrB櫀[W|wQ #hN8YK,WC3,U1d]׈&7UX{:l H\`{S.+.P$t1m=EMqtV'5hČfGlڠj JiW.YJYmLF:.g@ZbhND4s] ΔW?8!Q3'b3n혉gIІF::<1Z\>\Yr` ;4jZmTTnd\HX$4w\O%)4c̍:ܜ 8+ sf^;o՟ԍ&Ä_;|O1$5_Q-V5w Z5٠2[9mk}}ڀeBϵ1'~/ DMu@1Dc׏XEOu:FVZ xljA݇ũּv|<2{SZvXҾb u[$e7i 39^vJ4ǏC6':wyG,f.}:w +.%}|Qń7w_CHo`7򽻀0R /x?kLYgGpɺ-x>ܽ|no_:̻4@nAW}]̡l.2ZJnGjVX'W*zX|lwYߍg+WuU i~4Y'C&8K}L)o^QAѢx]8Qs@Ve&Uƅ6C}uǤYLSătIU燥)xlG`ҕ8hXSJa^^䩤b0eZ]fPQXJ ^Ov'zF"<֝syL[:H˼*~/;Mk TzP\F* _ +-@ J(e%bv~u;yFb<}<`<='i}䊿.sWϴ'mNvd,is$~)mB$R>ϣRR>5e]`T68"cĴ,)]h}\EdϲCbc_Oy/sߊ%)ҁX@bo0$.-{)&ل{.|D3\zp9^K?ճh]RU;` $=] 4 g6(^cRI'Z>gQzJtͺe?A5iuXeLϥ*+K4 (Bg +27܈jIYk9#9Qa"2H1FuqUדNJuS.p ,ߦ} $YV `qM<.BlqX?.ETiR1z Tﵠ|>ϸa7Ml/2*I4[ PaĠrڤ'ӔɕI}I^<\d~xd%MvRs?9k u\ȞV|Tn]+X0Fa6) GO<4]wޘ]X癍}eQzopPwQF\af -I!VJBC8qY +a5m V!R*[)[ŌƸy%fej2_OY,Q?cxA&BV޸uEװf$Ad"%x E-O:~B!pu^LND Mmj] +ޡ;N⣅iFgH:Na_r_nf/v f) +|i Ӥ{,|@e* LRWf|H .nC,0 +O\F=_nA,ʿqj[B`" Ln"Y.FTykMOS$oQ+˥Osh:e{ILX?%>[Kl$*MN}38@TzJGc@׹nt(H?w25 3-2zC쨝D͸Œvw +܌ӷhɂ0bwfTр*`ZT łٙdH}B$X%@ĹH2MG\3G_ ߺm |mǿ$ڡ51)mi|D4'8& ß{~1r΍5]w=yb#DB e8׸; ֽL#ex3;-Vy0-jL$sFeVhf/r1,H<ˆey丏 !3H)YY6EOEB^ϴzo=V/ojiPf[j*>I@ZpWYFl|Vko{Tc B3 x@8XHGGh#2b~!@NE4Dm""@ ] +W$+$bNf&s dW۹xhf=#yEp| a*JL(mS +{D F +k 9>^`<)Knq/­8gV%7"!][o؊/=Z ™N(JkL)4IjGekq=ʀ+lJ?Ք敃K8 f + +M}Ɔx̚ +CI5Y*k KQPRj,I^Ilph+I#./3}L'2gB +~ȏ @ 0Bώr-Tq ,8P l"j с3J!nڍSC,13 &8@d(*BJ(d8@D@\\"Z" 5L!30~@1%_HG&?Ӄj`?ߖyyemSԉf{;=\ n`-T^ MN=xh[Cge(1.$$+4}dX)4 +ZX"^bRD<}biheC+Jib)0+rD~MUd=PQf@"oީw؇u@20ZEbn-#Bb}nAj (^އJTapPbpRA8zBM3q^KZWjT7Uĵ*.ͨtDl q0!8?ڐ3d 5XCH7􁳴qͨQfl}ⴅCҒ}~ҷ<{ˁ9Fy@$=20D6fu[tY3QDӮCDbxy'p0N hռ [Ȑ_U@$C"4bC=S-;FS(16 mE(ZVggS +򅘋Eʕ6KZDԽ镂.gDVJ>Z'T +´PV lx+ ]m6X_CIʫinsվ7#mݯOt!3W}W&ǔ]ElYTK(}EboiAK7LpT YƆ#B7E]_ yA$2x59m=2 / yLx|b2m~U0+ +"@Bz΄wqGg<`( g +1o;S;ھE|5iB{S0xSgPQ#]My8׹͵li;5.sn4)~[Zuo=̤o{+W=Ss1e? D2ޕƋ;t[ +7&.V鼡2Gx&ʫʬ ΁%Hl&07drd *k:FE;uY16ewk糃._=3LT5K"$,=^ʊ9^cq OJY4ja2ѹ6ʀU~Mb KNM֐P@Ư߻/| n,9C|D=^%[g*GP2ni@,@ C8e3ZU`PJG'{gvEZ7"Tn"nP|0ߠmZ"t?_>ޡ[ yxy%jS1ɵHpݡcĸ OTy̢Z-NLv(ud5sWaŊ/ xc?TSQ#4%v"N'4S#8l +A4\ ZO׃UJi퀌Τ+%FAO/0PTMZ|R7 +Ph{`ֻF>>&7e̋?,CFumGS̼IIdX&T*;Ot } U!^('u,ETjZb'̫_S"0N$kR],:gu7~4a@k +6 qnkyso-qQ~ $I_9'7L|oTc ˁV`slbY5 +CoVq+r#d}Fmz;HUi@nc~M XZ: +mx]^?kRT2BB+LqC9 `ȕbZ +IS"6V)ܯJ^L!:$f#S1_ۈ)rџxGߠ9fGd7Fh/DU$`@+KfD;tNyEa! *fkA.Jʟԫ1 I:#3WDGܲV5gl xn iRe±{j!x-r_^X F8"rfT6EgIȹ :g,0Io@fg*h]ECn ñJ2&JEgSu^HƕdEvքM _ݘC]`L5n{HcE6sX뗴ah]hrg?/ pMF~URF105T6Y}d5}P2$Å)YQk_Ok"S?.4G>; YRV*l[xhϨg(BJRʔry# B @  TCew<KLOIIឮ 'SBEg8(#r(Řš@^s@P\ "p+FpNp +. +.(.8 + `0 @NX{I$``$8  d @Zx`8 P@FpA $`H0 NpN04(" @8Pa`2ʒ,XۣmR:0_ă* 8/jQbf , ,@X 4HA + ĸ&)` 48 FUH-$F f%=ydA3l'1ώSej5߉S OY<1$"2 q*9H!*h:X(h0H,W(^aj8q*q77Q-*) '*F /Az: #hŶlB-b:&cr p>hSTH UχJ)Wh,[p#APuJy[6\ffY9$^d%[R"̩ 9[±|/0#Fbim^"H[TU|#LV醴1߉ +_]p(4E]A:&˿sON98gl~ lj3|NUŇ%GoJ(am84*E>~ 4E˩r"FEIgUk I%|"E3J殔 +/BHҧy{ I xOzWK ۺ(}!C܈<&S7բyk$Y܄ϐ%㢐9E&j%iHhI06U_m^xЗnsEVNeXkL|Sy$ůw!CUHPX9~=߬FV|B?]2Q6)[hbL|p מi[L]S|vih]S:)*y^] ќ"r_6y +* uvtgrO=fٌy|<(#F,{h + Q➄U&:K-:IU1D:cNTf1.uR{΃íȷDB`mש,:IS~{1xsRS֭ m;W+p_ MDфtV +TfhM ZN㽄|e[%6&);ZBt"t^K)\ rP-A^HѮ;A6K)jl"rъ|sSL}p1z=f? +I:G#PCa) +\,-zK%VY4'X&:;' +.!)+-ea9/K91t=fNTW +r"@}H(*#v%aMdQ۶bb bI#NbNx9X؋&X# ŽK]pSѨ#C I2-ﭥiTzӧd5;W"Ƀ8nX,"+'K2Q7J4eT1c:2UeX{$(|D_GRIunZ=*QB@gga.qU%XÈќEE$CxaBW}g8~?_(2~ﬨG=&9(b (STЪLjԊF&H\g9("ʌE/7HϢ< >Sx@>H"F[ zY3 +}!j*d4_?2w\(Ephd<泋rL/(=> +5sЕҖHhJ&!oJJ#ΐ|/>TZb55A2A$3DSB![FbHV4&:<37>.2 +ޑRWL!eHDE.E9. E,EYEE5C%.w,0EР:T`574鏉Й)~ŚLmVRg~4s@U3y};(OQ +?ʓrpbFYp8B$]Ȑ߇52*opŃ":5*Sz9C/s GkfH!Un%ff`p$.D!NUhMU#^ +Ş 5^TT ?5̭]45!Ś*y5D "hmܘB"CK*V(u"},fT;29N}Ć94E'Re,S"w$lN9-hfշ!?$E5|Ma0 gӆK +M>Kt־-%q‘GxSRjuDpa>XDkQRu` ߤ{0c2B +\.g)?uQ9F>M/gUhBE[Ehg`dXRn !r0L=5af{ 7aQ<¥rآA퐃#raC0Նc!PQJ "ӊ{<'~nvP;9"ۑG1m6eYuBM(B!6Eep% ~q8;sv$Bkh gXyaELtf&DPB6B)&1Lj;gּ(lwrMJH#!"S2Qڸ\6;X)0*v|8!@5]j\S=j4Eҩt2UC2u%t1aljcU 6p[uV-Z',V)ȩ0h7t̸VY9JtMX8HV3$*O_Cf]V.JPyi+{I(4OG^Y&2$Rš!s?K9!SIx&K?4S[g9H.#YŊPA/(%1,*Fk`E" +HʬqGRJpӡV.B}U<H剑I(2U\P ULU(n(%Br5QKXu? cEfӃ͉P1.:U+}ևN$䡛ؚ*B~@̽!|dNezP:rNSR_gΨH: V(k8c> tM2UQhTց%x+J1'dƒ;.զ'$ϐ(Kv9 +B=f4-I#j.E%F_8 Ϫx7o|>jE<9}!yž/n.e6x#OežX.帖Ԅ${_;NC$GS=DŽ`JdWX5YT*7W + ZdoyO F^!F!Z/oCA/\z΃C:YQM4#ڝLuJp[Fs0^G,:mu&V'xb +ggd/a' o8Xgh3q>&>6ܓy/aѨאc5" D|7(^0cr2"wɼbꢘ lN|R svJܟ.NwqkD[H%rJrVisռ^_Iq$F>C[WUrd*E6nXr!-UL'$9^AWqmQ>}'1#%T ЋqCׄՅt|d蒫(mds4{+{#-6 q80b!:TcsGz}yT>S!8]ieI"$gvleSjAxVvH+ƛ&U3Ոs"Cf'seUչJ()fIܦIxYpq2ō2>sS'RzmtIxMZ/&mc"a|?% 'S+1Fe~/>BTWth-=GbM>e'Gnwm\cBaq{gF"zyʭ꼹s?_\U酻p G"*D$'7*n񙒶*;kdfdfAMQ uUrb#8A>"7-jJ#\EjOEuvHhedIVZxGM7ØY,ڈaHZ7WߘZǫH;xWs/x׬VW[ W[8*M7BG:5|gyiLLTݲ"TN'nfb+zLo"%bHRG3QȏƇ;4ֶcUs zBa5QqRFTYHT0NyiwHEű~M"d0]EIDEY؊{*Ur&R|rԟ*ND&rZ oXR<4ZD8qR yKrtn!dbrYmj-$U^䜎p,vq20[N+G 4g62gk6(Sgy)~戾*gNY>"usMDFGtrvf +vh5J'm|*Kmҏ#א%臫F%rӕG΍J[ׯ.R2(郻p喤NHz?.A8G =5Q'H)XNAF 2^HdP|+ F\HXQ; + 8z s$GBW%hdΑo8ͫZCKЦ,f&*k.u|x^x^b2RɼEx_>.R' ˃BH셦ڱM֚VV!Q 71.t(ac}/͆_'=X;`+ A 79#f\>Hs~XU5ZWÆIJ9 3=hO+8# C‘f?ڼFݤ4 C2`(J[+qgBL Q[*, T嫡+j +ݼt78Y_^ⲔJȤ)KWuMIQg7 +k}O%ckHz`4&Ff"MgL=@:T]T=T%SR9}6]aێhW>UPWJZ9!-uo50=;QԂXUh؏Hcnv#/^ c-u%+ef!r;,^iw'x8k-1\dRT4z&*X S+YOX%OcQM +c= *&h%]N'Ys~Xlt@2#2"C|cĨ0՚aD4E#`#yђƲ;U8 c(NiIgb4v0Vu)"`9k3c::43cX/-[4:Z%l0V 6WiC]2kiIoh!4cl藋aueaŊ-a,gGk~RuWBN2J ag!>j5eZy+j1V슭Xa}k)X6pտ{gߎUql$Y.1wA]t+̒;mkyxSMkhF/3%Bw RP0si0tQt jnUX\'̛#߁JAdnJc^X.E ѳ`܊Q 3LqX`89cѡ uZN[]TUo +K2eLo=X"ce%rJ]YI(K c.Ӻ˶lZq;QcCQMZ گH|/Jj/Eo,s9_0?wI:̭CR6W酱nM֕)e"f X%xK3ATyjxAdkdrWXgkٞ[ce3yXZƥ.y~^,ӗ$/Vh@ҁ"+L4Լ} +/ Ɖ5 +uLr]Ը .(/yK$9ҿX< G_,86ehcA!C_ *@Xb+x{]' kU%^,Bd^,v6/֙rxA1ʋ%^]^J +8BrqjXkbMr˰Ƌ5>RvKPI>ECzS{QϤ*b?9Hgʫ"\Fʭ@&4*|`ٸV_+g얾XƜVB^ofk^_,6;@xǃlQTuz,, RC`| o4M;_DVŲPK\1@XqmlhPXQ_z mR z>\ ũZ/w(D΋t-CF*z~@EYHQXqCG/#ƣ)LRQXx0l`, C=Ƣܗ&` ec<-%zG}H]ePX +'0 +i>i-LƐ9'L^Bw.yL`KZ&ZžD2 O@Ku'uiІsC\G(So?E{A,r ,X@a!SwXTBJ61]%d/նE , lP?LL}*V~L;Et!XaKJ n9I#V$Q /X5*9.6B~ms͑~^M&"a/^/G@Xl&.p_,MCꋥCM%qq`_F&qT*p勥, oE| d~B>oM9/Vy4y_,!kl~~ќŲg|*C"%| +9*7X|˛0Qm +d(O0vuS*k@v*- +eV]- Zɠa"8k[ ݗ^6]zAa 8uGˈ4H]Ma4Eq1֬(n#ƲLp$Ƨ=hDE2n+r8cb3*1wc,sȝN XsHw!toxm&쎱-yA;j c +XZ|X+0cǡE<,w8ƺ2 }*y4ۈAsy7ƺ6?3cy$l"Rg G1,y|+[1G.`xw&9n cibz'`,jߤiHk0bmդ- Ɗwy$XyY?ЂPN>k(H)pX aÿ):l;ca;B4K<#Q\9ZñcquGEă^ʂdeS3f`,͘<G cW yFc,l+c>rq(RPoD62VX;X1i <|N %Գ BcQ6Z)}l s>ƢL>37q7Xy10kX| ⍱HqfXSboͨB`Iv[`(RSWtT&5Ntg»2 cvՋRSB*c_c"%E+/;K1{07BL:#l'XC{iP!(+41lRK”TR:P~ c*;cMPY|s^pss57U?>pvb:cPd\ƺS@ Rn}BXc5&1xi1մi?I7Rf?2ƒL`X?{fYf +#2Dy٪ 02&1_sXK*:X> +QPCUF5j$N"9dEqcf5Icq 5v}nb5OI !,$PxxHKY^\1VUE.  5"RYe!ze˔sl zxֲc?4.ፑcN\}6B2O.z.sꗒZdkO[#Td%D* >z9;^HXG+&&Ҧc瓶:Ɗ4fdַ=eO*w!ú+l^^/3_Ah,4>h Uù/X5D-KMx})s[ +fZƊ9o5?$ʭTX +KX!21k|￾LR0>6jC}jPöP'݂lDlEu{a?֕c_OtzQ=f4 Xۡ)֟r +er6bVM~{(z:"(ƺ-ߦQaԹbuscU&hIb{kĠhGF+g,#āOdXpF{' Yĝ=|ڄ$e:i >%/ƺ8hpAaTg\0ƪQ;k][+Z{\m,ޯmmV(Cz^7Ô"/74%pݭaƪdÍT=%"هA*O)\vZ;#H%.!5VEX! +Xb"BT&s6VFIWsn6֡}ZEЃGhc ߃2 F!n, /u *a↗2!u\;n f7t- hi6RQCEX2s6szkПڭfLz5#-S]2Z kI[t׍a]m!эEHX8΅ŒonN@HK-KXIEC&rpcE-Xwc%L8g׍N?< LL$NXkނCAu8,tcu"VȍU0P 5sc,3E$ tc9Yrˏ5`mfc){%X-β _3;R٧ۗ_'R񿕍 <5ecQ+kPcah= J:#tYcm*uJpU-ːsRqb1 C|yKIpsX060UcUEMi,8$?;e=,'Ϯ43aCb _4 a17jUI(EXET[6'& ݖn92}V"3 lbA Igc-MaHH/\c"#NOb/{Kv "S]l, Tvz/BR"E4_o&sX2nD(&h H|f*5ov=0o=MY8X"H+g-L)؈-dbzkE~m>+V6i_xǩyc5Q؞6o,q8yl,fk!SN8V{ApwYxf\oǪz4  Dp,\RE.o`d̢KX4ᯭa=2OWR,?Lfd2ף‰cp :H|ZJC<73ıL0`[qg@Pt+p,"k [9ű6i&2p9d`M7q3q'BOR@[cX63X2%SX2AEpi?;n /ދ.Oehdq?lqłM)*.ᙕ\X|^3\ 74@{w}ڄsFortluw?ޯ` g?yoP{!9O!HX-T)yc&bW1ke(zF Z>gcV6̸ 3>DmcFN@bY[C=jŸ5<90NbTUX[zlPcvФ >sJOv]Y{K Jb Fw/n$U~ a(A,tlm]z"|QrM*ܕĭ8]uw!\F;UH_Z}:Dp~?[WmVK EaE#0lXj_"e-;Ek?qEnR5zhbhחP :0u6@ XFerħtIo?uAC-\h,9jd1+:z׭~]ϲv[%2X[ ֠H / g, m59 ǜ MW% NAFwſ،~G. +hkp>mY* 61w'E|("2M*:~[E3sd6MkmA ljRn\C .f +w 73EWP"5#H;>$T0P~РPVpPjPϞm-'o xM*n(xр6`HS@EZ_۹Ո(R(0CT$}㝦*;/tMǂl|pb鱛IRWeDiK/5~uh.8dD892Vo{,N%J[ +"ֶg'ĺ<݋9ƕNo2z=:5sAK- v:=WI{Ik@Vg.EEb4,^5@X`47U^G"I$ilyC(={fC_M`{7C/RZXY●zF!VE +WdRK56s~ 8q%VOE9*u#v0X@jz[FR ARv1 +1m!~rҳ3rNL)"B(6 ^9A[|lFyVF{˰T#gQQ(` +N,ӬV Q<_#Pkˠ=\.1t7G6 +@Fd*[Uu-P^ MHwGLgb~}cIFޤ*+|eBc .- X.pn"*34? YTA(I6!4A i; uQ4,  ;Zi <;ٖ_>#̬Rr%j)\s1@G(|qUՙCr"eˁ{٠r7}Pv^R!_ ]?)]`_dVV1G>wqϝlUdDo~qIR=;/S-u0Bk,/15*D@l܉`1+_" @v„xj{>a?oGor$EP P )+Vt-T"J:FQ8)+GH]rCIݿjiZF{I ö Sm\pXJ\Q|9)q:};+6˚297Sl4mtoυ5m6SʄJ&``b)$0?q=RX\;Ϋ{5r)wT,T~'Ro.cJ oQ(uZ'+cVJ63{vs +ұ ORT$Yg0flOnm3u\HR<\QJX5 Ngq-fq*wKoU\#Uw/#HZےA!26 ^`̈́ثsq*Vщ;]d76`s\yPo1GjS +)JX}@*`[W>:g {f $q'Lη?6с1orvZN/pxnBIc6̾W;Qr%T>rc!v/_0 J47n3^3`31f#H[B06"ڠ%-e\0kd])Mlåiil?C} +SOqV~eԊ{ D7OGfi&}.uk\4+SH) Q9MB4'1BŇ~sIaBX{q x8J SPHZa&ݡ``!w4A=$Oz +2PxբwmB0aEdӬ*RmZ)5n[P KA3u(RjW٨Vɠ%e,Q~`RZ߂ʈW2ӌIv!Yb\vPX=PDP:^%=hz,>' +qAx2} +IMS.G_|/T~-S5 y2ݮ=Ţܡ~2v*ێ9˾(pŚ/˧`"(`lX +KC(/1/z1]9AvrEE@8~5T_Cz{ 0 _ 7@;{9όp,{|DuR]y1sb6n/_ؖIJgiZޙz?[:x,賢|*'Mŧ'@V Ta j|@t^X:ك^d@O0Ѫ\>b ~/v%鷟c2pL Vy#&h[n[`Dki¤p,q`uQs&߾n<^aA9-p dE,q"n0 $RUDM=W:Ub}Ts5}-xn,'u1xi^B\BX!B!?"“{6̀"[Z;b\XUq"=T-BA7$CЕ$5I*bW56kU&I֯;&oU0h5)Em@e9Ա1M6I}jԝ0BRa ^C,sdlܻ!G)JF 5AJ&b'`%thiHφA4_AMW7ݥdK)RS7Ap[EG#:P_rJ~A!\釠?i}? eK)ʺ$ޝ\sV$>iorKsQ:7\KLt)9œơ}Ru49&) +bmO3S"Q +=-I05܉.;ew+W8 +Tlcwi_+*, sv k$knyK9g~˝wr|Jc 1lYGTkpuEp7-.m`"dԷEMhEFa2} jHtQ4BROXr$G+Q5xoER v +S5E-M9t~.wW˪ʹk;Hh( V. M)箉KgpU|ꋑӯ,@8N/2b8>Ɓe8e 5Vx[L '`Ʃ_V&3 +}N"n|r +UѮo}A.ډǾ1k1 $,iyBib%ŒUŠ6lqZ l~+Ɖ!Mvۊ_ v'N$yZX#W5G ƈf+h:tFm +!abZg [U"$.LkENUOꢱ{2KN@3O}I䈬r^Pfx +*cE@q C_u,>JׇzRݘl_jw "f<={(LR.K4prP7P@Gf ܵ@t:*>gRY#6br +~+ A]هd1GP"CQIR(D!o>ߣ7x&pTY=(an$ @DiC< +3"TmyX$X[GFGW$QE5!|M̨LtÜŃ9lœS-1NűDuJx}旙Irrra!]3NAQHf=|ňeBXʭE b`+X1./b8!P`BoY{7]Y1fx_42w'E6UG`?4q'Vq/Y# +(Yal5!3SB-5݌"#ձ/Ixicsق.y7fDX_jl<7<@ۣuْa)XW!@^[ =JQF=aq8+#6Zu;N'\ ;,ŸцzoIv,q5*LGRy1s 1/ U*rW[7ܻ q99[[vd?P %ND*+Tv8nCێuܭq,E2eaeA;=;Qcl.ܛkޙO!̃ Gm#ctMH TKccxGuT[)Jdh?E'\! Iqdr#|I]% +p..cSe#L7 +QV=n1|G(uگ0Eh3NDN&.0JXs%)TNb6!+ak ?(5Zg(KAxѤ%ܾUYVX&c޷{&سN5 Dy*HF3s ̒@Ž64Zq=J\| u ͣyt- (}PdR0*մ'͆JgAݵ9 lxlDb8S<5Im˝ ^phٮFŔ(Zy@/= imh.-Fee(U”(8iVR dxl:O; 3>R’aſMQ}V^zC|79@9Th6 F.񐨪gW|rMM|X.Uz q6 \Ec>!I&{YGW8 ! +dK~r:&K +Im`rG(,P"uÊw]{<[6ie?;L9%VP1S3njID<wj= }R1YK:rևMzU4ĚXES1C:i[_g*Zid2`ȰhzۖXM73> W\z$ J5& wZ rgg$y0{<9Iw>90*]qOMnipfZG]D`WR/ `O2tKY30+"'ԃ8'Al)UcF_*gJ$X;^FUrS,?bZ1b芳 w?*̬0CK%ixv)a2* Vђc +~EO*[ki6YE؟Zˎ.X0x_X:j6B| +  -MOWa* \J+{2AKɠYgxD.JA*dN-nHJ iC5% _z[q:Xy1f*M +N'B +o7҈\6wJ:5j;.;W;@72? ۩`X<`Xim_`hPi$x~M^RNvW5Дzm+0Dd=Qy#Bo+ zZ9YH辌pIHe[k'$Vp0zlI Si#5xWOFfWXUH)Ն1W2g ;B5ܫūs%TзiG͉n10DC(w`+C  H@H4ƫtr%) ]NW_@ DUQa&ėWa&?U֋ۯmO*>V8"\W?y%%FKP#ɄJ̳R`ptFWVHh#/IjR)pq M@Sxvy3NQ,dDDOڭ[g1UOPutqFk|LG& Ȼޓc /Tؐ6+.fUa%=sKCqL>WWJc&hkV0vsE8UXTLȵpxZH`[NTKEay~()>Yr;Vqpq+-eEAш@$&vla5*:wSU^e|߸e*J/nϸY +W" oJH7y tǹkfpx\;eaq鹙6 9Kb";&xYUQ"De+ $Qّ|}r\ɺ}5vfvT&btlTL?g>.s*MayM7T/نYΪ0Y:g1Ru :`Iÿ]^PBwVP b-oqQ\{JU".]Fr;$[0VǝdX_soT +P@iQjLf/"@g3*%,"*ZZI^b|k@rLPF F ݃q$BHT4B/aL%C(q,ዕz=*Լ[7h5Ք`ʛB@ ixVƔ~$CEn’K< щjsKF'вk E,Q_IQB!;KXq?; [; >ll{E.VKi`J *XF@ }Jpxﺜ7ќZ[NU6!vsl:=wyN&cNqBI&[]fl GGt8KDzf|i݊i׽\_F2ufߣތ,{b WyRUM M GCVTPu,h +;d4K$`P>)fgPKͫLpTJtxj+ɬ|]mS>BYT޵ڋXMq^h8 +Ce[od.N,k(V7BҸ 2ևI}J܇k(7(R9$e_83`C,Ril1@'HhWA byD2Fu!1IM#ZG%_Me[UZWH &HФ n..q3276 +l2:=ân$9Qv)mV@UvZ~HX,A{N;1˜egc萀s!QÌmcsYѬ6wG\:T'=03qt4w*!fVjXWԪy.XvFC)x<Nbo/UAtNJUV6F78 7:/P byY +R(d<_; F#6C @M.SW81q>j1lV jYR|=(Ԥabx1[F cDT!@E8uIAnX~& FAK1c3.ޝgT݋ADUӻvq 8F@b_lQ5θhLT6%kiHr _K}ђu' vb4݇#%&,\j,v̴1C 5&ze^m9`#f6( 5Lf38EVO2U!L{5d:h`9'P(U!)rfzLIkx[0v,,9j,А\\1ظILE@)IPk/K[$ZEϥr]l>r)ιkSP/ @+:- akIC }M z^$9 +1n0%)G戉_:hC,ºq. :ZKdZq,Mנ)tEdyCdiExug_xHsz~QFLinұHfl)Q٩Śk#Qd74?XeR;Wn=mv~ &v$|t\E}:!9XP*/ߣ_ f9}{yG*avtYN0g1kcT5JMCKDE(mdTh~s}aD˽ؘC/=r3&rtI).FbI[ @ _=%V`o^U/ŀ-g.GX:E&*t`çA]3p7QR9Ys + +oFw,x +@ƛ2u{Q\5p*9BhkLpBm}yV]ILdL<3\0| LSb" uackaX\A-gT"Y7.˧ +f1TNԆ%mtRAPQ>h~<憁-Xn?7W=d\g 2T([ m8(Et^l\scD5|D8ך1>0s6)I9uV}F +ĕBIkmNP꽟 DJOS/s3FgbF5pPV?xk1Zk2@`DIǂPkIQܠ/&5 .& 2*DN7 o&27aZsrT#((%#;`$5#FwڲQ' );1@{gRpUͧ_MD"]2*&sj -}yY}Pؗӄ!%Mjr' u3zFejo}5vsIe%.GnPR?27aDuǽڗ~(݊ 4J#-i1oOR]XR2K|#f,w!g '1]uM?ʯ#FCy+Hڻw"#jHQ~{2M[cph ++_P g#{_[ +_.@m> 4nokИ~3xH?Ų y*nέ`XtN6'VDؼx^ˑ@^lrgeSnÉ[ҌM[4ev5P1Τ_rs7Y L/r\ѿ+9k|~P EүyaގMc D7`!ܭ +"e:ɴ#ʾ:fPN !!62+RB/eCӭ$=vmZ&WZv]4K\J9J*Rr+A&r{!*BqB-Dfl*DhDa:2aes,(졖_m!V sQ xØ-b+1h©6AC(l + +C}:uטzx0MkV _,YT.DXIA0>%a!Dm-rφbHcÐnY vЗ6Tu^u9~XJ +S> :\j_X-pa0Fa\NK_LU2|"ra'1Ni5L +T߬y |=Psà ʕ̰ +s p| oV`*r`VU+NWx9ӗ0l%YwLFG^0ДŚ*ha CůKBQ ʝG@UC\T,=n)~ Ҕ6,o>:}!ľ6Sԧن ga?@|pwV@z$\Bn)Z12v<%Y83gx g @PT $\8dtbԔ?V E_{aD!@nE-BѾ#R° +LD,[0:x'06gu To+i,L ` Ճ1}F`!kjNI~_rW?P +81ZriK )W;^xhʒZ2+) #lQ5XGyl3Cɚ1g'1=49&VpBȈ-G*jb bdTInHhx:< [sy&&FY]lkJ:¤BvE„(V&3Agi`4X Z@fZ@**&b2a3,YtoODjEm$#0qN  P q3JT:_pͯX!0y*H`8 8$RU)ay%3Jؒ ЫqH2,!aBa"݄8 8cOFQA7B}l] TlH*"@}ͯ4%uf&R\T5A Vc}>ZKIL <|.j=ua!1x՗Г\w@8wh3DTw&U 脩EgCD֙381mSP,B31qDXE +s+kk))CIdޒF.,Qۼ@ %~[ +0P8 PHx~4V%BeH!b.^z0w0$xE1uQ F v'ˑK@! ]ztU.g%\%/Xią>j Jb,QU>,#hX$)[Luk=rIjRZB*!dJLB:ƨ+KgdW`XEKR0pvc+, +I' +0rȭ0|S$ubWWR<˪~F.n!\TH\( +BJ9Aep$rgraJؕtqrR"ro(w7) "c:~X +ԃPE/mH0nj%3#O c$9|VW|+1yqϼ{TB!Ƌ,$<\s:AwId3V=M+Y3 \j_[d`+ߡipV7NQn0 UVr, -D|t h:ˉ*ʳ",9Wq-fOn`#.2sL2I]2p4;d"[dcfyTb©vHb݄aJ&L܆6#_R[bh!2)$loD{ہ8k.Y4ZGV8VS7Zk;چ`O7e/b u8Qs"rBGg '('Qj)B]Dq,/Bw4N 3ԊR&sVA7i~5My;ܜЬ`j|`wZÜJ9XMvZto9419VhrkUNTn>stream +# י1.5zմogL)oϹp$qd8;>%Y46_x%3+ tjE\F(wx7<cԁ;* GGRoI.DlJ +*1qoF +;=#ŀEJvlOUt# C>囀$HtH&aԄћ¯Yn#]J"hoA9 FEyșPxgH12e,X#6 cg Q'Z&I}-62t@!0xR:-LZPTzrKկ,wa򸎕$7 鑤NO-^ 8vaO V%pq42$х:p/NL 6' {4RRz챝|:LJk, Xa/_93xE.-51'Uq¦& 8Cq\H'p0GhH67|Tdl pS!&x.m_ϰ=` + +xmyo 8IiG' "p*5Oȴ&C`6L\ZhQ0ш:Bc8zF (K|x(J?@}@@O'_㊅އŒ#$ҕ%)`18\;"0@/xF +jJ*nHgdry濔P [z3X@@HD@EeA!E73h؛!u)]l9ƥNaBu`kkb!kp0gSte`{W.c}/51ej7C)y)LեxS^vB5ݦF{y +G[YdB<"U +RZCw%)-o[Dۇ\KXwi2@M fF}됢1|9Kfi>Z4cXj}*b + 8u8 Qe:δrX# +n'9U<%(QZwkHuXeVt4qE>W5z +͒u#$`F>a7]܆iH_<;If{.4Pzc8WR6`PV,uWʎ]ai2Ƕݏ%8#Ļ)V=zx%Eƈ5 \Ma@lo_"3(}qeP5]`^F/;8: 0:xm-m$z"r(OZax)6 Dl/>1o>4spȋ->^҇Hti#0}[ӘB2R+m['{WŎGWVldf]RUq"qłuB%<|yA +SSb#SiO!s4AbbSٱZcW CϲU5]2QQZ$C1L f2߁萞 hMb!PI#F1Q$ 68=b $!s!}\Uct0 ey9m*Nlu6s}kTZj8 jz@J'cQ^{86@d¾íSJ)< ɛhAC]Kw`8( +"4hx5K`Y3hTek< 1+Ϋ(èǣ 'ݤkRIVD@:LVQ$Y ~vA3Ɗ2B2 +H\,EtcNC!ДWנP$>^e<0DH\)q9lOm|qPa]-N'Bq} Ҙ;ꝷY=@,.Qmkϕ5;FeZ!#f]׋l֎u"TBݚwRPCO:1E3hs\xBojd}@:Nj_ bz;bXa&Ȣ5ULWEc{}{2bM|wps]P˰ZN^|Z %wI*/"c߂dEX fD |3(*1L6.sUYUD=ުqutxby tmPUjf%tI;ƄS̕Et*lW?S, \R‚?cK%EeČ%J]NJ, ˾fDHnY=PӰX.S`] l#'Bʆs .ֲg%'a1z}Ež!`7‘\t'F& HƼ"S؎aZ%uΊu6߹ 3$ӥ#ȍ?>DsH3RtǑ2.@m=V\D3 ZZAVkf dwj v+ƪy[䱁ւr,=ۯ󊙃\@RK%N/LXx׽6sNJvN|ziys:P4ESb.J–Nyhqt->4R+91g*25X7D}S M{ + #.JH靍  &/G&wʙh+*sh@ZPJ[F1OOlq0 |$álq\9Dd544J 9Zk+uN hDŦy_p8!O`M׭E&uqO-뜏*ChPc +wsbrxQ< cқOjeFKm7Y{lyAlQ=b=KNfÏO#5H +,;#!h|֞BQ2G/ZkGIQV'kVWQ~  McJ>ϕ`XԜ9_تkuIrK+s3'3,ȥ ?6HW[)ڟ+"n;ܿ*Ff,ݰ& BФg)ぬ:Y}0s1|OQ^::vQ,oE0Ʒp,ROko!x jf%[UxZVo`qL<ik+aQ*3D+PVԦöEP$Ε_x߻~fU.ɫVWIM8)ZXN@?M3$2r4Zf|q^2Wg.O~DuG@RC? #>Z&Ȳ1%9(VO=25+!:d:_”#FfHcNW21ћ(iBI/&Et?4'OP +>%bF ]kFJ ‹D+p{Ƅ8@=L_x.7w~?ٺ)L&IQn!\Ug\JTrpq$7$ d"IT.Auɒ>,jtrX|#f5a5~,׷R)*&"߈:Y0Έ7 yrWH=UQ#!b6@DZeW)Ā%nx"4I|ބ`ES3:u}՝DYwBs݁ js6}7^sDd2Û(F'Jw 'j=L:c$&yCx&6 o xn&l,#Lw,XZ;U'ѯUUtzTag41U]ИSuGձ71n.dhp߅fA:zz>y[3@wCǛu&?ܭB9].4NB$8@I`uO?N*Z'mvV@[c\sѡ;;AY"_Vo8:?m +iG)U=5.ʚ,n0qor  ?{e5lSh8x7.+DĀf]@" dr}*CCW"MQe $ 9na8P,. D Բ<1PQT"f%x)qHY&KQ9$n[CB99*.췗"iQ ɪQ6Qg?1#%ӘDc8I-bSe,vcrE9XT^JuJ k"cODIt}; K}Su՚!kBd̤X)U{ +YPekS:Vv\2e=[j g=QgŕHu[nLr*3ϴKMCw%:C՚Lq%uJEJ7#?՞C 5L5<kWUPO 9j &Y$G Dd\~QZa-8y(R""5_螄Wn'&m%3!HO/du 9^FY2R2 %LffSM2>s&γSOqӸA~-ԬJyFgL2N=Zٽx=t$^j)VDhi*#㮪)LɧD2u]P+h!_!Ӝr %2d$D<-gղ!#F?v׻ PU'}, +ȏtfDW!ރL,Q {WKB";*VԢz(.ӈDZ.4L)'% +U$8:4҉OCz+6-4 ܐ5ևWopQ4}D)#QꏰR:!1z"\OʋS2d) 7|T3l=Ղ.>.r=jO<UŅ}_ !?k㍈A3{5Y%qŵIb"٠v.,ƹ.3iQDjrc|4) +zђS&V>%!Ty6BqIi +mV͜Dz|T>ѭ8bl!%}(dp?eN1"T2ߌI XdF!YBY3fjEQ4LENyq1&hhf W%$Zs buLl3m&֩P"#w^YEHtfPZFltD"-DMP`Yxbo1VD R(!O\BD(UթNb[Dk8ќrn)eZiy<OPvU+bq`_{%7nLNĽ714)ƙLy'eb^s[􈍴9_8&lNቪVE 322AF&0>+iUAR_n,E +)H [y麨#yp(k~!HL%BNBmf]x[)ك!{\=zCp2RF7$441ZЈ$itˣhso9F+J8IHl]h/Wcn&:8bIbCBAiDY2*6--]f1-=%XX: s[B]dKĥeZ"y;)ѩbϐbi̎L>O ߋ0*X: ;3"j|ֹ")gkVEOy>D4YCV#KkӉ j9:E2,$>QT˘*<ڊiRJ7.&(i>JG,T)ɣߩD9N\UΕ-u }AVjyF V# rZ +}Q_"=T,&$Y_0`#H N;X4aiŽhq$U!':G+>* mipI:X,tyJvsTƨ(˲ѓIJ9qTȖK't2qA-7òz{l &tSi1׳0"Y$UE+3*U(gFVҐ2 9Q* Rڰ13n֛IE=1d1=+r]-fL|`b.]E-Sb2Q"쿋R5ZQE-[.ʔRKrpDe,AٌE@& iIQnKM4Q:(u-d;ɲo)5qR4,o̓>9'dBFQzD_J:)Njq/hxƪ죜7D3JqlDP;P Q1MSFQCyQ65چܱ.QOw'(ױ1V[5lH0*7.7.(|"('F7tr]T:^ɈTѭJU$2+ns:b49K6O$ h`hBXv$$zd;%xE+ QEr&5"\1KCar)jXDNe6RD^]GGAM38z*wgjOELM&HY%G5Zr^d(dAsio-\Tbz2gD}F-RqU #ʺRq<28,)Ec'ȈI,رN'ĔGP+~D88(qssVZiK%CX5^W +GfHh4DaLffl])Q~=+"KZ7B#YH#5[Eh _4"#KN$JV{,LBBB b +&i2]NZm~l“n] L͊ EjDN47vc`G\D9%S +^`WӓuGuKJ}&2qhfvξOB~g_ʴ 5΂Z3o+I8~2lE%ĝm4́=%hB%NI*[|ͅ: OX6et8Y9O&Ho99Suь \U<ȕZIǣ.-yJ;ek7XtqpHz rp䴊r|JibD.mUYC6U\3CD+q*|P(8P f1(Pe@ ^@!O8 th D@'|BŤ*{kH n^Q} wvB :a + +:LF@9 +,INЫ'NPb' n@0ߺ +\|  5$>jJ"MB& +?fBedrL` a (@I쉉l [#ZBpQPȃ9`  +W5@W 5WxP`;4[@% @y0$ +$J!ܶ_-*dJ %L@K‘J"G(A&!$8}*C@bi&a /<<3I0_(˘S ++K #ZL隄ICIP &]%,Sdf_"1A,LB&Jʗ#-u'Vڠ.05Ix " ;8(F 'EF"aE.$q  AHGx2CaGp#Ybȵ ^}G#@D#dK͠aF85y5FJ:h 5NgN!cA~Dd9-&!#*u)Xn`1 (1F*IHԹI)#jKV0F(JU6ȱ%1lNy@Z7-yف7D!F )C KN1m سi2R:"RգR!#D M ފdeW-aCʦ/B#Ud ƯEp%PE$a@u)#qAEpQOE +M+ HҴ5 h r`G}+*Ɠk%cEU!X`"pBa 4oV >6ՌܢXyd^e0BN",BRE#EP!H=v6iW˦y,:D08A!T;˺MaE3,UL 1 pMex$vD^Z!л(Vg!x6u{EગZQE`yNe!Pdw_ +!UrBB)!͋D %T6²?d tw WXЫ fF%:, -K'g@jjh:WU!5 h`BG ^ \Т ~Ѓ@) 4pA9D òJ%W zlP0܃q=`=@_=H{zPD]ʒ A⿃;T˩D\g`DƃC&ă C0"<vҸ!i;TxXd1'2< ᨃi:PH;XPCY20H]L攵\ A' +RTD .8q02 Q֧088@ DETF#DN`!Xg 8/y(8AA!\3 :b!hzA0[eJ J!EEzqǧ Al`*"c@a`$hb a|apL$:` fR,0P 0H0 l l@ TlQ)<7.vd0.I,_AW qႢ""ؘ[--HШX nY5"~ӫ 0U.vcJQ> WHp + +ZΈ |\*ȲRU&".UPR9,I:` Tb< Tf +ZeTlR D0Y<֘@"w@B4nRJ\#!Q + u~(Dq,R Ь8Y!RACs 9И84EB`5BM)QZ7"XyFCEꡠw(R]e:CA^P  C +z(h`! +" +T +daDP5)j>@$p[q y( +` EP9! +0@9 +?1Ud 5]>9\nmC "PPP +>Ԃ*GkA~A VDiKF%) aw3 +7 r@ ֢1yQn ( +Rs$|"ݩy]w Ү03 T'2NvJrRM'1A >#qDE7nAь- `6A\SMe` J  ԉP؄tt~"-P xseV~ lz o^EMcP7ZMM׫[+'u 8BDv^&?)1#I0Qf^ E%A}in3${ӌW\"q ( 8bvVFH+w,9xynFt"MnqpBqfE6!jmuZhXZF ANh/ud-JFmzEbBM-JE\"nDey1ffISD }p(`v5o+=uo/eTf0\N&[O!䒼{P B0;%Qu(hh$  ؓdZz1V44A@n܇f^O'_ȈFĖaP@ ؗd4o ,u|.bOݪ?;~?03~ɌA@N}aN^>2Sk>%ˡ4r +Ȇ<<v_tf6)\v3>=> "!̃FY&=@fMܭ ċ3 +p{kEI7Rph ^]:`U~ss`5CrA֐෰ˁ" <_`)u4[ٷ_&9 On}8uYmIM 6D@6|VQf- )5B8`Вyos,/S| DE5r'/@VRR2έ|SQݭƪt^O ,J=f.O(yue \f/ӓZ7\ +DքZ`]*,(&ֲLdT@ e`s$3M;{w@J[HE#Ec L >t(8H`a8c h|! SY0У%0wl?o}YhT +>R(KJ]52$S~(z"lTG[ '4 +K@[`D<Ϭ0Tg{-AZF{J bt~-g+%J_ 4q!Zx"ZM qHT +ӳJ9͔(A2ZEC,x-:䌿kQ]8$’:Qy-v{9Ɍs,k_x*W)(lqAWs`̃y-Zx(x:젮wtptUz`Ѳ<1FAM3^母QVJZ$m#˽SNXǹ !ya +Tϵ&E"]q,%gTk OJxg-nf FR♌2$E&k&<;)=2:BZ=|cϫV5s0]ڀvu+ڲh@ŌE-- $u7Cz +b0z-d@g\+ױ[5W34e- a?HʳP Be'51)*bd7 jd5kۗ(3?յ@AִXkvJ- +(RZ l{ϭǻjn>W5RͰFkU-'x-e AZVrAioZ9,A1u+ zIBI{{-~T((sgp 9Ufb\wKDSգzTMYOb2%HVB, ک L\EM%Sf첑nuwy l'3)x`GX!X?H|V@zAڽ,F('V, 6T H[p{bϣ3ψ3ñ0$md4c@! B<SĨ\rX`THm_X2㇗p|t:rXeғyCgbNrty;Iiͫk68wԪ.9Kex |!0yX( +m+zd9(pm'h2Z~_@DR_xq'(UY3H`I @X@t9@|l J,K)P,p刀bj*5X4gQZv~1G5t nDEq϶$b{bSad'KvN) \X.?EP (Wxq$?i6bZ[!fqX5'Ixpj >-RagUtP{>T]jɲR_7ܼUi2fPM=E8t۶)( =bΥR0'В؛t wȻ%~I' rMग़6ϝQ T.80,&qIBgQH) ]L _@ZwLZxҳ.T @2 %($InKH͂@ Dlǫ#K z{N-g#O#0A1[?&0Hk"p9QAKu_*_Jv1S2h/T`.X +;Xss Y F:G@q[ F`k'h IJuuạ&g`0\͵;2Y~sH7'r7 ORS7SW"iYW5!xx.(V@ѹ^P$lgukj(xvUtG ~ uP22)A(|eUT;MJ\p<yC'yz\5 0?'Jit6O 6fZJN0j +%p.4*pT 0mB(#g@k 3z$N4_뚱?T:wz&BWIJ0 ߽ h`C^YunP\.`Kܕ["4 D~-*Eof㺳Ը6,P x ßraEk$}|nRZD@kv}-[b`/*gT'4.:L6S|c2X#}+$^N0)t^QlF'{nj2]Xy!i`/9`qE!@ݏrڗlNlP?td;t#B׸8>|.tYe[utb Px*'at8[ $gmޠU:Hj{4P,4@oz,r&p* +b 8 ΕkbH}ՄѿpX;w4_%4)cj: p[ se<@ti_ +ֈ"6aYAzCM|6H[_)^y8D䃉N9<ۮJX,q߮j@w V,pWE{xJTƽ([n[9Ha+}CybX+<+Fjb!:zj/ _Ml8TCJ5Wͣ₡^&AVzsģ @_<b@K-<$d]A^ȸSH P'-59ߜXE'fG x1;rDG Q  @CZT+lXQF ٨+J&=̨ t p\ݰkF=Ba *@iJn1t+x(tٖG!@A"0U?5(-v y:P J<*@?;81uNC$*@b")Vn8:+&xL$PϨj:|OXhՊjI9GxÙ߸S4 +%R! o'?OJ*R,d9CB>S#*9@egTH|;0*Y-`Vh<ıZ@|?oqjn%20dEA C mZP +ӂVR:8U8b4'+[8:]E5i /EJUVmV+)H. gLϹ/Xj/%n*o)R!0iUCxL(TjnȞ, C5X8MShƵu%1R̄`Aɂ!VA(c$*c$:`,:.!١lK`~=b2l}Id>ZGbЀ#<KPt~͗.#tu`fsp |=u wo~tJwkA!Xpq|T`EQ|/-4 MhRQH AGD +kDjVfucI98~ś.L64pGG1WL:@"lj\B'=$P#)T p![ 9l 4epM$pfk@ ",Õ$L2uRH"E'`̣ޮ/{kBZMH^!&}pGVJ^9('#6&(QW· 'G/}&(E'Mr&@zLsz=.*%/^:ƫ$ +>3;_˚ ?Ld9ފ#m*ʱ hE/AqmWd]B_;J Ф.Fxp#-yuT`4xC*'u&n{)DoHe`,$%ÿC` 1_L On;ZkTW"R,3A4@ƽP3]oe+ V=_;j݁  ?G2uzOp ކ6IS$qWl,h>_,,\uv{+KV) 27_/n][B߉h!mPT2+J:Ϳ::̃EލF903G˒("g_r> J7whfǢL5]&|= w ɕ苯 zWoWeevv?|bY4 ~=ێנ +F%KkӪ\Tz}zuO~DR'3&Z>ETev}1I147XL&odXIEOJ5ե?!KDǵ*S+-P9@~0@=^@"""#HÂ7"XIj~P_Y2 +_svoDOe_2)¢GL|rC[IZ)8F"4%[lpaE`ϙg57+~>EBjvg žIvs˜;/"o ?: 46fܦ _B-6Rs1-@D|}VmB[; 0kij0*$]Pg$g? /p$QTG $ ɹI6w ɒT I[ldb&/~92$kH/Tu6 o̎hEo8'rocEv~Qr>o6!fo?Bb -Ӧȷyznw_J2:4Q(k?J3FIS+achfAa~4F@ +@N/wDBdoW~UmkMRV8n$RbC{R= LDV5y'sΟaۧxe +*Ps*m2_1`r)vZϘiȕlx ?[odҴǚVrPo7 cL`%B}&5?Wⵡ3Hk秶Cފk@yjv P7\RDWXN;eT>ٶ} ;mRO BNsy{t "aYd[P,X߀g|#ѣH]A7])f ,дȶH/ w)k :?EPs< r2ǠF Am~y:tj|y=;S,?UQgg7о?U%W;OFn,18oͲDCv~5\{'CU/MD>4q.o tϏͪ0w~N_ ξry +%z/XZn3\Ȩ_èHZ߄kuaZ' HKAOοNb?O2XGs +Kw2йo}`hiUtDKQw 䝟Y1y8b*:;%lBKmMpn0x~]bmod=X;T}?,S_1|FέK]w~G*>d9Ḃ]G9vDgtbӼOAS]hyj:C3 ?j?I"aաr2Lv9mAo>sǢ$/~c~/?EBχDS՜)Ppq#Q._f Gdp3'(B6dA/0\u\w^ϥ2sTΔѻ,∆Pu :ZNj$Uu[Z,mc8 eG<&`mzW8.ARؐlL齰ٲsa`Pd`?^ G4hV1[!S_C@L'O[d=v9'b~@_Stuς6< +Rї/<<|9hcڡ7ʚI, +E7FbG xg%(3U32m7*`o5edKjbIJfˉ* ^/%g;|>SrRu{,  Z'?Yֻmm]:R< @HZm ZESJc^0Nv͘߆?P\аMDLb&C~wT +V1 ήk1+!א8q dSatYzPh >W ȯti-% n0mh(?;@@+; }"q?YXeE퉭̪\[~3ϻet\H՟"`ejo u~~NUKutU`?j]S)E8aG$T*1;c*6)vEGa)B}u-s5ZKPh,B`IRn=IpZ oŏA&$=QG_\%n.I^@++?9T4~?B6?YG΄Y2^j~N9֑L- R3r=aM@&FZ> moK4x8@7WqAD~MYd)Hi$re/F)r?cp"=m}͛Q.tɇ<ڴzb1'BM{tqYpPO +噤2S(oPo_1dq s+"˱t20^ȇx=RL~'$aoY"2,skt)%%l + UzƁ"8Y>8)o3|tVmnVܠn\gB*FNS_A7.}!5j8@}O?REϽ>?_7r|\ +疆+H8 G"-_C䕰}\OpRĈI_Խ_\AK2/4ԭ7F6G/G.4 "f}B(qʇv~u>xAQ.h,T Pwn^M4 +Xl)(X1o>Ѣs~Ų*/_Ll)[q# +ԑ":]Xc|w`ys}<w)P˙ =?ob< Rxjh2mmSX p:\pU!#OW*K|7EŠp6z5.hł{YN᫁M῜ï >jIg$ľhHZ +n6 (|"5H*imY5?+vZ;_`ނ?83ڭVX ]G |ÿXYdo"hAhK(kS 3| +gpu 1+^ْen/U=WjKaP}S+J `KŐ0XqAVE5Y߆5ÔA/tTJi-)Xq- + d.D6[pOPGn.ٴm0יqXO<+О@KNJS l. o_(V"֯jD +\8L훔tWJB`dD)xn R Xh?U*Td1()("h\H(&k~/QրdPζ"嚲SC Cʞ s=%jU$stndQ\DZ1DBh&eA^=#gxsžt$c9 /گ*x#~eh^lcC-oXpk,hs} +*n}qi.a%oU^Rou6ַL0OJ,4I6[9J9@QB"r~?Ǐh=7[.E/2QQh=ʲ +i== :Ga`ܑtyޝr/J aEh&S8Xpq7Ab 5 N$PSzfI/ +O DotgP"j\yo^|ph@GZ!YpR[Dop‹p [ "M)K:Y|EA.ւ)ub󯤫q~ ƙgVIY 94(l3/; BDRKy 9иX,;{L1v +=Sr~H +k#cq _~k +tXYTU` H883eчZ3seݫ @2*M`I}'5g +ؚa?qa9N~RN6RP;!2qX6̘8N!Y̲p~No9|s0b꨺V?ǎ9&$W-׼e29M +e}^s}g_ $\zH/Ԡ1hđ\s9Z$rEa&CI +g|ȑ]pb|  =rEw9 8$lj)^rLwPR%9 dž ̑?aW<>f~1:*5}5@xw/b8;'.0,Ev +u]'8f)9]xEn3x6)oBD~PҲrμY;ZxEYK#,( d8[~9J wLr~2GE@3odm|D\3aͣGdisz|e! l +wsIyj9otZ +pB#RRnt11Ȗz"CNuG:x^ CF!:Lg-ν>̃ﻏ}B߃x4M}<)*w9U!NB:" 06=rⴿJX7LG D8b ͓y{*/$B G3q,{QM!$ӃKKo d31ZdJ=M,n +!rAdI%>'snC$e(Wc;?~UА7TךX^ =Ҫ.mxh \",`'yɤvoKA9D)6 >`TB곏69psAng~2>_ h-HqlNfr,zZЂKr^k8,Dϥ =]tl߱ZC?K`k;?"""W12=>)SrPoa$$^Xzȵ!VAUA xaDJqh|=#bP&x, jcXĀ@XUiήRW~rd@YYaoX@MZwZtI c1+ͅL|,gٔC*x<4`ʄ(Zr;bl.XzJ o +PaYN Vɧx`JKO +80&䢈8 W+L5$,)B 0<*P!]Yl_G!:CX @P1 {'K`@X%TV)ظ (a^X04/f. `ɴ$ ̯? KO.'EGDD ep|v0'; D Нb@ jGme7ۨL@N#x/"V Ձy@F,xNk_Hh: PJ!dj2*Hk*)HZ00KOOGd1b~@*qL֨RRl6 Uִ-dk6Be?&P;fl{e2)݃t xCfjaXN\݁m$J,߁TASud +)f7mMCX=|kz,?;,=P{ï?:WqJZid U߁|7xNC($,l$,ASj["H0QG~3*ŝb$襱L#-S=M_3Q&#@ABl C W@*#t uaK:0&2MLe5 L@*Tm|0< +"Glhgˁ{3umMyuFMSӃ級P_;&HiFmP8@ +4A%aN݋5Ah 鵉BKVH6bvwVu>)RL}93bؑxϔ _ȢXe} MNI}*n4q WwO.|GyPЍ80J#B W Еׇe#7 1yiSz_X4Eu\3yJ$%/ +RߤZ'ilSlpIފfZ009M%Y`zhxDă2Y΂] ƕT_!MR{;#3Z$owpmlNoF$!FN(Q-UJDALK삀&DAWz]$ .׿"EAtr(:P(ȳ_HG4O4=tFh҂ރUbbuZC4WrhI4[_l#APP's_Ptbg\xG Cb*Umn@j\0AfOOUj*&1Ab9?l|1Ack:&@ "cg=K1Qe^8&h?ap>+L"L-]'^2Axqu_1 a83d- rG)%p"Ynpg +:5 +MT;ױ1ْt̀mLȂ. FL;Jg=\wE?,_T4̜?P]L&bq҆btݨLv䂲̸`iM|'&Ƞ|ıieґD]>&DGj[Y1s$ eerDP+ I X> AF< +7$1ރɿ/0ɑEw>rUA[ֿ3 @&^-+K&+ +4Qt++Zz@Bo+u3N4ݻ'c|f[L#Y^xvP89rJJUpcJKBIVC>^Cb)b sEJ{ WAꢼN:˞$ 2Ko4ighEuf/Vh9<v3[M_cax *"AەZl(]`߲*VqM=/Nt4woEP{ i@\=B$( +&ht{ES۬M{nA-9q,BZCI}:.& 3s*'i, +H#4 iҠC vQZxdє GMuYzXj0b?#Kp.jM?IT=11Bv ~16&3h<6X@HS矼fsSIЂj#GAчnSj!ެTI _HN4awrDqYr]7Y )lM6S?-V˜ +0npꇳOoN8fR!ʧMFTJSJ6,c^n~.DP`GQETt8:Ua':A/ʕeTq1TN"[w ŕbDɻ4]GɉT3=ѥΉuE.N1<vɢSĢy᩹_!xrqzeQL_[:ɘ/u%uF8o&X%\_W>@bceUX .Ośf@'Sr>={N5`\ۜ RS&&36@&1}*vb&.1'(cPO@|j +ܰ\Bl6v/%b;v:7V9Z|#Tptvрr#4uQ +>k)ّY%HMmf=JAv(5/y^.ObԨH$N=+uR⠟ q9H\2w 1^zKHj11f7eAƏR? +<_a+V{*98.^-2#oB*i dN@ iVj1ԣ;8*;imPHsL*bJ#(Di(~kIetӗl،<4Sl L|]'3q$q2O#RQ+P! _',gWu󷜢7:9_4u crR4;1CTT\H(f;W^S^''ḬjZ5#%wJ56v=?IQU?؝/4VƠяyDI콌MyLBa:nXW/mt'I0"Z#%kC SdQO%$O\ KjvF-Q@:JUFiލFC52VU5S}]~r mоuVdG5C#@P.𖖥~-?KІZ?惃;*%1p+Ң]Q{6 /igwYвj0˥ψ.bRxk2 +axQ%SWb7*r#YKm\~@-C-q%#8f.5dRivYYPp[u^q$9vw-]IH0leѦ5P`\rLU"UErsi1p俣6jyRE@RP qf>׬SVg{R*'FI)#ˣhVLE_?h`H,I74DY[8B,Ua Ej)nxpRpH> +/!%!U=It a["0[hI[̙:faRur-"-GG@{[D5TYDLH\K\zo@Ѐ\ql[%R]r|5>㥍=.$.R*cZR/:a! +Y=q0GW%4Û|DBu8 6PNu7tjaLpi[.S]R"L gSGRw^?[dgSI|2'`غ?K 8 S&a{ SbTLI! ך\}M8v7U,:TIDžnޗ +9-iO)kI|%,~p9 $[*K7[tEÌ)+iMo3TZ+2}J 2 .)h*FdV&nRh0fZm +qF9\Phc)P*&CYe Lecd波jB}J1&Mlt+Ku}lUEcAL1ZTNkUZeIЇjnBo`xqCÈu^$͛Z\K\՚7 VREVNMrSkMW^s5U_`R5қnBRU`$ 8S)X+R2Bi)%K;Y +H m@ #dڳ u5{'TX]@)nX' hU(Z!2nB5up}z)TBg=8|pp"}L X%(SZ=8GrPf t kpwkBBcLww檳dQYGXNHS:%Ir@Icv&q{1]rVI!WizDuD +p<D˃I;-t ROaRY;)A4*cHAj C4c(ę 0i ;0'>OWQr!;+ty*g#Q uLv2zo;IolwR_=\jɸ#k}UES{^4(DŽZA [Ib&';>m,ѧ'wrW⍵"OEDlFEI]acb=9A[hK20-R<~AiDg +KiT3-P1ROm"Pz=٢J:^˚mdAR*MDWPuk_Է+"1M04 4fJJō2b~@YXB&J<c!њ](*1[OyĝY! kc/(fbWCZ4S(kaYn ]L9hQ_z(9Ws-Bb VNZ^HJrHaR%p੺})sᩚT( d5sRX4[!KeooV"GvSDu`r;js[GUDK%CȌT%!wU} u*_9AFV4'"HH"(D\Eo>' {8uT!ʳ=h:xr5:ʞ!6 Q&7\tLcѡJ7v'cS^,FxGBSQbU^GIQ '6"G$ɧHn$WzJ=\!eiw0)0`DN_ ZfH{[HC*̪MQ$s +p>UcMjğUg*[1y1bKܱZ9ࠊ/QvÄ6i?ZժD.jNB(yۓhE+9`qSKs17.PM"iz 3sDZ}#Z[;Ѫ$a(B JgkEl?BD_kn*+΁o_9ht6pdB B}w,;*o^P )|9pd2_H#d2i;+r1;+ntҷ +41;Z%7vDCҌz[=¨=Z15 2Z[= .![+\Rw69t\h+ !;V{jtSQFrPՊv^Z;,T}0=㞄T;тWфq7h`ZΈ]W},HIIvj5wWxr`BGnJomŊCV3^jgLg\>*_%c֪N+g꫕A{ rzЛQ[[$\y_uX,un>+Y`q5~20ap2{cxvd^OV'ł*BM%@tI/)V6lbC`2Pф%@r +*:aR,'c$@ AO)jh\ˤS:?)p%}]%EFu7/\ Y޷%>V~*P6|,OF 9,b[0|ci$X8L9h1Ebg<6i h Ž΁ҏNܬ + +X) HN):FLm̤MnWXgYQ.'>Li1 ,V\FGQFO+콑_-R6^d`[kᚎ=$ʼns#]{F,l92|0h/*Mяe׎eqca?:,بml+X#چ|)қϲ o,d9 +kPe9K 5B}W4~T#XvĴlX)[%R.m33u˼3GwKSawBVSrZ]=h[ݐX*`J􂠝' +NXgDGC-9 X75a&} |7Yuw +bѬ?ۑ_Z,/.֭-PQe&;v0W5j}NJz>d@qI ;>|s= L%P]?0s ݄a !,L:c5c%USme˾L4jI&mfq6z@3R E @*NetJ10t~,͏ scYF;_J (?~ KPga?֔=YY=Qj"(n?VwI ZҢ$ ?Vfá9rM(S4%:>rWP2l@Vf'r\jȊR{PWX "Y"^IL^W\rkT*~,I[pf?VZE+cY,PCc:M8-'&m:0XiGL n8~@?,4ܰ*Ʀ0\,N4 P},Gu3Ģ>V.?Vjѩj`Ӟ#\yA#nPuǺ%F(c͋tAwp*~%֫k&ǂh῔>ցXw AX\X32e? %]#)8?CbX\%g%?K&[#X_*̚W3Wڤo )ʔ̛*߰_>X:XKEc ߳YM©t=Å^cO?[)iHMqՁ:XCX:Z1XH,7\ѡ K$[ƒK-DkrAeoO$ת(Fzo,"Ĵ{hq,vq6LX6 iu±^74}"'4s8\1quVñ p,(  p=SU  S#XX*r$RꞚ 8VWnX3vEk# + YS9${<50QDl7$; AKH8"XNTgfX|'N}menı>4n(Kw| +r, aA4;0AY6TZlb +\"1)$JY1[2/,+3LA smW*Z­4Yj +h I`,ld\=wcť ⳱uz[ хg c/{xuGK}Ap7"J{qp"t[RU:'Tܦ!Ϟ&]1VqH/^r: QrJRnʴK  ~z)(.3p"$tc*Tcs~At8EOCXa0\0 pdxa`We*Ub3qEGnn7ӊM3˅&(= 7&A$Q A0Ghn6n026l)g\8>aS`Vh6#^2dF|BlᡛF0p(|a)M "{[ʛdbDɃ;%D %*x5'#B*޸bݢi360F`. >A}یf7q;V?0h/!袋 /'LGR%ϰO=m&f)~GXW{2~艹GTƏsp%dK`|4KE/q`P0F +rh;~94+E1A!ɰya`d/$I(!`4Q̱/‹5\e%/s|ӍNY9!7zLT +3"ʉ9ZT_љ_Jy2/t^D 2.Pq:2aY&&=$IXG#4AOd{~** j jrGt=P !5% -bfi5ʍ#0TTE)c8#x3Vb A⿐E'rS.x03z'ymH6M՛|ATGUbJ4%U K +{(0܇$ ǟך>MwLcMKؙX9*t6 +a^hDM.=/Ԇ +Rq)2 S(]%ŠSG'UQnhXMd)D.Y^HD̵fBc1$42 +wz]Da$1!a~1N\ Gڈ(>I''4;WN$6$)a&['E\!0#cߥBb|Bˋ ,asJޜ`}.R捆]~DEe{DH1Lj= +J0BXANF?uoӎs]OaӊlJ/bAq9OxN::*9P˯^S񲆗Rn7Ld +'P匆K4 +{hK2F9"D#"G8Y]1aʋZ=4K3;d>XR*Ta,8MOS> +JѣP(:m6u P0b8GS!~> Oæ G6z4uW#p@l +w,\ + +D`0Pn3MH?T +-!3_&2C~8-2C!D!3m^d\}8;g6M +m\36e(r$z%wWcFx!qi =fī|ŌΊ1# +Ö/A"8e'Gc? 201>$d; bjіxk=fTΏ)nj"1C1#B"XZgP;f3N&=f| ȹf:fEcƂLc6fiòl׫Luntk N> ~= S3EݏD, 2(tz5B32pez`1cc hXncJ"sR u,&\`W.3PcF >f (e?픕3ԫ03:f$`ګ6SVlc_rM2F9cCFfIiLHBpOD@+d @-v55Pga>8*ިtx~8Dh:=j +XCQi zH &033b^by{a,yJHb.2 Yfc칝$ aϵ1IϾn 8A5ĻvYL3 ,I=9 Gߓif EAsL~3|Z s阡.RpZY`_e%v fFX cL]h6%r@TN-gRd6ȽcEԴ 4@b" v3 l59zݘ!P s Tr%NAtOS4tUa޼m6DOA 1s*&Zl s$L2Onj媜Cý9pkt OQ\N2qt(\m+n pclsdLjdA͘-T?!Y:%,&tAfĈ:@b +}y0 $ʵ3 2C&ZF%Fh 3-a6b]:Џ[6@fHaz\K:J0& 3! 85P;ʂP$j嵐d.Iq2Сv~-W,.,hXf6hdwī4Sf3#IldҢ&~@^2\ zA6—2C']R9Eĭ>1YM0;8>̅\)rBI y2cF(p*@mSGA:NO Pͥ|2#ޙ*z:EP4D3Nd<+$. +fp3O<|ɌߘU OSL^JW55>Em\d]R1 ]zҼku!j8,av^Ù'yɔSfƧdfXe˩{m{2r8Uql!BD͔:_`,&MSfXr#xeKǃ0e(,29-%}S퇉%*3BNm֡+a+r EeF1:)"B̸.ع1? kJ`>a&ogk@Fu`I۹?D*%YɚzzSJfI Ò8l*Uf[WDq 2CdHN-3=Mb'RyķY6&M;0ce3?ꧬnζ&]82*.F a̐nzW"-3&z>ǵnf3srQr KҰ߾zibxrèPג_t, 4E5rQ+>7iLYt=sLl9Gv,%jxp +)8CNDxiQ{A:+„e+"׼t;di !\ҨCx,3BWz)|~a ] ܳ8pBZ2c6mӑ-30yR}O].%X5J;,/l@hkOxd, MYꙢƕe^jCck*-3CM=5nIwt<ٗ'oeFJʟRm +O~0I+,`? +~X0ݬ:,yN&~z#Tk!؞)z[1s/霊e(`Qm;\qƎeFEfaXf|@ؙ-F,ѦWQe.e 6%au2#nIqzˌ+,8-3hFc;R?׬oo9r2cj2@"){uJBm8Vy,\@G6'+BbD9/NF30.ۍv:.Y E_̀Crf _gq`L8U- +ĈՅrN0=SYeƥ.PVJXfc ̐`=iC䯨 SGqY+ˌ9')Yf&Y A J@f2fcC3n:Uʟ &fX*3u'_I+pe%2BIFKaЅilÖ*6@;RiRfN ba l$Ct$"vNU*d_O,=a1`Q\&nif]rR R(3ͣ,$J e%X0В2W]wlFOJ(%>[DK>kj1SBgUߘz]22#6.h?129Jnlblg E):ُ˴xᐡʅWi(3.LP<TNI(3p?*:rI6(guPҫR6/D=N04rY6yFSf^b`x2fGM> c>{j `u;nn)^K2C˳Ԥ@PhJA*32q1^UfT^2= Ve㺊0{-y̆Q)Bmx[mo(SlQ97! +y<Ӈ 8?AUf5VˬwPMHS]E-ܑV릗2+8+=`V42_GVZ1guyi>8k\ XAxF^[ve?3:OWL+3׏W 72CcL8g?ʉWCp6:{ s 3gMCw̕yjBUPnS +M. +\WV =P}`eF%-2C$37c@| Ƚ2ѐxf"$ê0_Sz+3#OM5~92}YIЏW 9U'xM#"&pQ2DFHe\=[ʫʌ~6ثͶ~mu]b1s"eKǃ׉Tf@mMx 'Qu82c>,ܗO0W(d+f^=jeā2C!es: +Pf'poR8{` Dk2i5O2W~2,ve<~g_R]Bo`ˌL5 G,3hrP\0Y^f=-ʮ_`PQ#TU 2yeUfP2:QseҭuU%gu+N^BCP^4 mne\ EtRCEa.G ղ̸b^<5z˾1ˌ 0),3zGo3meiՄx7fZle1 aLq}*gӸiFH +?x naH ċJ@/PHL <x^'41S 5%ļAg~iYfH T+H 1q_ 2Cpˆb"ң ,RI"ӈ12#"&C̘>W!zvړj>j)KˢfZW=jJVH۵ +,3 +УPdwӯ +20I|аq-O[Vk/3"̠4ieF.(UZa{mSKR+ G jJu側43ɜ~& ӞZ#PYfR׸neƥX.7&F @phĕ"scexI e9%:|VfQQO-P)jde,X1>ʌZH5rI# +n}YRfiUf AzaTfHPqw!TfCJi:ꓦl" ؜ mm+JܙKA Uf CA{ BieNLM.>g K3 PkEĕa3D=]>V-⸽QBc^$JC V WfTқ }BǙf4<ۚ}~ i@ZzirPWfz) k\] r2` ! X0T2]N-b kL i(0 *3Be1R)!x/2 Lac!IӀK-H+Zoh]PuLlj 3s2O{:Qu jer~QЛ.%ojFMf4*Z&3ґ;,{Y zLebNEoV[JtJ6>G/&3qf٧I3P)[q0=}d9KJ(0Q` Mf8eE1rt) gjde߹PFi, 7~5HQ$IdxQ d4D}[P6&xHf(ðwk1\YǤhrK\:%e 8QtY2C +]U00$3SJ#UQ"kd@XkoG )y7WUa/L?~yxSJ (Vdc`!FӮ)lU_IfPR2S+E~#(]d%?UȄXm*1KfRKH_@x5~h8/4HP&3f , $w ?txfs!Ɍa"zRQjh1$ }န +>x @dfa〒#к-~b0f2C7_DA#S&5n#a2Pe-%[ˀnɌ` +B +Ɍ/9o1 ~ +ʢSqqY<$t;Di a)j W:*UfPΰ-̡u 3LYe}T MeF2HA^X#X"FĊ:(ʑadLCA:RfZ% }VgHʪD{w720-A hg눙d#Wva'2-ӒyEd$Eq8e|ZY gus,@Rf|)߬-u>itg7eF>ᦍ㌙=](3Mϣ9_뉅gQxܹ~2'4'3 7 +>c aɌ%X6^dFRzsT^IqNf@E2YL'U?&Uk2c*%J_eT$"_b+N5 Rv`uMb8䩙L&3VĘVe=|(3 Qj(3\92"%F @!kstbhkS\&Qf5yO@E(9K2kRtܥ;#_w@Ig*",([k7"}Pxv^[dYk;'6"瓗S "{ms2s APKCTJ|@?x%(qI>Ud_+d}rPbc$3DM=Y?^Kf<JsOg@m(7R[poa7zѨE$3 ߨF%CS8 cԳ?B2#hI(C:a`kAKqd )Kډ߀k; bu]^wa>~iH|+ :F "APnv0P/E a,-A `qӵd03- ق^V>{8l]q+wx j L{ ~gZ6 eĿ_cMUK3зD<0൓tg3Bz~dt9O6H8Hg!`aHhvh *3^$A@OdƘg+j2y$_߭mQ7hZ @J8==~"jwà8MdY00$ M/.!iEWO<Ȩ6"3h!.yTrA b " O\-<0qr%zc! 0Ї@3 ^n`X} JDd?`9CDϴpH^ymkOv89iNf`ҋ 5Zje2C.V ^Vt/!ُp%`YŠuHN`g8?f%$`UrE%3&Ӯ--fޞ?`X# O`j-FfSEI $7n[=F-E; ,N!3飈dsY)2s}x$,4'F(m!3rfXZ20M[;|B7aEkz*DD}/of5Ykb$358Ɍ!9Qcbw CAՌ_P_COlTWVg{ $*91ܫ54FeQKf ibO`+Zb:B?(P? Mw6id{X0/p9ε0@-)TE )eHfd0R8\8 7j1. 99q+Te?̕˜T˾)-_|>!3b_~a:r$_]UNL dƅKHNg4Kxv@f`&!3ҷJZd.z QqoqW  +fө wBf$:XLɚg4D3pSeG,~-1ŌrMyrjJ{Ff ] b(H@' +H9Z:6;̸DZTw2]WdFzW, 3~bN?E 2c,0Yd8HiYEf*dJ{ '`3uR"YdB -w1U|@Bi[>fȉ^┪Ο?hMz̞?fk/tG=}Hp|3(XfbvRARY9B dwXcN ""hIi)#p{&sL1C ~njb><Dt `ẍBXJI}1a8ScHC'1U kR'ۜ'Y觎TvmL>œod _-14<iP9pT7WMY:^/{҅i+InjX H_l>:`B4^pu|0Ē=^ }Ž"cxkZQ3缩c|;⽰yUNz=f\* ecƈ $̐P#62itj&5q%p8%t U"lZ܅pXmET \^Sds(*彰>>| 1J"ҩɱ" {(S|vnHԧN^ +$Yq jJJ*Gj\ 32Sx2!dF& 1rvTMȌD^\ V' ~6B_BpmSxNΦPcFxl =f.v3R%1e2)QN S!Dqu83 TnjLoI*Ai q@4 XMʴdl>4In&2SI{,7BgaU 㿆F!7eZXU]׌Z{pl(/.円ee>fSI1 lv:086 + m`4}ნ1cad0ԧػ +gQoZ'WL1&70}`εČAPq +/]S\ڝT,3bFkP"@@%8bDh CH${3\L ܼu<h>$hybLHb ̓=z_\ 4]+\?1嫕8:HDBDRUWT??cx&.%f ;x!+^o`uGSʇE 1$: "?1c?i41J +^wbO_3@NrvMM3Pau~ i* +ż %{ξ81i3Ӷnd80U1{k֩B^1c%:[ +m`7 ^UK9-p3]N-Bs^Q9q :lO\@ >wXc̐1h*!E @ag̘fUQw NzHm6B+1#I03M"zJ1#ku̘Mۀ3Hn=f pi32ioQq\^D@)jPSZd ש \|4BÿhTqGI)oX07q$|HI!ce+(@v9f#Xy w! +nc;}CSL3$K43v. + X`. +[k +(OR,9f㻞tf6fmSgxZ>;LB"X`lxȉBUE  HΥ!e\q&njaK (u W;f|0lRF`/L{#"h Wŏn" Kڭ)_h0Q8=\Һ1cM]!B@ٗ( h<{kqs5vBB4-&|0TA}KVbRл%]3׮!b}|'(p aCTwxڼ6#,Q %K9t̐VepĦDgXخjo;f|1#$g__yJ9 َ':äؤcF&#0zuJ._Ͱȕ((B3>J#kh":x+0sjw0 \ZB1cglaf۲1cY9$4;ܰ/q}W̘EA7 *: ظ)c6Nb<'ƅ=,1#1ԈɈ’K{F(xM1`cWza6a#*qa OTuvQ51oaVllrA:b! ƟL`XK `<71Zr&Fȿ(_PAӒSbd[wZF*eqO'e_@bP)\ +"'&/g|V`H^1b> (^\W1zyK"/"XghZ,xS /d^x(#C/wEi U`M%-Db(bB +p+_&X{\+*VULEkr_ ;)בǘBpj6F 9cmk +:'챶c dyd2d YVd _Ba#'cY2<b2N>!eŐ)+KȭӮɐV5meL@?,e^*T.29¡]L\tg1SLLv"]ЎdNEEcYe*[_ª<ŹY3ԶY γoFgL[]YDꢟ? 3|E]lX٫g=xgϖj@;5x@K h fы+V4qЌQTPVʱhAW:4htKG{q>ں4:v%9PZZjvF@.C 1u4 uZ.̴6p̪i,x%Bu5M3giVPyO->C?U_Qaٜ9Moyi>93skQiYWa  ӘԅkKI?Ĺqҥ55ԅ,.๮exLC ~9$^ .V. 73`tPMiK.rqq "M|&.`.r(\P+g-,-[bi9oAʈ^?XZnaTu ~Q[[lm1mQY.:jk?id*[<.([,@JED'^ ^hуi7i$ U Z|j +_T>(LK\ZtȦhX4/Bb~Ⱥ0g9"Ay\EV/- FV,r$ }K#$8Ȣ!cXu#\Ύj.ͶiLbbR,XXqX`ZB(as  >m] SWX}|ſ i{O$^Ip,mQaW2 ^1޹+^P]~&84M& +ϗq!Ci +~,ZmE0>mV0VТc3+4*+{NCVdx.փ@^@-jlaWR@g C\Ha̴y)4OG`_Gڀ8M6%h̳ HbQ4l֋b*Z u[(6-D ^t|@q&BЉUSu :J74A7)L. {SB;.}( ]UB7 ]: :IѵDW{*&:0Q!++&X+ꇖi} KPE^"K9*n%.v`sG'%B:N%,gt,3N/[ +u8$ʥοO]RPuK Yu`vi]DܺukKgW.aĎtld-;U%A.119xq]v:lg8^>~RĊw }bW0Z\]_!ڮ]\W]%l; v֥^!+a Wak!jlenZ"ہ;>K&Kh c%(& v} +6Ln+Ա!>J\AD,KPJ|PS k H@PWbN(e h%|5XpBZy%1ҔH*)$˛M II8X|G"NI)'&$) as/# {zy'^rD($&f+|ʻW! 7bau~Dɘ筏`#>"E +c8}g^jl*ytּu#@8:BZ@sU\Mp8oލml׈ b 7.z +'8@/ h1x x@=Ϫ@G++DVz Ģ鑴 !occUzVzMOs=FC]/Ҳ׳?0= +a",ۣ}'M;tsic?Cd~hP{\!ߴȆB}pqy'>4Y^7&IݒAG7V|76@LJ=)>_ C$}Е#{\N`ӵ'{=Mzlr=_C 9W$<u=ĭXz+}{v>{_Z!vsg6}_C7?%䁶~柏 6~zȁP2O/RgT>>o_&}U2'W +S CGoM6(azXqROv  I/ê̦0=xbCƏ? 9azCZwU.=ƿqQ'PL#@TaV@OƠ%6wŤ8"`~M,a/`|dB6d<8A @&+ )=LV.0Ua( l *=5c 4/aWwe+P/h˨ +F&F{NJGz@bvlly8AHo\0L2`W5Bi ,:#!.dI!j +IӴ*nY F,*[¤k#0࿌N` -BѐVC+Y)D0w*(6^ CqQ).UIΊQZhpo/dU%wh0B waE +(^4@΁R[[qѐFB ,:40͡M +"A~K>C= /ϰ^V ΰ@65efh.@pLfXV DDyP]"( +cl'N 2 +exd&C'zzd 82$ALdHP!CB2,' # +@Qo@s qc4e 9Uxe1 CqbMbxYÃ@ }0; ! `c0n :K!V:oCF0Ak``X +{ t PAB\K( п = <J^@4|D ]k mtLA]0Y +A*?\sBL]8 V@AXq.1}rQi_I; h? +t +?eI^! XlW@JWr Wx[rV0wVB~>WXa*t*8Y'@_VR$*|Dw*p@"Sa +O ^ns@!A`S O0$`0ٙ(ОR)A)P˺|t#R AZZ'(ً5+򰛁 KBLr%@~JǴ\N\x6d[*fve^t  +` Y )/+QuŵAx SLh=egl0!k!jms!`7brCN<i +Ex_PSD35V9R2hHCP8u%lH՚Q+ڭ!]Mb9<,py Ҏ!#^*CNfq5s3jZpbA􎪮.QCJE h +5 #~yW-#GbH<#%$eK 97: `-#}`ZVB\Osɧ?,0a^_˰}-u[׳[L}yDL2h t\G}i^׳w1]sK`oz뷷Db9i=X@ V`~_vs5\t 0MϾu0yv?kWWZiY_wu]2_]\">.;,Ӯ{7ƲeXcvc?{}e2gZe:+V*ݹa/wمY~{w8/o3K~{\߭7˽. ;=3ί?=otX{ }9;}_ϵ,w_ӲKtɯ_?֯;y{ݹp_{/?ݸwӳw}kv}o?-{{Ӳݹڕ'q:õp_w;~k.qv_z?i.M~˟~=;^O2 ם~][Xx?.wڅg:vu.L +endstream endobj 13 0 obj <>stream +q._wyi?ow7 _qwٕiDz]/ӟ]gOϮ?=gq<$_O"rkww]_n]˴v}.+5 ^?{_ڥẞz>ǵe_{u\˽r 2M4 p]ui\װvi]إoCzeٍwv纆Z~Wu9wgٿ ?^٥.w.>>v縎ײzٻv9INߍD RLac_GfGֈI\ڥI$eLaI0Ae䝠F˱jNV=c皮+1]_^Ka 7~^1 y_ISbE*g¤6ErKޮ;CS*uus2Rv[ڦF6R@?gvLmh[tJQ;>E~>(ϙv̛'贁IL_h^Ck^GRD Y §y,mϙYK"bH!U T/Q$%kOH +g 9EL//hf喊wM-rțgGy-1;.1SkbWh6Ԟۙf 56}=:8fn>aP ٠:Bi"XLQX*upj 5)!;,BŽ.s)%F~DXX ,39E n=Đx9pjN"R6̌Ԏ n_hQ]E f,&6ek2Uc"`BPā<A4~x娦zEW_`2P ȈZ``@dž.$Uؒ؝&\۔CCV`ąD"N; QSdFSUyx[#pa%#+NQh9(er8]9ȆV9z"Q!DNQS&K#\ǜ 4j85y!MirHR ,mܢyS100ԃhn b>;Ik!-aCRGؘΙz,-%Yfp*5jSZJ[Ņ3Rώ/)픲,;llJklYuv*rKl&JYbHP7S#Sp6Z܌6 +HŹ!PJ3s[Vvngh ~`MsnJl̊=6]Rv[ +hhEؘ7P0AvILkjJ;v̔jgv+ XU!R^OHmT,cGX]/`"Ԋh)0VGܐx͹-Y йy̾ԈV[vZEN 9m` +A QԢiF䎦ZC?n>eNs3#L> +XHQR!Ӝ:GVdNtMд+D&DVEbFАIh͠BR9j9ZibIDd;g-h]%s!XBpRYcuB.#"3^QbG ' T50x: Q-`"AG?.ҁB*iԐI +& +*bv5Щ$KH HOmy 8ER4T7 ZPPu`m+.a;^k.92!q2Bf]d 'FY!C,Y *|dă&ABRVBZMtffJ+״=y۱+JilCj[jelF+Xڢn$&6$vAg8CJyU͞؛T;Mtw+WY|:7 =3H}!Isp f%VD jP-0g.CC*V+3KAf 69Z19h*0$1s<,p5\ʞF'&+" .90)*;$8JȎM37"ԆW BnlJ\sjuVT:%nSc8^4Y-)/ !Q 988` p|(zAZ"$8/BBjf+P0)?iTVkn9EvKe8nMT""TdsFИ hݐ*bs%n)qYN]!8&>Uh23UFolK4#| .*Sdd0z949GMbA R5XBL56kba56ܐX IEVd71|pMK\FՕ*)q[V3HdHؑ#@ zt?N\ī +Ԍ 8BT!XaJH#C1 C3bql(X2AEDMy "b8 ;:nqjobA~ʻ\53mȦS2SFCvmd\js$C2 >a"1"rb70g%-[o~ʼDȉ@_Y!E(>Ҏ11\R֧#.)ʦ=p‡yXI6q5Й]!Q]dk*kS3VY#lbO|InY/t^vw̮.咲5$ ̉Ğ,xx[kbW<ܱjsCJc;q5V,qL,sW̖T[fȈ ,B@L^Cˬx5$n…d/DrEHZᦈJs\2#^Y;d2+? @qA4)> fƏܑmACj !0yѣt YmrG#6; \9b>^@B͈~˨{ACrl 1'1&Df7 +I}l5*+Y:#ɂHHQ :! G +P_ms3VM@&A0J_8Zk=tfT88P +nF ,B`b +hNDR v~f\ +)o픲;%-0e(m.yҖF̒;>Q"(mGf]93Ny='b'mKĔ +%2w#' 8GM:`#`Ū,yuvĮq8T8/Y-i njN;cdN Ȝͮy2R8sHM!!R`)Vq +3K/T˪)!R!^FN)1Զf-m|{'rM +xE):KZ-i[ŏSASNVPiE+*Y c.ꉎx?{׃b[eKu:9 wXDP)[vE+T &-b,y"tpK<#9mYψrD<.Bg33#j +ᅣ;^ghF^īnmLupHfT"o 2b/s 9Ŭst%qe!HqZZs3ڭ{A'hJe=F '2_f\yT$@HЎ΁u +D S "Lh!b9h06A?@/1eEE[fOZENє-1v̐7ƏOC+g~4 j QEpR8%A + +J,y%\ C+rAʃIFrx IF,XT6 0y2rJq #O4Ǚ[:&)otfּchE 4ݯYA(aoGTN vJ`oIk"evDМ8ymyД rHȌN،.ԂI(}Jh"RsnKlmebIlyXnJYNvo;(֕s檛3ǩ14^>^՟6KillMԢ 9D%lȠBCRGS3cUK^U8s;άtKE\Z=Ė/~SEB-=s,$kfJ{usڵ]4 Ӽ[DCHcPZɻ{@fvTqfhz~JQ1]S1ViI(픹/|F x̊US3~ ƃ3cH! Z,_@^hūK\CO"\FkY*^+. U$5IYfCjˬxX%sgb|DK#Rkj|ucfmnEK)f-I3+'@ !'/234dTDPx9yNL$pA#^,x߀Dܕ+y7_& Z04zrKLK( 3T2xl`2IE0-+haaDGmtA |A!bȀH=y%fG;f[fƪ M]f9HȆUY:Z;#},V0KZelm[yyqljU٘֜N t.ݪ)eQ<>[;IzY-q fj)η7 R^ȫ6CBLXK%m+zؗΉ5q!ŬvIOZO.sڂz h!201$-sno"5ĪeR00(W4 +Jyy8Qʮ؁(I9&2g!Uef<ܲt@K\$$')}q‰x Li]q- 9H%qvH|lXVݘx _@C4ՐVY㕷dMYԃ&1cUZJ<7D娮n@ߏyyߐsfI%`6ZSRb' X*NiBjS+*/$ojeF?P>p%G7؆U/kxD`dFWDH#bj 1Հ[HȍM9B3f̜Q3WWy~F&T%ACԈ$%%ABYfT rILhj2 +Ne>e!gH,it(Xn|H͇qrjP )0\4WٚJYőE BI؞`N6lĖ42#CnulIQ/\t 6qc'T^O8-݁"9JfݪjШ2ckڮ\*o񳴞INo@#[!ZE V3 5K@LP&Ų:uFB9ޒ)$-7||h9̆`=>=+GȔnh!Y3 nnlJk?EjGS9 6 +F~`Ƅ !47"uIF M91]SET%"RT~GW[K1 hW3Č?R Ijme-qO]ݞFX@A nnoI$+,"j "3̈dlFR! *YOy|<[bq:v̄Z2v؈J؎#fDP$hDjh?flkIJ+hIJ+9;.xހŪkrFۥvd`U13N^GLqCp)-myz;tѬMmy%5#sbѭ h·_bQ$s:$5Uk@!=oZ=:3c[bQ\ƪ*UcN!H iȋJPYn}OP)' lj|̊ࡂ;Vi:{b}P؃'zV;O\(T%rACfK"`FO4$cVwLI~xxnC#)GEEFd"1# +{ҹ-q#TnYnBNV8|hX!1pͫ'O3ژmuhCK\R0)GiI k-RPpg %ϙpl miؖ6 ؐW<Ϩn躀K0U8}S]oi쎪b :4 +Dk5#:/` )u49#-Gu'4 eV$2j3a*:vIl hmPz!6D Bh"ׅ Z/!,# tG@ÒfVgjDe6aK1N>m )Kvl)IKKlhP!5ԛ[z=jFA 0f)ސJ#Z]jHԗ2#NK`EChp'~X6|tEwTxG~ũW&mKp8e\#v+WppJ #BDDl 6|:_O!fgA0ChCtr0ȆR/uᓤ N0!Q] IIʄ%Z%(b'%'Eѳtʦ~T+.hx[?(ք0s:+=V ?'l;%^Ps.8@͜FER*w|IQ<kfͭTXB>hfFjx:;- rIe:gǧFBR ,L~J{Eݯi$mU0u#&U"F +hN+4a"uIKX6|tHRZ8ei9omihT +!4 ++b/JqxESYTK0ޱ +~ļgP-Fg!QS58|TP*S#N_xbZ(o U#BZ9ztHx"LPGr@䌬1ՕSC)A(r8B:rƻ !`)mNўǣ ŅSFך*%6ԐqhM"jXDA jd<~dds ,Rե;>טe#'. +PE2.CH iUݚ~( L +p!ϐ +bqb8 y3疬 +J #2fpdEE + J!^GYf$"0L0ȐѓMXmVtl}~KQ@;XY~WOy)14ur@ftL]孃CRUaX q@lڀFd g'Ϲa,zV(fTՊ7A>pg-my~J~X@Kx>B'v;RM,~ + Ymݜ8oiB<%I&74tϜ憬ؘed;{]RS+:i|Ne[ʮlQ +Yhsfm¡u*7-9;' -2'BB,-JqѪHeٜyR`T1o]ω=!ns%Lڽ`^VZM]Gmi=sSbQ<܌W +BrEqG*ap ;Zil;[>;۷C舨t6Ck0hZe +_r.N%2|mv%YFc6KtlFَ"gnP43AtP"21$:v I:`0C4O•NF0@ +ak u@\%~լո >X +fo^poڜaht c$?d5?y($‰IȲu m27;Re˿3ڟ-]C2~CbcZ*xv| +*v ͡?T&-g`9b~.lT==qrl{%&,~شH 1C('Ќu*r)O'Y-زwn}0zWXrN 4 juFGxF sj5I>*4vg2[IxHLq +- ŕ^ 'DOz;8 +Jo‘4A{:Hm ك n"{ ~I=A9ؿ`Q<,PSW ԣųkŽ[XaNsˈTd0XASD@t긆Bpu⊼:߂^  7:jVx5uW2Stս!S7+줣EwUֲ$jX_, 4U{0?ӼE)p* Qh5j}Y-ƲFj0NyWuZĴƧmR*n#(jťb\/irP5;>Rm]I. GѲ>i)[eϊUQ)byV#Tt`4-ug`0E tE0DI`KWod5dU9ܺtb}TJ>?}^}|u|Onk0![h-2 ㎳x:j}V$΢r +lsvBR,&iNLHwȢ 4tU̬9K+{0Tר,CW0h&2Ww鏖8Hh킻 sNVG}uaK,:ZQ}4hf*+=Y7LExR#e=E(DxCFgS^_m¥#+d,6 +~@@$(U@"a0PVoBeCt''*D;\hhBu raaWde'):Ӝ,7`qW85/jhq bBvJO2xVcS? hKɠ}:|,Hbs$gV:)tyg/J)C[DO7'Ebf!bHrXozvi'C!z iG"-甐g5lYUwMb]"xVlӑ_{w6AUkdޟC8 0C^9J!>S-h ĠyG)rR +<%r[B/kg7"^N* +6o(Zc[;\B"n;? م%٠lUr`437t 7N938>ضa댑"Պ6G\E]gS%**\?4r\͊g\ IY:糑ū.&|R||7_n(c}uJ ڠ6,HyxC=%V/UA)#kdS .tP|%PZ /i2([tb=248`  q} +f'ilʃ ǣA-Ռx.Z݅i(3)Kf7 LzN;:Gfp\TLR^ى)HLsDh֦ugZA+뭀S=\It3޸eh.ЀHʦP,f32B^#[I]ArBc p nD^[sΟMDqYM + Y&*:)!ŧdhet[SUR5B/cJn]cT=/̆]!jp}IoF^d] xW[0 tD"Fu-.0BUV!7ai E 7ZteNeDap̼*^ ďDsxe[@B*|0͛t З&Ч?iGfЃ?:db~ Y)J)<%  X_+a6Q>kIs!;9idADgX+A "t`N-YfϩF 0v!ݴ#2Theܨۥ!W^e5U!Buskwy7x`pl/=x͖gS]p^o[ t~-tQ䶖<,(DKcdjsC-׶xK CA +e ٿt? R5qfDo +s!9ZV̓N ۚ=[3TL N (ӆO,tI_VrڄJpvn R !^^Qw{hext+1Tlx[v[ ۴ѐ 7@uPQ+Bo_9&:QyIR2:ӈAw,.8.܃y͒:hۜ$ A^QBg3 2;ŪB2taMRL1Mob{%'*j/V%}sJ/0x\ C"M,GA!/ȼ ͆ 9kJsNnI];>66^{8tVU!s1 +$@7"%tRP=ULqH]F=` b8A Y,֤;Xc-׍ V"DD,P.?×җ)s?SeZ\ [[d݁0.2Xz~Wf6n[Aa) LM5ܮxfْx?K x,'2Y!H6P̦ %׸4^U%`qM3պطjaZ44QS4h9I/1 iFp.)@4(g3h:nvj[CJi+Dқ +Z`]d#(C Nck`13 uC2ɏ@C**W޶V)?mtS^ 侜X z9h qML-ZYݴc!Lot=¢UsIV')~3J " Q0^(O{>7D–k7a*},7W3dm)&%Q5~sB`GWԬP-@D+!$b9"͸\ncc+sFx@-- g]1Ad+Ϙqn7A;{V*/%Z$5Gb3\o,S}Rz^7+{RA.Ȝ$6K ѩ騅"%)G.ǥw O^8mZwA-O]5-ۖ}kΡrxAb 39+8ػ/ XHz3;_r-^ acאBn %1l`,UɒDENxJ[7>K YCsz8Sh܄z@3gxɭɴɛm:|VCB>9 +Ais1JH']mdPB~V4e8]ʵ"{|| 7L{uGgl^vW$wI<x\M5@7}!~iG+r)ÎAz E4 +@\b<8l+-7/8gRmcבH _\eؖ!!esDH$A߸C##v +Ԙ Қ@bm0se*V +"Grmz, T4% KrZGJCqOkY8n@habە.R<ŧ +&Hu}Aog/' m+^-3shZ`gi3o z9FF[LᖇRӼ37wͮSWщ3RΣPזk YskN_U.Kma֛MԐc njУhbcKehisz6u5jC>]FgX*~ä3IrI )u5qr¢jr#/v+tlݬhk.dPnm_ 6Onze~bHD겝\n$6s˒ }Lm<#Lw"t=4` X;za¯V2hw08r[߽8讁'6i9 P_RjӁZRr6Ѓ @*+2욤.+-(r}㤅%T0HAfehDf Yki\RA/(BeÒ";{:%4O>AClyߗ[~$]| xnFO#IAews_7^-S:yƳ Mf1IJ!&_~?w2{ uݒ/Jt.d j/]֮ s #ۇH@HoWFLk YH FrUi}yU@=9\墌c+qu{GRYf7{hG3\ިVb[ +=+KKOq2=m'{EJ lΰS̀^1U:8(u6?x_,wfL; •-M`F1&NX:%gZO9C*1&6#vaxS3̢/ + +2< -,r6壆fUv9:_?R:-׎oaqGVp8PPy=И@‚EВx[,`XXSf Ry۟W6LJH^?(_g(m 7ìnٱ,Wv%0"*HK&a~z;8ƉN=XM3`c@P ؽO51ȐYǐB7r*k`(TysC#cl1sԸ޻a`ǰ;IfCPJn趢!Ye h$ fn1ZhЅ-WYȻU{?]~AVarWޥmQ N߁a3Q8/s% >f[ 9֘:@PT>wz+4m\蛯!$"q>ڡ%榟M ΈCR/k$AY軸yLt`ݶ4mpNFeZ1C/e"pK5)_{tlxh.l`<` +6@,f8>uAݠ4=6ƎA Kc:Ȟ\N0 ˡ 'ƪ""'?k>dRp&X?K5D3P#'qq/8  j>W"!7Dגj^խKw_>P^K]R?/!8CcZ-4J`sa) .a/О~ØpޚԌ"k4P gh1zQ-=:V`IL=V1̅R;\zhF8} +TM +Mm ;Aoo +3;%=;3k.Y4B(?p!ϱqhg̀Ma7]X8H0 nD?]_{nAˋ2,t| GJuqWMy6~Հ'y>1-ąQ4 nYGL{Xp +QĺYI-Z .d,+,P %譟*sGC7¼$#jyc^n. 4ӽw +_/YPJZ)AV9Tl샪:tQi#i&-||7+VEWN`'ȅ*~F !=?QgT7.oλ& 6ӧbYM`.0!ޝM,E[]yJ J^./HlF]ÜD2 1֒ETpKswuT(-|-1mB*e4ư]wz1&ѾѾF#l{P69Q]G.ko]Bnx,oEW $包Gۛ ź^JiRPN +>ta,sK'Dnu#˦,^#u7ӾsYXja]~TiԨR_)I~{pӬPnv5eIީuÔ눱,/W61MX,'p|0B%#p .d<N].)huɝDNt'%YigKEzL^fk.hns~ll}TK7#1οȲRX76xo!(BXhtiI~,T^`C1J~V +*j8揸m@'M@-V{ʆWdm ziarPAI3ReN gHS!lv0-,ȀݿTСv#oE^K$>RJ2c$WN?3NX\ƜYa=ݛBfNO :6I\5A#쭖^Jcl^ETh(a` )k8 PmȖ^#}=D +'V͉J섶{!M=alȻch4>Ndja6n,RQy*$(imi|I`tp֗0iZ/KTM S2_[\?[/QSƸ"23P +AusNDK8#!~))jЈ X|]TAci^j{ȱÌV^R.YMDT0{9ID_nrA)''Z@J]<\?|VjHKtU>D:΄YDQ`ΟЛWvkӇЋ9Qo?%r~œr}:!RSKΈtdKP,J81[_8ŐQr-YdoR385 +3 o!9;+ tEM_ *&lǛ, c23a0xK߳8QhVvXB9[RHYz5 _0nV`Ja^Z~mpEe +Ɉ>BHuYTP8"cV]E]**6hYv2Жb@YISv)m:dح\r+RS4҆`/(TS9#{9U&SϦv ݑD[Yz٦kӾt ްJ~񾡓|sO˅3#+nRfsk߀HqGwN[=ssL0 CZR{fSuȣCOHlrdcg`KY:8Iځ#yI`t-G1Jf<:D7.eLR'$t#!|Q;|.6ns*LAs5X4{huIH@ +y41 %icCD;г8&dUn=-ēJ_91A,㷍>ǮS8"cy_ȶvNIw2V2JiM!7ZMzdػ/MYqUF"k `ך֨9ˈ}@ ~b-F7)n2i.!sXyo!+ +R/ɵgs,$(~ŊƵ-42ƨ z>2+ZbHO;y(>h؛ێG) дCҠs9g=ñTDO\}$rnJ^Gt}haİi,gzz(r(:>ܗKgZE?_69_SxCK̹Ģ X/9`ҙ^wbBA bDh8>4c0\h@fdօ4L܏xhF_3~+"c(hb (*UNa <Ҍk}F3bOH .,ϋ@D0& qe&F!hF4è-,F=n1w1\+ŞKL'ic )p^abŠ[?%y=a1oj1E}k1\|?{-PeF-ƨbGCәjja1ӌwE\6훪VMin|1ȾLc3Tkc33pLJb1fTl32->R3cvecél12eu2sXv}W3<Ř1Ru&5wcQ# e'fs11KAfc<0V& 5c`?؛uŘ*#b*N9ci rcJ}D9!zmߏI  YiY'#@GC0¬=L`dddV(iP&Z(g]V)POSYaeTWfXvAR){[V%#\+Ɗ e͚!*̎F`fS*1bgfMY^Pfܥp%rY5ER kFABďr/;gk ^gP1|f *gg@X3vj]yx5Cg6hKA  C cVձfQD/ڠ3jFQp4)y4 tHJ;=i5JKť]`kF4*4FkDž)Ab7 r?ks힆ff5#g{چfO_X34h]5%uN +>5D̵5! +3W3ެ,{ZXvڸ˪a4k pPPiIH\٤f$cih 'I*4ifӞϊFҴmZ{Od`MFbƽM2Z@hӸp۷ӐfD \+|Huگi9NhmQ43yiԫbqiISMN姎8͎;NCNN`gf4Z}*awE0j ],; /_0f5#59 zUiԖW3Z' +fL5jH pU3 ff fiHm#K-Jm1f(%cwCJCj TjL>SdyQرjy`pԬW3Lmy1d*SqMD5KPm5CcfDà&f4UèfjT3X ڎ1|T͐FSmE}fS .  +fI!19"n5푸 +8ŝ*\/15$ +ԍ㎥fWUFn#wjv%gAgrvɍP)')W9`+r˕}/EP s&s'9 M1s9%fp's *"sc A-c3Ϝ=sb9֧8ܝDΜ}x3 z +5CW|n9{@w e$W7nLA:(H3O:qI3YWyu`/ 6,͐۴6jgB_~؃vL3zS {liFwwA ^t4# z=[ӁQy s`€ +JWM34%nÃ1"4CCa:t5KwJJ!jmpQ:jnGәfmt:)Q4mt7pN6yt*L3zܣ[M{4)(G,,VE€%"iFZ Kgf0 KDSDiF«L3[dQŋkit$kxӌO4$Lf Nesyf(]c֖ +`-jC.j:;tt.t>f +`:u 6S]ͫ`uHH&Զn 5무8X:Tibxbc0f0k1(%\'/"4AA5;jw)_! |ڑ7ہC0oYӌedM3dL3Βl w/LI6^!ig?(,`f`;j+x}_U66?9)tɃ#;f;e+v:e>I3Tw;£pSoعGYU ;:@-_|68@^iח4&f$zN r,FNm绍>tIfH;@f, Y [l̿6G`i/^r;47ޚ0x {0x('~09B(=fϰ\xzŒ~f g=3!I/IO!_pSo`7ձg=JH<3i +g#GVYؒ7. M 3C:?3H,n$̐so~f 4UzT3AȔ;0tzC5[hFaxt֋`&+rzό_{3CRxt2r|&ftO3Ͷ{ Bfh&|x\Ōfw]E3dP\b:B-HD}H3ْf(-V hǍJ}ܙ> > l̚'/೾>`}cF3\G>ƥv,/}Gk&.rO/9>uftơ\x\tqn@q>T>զcTڧ`Œ%^!){nVm?pm"~4~rD~`ڬ[Ue-%ٔf( + ~J31,iǰm@A]m`W)wBܟfL., C|f +' nzC@YlH3Vp"(J@Ҍ=]~'.0& +h|@ vT4@@8EV@됁Ecm fv( 2Q懻!X0۸;frA69#u?3Hs̀+ \A>YYiGP|ő9[[1$ p3` ղ#|`Wk3TCa)P>ٯ=!AORS XjG*Φl-,$[N&eMjtitU@ VeM r#3GpˢeA6w|A1Gpkb2;lx!MYLfhĮB^9S)3ĻN =Bf)1NK$贐 Am mfJ̰$8m2CuHAGpG \^}) OuΏH>(bھ!55gqc}x=.G#襣AP|_EOi9^dKsm<A{.52cpeua4iƹ(^<[ A 32Zz E-eFZNTFePD I$oZ v*ʀ -3A\feҝ[fk|es˵،W)ҮkI+J?`!aVfA V:o,Ke r. AAg{s LA Y>QfM2F=9J)DP̈,5߃`-И/pDL^YilڟA$Vf vq ʌ2~TQJN P'_[>#g# cg:AU 'p H[B1 A0%/ +ˌ͑  8 FCv%WfTz,3v@w i6TF-3"e-3|lA eC:ݕ0e kA(aˌOXF ffaw+/7>u+D2,c ywRֱAAĩeIng*.e9 ʌGXfҕd  i2C RXf8̀;|j ڇ,3Wf<6r("Vfų- Rfeؽ@ЬU 9QfWmFIڙ`Ad2AXQEd&30"V"v] &A R5AO 12`l$De/6?4X`LJWoU)Q   aAr^@9z@G| 1 2wk*a  <ɌSB΁%3*W+γ|w;k\ +'ГR(3(֙2XRE"!r}Aʌ>8oO _c+L^R*3 ^MA&DgTOf@fV <Ŭu(u2hRfB3窄.Au4f)3(3hDhX^ݓX,+}A?=Y P'rwl2C^\Tt0.6bHfÒ +K +Ɍ^91uHF@m} +ْ=^h ҹ7\QCfoݳm ( "3252g "Q̲=v5 4ѩ _ *nHf`)1/dlOAP%lW + QfJy270=:RO +zuU ([/bv%BAP APGKdL¬StL\tFf@o)2 - b"ۣxYdTi^P[bvd}At7G](3tAP~ѾJI i'3XB0Z AT~g2..5E&i`J+Z62Ef4 !%_d;O6%2Ó$DA4CDp*5"-#d $2.-TCfȣ[}d>RDPRd 1c&G KV<!u:Ї1 3 z=fL#f8fvîRΨe@5 ;roeTALFM@0}w}8WJ)T(=FRSSSS:Jffff{__of3̜W>FEFo71HD)fwqE}R G;B3 +8b{DK'6?HŶ85GrmSo:x%hfI\W|FyGW&Jɏ7J<h7Ǒ߆dFTKZhn-(IFUYO~zMScL]\jջ + h!q3u9容ɥBc Gەܪ ҌR?h z$ 7 5BI?$S@W1K_k$:ee=CXZ%Ȗ)bJ@8T񪆻r ^ˈJ{x\uv2}u`%I!&?DY.ܦ$5) D!d +0.б6O頊}+NrT4 3|n}FX+D;et$!Xۑ;v̀HXc"ABV'ܪ#%124˅Kbd6a: +Yz(I_~VUUG;PWTd pUhьvp~b:(*:Zdz<"+&eɷR^ (06j-rJʡb3̆׎ڳ=i GvjBgV- ۯBc)=ĕB#6=aqJu vR0$*9lzEՖk,Ģ-j0C  H!BpQ7%FH56 +N":46 "Jۛ]MԌjqG?q9@)4\ +#93;XNӑ2 +JЀB @EG)\,`|$Z>D2)I]cJev'^%Yјߐ L+Bb@Nj)F8Bt` 3$xqF #٠d.ebNV'-)NB80?eka7uf"CB 1B8*<ᢄ HdBףput#wLsn=-XZO fvYeT`+XJAx + 3Pp)<ᡰlzS|E[h-+ㆼ1+_x>I[|9+=^@` "$:8F`P@ Tp#HbGq>zB$a \?:,ۖwak%S)y)bit=@ƉPpP p3 lT 7M bVH +EkH(+ M7TZlQjR41V# 1J 5e31LnLzN|7ZeRHB(Tz"!ʊQ}kb@Ⲡ7k$([XE>9bMNrlF(댊M>}>@D^)B^#D].X- a QHh-Pp<G 8 D88 +Fp QQBI!F$O7Ñuٞ@`hWC] +"VzCtpP#Ä,x , 4pH A`AA80XH  ">B:u8!ҩw j.DD.h\8 JZ|xpXB8(@!8h .pDx0Cp0Dp¡L:ΏvEƒB8"`P +x`Bp Qq +NJ-D TPV. Y0N'2ldٕv#(D X(0@@ 8"DAbD + +8> +erH ZuɆca7/3ҺAH >8` 2p  8P` hG"0@/>t wDZ^\2ϔ`6ѓEW1DD#3%8Z1n8GTQ8@BD +lj8(Np(R 9pF4&=0*"L%A`('QȫBͪHB)bpbx !L8 888p4…x@ 0X">;V +O( $p:C~7&JHr +C#BpcBDp@G 18R1† fA1=\nH!@[#\'U#9t0ANĸ&p Xp :pD  lQCd'6;Sp?D8 ta,U6l +AɎׁ/p"Ql &kȐ(܃jTֆX2\OYT^g.Gr)L4WYzH|x),>`)1Qt (ӻ kir ~Rci-[)r4#" .@par@ cfT!H- f,tblaxCbd[eܠtRC4>!jc{Q+>wv[ P # ,pX,@z$Irc0DbP:,%&!* ]ۡs͐œirߴmrcBU03* >8\CH&PEISnBL`cH1.-zzCNOV +.R`JESuk *m;BD@T2@ (D  'QL^`-` %Gfz?P- DCh̄S "e,ݎ$$` Pi +"x 28A"1~(I&} GZ`>WfLkm1KCiE>Zj@lx3g`5*=YY-< SITڐB\'dJfT3ˮ>gj|ĐI̒,/>Mp;Kl(72qҩ?4OXZ['7@|rŀWQk U2.STHT2>!p!x:p*Do9Onx»(fd9]'ɨz39F}x؂AXzmGBzT6FT v1$]զcB;2"g0(H_+Ia R1G}f;e))^0k2EPg-LM)2*VRsC T̎"xEQ2[AtTDBu>Grz, N}(>B4LlZ +Y 8.۶_YzS⻇Pcqf&R_vAh/3rӞ,Z;NKb}- OD8%܎;39~FTM`-30 |Hܘ?bkQ8/b{Qk: R[IvlX(\󉞪jsybs7e >ƋfQ*j 6,qcowOQBd_ZKAݽ?n v4BLPX5Zgb;ѣTǰc$3rKeJE0+=Rcxuk+nv&$](Rz EvKa 1K@Z%)UY!(QZtY ?Ԋ:w0ΟHX|c0cC .;X,@1 Q^YBETȴH`Z%x Mt/K7Z=^p C1(^g4wAR +q*te 21(P/ +1Fƫ5d7'E0D?CFrzv+X$ EFD3tFyfѓ?_{Rl$JUvP)ϫ'=?PM2.6C sb1[Ty*x[NHlN%]\wY%SDң VVM*: kEs>Er0rŏ*>}qw\\h6DNՕpҐz8HL˅h}Y cי3ZrA\ ThS`W5 +r%sQ"I.6C !ًR쭻߉$LZe-| p$Ri+N1V2;bqd̠Az%عR#)+GGQ FHc^bK +zIN̎M.YCH%Io/rsd;vE,Bgl8oY0ɯ +2 iN#rc|4Ӯ5&W9$xZ 7Hɂ+o< '03P6R Zމ9dIˮ.U`n>oDe1bc!J3IQ:Pk/Pg%ɩMՋMCGh q|O [둎«YΧJ4PWlPb8N >_0FYPbVH90P~r]v,ށSw2EA8qtBknDYyJ9I T'o1\X"ǯ{;sab,f` !V ( /Em +Lah"~K'{5AR1E=w9 ZWL8\.VZ ux]<{/FkÍS +`*960; -(ZF:a ~ +܂Mdv8nWap9N(MDCsYBh7W9 {/i|ҴJ':1z; yV)iN4q;U{ױ؛;79b-(Yfyt,xTYGՆȯ*>βj} D{"O/ +ڱ?)>':BcUg|*.7bV_W2p.W,~R^Sj{j`hR`"P9Hly/S$ FK2q~3_~ `P"і78M0 D8ap2oa'"B&Z~E4bZJc H.|5q!x΄U2?Y{hmنq_ +ۈ6a& :Cn'Ogv +xbWSn"厎}fu-_sb aJa J[r3@E,Q^ 5Jr +Tʥ\(B 6[.0Zo4;Rs+H0X5s~tw!bU#u zCs1NP3Uod +3sҺ'eoaf7LjSJQjYv0#|DrTX#xLY;Kq«6 6F 9FqƦˤ9jnWk9-_Xsqa"ȯ%/Q'7^v/Xn`j)Yo(-P;֛ d֊Y_ y^p*.,͞"VP 87Hm$-d *PARҀWF +Hl #Y5wy~CYk1Su:C +R[.|Q /E8Ui,|Zm$lB$e0NѸuԙ.Ep7Sj#bDbyg7 !95̩V( %h- I\kx8/f6]ǁʌ? .Rj/|*I_'sjv3F*@h9_lpb"ڐCvfr%LT,KrlC`癏4᱃DoQ$z8fu!˭; #Z R%e@#Ԇ >Al2`]W@=0jՁ2KL-EЪqZZ~>&ǐi- Q\+rSMWijw,@/}dfa&* f:f f +V˧^g w1|? BO1jG b;0cDPՖG U)0 jh1Hs 8Ot*3mW nx'0~"ƪ2/ #&5 +ٯ;$ C&jf3UExT0s }g ޏ8ؕ $ GŒCG ӷbS`yC*| @`p$3.IUQvPBI,t"X::gśnYCr`\pӀ3 g"' +KqBHЉ 8} #f]^\LTH(t&̮6 *M) -QB*35Ch' + U* ç؁gAr$+K1 ڌdSڃmhTr 5 Q#>aJ X/.؃#:2 9Er  VtJe 2Es-Cp$/ W_B(Zz,Xlt:Z_ՙZ#2@)3hbƩ΀ +症'27Um"vbz_n'H#s#; +-G? Dh<~ J,zb?gQ~80QԐD.4;FLhx'Lۃ#咄XREp`T`4abɊݱωin'uAGabgegp%W *aWj +d`qjH#9.^z XJY 48$O<ְ^9Uƒk36B͂m[f#x !4L!ũ.Eq*Ű-DS8 LKX9H v*Ht] R@vAYl0ί$V U^>(U VDVR[nZQRMJeFDQ l }DډڇR$&i%fʬZ`Fj PC кO9Ĩ&{@9f[d@VLlzTh.bpSn>> &@p(=t| 8# # ^Q~XZPn86y)e9c0$Lt>Yg6βw w&>Xj-^ :zrOxOҜCCN4Vv/7yB8g x8z1HGP=!3sCyr!EeI5FKV`*fE7xZO)r8>ca0ZBp x iQ@57c@@5aG,d&'@ٞ+H1r?h9zJ81;ށ ӌ,FJR}C֝ W'[`UY۾AD@)jL_Ui)08*QJ CK@$=A ,K Ngӫ8W܌3o`rpc򓖀d[FzA"ȯe kQ(d *xv1`bbŀ;& r[a'z JQt T4B80[3ډ1_VvF+[c oZEp SøWag |)Vm,Zn&Vlx$|Uh#ǰLb>(3)Cl /H;Q+@; !=0 Qz{a-8юIp BO)G)oA4n\n|H+ Fuwy#,IZ <^n)N|o:gfsB]Ҽn:CoImDOۈ6=Lu(ZG% 3eh%hN Y4M+dj 9ItC>7 4Mjn, Ub(^a|V?e_5w`V[T @*| PzQpr oA Fa9gAw X $(Hj b؄&Wv) 6<J7ᆪmF nw8&Xd镗qz+!:P^KVVV NUk$P+6 9Bn ;K@B/< ~-9@-Rۧ V ZZ&嘎8M33inV}=Z0ge}?;e~7rӿ~7@'8] H侊}cSQQ`2R`f +:Gs >$dz7k9v^}0r=(`$`! 4s>S5Њ1Ͳ?mEP (1cy%ZɞbxZX-Gavg?,8gZGڮK1B?adT<0Q OS]Ɛ *5#DO!uIrl@czA0?M7|kYn(892ap#/gVt=0Wc +SwAw*˲,=%o<5nû%4(Yp:T~q*N4}ag?R0~(DIHtZnZWl6-'n?oYXg&9-!kh6^+^t,:Ql,w¨]l˭DO "؛2 G%uЪ|9dEYC9Hڎ8pF֛NFc&%+|c>*ڟPKEuIj^Jk1jyA^P[.93ElγV@Nh$yvPBdtԬ(ޛ }<Ǒ gCEI:-GĞ6Q'uɑY~Sʖy'KޅYdxiY UnՖ5*Bóf4GѠZ4ns$k0yjHmuNF[RWv9!O"Dy$ 2PwN'5DcGA]:V[f5U; Z !mZ$wg?q+5K|ќR" f5>ۉ!ƔrLB8!|)OG鄸h5j6i5w@?p?4+/~w/si-bh8u.`њ)uh,ul$qh qn4tFt6*[F\4J)]~礚1JUyU /j%#0רnwNl܎f q6Kݍ3ݧiE.ӹ &ٍ%Ʋ*fjq:z㢈u\Gt^. -7sہd 3Mso3Rr+ۍyҸ݉QO)PٍnY 9QPy hz%1m8u4L4]ɦ9^k:.yuTz藭u)k>lHfHsi+rμܲ 5 gdp!='ޡ)3Rm{Z'|ZjE6>7׀bv5Nu_ ulLj8}!qlnhvM!Etg^T]q*3Rv6ϴGE9麧]#M}!̆:cbr@j[·{ftZFt<- 5C٨jqQO%[7餄Zf9B Aco/IuA6g0]@b$M;˲(hmW]LN$~h@Jj6~lٸ""B96R=bSyk.-3ϙ贌r??p.ٝKf[ܕ vrNCr90%SQY~nrkO^ +wl4u>6]jwB?qE?WDe5lm;c-G=m0dw윮-Ҧx:Tfw8%Q/n6d6s6Nuiy\d6UXmY]۶3NqVl-CVrO+Y]k * NWXn,(`TnW]`JErJfpV7M9HpGY,7nr٫ uV ( G޳ZBl6Gf4ײc}N $?5 +JP}~=%TvWCCeڲ$ 29.#2;gfcb-O+W ??n6͇BJ}ߵ:߳TMhY4N'n85͆Zܑ*^j i7jdv*w%Os;(wky7p} +{:.|PݎS~7o8]4dz;1\ C]p/I(n +M}EZyH]ef:Ͷ^HeWn6mCٴ ճ܅P +2V9ʶt17ݍ-7BD[rlt o{UHkV84q*]w~Ǵxr/刴kx]F+Nt GW-<.G<`5I6N#^C}W.ƴ^F!ju2&Mj2].ٝP.KHzf쎊jlHRFBm"ў] ]0u9K7Q;^s.Y c7\JѴZ=ntVHm!vaس2e5n`d?T]TSΒn95(_k 49E#o8m˩$g:.}YE麮7a\]Ԭ7!#r+z56] +a<שs?;*ƈWV4zLu]. 1ڞ Zit(|ho}W[!\G?95O~ۍiq<ޅKH(s=_.65㽇{n _`Ē+Zg6M4[FlX1ZFHjw7JMŦݘbw+u_)SRu<"o6['9^VCf7UBh6JؘjesQ- {JKN.IQBRxRj+ g^C*( nUnբF]TY !J?fxD:QN'N*Գ:"n|)rdb|#5]wS](6 H\50 'BIEKXC(;Mg 0YRق 0QʏzD,p&HZ4J1-A:` Q$-C(:M5̮ JAh= L*v?@~+\Zaj&̰)nHEf!9gYY@|p_Z~O *a,>tc +la5[!\ _x*Q2 =Tm\oNJǥV-Y\ݑW4%jT]>=m6%sY~t:L16.A}({=( +S[ClXRvGpe@ [ն"ȕ4!q905&DXum-%=c&ݚ-h%ƤXb]f;еփAW:`/V1L +)ͯaUzbh7֯(WZ +֫~x|뎳*yf=SMxVC?9ڿ:#vjV/~B|YZC1FE`Ź@^7l-!혽 +.hef("J3f#o +H1X55lwA*;Q:@ԮGmךxFqꬅ.ہƬ;D>$'%#i1Y Pja9btl^m2R6/b|M(c$G)C,44B~arX&x'JJ+zM0_ NXn#46Kejlm \bd,48qrU0MKr(|1|[4,l8]МNz+V.w%T+騌s Tp"F 2CM|$S5g0lET%u6gU6Ŗjˑ67dH^2YZ3JsF]3N):.G7 -\~1Df@#FSF|#9EL&!knp5Wai, rVT,Pa Rm@A86jnbGLC hCMpqH5A&+:1r,$IuQJVBr ]u03NZySۄH\#4fcw$\ݲD TU9+2`JMƲL>L d)~j+1$JC8@aofL$HI1Ԯ5a$daaU=ؿ4ϙ$1P{Y|YNF +mΖ *?è&Ć|5U0 +16AL5=B@0)0 !Daj05ӱ*kfJv{m為p9#oj PZC̏y"Z(-JEVaƨL+ZX x +k0T-PtINQ *@&y@ >Q`g9V 1uJw& 2:ݏּ7ѳ*Vj(ufsI?;fSV 2 waɀ @d>Po5fB3%#" iU ߷L$"EWf.?$zVlV^Gԭir#'hy _$x

T0h&|:Oʱ-b|(s*ݎyө 7`22jl@B񪖓Az{:S4rs Jy `w+?'>@ǧ4Nh c c q]i/Tu@ 2c Ջ tOME[u݇+-   /܉r,/ĖƪEM]w9M J_ XB17_:KصVw.xaA ؈]S }f?ի ]43 \WFuB)SZv%` 0 V5̂Z` ,"9EX$?^w'yORR{j|!ulGa)8-G4=cn (~sVv,hW@2 f̴*!B0j0@+PqRCVjy'DZҤ߈Ew)ZO4éyUӁ(@( a +s O3˛(z>ӯ[lOAzOċ+"Rq~X]^j +`B#:]r,oqcFF/OlneeaT:+geऩm,.A8od +d 6'R| ԫ kSV `n]!b{W7H%J#0t D0I>Cv%\WH2b,H6P%TD}# U=Gv:˩ r80N5>$Fߵ !MQ 8A2񆚠/׈`kep&AQfq\q;S뤆]_mW8?{MW~p*-Ì܃͓} +?ZIR\ +,"p(kW &A{ pi3?6՚ >L-E164^',YDqܟvh-ix5M`YRT>3%i,$jx 9!ȵ%$Zeu+DQ #5ײ^0>ZV=$GN!$WaBc*YR +R+*$nz)GVqe?jݺs^<-/OchJ5ře֫rQ@BcIׇ`ӆ\~ۯ]GlRJcJs9)}Yj5;%j jXc7$!8_nYlM}}3yf BS :Ii@+ t ccgjpD,ٍeJxK1LzDD/(§L\+LUY C;th]Y8ϡY:z04WwZo;ұ[ MDU]ÎEe á`23yMTW: D:k-(N+2#nw|S[ +~WS\*Y~u$j_8v7a^ejxj(D;XdW*(1&7V~;=sp;!r49]q:Fr'|.uˍ4x,*NGbCufE1vRu4V ɣJ + j[buKAe4n0i olNY]`o@X|dB^5)!Hl—E)zu(I:Re'z`"O4Ҭl9BOh^lDH[o;qeo= gtѷ\H^aVkmujfU /azg\l,ӫȩW[ΔZ~8bts'Pwr m};y02\g0lxgJ,Y,mvsIP*L1{L7D@V lN$La}BT&:0Sݲ`1(eu6zwB] T $~GzyYyR3)-Gu\NṫqgI HE*Sl=ReD\d<HrBtPCEVaz3!p}#!8D03  :G`h.fiUb,Z_DGdT8 ''XY;ާ8 rFT}=uAz0j(dq41gEA;[Tgꬅv̎7)vldRӹ4ȊXH'竛~Ofm]g;U1%y\Л4㵜-M9<njq.ϯ]F޳DTz18eC[An}(5xt&(J;ZHΤ0&5ި=!hz;86'*B,{*l-nJ W-!)F "J.C96kXtr\9:Ye 8ubܪ_/-(I_wF?qg4ĒHmY?$OJnܞ] P#[^~Q~0Rƶ~jd]wF)SsEm-s6n~ߕ,;qaaz*(y$wW +b*r]^el9O;buzxM(Dte7*ٍeu^JeQXx+뙆:V 7HA-&OGyߜYm g>zjN),mFiuPCm!0̒K! =7% e&kmjnnU&q~-]*"\=瓢:Q5 [~0Pd@l 6=@Ea(ΊBYz%ӛ$)&  ]ueI0܌s^Gdt_H9m6T08>Rt#z$ÃVHovVNҬ4΀dw co/x İĂ16b +!U *#fnUGnOU&&fwؚQ[vnzحFeәUm| +JC )&">Ru;IoU)Lx%vA8lBluZ:pJ~{y5Q3YՏTy4sƉYn^(|P󚩗ۊ6 3*NCPh阄NMP7MkoyC)n!i2#f}s^am'ȱ]l%|6﹆r_'WE9Yd0Yf'.hZO B aɀ6M(F6;Neb~|I@%9bK- Tn3[P3n+vw@^y֑ [r㵽WQ>bmȯ5%l P6,q ,!I- _ZaUZGRK h-}sf dH*p^m4;z[HH -Óv1s6" {8&m'Ͳ鞄u7S1OP+,@iK@azj1pni}Tab=@b'W,1qRKE'+8(jv|G'/~Ka3$-ў5 R觌Onh5mbkˍ߱ )H/<9-|Wg* ce!|rE 0o&9@o'Te=ְH]˅y9`m?{ٖfn؁2cCq8vfd=BˆӪMS{#%PڎK!vE c6i~Ui.Jr^ 삖aA+ X&y X>)\&Z"J XT >GV(zZl"zhd>~Ãr+%ZV` x#|Sl!zXm$F/d$-獀uR]/vkղR]_U$޳5v}/9=I p,)5e> ?zp^nĩ::?&r]1Q 9E:P@*>'Z7g jrKAt/ვF W܎כC?:="Fir a:gX͕(aP0TQs9BfPhMjMr~|N]v+Q['9[: +J{ձ[?9ze{D5T>yX<ǭs;Nx_MͲ9 KUnLzofh3߷=ݾ銀t{#Gj$]b{b @b.]`Z~(|Qg>k3s]oA):؛Nxnۮ((7crѹ|tС 3@DʏDw91z~` +}]Q:k@DJvDzv3DGu=5T𢨔[ݮSlDϫ\ w+ vrza +.dl^h,)7I 3]4jXW \ʯі)H1yEו$``Ԗضwo;۳h%?~\m1|_k'q^LpʖsI:-H2,el!b1zeXvRns8а{Eu\{)Ho0P|7z)d 4Fo Tc[<4I!r4$=6`R\np3]vN-듂q=iks|'9+K'?v;J@sPvek + VqmE9u.Rt~jNb:2i \ށXİ Ei J+Q3~[fp3EvǪ-(ܒr 5, Pyi9.U|&0܌-ԚET[f)tt`}#8,2;Yf0Yj;1+O-"'"YL4,/JKa~cb}U +DLtA&uK~1zQqB+O̞BCi=X zv͇*|Ϲ:'VD?s] qmSMZvKV̺Ck3=1Q:v~#_v}=o7 Ky7gau Dd}rK Z1@=YwT}bd 9Pؽ(DXԒt>qZyjkh*kق)`7gV"N/0FE1;˲Ojjg?KvBh%W:QM]4M?g75l@ڀױ}'z1YgGJ+n?Z2!¨ VY+/;OU1JaIRtRFiGR+ F*Ɩ"ů(fUxf6v4c!Bx @??lX֫0b~S19Phw"z BF1Xe΅I@z57"Z?c%Gc<_k2b%鈆 !4eܶ_(h'3(X߶(^ݲ㪎uYJ9fv3^_vl{ib$`al>kƉf3 e hJ`,`aȲ F*_zmVk?/Hkf94~&: Ya"ږnd/zp.ǴknvR δk? ,W'4Fr 2Lgpd|VmGc Rz,"Z#fV8 zNԎ׮v<7E}S{fFT +zYvM^uIhuD%YSSCdsI?e!K'byi3<b CiQĪ{ `?s:A'ړ{j $?fJ<(H,r@n}Q齴[[I@񸟴_Y\{̲R 4|_<֍SݏI/It?XE\r{rqHlmٜ3:y3~cv:`kA9NI8^2tw[N)fǁ([H19R[EOZKW嘈t?i_Lad$vrt*/_o:$!_%mo^4']KfpYG:5/9Nj쐀r]:N f汎|U4e9Ƈ m92u AEBqR4x8^lpb `7b6|jq.m*>3;i0z_mB1 '9^edw|rN EiN[:`oGmJUj^P M23g:ЊF#bRQ$$ ] zY7;ښ٘ہF޹~gj^{U~b^A"wKvV6ד-1γy.H^qĖfb7͈(uĆ*j!K99Ć@?]2wi9&-FQEK8]~*݅1,-c<5ĆX{8ɑ+W%@fBۋz=ߗӬPf\@sS[tOo4I#4 +(, [QZѣB@5GjpLIfe$Rlz]b ~SVboV*ו0鎁Y"@J3̦=۳ݸMԎ7Vt܍Veo4wg= +b[RIe;R ~j r"뱢΄O k)4iIJ\ԮFy-ˈny;Uq6Mי 7?޷Q*QoLtbHkz/Ď#/M똭w$Vr6R!Z#(29Xj,~]kL,Yrߨ5k`G+#(Q4\ 2]kz5:2A*䞑*s2Z[!L=s߈Uuye("4su7%! .-ޫ6\4"q,'>EUjnhZnY9:j/ +4>'jkZr@ZI^ ]7]ۖKVv$x$Qh|FU>j:9!ͪpMD};vkrxy rVr {Q2 t I]㳊*1NEkjn+N06X 댤eˆ~o^#ZAh~vbUǫY_Ė7錀s7LrTWf>.eqȫ] +K.DBWi&O-h5謿ې14$ݢyﳒ-L1/<x?Dw|/PgٕF 3+Q~0nDlǬH(:j˅5bNkq[ ;oĞ5Rq4`|2a}7_3}'B+>‹" /{.b6"hgl<4w 4A!g[ b Y.Er 0Jd(F^ ]#EM6 ъ ZiMϕt?L5C`Y* -A Z%WP +endstream endobj 14 0 obj <>stream +ҼzAje plnPBE/H%VVvd2@JZ^+/rs`"~HiUFe&m`_$70;RCOB&c#)ev3±,\j_jm*L.Z($y9FK^zWajkNGZ lʏyq*m:OzסbP$0ccĬ 8Fn=Mb ͗ CYA*3:Nt+5Wo#Yt\7Y~=ӳei0%M<3D=X{a5Ls_ Ef4p ϗqz_ v;~=Xzm g_`zcX%a CE'=\iG) d.87R5I/2y2 y=Át"eOsuOcu cTA1 +gKa\z Ј E)hBTo+RC0YNMZiz` +eǁpd.Hh04=s)Wb1b@T`oD^843M2],7 ߂B(BKZeC&c}s0ÙK'nAHa܄ +.*7 7Fe )7 D\ &O"=$t43Qib4^FN1[>PcEi^XA삻zax ^"qQNp/tL:XX[:HDQ$&Ej2KS?(VI#u=C˫𢴞a#j03Dwc43u"8U`C feA[cgBwlň͢(vc+8*p dͫ1Jl,؛ +Ou +"GIޡ%(l뮲 Ib#& ?MҺǧ{'0w pgݮY]Wp}Y8mPhM`$I45],GtL,Y*T#-G;RZau_u@S1^8*P[`v̓I7՘#jfr-SPrCi4TM1 WAI@H3 ERY z& 8OX~w9R[)b{!bgzKR=%_TgǨ Yhqry$2]nj:zap(.7(XɅvЉ:c1BASkBB vBXeVfFU%=Q+xyjQ9IX*z x XG+;?k&KA.7Xd AG +-ֽ+18Zg(R/CPAg(NKe;0%8Z44TPa}NAԀ t*D0=Zl;ϵ܎3-h}R;|Yj La\ pr9(q:cDrן33JnAIPZɪ``DbXhf~#FI@ 2&/7Ŧ@0+#80yr{еp65 F(ݕW\AI'5K8\l@X{Do!R@G]3]%y29Ym"\t!vRcC P2]l,Zn`z:"F#ә<8V} +3 vu7U7 5?fP"+H1z}ocrl<'LPr2`ٚSP_p1Ұ| Sç +ZVG,6>*=Qe8Rp^ 6<V<J僰36?q~Kdaa\b;TQ`2ԦȽ,F .qlj ݑRJk:Гp5K J[!r6UUl |8 GhU|$x8Ϣ,+8(xM1:eUwAfi>f + &ab~NQv84G "858YsMY`m8?R3>cN [O ,˹,|/̆2*c#E瀃Et#ph Dz^l9t + +9X07F 2aD:Œ1~ +,t,p25 /Vj'E٦SA7 5M,FfN0Fj븗f]* +T\ߕɺ{:Ce/9ZL@+5 +R'l@ 'E`Mȹr0CVa 8uvQIW2ba-DXp:)V. J& +Ƨ$+Ke'(!%>-,V[ EՓȉJcq +iX"L7PMeH@ȳK(;ѣj]G 5G BvR9fMh DSdB_7 "+ف_0|V )Ь 8% +!VV[H0k-ưJ#yN_ -`9j4e&3,GJET&zֻ4q|\PjM EsȡJ;jq=(c<'|b,ߩ\~̏Ab3fr.Qfn~|.Zm"zVB[m3T/ߓHR3K!2`s~N灃u$ie?a$0KiuYy1^B +E-Ƹɞ$xmtnX5G AI6W.j-1s'zn>MSGA(zUg-zan!h5`Do<ϵ›Rr3!dvbg^cz$BG +Z=ϕ} +yu,D;2$:J%@ϓMæia\쀹j{Ŗ0<-83DRq>S4?ֶBqĢ+7 V 7u_Aegz_ej920\ݗi"v* MXˣq:0=5lOgidTNw+Fr Cn ̷aV9qAGCL-ihA|f^W%1Jc)fDh+3CTy 10}`(%DqM~Հ N1 V-ѪmbӇӛL Q қe^똞E˭8%Xς Kڃ3=\lA*:gz3B$o#UZCA quܮN{_#WxG\gGmC_?z<]mF/ >[o$>Q_#%Gay&X=Ibw5zv30#*-^1Ir_;\)4e)U'^'۰Is+mO!,R`ۈ^(, W2O0K-igVBP{/J]i2[h0~\m#lRxY i"F5= Ώz2afɶr6N`"Df4i&plզԂn?"XE@b4Xayf0~LB( 0Mo5Rs>O&c2 EҐXu\L3Tv!kրc$T1MbYjX\T1ƏK-EB ڄHWevL;nQMq'9f23QjLؖ7{S8QªhUwo:W[5 JzsTF:"ܿq8ͲޥUAnEݷ2[DZ&0|z@he?>S;ֿJK!K,{^D/ȯ>C|: +Q=V[tozNCVG(7 + DUqVSVslW0++ͳiڰ/Mq)֣~MTᅺ쪫8@av=4ۦBb1}$֫8vR밣@qX֘B[i""DOVf ae' *ұP8i~]_\=%/b8$&}0تqMjlԎϔ{RVBj~&M_ 冄p@nNQz槫,jEvreWQWiLj?,lC=Ym|QNIMK1\i2L1O&C3f(mˠd!pY 5f3he} +݆pFCn=W)LtWY/Fq'|َjtPAgrG?d{n|Bai,՘ җJ ŪeŝhT-A hSv`rt0%/j׉3Y.4kT{eQI]"PeJ# DRj9̔ CY1*Na 9Kc7Pl}i!銈q9S0m + Wd0AMD)``b1MP_l"k;drE%ՄUCD~be[PX+ʌNɊ} dby%:Ǩp]$3V&:m_:$* 2 n~V8tާˌ5"ӻB,Pͧ:dFzj 12(l6X&q_(ii拉5$Bqz*Aj:QZ¢qںj}u}Y/.P>gUb79QZZ2YWN8`&. *3**\9']OBpzSK2cLJӒOהԊ+ӕN9FzLk,VrjGiEW8g% 1Rp`P $Ъ0GlI[,--E]I*Ek7Nzaƾ϶ sTH%ff&I  +()9`["L0'ėѴz))!ƤMQ (ll?2UΤ]Ve-)$LMG LBA+NNM#C٢ۥ*-p5ATAM)Y^_3ATNs ++<}ic8M}{^@1 +VJ#+B0FZqhP ڨuEjiVbg1 +F3T9*]3Q]OB @0)8Gd@Е!Pe<~ؒ:c|)#T+ Kl˫$;;Nx (#GMI |*>p6L($4(@b8saqa=~=j +k:N0 ,k^;cYN0_mC2úzS!ݜ d' +a RbPiA?Xi-:`RM4UMP%BHV2-5 +  T]+m|@iuu` &eB¶f%CQ +_ (նJuŵްVUx+KUKYX(bk:Pc&*0)B3@jGė2k'Ieʐ+ZX1JlN~k,? 0rR@ + ppA,с (`4x3y{bХ9'!V +}XeYjhDbIl!$B\8;PptP D! +pV$E.3(d%"! u cRBz:u=Yl":4^3v1}J0+0F/fݕ#2djX=-R# pbq+ma*$(.U&W5WY ͢)PCACh X:QI (e,:,⢂بiuvJeUVbSYoLJU%Qh2B!a1[҂Ç(P @`j[G,>D+y)#TVt(\w>y/4_n`HG@AbLe0b$H Hx+{M93?ެNx3ְ3;6{bP囙p,`b39X`T!&8x>dmq.H 3^ 5+ǥZȂvTUiqOXaH`BU^[ r{sT gjlY9@e3'B7" dQ_B QiCNɤtݎŴVC:ioKM.W$evH +z!(](&XHP@ +`4 +pJNijBM6ҏRSːS1nS$wV2H9](DB;#6pL PAL*HZ)A+"& +@ +k%cBM;顬=6Iyk}HLcq׷LI-5ٌ cE7p0[t0c pPdKfD1C'DZLHb9 B) kQً]͖@m qYҘI*d QQ@PI  8/D  +8!`y { M⤴4STO8HX`@Nج1aHO vr\񡀧"8d48`0 +VZ91`:aE0#:!5-mhn +WX`P)댳d5JE@Ib1+ 8R0XcD +TSD <`=u.,7*iZܖ͞C.QU)) 찈1~*OQ[02eqZ©Z[P..3P+~QD~zmG +jКx`!Gਡ0QE  8b8xP T@80ʑ~CBT:RwvbRB]OWl(kJ*!ld` i"GpGZXbC/ҀxHHa! ]"4V9ӝfMYbZ*j<XAXpPxQ  +<ݴ<0T@͈NhQ.3`{(Lz'X͛ (z^`ԜiAƣ"@8x0lI@Kc<WbePAEѴ&iݔlC-9PO\_1 ͦ7clAH,93,Ī'RM JЂB/2M` Ɨ*AfUԂ$Ui RJJ!͜Aa2&. Q'@46 +T=80J|a%Ä,L $VMO52 ɰ<+ &[ԹK2'-Y +|$rLK6mDl$"т  +0ѼHDcARM߃aRUd~`G%o^jL +svM[X^a0՘VAJevX([€ 8,:,PeWŅHN +~FUqͨ*/P(3U"8VB4 1*YrrMmd$ulYV]KWcҙ쪉nÉ-P|_Q۱nMY[NUԄ! ˍ"ˇgKMC1G%IraPE ]ݡ1%,$&(WWP:Dβ?6eƃKUᏠӆl*48pxl K+.HBAb kPK R}C`oϴJ)@Uah'%0AM! ʔ јTP˗Q 6QKK5`JS2QP`1J^)EO_(-je];PnYj] +[6i m&TI/KIS)>>){(;s}+N?XBBW1KL]ܭ,\FU \pY_~+byBK+D!mao'_\e_6yj>bŀ +& + " 1=ԘYЪJ;4-D)?%`ܡ&IYB~=m 0ݪ[6gEJVpo ~p(:180ƦݓV˸ei:*7JB +Dt/1yUTG*"TVP؝%e6;KݖE_g1ASk1' +u)OBGI:eDS!G/F/gR}T]CUKL?*Zǜ#2M~$ur=wL&J_iQ$&zʑfYSB5P]{ .T[y~-~rZQm&ͬ64 b?AXPcDU6kr_45Dl2[pvԫnnp^G4TemZ4^# +yaX@'1١ $|:`>C@Q1D|QTa)04x,~x4ղ,ÖӐ2Z51]̐MRh?ȣQS%Xyz:Qm1TFXM-+1 & VSaiJq3Fyщ?cf ZW 7#*ciJQPǡk{U72]Tl6̆ds|R͡핺(e)3J۲ދ!Y\!Z[o WLB}G\m#v[7|ϙ~H^XcDƩJ UyyݐNۅ%zNJ!1),t(MRpXmǠĦƲZf-53)Ub"j:RMaG)Uc=ߨp(,89dC+Q@\'O@_,QG*PY{+:2뉔`Z0'r IŤx/X.6Fu{%%H2 g ѓxhK =E1MG'Dc(^(5 +~bzbP])Śƞ\R(Ci\_$S 4˶'m+=%-w=rz%!x^ VZ]/N(w^{=ۧ6?u7!ٔ1M[^2b!%:iȍg͏rf"ROXkT+eqi7 3KA]rYlf뵎vĦהz)>Kb2kQq9Iʤj Jl)*ltn"-EŻGcOV|lM'5Ͱ=lE*?߰oѠ.6:[nXPXRHLnՏ?ce>A]nTګ82=Od>'Z dck>-xCfzoND<܏bΑvMha7vڎnGKb4"VzŨ)JJVKZylJjx(e%fkFL.wc>VɯFcjBXźfk>S3WEX2͕ ͅuVܖOmۿ̦AbƲkgBQ^lZ&RV +RI%%z0},2$z+"]'W7"qN^ ,yHӆPj(I3>H璪S9špЮ?kWy#RۀS$Lл#62[UT^cjPq*? +%֪t0o#G17~9 JWIilB1AR +v@%SB=m][p*,yEہP]eT_ሂoA^:~Tֿߢ^ĆSf',5@T],1(Vv,7NY(}Ovm8Zg,mݚ]Z;Vɟ6hm"R`g6Ll^Io?Q[OC2+V_blBn)a-\e={Be&' A~n@֌^n'M0ŭzNfW61ȜhTM6QM4vՂ:JqfN5LuvB}r>ЊΡd>zwZb`gUM5+Z~y,'Xe-~\h"¯3n:&u>H?joF@s]RvCvj.-eq_i((6Qkނ3A$#ZӴ2\K_l"|vD[sh=Q跠:F3* N[4M/ڍ+BPꚹvѣAc $ Қl".v4 ~dfb:ۣpBB: 3p !ӘTn(4\'gr +۹H_򬒧H*E v\f؍$F.+CME}Vh J?XuE&1 +a2KYq閎pG,9ΏHH +b}*yU8N<"Ҫ gjn3Jx8ʨfhFCl$=ʨ '~p_4f5Lj s˲-' ܚۮSNfdN+H2*{n8(z{U|Pvaw h + e&}/،kaW U;**É((Cci-h@lۄTr[JjtxS!vejNCr:8Ji_{Ih_D_6Bߙ=Rv_fiΏ xOVDds_Ht9kJ1͞oi{o{ǽY7@OD{Sݙ]COlg5T\EI,?Fg m'Bosh>j#i?m8"!w>H|rg-X5ۋW4O; +0T8! +-nKIbXa+x --䶠6̦ܢ?CjnQY-*Fˡf=0ӯhSQk]Ԋ=1gZ X,6p\UOfHoLH ˊd/Ѯxm]ٮ%垡zHB[0),W;VٔBbfL04-%-jf . +T;V#K1e [%(':&•3ƶ߻-{Xd|̪OTrݜrTCds>*x xMABg{p >;^]`g4Q0δ 8BUu 8\1k~blXMw٬67}T}8Egav}u2qb\ږ)̊vbdr͵Cg; 6+NBZD.T.)UYN, 4概8.!,BOx/bsyX+e@l<~ϰ?l=#Z|5ֻ_ W, "߀ذ=ܚ-z_30VSV7eۋU=mH|rdWVyP^eT$&q8f{h;kjeV']o'zN.Ab=Wfln,OK~h\i./)Z~nrB^22o#]lnk:߳bo>Wq +ԪN.#a43(fW,j3O=gZvvoן[LuKۊ՛3~EH{" kPN"%()"iNh#H-60@kjk .dB9}PLg"rt&#JSi=^j)ZĚ$z?chQ6-wCN7\ +[VAtPڂY' fktR`Xeh! A|amP*7M&&\Jpg [5O2Z1*4'Jt.Ym)N>Mf䪯8Ҵ[9P,?Q疟(j285dN_t+M..y^Tf\j;ٰX +SLl~vc3c~-lZckl j>{]ubg=0v6C;;^iZe9W1D +$F* eY)leR+bsb@2](>,yX]e4eYNҺ%۵vDEC5߉W5Oj+a8c|?j@"uJRlXmWy +=ԲcyE׬^3C \i"2|O b$7H]aJr߉,L1}L +BJWHif P603g6ftk{NhMX~>N=IgaV Oހ * V,CEpEvnpE/>*~׆۰[JsmkY3q$xfbJql:odr9'.!pXiN6Xpaiffsm:!ˮ!BKPdـT'A&(&3Sh!r8TiUd@BŁ  +%lI뜮)^D¥;F) +<]|pF0 +P9XuFlς?4ۮ5G@! A ԌGV&ZHz&l|!d+vbs͒Eb6[Pd\3Jhh*B)fMrz{0g1t iYo>KqHX +|0VUBpCey= +ۦ/VZ C +§U擦&p PIΧp[?|n`g#M+y `{+\lWx rZP.\0I ^Q.F0+;zEWTT3,O+ssRo$?hT B+!l@R4+R/} #RrH6WMU $f”*A2SŨx cV NU-ʵXv1쎩+XibP"aQu `#& 5^0I֫$H5hm(.u*z[-c;tz>,y1loIZuEZ`DN P݁}WUF'+mďl B2Sq§؎)'*v^4WaIbwW[> [fV_F2>#c]e0R2oB DTs}GҪi[0lG]\>H-ÁԈo93X#¦g7ynXNIVh#M-5)YV -:$fz9\,5吗}YւxBuAeʕ}Q BM%&|94^| ﹝ی=*4Pe'ıDU ULIṽe/ &YH*YV$AHA~Xi5Я +QÇ fh5Oa㤺M,'~=L<{)]Y5ҳQBTeUz(:CQ. +.Gm;Shvx! +>?T8р +5`BYrM~3Q0y@aHmU")Q>miZSecb]h l*{4zP @1_~sq,t@N1: F?& 4#%4W +tP ^Zj"x$ͪ3k:fOFmOݮ3QRc{ (>Gr2 zHzd_QB c侀ybT=IP'Cu eF(U`Fh]6x^1,;,u`l, LOnlm4$2yuL\^ilXm8 m8!3 &qg{g>cUb,afILF*~k!r(Q-;e{"k KP->sk~z|'?N'6ojzi"HUoY|>|>|>|>|>|>|>|>|>|>|y<_/ϗ|y<_////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ϗ7lD͖[6(_f̐Ty &Y?'Ugai9!_G b.ymq1~>JsW:5s!2O }b,aIn>4 +f2@W~Ib<ۓ ި߆{@Ɛ:D@}iVZKj#fz7^r"Dp X>iRtnwjNj_0bɮVIoYh;U< +_VYϓ͇^viZFj%;Zalٟ8' nLy_Sj"Bl 8ImGJaeYTy(pş { I> Y|i_i%Eu݈N[O]k;!E,]$n9e9Iy@R4|d6^dx<>za<1kֳ(y'uxZ$Fq܍smWg5U69z0|$a(΁F + 0 ,T>8}P)9ZAx?6[vkxo+zb;.FO9gBuKڏBO|Ir;&ڍ4^B E؈AP}֜|fE"JbsGYD +ږwKl_B|tm=܎8@zUN&tdx&o؞[uWJ{1'c<;nXu{\/YFx1Ю{/j!k+!/t݉L'j&??l}˱mA\(CtN4 g˱} A I4O1RPnp E/7f9_W q!5N!,|` 79.XEϹ<|0\ږ J"RP|g̍W/7':m5꿍T|yn ;\pPQ-gYrt ,f n8T}l =g5Ia,:Yn$|X`|nv٭~dQ?mSw]q*qks$ǰ_ʍ/晎M k@sE)Y 60DS܄/"x5y.mDt(z\68ѫ:0C.9vDzCLU}\Xi5p3yh\h6ϲ-Hs?ƣIT8Y'ngE_|ٸA>0 +0u{nƘvDiNR~* ^` r>_`AZa|v]ڞY1M=ǬQ*+!/\Kyjߴxp95NW-8)%rޣg n 'eGIfLnN,R\[1ft'xzG&vG9;tږNw+p`1$~T?h(/j~(UKGc4'UCOODmᤋ4 rq);Td'N/Mci9=cy +L)Mx_l@w.qc s-tJ2 nة:!X2NݦǬ? k0||W"S|nKzOԷ*+d5Sj%G1 R/u7dN1 wsiD]o-r@^i3ϲ~fi r(q9'k]4Q8"ga8kvZ`Ʃ 1&zZm%p)v|iAth=͚]poD8i7H!j~M]9VnH}xAHlێfɶkĮD&AYcε\Βmwr<ӕ4HL!s;* +oL 㐄vn.yU=z:Tq2YDڳ f v`i9F2Zv(cO\Q{vC<=ge[FCmYl%׼gVrDwQW^#HUuQϩ *!3陟=dtK?ev{h5G_n>gZMaS$b8WWD=pAz;p9zGpQڢ?=7j|'xUV2H yNÍY8F,'op9s ",Dž:I]7c8Dq>*i=Qw]7j-ċۋMtop,rknsƫNDo@G,RT|%8ruб;K/rLehq*癚KۦBE6ih9Ńx235YOE,m'L}r#ޫ1Yo&oTS:[Nw5L܋ScPSeDFzégaNԼNޓ=ג\18!iGʦyde~ Vt?^t_5mhyW9*It:\ʦIv1MǐQr_(]f7 ncEhSPSA -;jv~PV5LiqW|q*V!neh)NSG1Ç$f>z6.Ni,n>uiPVy$,I1N +]3LiZF)C67RR ;JsK8Ur2'.[nw9Hw_%Su\P Mӝ]tj%HƏ nFEf7Q'V3yC繞qzu] 7^w*(N-`9 @Y8|cDsrJb軎. 0O=Zi+ɱ +7yj=CudkP( RW@]+#:atϔYE9$}~9cvg^L?\}`MGs:amql y ALYu]tmfWY~.11{#`71 ︜'[.G&ʬ&ZLr*n'7q0j/9rjvM]$QxA>dQ[c*Y#m˱q&p"rƉRc<ڎc^wB)I,2D˅ r1~/Sе OR6bsqCy_b^wS޻?8v{vQԲ$nz-4*+&rin:vR`&zyi5T:^/7"ke+[1x4 Mz5}2OZh7L06QE*F4 S6p\3˲ [08aǜPVs-n%"ECۋRw WLGb g~cY9@aN=UAVW%œ[b&ћR?e릱|so;`8&KmؽÌ +p9ِy~.P(wPN6f&^̆O݇jq24x k:#5q)0N'ԲP01(4Ol@eUFw뛎)cA2ca(1 +S G%w'V~v^C=] '|UWM櫪Y? ,nO-T>: VZn5Q +ۈwi1_v3#M ~빊X!3?5sj}4+r5ִ wWc~ 2,9r?Y0a9^henTh4vO]@P^dGj7-&&稜MA|Da|2b4_h9լF\Ց/;Yяܮuױ,04>ah)DDへt`t_!CٵR@i7YzQ֓ y ·-[.fil5nC繾K)1EtIIJGu3U E2,V2zi~9n/r:o~2 Rc!ɨ(l?Zx$$8cg~_v=㉀t+{.fY@g?'l 3f݅ +##4q+L:VSZ~9\i$tH8ᛆGOT5G@M'4KFDIzJ5%eXqV4ѫߛr.ưv8u?8%G)dx?.(b/#3:(;,_ 3ݧaFz_*3&֜;"b5NMwbq@9КGH,EQ +Kmmy?֚/#(4qY-^ڎC^~ Sq#WX͕ȰܷawH7" 9lX2 /Sf&z\k;Qtۙ,6Q2xEAjeX΅WV +;cKnZ&>鐄 ^|1~b +o~٦Ibp0ɳBt >Y}׭8؎{!_fATũNٞÁ"1| REs-~_p!p V@|߽K\}:-6A3H>Yiqx>퟉)P/k{JS;$KcA{a/Jv\ +`$X2կ{QUeu{nt>VbQJ#*KJ8Tp,ZԮAm*v'Ue&M6Om{')CõRف_H/Sg4o`6vei^w6=yk~yz!oR1}GpLbȻHw&tTz]J Fr[Ne4T߀~Fð};fu~tVF ʂ͗p@|3h]91k~sl:C f2!i.d)b˞r4\7]Ҋ1k?:ひ@cp!{ͳ]|*$8pd7Fs(ٍ5_n3|aڦjsKI)r#񩎛Z6O8 f߂ǭ65Ns,Be!X^-98̶璀5Y3=7|˟IM ւUdjs=Y8r#Erq*aLǵ0T~B;|`n-|p&zbvZn5޶LRnyL?d~18A0(wZ%vSw/XKj.J;pʧ mn{7@7[VC (zo#*2 &u!Ok,rƑA2<0$4LSl--NÆZkc{Y=iTvv`B,y|=4Q-h6ˮ3&cLln8LNTS|DNռ9CfR[q|@mE&SI=y߃ 'H{e8 ߀ҵδGrpS %څܞ@@87ANHtr8ϵж }PanF@;%M2-DUhJ qecUZo~H >5g/~9`䚠S˂ + !؝x-ֲ +fjuV,%=c-UR:Wj+\k^&qHu@r'I1_)ދ n5NkAq8:NHmߩt+tF{r[kq:x$ `B4]k9}狮zB&7!-ZW8Yq"v/8en$#2^2Zi7Q2E PyjaObLBQ{ +~6?/^nbo;Ҵ?D""2 1J'XajcY*1& +1[29BzO +f~=UsHe0q,X-^fiƳ{&^P'6)ڬJ;BY RهM$)e濒 +Q`} 7E)^afI7UJN4oY7̵NɛfcZl 3OlgVs!h`iX[g9w/~Th\P[U֣>|w-ʰ=w?=1 vq*[l#vJ\EiP~M@Ҥa+{p>UmY%CAXtNchvCZߝ)Fu3ZLDIbUqy~f= עC {+ZA`~8&ޱ + hE.8oB %'p|F?B>cYe&*KroǪCi"Md$nJtW"ɯJ.5eӍJcU@$)Td(|_w9끀sOAf B6xl WZ'nnn齏 ,b4'J~+2 8Jkgy%s'FzfcCJd}YMHo]k8F0{ӶPy*F̀fY֏9o|i?P#mm94ݿQ0zB9W4M6uuCj:NGJ,}:[ ,GnpStVQM:]b ?z\h) =$uib[ &=co.}ϵ `ʏxp +.D@v'lFY+="tDb+Z! ƠEI&/CS&$桒#F/{4&ݴN'Y3 +_[k3BE UYu_g6(@v!~~SHvz,p.rFD$&|c8vԎHGfʹ -U_f|'nEםCS/;.:Wf;ѱxWbvm2VՃLJ#vlBJ4!16[JMō|EϕJ 8{ĭ(Vt)RkT`-~`j[Y3bp<\=sR[f54]_bnYlݑl(]r.l|(ugܮu8SaV+]kH >wUw] +tKm&kEfXh`7!ZuGܺ 紬F)3IZ`k[.Iƛ$nB*گLϤ|ӳ0jnAGhLݒӔ~s,xXz!PafJ $yٓN`jC^yӏ gNWޛ}}*wJ;ZTI =y%9!4{5Y\v 7F#MH_<4}kEWs<<^nX8P!¯('*/C%5 wçnqu,|[o)Iqϔ #=ˡ sPpt R~"r̎u\[HM7D?XE=?I`p$1 W~WLAfߡݰ[ +K-D}dCգ?`!j7PQ"C3eźz>EPJN:Qb+ᓥՖe nx!v$`+p#."") +JXnz+̮dV='kvs#e&'ubՆ4FSt6%oDV47Zv!Ϣ6B6]if +q7Pt JarE9s8rUއaЩ *ٝTڎZvp(tZNa4 2DL4Q(i^TDTY8N _a~+˰& +' ޵jN kZvŨyh?J泈cxzY}I!ٲDh:)MY܋b]8g9d6.0#50]r- Vͱ[w]ʾS)!n6T~1`QzCQe%p;橮MN>ݲNWd/T^Tv1p1גLrZNkIݷJZe .,q=2{R,Ym1`o&0߽,)|Yh)pfvg9嘯{a{e_h+Ȱ-K<Z .Yۙ|SorC1|"Sb D%gefR$c:$n' )$聢g?T бH EB􁴲X:/[c΀CTNyf$$~Sf,_8Wix X2Yk>ذ +7n'N je" CU@DơIܞ 0o嘾+)>bŭ t,jj_8C ՚*6 +L"v^`̐ӴK:\yStg2{t`D!AexBYNY(Ë E#6Qlz@9ԭ5W *P'dս7Br-GEi,3.9E)=U^vcsmuYdS~#$J@q%|@Hn }ĂTJ &M.?,8QtB?Zr/>߼Q +ǣV 0"Fa5+ _7RqI?f4t`"G'%ZڮSQhS^G4Vk{D0Ave5Vg:Qg3zC +6KҊԪF1.C.;l/b܂KYr}V~ 5+MVW (pN.ȴkfU [1jbH%ǩo^jۧVni3ێB#QvDrbr&|[j,]2G11k'ZKbY /LqOۋ֚rYBb{gↈ'hCq幕d9N?ѳeO 9>RiƬ6痯V'ȭDbĝ 4 ʌ67Q}渗E]}H2-mׅ,@ɒ!(ْ) !Zjk些VPz}hMVt * +PO\z_Jt(y?Cw 6ӯYʆXkT\`9twE q"Y Gi.TQ9݋2 Do9hگr$+hrAq~2Ey#B+€}⁎X,#xv1||4IqaYyLyMrma(nAzTZ UuGC4MQs sqD[!Z^P*XxJ@׵ާZQj+J D&sLsLfIG`O {bIna&H+z T+`sڸݕ˶U~=M8sZ!㉈r[@skKvsǪZok)v]!whh!R^f{bl&|\cs]7]Pk$WPf$L6gVI$VZt牒(z%z2~Se%ǯ" sJ3`Vae+= vIRMp|Ryv $xc; "rQw'ɰD9Əa(Z>45Q~CY(2 +Mr/8"8EQ G-o^g**梧U!&ʝAj3alUg/Wg0W7 űI#R3ft'~L;D%v afh-Ȯ kqr;3!!k~P#tYp".; /Elc=$ 93=IsU Z+ 7Tei"sQjfVT I+A&|`P= ͇4b ZTz^W[o [B5F,-H/@(8Ѽ2xѩTIi̱jΦֵL\Kz[DGX7"TZ., +;Zq 7 ې4q41u1Xuϱ( :Kp牢)~\v +4Ke`Tj+H_C/Ims+1dLl@]o(|Ph1~Tf-Xg;^_h`ۊԜԊ@$ԀH D֦r [ay䘞v?DFE癒\8Aܢc{&MrGR>EEADh@AQ B4FxR|=Ђ&:Cz=H.pHêXA8<ژ fL$l&h5X' yOCLȈFoHfEdg/4"B#P(] gBKC'd &VԆԇihPEGsϥ>CT ,V@C 0@<;Ws= Y%O!}}ѿL\D$(h&*`lsKDk h.*D,_/Uм 2<}\Á^3+o9' \;r 3\]!L!{$żι}kpaݭj͒[{s`40z-V-sz۲zU.no?%JR*-Ί-1 {>ړznuR`8#4!dh,M8,O +8C z~*9lOk)ׂ`׶-[[pZ0 ܭ;L?u]kp7̹;ѯ}_UbUW}G{?v珵Ԥ?^0=HW/[=d'櫘krR/ksSܼ2ܝֽ'׵`ֶmpݥ~.[c6睠C%7|m5f靡ZqK9C ǽe,=^_0 dr歵yN;;;ոTukT26s0@:"qpT8$ `  @P B:6e>vm6IaC=[9@Mrn`|.&|ś.$_ I/\L٤ ~6Z(|U+BR=JÙk@q3} Y2,t*|N @#Jwј҇ +%8xbm'^tYA)nyߵFm~nDSgch~S<KFOe>rQ6R|,ha5KND!2JZs !dy+!ypB;Qê#І_J݊#EoPc#Y.HL8D̮ê=/>Y;=D:J4q`6yWtIJR~.PuHP>k&gYrbDNJ䛉0^2/UvNbU2@L pI{7EΖw'ZZ}_mKx!6EeBQ2+t Z+hp(+SELE;^VFk`}ݕ]=<xIFUi*SxZT($N:rC##gF$Iv`F&}Bq S$Gx{IJں % яJ8 "{Fvu;]fHBЦOh#@bf8S NID[bn:7ɜ${md&RZp܂τ8jdu.kPU7H~o_o\K~u3[3-R"CTdZC +)t8-ݼ٤+LMJ݀Ϣ +J{癃l=N焂0=梣__yXCyn1a]C. s3,g>]2HeDZXFefe\LSlyq%t}7rvBz?uukB(1/ ϧMt[$Rh& +VLPTSoo0[$mK]*i^3甝=z!3AwOdC%O{*ּ9q,.{VL $)"NЕj[DW952L텑?=#% 1mXh.6T+E8mلsjVƼћ텤!TR%4i Q@w 25.; }9GOT(ST`Jzbؓvjea N|rR~my*5&/o:(!<,e`"T̀TWtV +ij߯m>Ҙ[ ;ntl>>frd]nU+bƻS>aɍǩ]s"Oڔi?j{0vy?C&轉޽2#*? YRO;3-)o#zBEMKam^SQI"l7بebb Ϻ-`>(kKބ7YStW&ys +C3?D;l^:Yg10al:t[_.Dά\dqR߽.T:wSsݻ A͠?iUI;>Fh,y˄EFp?!^b=FB7=%#P ˆЧf(uHeY'TB-F09˰qw qt)]b ;:]_,իۙCrveڂQgObZr]єQ;vx V$&R) +V+RQ~|l[(x)J>9xJxXuɀ}Q!C}9(`Ef~4QרQiB ^TVvx3qli9)67j2Q)D02ˠU7nUP(jw|;hMU~2 +D}T /I^XȐ6JЕERѱi? vc +N YmdIc;'=sm"uS3;NSmRAR:E2;ɮ?y"0u9JK'j1P +<ϺeCRj"' ^Qo(Җ?Pe9ZW|0zےW 22$/de6X 6{Ag3#ͳP? J3o=tqLV$ O̸hYâ,]Xj#n^pLR|+GCxW)s_nQlL  +@&.H[\9 4\RyϕRe4iiJt78|4pG0(n|DBl^Y-c patO"b0~KYIT=JzK5Q3+sOvz [5b@y4BnqBOQe\{n6' C6 6<ޗM6ISK8O44Ppe൞XbX{MJa:SR.ؕ,=! TaZǼr}X9s̡İP7yc !q ljɴzhGdJ4!9{b7Ry[f#t^9ݬS,sY[ XgJkw+fw:' %ijeVX VQw?6cq3`zG+:RP9<[Y>BWp;)|X' + +$I'}wX[Du)~M *!nu}a?Y/rYk1Ndi%$PJgS9*B .]d#K^).L$XCӫꅙ h_ԝ=:A|i=?g}KkQn:d{66s[?Lb?EfpG}TP21 ,dl]<0B6YYi';āG*eM!b' .NG w>P'g0Pw qFM9+()&bEifdroȜpki1;-~`ˎT! "1C;U#Y9$KQ:4#A`@@eY&ΐ H3cb~p+ +`Չ9Ã~Sa͒_7܃{|.Btm,IJ Dcʄw }Ixi@* @TGv&`^O L枣No^MJ@Px5W#M Op4A=㥦8b̾oLݽr[K)PKfJV͵@0XŬ'q[}QIoE}` +C%d[ί%3o(1I\iYDPJ)ziG Gkiuj!`زQGG,mIÊ7U*pڋ wEᅸ3J8k #wu\ hRF{_=P=Vmo_ٰ٣DV|сDπ QLuz/5(?< ++!5#/!p].i67+BM@ IfO? L!.#PZb 1g1o}J3=xeIlpE!V".nVM;q(c["PAS풥A=Bm:a,E18č=$0l/]3F6z T#_+k򮈈HmS{ؽ0^01׭rl>YKnmNeT7/s̹X|.ٮ\ll{}.sܙ_]z5ܦ{@*lqwvd y?g~Զ>_d3QeO]:;BUݶ1{.K~Y`ب +&)Ál4CAb2y`f].^k7_q/uuu[rS5QTYyLuɚ:ƿI~rpSo:,!tW=<dɬiis[v{>w˞mvMn ~~[}d콚1U8@sa@L.Td`s!bP`Ԇl"H< [?.9[q\5SjsnisZ >7en=u]V {T~}&D6k5p'fP[+Sa|@0 򆮵ƚ& ũ\ hss'wj&otzqܔe^^&Lf[tl1+MxmeZ讍5+z|Td> &r7{czjecsg^ceޚik{uuwos:mZkijl77f5;{qǶ]Mifc4HӬs%KYfc.UYI"~f΍ :ksٿkLtHq177Sy=\Ys8魭jϹ.՗ޤ{l;o{SU_wܴ=֍rۗǫ=|OiL|4_7M7Iڟc-z/c^}em#;]w-l٦z~-떭_qur&kt5 >k2e۲ov^[!o!i粹WouTmrkY7n˱E@PsB> \|@&ؼRQt~Ƹo3|@:&Rѵ1Bgccy@=.y۪:g@"d2WZ> = 2"Q͍ʌ}̟)vv ]3]*ȯ?eH1$۲[>=s߽c/tGtni/L~Bz[Wf\'k = K_QٕczS枟u~>;n5/[鿐;[u͒:mL߷b9;32唵/L^}῅+7Iڹ{.3egb(@#z x퓻#驘 ǁQ5Ntrݭ6ol/[5flڢq`'wBXDl)xMIn.nZeٞ5omkm=XKi]meB,tcAXs-TuU7Yu]jKȩjܙ4ɺYrژ!d\L|ly9}}k&stڝݭionvofoz?lmmeVUeUUUUeUeUeUUVme}ڪڪڪڪM>.Ę7lwVn_ڛYvwnf־ rA=7u75b_43.yݮ::uR>eUMe g~ɽ;v8?ǎc~v̹[^Ǐc~̏mƏǏ_3n~lww۷NblM eKmevfg 9md 37y3gP㯻ʭ ~{O_kc~l_|$s粮Sv-'?/}^oݯkr-^q2fͅ9_ow=uKӽn~]yݵsD&e:@~mCCedʅp2YZ*`LN~u>\&st4w7姍ͶY%['|GnW7=޾eySTk%?7fkWkܻgSOVv-%vmN_~z2uz-昙KtݘS{u{ӥ'L|,7=MV&kZ>k]̓g::[~:b{橪xegc6{k[\O\umMڢܨ,=.W[5eO~:er.%ߞkݧ-XcMLPʩ%  bbQ `pQQs=_mh<&lι޿Q +01lwͻyw6n[(YS^v[V-[Ctfہ5uP@z[kv= +lZ:89Dҁ;X2 9" +9 q0D6NU9SA\,B +0ND* *RMYv q ޼k Gy Iim߽d2։ Y8Dp:LNDL**h NTi8p*&-B8P35ð$=nA]"ɁH˄ 5TV cb(0Ja8 cI`bQPHSDj[!}**`b*P +.\Ӧ +[!Y t8Q]0ts5΄ р r:8HP`p,)MTσTP5NFz$GU4gj\\3( h@pHSeQMLE> TυIC1 SY@@h|@fC"A. NS5NA@Fȁr +E5=X1 Vllаac*Q Ö+膉芋DE7l x&TQq1"Q0< +*h0VȉEDLF8bfb6$ذ\P11 Udx@*hDʂ `r(S &b(pL X6v]? +:fBJt]~kz>nݮT>׈}i;}HKgH\72be-+? |˸(yot=4U_}w]dmE^Ykk?}ɼW"Ydws=/4u|oj3>>l޹U~ٽn9GsZ?ܭ[N~mfn'f{9m[;}k=ns2;LY.Z-\/m_龜7|{׷f|y_~S^󱧯nr[_oW{mwr{vuofR1ܮlwMcnj 3#s:N|vnq6]LW6{ԗ.Dʨͻܻp"ygkV^ח8Mnܘ5@$-~ZGmژwTwdǿ>7ķܲYYevY?;?x1캙V{o<;os}= rōc^ֳyf~ksH +rx E"^C YD"@H  0&ZC C"$@@ÂÂH=Xax 2$*TXx@*TPd"( Q5#x@Av H@$rF$ D iHA6$" 0uu@$€@$aD"B$Yx@8 @0D"B$ɉL 0H$B @"Hd"`HD"*TPhX0 L   `I`"lUK"8&&$ B4\Pp19$"*iX^ x@O=xM`H@!MpP#9t8Ð& DD.baxb(SYhR`&<Ӄ6灀(6h0I('ByMAaT.y`yr"X$A8 ROuA" h.6d0X]$ + ̃N@*8N$aF`$a@HzDD Š=P9҈r(DgBgbС C19tU>r1I"M.EKSL T +̤b0yx2*r(HD"MI$UdTąDDXFTeAb MB5ąDDECFdy*Bt0 rD (#z%b` J>JĠ ZH0 Тb&>`= 8UJQB*ʈ"b0, IQ2 CI Bi&bibT]2&eX51@ L +A1252,g@ +Hq'É``Eb (S$4LAR39 CQ@25Lz0(F&  C@Pl*rIr(Rb06d4 TQSydDP441˄QRF8eb0GEYhr:$F'ǁ )¡.Y1PFP8e8HjeBTK*xa q b11QѰX$˅b F%5QePiXih(fQ1 (gC&h09 pgRMb&:Hj jz$&8h`TTtxh1NOX*D"gb. @y3Y*D#z6'b  Ùq@U$Q9Ţ29p&@$Ux&eGÙpYHr$ Aĉs沃 q: +聪-'ʡ``$ҭ=T< +&r*TLrf(cږ5A {u'1Hu,8$1B^*Da 7[=B$9B|U"4ts,tu^|p+`ݧr9.|5<+a(ei7& 5*6V4qJT61$$?lh!6l|fѐg􇐸HYǑAۭ5-TJ'w3^2b?Zt/8 +jq1jzJ//OR 0d_1~ q:; ǸJXM̸1jd/_!}?y/TxJYď}2HOka`%q)쏱D QIgKXV0W'ؾrݺ"l1KP!Cw֠)2p$r +B~c#bLydXfr&HRͮY|pψU3t *x]jv!5Uf/Jx&b>/c\VvI'{Hb_P<f,_LGsp=]@mZ7I{5^S!`V ,i6Q^T 0g\CemQ&}Y/פQFdRعOGw_C<ޮ\4< ń׽o#j*Bdv@*Q.tCv [Ԓ Q^רbp?銽{?Гd$vOq-?[I߰!;[}"B=:-zhZ"N`Z=#}=:;UmfD]n[82+;. f/ZƟ +\5QEa(tRܾTA@%_tQnMQ]tCSmZR!ܐ74,';EF@b"|,eF]J^w.h.A.$?:,WvBiQqJ4oܴ\XbA h$T}<Kx'}A.{sеS;Hd"Pcb Hb:''B-cߪx5 ͲQMWLЃ础5p:z?6&eG"Y֟hX)Ʋs<<_%m@M9wl_~0b+ѣ"K>F!ǚ,n1o7}6Z}M{/opqDd+)ѰifQ0},Tz}D,b蠌>Ruy9Q$]4Blkɉj@!K3g̲򭻖9ߛe3!gV&O_dttK7~~R2Ql{B/Z|Β +hʺhIaga7ifr"#{.@O쿌DmtS2Z=z vD)~2)%K=PoL5 t.RE 'grA?:hh< ţ46͖KLJmSg^&I.1eZ~,"Ädo-݆~7l@ oQuf.Lyo)EUTBh ]W@ 5h]2>Y8Ie0H\Z-tSF(|~(|2m4r{X:Va nJ8;,kY6z:q) >F)/3BMH$ܯs֝#DBiig!DPHm˓p7Eg=Qt"m +-O *d @f?$aZWS W_[n:o-}h ݳ+MYh{ SFākf"Я"&&dhry>9o^|23XpMnƵ "+DX;Q 3 ;B%Wc%ԛ}' vz +1%j{Ty`?=%Ƴ\/au߆PXȧ_>a~[*) 0 U8])V͉(ui֯p?Qb$; nQ8I|ZtvtbKt{1Hbʩz/z2Ú_v2C` +끿\|.pR(ACO$HKۏh:欅# dpA!S޸k {[U&[^My`.z6wB5@jy_@>x9.kYFx%!EGRXgsDܟ"#eeoXk!i& +f.>s7,b21-9Xdcb$;_qR @ 4Rz\5~;z@|?۳vp%&D&ҕ|b/"%s#] +\ehW 3Ǽ<:D?z6'"bZ!RXm,#416OUXPߵdZ<NI]nzrE# áR1nOPo]G+1bЗ-ڷiFpl}9}48dbgnNjC&a{c^撸< ́1?% ,7jczgFVMGHŰBLF'=V\?竅C6lY;3b]31Tŝf%8zG"_P$b7@ t9̔mM/<،[k(&ʕ>%uFht9E$[?NnXT37|nCˣe0Aa4K톃XIW|VPs0g==)tAG3Sh|@GS=@֝Qi^ 1^8#V7= Q?hLuQXЧltV8pzS\h>@q4nz}7<4W MM"XjpQᨡ [οS#B@T7^i5\`kb?H?$|*g?݂ Ԕ}7,cjȽBUV ; s +,Kѿq5Y͹@r։Πqz z?7/ }gxha4n`EcU;6<>zEUPTv4lzq^[|l6:Fk(0zM 4/0EmeAUw~`2M*YAϾB}X y:x Ț,?7<>(oџɡ_ {Nmհ?k89\.Um.#YOFT)6-ڹ&+zyrhDZ*g4OTL}8O:prِAEWptd6?DP-xU!D_rDH=3⠬k?Ab9|l,VGd^&w ∱ʏ90 +qBr<,tdӦZŁ=0 D?!JRJV:̱/+oOE5= c:mFM̒ۘ%^p1"8QtS5Bp_{Aw#NRdo^! {jy}gTuW,S̓r 1\0a6,nǴh;ָ N! VZVdf,10HiÞ(k<|jSxJ7 )J۹Dc 5*ĭ>H ,ufqN\p <7 L 4S#LEΝGڏ_[0rnl&~t :4x&,h ?-A_<L]zjFzwʇ{qÄGY܃«p$F(`6r2 +f5D{K0~ڇ[lÚ->>/?G"SR7O~%W[RCX_`=hL^4;[ ?&<'~ݓgv-blӚɵĀZ40pt+#kbc))'Y25@(b^-Έ$|La!Hຌ=lÇC˂`Ǜh +ԮtSQ J"=dU-i"3RiD +L«^/!֣ 2;шH*f,Yn qk1軀;OmHtZ1}ܼ%u(7 +,ǐ'TAg,xE˹etVⅴLP;zqgboV3BarJ'bWS§󴓫jm~k >2y?mx +%WUHK@>u8Vc\d"1wߘt MW0i?Y̬=d?FhltZ䷅$x:ߏ;Ttni#,ԁ z4۝ >"íΫ~(ﮕbÂjAvQqdW3DіLbiLC0(Qo7X  䬚hփ fpסg,I L.IiK m4CX=bp>%؉Bﶣg{b&y,}7oJ0&^#]T ^Y":v^Ay:߷@D; Ԑʹdt5W+&M;!@0&\y \A +t&1CN #4GZ |h?ʕG&ClFw +zG?eH0p9uHV8*0G $j8\XwAA!&S_ ixsx ªo$􍔈 ^S:vXg= >oL4yO +.g1ؑ7S8uTM-) G) +iLjpG0J6vQ+Q;xP{j_I܀ +wEg'7@%,n +*ӧ*հQ4M"#B56K:]u.9_^٣qt9q.> +C,txU| 3BF#]_80z?2V °S:*ڀ jm"W/Q3E=wunub-)L(Q9r>0׻I|Q5TpU^$qa %f_ , VhkJ淀We뵠X̩ɨB)D`%*p r}Dx%V+n71WLbrPW7onwX"[,bca=1R yc99 8Nb~8/J# e6●0BT,BkpiDLpJpޟ1n5>4>hBunα +j^҉x $ys ų8)\ +35(Օ-oS8i #5cRvU>o fEdmn|4ɮq!2$5% B7F`}"gUQП)kfAo\ITL?[zVu(\|+{T*ۘv[L#9Q5#Kԝ\x4C2t^ <+zUsOɽzaԊ̝W!}t_ C-sF*D>,#jIżڞ0ބ:,uk dXc~"MZ$u/l!c&𠢶` wWOd ZK-mLzzux4XYm?r#;WJrN^7"xTv;#Rz#Kz01f#hMߦөVT yZB [r}UEދszn9M($%yvCc3 o |䔫ZX$:ٓJBFEE1ۈA|,iq٭ >r|S(3蹵) {I_p!b;mHE4Y§νMb~TkGJ_O w @l TN{o&%XLyZ}t.7L1 ?4 +^gD]&IEy ?_<s-NS'/ _P9 B)P>4sKU8_JEZ8EŜ=ALw#KD\;zB|Xgaä-슿 +[p%]z)zAAY1'bǕ &O߱7 #q^ +PY =$%:!Y،lPt.9(6Dƚ꬜?>f(_v,uZy1H=)D6Ԫ+P~` +Ls⿢!b15ǗxsV'jIHdU`q>!WY@6@RV!@_/eGBEDMf9"T,*IXY8zA!uSIԞKJJﺗvejBCsr%b݆ EhvF[t;TEH"!l:LW`MiK,[#@Fe]8,*x.$Kjdk3 C$8@Nu#)qC@p 8?{:قH-[Dd3UKKa3?6 9d؇EP :4.b*VX_cL%٥ obaICyDѕe[ Y At'i4'[Mm8X@r&2 x7\># 8}C[;5FoHkJv&53h]ňlmhg#-4 +sdFN'&1CN© z . ETD"{Yb48J54-by]Jrc ՜f( cn/W4 +m>=[?@pqxOb{gOˠ ïYrzXuCe%J] ؂w>7RfqDR +`,lu5XiHyH>{5bptà)i r+aGZmdZ؟hW(#L0c!&,l W8h_MBPϗkux 9uQ@̟260|G6z<'S2Fr;EleJ<&㕊Nln3}ql^#V}\ƚa"['MnLN!:EzZ(h&-툘64g[za #BS @ +z5Fzϰ;/bF)3iכƙ(䈉ցVb}LΎ4C>#-+~⮚Iҳl|.#5wTBQS~zkr +v/WDŜݥ'f( +JNc ߉w&ݻn + nQB.aa lsDm"qDQX= X1[<pILx ` +/سHNBxWEAkӋΓ:e9xP1lܯFmAc4Q4lw /߹I8c Љ2^o wG]mS_9v4>W74_<:Lf't2~fY- ? !}#"Ž(WPԋ(\4$(林qⷋ>N^~/û Qd mga'5:OFMS,8}cEvܷy>ёQLBO&DU6pcD9]cHP7z@`~Վ-KB[*ː74mA'q%;Do~1j $31gפ ,xl穦plR4bʖa$($2i')8*{ϯY4'dkگS+P,n( ,yy8j"Y#Ns+b@0W/(ei>aD4(dj$}\t"&:?#jvS Eʩf"xjm" oG;aZv;g#'H[}=9.qBlCij[H+Fpwߔ@&@F'VtjseT`q6hǜj" +8awk6fe5<,ѕ"cj|񇡎)yJq$Y1ݴ4)ov*B]#7QQ5팠FNy ] bh\(C[EBYspt6\d΢ȊxZr"5Ucr2-82>1D64R|$UY(t(8 85e#N (LrQËf"iPɲ-1DĔ%8ivIh4;zw68:kV Jp T ƣ'W9q3=Z]y9PnWr3#GEUR&/d%ȶ75vf4Z}+Is9jτ{9G+wPS0l뀘eW4X8P)yWӆhP%efʉ$x#V}o%xװIgRVՌWހUe;&73)ejՈrɾz@L/-m%B=agZMպ.=ip$U)LdY:d'"aPDf[B|`zؚn5D7%, 0sd[‡wѹ*gRRPD +Ґ8sDl[l.V-ec5DSU2& +FŽϰh^jRHP'zpr\䌑b gݜMbIۅž1VroUY*PD^*kMDVlkA8(0Z ǣ/ 0NN;DdcvG- ڞâJҤїauH7lsW=J+SunvD_uS&N,K1."zۉM8n lK~: +b`4a؊E3ZSg|9r뱇 +ct큝ЅY*ָ5Hv́ylDyA’ &q*{6L=:3y<փP?%X, Ki.-X"V Mނt͑l퓜:[!C\'+'Na ~$&A YI 딙@ +Xdr mT-+J +h}蓤ؚB([#݆wwlVYc% ʝ1.XRs]1@|hd)r,:o`Z`5/샠Y-{$-;kckIJW┏^MާB0ȲGhv<3E{2&.{@:6NT.{M7B#Q`- ӕ <=1 +8Ks ,m|>P)p{·!@7pLdą>p8n,@˭<qMQh1h"tr ʲH0Q +1Ft=TчHؚ!0 P- tAm7%.~>Yף{Tʴ86 +M{LIL4̚(g>4v6Ƴ4LO5,QIS}_H&`}a"aк%džo;HLZSSTV)Z +Mh8U^`Ȍ3/tb*auqr3=qaq{'MCg ,H!0(N,Kh'm)'6%Bgf"!ڏdBMR0Ǒ=Ay,zn~d̺;gIz\d#30R;p6:bu 5ys@N|Z_@jsB%bkc&M [4DX/:u t Z*DJ TDsie=8Z^7k/kHa Z*$wmf+g`jO [ +zN# ]RZ^Δ=3 +RxFR6~$vúlNQNA:zT y`B&j%lO[Nh֝Xz$'מ1 pSȽ yg,X`.7$xyh^L>WqM%7 7 Hof*hh'K* ᝛ !H]Ygc/ `6rRP2soei4[NZ U3"4$P: ˆjVr T3 +q[Џ2qB4 Odu` x adKL^Ǚ\bTJh$whyVg4[ل^gm Te{tOܼxeW8.. +PXf|<' 7BN_yyiWf,t08)0} c@ &@'~/o 4 >{ŹA M]]| + וYZdap@5'=*)y-)M#{ +$CI(lCCA +P +endstream endobj 15 0 obj <>stream +v\-}%0k1Yܼfoy4F8WvGm#_x+'.pAHg'΂AUQKѬ'C+hR]3QfLMNd>@k#Y8O5,pмijNoX<ȵH3KAE Č>a.z 8=Ԡ9"X$p7B¤z8T\f2H@1 aHRun *}!ݹU UGMfFYGuE΃8&IbJJ ٨aИ?mq~Ah]dɪ~c+Ն&QM2㈢z$_Bjv[DUXG]gӿF4vDpYbQ7v~=3Y5q[zyzmǚE 2־GmպZg*JD67j!sU5I9>!a"viWz msX,F\gOeDa" ~ ՆT)&{A%@YK5 Ȃjz-ʇR !@ 㥚DG7xq{L6QF/+GՓPDgp\yFD'Lﴤ'8]DH> nET鶨 'isTc =G[*iT'gq|2 Q]`;[f>6h _#OT5E&tS+mc[ J1#4lLHv 0 + za̙!I9C^|,̗z 4K%$L'0S-4&{led[nl=m~F! K.: hI@nbp0y/壕$jz!A*:<?\OB͢UG +)Q@+C HFϋESX(< +rS.5ێ{0FV&.vpc>\ݷY[>$Y~ lٲBjk&]ϐ=Ʋr+go6VXN~X+ۋ!vZ $KP-}=\..ۣH^Yw-o3ncc Y\$x8JůfjJ<]kw?a. +*礍"Hdc1 ̽5>:~VrEg }B22^;}Ax?JzR7Gj'j01py¥ gG$cDT"O6{Za*p3_*췲LBNcmd#D4+v'/N]=.ݗ^ف8MQ1j@=PODva="^ RT0Y0 ^se~= /2_1KX9%lՠd dm+( 2Jt)>PwDsSȍmll3\_""Dc^^$[,HUpF V~`+Qti7oŗɒ\iNª]Vrt/acSޗ%f4˲d\k޺R\G ;A1U?r V\p|7]ݡWޢ_ƻVbƘW*/c]ibK:HɰKeFl1xB \>[α\CfKVlz;a[d+r8YlyV|1gw +Ex Pei6;>Sn;O7"4}a/*Ϙ3y*zN&lzAbN|ё/}>{bbň d +i+B^̧@"P ƫT> KPDn*+ Ky"z߿&ߏ m2֐4)F; +y^! 5Qu.2촂t=uK} d14{eP܅1;JvuN~tlؓ + `ty's}/dI\Q')v\?yn& D)wMwނ6~jԋA עݼ$12pM $ +PxQ]]΁.}!BE t0{V a8SS6^^[׆BMBb8NH@ +mQ1 0P:)-w5TTpP4WrB"SE|,z_'.FRJ= ƪ>Q qyև3%A3.=&|EV]ki$?ھ14)S%x鞁_ܴ+v+W6D[K=ؒW6'ڊ 1:z=.C3)ꢄ㚕Q(*ǁ]>hi qGRK~GK dh9W yLd=lCfY8:ƨ}I}F94#l3UZY +x@z0lAcZ" B[cL߬ + 9 G잊4Z>ǜQ!-SnH+\T zi߈=ћ}pkeg*$,wE*נUܤZE ~ҹQMW~} O܅f2S>GU,Ï/FhUzCimb1`ҍ) WWb<4XHwomx"͕[ l_g24`/lHY-\fBT;y0N NV B X0e +4eECϸH!q&ƹ<ǟꏅbņ!/bMѳk/v:9saLl(HRRㄖ*kH=l~=29c5x۪<~d<'ZG_l"c"4 5ieB9Mh);ҝB*\2er R r[~XT>g59( E|Pp.y2>闶.򤶬b^q@4LiMa1m5{dk_Yɻf0pObq_?zz=8nŗE +8 POAʠ/707S@.% +dX+ 12:b?7~+L.+!^>WJLh a48B•oNSsz5NO8/}1MSyIXLu)_ 1b4Y?ФJ +uM5CdTAf:P- XڂYO۴b+OC0,^C`/Z>kW.|A‡Q儋rB ``&! 'Z&_zb; %pvE"!BYypnPIQPbҥ /SDV UYwP`"I vh궭]C**!pФQ#׼ y/8>d]UD!P5a^ +̀ *$޽GΜb,k*Xl3*8qqKЗ+,Zٻ"ji;(WсNTjZ'u3>u"o?IḼYLolSf۟@!?%' TZsY1z{yrXa8t# +̧u0{9X"*)-]pvV1wpLeqv:mr^i֐(y^v-Ģfϻ!% Cc]Qd%{-Уc1[<'I\_/3㚅uEpR1 +׼jvxlrUtdHo`Tvq]V?BlxX*jm*Dzz֨J1!bOX蹄SZ|_gFgSQA췇w('?Khj4_#ßc~<4M -RK 5Nb[ +F|_Ao$:eߥf{Ϗ8RLU @,ŠxL^V +8,8J_P0,LyYDrG5bEQMG^$QijlYZZ!iauVaqy[k֪'+Lv,'|Hp3o6n0 nH{1%? {YL배ɧaϫ;ŴXUzTR:(6Z2C1<:nB{I +IS=r+g=oRr PI-62(]~Er>jfpn35jZ>։Ae+vyq+$mANv' y0b?-Iu}}s01Z] To\n}UFsT[ +iԄ)mK7Wr. (laDZI!h8RV@ D;]IS+AhQLc͋h03yp5%r lc!,''RL;~tϖw}ƈ ' I1fyMtbDU$Ѱ0M^il'678`6LG <մQ\:!ACB8= Y׷RA~*3&b%5%l~ER}ʥǕ))%HRg18Y=NEg؁N㆝Vb|J\(Ъ9ڎIh؆ԋ7ܾF'gSz/)O䏛*h\;y E-(t0hF$b +=qe1d+Y#[u.o9P`Yu.I4~=2u3ew2A͔!|ʼnt:%V/@}T@Y +Մ@!TYfyنʫ"](OYZvG%E|gLO5$_f$RK4 YoU.wR͙S(Q8n +@ѪimbD=^N%#:l0d)d)IUOGɛj:Ku<+VqDzSD rZ+%p!u'PDmo=*L8JMToo #$J9tjh8nPZ%T.ߦ}@X0,eZǸǟPT$Zd%4-t|䱼 LUhq#At!UP3ݩX˾ͦazмZut5LЄ2DɥL,#$A/ +̓1X>GS*_+  qPH̑8 wՒc~:CNgF~? d;ݵA.8! +[t'/Ei7w)s& +%̵a HR`uVTUˠ%0#bhԠ6~zr] Mm:2.}I7Sj! + }qQP(PX8&<fњNwa=1e3i^}H5t$bHd +hSi4u<&0ze,4q\2V5/]hR2jĒRꝡ0Ц\:rI0uGU BŦbR Dӑuo?޸a+L 4% ~AP˩25uD!IG>zLSp=!w)EAF q ^_uE"*sx}";R /&]guwera` N㗺*ލ?Csm_*{ǐ.(Gm]1eY񌉏ʒOzXd58 X>d~ao^7\ +l;/@!<<a#*y̾)Kٌ_)YA&d Lw")+(),5@+VE2ƈO(TKim?0̌S=^RP(h[!T|5)V˗ VT#402v<:LJp$- yFH#V v>hZ(YaUxdP e5s,L`٭Ұz`sN jk!½.,`hDŽ,1$?,pI$>F$S_4\I"v"Յ%nf<+ +XFHj`ξ#\]lzA fy;A=_ZɈj{8HFwp[t߱sQ**3S"`k.}:iD&5ED*P}\bp$8xRQ@{@h[{vvU %&I(jyo}Zq8-P7=?nCx +Eg>E'}Qlnb?lY > -Є,p+mF#Q`6/S(]vI~:ڊ6ֿ;4RaK,Ajn!ZK E\kDύJrT>e?}3$Z_fēDW:77F)Օ_],Bm͘".v%%]0&"/ÍЄ9l+p*xܔ>y} )o͠48i7RUϳ),GXjs\BM#X683tq +D5PyK< \vDlgW) ??4uH1-ah1{H.|bkODaF痼YY0Bg10C~0ƨ8 ș@L|eT +n6!t DE! +[M}tPz +_[Sc4`K Ft7}<'PG|z9#_3jژ\[GvpKNTkūp˚t)oION!9Du&;rgŲ 5 1.eѽllL%ѓ] %ZO` "kic/ЧH^c4ޤ05 1tCh :Y#-W܍jxciO虪>P,렛ÖhFX2v +0Sd|ƽ*L+nxa`* +eͲ*[4DI|ihbLSm@7F! h+2I1z69]GJoBSD"!v/۝` bydEb9aR~evF`OqgdSm +QRQWzQ`\9W}B<_ ?KГ^yڔ-::v0 4Yf4T&S@ knKs^ĝ2+.ewnǀP(^-5nt0D `l'¾ SE$l@80s&MIh%?K0J"i$+^'u Q R} aPP/tmit裯` ܁BPMj\됸(RKлW5YIgl ?XH+eezQяiORx%'Qi TByY(8aXA&C9ESͱVbظ T/mX5/*|n>*41I%'I-J_K-uG'L ɄDYB]kZ~țI݆YΡ>Χ!:%랪eT>RAT o˛WZ#S9A+yѮu(C]٨GT']N״UL('N9=X ҷ)q\)LUP\ }S;gG (g,evlف|ПV͙jj0uM]ʏ\9V542# +xN )%T jԃiq:>|†Um.rji.S\ҳuii60 +mO|xB +Ɣ΋ZqȤm ==";c=rcȸN=}C~[`s?LYg,;P}*ϯc2" +|Jٖm2 w:e(zg #ՠCc +wȏp \V&yhHHDM_[l* K"蟶~N`'Muceq*0)dž(EJA$T6gJ_,T1x{Hb^ |θ̑e,?7@LVF$D`_XI .q4'Y}cl"gDdŢ9fZ$+OvZ3zfu#J)dDsA6n֩io[8}TU~4iaOg4n,5qzS2'|9mB*AJ6`s'B=m̰%">RЃɻP#4mto DMv#*򾤮*EPFΪn/yn{IeHtՍc1zl!&+hqF>%\t$D1o՘~h6 DSJ!gcE7i)&&jgc?~s.Y`VȪIl= W=05L U|_Uv^%^πW^WUW8̿j(<АgD<ҪcYqoA[`VFDTt:%.UJD'E{[t3P;h2SxF?>_WB<+RYznrl +X@1TԨuO'"00X>;18c`Lz}ctG48!r/eMJ8(ٸ0&Gշ }X@eH͡LꙐTca8ƗWZ` +'Artu:?<຀W8EG +9m)nĠf6|wrX@)u^IM2+uo!A| yWjDun+ ,oAAI6> fV +ɀH^EW!`Q#t HU$A\|P{|R߶ +xN=X&UK4@jKP(.5<k +4v]kw$ a_ۚZ'-W˂VRXPQxG鬍틬(%ۍL{X@LȇlJ1}=Ͳ.=:dKm# ]'vFЗςb?hcH!SbAfRI&r`yU+odHJ(}P=r^~ώ- Cg i`Eì5”Gr4B;UTp *КV!cjpη +"!+ `݀"7cJG,';s)N`Z ;ڰ Bbcd\0ڔWbd:f)oH -m&rjgdsv,Vڔ݃ U)-\AdηoaZI0-iZ~ct?i*DѬ|D-W\'yWm-"*mՄmGcvX~w0mU~ UOr,-˳܄]9e JFⲓ8:,:?^WŻsuFbSLܜ:"l)Jv\mZņ>݊<+ö$rwQ3jbڵ >lčSb &2P@,fmEa^u#L?qai@8S?u@k7, @,-{pdč^;Jn=_$a !P4-r̿~>+ ]*ec+V{ UڊxNa&()1[ŪoUȆ)SgHXR|t-| RSDX@px֭-F=}VAmI5RmUR eRh鏂D[^Ke[B>5pɕMnFa: Oп~V"S t g5ڂE73 VUduCvyjyN"Cބ:0O/c*bv!I aVPm Q- ĦOiJ­nmczA<#^iU2_Ak2=R6d%3o:@P;IB17iml(%~ȑAtHU2-8b{+҆C˧<ŊV;0?&T8 :FVOܠU:.wfZ, +m;o K%lꅊ^l%:[ +/{`Z, p4O.+aR6Z5 +3߂:+D +aЧW+mWٲrj}fjVxPJ ]}pe]]RlcG#dEG8BSgW=Rȩy7PC$:M$F, zhGWk {M?KGh^ "Ƥ5DD,umF?R8+}xd u0;8`K_I#FNeP, $F, Vu oO)jNOE },&/#DxHe+(qLeM=we, ^e2G,c8 iw3@B˷Go2SaF`5qے>2+! C +r He.6Sx+t\ JaU*$qSNY̥R^`j\-7*tiJn[q;h?E2PY5, -hEb(щ(^V"Ç^JE,u]N Y pȂŗP "K Fa2)6DQVUŇAbk*_.cbJDPSTaz:bҋr&,,[# E,u\Gשg:˱u4y׀",=%q%$ +Fvip%`t y  6/w"1e-!឵#X@^_MD,uwY:'o{դS{Z'e[r4;ݣM!$F\Ze<\ 'yp3lX _;7[G,цRvNvE2] ޸sd#X$kX}yLX P #~# /)aHheQNnQԗQ<Sk}"`ƮO49$% X@P-1,Ou >/r٦NMoh > #  +Pw|teY>_;El"Y+l|J=JT4v].M'?Tp#LG +@n%馭$Faa3H6ZwKi͡q>3Ua,E4X2T(y +CBq8 *$k':2Ab:*>%DSn,U~h1;3n'Y)2D}blR++sx`6`Ʈ am83>ݟb߸4c:( aߴVNg5$:ģRxi%1tdF9LF-HTh@ ĴD n2]W_TnItzهRnm,[MB9R:eNSC(\ddclr-}FQ\>b–o;4v]'Ǐܳv"fe/6] D$SDwZ1wBŃH)ׄ0r)|uBE3~1Z{L1u'xT4v] 5cTpJ9`v ʳqTӉVW895# 7w@&,]L +tֈ8{ލhy"%PhulD\=`Ʈ UidUᝍ\m: 9qkK9=[Ao7e99AbkX@y%-52w d=0JI:G>`ƮkUa=o&<e*%ũW4XwEW=1ӃH\Eq((GM'L,Glx2ܩL/p"( # i캰@@H\9I5sbDx֖͋E2LR|p.%m 1`oLS`r(ӑV~]b8ODfxYWiWK^ApŞ,9\t( ԣ|rhIPL`׃HkÌKi=12i<;ʧQgG糘EHϬ4v] sqc-Uh!W!d ŝd+"y~1Abk5JnP0$›} +#u]BYzJ!cO;ϣiǀX@ u˔B D_oV?>[: +9sg7F~/҈QqAb<24ȝä?+|3d}i0QZczS iLceY}d G` ;}8C=!`ޘ]}MPntPšWs=Î˲=Ue]![}f%lUst@#Dm1](@sbandhNB,5·jrdVfiS`fiπuڃz!)7!# +¤"SHӚfī??s@\4Xz%_I/8Xx}rO$,J썿ul4%xdQ +AbuE CD)ͱw#X@ЕZ"\z{ǮڗBp>uxtI,uh +'cω1ht;0[&\I>N21ϝyԌ(sFܮ_"Ȕ3 튆[ğaAa5!0 ɫ{4Sc뭼^}I[IX%azp0z+O0sUp | vbښc`FHU cA8e[cC]WNQ\b0_^`wc e 8We^g3"l9Tb/ɌbOyVTExʲz)QMtd2m'GlY+*8'9tj%>[sW g50J_ݨkٍq +; p%"UJdε@b鲪ÚXa)A*]D5? iTv'2HB=<åh:z]QE}n.6<1K׽/'_S7P3;(ug6ȵdZ##19nA4R1#Hb!#P} La*0/Bc!=be3tkĭD޴Y/NTHC$+rY d;"@yq4 Ãz)2 nc[7w;;o/FQCR꿧Փl\"zCN;"ҊXeyͫ5?]'N^D_נЃG%θ\, XSSlBһW "B{'ZͨBOq2n8s +?l' ЦPH4?IUmC Kx)']D\6t]dIB?eᰀ IY }:K.:+7hdW+~bh2$>{O.3*K+sGG̬=ESv, !452p0'jCaak;)0нdsS%GHɏ7:Pط#Bˇ+-|ᦞS|l?@ޓ<[~ގjBa%0U%vV;ϝhaSmY\(~ n ( ,be#XKNyCލH!piSk[/3rn5᭰FU2 A], 袃/.GM3 MmZtZJhOFnoo-'قV"s6WWii.hȆ7}tg Nk@J$R]u\g(+]߲9vPUuB62`b) +Rb.b`5ucH29"jR,t'Yiw:L~j\)*"7dJoʻRQ@ZC*j9* T@QQ?;+/f_ѪSc +p*W>I^|Z74L48jARX@|9Eu,E?g"AV4 ڑ(qoՆ, OR:Î w>5i+ # |XX2x.Gkx'Iu<_7nb, Ρ -]2]+ugW]2{@=/t6lQ!K6Eu*FLS0xB#># vG '1ڣ!= (WPa.%d|F +L j :He.~zxv8h'Fƨ&2$V +gGଃH=?T^@19, 0I9Db5ċ΋4Xr >.:dhyLl78xޘpXr8K # +Pk2HW +?$V,^\MK ~uV}4HT,Qz"ʉ E,ua@cܺ`F OP`Iʟ,LJ6!Z$8-!T0J)Io(ޣQOik/N~E_# iT9M']&MXn'RI#1*6K ﲮdG# F<$J8}z j b8"=&rgvh f9wM  +,D `2]WJw:0Ik,`:),abLzDJ~ѢǣZy@Hcr3 ,X}ir? ]QQN4v]]&%3@ߑk#5y}ˈQb;Wv[BLZ$Fܗ@|@By, *.2P2 h)ßI6e~l(a2]gX7_H\FfBE\2G)ujrF{V?)0_Z 1w` voʜXNwӯNmӅk ߇viZ>iLcew.-+F +I4_n0b"wLZ7onYu$`^])Z( +QJj!_ЍX@>v!¸ ҋH=4v] 'in'sȘ)(:t4^AlX}{=cb[1sô?͋: -% mCѿ| =`]Pu, C WLYԮlUAh( i(!MFjH+;NQ+hk+:>!/ PI:lp*hۍ]j/yйH +? @,yԻiHMe~,oZv Mc&Ԇ0zsݛE\G}ǹ=ЩWU@%3(48cŖ0R:$:]2;`{dj:&c[U"CCzPE8&6'oI (F Uu>\{K'Gh~!)x@)#5|캰ֈzLxQ +K{}uDw1p@Ԫeؑ16u'<%dnsMU$ۼX@؄69⨷bC1plkw.HC~o$)\3H\1o:NZ@ƺPnCu7'KR!ٔ*:dSn':J[f_o>AAYI]+\r*=@]' sJP&wvCzCbmtiu )u샆s˜Ѫ1o8PLY+=i7G[.z@Ap|)$i0?v]`*Πܩd` ~Z9l]WU5usV8Sc$zo%9FUV7L @59s<|hD$4X@C؍Qa8{R:91V$ ,u&')>2(mȠ3ŦA^Q +>qklV^ugీ`c2l&GqqtQq qƑ7aэ$O3"34*ǖ(v]Wt'p uhX@ +ӑj3DqRgɸ݋_#naչMKNdZ,P0ei1 sxnX@]j1׈NނNbx]В˞iݢK8QOm~2ߣsًG-ӆ- .D*ri/BR]9 3NCtέasWGbjpJЁ # +)3%ғ& /I C`~lԎY,)pXVǠz\޻j'ANk~v7@S~FK<9y<5_b, (WmB-U|C 9!MېtDI )L3_ V{V|y-*D|VE>;+켛ODKo\-vKpW&.b~F0X+\ 5w]A3I*քϰA6l˶X@ )dhh9%9 +[|l xeCS[f¬\4 xnfU+՝4Xz-bsN͖[й U6phx7z.m¶AR\3W +1AJ ڠ, h?j4i)['e8L49XhdX׸Ol< ԷwII2Ba<$-Ggyh,vV@)ú}ֻ[,_dCNk_k$~ 7Z0 ϩc +Ib]#G3AZ ]Q: e[5i* ۭ%x^: h@&< .@*n ^4Zt=#D%c $a<&s- 7~&dQGRMOgUDW?`8"FcAbi?1V$vk5!1^ J+~:JkʦeT"?9[SV~$0?65%̝Z, [=d2ݠŎSxcB 򬼼i* n;?C59 tw6Œɠ F]v8R!GVʻ;gGnְ >Z^j7:>jE7A0Wi'?X(^{ }dL2)(dXʠ2eBsKH0cjH-+9.]|KE8AsM$iDk ?I;3)Rmb wrS>y, Bְ^OdA{L8\pi]Wr=q%Zˣ_.͠*6Iz#{ S, p7P9fE"`4gr +rhqyGb|I藆;Y6#2cG,@|пÌ4xKv E+zHސr#R:·Joa@= +q0:I(#qb1NŘ5ⱀ+ܾxmjF<`ץ,/og7pę4MIWh ٯĹؓgmtרrd;'LC~k@ Z\!ҽa'uNll\*[?i2p;CZ)ݧz$Ͳ~%Zm38 +=KW6H +#ʁ(*q Þt'M |C<~1^];$i ]:ء TE|LB$`>|}_]QB.dl}Xt[Z +5h%Z>D]X0dN, ? +G&'Bb 4`׵PQ**[B5"'љhu6#H

j,ץ[5EB?(b0&/Lr5ui4||;Q#<s*-M"5b,J܅Vg#lR*p]JhstB%XY6uP8\;md1Ѳ=$]fM ikOTX4ZX#'L;*!?hC,5cy+14D9^w!ZՇ~5+lCifʈq>fn0,[z,'x̘zS*~Dv)$ JJ!3-[]ilV_Zn;g8sO:jGh 33X@@IzDB4mOU5h1*mrZw[Z/e 9f90_sXF>d;^)9c;QRI<b5dxI6/E-" Bk9&t7cڰ2g{}plPEp +1eLf$M ̒C:p^Ծm{f |!C->/>Cvӌ}9Q$!AY.ZwD e(W<^mdb(^7vQbIkBaHgY>cX؞dGc>Y(bJҋ)gN!#QF~- Ͳ.5 |桤^*V *?ẁ+HkHXJՍc9I]8BFyz>Եu$wۓa) Ȯ|P!IiL;~6*)qod>z{R¨JO`WX:t[; {, 7P]:G͉M2^$ +G#UNfFG喽A+[ӧrGL T.b 3xk$Q*kFE&MbI\BЄڍ÷'8GM-@Χ܏@ +ͫIbKd Ґ5*UcYnT̃Oym9yV ߿rH;/mo*5a¼:%pk.Vk#>D2; J'Wĩn QjpƯN} .' r5lJ ͅfra?;MVa>a7QQ:?L*9\n8&&[jC ^ᛲ TRgQ?b0Ha]6mZG=˭,*3%N ǻwDfÅG/1 +(6v4$ +'%'B˚ˉunH +@>:-䕽F*<3x}D ;\ +QSӏxܠ3>WMH9G46L&ɶ=N^2(?IP?  7Ȃʓ$x& tfJ&]+w9{16OȠE)ˊ9bg8UB!r8U822X@7Ve=n!o*#!=b _|NoE3\<{dQ6aNYPpNӋ扪]X@P&+X I2|s xgjǞ=DŽf8b*=_aJ6 7ԁq\ Ww'$ o]k Nx^WiݔE]qocA'[`bj R!ވ/:ɷMI|(Fk&q ܷ%)KRaUҴݢdYql? X~Vΰn4`czX%LuߢQ7`4g!tk}Vppi7WSVLM΃+l:13mA[cҭVp-vFEXr +݋Z3@h <+늌h@lT-Avɇ{GMێSJ*bFL%_L\ +giK"G ip,r[8Z[4;#j ,Y|UrK)b%c8ڦINSpd,NDl۴)Jqug, H4&='OWĈ%'^BcF"ѫ]HF`|G{-A}Zgx(#- 2=]R\z%hpŒKKLҲvZKPn52 {ReW{|Y{H Ne%Yզkso59TV &nž%#]1JAGrv?$pKL҇ tIgr9%;E}'$v5z )Tw O!7:.;ig®k.^i&v;ԊyQH}|g@udGӥpԉ kd7,\!,d9b:*: EIw )aiIÎ̄U zH/v]KNÀ2K9Hc,R^B7tRV#b+5.g#/ xCXY6X@R^k,қz;bJnKwEal5c O*qIԢ’'U݉f^Q8)Tg-q *xɅ`m0jahD@pDtztbA[XlH+Ju +fD*cdu%t.1͈NR`3yZl XKw +AMDH?Eq_a-bE"Ba*\݂"tN:b2bAClHkv]&|JDKgWL&Ԃ;Z*zT&RϥGS,>q7*:plb壡udM-gn' ?^]d{HY;98YL07)7!Yv3 t[I!v<'YOrl lt_u:'Bڹ0J`YP +.dz >my9[Bjg ~"t;'F. :}?> hobj?Q8uB\LN(qc]3ŋE2`]Hxv +6t~÷.d*#j8E5ѰJt- +!X@ilB*| +xA(hbG +|Xyrj8yB2྅]W r!i1uauВkza^@ݦe+ z Ijt){eGƊRq_ujZ vu(J<ye1HAl_ձE,tXt AQcH-+C +prq5a4I0'.E EXX@8Se^9v04C(\(_ܓ8)9] "мG}YէZo8Ț:WB<03@w5Gc, HsGh+މ"0NzI}vErک× @,p]#勂:١+T|R7NOI+b,&;O@M1pd*'ȗ'/C+:dQ)Cf|#iQ.ФX@Oc1bA{hubN#A}LkQBt$sǚ<+jM&[h(:YoAd?Vo:7zFISW<N8Zcx'qA`V.>bɢTXiG\LkK뻌U]}t:܉uUm, :Nta7}Ƀ_pΒ?ʬt́;xyVX=vjl5)w\aR$'Ԕ.t, pCƿ'^/dz݇Av0r!G"8#ݯ`GRrGTrᗟ)…0ޑ.-0fJAl OXIB-~cq?p6*5$JZ(s_771ccARRx&w24I- +ׅu\=O1Z9fjnsR/s+?̜zf6鴱 \I=3+fA[)EAS%xF 0}# +;I:bfS9 ۂ0ZǂY5mPC$o< 0D]xjFZ\tWޯyt4 +”d3y0:罎MjܤuNZ E/L;JQP8U((?w-1 J5?tcej|V!%9?;OF;WCUq92"\i +9VC c"W+WKls$00F'8T 6E B(VhL"zvh JI=8'\M,Hf}Wg#sа *31Ps6'=X@@8h& 82J|vv:H8,tP-"!PŠf d:+NG^ZEO:oS+phw.sqS8(N%Oi?c{n&= YfD1WZؒ1Rm0ߌ=za~z%`DWjO;llv-QwUio1#mD"bM:;L\'ZÂM; b%&:|@.%&zY]=qh2.*R'0QsHYmx ~5 M[\vh a'z7g6%Li3G9 H[j{E{@(7|GJR⿆i8lʇepD,sA١iL\PQ\HckrbMx xw[|I_LE;s""' dF@Wr7|==Y˱-:"'B>% w9Ѵ !̈ H!Racdyβ2>n6 q3}0o4*83x%#(@Cp}MI9㊁F?_Y14cG_].c^bÃYO˜{K;ɋ1;k}@Рvץ\yhH=J , :$/" +G + R8րP`jDrz12 +S\1%lZM@3)71"1t'\, $[kRNB8}ň3t :LLJ+%[ v!S9wd,fئ,cA zBNdd&IVcWE,*' +d مgs4RU19MaVkd$=X@ _ҙ7eO ?K tHA| +m-I{[:OM`7 եk?pbzVxP5`#s|km,V @mGԎCEyXL@g x`JhU5F&) u޺1 NhPVhA=;ౢݲ|O+XUZp0/f#I/|MDgᰃĩM Cs<`vDxoq_b421OV@F!f!7N-A;Z5ˎjSJNjQAWW1g`3"@t Nԛ$$QtsT?A\Xg˾B@*1&BbMp4軳8"XB.fUX ?Ф܈X9lz끡*\RػdwT?C5v*D($j¹PvUC3s cV{ N2 d@H>ꌼ GʻEÓ𽍁u[ + dMYZ( :@pȋrn+wHy?A{1#}1H0P^0b8y7Ƥ͌q]|!-nvrb_nR~darA/%Z#9ܤWb\޳ 3%WHGZ!yt^eѕ {CB1W㴟bYyN1  +'e-TW3[[y@vcNpY\[)X%dBB (oy@ Cc@GºS%bL؄*'A.eR=@JN.eŠjYB'(N"/*ɛ+U8%ܻ3a"h/qbi:BM( }0VӉֱHڗ0ݝhx5Ʉzˬ$B6;yB/w.to-!p*UXt_ՠ#C$%k  gXЅn#L&;(X: !;XBx^.!'~R|P[* +RKebCgb}WIo> +IxaKD  ZQsE[HyzݟCx)#g?}<._&7{ OZdc$wlsy1\XӐ*Wݥ m)WѓXzs4hz%dz8аbC4އ&9c\?"?셂!?.Dw<%N8 Y)y4Q*):`_=\ǗRD֍UFI3SfuD'^!|3tTNem2^,l 0DѮA pygǤ(D (y獕.#K]*Rs+ʬ>S :\I=:SĒJA[h_K< "M6EdžQ1_JΟ'\1/)9 t9 +@+Z% n:Ui7KfJy/ab4آ14 -K`A8AlZ ^zP(I\2+zen$P w%rC?e u}6 }FVzb;WfchX@ jX>23@a\ƞ% e1`6W 0l +`Aq(4(9y(RnGwX@|SU'EhB\gc5C0:{nV+`y)V +)셭1? 8ʜjѭq1 eXpK| S5@?ЍKa9R + a_kNJl, X12񀒆Ld^f~1`\)|<JYF<3 FgQ 0Fu"Z6X)fKsHF-FR2S#z#i-쌿A1V|ϘpH io1Џ,R%';&xVU&Yu ]Zc{*|s :3==s>)J>"Z,JI\ز\j9RxjfOwC \UN{TlNT 0x6w%Ĕ|XC,2OEj> ;euy%c*lH&Q-оWR$P#|LZ%+IV3#dT1@b{se0hicX@kR;F}A)dj`66^t-jL/Go~MH_IoObbX@\c1藇\/@RAI-q볱񄸻 wQϢ ,er6SQ|!$yIg@X@N|vRJvvj9l6ĩ `Yq"(\o5,tlMfn{c#n0cbX 1Ȣ94=2x +UB$qt>K182}9dfII߁[,&䣐hЂotsX@;V'i02K:ܧ{YY.Af[]bqDdQE#b0Nbpi -E9*F$moԃx"Q)y {(A%=; +S-6$csI.V=}H>gF6|, :otg7#$(5 |X>FK=溕A%/I+AGY݈4I |e:B@ `nˉO fɞ)n!/ItNFSBфdͯTRû`iL+-A)zX, *̆ 0%>!\X^4^_D(E,~۹rE~%slz ϛr§ɦZt2^8%0@^r!0*rSuN-BjdP`&L/ש 8پ|I~ ,+Eȓ?FXBXNG$C!=L|áI֙ G8ז4׎ W` nX|e\/`i届0"[>Z Y6ř3EݽZDW"}Ru2|IA#şj N3Fuq_'Y 9[ CLd[HyOGNcG]\ۂ&?2ӫu8}d fYF'JupNjʰ$OԹ|}0 m k(>Gd{:Q#Q8r/ʗu%ʝP Wt1  t\(p{#d알9D؊-uhV]C=_[\VC|3TɅۆ,ObR C.MY"N0&u 1#qDηItٸ#K3  /];iQ[^L5c_ͅukLKm}rFIM alr'ƽj0%EPha/<M0%[55ubh + <p?OeEgu{MxqhUI)mn m hQxw N}(T`t7_Eq9C3`2Đ1lښ6    , , , , , , , , , , 4d%Cr_lIU1j[ۧf5*Q~#?įFQrHm8BS pYPBN+ `UuWB:Nơ3`j"Th;Di YaDzUY, 48^Ft; 2t +G=( Mq]47:iqҊ^, дz~ՉdswM!kϲc\UjtZC['L mR:jeɦhLPc H=s).IH!t*S⼊-T94XTRԿcJN H8 +bd%P B*K{ 0=$au0!ZT|z鲨XCUxyɁSVS 9ip&jf+8H'yx9rry`a̦#YKF{$2)Һe&Y@ ꍃĴ`k0 LiC\sjz|(8 z%;,"@ʆبz_Rl|WUQ\dgRt%& ,w^EmHy]uj[OJJGP60U YxWd K]>Gr`O{~k1WD*áA)2ڿinC#EM:1JǠBGN9,پX@zAǦkP RZϵ3,XCv" fp1;5v)췏ߗbJ Dr1g#M*Kcn0N*e hN1*^SD+bgKf fިýj;PJefH2Xp6.t`JP7S4(%sp. +jt? XU`M{B."u-!b_JA%`?K si`=5QA*b4`14ԙ%`an(.܊Ѹ9VѬe [d snJGc'/56ټeF5*wU$. b(abdZGiK·kF@XI.ꬪN9 BDri(bN _՜$phe]˩ҲHaJi\:z8ttE4qiޣfdG B}͒tq6TCWhjJw +#[:<jR0ӢrT*W>u7B!nBsxhE<62h0D NTFqK SyM, U*U$ճ靃p?#~gN!D[L釥%CS$i0lJWb+|]=}D׈Ks!MRXUeT']bG)4ҢHK3w4a/c$   VTk|xyl~t2F/苤LLlM_j8dOW˲VuUA! ƀ`RQp1_!ŤVO)B$Z5[>Al'*i JO `5U]׀S7(\!u[z"]޽ ͎pd'73!˷ʦaj.N[BH +ԁߜ3," 0>IE1նj`'JP $aX@j)fŠ7]%I9 #'Q)6Y߭!Ȩ1>!FOPg1NQ`, p "Y0nBFX0h2jr!}yOM4uq3B_eR"qCg..JL (zCA|4,1KJɔ ams*JeDecfVYo/\$7X@}<*YC{)!= +W㐮z'3X' ʨ`v"eB:˔"T#@(o, @CBo߈4xeLmQ7ó\h#%R2#=|1^ 7N9XlU/qHGJɶI48J~WTw92! ACQy~9qȩe zDA[[b~ +/hv7a +~x$-w?]y8kX3% EmV(a$! +dIg _ƑX@0d tkt +!\drOdDzZ~WV >R\S]lLqTMc`aT X$@Bre!HzR43*A_ F KQ-P•!Lbм/mKNŕ68e/pYHjttBN 58rȁwvmwM]bnXR&ꚶ}lIl8*׶5h!t6t/TZ&niikA>, 05c2,7y,rB _SM&+J5Ęh%8sP+<oAM 好ai-R, o:\c"ѩDn&?4ݤ)\}%IpwL!/E\|JS uǛ~|X@9$/!ʡd0RI1LR!W^'1%"ŋLcC.#<+W[Q̫"(vΊJO_3oJ{,?^ QwDʥHލ.TE8ƍ-gaXز:(kosV_NV6#֐i6 +A+8LG8򒡋A- )X-' căTWjZՕ-h|k}_SZ¾ƌæ"&;'ܓ$!f5,A;` ZQ}Tj+ A4xpA.vW +ºS%Y ad9U>='/~Qɂ)K8t? L%6ΤCP]қnH^ۆ"J{D5O7F0IX.,y)>`zxG}+ ;I7*}AB @H4o/l8J!4!pnDzNju*F^^QЩP(wWd骁ۋr93Et"2(ʚ@hzzӇPҾz(;vaQ )vء_PiXK-1@z:+!!4(AN.|:',$?$Ez 4FjX +W+\DNHVV+ +K՚SuFrޭ4k# ٴdYRHr!)K~V4'3b;Wr}ʎ*!^wK2;ñ\`d<|R8.|z':LJ{*lj5KC ,Vf<n1u>L69IxPݩQɰj r"S=SpEY7HI~AS*Hst}ai?.0 +Q($ؚg.9gH+cp[JFH=ЁCl3 VI6̫яЃ_v ZQqX@#4,9+#'+lµBPXx~kx4vi ЏgA qJ={RN4TF𜔏1L<>ê&'ZFWR$DerNIVQ E|G[I!kѨg]vPf)5 zzV, ȿ1"˘!~n)}Co]ς=%C` +gzc$m6+YE/IX@:oؕ;8{ z/9?ZڋHe+ŠkS5\(i/Oc5nPYƅ.%%6ߖrRd˟Xi#!fio^#VgQfD +Rf=#*JbbGU/;o^Vb T8VdKh!e|E,9:1Dhape"e#:78%TUdedKgRW:0vTe,YX@=.%]^&AhƢ<}; +|Qt^*FuDM"!HQASrk 4DPtc,zxn|_kUf_5"+$D2<|s ,N7RfAT.{нƌefig)E#%nX>I 60%XlfcIFo +10MLHb<qD|@QZeU . {AY=1Po@{]#]3}Z#7c/k_P[!ޭ;f0m, 1Q9KEԜwMffq.ҡ*aj dي~w'XUG||4b\Vqxx,bQaC!^N^Eԃ35(>GOR ,:;%S8 \l˝H}e>p4-prTjY8-P$Wmܒ6%f +DF& O8I!ǕrѪSzr ֊ݟb294,`&k\LiL-Ajfj08!$ %ꉳoDiBN͉/8i3*1&^~R3e۰j="H;(Il$ 1C֛DX||;K3J4aBN܎Vh`G6;vqqqw\#"!s~N}5I&r_LaBa$CH+]cDXE_"3Z<'i>eQN ?^0X(RP̢񕥔w''4YЯKxCj K@ UY6RW.v| Qm}yXcA;3]Pd#Wu ʼiEd,mȻS\#Qpj.zH}(#e]A/.xlK75nWB=< a٠2~_)*e&TWnW83}eP͔a$PL544؏^k;S|. +^G +` JڈV!{Ix=F/èwVhʹ`0T栚΋be(Q wp܋Bޑ33`Z+ա .L{DGlX>?, 8 ̋rWavH_bJ!U0NbDV$ާaUSVV;1+ICr8s ;\h 1V۱hAIN$,q=W(y(u{z }[tLт!LuGCP9j@Do伫e-O),X" TC3_zhgWs5$T`ɲBͮR̅鑡aBɍHOee +? ^sΖ.vo|]*> : +өlVHEM  pqeCaĮ<(l1Amcȣg;3d ?29=`b/9GR\6;gQŤ33j + ,~! ݢz4e&.` CcFkB +\lY7䚸 + %= oA-x{;TۢkYC8Jrn9b2w8^E^V8"SVRnJ]cjvr6[rZ +R ƮQ)e5I0y1rqPE9"s^V2mSY-d6\qJ(Xhs`H?!JaOPL&h7\ґj H+\d`d09Wۄ*Y'.ɤ XZoT44yԗll*㨷,k, 7,CeX +x*"qIS:l.ZN.# -ںkk3GI+мL$”1t{yĦX@8Gli8vu^<ȫjgLq rĘT U$|IـPh,5Lp'$e0V`r&S;B[QU^J!%;8``h񰄋ǢZ*<d H/젴(nn Y>Wy;Be5b3%f*J br ] ҘV'ՠ .Sv!cnyHDK`}R?eTʈ4 ESH]q3{|8K꾩-aI3OF"^ +(\ Q!V҇&&^ +z]!1By Db0ld՞ 'BPn:Ym{`6F2߄{T7&x5J3U +bN%%"]!u~ӑ`1X9jX@n㴃|UcRK͂Jh(L2W'bdi/~b33VHёɩAoԑT0_X@P%Pڥ +rQ2䦠$?R[tS*_(@I?\1D 0! +`|9}Om˱j, xrB=sCf7i#TØڞ+IB5%A `FZԣc2Y8Z KbA]y̩^Ee8a|X䄃5⫤8k7uC6!i&Rj\8I,O;'ܜ3} ZF}Th;SI=g-8s3qѧ;؍ʰ-=睊 +3P2%`!ub5J1:_xA6A +Gh'!Ft׊ +#C"2U !^?Ѹ(-Q3@bDufV7+TR/yI$Yy{!$SMZ"0vKTt0WO#h*C vNĩlՙd81)1!uu,ea5ښ|tPXg#[t%|:po"FQ#2sq3QD37Mu!3těǮK^"+ EP$"EX@BG zpBm\$o$ա,JDc2jX߇WР&Ƶ=3 /rt oY UT"D&u]7lM 4y IZ0#'%pzT}XECCíX@Yf|^o " 'a%U5%tL<iN( +AƛHX@OBOˊLgF+GO}S9 q<:x(@"ɯ:#B!ʰ{ODFiQ, ZNW33c)C>D ,)de lhGF[#@PTB o,"۱Mqo, HRU@/62}3-yl&ݡ?$js1dˠ!K9EtdPʢ*4τoJq'gd(Ι\^ffmR4u}Uac2#lppMbRp/JLV .p_i\1$'9#M5 dnBuόtgfmn&a|Eu| ԔzZ\3|.&؆\pVäGo5@ԑMP| ~GqvA2%c IC]e@cv5rI২¡aͫYDflW:mVu!4)q, Ph`ZXlR7TϩSGkBL)6 NOQN%iRjiO)F64jg&@=m *fM%C\Ip]H4AڤE, 9mT70j#=QDUo,l7"A%zKUP.mq2+NckFbA.ѭh>pم%_t0G7({›H]V%v1 +{Lx+'jwFK}̧Y<6pCE,&a?2T4'@32AGy4!Fh:24E,((* z^ <ܝ2O= #03/{ya2gݒy)iFa6)f˖Y c>r, \hVgeVHCgӚ$Lx>u5gQq<.lމρAFdu$U|>vM@>X %b81i c M)l ĭw!89+g>GA]SO!a&K"6[cwNPB,ÿ?Z-SJ$a6?LJOJUb8xđ*Զz?#Jݞ (D!9oGk鸒QkɿE$Q 28tՀ&|X@pr:q9T4&L* ipO|5ttUA[/\(54̇(ӥF+ޥZz$^h!YQz}\ZIu.쮊&8 :nH "yLuqܵ+(ezcbZ?r+J/mU'nz)YL`hܕA$(ѿOpF{ٞ7'6 gIV=BvImp6{ fBpE"וgi{} 0/geH$I_0C?> =״:R*HB9}VX6z/Ma`Q,!FPl8D(=K֗8۔e+(ͳҤcñX@ZFR;5Qy]9w-żu)`-Y[n +Dt0 ˷e +K=`iP3e3Ft-n@)uXf X-)sx:,'3-őf͡8w1bae;ݠ.Ï $.t\JbFnyW\neQ%:؞,Z +Q\, POJu,b+LU4̱L" z%f렴b[^@S ;Bq#0^mu`JkWSQfյS_:vn>^,/OUc懎CIK%cA razeS%{{&*|z`)$ >'{ٚkr0ݜs/ȠJR, lq" ++Wz%D_iʀU2ւnUG4F7=0թ2ZJS4\|YG["ρt +uip!Az3# }i0OplGN> bY5ucɦRc[G' auLS^Ʈ+(dX;? Xe,'n%y9 F^V"& h lHoCdX@@:/a62rd?6ǚSi.Mm2dG+uAΕ='@}M\J< + 9ymҴ11D2R".Nvo|WK(H)ظ߭D${ ` o`MyJ_S*o m*䃮9ms, ]pod NQJ "Ƭ=C-iNM`H"~2 r/ZȱW<e!6D/F5J5"D#Dx!Bcˉ$˅?I񚓇"j mHXFHH%EuwhX# a>lNh4D=GmDss|M/>X@p&J{3=[WGNB`hAԧN+ Uc)o^3ۚpDJ>fo9TNl>v0B_.t{ӮM$`U(+iH;JTG _, xAFN \B&5r]?9VNB a03 AuPVgnR ?Kʆa# TpnH8.uJI#21ГP;"`hd2x4KH*U# Ìɚs/ͩ 梉/wMHKٓL8g` +ר֦8?j8 11{1`'V {n"C4:h4Vp(/آbg-Cs? Ju\HdܔT~2H}/=/1p  Cpμ~ٴ^XXJ"1瑪/j9`R"gut)AHwe`3yJi52X@V K(b㮦6?)(1#z>RR|Pڍe5*MsaY`p--xWgLdIdY@ž1O UPubLs0b"f.RƲ.UxYIYῪ")ZdPܸ)-&4RKIiWK;2'bwwC#5[m%!vF]2qLҔ0 ltBhP [rw, j杲>?JPC[WB{Ҋ!T@䞋u$ޅJ͗!d㷶2k3TbH(\,v,fB(30b[9?lH\ p+55I0JyՃ LJW|fL0 ExB8ZxцUf!Ћ:˵ox ED$Z̈́x*eb?cƒ`A +6ˮfo؏rjD%i֦/E6֋ѷ,IBiucA,?u`6?Ȉ!Y&Tܻ; +aiN=|odcJioT~f @ 0SfmRC1r +hˮ+`yF99?>[BPw%7e^|{4eai΋lJBs %y;~(nV\SI(mSG-8 +Y +QsG^ 1G*Ӣ/ +OCXX@@px[LL)+m"Z0,?-GSd|0SڙUV/:`R:֜Bwo8IBѡ{>YmN*D-\(vgH!OP,[Nk)׉M#w66cuJpX82,G)G< =YE}5' +mmdVc!edELݖ1\S7U언xN".]4_3FMzo zӮ@zBh@m$*bxF |mlAabhƎouA17CAdY vRkQ +c6b|*l)ɻ^ǣ _ Q4{r*5:( s(DF9)61_ıKA:i%&d8D`m^5? Ki\z^qVM1AU['JH5.yjɊ}1EIp @IOtKQxR$%gX@ +^x&k4naYRn)@pRF2D3= 'd9FGsVgM<ԈIe, xln M}IQ Q??S㋋BBKAӫ}ALRXQ0hHBa\3jڎX@"JG Q3&yr'a$K֏jf+q&_ #x`Tj ֑ 6-M.CaƜWنY )H)~ vF3OUˈXWŮj8A$L"MQDޗ3ԕH -*qudK}CgI#pU!(ؘG `ljKa/CeB?֍-専̑3u.6KD>̑8ȈylȄhڔ&%0ҏ5"#0tZu+3E>U BOFNn߇<0Y*&-XPd2 ީ8\*\#8VT?tXrxU9m@=!8A}p11/ݝy8,Ono^я X~Ř-$"Mr`O-ӌC5c&98&,5%0sLI|~tm=\QkU%δE-؃s0)\ȱA#q;:$”7y\ܠH!o3`hW5w>hl b1/cBCLw2ד]& 4"Xl{ő'ZYzq7=aQRrDEX/:F d/+5$FD9{*0̧WDPӈͽ;-dAn04 xY` \7yZDTY8&q** Ѽg=aFh( @YٳIt0{" z,e`P)w o4yהc +֋iϠP +Q}B4##dȆ"W/H"lqx fߓft\8nMn~ ++kk?R|\I*968Sq~E"nC(}gWe)8fE' ݄vC`64^0drVd'I1=UHډ:o0!ɥo1ğ+FpLL"'Ip]I"{2gڿc8=:mt!wK/E¹UdX@@no H0ZZ eWLt$DE:!sX6(br+"% ؑvnW mĿ&ta)Oh4'1֍FƢIDk5\m"a7*NE!V:V)/G>F(>؍n>xe=h1b[g\"7튞U6GI4ιh\\]V*;Fd=RR]! , 0.Z; lP*%5Lɣ\$V&-mWnP*Ϙjql(ئ-Ѭ %Rava܊}1Ӯ_햼OΨ=<* J A}3"籀[odX@imkQ7qWYd8Lޫoo"7QW]xfbچ]G K-= DԹ**tpuc,T!ڽ +~oϼ=GTp}F[˥<كN&: ^Ql/ANxCi-xp8u k+pˑ^24NoX~]t폏 3#my`-:yoNs3o'[|NY* [<Q6Ff:!r<<#%|TpOع{P5iUS`M(b| r$svEn RO@;rRY#a' -g@3f0bv)50dVRo5 1m[R_xCp_E)3=Na$'r riL O}:,2àraL.mޖHf;5c D +=q ae3V +j|4/6An(eLEhҷ*f*Ԑ!fYQu'^ΒeE{0`GgZd߻0qCg +;M%ȸ"4PRnd"[wVNG9 }^ǗXx@t޿WpPə&Tl3pOěPwjg4:sx)V)s3xuQK9 +6c]EV%'$v1#]=<mB=7³北sBX@Ҽּ$. Y=UV蔑o7ore"EuR=m_]-& 6iʼn9;u /vK`aXcAUhR ƞ) +h7Ei0A`;+_}U}S;p ЌZ pd{Xu +4@W(܎B HSO, V# +I:% l'qk(@,ȎEF9k+"kJYNQ7Չ9LDBFmc4k6`E_mO" 6dC5zDty32S:R:?VQ7tJ, pmڲ%v'8`->d!s2*NhǓxls#9. j}eH9gzC Rƴճr:[AqOPg<TuZZuDLնe 9|u1QYҴvy\[ZԘ!ЩPHPhmm|h*2ϚN(-1U*p(hc괰ʮp^$,mxưX@-Lķc0 QQ3Ӝk),+Tx1,?kRUNY"h~ʑZ#r^n[WL༴/߳ƞYHT,=j2O(ƀ(pe5Ce4viʦ{F#aWRᳵ5N -b, WNAfA!墳oQ4Uϋ6G8TG;]aʆ\ad79*R QpEE8X@pI 0钮xpxmQ" `*o+#"ϿޡCG}1;x@hB!ȫ`Hg9ޓaAW#!#})džՇ I.FWR@5@ Qxt*[ў<(?8~V +]Tb i#XO;VLG1gi(]Ke~Ayhx7T43;`ZG8ƀdeE0uuFUV"%Z(3|g'XxUp1jH@xHKamo&RC8d^!`9`k;?]PA2 fy&y`0(Jמ6Sw@P${X@0xqJ JR-C2N~ 8 4+^jb>qV$,DpԻ,"`b2xߗ H&_~x3Fj.$6ڽp䐵<Kbi~{%4 +iHMUq!)ی-yX@ )z"X+S(rU5!bpǐ  jYB idkjVW*./ 'ҚtY g, 8!\3B(V/1(p1N6NOUY7ftJ1b< v37+i`f;ze*l |ʹ'^]d0ŝ{\|3W, NҦJJQ;lXml!~̓n`, hmBaV\t$CFf3Fg0vx2q2{-^SE ] +5|c3A*&@a_*N(+̊pA4G 6+MuL#f#ݨaBPMx$~Xb+_0;:slN$|tŏ}MgE#og$͌ |WL 7G貎ÐDX>ڵcd!d5F)+`!CA݈(E7iH^n\׿=U][ҥt>hV\  @ݏΏ2ձhQmSL ȢKrP@Ԁ8WD>bs8hdEݡ. Vou#cX/]?-qĨ&i8RČQ[ jTBfdm vs֫>ueF+[]KSJ'dC6#,Ŏ2h^Z\O65" jW'y49-Yy L"X@!JdZ1s'*,sRn&rt-Ž=`6y(TsZG"F8yL^PazbA|=lF vey//C1Y"h'~4!fy2ZWs'"܊QH7Vɕ!~6м=m%zXVD9̛kVYɍԄ\\\tgMnX4W{m/VZHim!icAfP#f-C4WW= |JR^-[_ʠ M I.۠i, x(U(Tn3>߬bE#N#]vcA +stsD3Id!U-{ut\/&9"4Jd1OYѭ +,A3$Cxt}=!]\v]QGD<;O>?E WVp!z +3VYWj>s`$NH@w7NM >+3`av0`&Jd?UG.ŷ~`Ԗ6Yj?&9.t$S.g'x +wj81X.|U +#x"g, x%7.>(эBc#ЦV*C!]Cപ4R+Y\)h5Gj~7;*A""vbgE ?{q &gP!YXq5ЅWXI67#xFV4X!MjX!]9>$R3)BhL5r, ȶqBO^̻E +%i"?+,@k^[#{?›NQewAL +jO 66ʗ1e|7@ uqn/|#iC[D#nw|Fî5 +lRː}1$2Z6g{ dY, DͬFVPW,"@2#hbha'|9*b1_஀g!GbyϺJܴ2"&}p'| nﺶ^O1g\z%X1z(zM%xEEvk$kx ]u,R,X@~@<0YZU[ NhXZL4g< (q\WԱZ'CK ]V> nT?%G*(mj'2;g]\#T!o@+C!]JCgb%06b=Nva~IC4Hێ"8&ri3F +07VMZv^3<mI2vX_ -+ $uV6hbBEw,Gm7.g"z c|80'#g^dud0k!E[y}-H@{U?]~%X@9m.b-M^ +m)xwbRVUBuoA?q8CiV1 nomiMOi\ صWQ#FN1I JώgA~&̗Jھ+!6])U9[jMmV1 ,lŗ(;U%QİFCnд,&f %(GbeZHCcI6\EښP*X=EXUPi c3<6Hy$¬&pTuc[,gq_VoEFS6 \jqGVkn^QDhB۶4%5P}yIRx4J?(TeK,C( Jvb9Uݯ5fi]UA;>U ;KQ}jћ8H +BHcY4'&ÓM Me?8h)9Րd&- Z7m%2Bgs㕱{ ,&W fp~3BSv@m$Y3gUeo2/R 3nlj(Xh^.lH:kL@lO`M${I\ԱiNpb)n0R*6*BW zIh+JiY qX@0zrW8EՂY\lU`cϹ=L +1 HM2J&j7ko42) ֤2#/O F +LVRg (\F X@Q陶0E>?y:nVq#CU# )5J4:~AK .{DVc5RGX!V +endstream endobj 16 0 obj <>stream +ŏBCZJ:XB֦H댳1=cch:}4M '8d  ,̎Q4JVnõld, %Cgt㧘a1*zdjt}b ĝMj0VZBd؇?FA}ĮXHɳ9ӈ44S vw˽* u;Z_ &!fJI:.\G胉P 3x|~Om'ZWΫPv'iñn)6!=NUeÄ˝B|)b]B'M_\BՌ7 ~:̓ƬsZ9XT-;x[-.X|j-yimK&OdS*>ˋ l|L..u,!e/!3:Fu@LHPVT:]Y1Ӈ%(-Ob!(:O^@yZ<#XΩ0Oya=&cj35(dKU#k(@" Q/#Y-_{t {ww% 4);;3$ܸ%ؠ[#Ž*|2n<,Dęb8'@iYw@qD Rؠq 7D-M& P6'ǃ%V +Cj:78igk{탺Lw^ +z֪OID@|Ml<LT##(  -D6c:T&Q֎#9`Fg24bšMx= + !#"KjŠ7⍕g*ؾ 1`, >G0Gef%?%xR32h*}uͺW#9Cv TF7]VfZq_۵į.<aAA&شǏkr-`ÛbS!糁aĒ1fHZ@֔=حv2 |ecA%^".9` : #/suHQlhr(D^A#V,ؐy h,=PP~)M;{a۴gI(C14o' Ԇ*H+ӊ'h%9a&> +[&L7X: +ꑲ 氀@zġ^QbXQ%K_IEv$ sߖ|mXZfÈ %Eh8 BBؐ~=k9r q{ Hp8˶ުp>^F4msP}FG=#L:D\ޓH3h[X@ Agy#̿h*Bk+D gD4HW|k s=?ﻰ覅kf `lO|?^ŢOqKe5#PԪC%lչ3{/:Q x5I]#~iP^@iB'ز+qPVI_`+y#%zS1iNRd<1ui A;LVu\h_On( 򘮻ȷB{,8_}Pnn2;k!HSEE^EjD99], PN@[>-\ɺ##glSW/~gҍykrS*5|$ ‹ )ahд[;VpUl'|`A1-F5[A<K2)A%41ZBNKN_/OwI +̚1jטr`?Fau6#u, (W4Dҧ6?(6%!=?TF}X#bhls:u}c6C_/AlHhdcL“, +SF='/ +vfs<'<,%pbuUKbi< +f֘hgjk'żc::z5순ڼ2!.X^0QCoKpۨy[A{㷚Ikh2Kt^U_rL/͞8".?`U{u +w!RЬDĴ,on#m4hfmɦAat= haR(^mzB&tؚ.*:|KV!]^tw4↬ʀ nP(aJ~% #hKX()4?ڞQu@ ȁ7xb2;JلuÕuly QR>C{eo*76Q;$Ko7cQ\Tz>waq^d#uJvL%ݛ:K2_I/g:6'J:QSNm׽fLw|{vBa + +YM m4;_܌=4E OCoBtC3LyJVX;Co)J́*xX&r(2AF9iJdY^fjg$<6p߳R2g0Aq6W!,.=UZg l+p{e5c/ , a2|2=x%z;'n`ZXuUx4 Ո +[pT͇TGiSs"ҺgLcy bwfVMZ|J"iM4H +>a|V=xu=r(E CǼBw&v̠jWjD85';Uq$qWL5=y=g%,a +@750pœ9D'd} 2"WkOc[@Տ$FLoTo :X)tcU1C,Q2 +IޜFӊ4xDH?܅r=8+,N<{rrU$R5:6؜'mllbEΐV/73wJk?|H,1Mv]q gȣ†,4C?j.^^<ݵ;r O {As" ݽjEk1-bHY  a?yTr]a-yĤR"$cEI l߈C$rĩ3V)0⊦&?{xoIv6BZ)9DmLeCJ,TeBR;`t)78>'ID-#HSwJ}ԸΎP1]T=7t` +U(yX@e]H 8Q\4Os3Vȱd|!%܄3nU +lTȆ&y> ޝ1-{mb~ 77XtdXr{Z F\&(N5{D.R;ms0[[a =I`Qέ_16Q&#mPzCMXZ.At8o; "W* ,#\KɄgvӧ_ȞAxEKpWF nD>;L-ڌ&X 1Îy2 ɂw{U#ͼ3FVA, h5\}/"IʠE/>%=1|IͿcSl>U8tVХzؽ+c9!DtA[_7 bHV6%r+ܴ@@lj@| zWkBT6tIb2'K T$[{)7^(SqWܡ?AX4#6TL~a]dעYmv;hv"{կeSVh"N(Kk˘Pd`0.ϛp}փq-/R933%8YwCX@}%S?<`nԱIxT]@VvKzk~Gjю }'qі-P.X5 χ9R1?ZIt-x^AX*QJQ/5 0!\il*59=Vր;E$/4\×1QѨpصF r>OP>J1'IJ,xFiC`8-D \2mU-OK|XcUr9)o *,Y5.جSTv{]aW蠐p!%|-R߻.;/xU ,g +?xXV2OC)r57)mev-$ĩO Mfq7&Tи}kyf{5c?$'e~Q-0Dye+]'D [Rn#5M,L:VkXdtgp$x̵0EdX@i J_2؄>HCiևAa#gV5< +vxlsqyz"biy./6zeUn+l:`͌:-Cс%$~3PHd^tfY;T IJ eLW)(h>2JBoi$ӡ<5(s!}3ؓG.&}{}oMۉWd.86b{zڒ lOH$`& +>2:pA'^cArH +t?\o!&CǼ7|~BUϬj!@ +0ѱuBط|9zl, h~ՈSR +sb4RשMMpR yINR]3fuIWqW14(!vhTh, XD7{8OvjvGng51fcEP]d5>tVuĀ+\bZږr>:PlfNe1D)we|xQ8AeXr(-n*A(wf܉MILã fm9Š/b~X@9L-FhĮ?,r/,Oܟ ,y13nF({!1$~8w$RkiAk>IX@(}[jш_-tf^JѲ)GU;U5m"mu(DHb;#BESDe 1Fx?w;Y=ͺУ3ɟ=SSY's8 u d|=C&(pFD4`3*eҲ5HTyfx|ש$RDv~A&̿d#8WB_vT' Q|`XlA8dZI9WO"ӐLK)6cb +|(Elz:}v[zi 4ţ[)7Y/j= q X≬MǙbp$mEq=bPD=CX֨3 +[[Kɧ<z1rZ?J+Gg}ȨJR11 +WV87g*1q84y,.x @ǻBVd0ZzbH.k.yˏW?L,::6X(;>9\*a$ODWo +z4cAlՄDA i%-Nc-]jce1VIpxxٖY G^> L o<72 EO6|島8?Bcb]BՓDx 6eV2ra*b )czVt $6(mt7ݙ$SԼYԱKy5)=^L";0ؽDz9/M˕r,Kkqmmj ]a*ck4= ?Ѱ"}G +HpFpGl[hqNjg2FIh #W&24~zO] 9В˿o(+;6NlE!י3ax!/qϛ `q xXx jɽVN$֠Pߟ2q2hϥX!\3Ƨ!~V^۽-VS鄲y$Xi体>Q3nH?c, P)n7f9 g OEp{|c63rXvIEMP*X'8"GOmr`EvA>50E%2PGDF38\A,\ߖRX@O[&.wp<#c1~-MHαpolԚ=7nMo|[c$_cb,ƨX@:e,t#MOq}l&`sRDA9a[Z&@gd uE>2|oha%W{#J3`gt|(udT- `#5[e]ަ( 9 W w?N̟`7%}axMb!϶r)ogpJZUyd|&&g +!P m2˛~ >5RުՋÑݷ?Ͷ] eS,>`c*cԔ31c@Zߌ"7"BiQp #M8 S(#Eo#9:I +L^ka,$ܩ<5EoL O224KGAH ]id9BrQNM-0H(H!<4NP.,dTd8zfCYv0&ݘ] ѸX@`„6SWY]F +Y}1L*Mogr@֊pCSg'۟&6[1q_y>-VN ZZ3 ؓr ]FK_=$㾗aWT 䚧0V](?yS1e'Abz Z"ߕ8gHDTvh +v*Zejï;Cmg`?QA;g#54E@^9guL|;h ʜ Om)R,X@@neܮbi>E Gi&/)i%ܘrNnd1gP+S_ ^%(Eϒa)=P*aqxb ϭH岂`B&Li 81ZoVpo Q\eoJq/?jkv8o\D KXȣq#nR7PB!1Jo pʌ~|va~Q2=rPs9/OGS#D_oӫS0]p)l쫧`>fçBccW{r3#Xp徏*`ZRFC D2_Z,MK惊ӻ 3-sL=z#PǩW2eUDĒu>Nz5f$F- H +,N8I2*"y?STAɷos0ww!Kk;PbAʥQ 5I)cBIgla􀪩%]-ԺJ> v~d>=0;2*;g ~*uvdGCܻ2-=hfg7֓W]D jT+=XףjٓW]IzID.} TX@`8tJBLaMXjLJOP^ΏPH UKkCV hY_co<2`ǹ59#܅h : uy1 tK}г,'ANP_)\lLQ=gaGW >MJR$?, sF~֌[KG$RAnn/| 6޿N=Q-%c +L>D3Jvk# 1# +a!e:& +D~X[qʭ< ϭp2˯J[;[oNB ] *&bH~Y>Q˽\z}U< ZKDŽohSONeUת+sfnu0D[+tm-mvO.cvǴ%HeϞ Cja<4%RQX&[&f,TnҶ/YڴrB}9}jEcNr~ld˕kA3:Dzصj| +'5|[9˘9l $ÄLQՀ +Js cF/t<.j"Q2|Ūc(VV*hx*w +[2-nigGq㤕cJ<>X@ oz *V֖CLܨQ&RyN⿮[[u0[u[aAyb2>H9>4|=?KIO- :Rx$μi.EP5T q _Z}y<6áK?z5jOM +TD c%1|ԡpO %AKRҭY +  aOj[9 ?/̤m\@yd! K<5,N(}C0 Nخ[Z 2;e]Z{߰P ^Z_QQ).m5tr ՑtKx+)UxQZVV-pk[u2TIc `MG~|*y2f`3 P*e;&'֘ #HKӑ*nc4r/ +a CLD?1UEDP*_ĸ|Mp^NF X-@>)9fEb4}L(, (!n5VnRH"5?W5("}W>g56&#_܌f4O8/=_@3lGh`HUzn57۪SI1&rgf&$RlKT0e&ɪq*9zLS$m"R"ehnEa1K%m@uJ5YUPwԗjX>x|q|6ZfFp`Z^uPG灾#Y":- + .)ˏJJE-%TȂBxiYЅӉa EV;R82:;hK-}>Jm," %UeDVnl+OVX@X@X@ȏ + +rj1DJYB)tKA/u]46cSf\}'U1JoxE (a bI>*hVVX@Z۪Gȣ|Ѵ4AA&kX@@KZRVv^vs%E 4+ +v#11vYt=osž` V5X@]YQpY򲖞J4r#\sSR!ΟcN0ez^Yۂ{%ajL4!M(Ҽ-"[2Û,4H&SMh€- Z0+`/b:x1?wtND]mhjAR cMbіLX3׷k JqMV"ZTi2VX@rubǺ{>! 4mE5p6n¼d@kwQc?(g8W֙<pJ,X괛JK 6K  @Kb!~}lm>}T@`xD9AA#3b4sw; {U/#pyD߰X1n¹n~ԧ@2\ 4ФL܃ +L;huroԅ4I7hOub+gRZba*Uc + OuLu 쮟+n%?vGxD Fg?&tD/d/)Ң +}MI&/tr[0kg +w. 0]shF49zˑ^;\|ѩ~1+jAk*@%y8/5U̝**3*#iw L±$au, `)0?r;#vG%@/RYbE +**^L&~Vv٠c{Lu=hz}E_:i<͇)!Jj + 0/[pNIĸI&]xq.O=1d.LH,3R)7Ļ|!פ)&Q)ʤp@1%}]% ձ@xL`(]"7D㡑t`J*V7VrTs+, ȈLXq=@d Z3%5%'`˞uMCeH~2'4>9ipP=Í5t.hAf"E^ɐP<<  .(\iLn[wNíiOWYQؠv F,'xɌ6`A~PҟEF_I[2 RURXۦlM/;1\tϮR#HRPt9$W̆1efPHCbR$vㅸn +CR̭,v_=Ώ@#>2dhќgA +K^Gltp޼1w3:<<źgV 0 AEӧP&Orrb| +j~ު/T"h%`20 FJ5T;B(tmnbp+gp+, ȜOD/,SR'EE)]2 |x~1Oi=CUmtX&Vd4Gnn5s+y흶Q*Q6? H=,ӸpC7æQcT3m:"D)40xلe+AmX@>4X?š\;HŒDݖ m\:D-T+.>X@`"RJ<5B[ҶG[RcAiWTN [yC*ɶ4ųpJ`t_h͞pJ44W9fpVfBRX@X@X@X@X@pBuIjkW(u*{W>T0sf$ H/\h`9i('Jt%ܪlhUThևĸf^VkZpcRpcN$9 ? +(+hNz$)#wuGPTq09qzm@E692俙Db3)-IZC %эQАMiL?$O=CrB n4,}I/4VՏ8$KE.ۖC1/S@ sJK:Ȉ(+TW`U[Ħr˧=abb(PbMDhDb CC n9|%@X1&+]pB3u![])HOE467 + @&}9|8Sҥɿ2*VV-V +֭~s\u .Ab) X8eP_|t:"y+F;MDQ$ԭ(^׭ϭ | +!|o=Ob9`VNY`dՓRS.Q>/4Nh4P=C +K `HDR2)B=ď{MD'&X&._HJ +HrvbRdbgpyK1`(!qb1 +9y Lg7.8kF9CW5 +*CabUcYBGtw3f]kK}X[DpH(`KX@P0)VA[0PMf]EN|Dxm{rlwR|Ԥ"_K fS<4U&nH + jȶ>@i8cdn 8k2ex Z<4IοF+t+VweVY'tBt+6{r ann俥1mKaU +o1VC +u Q(, VwC b)u#AR14zFVX@tkM@E*G982O)` )Ns4Yt͈Ű [A*uVX@`y\qT0<Ἆzh$~0=>Ks^Rc,C)MpN#2LX@qOX[<)8x, 2;**UiIn5ҥ +ajɔi Fs`ڨ2LTKV bhnP-a +JAer Q/Ec G@> V2L$Y  , , , , iր D"acX*Zu\,`A=& *\6 d6Do*6Jgܪ`<$^%BZL@ףv90p[(.SHCc7}^*P>=l8\-  2pcl\R_ ]Vɂr> ";x, wğsᶔtq~ '|Nd`׫AWWJpj,o"ra~mp(J8f xūW(nʻ6?$ɰHtLkda]i/A3q"e{5F)V\1&c.x +C6Pp^י/T=mNLZRT>$ +H xskTU3,r;X@n~c;)8FsMSh6EJD*dR/tFJE5[#mW:^AtRlX#A7avTD9㌘:5(⿝q^4t:e-/\Ǽ*y2;RBC"q ȓU=l";VXJo嬴VJZ4[Ǡ\|OVoX8^aH9qX#h.uxPRT F|la +Fs(.> C<6ƻ-ÅA27 +hY ~yX{V.Ы +nkT7,0*<.O }+sͰrG6bV7 +7;82.i:`$$?& YauXߘD$(GseNT]8nИ^dV)7_`I>B?֓o&+!f zKvO &ܮ8[s*kp3dd"gv,޸NBrgOJE8-ŮmHA4CssL3wo\L2ĉA34p]g REBOxs2\G]QMbmZRǧ1@t?Id`v2d-|Rx"㻭i%կQvW4ZXx'9/})B%;Ή@Iˑ慽4'3, H:C6yK<({--3m7kRF αrV#TL@U6yiEƬ}f-Hw3-%=)naR#-GVDu=\ JpJ>R-m?r,-U#&0WiiJpCl %)X;~EȮO5'`5-i`^]&4dJma;{X@XIKh )L1ȲX5bN63ws/!S]`0OF!gG2p 4(ĠpF65=)>axU"rS?Z.Q,Y)ipn,:7p+ȩ>PDA~%ÊS۔X@u#tpLqBik;l%S{pxʬNP,{}9T% TKB]# wX@@+% dNHňmGzDd^]B"w^r1I@nh1bk%:˿X +**!tD"DT, 8"`ud턖|?@zkGA ?JuV4EI0"k8Ϡί8/)$d9e1 +!VtlT -mwlޡC"RʱL?؁t^6VILrWgQʃ v%ӣ~T(">vN3m1 nzQ<5dHS|L¤:$`>jϹfΚanqI=ȝYX}c!;ɑUv2w7'i6G7H"ˬyM'nDQbGjPCr > G^Fz%]◀<ȩ$s:5MHcr͹ +sCEen7, hMٽwBD +ҋZ\aWAD=BiJ> e0u"`kQr_6M:ZNJ_ )| 9&Hb%"qV +ꇗjg7 +hsvNGP}WKLf"e"cq@&l"`?-*;$쿘I핝ϟ*}!z%<ڦ1=@i$uuQXVq ^IKi5{VE@ Ry$dجD;rў-#K +r*d2BwI׃es!7 EZ z8vK*$G dwC͎櫩3EHT|5"j7:'4$ba]J,_H_'Zω0\2cTo:t-,Ie:ow sNWP4ʌ?yqo3]ﷇWwZzuo) I(%ݯ:OUo $jjURPėXx9׆p[{3 @ Uc`u|HqOٜ> 2.gbQKi)Y(xuTQۭ.{08)SGdIn!U%-D, p~Kk1Re_Q6u6op#*ѵTu'VKht?`.}Fd|Ri+7p4rj](? d{/L<{`.{L|lE5q Ň()r FBF2oZLN}X@*j0PR禰Mqr?qJMFGul^h 6Ca&K~-^bJfc@~E1`HI &#->6k} ~8:* 0N:cpV3=6Y;qQޓiB`V]$~b3^7Q(4znTPѨ1#yO\hݗbDёI;[hu`xo)E¢5ۀVO&7k1 +JкAIu-͔Ų~zWw8VwdDmKЊM1DAW?ݭ$S0dղǁzp$k$t <6D2DiR1o,u]u?x"#m kۓ(DY a[G|YEqє¶@DESU=E<-CbF2e -Qj8sË4PMSQ$j^ZF}apTi~p妻:bawÎsìc^Ĩ?:dHʻY&1דG69x1e8PװyQv/q-UPXu{yoٰJVu;E21G[Ek:%G] bG5+Hem-08Ta$jopSd¸d[ Z%Lg Ec`Rc?r9"Zs;jd%cb3>؏/jr*bd zC iy6Z*Lv'PY\ @2!Åt6F7|iC>͖{5k[K3ɨjJ"qz4Oڂx=⡋YA!/^TOL<0@Cj]ۆMH>/2,|pޱ䊲 G *@pLgЅ^{EԥOP}K=\EN;8m+/xc~]X@*ZxG͢A:Q/, x5ICP1~yzFyU`O"c1PF+ZŁ!uz3 ^'%bu\4i*9c酻ݝ{ӴYalv‹̰EFa31")>sAx!8!"[ `|F5UEBWOGID Lcģ+K +: hmV#r]LfC +mg@"Q/95?nŜr:%Q%\Yx@Ru PmOvQx +Ah0uYfTZ!iJCcY& c/,f N1q1Tm[C )җZmhSB8:ыyZ@ni~g$~(-| g:5Xp2z6K!ajo@PZg"Iopg!{2(GχxfP=W4U:C1WCE/T}%>.(G`MGrεwpt8@)掃릔4@]OjKцqTPŽ)k%DpjY ᲌*GƌVo^l/O:)xۋ׵w~6:_gvZn;B i,3`rl,:({_T~v1F~dg`A[FZ&ͪ10H'Tց{ JldI=7&#vV.chV֠!m*OЗ9o#NZ)0jCe )_b #\Wrj-AN%w0?tgp:rCSKӃl P]B+ZLʠlNv [РzJ;US.UU7g&!Q, @CIiq002Q4h A5-y7aC{2qr#ҙƀjq0)l.0fnd, \DF(n`'AUrbA,lfLS\Lܰ7C ;NNEk󘆢,dY2"j[Uܞf Uē-H&dQO 6V4-abEJ"54F)aQdiä*rX,>qmV +\ˡ>ӬcӒЇ^ h;;-q hi=5!{~B +Q+)g`Rwl41 j1Z, 0CaQ/lwZĵfWZCz~n4ׄZA6' N:-[,ip3y)*om"In +Z5ZJԙb- 0"7E-Ȑ_4z(d'f-\lǛNDucrS+'4N] cUXA:'~ظ<h-^,D{^qs{;]Iiq'*t{VQ:ؔKn;+p/LMx<| +fT[?` +Ljtm JEAbc c!l%8iR) f6l`$>gh(Տ/&ӺQvm}fB/ֳg5f[uWG'vF8ˑ)wEv'-1i"97@Pe DRwk?RsV-aҍ ;"zrFDg;H5<< 6jV"2dY^8%V~j[vO\ ҃)iڠr8x.ES\ QQ2Ji{0)q +K`*r݆>G24bAR]ocCNs+̿_+} *@ WӂQܢJqI}E*ˉɇuZ3,3ЇBQUA1X@ G>/d4s lRIQSYREkQZC#Ԇ?g3$WdQӈPd9:qjL'H9E, PoDV#G*=TQˆ +'/*a3q 'A46,db1u^jDfְ>_>LœGtBvAjs$xёN(*:y|)Ce#4k\ns=Jyfڕ\+buEr-Vh: +NGpcr5.iއ2F*){6"Ӆvjٔ)Wayݓ(zsJ`lix7" mEG _G7hcaɗk[DRdDe6܊B7,1aAuc J0y1# œIH0g/:V$vv騫A*!`W,.92ș)6΍<*%NйAsGKE4]ə( +\PRhX@B%zUs,> +*in .JcԗQXVo%(paV|>!?TL[kI(m:`C4EHwn5Ҵ,DlNAVĦuUjU"DCE&WjߔnB'?fV @wG$5I T؟R9񑽄ˤߩH2Yڢxbq22BWjfص] ;m:!"c"4PFA_h'0!cde)M՘UzN"@5`Աn؞X x6*o3SfDllP-P11!sHLLSt}rKxa1Y?5rPt 1D :Lė؈MeOcxG|R^`ʕ^C}J\b)@5&'WSJkA}Kù3 )y{)7g~Tīg,RsA`sS/}N,ᷭEAGbW{m."H; }me{$ +7f dpZqYYB7nl3XU,КF!YD?5BiRv (*l'.pThl/;H-n{Tz:a tNZpe&˗Q bH? b.M]2fZ*հLy< [Cq|K:T:@;tN!^, f>6`:1E WI_G}գQN8<5L2䋊7?= a,VNp +00(-/rj + QQ`ۧƜ裻ԝ"5,p"f8cpH5UwS|s&ŦFS~?F!ضgŞע*# +n* X!z[LkjP>¸FGy${+˵bSǟ[4@ $0 H +, 8U1p\0e֐[;f؜ňRVH!c{*Gd[]sʋE;p],yE}J5 :d&R1%zz8}JAb^]kb.2QPXÆ`_y$RYOy+}+nR7l}Kcm+X@nڅ["RN{kU塬 (5bl0jfDTp#"\/KZ5c+! 2N=C66kIMRFtB',fU@%. ]mrUmv訩6?fH%s:S'4LkOo=#r3!=KM_36 xejqWZ]nt|b T@ASbwG+bm;X@PrxQHz>1脻fdONxHEű"gd}ls?@S0EURYmd^l_mڰ`1E!;GkzTZ.eor/s zkZ*^Jgjg5$ӝ "W__X@;@iEŒ*̏U8JſnM%~0rw::[ OeU]Z:b#StB08Kj%caᲴ닉|Z~TJiab3+vNMe)iΕmx=LӨgz7*n ]ԄōSODFw7Xyhk=1>hӚLc 8S!8 A V!CHHGb-X@0pm)',61Vb3'bv*9GX읾 +h5 \(fFUbVCwDՇAƀbAٙk%`6S)阰;}rRȿia=wsI|uӘ-%5SgH;8`IRoN;8F},Dì=IN`UDA$J-b-Ԫ1ɷE'F9Nv`8t9g8ȭay2"2S2dԢ1*Pw~Iܟ\2v]b)1]3 +>U`(V=.n 6_r*JlR2mziTBhJTꨡ%t>N,֭%Ry¤.] +m]K &`jE@nhJ<a8e^VOIqT +'ޞ-p2 j&0=¥ +}Uό*½xbE=*XV`E7ZBk}ӧ vӯ\Ğur<R^M_0; +[ejSVsL N, .xS +K iT!0䗰(թ$ + +z^&',)zT$e0~f n,`XՔϒi3Nz..JY4n(z7# ,)D~ +lX -?nrRC&hA]Of\aW"Kz%n5K~WZq'BZh%٩xSi)ؑ͐D͖Ȍou`V%to j״-00ٟ>L^{`i܉#MJa] ڈ,J+-gȷ9W /Z ĻH084S{jF.V$w]-6*BVr|YiʬB8f#bל5A;Ǐ m★X>8$G +.yw~(Aʋi9nݖo'͌œ-FLB99~H +ӫFF WJE&TL}*Hۉ5=6!Ѳ2K LCÜF y) sp\8 GkRMh!)=2vFF0^Dr,Q&vIMіe:fX@@bĮėlvOI$8K(hI?\Nu0VI TmWN !1 Ig3d0dqJV̔EϠЌ #P"|H1@D߱ iHS-[}+<KK+`:־ug8%ovu\i. > +`0Sn&@+ $SSqK|0yaX@&*K|\!N1pn +̓`ͨe7lrsÇ!" [m%[1h䞿haDrTÊyҡedRN* #@$LJSIIzѹѷW ֎R, u EW>d~KՖ*1)<N5D{y ++N,ckrzYKKPR\5H{qErZ$LR!9L3ȒlBGkBJZ¨G(AAAAn&R +b +cR*Xr`:G@aED#L*뫰Z7@g|#үo@XԬp,#KUڸ#d ~Gy?&P] ~,2{mg㓘9Ygaѩ[NIy d <1=9 GUD"z#15tZ ]8*Qi /ߜ%[IOplU'pkTBb?S[吺+>UV"W1r1>eUQ</0ʪV B+Ϗ GG6TŬMWcDBl0d0 9MZq 8 +VݬиrqyG@X6{EF1emk%hWFh`W+H4f& b] H bdMX:D%*%BK^Gޚ'gF|L"bAV@ eay\ XUXm/A&$ɹÊq)Bp, V dNW [WsJ23kCmíNJeU%C bJ\UxqU PEz[n aW50Vx4i%Gn Ȯ+@ՒM;mk JBe` +! &* C)]C ;r3r|5eX&"qg3ti8pHkaו1VAjC!fA̦ +$F)bh+ю{RBQsSkթi@[d D4e!a{Jb4QCUf*pa_e7]W筬騒h+g=R+[t?2B\:sb+] IXfprمR:.4 .GY=2i vu]A e:e>e']suV!gg@* u\4 ڴz ^ |@ +Ţ6'P +6RpڈK]J;h[gzoѣ~K?$/P8`A0W+؅{(Ekra]2b97*a EB_Kr/k2y$.`4]'_k震KnBFraO)Bp|TqZr%yWކXGožp/p3GW\ZRE`FaYEBʦ1P|  @ߓm Vdsߞ-)38$ 2l(9A*0#=2i)#D{{G #@?}htO!Np,`9B@ޙDUb=я JwtYP 2yoEa=ppB o%|.J$y]Zr#ژ{ a Jzz3 EqAFC _x,(~,h=cO2BYrޢHߘ[Q~}'K ,](J A A8 diA0hߕ]ȷ +r ~!ip7Isq)@ ~1CA6, qa,F5F亃.yx#p`O%bFT!9XTt ~W +Q;F>J(Oz +uWWWxUTj[ XLK}%~jd-[٭A6Wa9wr bA+nsw£7Q >jՆ#"kM^}^a;uU&T Da :,ZΉ[nZV,3g L:ъ\8AF1^;Gu$ $P KMUhAHꎱ.'dFXۋ֧@Ux1jeBxK^LCKSP`' @pm}f DTI qx-prڊ- +Rb .h(&K Tuƕ)]BV0lEFp q6|d#1+-7az$D8 BAYЩ,OȰ4+/Iҁu"D߆U+F|aA8&!1-@q̔Dcp R{%=H37(M%MզMu(b>*Ѱp'Y DKʽ~S93hC] `߷ AԂE0n4~w(D)$=I*z +.[5c!Vi/O vM>_bIDBb>,cX,a;% \Ԃ1_jvacׄU;#d`Y@ijTrF2@`#M̗嵳PeasTې{0'$ Z+)+p3c6Icr(;sf XQ3WҐL +ZT::2LVKh`d]+%DM4C82F*hdJXj!Lƛ5AK3 L3O%9 5h# ]<=e +aĺqfq ]0`^H‚3@ar+xf(?H".i"G"`:Oΐeq:E{ +)d;4 o+Ue^8@Ja^Y>Imqb+bm->V -HXCYQ%$.N餵Doȅ={l&EiNm8G8p2@b|$zWy_tp·ߗExoq{n\17誋wdjO.R+!uuT"Cϴ$6IZ;D,Q+5yxϜ4J}2uhU! }P}~|G.#_f՛) p!1Iƀtd"g 'ՒzV'Rs 7G^=nJ@$4aۄS5\CJh(Jo/k0Q좨t]`_! LǬ5Ѷwg 2\5BcPKF)YtߞE#J'-PIZJ&y^&~G"~nw 62 8216#6ȷbg G"=^BHXma>lrNJEʩ 291rhM?8QG8{)j +GY9q9b H,4p1]#.}bej +Qds7`ʔ=74OܙM4̓T%~N0#ΑQu6IRwn~yhԉ"G+ʔY1hy~HOd& ?6%q3}uL~hQ)1 Pd?,\EkW v e>曂1u[ϐB +0`jT1z0U(> e/TZt~B*?2k7X^,f: De&a3C(CWPP%[J w-c +5Np\It$)}lfRVXuᙸϧ J۸庻0M'^ZjM6F(S2dJ*K߰H2Xwu~cJy&B|5lZzhŵ@(Mb*ɥX=~~Q~ͅ%%Ga (ĕRRPIb;w DH&2`D L@@6)T:BIV +Tr-u4_ ׼ /rDYmsb ?,GJ*#%a϶ED1宧2>Ǧd;%4DJRiz@+# c>Md>j1) @waAWDf55EfC ΈbsGbӧv -nNKEEL낟;rW"_!P}>uܧDoE_IK@gbB l0u:]?8EJxN%P D\)rzg*DV)]UXIPZ%gZ%7~o?~NNŐ_@T׷##<0꾞Z@pz(_B=\[ϳvT)2qi*3 T6FPVZ @y 'HiP43 z+mâ, +H3ƅ] D{TvEz4_lc8g4#wћ7%Y ..Rn;Mnk5,zNU^!@:{,)^!![`aSϦwE%j2WWE PQ>Gi6N͚io'\e󄌻XpY+: 0{q\ǏgJ +}NEPPG\M_WTBXFo&Y]EQxJ JnWg8Vtb-6iWjl ٩!rBFu6Q*Gb f PgIV +m)xgˠAfJ(P'-8| +pG jp$QMe@>bLpbugceDŽlxt-lG=\Y)ˈfIcs=k<``DٷC[kd@MBRr+WFM鲫M&?ICb~%(òD +9S=/"sfC5XR+Z|Юb{@ZI1߼cW2P5p2B,΋h8[gh|')Ggakm"7WP0񪠨UA +Gtmձ@VMvlj\"aadJ#haC.&vlsXH~0pٰPSPdP-B X(3@Q&/ +ˠRItJ )sRY Gz5+(+P+y|tiRϙ0I64yW &FfC@5O'\#E~k~r9meXnȫ&G6GZ3@K沦M~>S,@Ðܯ,zuI&$|7L@BI +.1 CuQK)UH.Wov_0yVRê22_ ۾`uϝQy6^*$gRQ_Huo~-r$pgqq;Qvlju*6dWb5h-(5PՀJL+;脱XN_GaqtZuƺPAh_  +']B3 +*|[(# +^ryH%gV&kp?!Rg  o @<Ϙh"]"+ + 8H ͱ*J)r}0ƻ_J}S 39'9#>O6"73K.C5#mL2%%aM7*ε ŐR?}`bpWa5QCxFp.>*|X8[g}PuO +ه 4z.\%].P`3inC/’==v$,aSԞa,2Eb9Hb N6g(l{S/m9Ϧ=L%U{Id$`^Df E,uJ`0 &9 YNZC @H}sDrWP! 8$Az`Ӄ"%%XIG36S,lDrr'+L>q2 +F +@VCj+7TTkmߗpXmX d  "~cIt$ +ڇOgL.Fߦ3@i' +vN0펞]) ) d8@k e)VZ QC ͪkucOT]`GHb΂I4YbFdZIQ/Q(;0<.*{# +C֊F${;QnR*qci PVY ca#DWv٠K )&'̌Z@py gA0SꦑB'ĉBHq*_3xuo>/vl%DŽ ETY%8D{i]`U0S3$5l2@42@[hHA&bP(C>˓ƢJWFcQ羡?d .>E}0>54gTw"mas3'TQd> STL!i B<'Xdi `'T5um8p QY Q *,޹N Z-TgK>HsVDO&H&/JMS 1Ԡ _GQũYdv?yzpjZa`)qcNN 8\J)ybƢ 'B@e@>0(>/)Jatqe$%,^"\~!ϛ=:| oS _rBlד:hUiAľw UZ=0y"*Ӵs**@$XXbm<Q+'w_rM}<>ṗqwhL[ViW+@3*ḴS&3uanU"+EV'JY>buzne,WܣXS7B?;?+u$ }A89-i#?wa>CAd.GL'$ KC k-Jn" +j w23@@3:'bQ +s"> ?b 6cv>gm 2 +?n +QF!hشաK+cCw}ZlkJH{;} aXHoH×)៏mpOXOEqa,|*|KI:Le<,fsZ+́$brKޠ[pP~,7p(Nw 2Y,K'9JVd#ݾl?䕶{6?313BLxv9e2jSHʭ˰  ӏVb־ỵ v }RP qɦ r6|Ko۷)ퟭ\ \i7d;jC1MJ WFU [n6xW0H{%7kvN6.kt'J "k2 p cGbfI7|W S0+|J7)1y6@|2_m HvэPZbDP/-VEbq'In"Il! ܙWXZ/Raz|+XOy!FI!h84@TE*iɹB,YG89;SÍ 1/+E^p&e^p]I[$یU On!$4ASMâ(a +hV%FHJ˛IwN hX+Gm 2P;2@@/W;?M)+PMSb(jW0NSDuF.J{&W>=2Q sV 6t#RDX C8ca 4u%5d^I%(8\{ ΥEE.WsYVY{M䬈Md{$dQ8'Gv4;]%R6J~C %6C? zv ׈B>\%:$HI Me$E&_!>tጓ5z"Ue0~hWf<$n11P_DءGYSJGL3@|gZyQ]V)%G6-OcՖ"nr5xVXW4BhP)N$FnRicsJCv5swιB XPLMMcU/PzJ#Jȟ"HA ?N~L7LbW`>DC`BI{ Ôją^*ɐH/g9}s _vܠYoUzāF,o{I86)1С;)!هu񬒮* /XY6||&r #=*h=_1ϝxGpKw2Gc вn + \\ɖvlH*ۜ,m1}- )$c} + le2, zwD=eZ +D) d^o,QIwb$U}C`+ŸA ״hV|+E"'Jo2Qsq#%}F UrP + |jq?~ 2(N\LDMX*E;@)4}%s3;ۂ=jxg#Қ+"DcLSNVLi VL-M%Pl5bMǦ}C}Pcs%djh)772@Ul3pm|̄-t;iw+_̿dA$@(bF$X9P|;Y&R ::Kdfb]!$X0J>u$vm + ?3gI ˢY39L9>쁒4StzqMAci}HU/LBg‘hP[k)d 'SQm=Nsx:<3iZu2s!J pfTfڻ ++aS83LkᏡARIR$ D"HhH4jc_4$;-xl +,(ꙸq9?ux2#5*@$o\(Z -4/17AUAX)llSܟO4uCQrG[nd@IJ!7DOr !2),C}U#~c{gflvIŊM2(_%XA઺X}[E=/|++c< +X#,]$ri}Kԩ i6v~z'||)OE7LXp.rD(V2@rGRI(\@־wdxJ'w0"͞ĈL*+?z~@:ﳬ;X"[[sJ4Q" AJ`Zk_s fĻLl֐F HyW*JRUyOj~(\Jm:ͪd.ZoaT3JB?#wR1}4:?y$MMŇQ9$Z8 ѫy%` fĻ}![+K:ѺЏC /VUE}:| Gl!_&lDiL+ĹyR +/ӤszLs>`C@9;^%4e0ESR-`~eCqW7J9S޹g- U|GaJ#1&}\Go?Ah8J%0yr2@()6RKOT +HC\u">%W']oG ;V'<OG;3@`RŁh?/BK"8,)g䩚N)UYU'*SΤT-L`e3@4[-ß5 Q^i}dVoƉ^g(>ZA +ѮdPU>cPRJ9TVRbxN+?XZkqU!;۟˵F62)9l_x 2ڌD_bȵ(QK)#URV52=b!ZJ+VdeqZ!*'H,h}D&'oVhᛧSMhooJ 2Td׃ T"P"V圇WѢ9br2ՙN+"AL:V^+V(5z"d ۷ Þyd?+tKa5 N

H/͎ÿO폨DoD,%V&* >6{^- +F+Z %FHEI%g0qt줱iNp &5y;/}@rMxs=<FpT԰(2@*)hYz+$/4BVH,Q)!D@AwN R*VQ{1"$Fbf:U+Uq0վ- e8,F.JD7r)=WHn4BfX"QٺM% 9C4̅ +YJ) v UøC>m^Ur IYj`$-?nn?VPHެ"B֧D6N.[Rՙ))$O9P5he쩠f-UIL,1į)`RJ +gVNxs [B9J$JҭKOm;sf+Y=qNZ_4Rys4vtn7W<%&DXyeD,tŘI/tBx>]&OP88@&xR I3N]!f,dP]86T6gU TI @Mr[w^4gS&c+B;eca(#Ywl(M([?or4م:=ɫD,?2Md׈]h&[n5E+FHSCKsR:)$Ytyȍ<輇үeRЂEGHMXtHᅊޅj%+L򨸚!$$))rdr10fP -8̆M_Iz2&yO$am![QC*+M"*pn5'"ֽgvwV`NH,t9$5-a>[Z7=խSWRO `?/oeE2-Bjo]+$aQ8e&` +į,2}nT,Xl', +z_g%@<3= 1u7c4y7": +t &b41щbR!W^}~,}U{!˾<]I_1:8%g[=t䐐Gbٴji]Ua4uCzL[iјN UHO|N#O+S4acz JPٖDA5D L{s s{\=&؏;䪓RZ$}&77cGEqH,HӖ:^PU`M >NZIq !bÀ{ĭOkP\C}$G/a1=JʇoJۄPX$ȮMޤut~Na"$2GMJK(/f#53YHڬXܼ#S"ewۧA"2)w!}> T|#G:@@C1P͒ +|QhUh[Y悟wTs._=_}j hrHЗ#Yu„љ"cs fAIBὲY-f"m ApY+A/}pu_efuє%JQ$䃒9GO6.D SYc>fCBJEo@jԋd< J~qD:I`ͧS218J{^6<Ŕ:{f2@RȒj *7XfiqZ߷難_>9$bIˆQe;,{#l=DSXKG+ǒ 9F ǣ ua"s46*| Mh?d _tSpnlN!01XXg9rUʊ^tJʙ߉-u:|V' ec'gG郕GQAtT,be\a+QG*^ B:Ga;XXUFŪ~eؽ_$~ $s& +#u %aG`_Ql`tV!toÃX-TQKP7tY+JwփY.:GPW"{oRTXO3Q3ljpᮣa6bh> 6jhQV{k蠫B%$ߏﯜ?>׺noctdw;%rC6iqЋf֬ 4J˼ޥVRjC,3@@ڽ/)V@,Ϊ~>ˇO.d.;R}L!NbHQ&DH"?gbĆ MmK5D֋%bu_!/gλZf&hTK +)m8y\:(eHQ3]aDGP2T ZR wO]\Xݿqf=K@b6X$#ޤxLQ1U4mI CpQ%K!)ԱTz^6tcS:ԁ)[Ÿ/6W9q)>dJ/f"BuP)ԑ + FW鱣6ҢAmM{S]#Wa O5;}t)@oy}[R7dȬBi͉ӱS7' E@#FjXT;b:P/<فi*BZb:j\eJŪUR뤍t`쾗zEo&/2OmGJ$ N &0EჭEA5XX ~yG'GJ\}V*3HItՂvaA'wyy} [ qtJ?S ̳(} 1({bPk[FţM)J!2{5p"V|zR?|$>+~IqB"~Xbyzӛf%Hr{.+$1'O,Q9)AY܋6K. sEt!nlK"yAFzA+,iGӳ +IPO#$G SeOF%FIu# se1m';ohPѪ q+E19^;04 +4ȶiMEW=.LX XfD%RVE8dO TYD|j9E{D^ZTB'k¯-Q>G3(,mIy 8Oh(vxin>q071/lp*9,Eg6Ϡi0r+e5nsQ*:\MpFB%4rѩIG5zp!J]*M(s}2@ɿQp-QOX"ف+E}DBI"a]Wvh+X>s4fD= +bŔ^h@ +!C#@  ~nw4z)%񞪆XEo$!zU:9=y܆ʐaSp@;<{(.1po}`WYK;M`/Ds  Eˍ/d,V)ӔkEP}'\EΕ:Rs&"kfk6*;dn:b"2KQ},8rJ2bu^+ > (b8fE^{@,˩-W GV +QtQjUTpڋա W"[^jo>@wd7-9*>%#3@ܹ%TifƲиAU*C: ~qޏKv_Z^l-nOͨQ"Qk>IA<TTS(KFw0:846d#v\knERrDLU"iiy) '08!]znIyv0yKG]4(`N Il JQe}eQ,èP!yQ/y`ϭO.zuDoXy:`D0x ҈ts¨\Wc+i}Olߟhy}F X YǴ4sY$ *$FkV^ 'O-[堸Tԧ<)eք't4'[yS. cW H_pJ$?&f ;&fp8z:nK m +Bfǖ#y nWK{+Ea+NjûPF 9邙5cT7?K͛ z!1{LAC bAG<}%k"H$+d o RMoRD:ŤRmI)t8PϪrJ2@1ɀ4oUv?к/td. [EgsK|$e ۛ) bE`)aAIVm^}>ƴZ*1lo\lea_?h$Jp{i]Ĩk +îkƆX6Y̭?!C {Ѭ}v9<S1F*Y5'K}:مB +qczzUqAP+s?h M"=O$H!``ABQQ)!E:KbSX1_ 15\G8L2Bo(ޮXX G٫;z~4z_/ȟHBߐE*3bg8 ׽&vG1)O~ 'J<BΆ>E2$pʌHZG}*SL"PrjTicNOB}C3(fZY I!.M y %#.F,'炼GݏXL7+ sl'%!,cYW3mOs ԙGIl6B?. iFhS*(Ĥ¦uj9b}+>{y}}t?w}sF={/)t:A$ݏ {2@.+(#XCLj~NhvPyZeǩ*{m->"T Ժ +O([#D/E=EII%=|0Br(FD 7"db2@J?Vaq@i=X2l@<9*I+TJ*Ga&!5$Ai"͊.f6qBEƋ<sEg?7),t1G .#;h9Tg/~f0$jT!a!&E xj4$C P)oR+Ԅ"x_aϐIQKۉs O:"BUIaFB&A`cz$ +`>h蒬^:L9k+>"š*BgD2S*c}oTwpVUs0 QjуQ'Hn+A\Tϱ3ɳdb/ u.W\ +[dA\aԏ.W h:T   `$. aRTA4%m|]!Jwl+*Agrl_ǔMO ~{QH|xACƳTb}#I}F~/? + TL$ҠuQI:(fӵG@fk7m +DwNĽhimJ;ޫHyXyy3@LKeӼB,#LI[:G9ơf:q +f6@fz3[wN^e ?4q3Tu^VqbQ>e4*JAÂh;ӂQW N9sU[4f5wk%D9\,^f![:؎-crX}\BPjICFNF "X9Oj9O=s8R5 H,Y:WbT¹/߶mW=U#º/d@wJ- ChWӟJEߓ>U!Nz":"XElzIK_#v*mOn֛pt>,,3'>\(Cb0x' aTcbI_%3@P*}q `!p6d5(Ȏ^ˆ %M1?8pGG!ሬ!dX?x pͭ;/OF7rY:v (QdN&8":Ok7i3\Ō/o)}vP}بKJB܃e)э Xn=$F H}Y2N:~~C+6>yo=3H਌C"/9ȼ] i\o,,·ggɡ:XJ} A6 `!yFk4n;&Zi7u }]3X NAЄlJ]'샖gF_P/ܑ mDTpݮjx9@x?phubY$봟'e 1 +[XH0;9o"zIdONt!qL.Q Z_ocqe,mx1nݢ[Exף5F O~pчP3i9,yš]uS$i6.(uB|DB~^IlG넂#Ɗ( ҒA 6o{6:R$"=QC&%  ģN=D$- + ~]~${_W h_#Bkאؤe>r窸RC + +dk k Vh%ɀ~M+4#ԅȨ*c +!In~ !8Ƙ!!"GVE +=Oj$;=2)h .bIL砝G\~u{k$U0t6)eĮz )8Ypd.gsIP> !ӴD 7!jP'R֒z1}*>[߁ddJs6!%t JuP%p +'@:a@dlA:$дN7<8}U~~_ھڻ Xw>'Y[0kVm $UAhW,ȒH.D j`*q>WB~I~y>p-BnsU?kVcFĭ!ӋjЦZAUP%OB`9c*ފJ>ACU^?!7לhň2'U2VXAH^iҶЄE8ժ-!&Tbд|:[#WxI6(IHuS>_֩1;}w7jքP /PW%dA!}(wȦ`,Q䛩^NFP*1\P>('Wj;H6= z?އe}Nf@d/aOR/ Z2 y{%A.}Q;GB 9HDjt}㔊~ƇmJmZ2'HSpoB7}6wvo!>휋zilmKF+8/AU!F42Tuf"xNwJևtZ ȃSOe|SiGn!BFQ\7r=h 's +EE\4DV0i86'koBˀp-%(yAͨ4mly(:s34 +J %aXZZU򊇈=,-/9ç2eYg-1O E$hF9گ$zOb@8.9 @0$-`܏ .K}^>Y0LI㪌Cz`<m"HEf?|,p| ku=R2-V)|ߥӆzFnGx %FEe`3\ 7M*^$CwX Ǒ S h w!2o)zIyAx $AGಚW(d֡]h<vn]= +1;G]P#TT 0}{CzْL l98h8A! !䃆7փC!Y.JYvdDժ3Mf.uRtT3Yz|BB3Unɗp*BTpb1"flԟC2@;4H6m~ ln8)=L6IMT!">_nǸ}01PF5h1lS(:I4HhEj=ehult[ U!"4'ԧz|螎ke<ߢ"fe %#1Αnxn]"qMH0! &(3!1))Ƥ\Z]JnHD(\I :&h )}L \ACY pQd`yptGH\ i< (KQA"Rʔ_ˊt?LxG8clǙPQB|W"-pV|QXJӡ {/<ꀑH#r2\`8Y +t+L?YI?%sI-ȧ%RϓED䍴ݎv.TPQ_aċ2ϼ4(:V IEķ8pYfdC|JH?8JE/e<@(tѤf_ev̷x ~LnAڼx?,>(e +GqX0N3Q@n*ԡ2MA Mt(n3}ҕVJ?#_`>a/kS*+De~ }1v_,0P\{AN&u(M`EkD lTɝYPq/^*حDF|Jһ  +3>*sO$r+c)(}rt<"d6 dyW{H³b6/l-V} >~_-9%TW9#LLU3*1FpP`_sFfT +Npҷ?h+G}f~6SsLI`T'608#n{yP_J!PiԄգ=}Bm+  :bǏiibrM#*5i͝u8ѴVr2Psn(#$00@e`RڼKOvf)Y>3!U1N +vIV:U|Sdj'g 簆pE Hb&S,bSRZ Rr޷9WK:Gd}QUDD6 o-=hDsQɛOP(E>DI0b*`Tؔ) &c8lt}AКv<}0S4tϹlZo`RG4mi!ې !˸!3@@؄RulYsGtHaPtljǎ!#/gêN#L[*.C& ]Q0Don(I8PeZ3@`y~8:-0oGp>XTjbT4!0O@Rs{!,22Ϗ+JQHHFRxLk5y+q_@5 Y/N(7Iqsemyt < DTa9EbU!<__D $l,0n3|.thElTlOńBn*rq`ج55L**Qh86,RQK S>I҆iN%_ޝ^FÌz̈́zR)1di<>1ޒpnOu^1IMzDYcӔa;CfS>q+(Ylܦc(lBt+D ^Lg+qKƎ}$NM[,fA3)n9\E/TmZ.iDKPYϨ/Rd58b~>g5* ʕ߭_}u`4BiA-F3蠡 +i;hȹ:ՍEz'1Lf.bKe2pcbqRMHk*SͥMRgfMRUQg͚sl8HNG-K)Rw,9q\<ȤAj4^$0S$gmM vǒz2P )m.˧gsRMDN1 8DN PJI@nd(#$(t1]ARB8pR+S&v?h~eҊ rSh_>#3[V0 `(MG5~:|8 d?j8Տ1z`AJ^ztaI +M#W+ڼ*E-7-1XZ'oGUZJ|'ի+Nsw:CNmaO,E!҅ @4aF,M/FMb+1dW> ?V.+w:nOTB^GpN!)U.TY%wuK[d&ꈍ:.̋ev,0^L@Ke'pI,j]A=&?HE)gAQ蟈QR1XXGGpؕנ&&ٙFC4-8tZeJb BBXF;!|?gG' +$y*ecWvQG~ oԿd@wS({V%y0*"ɔ mBJLm*Ň#i՜T#5d3!^R@dRdŘZ!0UG2 +d(Bb6CvVScyOgqX>G6 +2aL|#"F Di1'S* +{XBT J=5oJ2.C.5CBn\41|_\@C" p1 Qcɤ hCx+`)ZAc:DŻz dJ1"JzI(. '|"">q>ff ( +d^\bv5щ*QH*PHpˉ]zVPP`U MSVJqUB}.%UHъ2kjqZBce௥F*4Pwq>RmJkJL,f&˜TcqN\-.I^ +'H*HVrhvcHeRJb`"3 ӳHSG-FoGJ/ZiN.}>WW= +jgH~l~5Q8[%?HaqVwMkӄ> ~Jh`_$(U  >\bo] &[-F|= XGBŮ}MjF*%(?Q{իyի-W_ǪW+T%^IJ$74_ yNabH_w!# j M'}d /X}PXaֺbBε)ۃ>g՗kVXWyW?#Wի$ǫ')W29^ͯԘ__}^Fh~ȟ7ofa_p#TT1l/UL~K+Im RԨbǨbGd$9<@ pL  ()z$fS- +wn*&[gE:,^bCivwilQq{,򴈌;Kb i%K>K˚IAaAo> 2@" +5Ks23m R+*39gN؅ 1Wnrd0f/1g#D8-Q2g@hAD:<3ZB=Кz1Q%*.9)HYtpAxhI$yaE}]}= V ǣAX?HH|OᨆFW)N%PX't-иsnM@tR2@`2DwA6a}7~2h (K@P4<! +HK"FJdtȦaQQ0-dv]ȶ)8tGB23ݞ1l$.?\F@^…aacW(B p"IkKEOЃHUJQ0I'pf&pN=.\U\ԩ`;zf?0*.۝mG }bDa%n% w_4 +!O +HmTB$a!HR82^`[(-\3\ TèXoH {^Q%XyɖZ,D,drЋf/ ۛ\4BDZ CLW-v*724|Lb[߄`Ң;YS'O֗)lcQq-! @jDD)7$ǒl E$ IBp;E3fgLi9 r.,[jfPLAH] qC.Rʧ[vmY8'Û6r39L[|ؐ +6ܚM=d-;U u,"RU[0%S”l 0yae Y*N%!"D af8 #<|J1K5ȕi]зk?1boV]LM 6>stream +0*xYha澡*A+9_}3.фq'J|$$ 0!96Ec:C]0 $19 jeTSy2$0IEUJpB,"/H\^3@`y\"v$,.afqxƊYs#U&\ŒO I2s-CX<%Z&iw1|x'yrd,p"&Q"h;ejw|'x`,p:ni;g@M^6Pz#IPsGswf6Oq6#BQIDW,k$I͇Cf4#~1a .Z$܎ a r]M{s&QB剅_^UI_Ƞ.mj_т)a98IgD#'A)j1jIA$u@Xxۈ>$[}$$+SCWZ eK4A<3edaYF/dE В;RV i,Dh$u/N!B&AaTv=#O?7C2@{Pn`b [ P +̫A'DGຼ3Nႋe) $sHH:6 ^AȆ`4}i1pAL1!a"(q[ "yFC.}ZvETV,ɈL~=`2!%=%ibPȯ2AUYvmx\xAL eL@"_zľ6).t(]SƔ3V:4axO(UA.%7}>9e87x{2@VٖO'.'w,M&h̤G;JLi5&S$Oa^ǂZp' $4DIc"F+@1~DdMIo:J?TJ7(L"&$,p4Lc{+C3=8)5=*Rn#6]EeL텖&JaUY"X$˴>VOuNDr¯#|_=NId-$ x \'Sz[WƔBՖ 7? Nk -.-[>{0 /45A?giM_QOk=4[ +~A?5U<b*pJ3 TQU\D+bi{۳>.LrQπWS+ +~ւOjBw"/!I)x22 2 n_md?o^jz+8$=9lZ+j QU>wB 8}}~_>œ&&41AC`ofO{K $( 05BNH7-I5c[gJ2y(c_j`j`߾w + 3@ eED_XX:aZؿ0>Zo9-$] 0>68U2U1U,*T1`$! <h8Bp4DdFIP4 }2#`{kӷPe=U=@z*2@ n#Q.i[o c_|n !Qr@d1e 3*.vX8 p1d)00Kl\kޝFS~=~Cp<ߛ&i]Izk kߘ x5Bp)Ca 6R҃d圬ΝPBmx&ol\1 5ZuZ2 X%,Ch34gOI>h*M^JhyqQ$#z{ቄ,v-vG:^A\e:r$ =<+Q^q| "C@0~X&DAPņY +H=#vU5c֩D+䚃ȤAYb,jO"$^',) Kܸp' h c3{d0}\""VTh;<J~MN#e .U6,T*52)"2=:U3@`!`Ĩ!@CJ؃  X*)SJiQGj")1QkϐfhD+V\Vʨ0F[FPG&DEIQ.˂^GE)lSBEdB1^ ") 8(hd*$'Ԩ#פ9s9gTQM(\$FZnRj}3MʰqqtQ`U ]J:KY2=y$M卟u0wWЁ#IGCPQyK*̮tTag\`2EHlgfp1lw1]b^N9/Lo_IY GEe`1j;^]%/=RFSST@Wc}AbhzT; +Fd€2sluu +u0A1m:n +U]I(iPB4Vް"si蒁k _\ R'e{$HBJ dKvD\BS vHʂX8):h@5ɀj].F*E(l*ձ +QbdLDl1dNK\zQ4 4vK/J^Baʉz.* cɰfӿ 4uT m ^dX5ʰvX' +iF%h9 +We)ڑqM8G1GlL)a-YtA"OtC3"LCsJ**pQX;M=jjh[Mf'~<'뢅[5EBMj_ykVX{^]z0D 5%p逷!Ģ2Y=(BNkLk`a2ľR(^ߺkf6X.(.(((`0yQ&a$6<Ȧ8Bp7^_U$Q$[կ f$е%PÒqE\~ +SCAhr%RVX ߭LRGYG_0L GaQL G + =CKL:;!]0 XR<Þ:_v +R9 M,fA?CEpMi ̅he\r.Nh.5I7n&|05kMxVaRujHHC l<{=6:]E|}f'CP>- +BGAB,,/^@ _O s&{,Ҟ& Mּ`kFgWˡYBtJ$%6IIxωo +:q}5)HYN q<ͷ DEuTԘaA I53Zk6U<K{JZ*zgTd)=-#B'"pWIkb|~#v9 +{0RjP-q|!!aP~Z +_A)QE)QE7,z$O~<5 "),Dt#.c>BIU8" )±Xrv)33f uЈ%գx5Xf2|~ɵ/p8Y$?: _+ <Јh6,0kkILT.8yj,(HJ`4>=#sf$QGIg7s}RУ+GW0e #o H!JI$!L ОS~Eu@;3]i/+ⲛpsy3]~Qz&|dOO8 +3@qGH u>q$}-n\{zܔo4bM俫<Ti䗎jHE1J/: ٣JoݢRPh]}z?FG,<ٗd) r'Z4%"NJ TIYWU^].Iwl9Uc&P3F& z8t0^dWJQ]}Kj*"MYLNJMa<y@%ٟx4MO?ú^,Dh + +v&DST$ z8p`J1~NM"ӨC%Sj9}bo^+j9|VôҾ8)h?c,Yv1s, dU4qo86tIڵ-> +YyeE怌BF[2@PQڔN}A"CCw—s_k_г_9s ~x8O"1 pӪ2TH:$V"~P #8Q$%qL8O{E.@.()͔2٪Z4%;+|M +,E~ʾP99AIFuN!2)4R!D8kp*),tct{"0<̩?o "C<^I1 $ *Ղ?Xg91휡}ȾP>?@D$zm:%Qؾy Ppq$S~WT +IDk'*2K5Z}V YB,j&3V'd]>d4o.4'.'٦5M)t-(҇Q#?.ɊQ/YM*ts%A,vom[P9qۗ.wdW@Cz࿝37Y,W.粿hJ&|>NP)*҂Q +Yn9/T+l93 ^D/`o5#9;tG6r||?Q_ 9Zp\_#,Z& E2t|X"8)- ࣜ#܊J_]6_7JIHV8 +a#|T|M4wH#l_Q0Z)aOQ +>h *)Q|˪{_sOI*H?ǜL,W]6 6NA]9BhtD:G} Hr4. nf4`3}[q>)Pٙ5Z@r=Ha!Z7Ȧp0)$@6L15 -XODP:Bkn3P8s'ʸ%(Q}d7IKd$ |UNQS1)f.ݔ& `L& BIT#Qb9"S]/G!,G`K :|c4&*'&Նx$DSxh *U+)*^/{,hܨĶs;I4ݢabħ4,jqIOS\ SL_^, U+$7LhI3ϊZ{pm)$k"D3@ raZe<&.dA^ M&؋̅ap9 "iECv@yp +IHdqX &>"MLD(2\CA C4fdHMV ȇvEK}Y +Wِ! dD`A3V'7SM[ tOe+IRnBDc\Ba\lTJ(QazFM~(Or` T,4.":*bVDkZp}K3h&i>;ժxK!`Ľ(#1x@'E*1ۣ!#D'#.$fUڪ(iUC_b"Z  uQ%" {dK7h>H ~bl>hfld +UhɌu 5˟ .eά*~K** M% u^#X,F05DD3HSEHɟ$Tm3'RB8&cY"ٷ!l,y``nΜ5/b'Ĭr4ABSiBI}* D`0,ZK0C +ÑvzN`<$,1*"}L@E8P)T)tK+義 ?otr!eC/Z `2'}coI̎M)\ *쌎DϠ,n $#ɽ]j/Wgkx"kaj8:հHgq7: 2Fs!, BASxdTy +ft<." |H;YsrD*XDAJ *|97ƍ5z4Nlsz 9GRx@` s1QS(M!M#ܔdjḥQ UMr(=`mIU;4ۃ#SWtN +5a"EOŲ*+o¸`G/'׮0L' y_C `&3P[2w៧WԀ2V7!βq?\lx">> $55Dھenc_UBhUB) fDq44z2 w;Fb9f 3ePZ3'BqA95Ht5SqllJ+~On1`iĜR\]4֝F&b)"шͤ$zgU[T(3XF 'E +P9uL*^ R;Sd\ CDk1ՄʜhAe$glNU# >H|2@` )hZ>s!>R }MʠDi$b2'aP)J1򵴋n(1|G5 *x&Bhl'$rZ  >SNq [DOX9Hhs/~J0 ,*l u( P!sAe4Ux+SU ʴBR\TȘg(_x<7KN"%пk(^:C4mL&@5juZG +2E TE?XQЫYi@f#DnӯnGQ+|*ec¯#_Ad} !N&(B8x{h9bq"j}8u@xƕLZ!V`zXO6Z{ZfO}dW1ME >}HWH 0x*J[/9ɮUd*R^#*<̚|E Bo^B~ +/*\0>!eѕWWw? i?4ش_]٧1)~ >) uTWOW PX FWS$%ࣗph15Aj[9pJ9!'>l[ۜY9}W""|5a~) ~ft +XZڄzAӯwEw)w|Ӓr;1|>+> f2~ |>wdS?9 ?{D>pW = 8Ҳ)R݅R mV67$ ~_xWy1= `>/Y @ל9)g Nnk~ >Ɂ:+:(318lc<-rk+0fX@&CI+MAwi'zP(!L,gPЈt/hP\\e