From 820bb44b18db394a99ff2eceba7dd1f625f2c995 Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Wed, 1 Dec 2021 11:52:00 +0000 Subject: [PATCH 01/15] v1.0.3-alpha.0 --- lerna.json | 2 +- packages/auth/package.json | 2 +- packages/bbui/package.json | 2 +- packages/builder/package.json | 8 ++++---- packages/cli/package.json | 2 +- packages/client/package.json | 6 +++--- packages/server/package.json | 8 ++++---- packages/string-templates/package.json | 2 +- packages/worker/package.json | 6 +++--- 9 files changed, 19 insertions(+), 19 deletions(-) diff --git a/lerna.json b/lerna.json index ecdba97c2d..5ba227120b 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "1.0.2", + "version": "1.0.3-alpha.0", "npmClient": "yarn", "packages": [ "packages/*" diff --git a/packages/auth/package.json b/packages/auth/package.json index 36cf59d8c8..782f42fd7f 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/auth", - "version": "1.0.2", + "version": "1.0.3-alpha.0", "description": "Authentication middlewares for budibase builder and apps", "main": "src/index.js", "author": "Budibase", diff --git a/packages/bbui/package.json b/packages/bbui/package.json index d2c7244cd7..41829cf4a4 100644 --- a/packages/bbui/package.json +++ b/packages/bbui/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/bbui", "description": "A UI solution used in the different Budibase projects.", - "version": "1.0.2", + "version": "1.0.3-alpha.0", "license": "MPL-2.0", "svelte": "src/index.js", "module": "dist/bbui.es.js", diff --git a/packages/builder/package.json b/packages/builder/package.json index 3761e3ae54..f542d6cf39 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/builder", - "version": "1.0.2", + "version": "1.0.3-alpha.0", "license": "GPL-3.0", "private": true, "scripts": { @@ -65,10 +65,10 @@ } }, "dependencies": { - "@budibase/bbui": "^1.0.2", - "@budibase/client": "^1.0.2", + "@budibase/bbui": "^1.0.3-alpha.0", + "@budibase/client": "^1.0.3-alpha.0", "@budibase/colorpicker": "1.1.2", - "@budibase/string-templates": "^1.0.2", + "@budibase/string-templates": "^1.0.3-alpha.0", "@sentry/browser": "5.19.1", "@spectrum-css/page": "^3.0.1", "@spectrum-css/vars": "^3.0.1", diff --git a/packages/cli/package.json b/packages/cli/package.json index d3c09d5be9..52ec593393 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/cli", - "version": "1.0.2", + "version": "1.0.3-alpha.0", "description": "Budibase CLI, for developers, self hosting and migrations.", "main": "src/index.js", "bin": { diff --git a/packages/client/package.json b/packages/client/package.json index 97835597a3..3375644932 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/client", - "version": "1.0.2", + "version": "1.0.3-alpha.0", "license": "MPL-2.0", "module": "dist/budibase-client.js", "main": "dist/budibase-client.js", @@ -19,9 +19,9 @@ "dev:builder": "rollup -cw" }, "dependencies": { - "@budibase/bbui": "^1.0.2", + "@budibase/bbui": "^1.0.3-alpha.0", "@budibase/standard-components": "^0.9.139", - "@budibase/string-templates": "^1.0.2", + "@budibase/string-templates": "^1.0.3-alpha.0", "regexparam": "^1.3.0", "shortid": "^2.2.15", "svelte-spa-router": "^3.0.5" diff --git a/packages/server/package.json b/packages/server/package.json index 17ce9e6582..c7ab5ccb67 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/server", "email": "hi@budibase.com", - "version": "1.0.2", + "version": "1.0.3-alpha.0", "description": "Budibase Web Server", "main": "src/index.ts", "repository": { @@ -69,9 +69,9 @@ "author": "Budibase", "license": "GPL-3.0", "dependencies": { - "@budibase/auth": "^1.0.2", - "@budibase/client": "^1.0.2", - "@budibase/string-templates": "^1.0.2", + "@budibase/auth": "^1.0.3-alpha.0", + "@budibase/client": "^1.0.3-alpha.0", + "@budibase/string-templates": "^1.0.3-alpha.0", "@bull-board/api": "^3.7.0", "@bull-board/koa": "^3.7.0", "@elastic/elasticsearch": "7.10.0", diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json index ba3bd76dad..e405cf607d 100644 --- a/packages/string-templates/package.json +++ b/packages/string-templates/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/string-templates", - "version": "1.0.2", + "version": "1.0.3-alpha.0", "description": "Handlebars wrapper for Budibase templating.", "main": "src/index.cjs", "module": "dist/bundle.mjs", diff --git a/packages/worker/package.json b/packages/worker/package.json index 1ec2488af3..38cf957e32 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/worker", "email": "hi@budibase.com", - "version": "1.0.2", + "version": "1.0.3-alpha.0", "description": "Budibase background service", "main": "src/index.js", "repository": { @@ -29,8 +29,8 @@ "author": "Budibase", "license": "GPL-3.0", "dependencies": { - "@budibase/auth": "^1.0.2", - "@budibase/string-templates": "^1.0.2", + "@budibase/auth": "^1.0.3-alpha.0", + "@budibase/string-templates": "^1.0.3-alpha.0", "@koa/router": "^8.0.0", "@sentry/node": "^6.0.0", "@techpass/passport-openidconnect": "^0.3.0", From 60a07193d22113c69b919ea368bfc12c13ff1556 Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Wed, 1 Dec 2021 14:28:00 +0000 Subject: [PATCH 02/15] v1.0.5-alpha.0 --- lerna.json | 2 +- packages/auth/package.json | 2 +- packages/bbui/package.json | 2 +- packages/builder/package.json | 8 ++++---- packages/cli/package.json | 2 +- packages/client/package.json | 6 +++--- packages/server/package.json | 8 ++++---- packages/string-templates/package.json | 2 +- packages/worker/package.json | 6 +++--- 9 files changed, 19 insertions(+), 19 deletions(-) diff --git a/lerna.json b/lerna.json index 4db25a14c5..1a7e49a54e 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "1.0.4", + "version": "1.0.5-alpha.0", "npmClient": "yarn", "packages": [ "packages/*" diff --git a/packages/auth/package.json b/packages/auth/package.json index 7ce3784639..0748fadcf2 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/auth", - "version": "1.0.4", + "version": "1.0.5-alpha.0", "description": "Authentication middlewares for budibase builder and apps", "main": "src/index.js", "author": "Budibase", diff --git a/packages/bbui/package.json b/packages/bbui/package.json index c0431b33a1..44f3536011 100644 --- a/packages/bbui/package.json +++ b/packages/bbui/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/bbui", "description": "A UI solution used in the different Budibase projects.", - "version": "1.0.4", + "version": "1.0.5-alpha.0", "license": "MPL-2.0", "svelte": "src/index.js", "module": "dist/bbui.es.js", diff --git a/packages/builder/package.json b/packages/builder/package.json index acaef5bbc5..3145a9e5ed 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/builder", - "version": "1.0.4", + "version": "1.0.5-alpha.0", "license": "GPL-3.0", "private": true, "scripts": { @@ -65,10 +65,10 @@ } }, "dependencies": { - "@budibase/bbui": "^1.0.4", - "@budibase/client": "^1.0.4", + "@budibase/bbui": "^1.0.5-alpha.0", + "@budibase/client": "^1.0.5-alpha.0", "@budibase/colorpicker": "1.1.2", - "@budibase/string-templates": "^1.0.4", + "@budibase/string-templates": "^1.0.5-alpha.0", "@sentry/browser": "5.19.1", "@spectrum-css/page": "^3.0.1", "@spectrum-css/vars": "^3.0.1", diff --git a/packages/cli/package.json b/packages/cli/package.json index 613b448807..f34117c22c 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/cli", - "version": "1.0.4", + "version": "1.0.5-alpha.0", "description": "Budibase CLI, for developers, self hosting and migrations.", "main": "src/index.js", "bin": { diff --git a/packages/client/package.json b/packages/client/package.json index 8297503485..bd6e562691 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/client", - "version": "1.0.4", + "version": "1.0.5-alpha.0", "license": "MPL-2.0", "module": "dist/budibase-client.js", "main": "dist/budibase-client.js", @@ -19,9 +19,9 @@ "dev:builder": "rollup -cw" }, "dependencies": { - "@budibase/bbui": "^1.0.4", + "@budibase/bbui": "^1.0.5-alpha.0", "@budibase/standard-components": "^0.9.139", - "@budibase/string-templates": "^1.0.4", + "@budibase/string-templates": "^1.0.5-alpha.0", "regexparam": "^1.3.0", "shortid": "^2.2.15", "svelte-spa-router": "^3.0.5" diff --git a/packages/server/package.json b/packages/server/package.json index 8088c7acdd..955dd0b1f4 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/server", "email": "hi@budibase.com", - "version": "1.0.4", + "version": "1.0.5-alpha.0", "description": "Budibase Web Server", "main": "src/index.ts", "repository": { @@ -69,9 +69,9 @@ "author": "Budibase", "license": "GPL-3.0", "dependencies": { - "@budibase/auth": "^1.0.4", - "@budibase/client": "^1.0.4", - "@budibase/string-templates": "^1.0.4", + "@budibase/auth": "^1.0.5-alpha.0", + "@budibase/client": "^1.0.5-alpha.0", + "@budibase/string-templates": "^1.0.5-alpha.0", "@bull-board/api": "^3.7.0", "@bull-board/koa": "^3.7.0", "@elastic/elasticsearch": "7.10.0", diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json index 669382ad02..145800dbb5 100644 --- a/packages/string-templates/package.json +++ b/packages/string-templates/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/string-templates", - "version": "1.0.4", + "version": "1.0.5-alpha.0", "description": "Handlebars wrapper for Budibase templating.", "main": "src/index.cjs", "module": "dist/bundle.mjs", diff --git a/packages/worker/package.json b/packages/worker/package.json index 43214d5cb6..6917856ceb 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/worker", "email": "hi@budibase.com", - "version": "1.0.4", + "version": "1.0.5-alpha.0", "description": "Budibase background service", "main": "src/index.js", "repository": { @@ -29,8 +29,8 @@ "author": "Budibase", "license": "GPL-3.0", "dependencies": { - "@budibase/auth": "^1.0.4", - "@budibase/string-templates": "^1.0.4", + "@budibase/auth": "^1.0.5-alpha.0", + "@budibase/string-templates": "^1.0.5-alpha.0", "@koa/router": "^8.0.0", "@sentry/node": "^6.0.0", "@techpass/passport-openidconnect": "^0.3.0", From e003f28e2750f1cae6a8351cc0ff2ff5843d0edc Mon Sep 17 00:00:00 2001 From: Martin McKeaveney Date: Wed, 1 Dec 2021 21:33:38 +0100 Subject: [PATCH 03/15] completely automate digitalocean release with hashicorp packer --- hosting/.env | 1 - hosting/digitalocean/README.md | 19 + hosting/digitalocean/build.sh | 2 + .../files/etc/update-motd.d/99-one-click | 19 + .../lib/cloud/scripts/per-instance/001_onboot | 22 + hosting/digitalocean/scripts/90-cleanup.sh | 49 ++ hosting/digitalocean/scripts/99-img_check.sh | 617 ++++++++++++++++++ hosting/digitalocean/template.json | 65 ++ packages/builder/package.json | 2 +- 9 files changed, 794 insertions(+), 2 deletions(-) delete mode 120000 hosting/.env create mode 100644 hosting/digitalocean/README.md create mode 100755 hosting/digitalocean/build.sh create mode 100644 hosting/digitalocean/files/etc/update-motd.d/99-one-click create mode 100755 hosting/digitalocean/files/var/lib/cloud/scripts/per-instance/001_onboot create mode 100644 hosting/digitalocean/scripts/90-cleanup.sh create mode 100644 hosting/digitalocean/scripts/99-img_check.sh create mode 100644 hosting/digitalocean/template.json diff --git a/hosting/.env b/hosting/.env deleted file mode 120000 index bb1b54ad77..0000000000 --- a/hosting/.env +++ /dev/null @@ -1 +0,0 @@ -hosting.properties \ No newline at end of file diff --git a/hosting/digitalocean/README.md b/hosting/digitalocean/README.md new file mode 100644 index 0000000000..07370b1b87 --- /dev/null +++ b/hosting/digitalocean/README.md @@ -0,0 +1,19 @@ +# Budibase DigitalOcean One Click +You will find in this directory configuration for packaging and creating a snapshot for the Budibase 1 click Digitalocean build. We use this configuration to have an immutable and reproducible build package for Digitalocean, that rarely needs updated. + +## Prerequisites +You must install Hashicorps `packer` to build the snapshot for digitalocean. Follow the instructions to install packer [here](https://learn.hashicorp.com/tutorials/packer/get-started-install-cli) + +You must have the `DIGITALOCEAN_TOKEN` environment variable set, so that packer can reach out to the digitalocean API for build information. + +## Building +Just run the following command: +``` +./build.sh +``` + +## Uploading to Marketplace +You can upload the snapshot to the Digitalocean vendor portal at the following link (Requires vendor account): + +https://marketplace.digitalocean.com/vendorportal + diff --git a/hosting/digitalocean/build.sh b/hosting/digitalocean/build.sh new file mode 100755 index 0000000000..743629ca12 --- /dev/null +++ b/hosting/digitalocean/build.sh @@ -0,0 +1,2 @@ +#!/bin/bash +packer build template.json diff --git a/hosting/digitalocean/files/etc/update-motd.d/99-one-click b/hosting/digitalocean/files/etc/update-motd.d/99-one-click new file mode 100644 index 0000000000..0f087a26ee --- /dev/null +++ b/hosting/digitalocean/files/etc/update-motd.d/99-one-click @@ -0,0 +1,19 @@ +#!/bin/sh +# +# Configured as part of the DigitalOcean 1-Click Image build process + +myip=$(hostname -I | awk '{print$1}') +cat <> .env +done /root/.bash_history +unset HISTFILE +find /var/log -mtime -1 -type f -exec truncate -s 0 {} \; +rm -rf /var/log/*.gz /var/log/*.[0-9] /var/log/*-???????? +rm -rf /var/lib/cloud/instances/* +rm -f /root/.ssh/authorized_keys /etc/ssh/*key* +touch /etc/ssh/revoked_keys +chmod 600 /etc/ssh/revoked_keys + +# Securely erase the unused portion of the filesystem +GREEN='\033[0;32m' +NC='\033[0m' +printf "\n${GREEN}Writing zeros to the remaining disk space to securely +erase the unused portion of the file system. +Depending on your disk size this may take several minutes. +The secure erase will complete successfully when you see:${NC} + dd: writing to '/zerofile': No space left on device\n +Beginning secure erase now\n" + +dd if=/dev/zero of=/zerofile bs=4096 || rm /zerofile diff --git a/hosting/digitalocean/scripts/99-img_check.sh b/hosting/digitalocean/scripts/99-img_check.sh new file mode 100644 index 0000000000..32a9e77eac --- /dev/null +++ b/hosting/digitalocean/scripts/99-img_check.sh @@ -0,0 +1,617 @@ +#!/bin/bash + +# DigitalOcean Marketplace Image Validation Tool +# © 2021 DigitalOcean LLC. +# This code is licensed under Apache 2.0 license (see LICENSE.md for details) + +VERSION="v. 1.6" +RUNDATE=$( date ) + +# Script should be run with SUDO +if [ "$EUID" -ne 0 ] + then echo "[Error] - This script must be run with sudo or as the root user." + exit 1 +fi + +STATUS=0 +PASS=0 +WARN=0 +FAIL=0 + +# $1 == command to check for +# returns: 0 == true, 1 == false +cmdExists() { + if command -v "$1" > /dev/null 2>&1; then + return 0 + else + return 1 + fi +} + +function getDistro { + if [ -f /etc/os-release ]; then + # freedesktop.org and systemd + . /etc/os-release + OS=$NAME + VER=$VERSION_ID +elif type lsb_release >/dev/null 2>&1; then + # linuxbase.org + OS=$(lsb_release -si) + VER=$(lsb_release -sr) +elif [ -f /etc/lsb-release ]; then + # For some versions of Debian/Ubuntu without lsb_release command + . /etc/lsb-release + OS=$DISTRIB_ID + VER=$DISTRIB_RELEASE +elif [ -f /etc/debian_version ]; then + # Older Debian/Ubuntu/etc. + OS=Debian + VER=$(cat /etc/debian_version) +elif [ -f /etc/SuSe-release ]; then + # Older SuSE/etc. + : +elif [ -f /etc/redhat-release ]; then + # Older Red Hat, CentOS, etc. + VER=$( cat /etc/redhat-release | cut -d" " -f3 | cut -d "." -f1) + d=$( cat /etc/redhat-release | cut -d" " -f1 | cut -d "." -f1) + if [[ $d == "CentOS" ]]; then + OS="CentOS Linux" + fi +else + # Fall back to uname, e.g. "Linux ", also works for BSD, etc. + OS=$(uname -s) + VER=$(uname -r) +fi +} +function loadPasswords { +SHADOW=$(cat /etc/shadow) +} + +function checkAgent { + # Check for the presence of the do-agent in the filesystem + if [ -d /var/opt/digitalocean/do-agent ];then + echo -en "\e[41m[FAIL]\e[0m DigitalOcean Monitoring Agent detected.\n" + ((FAIL++)) + STATUS=2 + if [[ $OS == "CentOS Linux" ]] || [[ $OS == "CentOS Stream" ]] || [[ $OS == "Rocky Linux" ]]; then + echo "The agent can be removed with 'sudo yum remove do-agent' " + elif [[ $OS == "Ubuntu" ]]; then + echo "The agent can be removed with 'sudo apt-get purge do-agent' " + fi + else + echo -en "\e[32m[PASS]\e[0m DigitalOcean Monitoring agent was not found\n" + ((PASS++)) + fi +} + +function checkLogs { + cp_ignore="/var/log/cpanel-install.log" + echo -en "\nChecking for log files in /var/log\n\n" + # Check if there are log archives or log files that have not been recently cleared. + for f in /var/log/*-????????; do + [[ -e $f ]] || break + if [ $f != $cp_ignore ]; then + echo -en "\e[93m[WARN]\e[0m Log archive ${f} found\n" + ((WARN++)) + if [[ $STATUS != 2 ]]; then + STATUS=1 + fi + fi + done + for f in /var/log/*.[0-9];do + [[ -e $f ]] || break + echo -en "\e[93m[WARN]\e[0m Log archive ${f} found\n" + ((WARN++)) + if [[ $STATUS != 2 ]]; then + STATUS=1 + fi + done + for f in /var/log/*.log; do + [[ -e $f ]] || break + if [[ "${f}" = '/var/log/lfd.log' && "$( cat "${f}" | egrep -v '/var/log/messages has been reset| Watching /var/log/messages' | wc -c)" -gt 50 ]]; then + if [ $f != $cp_ignore ]; then + echo -en "\e[93m[WARN]\e[0m un-cleared log file, ${f} found\n" + ((WARN++)) + if [[ $STATUS != 2 ]]; then + STATUS=1 + fi + fi + elif [[ "${f}" != '/var/log/lfd.log' && "$( cat "${f}" | wc -c)" -gt 50 ]]; then + if [ $f != $cp_ignore ]; then + echo -en "\e[93m[WARN]\e[0m un-cleared log file, ${f} found\n" + ((WARN++)) + if [[ $STATUS != 2 ]]; then + STATUS=1 + fi + fi + fi + done +} +function checkTMP { + # Check the /tmp directory to ensure it is empty. Warn on any files found. + return 1 +} +function checkRoot { + user="root" + uhome="/root" + for usr in $SHADOW + do + IFS=':' read -r -a u <<< "$usr" + if [[ "${u[0]}" == "${user}" ]]; then + if [[ ${u[1]} == "!" ]] || [[ ${u[1]} == "!!" ]] || [[ ${u[1]} == "*" ]]; then + echo -en "\e[32m[PASS]\e[0m User ${user} has no password set.\n" + ((PASS++)) + else + echo -en "\e[41m[FAIL]\e[0m User ${user} has a password set on their account.\n" + ((FAIL++)) + STATUS=2 + fi + fi + done + if [ -d ${uhome}/ ]; then + if [ -d ${uhome}/.ssh/ ]; then + if ls ${uhome}/.ssh/*> /dev/null 2>&1; then + for key in ${uhome}/.ssh/* + do + if [ "${key}" == "${uhome}/.ssh/authorized_keys" ]; then + + if [ "$( cat "${key}" | wc -c)" -gt 50 ]; then + echo -en "\e[41m[FAIL]\e[0m User \e[1m${user}\e[0m has a populated authorized_keys file in \e[93m${key}\e[0m\n" + akey=$(cat ${key}) + echo "File Contents:" + echo $akey + echo "--------------" + ((FAIL++)) + STATUS=2 + fi + elif [ "${key}" == "${uhome}/.ssh/id_rsa" ]; then + if [ "$( cat "${key}" | wc -c)" -gt 0 ]; then + echo -en "\e[41m[FAIL]\e[0m User \e[1m${user}\e[0m has a private key file in \e[93m${key}\e[0m\n" + akey=$(cat ${key}) + echo "File Contents:" + echo $akey + echo "--------------" + ((FAIL++)) + STATUS=2 + else + echo -en "\e[93m[WARN]\e[0m User \e[1m${user}\e[0m has empty private key file in \e[93m${key}\e[0m\n" + ((WARN++)) + if [[ $STATUS != 2 ]]; then + STATUS=1 + fi + fi + elif [ "${key}" != "${uhome}/.ssh/known_hosts" ]; then + echo -en "\e[93m[WARN]\e[0m User \e[1m${user}\e[0m has a file in their .ssh directory at \e[93m${key}\e[0m\n" + ((WARN++)) + if [[ $STATUS != 2 ]]; then + STATUS=1 + fi + else + if [ "$( cat "${key}" | wc -c)" -gt 50 ]; then + echo -en "\e[93m[WARN]\e[0m User \e[1m${user}\e[0m has a populated known_hosts file in \e[93m${key}\e[0m\n" + ((WARN++)) + if [[ $STATUS != 2 ]]; then + STATUS=1 + fi + fi + fi + done + else + echo -en "\e[32m[ OK ]\e[0m User \e[1m${user}\e[0m has no SSH keys present\n" + fi + else + echo -en "\e[32m[ OK ]\e[0m User \e[1m${user}\e[0m does not have an .ssh directory\n" + fi + if [ -f /root/.bash_history ];then + + BH_S=$( cat /root/.bash_history | wc -c) + + if [[ $BH_S -lt 200 ]]; then + echo -en "\e[32m[PASS]\e[0m ${user}'s Bash History appears to have been cleared\n" + ((PASS++)) + else + echo -en "\e[41m[FAIL]\e[0m ${user}'s Bash History should be cleared to prevent sensitive information from leaking\n" + ((FAIL++)) + STATUS=2 + fi + + return 1; + else + echo -en "\e[32m[PASS]\e[0m The Root User's Bash History is not present\n" + ((PASS++)) + fi + else + echo -en "\e[32m[ OK ]\e[0m User \e[1m${user}\e[0m does not have a directory in /home\n" + fi + echo -en "\n\n" + return 1 +} + +function checkUsers { + # Check each user-created account + for user in $(awk -F: '$3 >= 1000 && $1 != "nobody" {print $1}' /etc/passwd;) + do + # Skip some other non-user system accounts + if [[ $user == "centos" ]]; then + : + elif [[ $user == "nfsnobody" ]]; then + : + else + echo -en "\nChecking user: ${user}...\n" + for usr in $SHADOW + do + IFS=':' read -r -a u <<< "$usr" + if [[ "${u[0]}" == "${user}" ]]; then + if [[ ${u[1]} == "!" ]] || [[ ${u[1]} == "!!" ]] || [[ ${u[1]} == "*" ]]; then + echo -en "\e[32m[PASS]\e[0m User ${user} has no password set.\n" + ((PASS++)) + else + echo -en "\e[41m[FAIL]\e[0m User ${user} has a password set on their account. Only system users are allowed on the image.\n" + ((FAIL++)) + STATUS=2 + fi + fi + done + #echo "User Found: ${user}" + uhome="/home/${user}" + if [ -d "${uhome}/" ]; then + if [ -d "${uhome}/.ssh/" ]; then + if ls "${uhome}/.ssh/*"> /dev/null 2>&1; then + for key in ${uhome}/.ssh/* + do + if [ "${key}" == "${uhome}/.ssh/authorized_keys" ]; then + if [ "$( cat "${key}" | wc -c)" -gt 50 ]; then + echo -en "\e[41m[FAIL]\e[0m User \e[1m${user}\e[0m has a populated authorized_keys file in \e[93m${key}\e[0m\n" + akey=$(cat ${key}) + echo "File Contents:" + echo $akey + echo "--------------" + ((FAIL++)) + STATUS=2 + fi + elif [ "${key}" == "${uhome}/.ssh/id_rsa" ]; then + if [ "$( cat "${key}" | wc -c)" -gt 0 ]; then + echo -en "\e[41m[FAIL]\e[0m User \e[1m${user}\e[0m has a private key file in \e[93m${key}\e[0m\n" + akey=$(cat ${key}) + echo "File Contents:" + echo $akey + echo "--------------" + ((FAIL++)) + STATUS=2 + else + echo -en "\e[93m[WARN]\e[0m User \e[1m${user}\e[0m has empty private key file in \e[93m${key}\e[0m\n" + ((WARN++)) + if [[ $STATUS != 2 ]]; then + STATUS=1 + fi + fi + elif [ "${key}" != "${uhome}/.ssh/known_hosts" ]; then + + echo -en "\e[93m[WARN]\e[0m User \e[1m${user}\e[0m has a file in their .ssh directory named \e[93m${key}\e[0m\n" + ((WARN++)) + if [[ $STATUS != 2 ]]; then + STATUS=1 + fi + + else + if [ "$( cat "${key}" | wc -c)" -gt 50 ]; then + echo -en "\e[93m[WARN]\e[0m User \e[1m${user}\e[0m has a known_hosts file in \e[93m${key}\e[0m\n" + ((WARN++)) + if [[ $STATUS != 2 ]]; then + STATUS=1 + fi + fi + fi + + + done + else + echo -en "\e[32m[ OK ]\e[0m User \e[1m${user}\e[0m has no SSH keys present\n" + fi + else + echo -en "\e[32m[ OK ]\e[0m User \e[1m${user}\e[0m does not have an .ssh directory\n" + fi + else + echo -en "\e[32m[ OK ]\e[0m User \e[1m${user}\e[0m does not have a directory in /home\n" + fi + + # Check for an uncleared .bash_history for this user + if [ -f "${uhome}/.bash_history" ]; then + BH_S=$( cat "${uhome}/.bash_history" | wc -c ) + + if [[ $BH_S -lt 200 ]]; then + echo -en "\e[32m[PASS]\e[0m ${user}'s Bash History appears to have been cleared\n" + ((PASS++)) + else + echo -en "\e[41m[FAIL]\e[0m ${user}'s Bash History should be cleared to prevent sensitive information from leaking\n" + ((FAIL++)) + STATUS=2 + + fi + echo -en "\n\n" + fi + fi + done +} +function checkFirewall { + + if [[ $OS == "Ubuntu" ]]; then + fw="ufw" + ufwa=$(ufw status |head -1| sed -e "s/^Status:\ //") + if [[ $ufwa == "active" ]]; then + FW_VER="\e[32m[PASS]\e[0m Firewall service (${fw}) is active\n" + ((PASS++)) + else + FW_VER="\e[93m[WARN]\e[0m No firewall is configured. Ensure ${fw} is installed and configured\n" + ((WARN++)) + fi + elif [[ $OS == "CentOS Linux" ]] || [[ $OS == "CentOS Stream" ]] || [[ $OS == "Rocky Linux" ]]; then + if [ -f /usr/lib/systemd/system/csf.service ]; then + fw="csf" + if [[ $(systemctl status $fw >/dev/null 2>&1) ]]; then + + FW_VER="\e[32m[PASS]\e[0m Firewall service (${fw}) is active\n" + ((PASS++)) + elif cmdExists "firewall-cmd"; then + if [[ $(systemctl is-active firewalld >/dev/null 2>&1 && echo 1 || echo 0) ]]; then + FW_VER="\e[32m[PASS]\e[0m Firewall service (${fw}) is active\n" + ((PASS++)) + else + FW_VER="\e[93m[WARN]\e[0m No firewall is configured. Ensure ${fw} is installed and configured\n" + ((WARN++)) + fi + else + FW_VER="\e[93m[WARN]\e[0m No firewall is configured. Ensure ${fw} is installed and configured\n" + ((WARN++)) + fi + else + fw="firewalld" + if [[ $(systemctl is-active firewalld >/dev/null 2>&1 && echo 1 || echo 0) ]]; then + FW_VER="\e[32m[PASS]\e[0m Firewall service (${fw}) is active\n" + ((PASS++)) + else + FW_VER="\e[93m[WARN]\e[0m No firewall is configured. Ensure ${fw} is installed and configured\n" + ((WARN++)) + fi + fi + elif [[ "$OS" =~ Debian.* ]]; then + # user could be using a number of different services for managing their firewall + # we will check some of the most common + if cmdExists 'ufw'; then + fw="ufw" + ufwa=$(ufw status |head -1| sed -e "s/^Status:\ //") + if [[ $ufwa == "active" ]]; then + FW_VER="\e[32m[PASS]\e[0m Firewall service (${fw}) is active\n" + ((PASS++)) + else + FW_VER="\e[93m[WARN]\e[0m No firewall is configured. Ensure ${fw} is installed and configured\n" + ((WARN++)) + fi + elif cmdExists "firewall-cmd"; then + fw="firewalld" + if [[ $(systemctl is-active --quiet $fw) ]]; then + FW_VER="\e[32m[PASS]\e[0m Firewall service (${fw}) is active\n" + ((PASS++)) + else + FW_VER="\e[93m[WARN]\e[0m No firewall is configured. Ensure ${fw} is installed and configured\n" + ((WARN++)) + fi + else + # user could be using vanilla iptables, check if kernel module is loaded + fw="iptables" + if [[ $(lsmod | grep -q '^ip_tables' 2>/dev/null) ]]; then + FW_VER="\e[32m[PASS]\e[0m Firewall service (${fw}) is active\n" + ((PASS++)) + else + FW_VER="\e[93m[WARN]\e[0m No firewall is configured. Ensure ${fw} is installed and configured\n" + ((WARN++)) + fi + fi + fi + +} +function checkUpdates { + if [[ $OS == "Ubuntu" ]] || [[ "$OS" =~ Debian.* ]]; then + # Ensure /tmp exists and has the proper permissions before + # checking for security updates + # https://github.com/digitalocean/marketplace-partners/issues/94 + if [[ ! -d /tmp ]]; then + mkdir /tmp + fi + chmod 1777 /tmp + + echo -en "\nUpdating apt package database to check for security updates, this may take a minute...\n\n" + apt-get -y update > /dev/null + + uc=$(apt-get --just-print upgrade | grep -i "security" | wc -l) + if [[ $uc -gt 0 ]]; then + update_count=$(( ${uc} / 2 )) + else + update_count=0 + fi + + if [[ $update_count -gt 0 ]]; then + echo -en "\e[41m[FAIL]\e[0m There are ${update_count} security updates available for this image that have not been installed.\n" + echo -en + echo -en "Here is a list of the security updates that are not installed:\n" + sleep 2 + apt-get --just-print upgrade | grep -i security | awk '{print $2}' | awk '!seen[$0]++' + echo -en + ((FAIL++)) + STATUS=2 + else + echo -en "\e[32m[PASS]\e[0m There are no pending security updates for this image.\n\n" + fi + elif [[ $OS == "CentOS Linux" ]] || [[ $OS == "CentOS Stream" ]] || [[ $OS == "Rocky Linux" ]]; then + echo -en "\nChecking for available security updates, this may take a minute...\n\n" + + update_count=$(yum check-update --security --quiet | wc -l) + if [[ $update_count -gt 0 ]]; then + echo -en "\e[41m[FAIL]\e[0m There are ${update_count} security updates available for this image that have not been installed.\n" + ((FAIL++)) + STATUS=2 + else + echo -en "\e[32m[PASS]\e[0m There are no pending security updates for this image.\n" + ((PASS++)) + fi + else + echo "Error encountered" + exit 1 + fi + + return 1; +} +function checkCloudInit { + + if hash cloud-init 2>/dev/null; then + CI="\e[32m[PASS]\e[0m Cloud-init is installed.\n" + ((PASS++)) + else + CI="\e[41m[FAIL]\e[0m No valid verison of cloud-init was found.\n" + ((FAIL++)) + STATUS=2 + fi + return 1 +} + +function version_gt() { test "$(printf '%s\n' "$@" | sort -V | head -n 1)" != "$1"; } + + +clear +echo "DigitalOcean Marketplace Image Validation Tool ${VERSION}" +echo "Executed on: ${RUNDATE}" +echo "Checking local system for Marketplace compatibility..." + +getDistro + +echo -en "\n\e[1mDistribution:\e[0m ${OS}\n" +echo -en "\e[1mVersion:\e[0m ${VER}\n\n" + +ost=0 +osv=0 + +if [[ $OS == "Ubuntu" ]]; then + ost=1 + if [[ $VER == "20.04" ]]; then + osv=1 + elif [[ $VER == "18.04" ]]; then + osv=1 + elif [[ $VER == "16.04" ]]; then + osv=1 + else + osv=0 + fi + +elif [[ "$OS" =~ Debian.* ]]; then + ost=1 + case "$VER" in + 9) + osv=1 + ;; + 10) + osv=1 + ;; + *) + osv=2 + ;; + esac + +elif [[ $OS == "CentOS Linux" ]]; then + ost=1 + if [[ $VER == "8" ]]; then + osv=1 + elif [[ $VER == "7" ]]; then + osv=1 + elif [[ $VER == "6" ]]; then + osv=1 + else + osv=2 + fi +elif [[ $OS == "CentOS Stream" ]]; then + ost=1 + if [[ $VER == "8" ]]; then + osv=1 + else + osv=2 + fi +elif [[ $OS == "Rocky Linux" ]]; then + ost=1 + if [[ $VER =~ "8." ]]; then + osv=1 + else + osv=2 + fi +else + ost=0 +fi + +if [[ $ost == 1 ]]; then + echo -en "\e[32m[PASS]\e[0m Supported Operating System Detected: ${OS}\n" + ((PASS++)) +else + echo -en "\e[41m[FAIL]\e[0m ${OS} is not a supported Operating System\n" + ((FAIL++)) + STATUS=2 +fi + +if [[ $osv == 1 ]]; then + echo -en "\e[32m[PASS]\e[0m Supported Release Detected: ${VER}\n" + ((PASS++)) +elif [[ $ost == 1 ]]; then + echo -en "\e[41m[FAIL]\e[0m ${OS} ${VER} is not a supported Operating System Version\n" + ((FAIL++)) + STATUS=2 +else + echo "Exiting..." + exit 1 +fi + +checkCloudInit + +echo -en "${CI}" + +checkFirewall + +echo -en "${FW_VER}" + +checkUpdates + +loadPasswords + +checkLogs + +echo -en "\n\nChecking all user-created accounts...\n" +checkUsers + +echo -en "\n\nChecking the root account...\n" +checkRoot + +checkAgent + + +# Summary +echo -en "\n\n---------------------------------------------------------------------------------------------------\n" + +if [[ $STATUS == 0 ]]; then + echo -en "Scan Complete.\n\e[32mAll Tests Passed!\e[0m\n" +elif [[ $STATUS == 1 ]]; then + echo -en "Scan Complete. \n\e[93mSome non-critical tests failed. Please review these items.\e[0m\e[0m\n" +else + echo -en "Scan Complete. \n\e[41mOne or more tests failed. Please review these items and re-test.\e[0m\n" +fi +echo "---------------------------------------------------------------------------------------------------" +echo -en "\e[1m${PASS} Tests PASSED\e[0m\n" +echo -en "\e[1m${WARN} WARNINGS\e[0m\n" +echo -en "\e[1m${FAIL} Tests FAILED\e[0m\n" +echo -en "---------------------------------------------------------------------------------------------------\n" + +if [[ $STATUS == 0 ]]; then + echo -en "We did not detect any issues with this image. Please be sure to manually ensure that all software installed on the base system is functional, secure and properly configured (or facilities for configuration on first-boot have been created).\n\n" + exit 0 +elif [[ $STATUS == 1 ]]; then + echo -en "Please review all [WARN] items above and ensure they are intended or resolved. If you do not have a specific requirement, we recommend resolving these items before image submission\n\n" + exit 0 +else + echo -en "Some critical tests failed. These items must be resolved and this scan re-run before you submit your image to the DigitalOcean Marketplace.\n\n" + exit 1 +fi diff --git a/hosting/digitalocean/template.json b/hosting/digitalocean/template.json new file mode 100644 index 0000000000..bc3679abdc --- /dev/null +++ b/hosting/digitalocean/template.json @@ -0,0 +1,65 @@ +{ + "variables": { + "token": "{{env `DIGITALOCEAN_TOKEN`}}", + "image_name": "budibase-marketplace-snapshot-{{timestamp}}", + "apt_packages": "jq" + }, + "builders": [ + { + "type": "digitalocean", + "api_token": "{{user `token`}}", + "image": "docker-20-04", + "region": "lon1", + "size": "s-1vcpu-1gb", + "ssh_username": "root", + "snapshot_name": "{{user `image_name`}}" + } + ], + "provisioners": [ + { + "type": "shell", + "inline": [ + "cloud-init status --wait" + ] + }, + { + "type": "file", + "source": "files/etc/", + "destination": "/etc/" + }, + { + "type": "file", + "source": "files/var/", + "destination": "/var/" + }, + { + "type": "shell", + "environment_vars": [ + "DEBIAN_FRONTEND=noninteractive", + "LC_ALL=C", + "LANG=en_US.UTF-8", + "LC_CTYPE=en_US.UTF-8" + ], + "inline": [ + "apt -qqy update", + "apt -qqy -o Dpkg::Options::='--force-confdef' -o Dpkg::Options::='--force-confold' full-upgrade", + "apt -qqy -o Dpkg::Options::='--force-confdef' -o Dpkg::Options::='--force-confold' install {{user `apt_packages`}}" + ] + }, + { + "type": "shell", + "environment_vars": [ + "application_name={{user `application_name`}}", + "application_version={{user `application_version`}}", + "DEBIAN_FRONTEND=noninteractive", + "LC_ALL=C", + "LANG=en_US.UTF-8", + "LC_CTYPE=en_US.UTF-8" + ], + "scripts": [ + "scripts/90-cleanup.sh", + "scripts/99-img_check.sh" + ] + } + ] +} diff --git a/packages/builder/package.json b/packages/builder/package.json index d846e1fac5..f910f8a10d 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -14,7 +14,7 @@ "cy:setup": "node ./cypress/setup.js", "cy:run": "cypress run", "cy:open": "cypress open", - "cy:run:ci": "cypress run --record --key f308590b-6070-41af-b970-794a3823d451", + "cy:run:ci": "cypress run --record", "cy:test": "start-server-and-test cy:setup http://localhost:10001/builder cy:run", "cy:ci": "start-server-and-test cy:setup http://localhost:10001/builder cy:run", "cy:debug": "start-server-and-test cy:setup http://localhost:10001/builder cy:open" From eb7468494e408b6a5bf67d10ffac7ab8f4ecb30b Mon Sep 17 00:00:00 2001 From: Martin McKeaveney Date: Thu, 2 Dec 2021 14:38:57 +0100 Subject: [PATCH 04/15] adding yarn command for DO build --- hosting/digitalocean/README.md | 2 +- package.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/hosting/digitalocean/README.md b/hosting/digitalocean/README.md index 07370b1b87..72c1950d17 100644 --- a/hosting/digitalocean/README.md +++ b/hosting/digitalocean/README.md @@ -9,7 +9,7 @@ You must have the `DIGITALOCEAN_TOKEN` environment variable set, so that packer ## Building Just run the following command: ``` -./build.sh +yarn build:digitalocean ``` ## Uploading to Marketplace diff --git a/package.json b/package.json index e0b567ce59..4be3fe1401 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "build:docker:selfhost": "lerna run build:docker && cd hosting/scripts/linux/ && ./release-to-docker-hub.sh latest && cd -", "build:docker:develop": "node scripts/pinVersions && lerna run build:docker && cd hosting/scripts/linux/ && ./release-to-docker-hub.sh develop && cd -", "build:docker:airgap": "node hosting/scripts/airgapped/airgappedDockerBuild", + "build:digitalocean": "cd hosting/digitalocean && ./build.sh && cd -", "build:docs": "lerna run build:docs", "release:helm": "./scripts/release_helm_chart.sh", "env:multi:enable": "lerna run env:multi:enable", From 0fce0c076bf5419e84975c7a7c364812f1d9f00f Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Thu, 2 Dec 2021 13:47:17 +0000 Subject: [PATCH 05/15] v1.0.5-alpha.1 --- lerna.json | 2 +- packages/auth/package.json | 2 +- packages/bbui/package.json | 2 +- packages/builder/package.json | 8 ++++---- packages/cli/package.json | 2 +- packages/client/package.json | 6 +++--- packages/server/package.json | 8 ++++---- packages/string-templates/package.json | 2 +- packages/worker/package.json | 6 +++--- 9 files changed, 19 insertions(+), 19 deletions(-) diff --git a/lerna.json b/lerna.json index 1a7e49a54e..5a5b6a24d2 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "1.0.5-alpha.0", + "version": "1.0.5-alpha.1", "npmClient": "yarn", "packages": [ "packages/*" diff --git a/packages/auth/package.json b/packages/auth/package.json index 0748fadcf2..137381ea77 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/auth", - "version": "1.0.5-alpha.0", + "version": "1.0.5-alpha.1", "description": "Authentication middlewares for budibase builder and apps", "main": "src/index.js", "author": "Budibase", diff --git a/packages/bbui/package.json b/packages/bbui/package.json index 44f3536011..4b1397bb2c 100644 --- a/packages/bbui/package.json +++ b/packages/bbui/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/bbui", "description": "A UI solution used in the different Budibase projects.", - "version": "1.0.5-alpha.0", + "version": "1.0.5-alpha.1", "license": "MPL-2.0", "svelte": "src/index.js", "module": "dist/bbui.es.js", diff --git a/packages/builder/package.json b/packages/builder/package.json index 9b285dc4d4..7e7f70f48e 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/builder", - "version": "1.0.5-alpha.0", + "version": "1.0.5-alpha.1", "license": "GPL-3.0", "private": true, "scripts": { @@ -65,10 +65,10 @@ } }, "dependencies": { - "@budibase/bbui": "^1.0.5-alpha.0", - "@budibase/client": "^1.0.5-alpha.0", + "@budibase/bbui": "^1.0.5-alpha.1", + "@budibase/client": "^1.0.5-alpha.1", "@budibase/colorpicker": "1.1.2", - "@budibase/string-templates": "^1.0.5-alpha.0", + "@budibase/string-templates": "^1.0.5-alpha.1", "@sentry/browser": "5.19.1", "@spectrum-css/page": "^3.0.1", "@spectrum-css/vars": "^3.0.1", diff --git a/packages/cli/package.json b/packages/cli/package.json index f34117c22c..c917d1b520 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/cli", - "version": "1.0.5-alpha.0", + "version": "1.0.5-alpha.1", "description": "Budibase CLI, for developers, self hosting and migrations.", "main": "src/index.js", "bin": { diff --git a/packages/client/package.json b/packages/client/package.json index bd6e562691..b0aa07df0e 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/client", - "version": "1.0.5-alpha.0", + "version": "1.0.5-alpha.1", "license": "MPL-2.0", "module": "dist/budibase-client.js", "main": "dist/budibase-client.js", @@ -19,9 +19,9 @@ "dev:builder": "rollup -cw" }, "dependencies": { - "@budibase/bbui": "^1.0.5-alpha.0", + "@budibase/bbui": "^1.0.5-alpha.1", "@budibase/standard-components": "^0.9.139", - "@budibase/string-templates": "^1.0.5-alpha.0", + "@budibase/string-templates": "^1.0.5-alpha.1", "regexparam": "^1.3.0", "shortid": "^2.2.15", "svelte-spa-router": "^3.0.5" diff --git a/packages/server/package.json b/packages/server/package.json index 955dd0b1f4..eaa38735fa 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/server", "email": "hi@budibase.com", - "version": "1.0.5-alpha.0", + "version": "1.0.5-alpha.1", "description": "Budibase Web Server", "main": "src/index.ts", "repository": { @@ -69,9 +69,9 @@ "author": "Budibase", "license": "GPL-3.0", "dependencies": { - "@budibase/auth": "^1.0.5-alpha.0", - "@budibase/client": "^1.0.5-alpha.0", - "@budibase/string-templates": "^1.0.5-alpha.0", + "@budibase/auth": "^1.0.5-alpha.1", + "@budibase/client": "^1.0.5-alpha.1", + "@budibase/string-templates": "^1.0.5-alpha.1", "@bull-board/api": "^3.7.0", "@bull-board/koa": "^3.7.0", "@elastic/elasticsearch": "7.10.0", diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json index 145800dbb5..eed709984b 100644 --- a/packages/string-templates/package.json +++ b/packages/string-templates/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/string-templates", - "version": "1.0.5-alpha.0", + "version": "1.0.5-alpha.1", "description": "Handlebars wrapper for Budibase templating.", "main": "src/index.cjs", "module": "dist/bundle.mjs", diff --git a/packages/worker/package.json b/packages/worker/package.json index 6917856ceb..fd1b83a1ec 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/worker", "email": "hi@budibase.com", - "version": "1.0.5-alpha.0", + "version": "1.0.5-alpha.1", "description": "Budibase background service", "main": "src/index.js", "repository": { @@ -29,8 +29,8 @@ "author": "Budibase", "license": "GPL-3.0", "dependencies": { - "@budibase/auth": "^1.0.5-alpha.0", - "@budibase/string-templates": "^1.0.5-alpha.0", + "@budibase/auth": "^1.0.5-alpha.1", + "@budibase/string-templates": "^1.0.5-alpha.1", "@koa/router": "^8.0.0", "@sentry/node": "^6.0.0", "@techpass/passport-openidconnect": "^0.3.0", From 4cc03de7e712badfdef2b86b8d01f46735b3c3e0 Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Thu, 2 Dec 2021 15:08:26 +0000 Subject: [PATCH 06/15] v1.0.6-alpha.0 --- lerna.json | 2 +- packages/auth/package.json | 2 +- packages/bbui/package.json | 2 +- packages/builder/package.json | 8 ++++---- packages/cli/package.json | 2 +- packages/client/package.json | 6 +++--- packages/server/package.json | 8 ++++---- packages/string-templates/package.json | 2 +- packages/worker/package.json | 6 +++--- 9 files changed, 19 insertions(+), 19 deletions(-) diff --git a/lerna.json b/lerna.json index 7159f433c5..75968afafc 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "1.0.5", + "version": "1.0.6-alpha.0", "npmClient": "yarn", "packages": [ "packages/*" diff --git a/packages/auth/package.json b/packages/auth/package.json index 8892f232a6..1af76f49b6 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/auth", - "version": "1.0.5", + "version": "1.0.6-alpha.0", "description": "Authentication middlewares for budibase builder and apps", "main": "src/index.js", "author": "Budibase", diff --git a/packages/bbui/package.json b/packages/bbui/package.json index 8198fed4d5..173cd891aa 100644 --- a/packages/bbui/package.json +++ b/packages/bbui/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/bbui", "description": "A UI solution used in the different Budibase projects.", - "version": "1.0.5", + "version": "1.0.6-alpha.0", "license": "MPL-2.0", "svelte": "src/index.js", "module": "dist/bbui.es.js", diff --git a/packages/builder/package.json b/packages/builder/package.json index 0d5ec62007..3f3afa1d1c 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/builder", - "version": "1.0.5", + "version": "1.0.6-alpha.0", "license": "GPL-3.0", "private": true, "scripts": { @@ -65,10 +65,10 @@ } }, "dependencies": { - "@budibase/bbui": "^1.0.5", - "@budibase/client": "^1.0.5", + "@budibase/bbui": "^1.0.6-alpha.0", + "@budibase/client": "^1.0.6-alpha.0", "@budibase/colorpicker": "1.1.2", - "@budibase/string-templates": "^1.0.5", + "@budibase/string-templates": "^1.0.6-alpha.0", "@sentry/browser": "5.19.1", "@spectrum-css/page": "^3.0.1", "@spectrum-css/vars": "^3.0.1", diff --git a/packages/cli/package.json b/packages/cli/package.json index 42dffc8901..f2394cac36 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/cli", - "version": "1.0.5", + "version": "1.0.6-alpha.0", "description": "Budibase CLI, for developers, self hosting and migrations.", "main": "src/index.js", "bin": { diff --git a/packages/client/package.json b/packages/client/package.json index 8cb916e427..7284a58bb8 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/client", - "version": "1.0.5", + "version": "1.0.6-alpha.0", "license": "MPL-2.0", "module": "dist/budibase-client.js", "main": "dist/budibase-client.js", @@ -19,9 +19,9 @@ "dev:builder": "rollup -cw" }, "dependencies": { - "@budibase/bbui": "^1.0.5", + "@budibase/bbui": "^1.0.6-alpha.0", "@budibase/standard-components": "^0.9.139", - "@budibase/string-templates": "^1.0.5", + "@budibase/string-templates": "^1.0.6-alpha.0", "regexparam": "^1.3.0", "shortid": "^2.2.15", "svelte-spa-router": "^3.0.5" diff --git a/packages/server/package.json b/packages/server/package.json index 31aabf1dad..fd0907144c 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/server", "email": "hi@budibase.com", - "version": "1.0.5", + "version": "1.0.6-alpha.0", "description": "Budibase Web Server", "main": "src/index.ts", "repository": { @@ -69,9 +69,9 @@ "author": "Budibase", "license": "GPL-3.0", "dependencies": { - "@budibase/auth": "^1.0.5", - "@budibase/client": "^1.0.5", - "@budibase/string-templates": "^1.0.5", + "@budibase/auth": "^1.0.6-alpha.0", + "@budibase/client": "^1.0.6-alpha.0", + "@budibase/string-templates": "^1.0.6-alpha.0", "@bull-board/api": "^3.7.0", "@bull-board/koa": "^3.7.0", "@elastic/elasticsearch": "7.10.0", diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json index e14c584e09..c967f18389 100644 --- a/packages/string-templates/package.json +++ b/packages/string-templates/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/string-templates", - "version": "1.0.5", + "version": "1.0.6-alpha.0", "description": "Handlebars wrapper for Budibase templating.", "main": "src/index.cjs", "module": "dist/bundle.mjs", diff --git a/packages/worker/package.json b/packages/worker/package.json index 7a112ab00e..04e096bddb 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/worker", "email": "hi@budibase.com", - "version": "1.0.5", + "version": "1.0.6-alpha.0", "description": "Budibase background service", "main": "src/index.js", "repository": { @@ -29,8 +29,8 @@ "author": "Budibase", "license": "GPL-3.0", "dependencies": { - "@budibase/auth": "^1.0.5", - "@budibase/string-templates": "^1.0.5", + "@budibase/auth": "^1.0.6-alpha.0", + "@budibase/string-templates": "^1.0.6-alpha.0", "@koa/router": "^8.0.0", "@sentry/node": "^6.0.0", "@techpass/passport-openidconnect": "^0.3.0", From 36218ccea9155a1e5663df531c420071449a174e Mon Sep 17 00:00:00 2001 From: Rory Powell Date: Fri, 3 Dec 2021 10:48:47 +0000 Subject: [PATCH 07/15] Fix oracle password config --- packages/server/scripts/integrations/oracle/oracle.md | 2 +- packages/server/src/integrations/oracle.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/server/scripts/integrations/oracle/oracle.md b/packages/server/scripts/integrations/oracle/oracle.md index 912de08b65..6c2d7a9252 100644 --- a/packages/server/scripts/integrations/oracle/oracle.md +++ b/packages/server/scripts/integrations/oracle/oracle.md @@ -84,7 +84,7 @@ The `HR` schema is populated with dummy data by default in oracle for testing pu To connect to the HR schema first update the user password and unlock the account by performing ```sql ALTER USER hr ACCOUNT UNLOCK; -ALTER USER hr IDENTIFIED BY hr +ALTER USER hr IDENTIFIED BY hr; ``` You should now be able to connect to the hr schema using the credentials hr/hr diff --git a/packages/server/src/integrations/oracle.ts b/packages/server/src/integrations/oracle.ts index bf8e83350e..afaa902655 100644 --- a/packages/server/src/integrations/oracle.ts +++ b/packages/server/src/integrations/oracle.ts @@ -381,7 +381,7 @@ module OracleModule { }` const attributes: ConnectionAttributes = { user: this.config.user, - password: this.config.user, + password: this.config.password, connectString, } return oracledb.getConnection(attributes) From e6680c5c520e1fba92febd03db2cb1f108ca771a Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Fri, 3 Dec 2021 11:20:24 +0000 Subject: [PATCH 08/15] v1.0.6-alpha.1 --- lerna.json | 2 +- packages/auth/package.json | 2 +- packages/bbui/package.json | 2 +- packages/builder/package.json | 8 ++++---- packages/cli/package.json | 2 +- packages/client/package.json | 6 +++--- packages/server/package.json | 8 ++++---- packages/string-templates/package.json | 2 +- packages/worker/package.json | 6 +++--- 9 files changed, 19 insertions(+), 19 deletions(-) diff --git a/lerna.json b/lerna.json index 75968afafc..b3a4772683 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "1.0.6-alpha.0", + "version": "1.0.6-alpha.1", "npmClient": "yarn", "packages": [ "packages/*" diff --git a/packages/auth/package.json b/packages/auth/package.json index 1af76f49b6..bfda6eb1d0 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/auth", - "version": "1.0.6-alpha.0", + "version": "1.0.6-alpha.1", "description": "Authentication middlewares for budibase builder and apps", "main": "src/index.js", "author": "Budibase", diff --git a/packages/bbui/package.json b/packages/bbui/package.json index 173cd891aa..507a980da3 100644 --- a/packages/bbui/package.json +++ b/packages/bbui/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/bbui", "description": "A UI solution used in the different Budibase projects.", - "version": "1.0.6-alpha.0", + "version": "1.0.6-alpha.1", "license": "MPL-2.0", "svelte": "src/index.js", "module": "dist/bbui.es.js", diff --git a/packages/builder/package.json b/packages/builder/package.json index 3f3afa1d1c..ae8f026956 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/builder", - "version": "1.0.6-alpha.0", + "version": "1.0.6-alpha.1", "license": "GPL-3.0", "private": true, "scripts": { @@ -65,10 +65,10 @@ } }, "dependencies": { - "@budibase/bbui": "^1.0.6-alpha.0", - "@budibase/client": "^1.0.6-alpha.0", + "@budibase/bbui": "^1.0.6-alpha.1", + "@budibase/client": "^1.0.6-alpha.1", "@budibase/colorpicker": "1.1.2", - "@budibase/string-templates": "^1.0.6-alpha.0", + "@budibase/string-templates": "^1.0.6-alpha.1", "@sentry/browser": "5.19.1", "@spectrum-css/page": "^3.0.1", "@spectrum-css/vars": "^3.0.1", diff --git a/packages/cli/package.json b/packages/cli/package.json index f2394cac36..6b83b1afe7 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/cli", - "version": "1.0.6-alpha.0", + "version": "1.0.6-alpha.1", "description": "Budibase CLI, for developers, self hosting and migrations.", "main": "src/index.js", "bin": { diff --git a/packages/client/package.json b/packages/client/package.json index 7284a58bb8..121b70b6e2 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/client", - "version": "1.0.6-alpha.0", + "version": "1.0.6-alpha.1", "license": "MPL-2.0", "module": "dist/budibase-client.js", "main": "dist/budibase-client.js", @@ -19,9 +19,9 @@ "dev:builder": "rollup -cw" }, "dependencies": { - "@budibase/bbui": "^1.0.6-alpha.0", + "@budibase/bbui": "^1.0.6-alpha.1", "@budibase/standard-components": "^0.9.139", - "@budibase/string-templates": "^1.0.6-alpha.0", + "@budibase/string-templates": "^1.0.6-alpha.1", "regexparam": "^1.3.0", "shortid": "^2.2.15", "svelte-spa-router": "^3.0.5" diff --git a/packages/server/package.json b/packages/server/package.json index fd0907144c..150a01ce78 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/server", "email": "hi@budibase.com", - "version": "1.0.6-alpha.0", + "version": "1.0.6-alpha.1", "description": "Budibase Web Server", "main": "src/index.ts", "repository": { @@ -69,9 +69,9 @@ "author": "Budibase", "license": "GPL-3.0", "dependencies": { - "@budibase/auth": "^1.0.6-alpha.0", - "@budibase/client": "^1.0.6-alpha.0", - "@budibase/string-templates": "^1.0.6-alpha.0", + "@budibase/auth": "^1.0.6-alpha.1", + "@budibase/client": "^1.0.6-alpha.1", + "@budibase/string-templates": "^1.0.6-alpha.1", "@bull-board/api": "^3.7.0", "@bull-board/koa": "^3.7.0", "@elastic/elasticsearch": "7.10.0", diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json index c967f18389..92bfe2f2f4 100644 --- a/packages/string-templates/package.json +++ b/packages/string-templates/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/string-templates", - "version": "1.0.6-alpha.0", + "version": "1.0.6-alpha.1", "description": "Handlebars wrapper for Budibase templating.", "main": "src/index.cjs", "module": "dist/bundle.mjs", diff --git a/packages/worker/package.json b/packages/worker/package.json index 04e096bddb..894a47a887 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/worker", "email": "hi@budibase.com", - "version": "1.0.6-alpha.0", + "version": "1.0.6-alpha.1", "description": "Budibase background service", "main": "src/index.js", "repository": { @@ -29,8 +29,8 @@ "author": "Budibase", "license": "GPL-3.0", "dependencies": { - "@budibase/auth": "^1.0.6-alpha.0", - "@budibase/string-templates": "^1.0.6-alpha.0", + "@budibase/auth": "^1.0.6-alpha.1", + "@budibase/string-templates": "^1.0.6-alpha.1", "@koa/router": "^8.0.0", "@sentry/node": "^6.0.0", "@techpass/passport-openidconnect": "^0.3.0", From 5d4fb2e7c7f51c3b5de0558c1510c016bd0284b3 Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Fri, 3 Dec 2021 13:36:10 +0000 Subject: [PATCH 09/15] v1.0.8-alpha.0 --- lerna.json | 2 +- packages/auth/package.json | 2 +- packages/bbui/package.json | 2 +- packages/builder/package.json | 8 ++++---- packages/cli/package.json | 2 +- packages/client/package.json | 6 +++--- packages/server/package.json | 8 ++++---- packages/string-templates/package.json | 2 +- packages/worker/package.json | 6 +++--- 9 files changed, 19 insertions(+), 19 deletions(-) diff --git a/lerna.json b/lerna.json index 49a49487d3..bfd6b5f7b6 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "1.0.7", + "version": "1.0.8-alpha.0", "npmClient": "yarn", "packages": [ "packages/*" diff --git a/packages/auth/package.json b/packages/auth/package.json index a66b3c912b..761c5ee304 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/auth", - "version": "1.0.7", + "version": "1.0.8-alpha.0", "description": "Authentication middlewares for budibase builder and apps", "main": "src/index.js", "author": "Budibase", diff --git a/packages/bbui/package.json b/packages/bbui/package.json index 82fb9bbda6..cc246957d0 100644 --- a/packages/bbui/package.json +++ b/packages/bbui/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/bbui", "description": "A UI solution used in the different Budibase projects.", - "version": "1.0.7", + "version": "1.0.8-alpha.0", "license": "MPL-2.0", "svelte": "src/index.js", "module": "dist/bbui.es.js", diff --git a/packages/builder/package.json b/packages/builder/package.json index ada46fc3cf..372d9627ab 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/builder", - "version": "1.0.7", + "version": "1.0.8-alpha.0", "license": "GPL-3.0", "private": true, "scripts": { @@ -65,10 +65,10 @@ } }, "dependencies": { - "@budibase/bbui": "^1.0.7", - "@budibase/client": "^1.0.7", + "@budibase/bbui": "^1.0.8-alpha.0", + "@budibase/client": "^1.0.8-alpha.0", "@budibase/colorpicker": "1.1.2", - "@budibase/string-templates": "^1.0.7", + "@budibase/string-templates": "^1.0.8-alpha.0", "@sentry/browser": "5.19.1", "@spectrum-css/page": "^3.0.1", "@spectrum-css/vars": "^3.0.1", diff --git a/packages/cli/package.json b/packages/cli/package.json index e7ec3372a1..9bc7f16dc0 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/cli", - "version": "1.0.7", + "version": "1.0.8-alpha.0", "description": "Budibase CLI, for developers, self hosting and migrations.", "main": "src/index.js", "bin": { diff --git a/packages/client/package.json b/packages/client/package.json index 8656c443ce..2c79866336 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/client", - "version": "1.0.7", + "version": "1.0.8-alpha.0", "license": "MPL-2.0", "module": "dist/budibase-client.js", "main": "dist/budibase-client.js", @@ -19,9 +19,9 @@ "dev:builder": "rollup -cw" }, "dependencies": { - "@budibase/bbui": "^1.0.7", + "@budibase/bbui": "^1.0.8-alpha.0", "@budibase/standard-components": "^0.9.139", - "@budibase/string-templates": "^1.0.7", + "@budibase/string-templates": "^1.0.8-alpha.0", "regexparam": "^1.3.0", "shortid": "^2.2.15", "svelte-spa-router": "^3.0.5" diff --git a/packages/server/package.json b/packages/server/package.json index 67f6de62c0..ffe1d568f5 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/server", "email": "hi@budibase.com", - "version": "1.0.7", + "version": "1.0.8-alpha.0", "description": "Budibase Web Server", "main": "src/index.ts", "repository": { @@ -69,9 +69,9 @@ "author": "Budibase", "license": "GPL-3.0", "dependencies": { - "@budibase/auth": "^1.0.7", - "@budibase/client": "^1.0.7", - "@budibase/string-templates": "^1.0.7", + "@budibase/auth": "^1.0.8-alpha.0", + "@budibase/client": "^1.0.8-alpha.0", + "@budibase/string-templates": "^1.0.8-alpha.0", "@bull-board/api": "^3.7.0", "@bull-board/koa": "^3.7.0", "@elastic/elasticsearch": "7.10.0", diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json index 3036bf7e9f..586af4820c 100644 --- a/packages/string-templates/package.json +++ b/packages/string-templates/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/string-templates", - "version": "1.0.7", + "version": "1.0.8-alpha.0", "description": "Handlebars wrapper for Budibase templating.", "main": "src/index.cjs", "module": "dist/bundle.mjs", diff --git a/packages/worker/package.json b/packages/worker/package.json index d556d5f581..62b52d35c0 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/worker", "email": "hi@budibase.com", - "version": "1.0.7", + "version": "1.0.8-alpha.0", "description": "Budibase background service", "main": "src/index.js", "repository": { @@ -29,8 +29,8 @@ "author": "Budibase", "license": "GPL-3.0", "dependencies": { - "@budibase/auth": "^1.0.7", - "@budibase/string-templates": "^1.0.7", + "@budibase/auth": "^1.0.8-alpha.0", + "@budibase/string-templates": "^1.0.8-alpha.0", "@koa/router": "^8.0.0", "@sentry/node": "^6.0.0", "@techpass/passport-openidconnect": "^0.3.0", From 5f86321f0b326c3a60f71c36a5ff9ccbc94cabb6 Mon Sep 17 00:00:00 2001 From: Martin McKeaveney Date: Mon, 6 Dec 2021 17:19:53 +0100 Subject: [PATCH 10/15] packaging helm chart with consolidated config --- docs/budibase-0.2.3.tgz | Bin 0 -> 42443 bytes hosting/kubernetes/budibase/Chart.yaml | 4 +- .../budibase/charts/couchdb-3.3.4.tgz | Bin 0 -> 9668 bytes .../budibase/charts/couchdb/Chart.yaml | 19 -- .../budibase/charts/couchdb/README.md | 244 ------------------ .../charts/couchdb/ci/required-values.yaml | 3 - .../budibase/charts/couchdb/ci/sidecar.yaml | 9 - .../budibase/charts/couchdb/password.ini | 2 - .../charts/couchdb/templates/NOTES.txt | 20 -- .../charts/couchdb/templates/_helpers.tpl | 81 ------ .../charts/couchdb/templates/configmap.yaml | 23 -- .../charts/couchdb/templates/headless.yaml | 17 -- .../charts/couchdb/templates/ingress.yaml | 33 --- .../couchdb/templates/networkpolicy.yaml | 31 --- .../charts/couchdb/templates/secrets.yaml | 19 -- .../charts/couchdb/templates/service.yaml | 23 -- .../couchdb/templates/serviceaccount.yaml | 15 -- .../charts/couchdb/templates/statefulset.yaml | 202 --------------- .../budibase/charts/couchdb/values.yaml | 201 --------------- hosting/kubernetes/budibase/values.yaml | 150 ++++++++++- scripts/index.yaml | 30 +++ 21 files changed, 180 insertions(+), 946 deletions(-) create mode 100644 docs/budibase-0.2.3.tgz create mode 100644 hosting/kubernetes/budibase/charts/couchdb-3.3.4.tgz delete mode 100755 hosting/kubernetes/budibase/charts/couchdb/Chart.yaml delete mode 100755 hosting/kubernetes/budibase/charts/couchdb/README.md delete mode 100755 hosting/kubernetes/budibase/charts/couchdb/ci/required-values.yaml delete mode 100755 hosting/kubernetes/budibase/charts/couchdb/ci/sidecar.yaml delete mode 100755 hosting/kubernetes/budibase/charts/couchdb/password.ini delete mode 100755 hosting/kubernetes/budibase/charts/couchdb/templates/NOTES.txt delete mode 100755 hosting/kubernetes/budibase/charts/couchdb/templates/_helpers.tpl delete mode 100755 hosting/kubernetes/budibase/charts/couchdb/templates/configmap.yaml delete mode 100755 hosting/kubernetes/budibase/charts/couchdb/templates/headless.yaml delete mode 100755 hosting/kubernetes/budibase/charts/couchdb/templates/ingress.yaml delete mode 100755 hosting/kubernetes/budibase/charts/couchdb/templates/networkpolicy.yaml delete mode 100755 hosting/kubernetes/budibase/charts/couchdb/templates/secrets.yaml delete mode 100755 hosting/kubernetes/budibase/charts/couchdb/templates/service.yaml delete mode 100755 hosting/kubernetes/budibase/charts/couchdb/templates/serviceaccount.yaml delete mode 100755 hosting/kubernetes/budibase/charts/couchdb/templates/statefulset.yaml delete mode 100755 hosting/kubernetes/budibase/charts/couchdb/values.yaml create mode 100644 scripts/index.yaml diff --git a/docs/budibase-0.2.3.tgz b/docs/budibase-0.2.3.tgz new file mode 100644 index 0000000000000000000000000000000000000000..23fbe03712063a9a505435306cf01f76a437f727 GIT binary patch literal 42443 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 literal 0 HcmV?d00001 diff --git a/hosting/kubernetes/budibase/Chart.yaml b/hosting/kubernetes/budibase/Chart.yaml index c5233842ad..a8db638a7e 100644 --- a/hosting/kubernetes/budibase/Chart.yaml +++ b/hosting/kubernetes/budibase/Chart.yaml @@ -22,13 +22,13 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.2.2 +version: 0.2.3 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.9.169" +appVersion: "0.1.6" dependencies: - name: couchdb diff --git a/hosting/kubernetes/budibase/charts/couchdb-3.3.4.tgz b/hosting/kubernetes/budibase/charts/couchdb-3.3.4.tgz new file mode 100644 index 0000000000000000000000000000000000000000..f7ebfd3e9653ef2e0fba07de4e498b46311de606 GIT binary patch literal 9668 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 GzyJWm|L4yD literal 0 HcmV?d00001 diff --git a/hosting/kubernetes/budibase/charts/couchdb/Chart.yaml b/hosting/kubernetes/budibase/charts/couchdb/Chart.yaml deleted file mode 100755 index 74ae734a17..0000000000 --- a/hosting/kubernetes/budibase/charts/couchdb/Chart.yaml +++ /dev/null @@ -1,19 +0,0 @@ -apiVersion: v1 -appVersion: 3.1.0 -description: A database featuring seamless multi-master sync, that scales from big - data to mobile, with an intuitive HTTP/JSON API and designed for reliability. -home: https://couchdb.apache.org/ -icon: http://couchdb.apache.org/CouchDB-visual-identity/logo/CouchDB-couch-symbol.svg -keywords: -- couchdb -- database -- nosql -maintainers: -- email: kocolosk@apache.org - name: kocolosk -- email: willholley@apache.org - name: willholley -name: couchdb -sources: -- https://github.com/apache/couchdb-docker -version: 3.3.4 diff --git a/hosting/kubernetes/budibase/charts/couchdb/README.md b/hosting/kubernetes/budibase/charts/couchdb/README.md deleted file mode 100755 index 3227123d06..0000000000 --- a/hosting/kubernetes/budibase/charts/couchdb/README.md +++ /dev/null @@ -1,244 +0,0 @@ -# CouchDB - -Apache CouchDB is a database featuring seamless multi-master sync, that scales -from big data to mobile, with an intuitive HTTP/JSON API and designed for -reliability. - -This chart deploys a CouchDB cluster as a StatefulSet. It creates a ClusterIP -Service in front of the Deployment for load balancing by default, but can also -be configured to deploy other Service types or an Ingress Controller. The -default persistence mechanism is simply the ephemeral local filesystem, but -production deployments should set `persistentVolume.enabled` to `true` to attach -storage volumes to each Pod in the Deployment. - -## TL;DR - -```bash -$ helm repo add couchdb https://apache.github.io/couchdb-helm -$ helm install couchdb/couchdb \ - --set allowAdminParty=true \ - --set couchdbConfig.couchdb.uuid=$(curl https://www.uuidgenerator.net/api/version4 2>/dev/null | tr -d -) -``` - -## Prerequisites - -- Kubernetes 1.9+ with Beta APIs enabled -- Ingress requires Kubernetes 1.14+ - -## Installing the Chart - -To install the chart with the release name `my-release`: - -Add the CouchDB Helm repository: - -```bash -$ helm repo add couchdb https://apache.github.io/couchdb-helm -``` - -Afterwards install the chart replacing the UUID -`decafbaddecafbaddecafbaddecafbad` with a custom one: - -```bash -$ helm install \ - --name my-release \ - --set couchdbConfig.couchdb.uuid=decafbaddecafbaddecafbaddecafbad \ - couchdb/couchdb -``` - -This will create a Secret containing the admin credentials for the cluster. -Those credentials can be retrieved as follows: - -```bash -$ kubectl get secret my-release-couchdb -o go-template='{{ .data.adminPassword }}' | base64 --decode -``` - -If you prefer to configure the admin credentials directly you can create a -Secret containing `adminUsername`, `adminPassword` and `cookieAuthSecret` keys: - -```bash -$ kubectl create secret generic my-release-couchdb --from-literal=adminUsername=foo --from-literal=adminPassword=bar --from-literal=cookieAuthSecret=baz -``` - -If you want to set the `adminHash` directly to achieve consistent salts between -different nodes you need to addionally add the key `password.ini` to the secret: - -```bash -$ kubectl create secret generic my-release-couchdb \ - --from-literal=adminUsername=foo \ - --from-literal=cookieAuthSecret=baz \ - --from-file=./my-password.ini -``` - -With the following contents in `my-password.ini`: - -``` -[admins] -foo = -``` - -and then install the chart while overriding the `createAdminSecret` setting: - -```bash -$ helm install \ - --name my-release \ - --set createAdminSecret=false \ - --set couchdbConfig.couchdb.uuid=decafbaddecafbaddecafbaddecafbad \ - couchdb/couchdb -``` - -This Helm chart deploys CouchDB on the Kubernetes cluster in a default -configuration. The [configuration](#configuration) section lists -the parameters that can be configured during installation. - -> **Tip**: List all releases using `helm list` - -## Uninstalling the Chart - -To uninstall/delete the `my-release` Deployment: - -```bash -$ helm delete my-release -``` - -The command removes all the Kubernetes components associated with the chart and -deletes the release. - -## Upgrading an existing Release to a new major version - -A major chart version change (like v0.2.3 -> v1.0.0) indicates that there is an -incompatible breaking change needing manual actions. - -### Upgrade to 3.0.0 - -Since version 3.0.0 setting the CouchDB server instance UUID is mandatory. -Therefore you need to generate a UUID and supply it as a value during the -upgrade as follows: - -```bash -$ helm upgrade \ - --reuse-values \ - --set couchdbConfig.couchdb.uuid= \ - couchdb/couchdb -``` - -## Migrating from stable/couchdb - -This chart replaces the `stable/couchdb` chart previously hosted by Helm and continues the -version semantics. You can upgrade directly from `stable/couchdb` to this chart using: - -```bash -$ helm repo add couchdb https://apache.github.io/couchdb-helm -$ helm upgrade my-release couchdb/couchdb -``` - -## Configuration - -The following table lists the most commonly configured parameters of the -CouchDB chart and their default values: - -| Parameter | Description | Default | -|---------------------------------|-------------------------------------------------------|----------------------------------------| -| `clusterSize` | The initial number of nodes in the CouchDB cluster | 3 | -| `couchdbConfig` | Map allowing override elements of server .ini config | *See below* | -| `allowAdminParty` | If enabled, start cluster without admin account | false (requires creating a Secret) | -| `createAdminSecret` | If enabled, create an admin account and cookie secret | true | -| `schedulerName` | Name of the k8s scheduler (other than default) | `nil` | -| `erlangFlags` | Map of flags supplied to the underlying Erlang VM | name: couchdb, setcookie: monster -| `persistentVolume.enabled` | Boolean determining whether to attach a PV to each node | false -| `persistentVolume.size` | If enabled, the size of the persistent volume to attach | 10Gi -| `enableSearch` | Adds a sidecar for Lucene-powered text search | false | - -You can set the values of the `couchdbConfig` map according to the -[official configuration][4]. The following shows the map's default values and -required options to set: - -| Parameter | Description | Default | -|---------------------------------|--------------------------------------------------------------------|----------------------------------------| -| `couchdb.uuid` | UUID for this CouchDB server instance ([Required in a cluster][5]) | | -| `chttpd.bind_address` | listens on all interfaces when set to any | any | -| `chttpd.require_valid_user` | disables all the anonymous requests to the port 5984 when true | false | - -A variety of other parameters are also configurable. See the comments in the -`values.yaml` file for further details: - -| Parameter | Default | -|--------------------------------------|----------------------------------------| -| `adminUsername` | admin | -| `adminPassword` | auto-generated | -| `adminHash` | | -| `cookieAuthSecret` | auto-generated | -| `image.repository` | couchdb | -| `image.tag` | 3.1.0 | -| `image.pullPolicy` | IfNotPresent | -| `searchImage.repository` | kocolosk/couchdb-search | -| `searchImage.tag` | 0.1.0 | -| `searchImage.pullPolicy` | IfNotPresent | -| `initImage.repository` | busybox | -| `initImage.tag` | latest | -| `initImage.pullPolicy` | Always | -| `ingress.enabled` | false | -| `ingress.hosts` | chart-example.local | -| `ingress.annotations` | | -| `ingress.path` | / | -| `ingress.tls` | | -| `persistentVolume.accessModes` | ReadWriteOnce | -| `persistentVolume.storageClass` | Default for the Kube cluster | -| `podManagementPolicy` | Parallel | -| `affinity` | | -| `annotations` | | -| `tolerations` | | -| `resources` | | -| `service.annotations` | | -| `service.enabled` | true | -| `service.type` | ClusterIP | -| `service.externalPort` | 5984 | -| `dns.clusterDomainSuffix` | cluster.local | -| `networkPolicy.enabled` | true | -| `serviceAccount.enabled` | true | -| `serviceAccount.create` | true | -| `serviceAccount.imagePullSecrets` | | -| `sidecars` | {} | -| `livenessProbe.enabled` | true | -| `livenessProbe.failureThreshold` | 3 | -| `livenessProbe.initialDelaySeconds` | 0 | -| `livenessProbe.periodSeconds` | 10 | -| `livenessProbe.successThreshold` | 1 | -| `livenessProbe.timeoutSeconds` | 1 | -| `readinessProbe.enabled` | true | -| `readinessProbe.failureThreshold` | 3 | -| `readinessProbe.initialDelaySeconds` | 0 | -| `readinessProbe.periodSeconds` | 10 | -| `readinessProbe.successThreshold` | 1 | -| `readinessProbe.timeoutSeconds` | 1 | - -## Feedback, Issues, Contributing - -General feedback is welcome at our [user][1] or [developer][2] mailing lists. - -Apache CouchDB has a [CONTRIBUTING][3] file with details on how to get started -with issue reporting or contributing to the upkeep of this project. In short, -use GitHub Issues, do not report anything on Docker's website. - -## Non-Apache CouchDB Development Team Contributors - -- [@natarajaya](https://github.com/natarajaya) -- [@satchpx](https://github.com/satchpx) -- [@spanato](https://github.com/spanato) -- [@jpds](https://github.com/jpds) -- [@sebastien-prudhomme](https://github.com/sebastien-prudhomme) -- [@stepanstipl](https://github.com/sebastien-stepanstipl) -- [@amatas](https://github.com/amatas) -- [@Chimney42](https://github.com/Chimney42) -- [@mattjmcnaughton](https://github.com/mattjmcnaughton) -- [@mainephd](https://github.com/mainephd) -- [@AdamDang](https://github.com/AdamDang) -- [@mrtyler](https://github.com/mrtyler) -- [@kevinwlau](https://github.com/kevinwlau) -- [@jeyenzo](https://github.com/jeyenzo) -- [@Pinpin31.](https://github.com/Pinpin31) - -[1]: http://mail-archives.apache.org/mod_mbox/couchdb-user/ -[2]: http://mail-archives.apache.org/mod_mbox/couchdb-dev/ -[3]: https://github.com/apache/couchdb/blob/master/CONTRIBUTING.md -[4]: https://docs.couchdb.org/en/stable/config/index.html -[5]: https://docs.couchdb.org/en/latest/setup/cluster.html#preparing-couchdb-nodes-to-be-joined-into-a-cluster diff --git a/hosting/kubernetes/budibase/charts/couchdb/ci/required-values.yaml b/hosting/kubernetes/budibase/charts/couchdb/ci/required-values.yaml deleted file mode 100755 index 79589d2e04..0000000000 --- a/hosting/kubernetes/budibase/charts/couchdb/ci/required-values.yaml +++ /dev/null @@ -1,3 +0,0 @@ -couchdbConfig: - couchdb: - uuid: "decafbaddecafbaddecafbaddecafbad" diff --git a/hosting/kubernetes/budibase/charts/couchdb/ci/sidecar.yaml b/hosting/kubernetes/budibase/charts/couchdb/ci/sidecar.yaml deleted file mode 100755 index aa570bdf74..0000000000 --- a/hosting/kubernetes/budibase/charts/couchdb/ci/sidecar.yaml +++ /dev/null @@ -1,9 +0,0 @@ -sidecars: - - name: foo - image: "busybox" - imagePullPolicy: IfNotPresent - resources: - requests: - cpu: "0.1" - memory: 10Mi - command: ['while true; do echo "foo"; sleep 5; done;'] diff --git a/hosting/kubernetes/budibase/charts/couchdb/password.ini b/hosting/kubernetes/budibase/charts/couchdb/password.ini deleted file mode 100755 index 4ce8445aae..0000000000 --- a/hosting/kubernetes/budibase/charts/couchdb/password.ini +++ /dev/null @@ -1,2 +0,0 @@ -[admins] -{{ .Values.adminUsername }} = {{ .Values.adminHash }} diff --git a/hosting/kubernetes/budibase/charts/couchdb/templates/NOTES.txt b/hosting/kubernetes/budibase/charts/couchdb/templates/NOTES.txt deleted file mode 100755 index a3658bd37f..0000000000 --- a/hosting/kubernetes/budibase/charts/couchdb/templates/NOTES.txt +++ /dev/null @@ -1,20 +0,0 @@ -Apache CouchDB is starting. Check the status of the Pods using: - - kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ template "couchdb.name" . }},release={{ .Release.Name }}" - -Once all of the Pods are fully Ready, execute the following command to create -some required system databases: - - kubectl exec --namespace {{ .Release.Namespace }} {{ if not .Values.allowAdminParty }}-it {{ end }}{{ template "couchdb.fullname" . }}-0 -c couchdb -- \ - curl -s \ - http://127.0.0.1:5984/_cluster_setup \ - -X POST \ - -H "Content-Type: application/json" \ -{{- if .Values.allowAdminParty }} - -d '{"action": "finish_cluster"}' -{{- else }} - -d '{"action": "finish_cluster"}' \ - -u -{{- end }} - -Then it's time to relax. diff --git a/hosting/kubernetes/budibase/charts/couchdb/templates/_helpers.tpl b/hosting/kubernetes/budibase/charts/couchdb/templates/_helpers.tpl deleted file mode 100755 index f9d013e487..0000000000 --- a/hosting/kubernetes/budibase/charts/couchdb/templates/_helpers.tpl +++ /dev/null @@ -1,81 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "couchdb.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -*/}} -{{- define "couchdb.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- printf "%s-%s" .Values.fullnameOverride .Chart.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} - -{{/* -In the event that we create both a headless service and a traditional one, -ensure that the latter gets a unique name. -*/}} -{{- define "couchdb.svcname" -}} -{{- if .Values.fullnameOverride -}} -{{- printf "%s-svc-%s" .Values.fullnameOverride .Chart.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- printf "%s-svc-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} - -{{/* -Create a random string if the supplied key does not exist -*/}} -{{- define "couchdb.defaultsecret" -}} -{{- if . -}} -{{- . | b64enc | quote -}} -{{- else -}} -{{- randAlphaNum 20 | b64enc | quote -}} -{{- end -}} -{{- end -}} - -{{/* -Labels used to define Pods in the CouchDB statefulset -*/}} -{{- define "couchdb.ss.selector" -}} -app: {{ template "couchdb.name" . }} -release: {{ .Release.Name }} -{{- end -}} - -{{/* -Generates a comma delimited list of nodes in the cluster -*/}} -{{- define "couchdb.seedlist" -}} -{{- $nodeCount := min 5 .Values.clusterSize | int }} - {{- range $index0 := until $nodeCount -}} - {{- $index1 := $index0 | add1 -}} - {{ $.Values.erlangFlags.name }}@{{ template "couchdb.fullname" $ }}-{{ $index0 }}.{{ template "couchdb.fullname" $ }}.{{ $.Release.Namespace }}.svc.{{ $.Values.dns.clusterDomainSuffix }}{{ if ne $index1 $nodeCount }},{{ end }} - {{- end -}} -{{- end -}} - -{{/* -If serviceAccount.name is specified, use that, else use the couchdb instance name -*/}} -{{- define "couchdb.serviceAccount" -}} -{{- if .Values.serviceAccount.name -}} -{{- .Values.serviceAccount.name }} -{{- else -}} -{{- template "couchdb.fullname" . -}} -{{- end -}} -{{- end -}} - -{{/* -Fail if couchdbConfig.couchdb.uuid is undefined -*/}} -{{- define "couchdb.uuid" -}} -{{- required "A value for couchdbConfig.couchdb.uuid must be set" (.Values.couchdbConfig.couchdb | default dict).uuid -}} -{{- end -}} \ No newline at end of file diff --git a/hosting/kubernetes/budibase/charts/couchdb/templates/configmap.yaml b/hosting/kubernetes/budibase/charts/couchdb/templates/configmap.yaml deleted file mode 100755 index a6a20e0574..0000000000 --- a/hosting/kubernetes/budibase/charts/couchdb/templates/configmap.yaml +++ /dev/null @@ -1,23 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "couchdb.fullname" . }} - labels: - app: {{ template "couchdb.name" . }} - chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" - heritage: {{ .Release.Service | quote }} - release: {{ .Release.Name | quote }} -data: - inifile: | - {{ $couchdbConfig := dict "couchdb" (dict "uuid" (include "couchdb.uuid" .)) -}} - {{- $couchdbConfig := merge $couchdbConfig .Values.couchdbConfig -}} - {{- range $section, $settings := $couchdbConfig -}} - {{ printf "[%s]" $section }} - {{ range $key, $value := $settings -}} - {{ printf "%s = %s" $key ($value | toString) }} - {{ end }} - {{ end }} - - seedlistinifile: | - [cluster] - seedlist = {{ template "couchdb.seedlist" . }} diff --git a/hosting/kubernetes/budibase/charts/couchdb/templates/headless.yaml b/hosting/kubernetes/budibase/charts/couchdb/templates/headless.yaml deleted file mode 100755 index 0ce3ef0f35..0000000000 --- a/hosting/kubernetes/budibase/charts/couchdb/templates/headless.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ template "couchdb.fullname" . }} - labels: - app: {{ template "couchdb.name" . }} - chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -spec: - clusterIP: None - publishNotReadyAddresses: true - ports: - - name: couchdb - port: 5984 - selector: -{{ include "couchdb.ss.selector" . | indent 4 }} diff --git a/hosting/kubernetes/budibase/charts/couchdb/templates/ingress.yaml b/hosting/kubernetes/budibase/charts/couchdb/templates/ingress.yaml deleted file mode 100755 index c547847ce5..0000000000 --- a/hosting/kubernetes/budibase/charts/couchdb/templates/ingress.yaml +++ /dev/null @@ -1,33 +0,0 @@ -{{- if .Values.ingress.enabled -}} -{{- $serviceName := include "couchdb.fullname" . -}} -{{- $servicePort := .Values.service.externalPort -}} -{{- $path := .Values.ingress.path | quote -}} -apiVersion: networking.k8s.io/v1beta1 -kind: Ingress -metadata: - name: {{ template "couchdb.fullname" . }} - labels: - app: {{ template "couchdb.name" . }} - chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} - annotations: - {{- range $key, $value := .Values.ingress.annotations }} - {{ $key }}: {{ $value | quote }} - {{- end }} -spec: - rules: - {{- range $host := .Values.ingress.hosts }} - - host: {{ $host }} - http: - paths: - - path: {{ $path }} - backend: - serviceName: {{ $serviceName }} - servicePort: {{ $servicePort }} - {{- end -}} - {{- if .Values.ingress.tls }} - tls: -{{ toYaml .Values.ingress.tls | indent 4 }} - {{- end -}} -{{- end -}} diff --git a/hosting/kubernetes/budibase/charts/couchdb/templates/networkpolicy.yaml b/hosting/kubernetes/budibase/charts/couchdb/templates/networkpolicy.yaml deleted file mode 100755 index 2830708bef..0000000000 --- a/hosting/kubernetes/budibase/charts/couchdb/templates/networkpolicy.yaml +++ /dev/null @@ -1,31 +0,0 @@ - -{{- if .Values.networkPolicy.enabled }} -kind: NetworkPolicy -apiVersion: networking.k8s.io/v1 -metadata: - name: {{ template "couchdb.fullname" . }} - labels: - app: {{ template "couchdb.name" . }} - chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -spec: - podSelector: - matchLabels: -{{ include "couchdb.ss.selector" . | indent 6 }} - ingress: - - ports: - - protocol: TCP - port: 5984 - - ports: - - protocol: TCP - port: 9100 - - protocol: TCP - port: 4369 - from: - - podSelector: - matchLabels: -{{ include "couchdb.ss.selector" . | indent 14 }} - policyTypes: - - Ingress -{{- end }} diff --git a/hosting/kubernetes/budibase/charts/couchdb/templates/secrets.yaml b/hosting/kubernetes/budibase/charts/couchdb/templates/secrets.yaml deleted file mode 100755 index 92f55c6d6b..0000000000 --- a/hosting/kubernetes/budibase/charts/couchdb/templates/secrets.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{- if .Values.createAdminSecret -}} -apiVersion: v1 -kind: Secret -metadata: - name: {{ template "couchdb.fullname" . }} - labels: - app: {{ template "couchdb.fullname" . }} - chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" - release: "{{ .Release.Name }}" - heritage: "{{ .Release.Service }}" -type: Opaque -data: - adminUsername: {{ template "couchdb.defaultsecret" .Values.adminUsername }} - adminPassword: {{ template "couchdb.defaultsecret" .Values.adminPassword }} - cookieAuthSecret: {{ template "couchdb.defaultsecret" .Values.cookieAuthSecret }} -{{- if .Values.adminHash }} - password.ini: {{ tpl (.Files.Get "password.ini") . | b64enc }} -{{- end -}} -{{- end -}} diff --git a/hosting/kubernetes/budibase/charts/couchdb/templates/service.yaml b/hosting/kubernetes/budibase/charts/couchdb/templates/service.yaml deleted file mode 100755 index 6d0382477d..0000000000 --- a/hosting/kubernetes/budibase/charts/couchdb/templates/service.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- if .Values.service.enabled -}} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "couchdb.svcname" . }} - labels: - app: {{ template "couchdb.name" . }} - chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -{{- if .Values.service.annotations }} - annotations: -{{ toYaml .Values.service.annotations | indent 4 }} -{{- end }} -spec: - ports: - - port: {{ .Values.service.externalPort }} - protocol: TCP - targetPort: 5984 - type: {{ .Values.service.type }} - selector: -{{ include "couchdb.ss.selector" . | indent 4 }} -{{- end -}} diff --git a/hosting/kubernetes/budibase/charts/couchdb/templates/serviceaccount.yaml b/hosting/kubernetes/budibase/charts/couchdb/templates/serviceaccount.yaml deleted file mode 100755 index bb82799a49..0000000000 --- a/hosting/kubernetes/budibase/charts/couchdb/templates/serviceaccount.yaml +++ /dev/null @@ -1,15 +0,0 @@ -{{- if .Values.serviceAccount.create }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "couchdb.serviceAccount" . }} - labels: - app: {{ template "couchdb.name" . }} - chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -{{- if .Values.serviceAccount.imagePullSecrets }} -imagePullSecrets: -{{ toYaml .Values.serviceAccount.imagePullSecrets }} -{{- end }} -{{- end }} diff --git a/hosting/kubernetes/budibase/charts/couchdb/templates/statefulset.yaml b/hosting/kubernetes/budibase/charts/couchdb/templates/statefulset.yaml deleted file mode 100755 index 6225fbe98c..0000000000 --- a/hosting/kubernetes/budibase/charts/couchdb/templates/statefulset.yaml +++ /dev/null @@ -1,202 +0,0 @@ -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: {{ template "couchdb.fullname" . }} - labels: - app: {{ template "couchdb.name" . }} - chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -spec: - replicas: {{ .Values.clusterSize }} - serviceName: {{ template "couchdb.fullname" . }} - podManagementPolicy: {{ .Values.podManagementPolicy }} - selector: - matchLabels: -{{ include "couchdb.ss.selector" . | indent 6 }} - template: - metadata: - labels: -{{ include "couchdb.ss.selector" . | indent 8 }} -{{- with .Values.annotations }} - annotations: - checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} -{{ toYaml . | indent 8 }} -{{- end }} - spec: - {{- if .Values.schedulerName }} - schedulerName: "{{ .Values.schedulerName }}" - {{- end }} - {{- if .Values.serviceAccount.enabled }} - serviceAccountName: {{ template "couchdb.serviceAccount" . }} - {{- end }} - initContainers: - - name: init-copy - image: "{{ .Values.initImage.repository }}:{{ .Values.initImage.tag }}" - imagePullPolicy: {{ .Values.initImage.pullPolicy }} - command: ['sh','-c','cp /tmp/chart.ini /default.d; cp /tmp/seedlist.ini /default.d; ls -lrt /default.d;'] - volumeMounts: - - name: config - mountPath: /tmp/ - - name: config-storage - mountPath: /default.d -{{- if .Values.adminHash }} - - name: admin-hash-copy - image: "{{ .Values.initImage.repository }}:{{ .Values.initImage.tag }}" - imagePullPolicy: {{ .Values.initImage.pullPolicy }} - command: ['sh','-c','cp /tmp/password.ini /local.d/ ;'] - volumeMounts: - - name: admin-password - mountPath: /tmp/password.ini - subPath: "password.ini" - - name: local-config-storage - mountPath: /local.d -{{- end }} - containers: - - name: couchdb - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - ports: - - name: couchdb - containerPort: 5984 - - name: epmd - containerPort: 4369 - - containerPort: 9100 - env: -{{- if not .Values.allowAdminParty }} - - name: COUCHDB_USER - valueFrom: - secretKeyRef: - name: {{ template "couchdb.fullname" . }} - key: adminUsername - - name: COUCHDB_PASSWORD - valueFrom: - secretKeyRef: - name: {{ template "couchdb.fullname" . }} - key: adminPassword - - name: COUCHDB_SECRET - valueFrom: - secretKeyRef: - name: {{ template "couchdb.fullname" . }} - key: cookieAuthSecret -{{- end }} - - name: ERL_FLAGS - value: "{{ range $k, $v := .Values.erlangFlags }} -{{ $k }} {{ $v }} {{ end }}" -{{- if .Values.livenessProbe.enabled }} - livenessProbe: -{{- if .Values.couchdbConfig.chttpd.require_valid_user }} - exec: - command: - - sh - - -c - - curl -G --silent --fail -u ${COUCHDB_USER}:${COUCHDB_PASSWORD} http://localhost:5984/_up -{{- else }} - httpGet: - path: /_up - port: 5984 -{{- end }} - failureThreshold: {{ .Values.livenessProbe.failureThreshold }} - initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.livenessProbe.periodSeconds }} - successThreshold: {{ .Values.livenessProbe.successThreshold }} - timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} -{{- end }} -{{- if .Values.readinessProbe.enabled }} - readinessProbe: -{{- if .Values.couchdbConfig.chttpd.require_valid_user }} - exec: - command: - - sh - - -c - - curl -G --silent --fail -u ${COUCHDB_USER}:${COUCHDB_PASSWORD} http://localhost:5984/_up -{{- else }} - httpGet: - path: /_up - port: 5984 -{{- end }} - failureThreshold: {{ .Values.readinessProbe.failureThreshold }} - initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.readinessProbe.periodSeconds }} - successThreshold: {{ .Values.readinessProbe.successThreshold }} - timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} -{{- end }} - resources: -{{ toYaml .Values.resources | indent 12 }} - volumeMounts: - - name: config-storage - mountPath: /opt/couchdb/etc/default.d -{{- if .Values.adminHash }} - - name: local-config-storage - mountPath: /opt/couchdb/etc/local.d -{{- end }} - - name: database-storage - mountPath: /opt/couchdb/data -{{- if .Values.enableSearch }} - - name: clouseau - image: "{{ .Values.searchImage.repository }}:{{ .Values.searchImage.tag }}" - imagePullPolicy: {{ .Values.searchImage.pullPolicy }} - volumeMounts: - - name: database-storage - mountPath: /opt/couchdb-search/data -{{- end }} -{{- if .Values.sidecars }} -{{ toYaml .Values.sidecars | indent 8}} -{{- end }} -{{- if .Values.nodeSelector }} - nodeSelector: -{{ toYaml .Values.nodeSelector | indent 8 }} -{{- end }} -{{- with .Values.tolerations }} - tolerations: -{{ toYaml . | indent 8 }} -{{- end }} -{{- with .Values.affinity }} - affinity: -{{ toYaml . | indent 8 }} -{{- end }} - volumes: - - name: config-storage - emptyDir: {} - - name: config - configMap: - name: {{ template "couchdb.fullname" . }} - items: - - key: inifile - path: chart.ini - - key: seedlistinifile - path: seedlist.ini - -{{- if .Values.adminHash }} - - name: local-config-storage - emptyDir: {} - - name: admin-password - secret: - secretName: {{ template "couchdb.fullname" . }} -{{- end -}} - -{{- if not .Values.persistentVolume.enabled }} - - name: database-storage - emptyDir: {} -{{- else }} - volumeClaimTemplates: - - metadata: - name: database-storage - labels: - app: {{ template "couchdb.name" . }} - release: {{ .Release.Name }} - spec: - accessModes: - {{- range .Values.persistentVolume.accessModes }} - - {{ . | quote }} - {{- end }} - resources: - requests: - storage: {{ .Values.persistentVolume.size | quote }} - {{- if .Values.persistentVolume.storageClass }} - {{- if (eq "-" .Values.persistentVolume.storageClass) }} - storageClassName: "" - {{- else }} - storageClassName: "{{ .Values.persistentVolume.storageClass }}" - {{- end }} - {{- end }} -{{- end }} diff --git a/hosting/kubernetes/budibase/charts/couchdb/values.yaml b/hosting/kubernetes/budibase/charts/couchdb/values.yaml deleted file mode 100755 index 5a5025f816..0000000000 --- a/hosting/kubernetes/budibase/charts/couchdb/values.yaml +++ /dev/null @@ -1,201 +0,0 @@ -## clusterSize is the initial size of the CouchDB cluster. -clusterSize: 3 - -## If allowAdminParty is enabled the cluster will start up without any database -## administrator account; i.e., all users will be granted administrative -## access. Otherwise, the system will look for a Secret called -## -couchdb containing `adminUsername`, `adminPassword` and -## `cookieAuthSecret` keys. See the `createAdminSecret` flag. -## ref: https://kubernetes.io/docs/concepts/configuration/secret/ -allowAdminParty: false - -## If createAdminSecret is enabled a Secret called -couchdb will -## be created containing auto-generated credentials. Users who prefer to set -## these values themselves have a couple of options: -## -## 1) The `adminUsername`, `adminPassword`, `adminHash`, and `cookieAuthSecret` -## can be defined directly in the chart's values. Note that all of a chart's -## values are currently stored in plaintext in a ConfigMap in the tiller -## namespace. -## -## 2) This flag can be disabled and a Secret with the required keys can be -## created ahead of time. -createAdminSecret: true - -# adminUsername: budibase -# adminPassword: budibase -# adminHash: -pbkdf2-this_is_not_necessarily_secure_either -# cookieAuthSecret: admin - -## When enabled, will deploy a networkpolicy that allows CouchDB pods to -## communicate with each other for clustering and ingress on port 5984 -networkPolicy: - enabled: true - -## Use an alternate scheduler, e.g. "stork". -## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ -## -# schedulerName: - -# Use a service account -serviceAccount: - enabled: true - create: true -# name: -# imagePullSecrets: -# - name: myimagepullsecret - -## The storage volume used by each Pod in the StatefulSet. If a -## persistentVolume is not enabled, the Pods will use `emptyDir` ephemeral -## local storage. Setting the storageClass attribute to "-" disables dynamic -## provisioning of Persistent Volumes; leaving it unset will invoke the default -## provisioner. -persistentVolume: - enabled: false - accessModes: - - ReadWriteOnce - size: 10Gi - storageClass: "" - -## The CouchDB image -image: - repository: couchdb - tag: 3.1.0 - pullPolicy: IfNotPresent - -## Experimental integration with Lucene-powered fulltext search -searchImage: - repository: kocolosk/couchdb-search - tag: 0.2.0 - pullPolicy: IfNotPresent - -## Flip this to flag to include the Search container in each Pod -enableSearch: true - -initImage: - repository: busybox - tag: latest - pullPolicy: Always - -## CouchDB is happy to spin up cluster nodes in parallel, but if you encounter -## problems you can try setting podManagementPolicy to the StatefulSet default -## `OrderedReady` -podManagementPolicy: Parallel - -## To better tolerate Node failures, we can prevent Kubernetes scheduler from -## assigning more than one Pod of CouchDB StatefulSet per Node using podAntiAffinity. -affinity: {} - # podAntiAffinity: - # requiredDuringSchedulingIgnoredDuringExecution: - # - labelSelector: - # matchExpressions: - # - key: "app" - # operator: In - # values: - # - couchdb - # topologyKey: "kubernetes.io/hostname" - -## Optional pod annotations -annotations: {} - -## Optional tolerations -tolerations: [] - -## A StatefulSet requires a headless Service to establish the stable network -## identities of the Pods, and that Service is created automatically by this -## chart without any additional configuration. The Service block below refers -## to a second Service that governs how clients connect to the CouchDB cluster. -service: - # annotations: - enabled: true - type: ClusterIP - externalPort: 5984 - -## An Ingress resource can provide name-based virtual hosting and TLS -## termination among other things for CouchDB deployments which are accessed -## from outside the Kubernetes cluster. -## ref: https://kubernetes.io/docs/concepts/services-networking/ingress/ -ingress: - enabled: false - hosts: - - chart-example.local - path: / - annotations: [] - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - tls: - # Secrets must be manually created in the namespace. - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - -## Optional resource requests and limits for the CouchDB container -## ref: http://kubernetes.io/docs/user-guide/compute-resources/ -resources: - {} - # requests: - # cpu: 100m - # memory: 128Mi - # limits: - # cpu: 56 - # memory: 256Gi - -## erlangFlags is a map that is passed to the Erlang VM as flags using the -## ERL_FLAGS env. `name` and `setcookie` flags are minimally required to -## establish connectivity between cluster nodes. -## ref: http://erlang.org/doc/man/erl.html#init_flags -erlangFlags: - name: couchdb - setcookie: monster - -## couchdbConfig will override default CouchDB configuration settings. -## The contents of this map are reformatted into a .ini file laid down -## by a ConfigMap object. -## ref: http://docs.couchdb.org/en/latest/config/index.html -couchdbConfig: - couchdb: - uuid: budibase-couchdb # REQUIRED: Unique identifier for this CouchDB server instance - # cluster: - # q: 8 # Create 8 shards for each database - chttpd: - bind_address: any - # chttpd.require_valid_user disables all the anonymous requests to the port - # 5984 when is set to true. - require_valid_user: false - -# Kubernetes local cluster domain. -# This is used to generate FQDNs for peers when joining the CouchDB cluster. -dns: - clusterDomainSuffix: cluster.local - -## Configure liveness and readiness probe values -## Ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes -livenessProbe: - enabled: true - failureThreshold: 3 - initialDelaySeconds: 0 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 1 -readinessProbe: - enabled: true - failureThreshold: 3 - initialDelaySeconds: 0 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 1 - -# Configure arbitrary sidecar containers for CouchDB pods created by the -# StatefulSet -sidecars: {} - # - name: foo - # image: "busybox" - # imagePullPolicy: IfNotPresent - # resources: - # requests: - # cpu: "0.1" - # memory: 10Mi - # command: ['echo "foo";'] - # volumeMounts: - # - name: database-storage - # mountPath: /opt/couchdb/data/ diff --git a/hosting/kubernetes/budibase/values.yaml b/hosting/kubernetes/budibase/values.yaml index bd9f6543b3..ec3629e094 100644 --- a/hosting/kubernetes/budibase/values.yaml +++ b/hosting/kubernetes/budibase/values.yaml @@ -126,12 +126,10 @@ services: couchdb: enabled: true - replicaCount: 3 # url: "" # only change if pointing to existing couch server # user: "" # only change if pointing to existing couch server # password: "" # only change if pointing to existing couch server port: 5984 - storage: 100Mi redis: enabled: true # disable if using external redis @@ -151,3 +149,151 @@ services: region: "" # AWS_REGION if using S3 or existing minio secret url: "" # only change if pointing to existing minio cluster and minio: false storage: 100Mi + +# Override values in couchDB subchart +couchdb: + ## clusterSize is the initial size of the CouchDB cluster. + clusterSize: 3 + allowAdminParty: false + + # Secret Management + createAdminSecret: true + + # adminUsername: budibase + # adminPassword: budibase + # adminHash: -pbkdf2-this_is_not_necessarily_secure_either + # cookieAuthSecret: admin + + ## When enabled, will deploy a networkpolicy that allows CouchDB pods to + ## communicate with each other for clustering and ingress on port 5984 + networkPolicy: + enabled: true + + # Use a service account + serviceAccount: + enabled: true + create: true + # name: + # imagePullSecrets: + # - name: myimagepullsecret + + ## The storage volume used by each Pod in the StatefulSet. If a + ## persistentVolume is not enabled, the Pods will use `emptyDir` ephemeral + ## local storage. Setting the storageClass attribute to "-" disables dynamic + ## provisioning of Persistent Volumes; leaving it unset will invoke the default + ## provisioner. + persistentVolume: + enabled: false + accessModes: + - ReadWriteOnce + size: 10Gi + storageClass: "" + + ## The CouchDB image + image: + repository: couchdb + tag: 3.1.0 + pullPolicy: IfNotPresent + + ## Experimental integration with Lucene-powered fulltext search + enableSearch: true + searchImage: + repository: kocolosk/couchdb-search + tag: 0.2.0 + pullPolicy: IfNotPresent + + initImage: + repository: busybox + tag: latest + pullPolicy: Always + + ## CouchDB is happy to spin up cluster nodes in parallel, but if you encounter + ## problems you can try setting podManagementPolicy to the StatefulSet default + ## `OrderedReady` + podManagementPolicy: Parallel + + ## Optional pod annotations + annotations: {} + + ## Optional tolerations + tolerations: [] + + service: + # annotations: + enabled: true + type: ClusterIP + externalPort: 5984 + + ## An Ingress resource can provide name-based virtual hosting and TLS + ## termination among other things for CouchDB deployments which are accessed + ## from outside the Kubernetes cluster. + ## ref: https://kubernetes.io/docs/concepts/services-networking/ingress/ + ingress: + enabled: false + hosts: + - chart-example.local + path: / + annotations: [] + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + tls: + # Secrets must be manually created in the namespace. + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + + ## Optional resource requests and limits for the CouchDB container + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + resources: + {} + # requests: + # cpu: 100m + # memory: 128Mi + # limits: + # cpu: 56 + # memory: 256Gi + + ## erlangFlags is a map that is passed to the Erlang VM as flags using the + ## ERL_FLAGS env. `name` and `setcookie` flags are minimally required to + ## establish connectivity between cluster nodes. + ## ref: http://erlang.org/doc/man/erl.html#init_flags + erlangFlags: + name: couchdb + setcookie: monster + + ## couchdbConfig will override default CouchDB configuration settings. + ## The contents of this map are reformatted into a .ini file laid down + ## by a ConfigMap object. + ## ref: http://docs.couchdb.org/en/latest/config/index.html + couchdbConfig: + couchdb: + uuid: budibase-couchdb # REQUIRED: Unique identifier for this CouchDB server instance + # cluster: + # q: 8 # Create 8 shards for each database + chttpd: + bind_address: any + # chttpd.require_valid_user disables all the anonymous requests to the port + # 5984 when is set to true. + require_valid_user: false + + # Kubernetes local cluster domain. + # This is used to generate FQDNs for peers when joining the CouchDB cluster. + dns: + clusterDomainSuffix: cluster.local + + ## Configure liveness and readiness probe values + ## Ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes + livenessProbe: + enabled: true + failureThreshold: 3 + initialDelaySeconds: 0 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + readinessProbe: + enabled: true + failureThreshold: 3 + initialDelaySeconds: 0 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 \ No newline at end of file diff --git a/scripts/index.yaml b/scripts/index.yaml new file mode 100644 index 0000000000..2990f842ce --- /dev/null +++ b/scripts/index.yaml @@ -0,0 +1,30 @@ +apiVersion: v1 +entries: + budibase: + - apiVersion: v2 + appVersion: 0.1.6 + created: "2021-12-06T17:18:57.819135+01:00" + dependencies: + - condition: services.couchdb.enabled + name: couchdb + repository: https://apache.github.io/couchdb-helm + version: 3.3.4 + - condition: ingress.nginx + name: ingress-nginx + repository: https://github.com/kubernetes/ingress-nginx + version: 3.35.0 + description: Budibase is an open source low-code platform, helping thousands of teams build apps for their workplace in minutes. + digest: 5bd6418e9a78bf4d8df6de077d4392a647ea30324e33cae38da480e162af3c22 + keywords: + - low-code + - database + - cluster + name: budibase + sources: + - https://github.com/Budibase/budibase + - https://budibase.com + type: application + urls: + - https://budibase.github.io/budibase/budibase-0.2.3.tgz + version: 0.2.3 +generated: "2021-12-06T17:18:57.814315+01:00" From 8269e85eb92623c259f28e9dc455b52608d16a92 Mon Sep 17 00:00:00 2001 From: Martin McKeaveney Date: Mon, 6 Dec 2021 18:33:31 +0100 Subject: [PATCH 11/15] helm chart release --- docs/budibase-0.2.3.tgz | Bin 42443 -> 43033 bytes docs/index.yaml | 38 +++++++++++++++++++++---- hosting/kubernetes/budibase/Chart.yaml | 2 +- scripts/index.yaml | 30 ------------------- 4 files changed, 33 insertions(+), 37 deletions(-) delete mode 100644 scripts/index.yaml diff --git a/docs/budibase-0.2.3.tgz b/docs/budibase-0.2.3.tgz index 23fbe03712063a9a505435306cf01f76a437f727..b7207376a131ead28492f3a9f6330788396b7ee2 100644 GIT binary patch literal 43033 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 diff --git a/docs/index.yaml b/docs/index.yaml index 04543c147e..1230b3cbc2 100644 --- a/docs/index.yaml +++ b/docs/index.yaml @@ -1,9 +1,35 @@ apiVersion: v1 entries: budibase: + - apiVersion: v2 + appVersion: 1.0.6 + created: "2021-12-06T18:32:46.48467+01:00" + dependencies: + - condition: services.couchdb.enabled + name: couchdb + repository: https://apache.github.io/couchdb-helm + version: 3.3.4 + - condition: ingress.nginx + name: ingress-nginx + repository: https://github.com/kubernetes/ingress-nginx + version: 3.35.0 + description: Budibase is an open source low-code platform, helping thousands of teams build apps for their workplace in minutes. + digest: 6c58f3fa361f9447721405d11616436679599c90c719a91cf892add5b1ad665a + keywords: + - low-code + - database + - cluster + name: budibase + sources: + - https://github.com/Budibase/budibase + - https://budibase.com + type: application + urls: + - https://budibase.github.io/budibase/budibase-0.2.3.tgz + version: 0.2.3 - apiVersion: v2 appVersion: 0.9.169 - created: "2021-10-20T14:27:23.521358+01:00" + created: "2021-12-06T18:32:46.480554+01:00" dependencies: - condition: services.couchdb.enabled name: couchdb @@ -29,7 +55,7 @@ entries: version: 0.2.2 - apiVersion: v2 appVersion: 0.9.163 - created: "2021-10-20T14:27:23.5153+01:00" + created: "2021-12-06T18:32:46.475721+01:00" dependencies: - condition: services.couchdb.enabled name: couchdb @@ -55,7 +81,7 @@ entries: version: 0.2.1 - apiVersion: v2 appVersion: 0.9.163 - created: "2021-10-20T14:27:23.510041+01:00" + created: "2021-12-06T18:32:46.47183+01:00" dependencies: - condition: services.couchdb.enabled name: couchdb @@ -81,7 +107,7 @@ entries: version: 0.2.0 - apiVersion: v2 appVersion: 0.9.56 - created: "2021-10-20T14:27:23.504543+01:00" + created: "2021-12-06T18:32:46.468237+01:00" dependencies: - condition: services.couchdb.enabled name: couchdb @@ -106,7 +132,7 @@ entries: version: 0.1.1 - apiVersion: v2 appVersion: 0.9.56 - created: "2021-10-20T14:27:23.496847+01:00" + created: "2021-12-06T18:32:46.463312+01:00" dependencies: - condition: services.couchdb.enabled name: couchdb @@ -129,4 +155,4 @@ entries: urls: - https://budibase.github.io/budibase/budibase-0.1.0.tgz version: 0.1.0 -generated: "2021-10-20T14:27:23.491132+01:00" +generated: "2021-12-06T18:32:46.459076+01:00" diff --git a/hosting/kubernetes/budibase/Chart.yaml b/hosting/kubernetes/budibase/Chart.yaml index a8db638a7e..cc4bbaa5f5 100644 --- a/hosting/kubernetes/budibase/Chart.yaml +++ b/hosting/kubernetes/budibase/Chart.yaml @@ -28,7 +28,7 @@ version: 0.2.3 # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.1.6" +appVersion: "1.0.6" dependencies: - name: couchdb diff --git a/scripts/index.yaml b/scripts/index.yaml deleted file mode 100644 index 2990f842ce..0000000000 --- a/scripts/index.yaml +++ /dev/null @@ -1,30 +0,0 @@ -apiVersion: v1 -entries: - budibase: - - apiVersion: v2 - appVersion: 0.1.6 - created: "2021-12-06T17:18:57.819135+01:00" - dependencies: - - condition: services.couchdb.enabled - name: couchdb - repository: https://apache.github.io/couchdb-helm - version: 3.3.4 - - condition: ingress.nginx - name: ingress-nginx - repository: https://github.com/kubernetes/ingress-nginx - version: 3.35.0 - description: Budibase is an open source low-code platform, helping thousands of teams build apps for their workplace in minutes. - digest: 5bd6418e9a78bf4d8df6de077d4392a647ea30324e33cae38da480e162af3c22 - keywords: - - low-code - - database - - cluster - name: budibase - sources: - - https://github.com/Budibase/budibase - - https://budibase.com - type: application - urls: - - https://budibase.github.io/budibase/budibase-0.2.3.tgz - version: 0.2.3 -generated: "2021-12-06T17:18:57.814315+01:00" From 1d0b08905f496e8db613194f4c2dc8dc9fb2ef98 Mon Sep 17 00:00:00 2001 From: Martin McKeaveney Date: Wed, 8 Dec 2021 08:27:04 +0000 Subject: [PATCH 12/15] adding image tag to worker and app services --- .../kubernetes/budibase/templates/app-service-deployment.yaml | 2 +- .../budibase/templates/worker-service-deployment.yaml | 2 +- hosting/kubernetes/budibase/values.yaml | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/hosting/kubernetes/budibase/templates/app-service-deployment.yaml b/hosting/kubernetes/budibase/templates/app-service-deployment.yaml index 7c62ada63f..949a8f6286 100644 --- a/hosting/kubernetes/budibase/templates/app-service-deployment.yaml +++ b/hosting/kubernetes/budibase/templates/app-service-deployment.yaml @@ -110,7 +110,7 @@ spec: value: {{ .Values.globals.accountPortalApiKey | quote }} - name: COOKIE_DOMAIN value: {{ .Values.globals.cookieDomain | quote }} - image: budibase/apps + image: budibase/apps:{{ .Values.services.budibaseVersion }} imagePullPolicy: Always name: bbapps ports: diff --git a/hosting/kubernetes/budibase/templates/worker-service-deployment.yaml b/hosting/kubernetes/budibase/templates/worker-service-deployment.yaml index 6cded8545f..858587be1c 100644 --- a/hosting/kubernetes/budibase/templates/worker-service-deployment.yaml +++ b/hosting/kubernetes/budibase/templates/worker-service-deployment.yaml @@ -115,7 +115,7 @@ spec: value: {{ .Values.globals.smtp.from | quote }} - name: APPS_URL value: http://app-service:{{ .Values.services.apps.port }} - image: budibase/worker + image: budibase/worker:{{ .Values.services.budibaseVersion }} imagePullPolicy: Always name: bbworker ports: diff --git a/hosting/kubernetes/budibase/values.yaml b/hosting/kubernetes/budibase/values.yaml index ec3629e094..fe48a7b7e0 100644 --- a/hosting/kubernetes/budibase/values.yaml +++ b/hosting/kubernetes/budibase/values.yaml @@ -2,8 +2,6 @@ # This is a YAML-formatted file. # Declare variables to be passed into your templates. -replicaCount: 1 - image: pullPolicy: IfNotPresent # Overrides the image tag whose default is the chart appVersion. @@ -109,6 +107,7 @@ globals: enabled: false services: + budibaseVersion: latest dns: cluster.local proxy: From 6f7926015a83b720382a20da151075a069c3f783 Mon Sep 17 00:00:00 2001 From: Martin McKeaveney Date: Wed, 8 Dec 2021 13:19:43 +0000 Subject: [PATCH 13/15] ensure that dry runs between budibase-infra and standard templates match --- .../templates/app-service-deployment.yaml | 6 +-- .../budibase/templates/couchdb-backup.yaml | 43 +++++++++++++++++++ .../templates/worker-service-deployment.yaml | 6 +-- hosting/kubernetes/budibase/values.yaml | 8 +++- 4 files changed, 52 insertions(+), 11 deletions(-) create mode 100644 hosting/kubernetes/budibase/templates/couchdb-backup.yaml diff --git a/hosting/kubernetes/budibase/templates/app-service-deployment.yaml b/hosting/kubernetes/budibase/templates/app-service-deployment.yaml index 949a8f6286..5e45474c8a 100644 --- a/hosting/kubernetes/budibase/templates/app-service-deployment.yaml +++ b/hosting/kubernetes/budibase/templates/app-service-deployment.yaml @@ -73,17 +73,13 @@ spec: name: {{ template "budibase.fullname" . }} key: objectStoreSecret - name: MINIO_URL - {{ if .Values.services.objectStore.url }} value: {{ .Values.services.objectStore.url }} - {{ else }} - value: http://minio-service:{{ .Values.services.objectStore.port }} - {{ end }} - name: PORT value: {{ .Values.services.apps.port | quote }} - name: MULTI_TENANCY value: {{ .Values.globals.multiTenancy | quote }} - name: LOG_LEVEL - value: {{ .Values.services.apps.logLevel | quote }} + value: {{ default "info" .Values.services.apps.logLevel | quote }} - name: REDIS_PASSWORD value: {{ .Values.services.redis.password }} - name: REDIS_URL diff --git a/hosting/kubernetes/budibase/templates/couchdb-backup.yaml b/hosting/kubernetes/budibase/templates/couchdb-backup.yaml new file mode 100644 index 0000000000..8d9c368864 --- /dev/null +++ b/hosting/kubernetes/budibase/templates/couchdb-backup.yaml @@ -0,0 +1,43 @@ +{{- if .Values.services.couchdb.backup.enabled }} +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + kompose.cmd: kompose convert + kompose.version: 1.21.0 (992df58d8) + creationTimestamp: null + labels: + app.kubernetes.io/name: couchdb-backup + name: couchdb-backup +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: couchdb-backup + strategy: + type: Recreate + template: + metadata: + annotations: + kompose.cmd: kompose convert + kompose.version: 1.21.0 (992df58d8) + creationTimestamp: null + labels: + app.kubernetes.io/name: couchdb-backup + spec: + containers: + - env: + - name: SOURCE + value: {{ .Values.services.couchdb.url }} + - name: TARGET + value: {{ .Values.services.couchdb.backup.target }} + - name: RUN_EVERY_SECS + value: {{ .Values.services.couchdb.backup.interval }} + - name: VERBOSE + value: "true" + image: redgeoff/replicate-couchdb-cluster + imagePullPolicy: Always + name: couchdb-backup + resources: {} +status: {} +{{- end }} diff --git a/hosting/kubernetes/budibase/templates/worker-service-deployment.yaml b/hosting/kubernetes/budibase/templates/worker-service-deployment.yaml index 858587be1c..70249123d0 100644 --- a/hosting/kubernetes/budibase/templates/worker-service-deployment.yaml +++ b/hosting/kubernetes/budibase/templates/worker-service-deployment.yaml @@ -70,17 +70,13 @@ spec: name: {{ template "budibase.fullname" . }} key: objectStoreSecret - name: MINIO_URL - {{ if .Values.services.objectStore.url }} value: {{ .Values.services.objectStore.url }} - {{ else }} - value: http://minio-service:{{ .Values.services.objectStore.port }} - {{ end }} - name: PORT value: {{ .Values.services.worker.port | quote }} - name: MULTI_TENANCY value: {{ .Values.globals.multiTenancy | quote }} - name: LOG_LEVEL - value: {{ .Values.services.worker.logLevel | quote }} + value: {{ default "info" .Values.services.worker.logLevel | quote }} - name: REDIS_PASSWORD value: {{ .Values.services.redis.password | quote }} - name: REDIS_URL diff --git a/hosting/kubernetes/budibase/values.yaml b/hosting/kubernetes/budibase/values.yaml index fe48a7b7e0..24197383e2 100644 --- a/hosting/kubernetes/budibase/values.yaml +++ b/hosting/kubernetes/budibase/values.yaml @@ -129,6 +129,12 @@ services: # user: "" # only change if pointing to existing couch server # password: "" # only change if pointing to existing couch server port: 5984 + backup: + enabled: false + # target couchDB instance to back up to + target: "" + # backup interval in seconds + interval: "" redis: enabled: true # disable if using external redis @@ -146,7 +152,7 @@ services: accessKey: "" # AWS_ACCESS_KEY if using S3 or existing minio access key secretKey: "" # AWS_SECRET_ACCESS_KEY if using S3 or existing minio secret region: "" # AWS_REGION if using S3 or existing minio secret - url: "" # only change if pointing to existing minio cluster and minio: false + url: "http://minio-service:9000" # only change if pointing to existing minio cluster or S3 and minio: false storage: 100Mi # Override values in couchDB subchart From 7ff93e975a90d7da0bed6665d057663ef332fada Mon Sep 17 00:00:00 2001 From: Martin McKeaveney Date: Wed, 8 Dec 2021 16:27:33 +0000 Subject: [PATCH 14/15] completely automate helm chart incrementing and semver --- .github/workflows/release-selfhost.yml | 1 + docs/budibase-0.2.3.tgz | Bin 43033 -> 0 bytes docs/index.yaml | 22 +++++----- hosting/kubernetes/budibase/Chart.yaml | 39 +++++------------- .../templates/app-service-deployment.yaml | 2 +- .../templates/worker-service-deployment.yaml | 2 +- package.json | 3 +- scripts/releaseHelmChart.js | 39 ++++++++++++++++++ scripts/release_helm_chart.sh | 3 -- yarn.lock | 12 ++++++ 10 files changed, 78 insertions(+), 45 deletions(-) delete mode 100644 docs/budibase-0.2.3.tgz create mode 100755 scripts/releaseHelmChart.js delete mode 100755 scripts/release_helm_chart.sh diff --git a/.github/workflows/release-selfhost.yml b/.github/workflows/release-selfhost.yml index ad0941709c..444071fa7b 100644 --- a/.github/workflows/release-selfhost.yml +++ b/.github/workflows/release-selfhost.yml @@ -53,5 +53,6 @@ jobs: uses: helm/chart-releaser-action@v1.1.0 with: charts_dir: docs + branch: helm-repo env: CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}" diff --git a/docs/budibase-0.2.3.tgz b/docs/budibase-0.2.3.tgz deleted file mode 100644 index b7207376a131ead28492f3a9f6330788396b7ee2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43033 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 + Budibase is an open source low-code platform, helping thousands of teams build + apps for their workplace in minutes. keywords: -- low-code -- database -- cluster + - low-code + - database + - cluster sources: -- https://github.com/Budibase/budibase -- https://budibase.com - -# A chart can be either an 'application' or a 'library' chart. -# -# Application charts are a collection of templates that can be packaged into versioned archives -# to be deployed. -# -# Library charts provide useful utilities or functions for the chart developer. They're included as -# a dependency of application charts to inject those utilities and functions into the rendering -# pipeline. Library charts do not define any templates and therefore cannot be deployed. + - https://github.com/Budibase/budibase + - https://budibase.com type: application - -# This is the chart version. This version number should be incremented each time you make changes -# to the chart and its templates, including the app version. -# Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.2.3 - -# This is the version number of the application being deployed. This version number should be -# incremented each time you make changes to the application. Versions are not expected to -# follow Semantic Versioning. They should reflect the version the application is using. -# It is recommended to use it with quotes. -appVersion: "1.0.6" - +version: 0.2.4 +appVersion: 2.0.0 dependencies: - name: couchdb version: 3.3.4 repository: https://apache.github.io/couchdb-helm condition: services.couchdb.enabled - name: ingress-nginx - version: 3.35.0 + version: 3.35.0 repository: https://github.com/kubernetes/ingress-nginx condition: ingress.nginx diff --git a/hosting/kubernetes/budibase/templates/app-service-deployment.yaml b/hosting/kubernetes/budibase/templates/app-service-deployment.yaml index 5e45474c8a..e75f84e779 100644 --- a/hosting/kubernetes/budibase/templates/app-service-deployment.yaml +++ b/hosting/kubernetes/budibase/templates/app-service-deployment.yaml @@ -106,7 +106,7 @@ spec: value: {{ .Values.globals.accountPortalApiKey | quote }} - name: COOKIE_DOMAIN value: {{ .Values.globals.cookieDomain | quote }} - image: budibase/apps:{{ .Values.services.budibaseVersion }} + image: budibase/apps:{{ .Chart.appVersion }} imagePullPolicy: Always name: bbapps ports: diff --git a/hosting/kubernetes/budibase/templates/worker-service-deployment.yaml b/hosting/kubernetes/budibase/templates/worker-service-deployment.yaml index 70249123d0..d71fc80578 100644 --- a/hosting/kubernetes/budibase/templates/worker-service-deployment.yaml +++ b/hosting/kubernetes/budibase/templates/worker-service-deployment.yaml @@ -111,7 +111,7 @@ spec: value: {{ .Values.globals.smtp.from | quote }} - name: APPS_URL value: http://app-service:{{ .Values.services.apps.port }} - image: budibase/worker:{{ .Values.services.budibaseVersion }} + image: budibase/worker:{{ .Chart.appVersion }} imagePullPolicy: Always name: bbworker ports: diff --git a/package.json b/package.json index 4be3fe1401..63de8251d4 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "eslint-plugin-cypress": "^2.11.3", "eslint-plugin-svelte3": "^3.2.0", "husky": "^7.0.1", + "js-yaml": "^4.1.0", "kill-port": "^1.6.1", "lerna": "3.14.1", "prettier": "^2.3.1", @@ -49,7 +50,7 @@ "build:docker:airgap": "node hosting/scripts/airgapped/airgappedDockerBuild", "build:digitalocean": "cd hosting/digitalocean && ./build.sh && cd -", "build:docs": "lerna run build:docs", - "release:helm": "./scripts/release_helm_chart.sh", + "release:helm": "node scripts/releaseHelmChart", "env:multi:enable": "lerna run env:multi:enable", "env:multi:disable": "lerna run env:multi:disable", "env:selfhost:enable": "lerna run env:selfhost:enable", diff --git a/scripts/releaseHelmChart.js b/scripts/releaseHelmChart.js new file mode 100755 index 0000000000..4c022c9a0c --- /dev/null +++ b/scripts/releaseHelmChart.js @@ -0,0 +1,39 @@ +const yaml = require("js-yaml") +const { execSync } = require("child_process") +const fs = require("fs") +const path = require("path") + +const UpgradeTypes = { + MAJOR: "major", + MINOR: "minor", + PATCH: "patch" +} + +const CHART_PATH = path.join(__dirname, "../", "hosting", "kubernetes", "budibase", "Chart.yaml") +const UPGRADE_VERSION = process.env.BUDIBASE_RELEASE_VERSION +const UPGRADE_TYPE = process.env.HELM_CHART_UPGRADE_TYPE || UpgradeTypes.PATCH + +if (!UPGRADE_VERSION) { + throw new Error("BUDIBASE_RELEASE_VERSION env var must be set.") +} + +try { + const chartFile = fs.readFileSync(CHART_PATH, "utf-8") + const chart = yaml.load(chartFile) + + // Upgrade app version in chart to match budibase release version + chart.appVersion = UPGRADE_VERSION + + // semantically version the chart + const [major, minor, patch] = chart.version.split(".") + const newPatch = parseInt(patch) + 1 + chart.version = [major, minor, newPatch].join(".") + const updatedChartYaml = yaml.dump(chart) + fs.writeFileSync(CHART_PATH, updatedChartYaml) + + execSync(`helm package hosting/kubernetes/budibase --destination docs`) + execSync(`helm repo index docs --url https://budibase.github.io/budibase`) +} catch (err) { + console.error("Error releasing helm chart") + throw err +} diff --git a/scripts/release_helm_chart.sh b/scripts/release_helm_chart.sh deleted file mode 100755 index b1594cca91..0000000000 --- a/scripts/release_helm_chart.sh +++ /dev/null @@ -1,3 +0,0 @@ -cd docs -helm package ../hosting/kubernetes/budibase -helm repo index . --url https://budibase.github.io/budibase \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index aa02ce87f5..628e48bd0c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1082,6 +1082,11 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -3260,6 +3265,13 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" From 5a614f33c380db09ee9790ea536a4e2c5f0b1962 Mon Sep 17 00:00:00 2001 From: Martin McKeaveney Date: Wed, 8 Dec 2021 17:13:00 +0000 Subject: [PATCH 15/15] CI Automation for helm chart release --- .github/workflows/release-selfhost.yml | 6 +++++- .github/workflows/release.yml | 2 ++ docs/index.yaml | 2 +- hosting/kubernetes/budibase/Chart.yaml | 2 +- scripts/releaseHelmChart.js | 2 +- 5 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release-selfhost.yml b/.github/workflows/release-selfhost.yml index 444071fa7b..1c1806a0ef 100644 --- a/.github/workflows/release-selfhost.yml +++ b/.github/workflows/release-selfhost.yml @@ -43,10 +43,14 @@ jobs: DOCKER_PASSWORD: ${{ secrets.DOCKER_API_KEY }} BUDIBASE_RELEASE_VERSION: ${{ steps.previoustag.outputs.tag }} + - name: Configure Git + run: | + git config user.name "Budibase Production Bot" + git config user.email "<>" + - uses: azure/setup-helm@v1 id: install - # So, we need to inject the values into this - run: yarn release:helm - name: Run chart-releaser diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 71432c2403..d4142f7ac9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -56,3 +56,5 @@ jobs: DOCKER_USER: ${{ secrets.DOCKER_USERNAME }} DOCKER_PASSWORD: ${{ secrets.DOCKER_API_KEY }} BUDIBASE_RELEASE_VERSION: ${{ steps.previoustag.outputs.tag }} + + # Release to pre-prod environment \ No newline at end of file diff --git a/docs/index.yaml b/docs/index.yaml index 21586652f6..232f3445f9 100644 --- a/docs/index.yaml +++ b/docs/index.yaml @@ -2,7 +2,7 @@ apiVersion: v1 entries: budibase: - apiVersion: v2 - appVersion: 2.0.0 + appVersion: 1.0.6 created: "2021-12-08T16:26:47.061065Z" dependencies: - condition: services.couchdb.enabled diff --git a/hosting/kubernetes/budibase/Chart.yaml b/hosting/kubernetes/budibase/Chart.yaml index 790c7845d8..0528e56562 100644 --- a/hosting/kubernetes/budibase/Chart.yaml +++ b/hosting/kubernetes/budibase/Chart.yaml @@ -12,7 +12,7 @@ sources: - https://budibase.com type: application version: 0.2.4 -appVersion: 2.0.0 +appVersion: 1.0.6 dependencies: - name: couchdb version: 3.3.4 diff --git a/scripts/releaseHelmChart.js b/scripts/releaseHelmChart.js index 4c022c9a0c..9c62f3dd8f 100755 --- a/scripts/releaseHelmChart.js +++ b/scripts/releaseHelmChart.js @@ -31,8 +31,8 @@ try { const updatedChartYaml = yaml.dump(chart) fs.writeFileSync(CHART_PATH, updatedChartYaml) + // package the chart and write to docs dir execSync(`helm package hosting/kubernetes/budibase --destination docs`) - execSync(`helm repo index docs --url https://budibase.github.io/budibase`) } catch (err) { console.error("Error releasing helm chart") throw err