Merge branch 'develop' of github.com:Budibase/budibase into cheeks-lab-day-devtools
This commit is contained in:
commit
66715b8290
|
@ -4,4 +4,6 @@ dist
|
||||||
packages/server/builder
|
packages/server/builder
|
||||||
packages/server/coverage
|
packages/server/coverage
|
||||||
packages/server/client
|
packages/server/client
|
||||||
packages/builder/.routify
|
packages/builder/.routify
|
||||||
|
packages/builder/cypress/support/queryLevelTransformerFunction.js
|
||||||
|
packages/builder/cypress/support/queryLevelTransformerFunctionWithData.js
|
|
@ -79,6 +79,8 @@ Component libraries are collections of components as well as the definition of t
|
||||||
### Getting Started For Contributors
|
### Getting Started For Contributors
|
||||||
#### 1. Prerequisites
|
#### 1. Prerequisites
|
||||||
|
|
||||||
|
NodeJS Version `14.x.x`
|
||||||
|
|
||||||
*yarn -* `npm install -g yarn`
|
*yarn -* `npm install -g yarn`
|
||||||
|
|
||||||
*jest* - `npm install -g jest`
|
*jest* - `npm install -g jest`
|
||||||
|
@ -135,7 +137,7 @@ If you wish to delete all the apps created in development and reset the environm
|
||||||
|
|
||||||
### Backend
|
### Backend
|
||||||
|
|
||||||
For the backend we run [Redis](https://redis.io/), [CouchDB](https://couchdb.apache.org/), [MinIO](https://min.io/) and [Envoy](https://www.envoyproxy.io/) in Docker compose. This means that to develop Budibase you will need Docker and Docker compose installed. The backend services are then ran separately as Node services with nodemon so that they can be debugged outside of Docker.
|
For the backend we run [Redis](https://redis.io/), [CouchDB](https://couchdb.apache.org/), [MinIO](https://min.io/) and [NGINX](https://www.nginx.com/) in Docker compose. This means that to develop Budibase you will need Docker and Docker compose installed. The backend services are then ran separately as Node services with nodemon so that they can be debugged outside of Docker.
|
||||||
|
|
||||||
### Data Storage
|
### Data Storage
|
||||||
|
|
||||||
|
@ -177,36 +179,7 @@ To enable this mode, use:
|
||||||
yarn mode:account
|
yarn mode:account
|
||||||
```
|
```
|
||||||
### CI
|
### CI
|
||||||
|
An overview of the CI pipelines can be found [here](./workflows/README.md)
|
||||||
#### PR Job
|
|
||||||
|
|
||||||
After your pr is submitted a github action (can be found at `.github/workflows/budibase_ci.yml`) will run to perform some checks against the changes such as linting, build and test.
|
|
||||||
|
|
||||||
The job will run when changes are pushed to or targetted at `master` and `develop`
|
|
||||||
#### Release Develop
|
|
||||||
|
|
||||||
To test changes before a release, a prerelease action (can be found at `.github/workflows/release-develop.yml`) will run to build and release develop versions of npm packages and docker images. On each subsequent commit to develop a new alpha version of npm packages will be created and released.
|
|
||||||
|
|
||||||
For example:
|
|
||||||
|
|
||||||
- `feature1` -> `develop` = `v0.9.160-alpha.1`
|
|
||||||
- `feature2` -> `develop` = `v0.9.160-alpha.0`
|
|
||||||
|
|
||||||
The job will run when changes are pushed to `develop`
|
|
||||||
#### Release Job
|
|
||||||
|
|
||||||
To release changes a release job (can be found at `.github/workflows/release.yml`) will run to create final versions of npm packages and docker images.
|
|
||||||
|
|
||||||
Following the example above:
|
|
||||||
|
|
||||||
- `develop` -> `master` = `v0.9.160`
|
|
||||||
|
|
||||||
The job will run when changes are pushed to `master`
|
|
||||||
|
|
||||||
#### Release Self Host Job
|
|
||||||
|
|
||||||
To release the self hosted version of docker images, an additional job (can be found at `.github/workflows/release-selfhost.yml`) must be ran manually. This will releaae docker images to docker hub under the tag `latest` to be picked up by self hosted installations.
|
|
||||||
|
|
||||||
### Troubleshooting
|
### Troubleshooting
|
||||||
|
|
||||||
Sometimes, things go wrong. This can be due to incompatible updates on the budibase platform. To clear down your development environment and start again follow **Step 6. Cleanup**, then proceed from **Step 3. Install and Build** in the setup guide above. You should have a fresh Budibase installation.
|
Sometimes, things go wrong. This can be due to incompatible updates on the budibase platform. To clear down your development environment and start again follow **Step 6. Cleanup**, then proceed from **Step 3. Install and Build** in the setup guide above. You should have a fresh Budibase installation.
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
# Number of days of inactivity before an issue becomes stale
|
# Configuration for probot-stale - https://github.com/probot/stale
|
||||||
|
# Number of days of inactivity before an Issue or Pull Request becomes stale
|
||||||
daysUntilStale: 60
|
daysUntilStale: 60
|
||||||
# Number of days of inactivity before a stale issue is closed
|
# Number of days of inactivity before an Issue or Pull Request with the stale label is closed.
|
||||||
daysUntilClose: 7
|
# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale.
|
||||||
|
daysUntilClose: false
|
||||||
# Issues with these labels will never be considered stale
|
# Issues with these labels will never be considered stale
|
||||||
exemptLabels:
|
exemptLabels:
|
||||||
- pinned
|
- pinned
|
||||||
|
|
|
@ -0,0 +1,93 @@
|
||||||
|
|
||||||
|
# Budibase CI Pipelines
|
||||||
|
|
||||||
|
Welcome to the budibase CI pipelines directory. This document details what each of the CI pipelines are for, and come common combinations.
|
||||||
|
|
||||||
|
## All CI Pipelines
|
||||||
|
|
||||||
|
### Note
|
||||||
|
- When running workflow dispatch jobs, ensure you always run them off the `master` branch. It defaults to `develop`, so double check before running any jobs.
|
||||||
|
|
||||||
|
### Standard CI Build Job (budibase_ci.yml)
|
||||||
|
Triggers:
|
||||||
|
- PR or push to develop
|
||||||
|
- PR or push to master
|
||||||
|
|
||||||
|
The standard CI Build job is what runs when you raise a PR to develop or master.
|
||||||
|
- Installs all dependencies,
|
||||||
|
- builds the project
|
||||||
|
- run the unit tests
|
||||||
|
- Generate test coverage metrics with codecov
|
||||||
|
- Run the cypress tests
|
||||||
|
|
||||||
|
### Release Develop Job (release-develop.yml)
|
||||||
|
Triggers:
|
||||||
|
- Push to develop
|
||||||
|
|
||||||
|
The job responsible for building, tagging and pushing docker images out to the test and staging environments.
|
||||||
|
- Installs all dependencies
|
||||||
|
- builds the project
|
||||||
|
- run the unit tests
|
||||||
|
- publish the budibase JS packages under a prerelease tag to NPM
|
||||||
|
- build, tag and push docker images under the `develop` tag to docker hub
|
||||||
|
|
||||||
|
These images will then be pulled by the test and staging environments, updating the latest automatically. Discord notifications are sent to the #infra channel when this occurs.
|
||||||
|
|
||||||
|
### Release Job (release.yml)
|
||||||
|
Triggers:
|
||||||
|
- Push to master
|
||||||
|
|
||||||
|
This job is responsible for building and pushing the latest code to NPM and docker hub, so that it can be deployed.
|
||||||
|
- Installs all dependencies
|
||||||
|
- builds the project
|
||||||
|
- run the unit tests
|
||||||
|
- publish the budibase JS packages under a release tag to NPM (always incremented by patch versions)
|
||||||
|
- build, tag and push docker images under the `v.x.x.x` (the tag of the NPM release) tag to docker hub
|
||||||
|
|
||||||
|
### Release Selfhost Job (release-selfhost.yml)
|
||||||
|
Triggers:
|
||||||
|
- Manual Workflow Dispatch Trigger
|
||||||
|
|
||||||
|
This job is responsible for delivering the latest version of budibase to those that are self-hosting.
|
||||||
|
|
||||||
|
This job relies on the release job to have run first, so the latest image is pushed to dockerhub. This job then will pull the latest version from `lerna.json` and try to find an image in dockerhub corresponding to that version. For example, if the version in `lerna.json` is `1.0.0`:
|
||||||
|
- Pull the images for all budibase services tagged `v1.0.0` from dockerhub
|
||||||
|
- Tag these images as `latest`
|
||||||
|
- Push them back to dockerhub. This now means anyone who pulls `latest` (self hosters using docker-compose) will get the latest version.
|
||||||
|
- Build and release the budibase helm chart for kubernetes users
|
||||||
|
- Perform a github release with the latest version. You can see previous releases here (https://github.com/Budibase/budibase/releases)
|
||||||
|
|
||||||
|
|
||||||
|
### Cloud Deploy (deploy-cloud.yml)
|
||||||
|
Triggers:
|
||||||
|
- Manual Workflow Dispatch Trigger
|
||||||
|
|
||||||
|
This job is responsible for deploying to our production, cloud kubernetes environment. You must run the release job first, to ensure that the latest images have been built and pushed to docker hub. You can also manually enter a version number for this job, so you can perform rollbacks or upgrade to a specific version. After kicking off this job, the following will occur:
|
||||||
|
|
||||||
|
- Checks out the master branch
|
||||||
|
- Pulls the latest `values.yaml` from budibase infra, a private repo containing budibases infrastructure configuration
|
||||||
|
- Gets the latest budibase version from `lerna.json`, if it hasn't been specified in the workflow when you kicked it off
|
||||||
|
- Configures AWS Credentials
|
||||||
|
- Deploys the helm chart in the budibase repo to our production EKS cluster, injecting the `values.yaml` we pulled from budibase-infra
|
||||||
|
- Fires off a discord webhook in the #infra channel to show that the deployment completely successfully.
|
||||||
|
|
||||||
|
## Common Workflows
|
||||||
|
|
||||||
|
### Deploy Changes to Production (Release)
|
||||||
|
- Merge `develop` into `master`
|
||||||
|
- Wait for budibase CI job and release job to run
|
||||||
|
- Run cloud deploy job
|
||||||
|
- Run release selfhost job
|
||||||
|
|
||||||
|
### Deploy Changes to Production (Hotfix)
|
||||||
|
- Branch off `master`
|
||||||
|
- Perform your hotfix
|
||||||
|
- Merge back into `master`
|
||||||
|
- Wait for budibase CI job and release job to run
|
||||||
|
- Run cloud deploy job
|
||||||
|
- Run release selfhost job
|
||||||
|
|
||||||
|
### Rollback A Bad Cloud Deployment
|
||||||
|
- Kick off cloud deploy job
|
||||||
|
- Ensure you are running off master
|
||||||
|
- Enter the version number of the last known good version of budibase. For example `1.0.0`
|
|
@ -41,4 +41,10 @@ jobs:
|
||||||
files: ./packages/server/coverage/clover.xml
|
files: ./packages/server/coverage/clover.xml
|
||||||
name: codecov-umbrella
|
name: codecov-umbrella
|
||||||
verbose: true
|
verbose: true
|
||||||
- run: yarn test:e2e:ci
|
|
||||||
|
# TODO: parallelise this
|
||||||
|
- name: Cypress run
|
||||||
|
uses: cypress-io/github-action@v2
|
||||||
|
with:
|
||||||
|
install: false
|
||||||
|
command: yarn test:e2e:ci
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
name: Budibase Cloud Deploy
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
version:
|
||||||
|
description: Budibase release version. For example - 1.0.0
|
||||||
|
required: false
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
release:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Fail if branch is not master
|
||||||
|
if: github.ref != 'refs/heads/master'
|
||||||
|
run: |
|
||||||
|
echo "Ref is not master, you must run this job from master."
|
||||||
|
exit 1
|
||||||
|
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Pull values.yaml from budibase-infra
|
||||||
|
run: |
|
||||||
|
curl -H "Authorization: token ${{ secrets.GH_PERSONAL_TOKEN }}" \
|
||||||
|
-H 'Accept: application/vnd.github.v3.raw' \
|
||||||
|
-o values.production.yaml \
|
||||||
|
-L https://api.github.com/repos/budibase/budibase-infra/contents/kubernetes/values.yaml
|
||||||
|
wc -l values.production.yaml
|
||||||
|
|
||||||
|
- name: Get the latest budibase release version
|
||||||
|
id: version
|
||||||
|
run: |
|
||||||
|
if [ -z "${{ github.event.inputs.version }}" ]; then
|
||||||
|
release_version=$(cat lerna.json | jq -r '.version')
|
||||||
|
else
|
||||||
|
release_version=${{ github.event.inputs.version }}
|
||||||
|
fi
|
||||||
|
echo "RELEASE_VERSION=$release_version" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Configure AWS Credentials
|
||||||
|
uses: aws-actions/configure-aws-credentials@v1
|
||||||
|
with:
|
||||||
|
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||||
|
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||||
|
aws-region: eu-west-1
|
||||||
|
|
||||||
|
- name: Deploy to EKS
|
||||||
|
uses: craftech-io/eks-helm-deploy-action@v1
|
||||||
|
with:
|
||||||
|
aws-access-key-id: ${{ secrets.AWS_ACCESS__KEY_ID }}
|
||||||
|
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||||
|
aws-region: eu-west-1
|
||||||
|
cluster-name: budibase-eks-production
|
||||||
|
config-files: values.production.yaml
|
||||||
|
chart-path: charts/budibase
|
||||||
|
namespace: budibase
|
||||||
|
values: globals.appVersion=v${{ env.RELEASE_VERSION }}
|
||||||
|
name: budibase-prod
|
||||||
|
|
||||||
|
- name: Discord Webhook Action
|
||||||
|
uses: tsickert/discord-webhook@v4.0.0
|
||||||
|
with:
|
||||||
|
webhook-url: ${{ secrets.PROD_DEPLOY_WEBHOOK_URL }}
|
||||||
|
content: "Production Deployment Complete: ${{ env.RELEASE_VERSION }} deployed to Budibase Cloud."
|
||||||
|
embed-title: ${{ env.RELEASE_VERSION }}
|
||||||
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
name: Budibase Release Preprod
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
env:
|
||||||
|
POSTHOG_TOKEN: ${{ secrets.POSTHOG_TOKEN }}
|
||||||
|
INTERCOM_TOKEN: ${{ secrets.INTERCOM_TOKEN }}
|
||||||
|
POSTHOG_URL: ${{ secrets.POSTHOG_URL }}
|
||||||
|
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
release:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Configure AWS Credentials
|
||||||
|
uses: aws-actions/configure-aws-credentials@v1
|
||||||
|
with:
|
||||||
|
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||||
|
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||||
|
aws-region: eu-west-1
|
||||||
|
|
||||||
|
- name: Get the latest budibase release version
|
||||||
|
id: version
|
||||||
|
run: |
|
||||||
|
release_version=$(cat lerna.json | jq -r '.version')
|
||||||
|
echo "RELEASE_VERSION=$release_version" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Pull values.yaml from budibase-infra
|
||||||
|
run: |
|
||||||
|
curl -H "Authorization: token ${{ secrets.GH_PERSONAL_TOKEN }}" \
|
||||||
|
-H 'Accept: application/vnd.github.v3.raw' \
|
||||||
|
-o values.preprod.yaml \
|
||||||
|
-L https://api.github.com/repos/budibase/budibase-infra/contents/kubernetes/budibase-preprod/values.yaml
|
||||||
|
wc -l values.preprod.yaml
|
||||||
|
|
||||||
|
- name: Deploy to Preprod Environment
|
||||||
|
uses: glopezep/helm@v1.7.1
|
||||||
|
with:
|
||||||
|
release: budibase-preprod
|
||||||
|
namespace: budibase
|
||||||
|
chart: charts/budibase
|
||||||
|
token: ${{ github.token }}
|
||||||
|
helm: helm3
|
||||||
|
values: |
|
||||||
|
globals:
|
||||||
|
appVersion: v${{ env.RELEASE_VERSION }}
|
||||||
|
ingress:
|
||||||
|
enabled: true
|
||||||
|
nginx: true
|
||||||
|
value-files: >-
|
||||||
|
[
|
||||||
|
"values.preprod.yaml"
|
||||||
|
]
|
||||||
|
env:
|
||||||
|
KUBECONFIG_FILE: '${{ secrets.PREPROD_KUBECONFIG }}'
|
||||||
|
|
||||||
|
- name: Discord Webhook Action
|
||||||
|
uses: tsickert/discord-webhook@v4.0.0
|
||||||
|
with:
|
||||||
|
webhook-url: ${{ secrets.PROD_DEPLOY_WEBHOOK_URL }}
|
||||||
|
content: "Preprod Deployment Complete: ${{ env.RELEASE_VERSION }} deployed to Budibase Pre-prod."
|
||||||
|
embed-title: ${{ env.RELEASE_VERSION }}
|
|
@ -4,6 +4,16 @@ on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- develop
|
- develop
|
||||||
|
paths:
|
||||||
|
- '.aws/**'
|
||||||
|
- '.github/**'
|
||||||
|
- 'charts/**'
|
||||||
|
- 'packages/**'
|
||||||
|
- 'scripts/**'
|
||||||
|
- 'package.json'
|
||||||
|
- 'yarn.lock'
|
||||||
|
- 'package.json'
|
||||||
|
- 'yarn.lock'
|
||||||
|
|
||||||
env:
|
env:
|
||||||
POSTHOG_TOKEN: ${{ secrets.POSTHOG_TOKEN }}
|
POSTHOG_TOKEN: ${{ secrets.POSTHOG_TOKEN }}
|
||||||
|
|
|
@ -3,53 +3,77 @@ name: Budibase Release Selfhost
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
env:
|
|
||||||
POSTHOG_TOKEN: ${{ secrets.POSTHOG_TOKEN }}
|
|
||||||
INTERCOM_TOKEN: ${{ secrets.INTERCOM_TOKEN }}
|
|
||||||
POSTHOG_URL: ${{ secrets.POSTHOG_URL }}
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
release:
|
release:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- uses: actions/setup-node@v1
|
with:
|
||||||
with:
|
|
||||||
node-version: 14.x
|
node-version: 14.x
|
||||||
- run: yarn
|
fetch_depth: 0
|
||||||
- run: yarn bootstrap
|
|
||||||
|
|
||||||
- name: Configure AWS Credentials
|
- name: Tag and release Docker images (Self Host)
|
||||||
uses: aws-actions/configure-aws-credentials@v1
|
|
||||||
with:
|
|
||||||
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
|
||||||
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
|
||||||
aws-region: eu-west-1
|
|
||||||
|
|
||||||
- name: 'Get Previous tag'
|
|
||||||
id: previoustag
|
|
||||||
uses: "WyriHaximus/github-action-get-previous-tag@v1"
|
|
||||||
|
|
||||||
- name: Build/release Docker images (Self Host)
|
|
||||||
run: |
|
run: |
|
||||||
docker login -u $DOCKER_USER -p $DOCKER_PASSWORD
|
docker login -u $DOCKER_USER -p $DOCKER_PASSWORD
|
||||||
yarn build
|
|
||||||
yarn build:docker:selfhost
|
# Get latest release version
|
||||||
|
release_version=$(cat lerna.json | jq -r '.version')
|
||||||
|
echo "RELEASE_VERSION=$release_version" >> $GITHUB_ENV
|
||||||
|
release_tag=v$release_version
|
||||||
|
|
||||||
|
# Pull apps and worker images
|
||||||
|
docker pull budibase/apps:$release_tag
|
||||||
|
docker pull budibase/worker:$release_tag
|
||||||
|
docker pull budibase/proxy:$release_tag
|
||||||
|
|
||||||
|
# Tag apps and worker images
|
||||||
|
docker tag budibase/apps:$release_tag budibase/apps:$SELFHOST_TAG
|
||||||
|
docker tag budibase/worker:$release_tag budibase/worker:$SELFHOST_TAG
|
||||||
|
docker tag budibase/proxy:$release_tag budibase/proxy:$SELFHOST_TAG
|
||||||
|
|
||||||
|
# Push images
|
||||||
|
docker push budibase/apps:$SELFHOST_TAG
|
||||||
|
docker push budibase/worker:$SELFHOST_TAG
|
||||||
|
docker push budibase/proxy:$SELFHOST_TAG
|
||||||
env:
|
env:
|
||||||
DOCKER_USER: ${{ secrets.DOCKER_USERNAME }}
|
DOCKER_USER: ${{ secrets.DOCKER_USERNAME }}
|
||||||
DOCKER_PASSWORD: ${{ secrets.DOCKER_API_KEY }}
|
DOCKER_PASSWORD: ${{ secrets.DOCKER_API_KEY }}
|
||||||
BUDIBASE_RELEASE_VERSION: ${{ steps.previoustag.outputs.tag }}
|
SELFHOST_TAG: latest
|
||||||
|
|
||||||
- uses: azure/setup-helm@v1
|
- name: Build CLI executables
|
||||||
id: install
|
run: |
|
||||||
|
pushd packages/cli
|
||||||
|
yarn
|
||||||
|
yarn build
|
||||||
|
popd
|
||||||
|
|
||||||
|
- name: Setup Helm
|
||||||
|
uses: azure/setup-helm@v1
|
||||||
|
id: helm-install
|
||||||
|
|
||||||
# So, we need to inject the values into this
|
- name: Build and release helm chart
|
||||||
- run: yarn release:helm
|
run: |
|
||||||
|
git config user.name "Budibase Helm Bot"
|
||||||
- name: Run chart-releaser
|
git config user.email "<>"
|
||||||
uses: helm/chart-releaser-action@v1.1.0
|
git pull
|
||||||
with:
|
helm package charts/budibase
|
||||||
charts_dir: docs
|
git checkout gh-pages
|
||||||
|
mv *.tgz docs
|
||||||
|
helm repo index docs
|
||||||
|
git add -A
|
||||||
|
git commit -m "Helm Release: ${{ env.RELEASE_VERSION }}"
|
||||||
|
git push
|
||||||
env:
|
env:
|
||||||
CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Perform Github Release
|
||||||
|
uses: softprops/action-gh-release@v1
|
||||||
|
with:
|
||||||
|
name: v${{ env.RELEASE_VERSION }}
|
||||||
|
tag_name: v${{ env.RELEASE_VERSION }}
|
||||||
|
generate_release_notes: true
|
||||||
|
files: |
|
||||||
|
packages/cli/build/cli-win.exe
|
||||||
|
packages/cli/build/cli-linux
|
||||||
|
packages/cli/build/cli-macos
|
||||||
|
|
|
@ -4,6 +4,16 @@ on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- master
|
- master
|
||||||
|
paths:
|
||||||
|
- '.aws/**'
|
||||||
|
- '.github/**'
|
||||||
|
- 'charts/**'
|
||||||
|
- 'packages/**'
|
||||||
|
- 'scripts/**'
|
||||||
|
- 'package.json'
|
||||||
|
- 'yarn.lock'
|
||||||
|
- 'package.json'
|
||||||
|
- 'yarn.lock'
|
||||||
|
|
||||||
env:
|
env:
|
||||||
POSTHOG_TOKEN: ${{ secrets.POSTHOG_TOKEN }}
|
POSTHOG_TOKEN: ${{ secrets.POSTHOG_TOKEN }}
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
name: Budibase Smoke Test
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
release:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: Use Node.js 14.x
|
||||||
|
uses: actions/setup-node@v1
|
||||||
|
with:
|
||||||
|
node-version: 14.x
|
||||||
|
- run: yarn
|
||||||
|
- run: yarn bootstrap
|
||||||
|
- run: yarn build
|
||||||
|
- name: Pull cypress.env.yaml from budibase-infra
|
||||||
|
run: |
|
||||||
|
curl -H "Authorization: token ${{ secrets.GH_PERSONAL_TOKEN }}" \
|
||||||
|
-H 'Accept: application/vnd.github.v3.raw' \
|
||||||
|
-o packages/builder/cypress.env.json \
|
||||||
|
-L https://api.github.com/repos/budibase/budibase-infra/contents/test/cypress.env.json
|
||||||
|
wc -l packages/builder/cypress.env.json
|
||||||
|
- run: yarn test:e2e:ci
|
||||||
|
env:
|
||||||
|
CI: true
|
||||||
|
name: Budibase CI
|
||||||
|
|
||||||
|
# TODO: upload recordings to s3
|
||||||
|
# - name: Configure AWS Credentials
|
||||||
|
# uses: aws-actions/configure-aws-credentials@v1
|
||||||
|
# with:
|
||||||
|
# aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||||
|
# aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||||
|
# aws-region: eu-west-1
|
||||||
|
|
||||||
|
# TODO look at cypress reporters
|
||||||
|
# - name: Discord Webhook Action
|
||||||
|
# uses: tsickert/discord-webhook@v4.0.0
|
||||||
|
# with:
|
||||||
|
# webhook-url: ${{ secrets.PROD_DEPLOY_WEBHOOK_URL }}
|
||||||
|
# content: "Production Deployment Complete: ${{ env.RELEASE_VERSION }} deployed to Budibase Cloud."
|
||||||
|
# embed-title: ${{ env.RELEASE_VERSION }}
|
||||||
|
|
|
@ -64,7 +64,8 @@ typings/
|
||||||
# dotenv environment variables file
|
# dotenv environment variables file
|
||||||
.env
|
.env
|
||||||
!hosting/.env
|
!hosting/.env
|
||||||
hosting/.generated-envoy.dev.yaml
|
hosting/.generated-nginx.dev.conf
|
||||||
|
hosting/proxy/.generated-nginx.prod.conf
|
||||||
|
|
||||||
# parcel-bundler cache (https://parceljs.org/)
|
# parcel-bundler cache (https://parceljs.org/)
|
||||||
.cache
|
.cache
|
||||||
|
@ -93,3 +94,6 @@ hosting/.generated-envoy.dev.yaml
|
||||||
# Sublime text
|
# Sublime text
|
||||||
*.sublime-project
|
*.sublime-project
|
||||||
*.sublime-workspace
|
*.sublime-workspace
|
||||||
|
|
||||||
|
bin/
|
||||||
|
packages/builder/cypress.env.json
|
||||||
|
|
|
@ -6,4 +6,6 @@ packages/builder/src/components/design/AppPreview/CurrentItemPreview.svelte
|
||||||
packages/server/builder
|
packages/server/builder
|
||||||
packages/server/coverage
|
packages/server/coverage
|
||||||
packages/server/client
|
packages/server/client
|
||||||
packages/builder/.routify
|
packages/builder/.routify
|
||||||
|
packages/builder/cypress/support/queryLevelTransformerFunction.js
|
||||||
|
packages/builder/cypress/support/queryLevelTransformerFunctionWithData.js
|
11
README.md
11
README.md
|
@ -104,12 +104,14 @@ Budibase is made to scale. With Budibase, you can self-host on your own infrastr
|
||||||
|
|
||||||
## 🏁 Get started
|
## 🏁 Get started
|
||||||
|
|
||||||
<img src="https://res.cloudinary.com/daog6scxm/image/upload/v1634808888/logo/deploy_npl9za.png" />
|
<a href="https://docs.budibase.com/self-hosting/self-host"><img src="https://res.cloudinary.com/daog6scxm/image/upload/v1634808888/logo/deploy_npl9za.png" /></a>
|
||||||
|
|
||||||
Deploy Budibase self-Hosted in your existing infrastructure, using Docker, Kubernetes, and Digital Ocean.
|
Deploy Budibase self-hosted in your existing infrastructure, using Docker, Kubernetes, and Digital Ocean.
|
||||||
Or use Budibase Cloud if you don't need to self-host, and would like to get started quickly.
|
Or use Budibase Cloud if you don't need to self-host, and would like to get started quickly.
|
||||||
|
|
||||||
### [Get started with Budibase](https://budibase.com)
|
### [Get started with self-hosting Budibase](https://docs.budibase.com/self-hosting/self-host)
|
||||||
|
|
||||||
|
### [Get started with Budibase Cloud](https://budibase.com)
|
||||||
|
|
||||||
|
|
||||||
<br /><br />
|
<br /><br />
|
||||||
|
@ -201,9 +203,6 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
||||||
<td align="center"><a href="https://github.com/seoulaja"><img src="https://avatars.githubusercontent.com/u/15101654?v=4?s=100" width="100px;" alt=""/><br /><sub><b>seoulaja</b></sub></a><br /><a href="#translation-seoulaja" title="Translation">🌍</a></td>
|
<td align="center"><a href="https://github.com/seoulaja"><img src="https://avatars.githubusercontent.com/u/15101654?v=4?s=100" width="100px;" alt=""/><br /><sub><b>seoulaja</b></sub></a><br /><a href="#translation-seoulaja" title="Translation">🌍</a></td>
|
||||||
<td align="center"><a href="https://github.com/mslourens"><img src="https://avatars.githubusercontent.com/u/1907152?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Maurits Lourens</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=mslourens" title="Tests">⚠️</a> <a href="https://github.com/Budibase/budibase/commits?author=mslourens" title="Code">💻</a></td>
|
<td align="center"><a href="https://github.com/mslourens"><img src="https://avatars.githubusercontent.com/u/1907152?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Maurits Lourens</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=mslourens" title="Tests">⚠️</a> <a href="https://github.com/Budibase/budibase/commits?author=mslourens" title="Code">💻</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
|
||||||
<td align="center"><a href="https://github.com/Rory-Powell"><img src="https://avatars.githubusercontent.com/u/8755148?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Rory Powell</b></sub></a><br /><a href="#infra-Rory-Powell" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/Budibase/budibase/commits?author=Rory-Powell" title="Tests">⚠️</a> <a href="https://github.com/Budibase/budibase/commits?author=Rory-Powell" title="Code">💻</a></td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<!-- markdownlint-restore -->
|
<!-- markdownlint-restore -->
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
dependencies:
|
||||||
|
- name: couchdb
|
||||||
|
repository: https://apache.github.io/couchdb-helm
|
||||||
|
version: 3.3.4
|
||||||
|
- name: ingress-nginx
|
||||||
|
repository: https://kubernetes.github.io/ingress-nginx
|
||||||
|
version: 4.0.13
|
||||||
|
digest: sha256:20892705c2d8e64c98257d181063a514ac55013e2b43399a6e54868a97f97845
|
||||||
|
generated: "2021-12-30T18:55:30.878411Z"
|
|
@ -0,0 +1,24 @@
|
||||||
|
apiVersion: v2
|
||||||
|
name: budibase
|
||||||
|
description: >-
|
||||||
|
Budibase is an open source low-code platform, helping thousands of teams build
|
||||||
|
apps for their workplace in minutes.
|
||||||
|
keywords:
|
||||||
|
- low-code
|
||||||
|
- database
|
||||||
|
- cluster
|
||||||
|
sources:
|
||||||
|
- https://github.com/Budibase/budibase
|
||||||
|
- https://budibase.com
|
||||||
|
type: application
|
||||||
|
version: 0.2.8
|
||||||
|
appVersion: 1.0.48
|
||||||
|
dependencies:
|
||||||
|
- name: couchdb
|
||||||
|
version: 3.3.4
|
||||||
|
repository: https://apache.github.io/couchdb-helm
|
||||||
|
condition: services.couchdb.enabled
|
||||||
|
- name: ingress-nginx
|
||||||
|
version: 4.0.13
|
||||||
|
repository: https://kubernetes.github.io/ingress-nginx
|
||||||
|
condition: ingress.nginx
|
Binary file not shown.
Binary file not shown.
|
@ -73,17 +73,13 @@ spec:
|
||||||
name: {{ template "budibase.fullname" . }}
|
name: {{ template "budibase.fullname" . }}
|
||||||
key: objectStoreSecret
|
key: objectStoreSecret
|
||||||
- name: MINIO_URL
|
- name: MINIO_URL
|
||||||
{{ if .Values.services.objectStore.url }}
|
|
||||||
value: {{ .Values.services.objectStore.url }}
|
value: {{ .Values.services.objectStore.url }}
|
||||||
{{ else }}
|
|
||||||
value: http://minio-service:{{ .Values.services.objectStore.port }}
|
|
||||||
{{ end }}
|
|
||||||
- name: PORT
|
- name: PORT
|
||||||
value: {{ .Values.services.apps.port | quote }}
|
value: {{ .Values.services.apps.port | quote }}
|
||||||
- name: MULTI_TENANCY
|
- name: MULTI_TENANCY
|
||||||
value: {{ .Values.globals.multiTenancy | quote }}
|
value: {{ .Values.globals.multiTenancy | quote }}
|
||||||
- name: LOG_LEVEL
|
- name: LOG_LEVEL
|
||||||
value: {{ .Values.services.apps.logLevel | quote }}
|
value: {{ default "info" .Values.services.apps.logLevel | quote }}
|
||||||
- name: REDIS_PASSWORD
|
- name: REDIS_PASSWORD
|
||||||
value: {{ .Values.services.redis.password }}
|
value: {{ .Values.services.redis.password }}
|
||||||
- name: REDIS_URL
|
- name: REDIS_URL
|
||||||
|
@ -103,14 +99,18 @@ spec:
|
||||||
- name: PLATFORM_URL
|
- name: PLATFORM_URL
|
||||||
value: {{ .Values.globals.platformUrl | quote }}
|
value: {{ .Values.globals.platformUrl | quote }}
|
||||||
- name: USE_QUOTAS
|
- name: USE_QUOTAS
|
||||||
value: "1"
|
value: {{ .Values.globals.useQuotas | quote }}
|
||||||
|
- name: EXCLUDE_QUOTAS_TENANTS
|
||||||
|
value: {{ .Values.globals.excludeQuotasTenants | quote }}
|
||||||
- name: ACCOUNT_PORTAL_URL
|
- name: ACCOUNT_PORTAL_URL
|
||||||
value: {{ .Values.globals.accountPortalUrl | quote }}
|
value: {{ .Values.globals.accountPortalUrl | quote }}
|
||||||
- name: ACCOUNT_PORTAL_API_KEY
|
- name: ACCOUNT_PORTAL_API_KEY
|
||||||
value: {{ .Values.globals.accountPortalApiKey | quote }}
|
value: {{ .Values.globals.accountPortalApiKey | quote }}
|
||||||
- name: COOKIE_DOMAIN
|
- name: COOKIE_DOMAIN
|
||||||
value: {{ .Values.globals.cookieDomain | quote }}
|
value: {{ .Values.globals.cookieDomain | quote }}
|
||||||
image: budibase/apps
|
- name: HTTP_MIGRATIONS
|
||||||
|
value: {{ .Values.globals.httpMigrations | quote }}
|
||||||
|
image: budibase/apps:{{ .Values.globals.appVersion }}
|
||||||
imagePullPolicy: Always
|
imagePullPolicy: Always
|
||||||
name: bbapps
|
name: bbapps
|
||||||
ports:
|
ports:
|
|
@ -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 | quote }}
|
||||||
|
- name: RUN_EVERY_SECS
|
||||||
|
value: {{ .Values.services.couchdb.backup.interval | quote }}
|
||||||
|
- name: VERBOSE
|
||||||
|
value: "true"
|
||||||
|
image: redgeoff/replicate-couchdb-cluster
|
||||||
|
imagePullPolicy: Always
|
||||||
|
name: couchdb-backup
|
||||||
|
resources: {}
|
||||||
|
status: {}
|
||||||
|
{{- end }}
|
|
@ -25,7 +25,7 @@ spec:
|
||||||
app.kubernetes.io/name: budibase-proxy
|
app.kubernetes.io/name: budibase-proxy
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- image: budibase/proxy
|
- image: budibase/proxy:{{ .Values.services.proxy.tag | default "k8s" }}
|
||||||
imagePullPolicy: Always
|
imagePullPolicy: Always
|
||||||
name: proxy-service
|
name: proxy-service
|
||||||
ports:
|
ports:
|
|
@ -9,12 +9,11 @@ metadata:
|
||||||
app.kubernetes.io/name: budibase-proxy
|
app.kubernetes.io/name: budibase-proxy
|
||||||
name: proxy-service
|
name: proxy-service
|
||||||
spec:
|
spec:
|
||||||
type: NodePort
|
|
||||||
ports:
|
ports:
|
||||||
- port: {{ .Values.services.proxy.port }}
|
- name: {{ .Values.services.proxy.port | quote }}
|
||||||
|
port: {{ .Values.services.proxy.port }}
|
||||||
targetPort: {{ .Values.services.proxy.port }}
|
targetPort: {{ .Values.services.proxy.port }}
|
||||||
protocol: TCP
|
|
||||||
selector:
|
selector:
|
||||||
app.kubernetes.io/name: budibase-proxy
|
app.kubernetes.io/name: budibase-proxy
|
||||||
status:
|
status:
|
||||||
loadBalancer: {}
|
loadBalancer: {}
|
|
@ -70,17 +70,13 @@ spec:
|
||||||
name: {{ template "budibase.fullname" . }}
|
name: {{ template "budibase.fullname" . }}
|
||||||
key: objectStoreSecret
|
key: objectStoreSecret
|
||||||
- name: MINIO_URL
|
- name: MINIO_URL
|
||||||
{{ if .Values.services.objectStore.url }}
|
|
||||||
value: {{ .Values.services.objectStore.url }}
|
value: {{ .Values.services.objectStore.url }}
|
||||||
{{ else }}
|
|
||||||
value: http://minio-service:{{ .Values.services.objectStore.port }}
|
|
||||||
{{ end }}
|
|
||||||
- name: PORT
|
- name: PORT
|
||||||
value: {{ .Values.services.worker.port | quote }}
|
value: {{ .Values.services.worker.port | quote }}
|
||||||
- name: MULTI_TENANCY
|
- name: MULTI_TENANCY
|
||||||
value: {{ .Values.globals.multiTenancy | quote }}
|
value: {{ .Values.globals.multiTenancy | quote }}
|
||||||
- name: LOG_LEVEL
|
- name: LOG_LEVEL
|
||||||
value: {{ .Values.services.worker.logLevel | quote }}
|
value: {{ default "info" .Values.services.worker.logLevel | quote }}
|
||||||
- name: REDIS_PASSWORD
|
- name: REDIS_PASSWORD
|
||||||
value: {{ .Values.services.redis.password | quote }}
|
value: {{ .Values.services.redis.password | quote }}
|
||||||
- name: REDIS_URL
|
- name: REDIS_URL
|
||||||
|
@ -115,7 +111,11 @@ spec:
|
||||||
value: {{ .Values.globals.smtp.from | quote }}
|
value: {{ .Values.globals.smtp.from | quote }}
|
||||||
- name: APPS_URL
|
- name: APPS_URL
|
||||||
value: http://app-service:{{ .Values.services.apps.port }}
|
value: http://app-service:{{ .Values.services.apps.port }}
|
||||||
image: budibase/worker
|
- name: GOOGLE_CLIENT_ID
|
||||||
|
value: {{ .Values.globals.google.clientId | quote }}
|
||||||
|
- name: GOOGLE_CLIENT_SECRET
|
||||||
|
value: {{ .Values.globals.google.secret | quote }}
|
||||||
|
image: budibase/worker:{{ .Values.globals.appVersion }}
|
||||||
imagePullPolicy: Always
|
imagePullPolicy: Always
|
||||||
name: bbworker
|
name: bbworker
|
||||||
ports:
|
ports:
|
|
@ -0,0 +1,312 @@
|
||||||
|
# Default values for budibase.
|
||||||
|
# This is a YAML-formatted file.
|
||||||
|
# Declare variables to be passed into your templates.
|
||||||
|
|
||||||
|
image:
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
# Overrides the image tag whose default is the chart appVersion.
|
||||||
|
tag: ""
|
||||||
|
|
||||||
|
imagePullSecrets: []
|
||||||
|
nameOverride: ""
|
||||||
|
# fullnameOverride: ""
|
||||||
|
|
||||||
|
serviceAccount:
|
||||||
|
# Specifies whether a service account should be created
|
||||||
|
create: true
|
||||||
|
# Annotations to add to the service account
|
||||||
|
annotations: {}
|
||||||
|
# The name of the service account to use.
|
||||||
|
# If not set and create is true, a name is generated using the fullname template
|
||||||
|
name: ""
|
||||||
|
|
||||||
|
podAnnotations: {}
|
||||||
|
|
||||||
|
podSecurityContext:
|
||||||
|
{}
|
||||||
|
# fsGroup: 2000
|
||||||
|
|
||||||
|
securityContext:
|
||||||
|
{}
|
||||||
|
# capabilities:
|
||||||
|
# drop:
|
||||||
|
# - ALL
|
||||||
|
# readOnlyRootFilesystem: true
|
||||||
|
# runAsNonRoot: true
|
||||||
|
# runAsUser: 1000
|
||||||
|
|
||||||
|
service:
|
||||||
|
type: ClusterIP
|
||||||
|
port: 10000
|
||||||
|
|
||||||
|
ingress:
|
||||||
|
enabled: true
|
||||||
|
aws: false
|
||||||
|
nginx: true
|
||||||
|
certificateArn: ""
|
||||||
|
className: ""
|
||||||
|
annotations:
|
||||||
|
kubernetes.io/ingress.class: nginx
|
||||||
|
hosts:
|
||||||
|
- host: # change if using custom domain
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: proxy-service
|
||||||
|
port:
|
||||||
|
number: 10000
|
||||||
|
|
||||||
|
resources:
|
||||||
|
{}
|
||||||
|
# We usually recommend not to specify default resources and to leave this as a conscious
|
||||||
|
# choice for the user. This also increases chances charts run on environments with little
|
||||||
|
# resources, such as Minikube. If you do want to specify resources, uncomment the following
|
||||||
|
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
|
||||||
|
# limits:
|
||||||
|
# cpu: 100m
|
||||||
|
# memory: 128Mi
|
||||||
|
# requests:
|
||||||
|
# cpu: 100m
|
||||||
|
# memory: 128Mi
|
||||||
|
|
||||||
|
autoscaling:
|
||||||
|
enabled: false
|
||||||
|
minReplicas: 1
|
||||||
|
maxReplicas: 100
|
||||||
|
targetCPUUtilizationPercentage: 80
|
||||||
|
# targetMemoryUtilizationPercentage: 80
|
||||||
|
|
||||||
|
nodeSelector: {}
|
||||||
|
|
||||||
|
tolerations: []
|
||||||
|
|
||||||
|
affinity: {}
|
||||||
|
|
||||||
|
globals:
|
||||||
|
appVersion: "latest"
|
||||||
|
budibaseEnv: PRODUCTION
|
||||||
|
enableAnalytics: true
|
||||||
|
sentryDSN: ""
|
||||||
|
posthogToken: ""
|
||||||
|
logLevel: info
|
||||||
|
selfHosted: "1" # set to 0 for budibase cloud environment, set to 1 for self-hosted setup
|
||||||
|
multiTenancy: "0" # set to 0 to disable multiple orgs, set to 1 to enable multiple orgs
|
||||||
|
useQuotas: "0"
|
||||||
|
excludeQuotasTenants: "" # comma seperated list of tenants to exclude from quotas
|
||||||
|
accountPortalUrl: ""
|
||||||
|
accountPortalApiKey: ""
|
||||||
|
cookieDomain: ""
|
||||||
|
platformUrl: ""
|
||||||
|
httpMigrations: "0"
|
||||||
|
google:
|
||||||
|
clientId: ""
|
||||||
|
secret: ""
|
||||||
|
|
||||||
|
createSecrets: true # creates an internal API key, JWT secrets and redis password for you
|
||||||
|
|
||||||
|
# if createSecrets is set to false, you can hard-code your secrets here
|
||||||
|
internalApiKey: ""
|
||||||
|
jwtSecret: ""
|
||||||
|
|
||||||
|
smtp:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
services:
|
||||||
|
budibaseVersion: latest
|
||||||
|
dns: cluster.local
|
||||||
|
|
||||||
|
proxy:
|
||||||
|
port: 10000
|
||||||
|
replicaCount: 1
|
||||||
|
|
||||||
|
apps:
|
||||||
|
port: 4002
|
||||||
|
replicaCount: 1
|
||||||
|
logLevel: info
|
||||||
|
|
||||||
|
worker:
|
||||||
|
port: 4003
|
||||||
|
replicaCount: 1
|
||||||
|
|
||||||
|
couchdb:
|
||||||
|
enabled: true
|
||||||
|
# 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
|
||||||
|
backup:
|
||||||
|
enabled: false
|
||||||
|
# target couchDB instance to back up to
|
||||||
|
target: ""
|
||||||
|
# backup interval in seconds
|
||||||
|
interval: ""
|
||||||
|
|
||||||
|
redis:
|
||||||
|
enabled: true # disable if using external redis
|
||||||
|
port: 6379
|
||||||
|
replicaCount: 1
|
||||||
|
url: "" # only change if pointing to existing redis cluster and enabled: false
|
||||||
|
password: "budibase" # recommended to override if using built-in redis
|
||||||
|
storage: 100Mi
|
||||||
|
|
||||||
|
objectStore:
|
||||||
|
minio: true
|
||||||
|
browser: true
|
||||||
|
port: 9000
|
||||||
|
replicaCount: 1
|
||||||
|
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: "http://minio-service:9000" # only change if pointing to existing minio cluster or S3 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
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,9 +0,0 @@
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>Budibase Helm Chart Repo</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h1>Budibase Charts Repo</h1>
|
|
||||||
<p>Point Helm at this repo to see charts.</p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
132
docs/index.yaml
132
docs/index.yaml
|
@ -1,132 +0,0 @@
|
||||||
apiVersion: v1
|
|
||||||
entries:
|
|
||||||
budibase:
|
|
||||||
- apiVersion: v2
|
|
||||||
appVersion: 0.9.169
|
|
||||||
created: "2021-10-20T14:27:23.521358+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: 57f365d799fcaace4658883cb8ec961a7905383a68acf065af4f6e57f9878ff8
|
|
||||||
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.2.tgz
|
|
||||||
version: 0.2.2
|
|
||||||
- apiVersion: v2
|
|
||||||
appVersion: 0.9.163
|
|
||||||
created: "2021-10-20T14:27:23.5153+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: ebac6d8631cc38b266c3689508b5123f5afc395f23bdb02738be26c7cae0b0b5
|
|
||||||
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.1.tgz
|
|
||||||
version: 0.2.1
|
|
||||||
- apiVersion: v2
|
|
||||||
appVersion: 0.9.163
|
|
||||||
created: "2021-10-20T14:27:23.510041+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: f369536c0eac1f6959d51e8ce6d74a87a7a9df29ae84fb9cbed0a273ab77429b
|
|
||||||
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.0.tgz
|
|
||||||
version: 0.2.0
|
|
||||||
- apiVersion: v2
|
|
||||||
appVersion: 0.9.56
|
|
||||||
created: "2021-10-20T14:27:23.504543+01:00"
|
|
||||||
dependencies:
|
|
||||||
- condition: services.couchdb.enabled
|
|
||||||
name: couchdb
|
|
||||||
repository: https://apache.github.io/couchdb-helm
|
|
||||||
version: 3.3.4
|
|
||||||
- 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: 8dc4f2ed4d98cad5adf25936aefea680042d3e4e17832f846b961fd8708ad192
|
|
||||||
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.1.1.tgz
|
|
||||||
version: 0.1.1
|
|
||||||
- apiVersion: v2
|
|
||||||
appVersion: 0.9.56
|
|
||||||
created: "2021-10-20T14:27:23.496847+01:00"
|
|
||||||
dependencies:
|
|
||||||
- condition: services.couchdb.enabled
|
|
||||||
name: couchdb
|
|
||||||
repository: https://apache.github.io/couchdb-helm
|
|
||||||
version: 3.3.4
|
|
||||||
- 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: 08031b0803cce0eff64472e569d454d9176119c8207aa9873a9c95ee66cc7d3f
|
|
||||||
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.1.0.tgz
|
|
||||||
version: 0.1.0
|
|
||||||
generated: "2021-10-20T14:27:23.491132+01:00"
|
|
|
@ -1 +0,0 @@
|
||||||
hosting.properties
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
# Use the main port in the builder for your self hosting URL, e.g. localhost:10000
|
||||||
|
MAIN_PORT=10000
|
||||||
|
|
||||||
|
# This section contains all secrets pertaining to the system
|
||||||
|
# These should be updated
|
||||||
|
JWT_SECRET=testsecret
|
||||||
|
MINIO_ACCESS_KEY=budibase
|
||||||
|
MINIO_SECRET_KEY=budibase
|
||||||
|
COUCH_DB_PASSWORD=budibase
|
||||||
|
COUCH_DB_USER=budibase
|
||||||
|
REDIS_PASSWORD=budibase
|
||||||
|
INTERNAL_API_KEY=budibase
|
||||||
|
|
||||||
|
# This section contains variables that do not need to be altered under normal circumstances
|
||||||
|
APP_PORT=4002
|
||||||
|
WORKER_PORT=4003
|
||||||
|
MINIO_PORT=4004
|
||||||
|
COUCH_DB_PORT=4005
|
||||||
|
REDIS_PORT=6379
|
||||||
|
WATCHTOWER_PORT=6161
|
||||||
|
BUDIBASE_ENVIRONMENT=PRODUCTION
|
|
@ -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:
|
||||||
|
```
|
||||||
|
yarn build:digitalocean
|
||||||
|
```
|
||||||
|
|
||||||
|
## 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
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
#!/bin/bash
|
||||||
|
packer build template.json
|
|
@ -0,0 +1,19 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# Configured as part of the DigitalOcean 1-Click Image build process
|
||||||
|
|
||||||
|
myip=$(hostname -I | awk '{print$1}')
|
||||||
|
cat <<EOF
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
Welcome to the Budibase DigitalOcean 1-Click Droplet.
|
||||||
|
To keep this Droplet secure, the UFW firewall is enabled.
|
||||||
|
All ports are BLOCKED except 22 (SSH), 80 (HTTP), 443 (HTTPS), and 10000
|
||||||
|
|
||||||
|
* Budibase website: http://budibase.com
|
||||||
|
|
||||||
|
For help and more information, visit https://docs.budibase.com/self-hosting/hosting-methods/digitalocean
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
To delete this message of the day: rm -rf $(readlink -f ${0})
|
||||||
|
EOF
|
|
@ -0,0 +1,21 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# go into the app dir
|
||||||
|
cd /root
|
||||||
|
|
||||||
|
# fetch nginx and docker-compose files
|
||||||
|
wget https://raw.githubusercontent.com/Budibase/budibase/master/hosting/docker-compose.yaml
|
||||||
|
wget https://raw.githubusercontent.com/Budibase/budibase/master/hosting/hosting.properties
|
||||||
|
|
||||||
|
# Create .env file from hosting.properties using bash and then remove it
|
||||||
|
while read line; do
|
||||||
|
uuid=$(uuidgen)
|
||||||
|
echo $line | sed "s/budibase/$uuid/g" | sed "s/testsecret/$uuid/g" >> .env
|
||||||
|
done <hosting.properties
|
||||||
|
rm hosting.properties
|
||||||
|
|
||||||
|
# boot the stack
|
||||||
|
docker-compose up -d
|
||||||
|
|
||||||
|
# return
|
||||||
|
cd -
|
|
@ -0,0 +1,49 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# DigitalOcean Marketplace Image Validation Tool
|
||||||
|
# © 2021 DigitalOcean LLC.
|
||||||
|
# This code is licensed under Apache 2.0 license (see LICENSE.md for details)
|
||||||
|
|
||||||
|
set -o errexit
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
if [ -n "$(command -v yum)" ]; then
|
||||||
|
yum update -y
|
||||||
|
yum clean all
|
||||||
|
elif [ -n "$(command -v apt-get)" ]; then
|
||||||
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
|
apt-get -y update
|
||||||
|
apt-get -o Dpkg::Options::="--force-confold" upgrade -q -y --force-yes
|
||||||
|
apt-get -y autoremove
|
||||||
|
apt-get -y autoclean
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -rf /tmp/* /var/tmp/*
|
||||||
|
history -c
|
||||||
|
cat /dev/null > /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
|
|
@ -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 <version>", 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
|
|
@ -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"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -22,18 +22,21 @@ services:
|
||||||
retries: 3
|
retries: 3
|
||||||
|
|
||||||
proxy-service:
|
proxy-service:
|
||||||
container_name: budi-envoy-dev
|
container_name: budi-nginx-dev
|
||||||
restart: always
|
restart: always
|
||||||
image: envoyproxy/envoy:v1.16-latest
|
image: nginx:latest
|
||||||
volumes:
|
volumes:
|
||||||
- ./.generated-envoy.dev.yaml:/etc/envoy/envoy.yaml
|
- ./.generated-nginx.dev.conf:/etc/nginx/nginx.conf
|
||||||
ports:
|
ports:
|
||||||
- "${MAIN_PORT}:10000"
|
- "${MAIN_PORT}:10000"
|
||||||
depends_on:
|
depends_on:
|
||||||
- minio-service
|
- minio-service
|
||||||
- couchdb-service
|
- couchdb-service
|
||||||
|
extra_hosts:
|
||||||
|
- "host.docker.internal:host-gateway"
|
||||||
|
|
||||||
couchdb-service:
|
couchdb-service:
|
||||||
|
# platform: linux/amd64
|
||||||
container_name: budi-couchdb-dev
|
container_name: budi-couchdb-dev
|
||||||
restart: always
|
restart: always
|
||||||
image: ibmcom/couchdb3
|
image: ibmcom/couchdb3
|
||||||
|
|
|
@ -7,8 +7,6 @@ services:
|
||||||
restart: always
|
restart: always
|
||||||
image: budibase.docker.scarf.sh/budibase/apps
|
image: budibase.docker.scarf.sh/budibase/apps
|
||||||
container_name: bbapps
|
container_name: bbapps
|
||||||
ports:
|
|
||||||
- "${APP_PORT}:4002"
|
|
||||||
environment:
|
environment:
|
||||||
SELF_HOSTED: 1
|
SELF_HOSTED: 1
|
||||||
COUCH_DB_URL: http://${COUCH_DB_USER}:${COUCH_DB_PASSWORD}@couchdb-service:5984
|
COUCH_DB_URL: http://${COUCH_DB_USER}:${COUCH_DB_PASSWORD}@couchdb-service:5984
|
||||||
|
@ -25,8 +23,6 @@ services:
|
||||||
ENABLE_ANALYTICS: "true"
|
ENABLE_ANALYTICS: "true"
|
||||||
REDIS_URL: redis-service:6379
|
REDIS_URL: redis-service:6379
|
||||||
REDIS_PASSWORD: ${REDIS_PASSWORD}
|
REDIS_PASSWORD: ${REDIS_PASSWORD}
|
||||||
volumes:
|
|
||||||
- ./logs:/logs
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- worker-service
|
- worker-service
|
||||||
- redis-service
|
- redis-service
|
||||||
|
@ -35,8 +31,6 @@ services:
|
||||||
restart: always
|
restart: always
|
||||||
image: budibase.docker.scarf.sh/budibase/worker
|
image: budibase.docker.scarf.sh/budibase/worker
|
||||||
container_name: bbworker
|
container_name: bbworker
|
||||||
ports:
|
|
||||||
- "${WORKER_PORT}:4003"
|
|
||||||
environment:
|
environment:
|
||||||
SELF_HOSTED: 1
|
SELF_HOSTED: 1
|
||||||
PORT: 4003
|
PORT: 4003
|
||||||
|
@ -53,8 +47,6 @@ services:
|
||||||
INTERNAL_API_KEY: ${INTERNAL_API_KEY}
|
INTERNAL_API_KEY: ${INTERNAL_API_KEY}
|
||||||
REDIS_URL: redis-service:6379
|
REDIS_URL: redis-service:6379
|
||||||
REDIS_PASSWORD: ${REDIS_PASSWORD}
|
REDIS_PASSWORD: ${REDIS_PASSWORD}
|
||||||
volumes:
|
|
||||||
- ./logs:/logs
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- redis-service
|
- redis-service
|
||||||
- minio-service
|
- minio-service
|
||||||
|
@ -65,8 +57,6 @@ services:
|
||||||
image: minio/minio
|
image: minio/minio
|
||||||
volumes:
|
volumes:
|
||||||
- minio_data:/data
|
- minio_data:/data
|
||||||
ports:
|
|
||||||
- "${MINIO_PORT}:9000"
|
|
||||||
environment:
|
environment:
|
||||||
MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY}
|
MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY}
|
||||||
MINIO_SECRET_KEY: ${MINIO_SECRET_KEY}
|
MINIO_SECRET_KEY: ${MINIO_SECRET_KEY}
|
||||||
|
@ -80,11 +70,10 @@ services:
|
||||||
|
|
||||||
proxy-service:
|
proxy-service:
|
||||||
restart: always
|
restart: always
|
||||||
image: envoyproxy/envoy:v1.16-latest
|
|
||||||
volumes:
|
|
||||||
- ./envoy.yaml:/etc/envoy/envoy.yaml
|
|
||||||
ports:
|
ports:
|
||||||
- "${MAIN_PORT}:10000"
|
- "${MAIN_PORT}:10000"
|
||||||
|
container_name: bbproxy
|
||||||
|
image: budibase/proxy
|
||||||
depends_on:
|
depends_on:
|
||||||
- minio-service
|
- minio-service
|
||||||
- worker-service
|
- worker-service
|
||||||
|
@ -97,8 +86,6 @@ services:
|
||||||
environment:
|
environment:
|
||||||
- COUCHDB_PASSWORD=${COUCH_DB_PASSWORD}
|
- COUCHDB_PASSWORD=${COUCH_DB_PASSWORD}
|
||||||
- COUCHDB_USER=${COUCH_DB_USER}
|
- COUCHDB_USER=${COUCH_DB_USER}
|
||||||
ports:
|
|
||||||
- "${COUCH_DB_PORT}:5984"
|
|
||||||
volumes:
|
volumes:
|
||||||
- couchdb3_data:/opt/couchdb/data
|
- couchdb3_data:/opt/couchdb/data
|
||||||
|
|
||||||
|
@ -114,18 +101,14 @@ services:
|
||||||
restart: always
|
restart: always
|
||||||
image: redis
|
image: redis
|
||||||
command: redis-server --requirepass ${REDIS_PASSWORD}
|
command: redis-server --requirepass ${REDIS_PASSWORD}
|
||||||
ports:
|
|
||||||
- "${REDIS_PORT}:6379"
|
|
||||||
volumes:
|
volumes:
|
||||||
- redis_data:/data
|
- redis_data:/data
|
||||||
|
|
||||||
watchtower-service:
|
watchtower-service:
|
||||||
image: containrrr/watchtower
|
image: containrrr/watchtower
|
||||||
ports:
|
|
||||||
- "${WATCHTOWER_PORT}:8080"
|
|
||||||
volumes:
|
volumes:
|
||||||
- /var/run/docker.sock:/var/run/docker.sock
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
command: --debug --http-api-update bbapps bbworker
|
command: --debug --http-api-update bbapps bbworker bbproxy
|
||||||
environment:
|
environment:
|
||||||
- WATCHTOWER_HTTP_API=true
|
- WATCHTOWER_HTTP_API=true
|
||||||
- WATCHTOWER_HTTP_API_TOKEN=budibase
|
- WATCHTOWER_HTTP_API_TOKEN=budibase
|
||||||
|
|
|
@ -1,149 +0,0 @@
|
||||||
static_resources:
|
|
||||||
listeners:
|
|
||||||
- name: main_listener
|
|
||||||
address:
|
|
||||||
socket_address: { address: 0.0.0.0, port_value: 10000 }
|
|
||||||
filter_chains:
|
|
||||||
- filters:
|
|
||||||
- name: envoy.filters.network.http_connection_manager
|
|
||||||
typed_config:
|
|
||||||
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
|
|
||||||
stat_prefix: ingress
|
|
||||||
codec_type: auto
|
|
||||||
route_config:
|
|
||||||
name: local_route
|
|
||||||
virtual_hosts:
|
|
||||||
- name: local_services
|
|
||||||
domains: ["*"]
|
|
||||||
routes:
|
|
||||||
# special case to redirect specifically the route path
|
|
||||||
# to the builder, if this were a prefix then it would break minio
|
|
||||||
- match: { path: "/" }
|
|
||||||
redirect: { path_redirect: "/builder/" }
|
|
||||||
|
|
||||||
- match: { prefix: "/db/" }
|
|
||||||
route:
|
|
||||||
cluster: couchdb-service
|
|
||||||
prefix_rewrite: "/"
|
|
||||||
|
|
||||||
- match: { prefix: "/api/system/" }
|
|
||||||
route:
|
|
||||||
cluster: worker-dev
|
|
||||||
|
|
||||||
- match: { prefix: "/api/admin/" }
|
|
||||||
route:
|
|
||||||
cluster: worker-dev
|
|
||||||
|
|
||||||
- match: { prefix: "/api/global/" }
|
|
||||||
route:
|
|
||||||
cluster: worker-dev
|
|
||||||
|
|
||||||
- match: { prefix: "/api/" }
|
|
||||||
route:
|
|
||||||
cluster: server-dev
|
|
||||||
timeout: 120s
|
|
||||||
|
|
||||||
- match: { prefix: "/app_" }
|
|
||||||
route:
|
|
||||||
cluster: server-dev
|
|
||||||
|
|
||||||
- match: { prefix: "/app/" }
|
|
||||||
route:
|
|
||||||
cluster: server-dev
|
|
||||||
prefix_rewrite: "/"
|
|
||||||
|
|
||||||
# the below three cases are needed to make sure
|
|
||||||
# all traffic prefixed for the builder is passed through
|
|
||||||
# correctly.
|
|
||||||
- match: { path: "/" }
|
|
||||||
route:
|
|
||||||
cluster: builder-dev
|
|
||||||
|
|
||||||
- match: { prefix: "/builder/" }
|
|
||||||
route:
|
|
||||||
cluster: builder-dev
|
|
||||||
|
|
||||||
- match: { prefix: "/builder" }
|
|
||||||
route:
|
|
||||||
cluster: builder-dev
|
|
||||||
prefix_rewrite: "/builder/"
|
|
||||||
|
|
||||||
# minio is on the default route because this works
|
|
||||||
# best, minio + AWS SDK doesn't handle path proxy
|
|
||||||
- match: { prefix: "/" }
|
|
||||||
route:
|
|
||||||
cluster: minio-service
|
|
||||||
|
|
||||||
http_filters:
|
|
||||||
- name: envoy.filters.http.router
|
|
||||||
|
|
||||||
clusters:
|
|
||||||
- name: minio-service
|
|
||||||
connect_timeout: 0.25s
|
|
||||||
type: strict_dns
|
|
||||||
lb_policy: round_robin
|
|
||||||
load_assignment:
|
|
||||||
cluster_name: minio-service
|
|
||||||
endpoints:
|
|
||||||
- lb_endpoints:
|
|
||||||
- endpoint:
|
|
||||||
address:
|
|
||||||
socket_address:
|
|
||||||
address: minio-service
|
|
||||||
port_value: 9000
|
|
||||||
|
|
||||||
- name: couchdb-service
|
|
||||||
connect_timeout: 0.25s
|
|
||||||
type: strict_dns
|
|
||||||
lb_policy: round_robin
|
|
||||||
load_assignment:
|
|
||||||
cluster_name: couchdb-service
|
|
||||||
endpoints:
|
|
||||||
- lb_endpoints:
|
|
||||||
- endpoint:
|
|
||||||
address:
|
|
||||||
socket_address:
|
|
||||||
address: couchdb-service
|
|
||||||
port_value: 5984
|
|
||||||
|
|
||||||
- name: server-dev
|
|
||||||
connect_timeout: 0.25s
|
|
||||||
type: strict_dns
|
|
||||||
lb_policy: round_robin
|
|
||||||
load_assignment:
|
|
||||||
cluster_name: server-dev
|
|
||||||
endpoints:
|
|
||||||
- lb_endpoints:
|
|
||||||
- endpoint:
|
|
||||||
address:
|
|
||||||
socket_address:
|
|
||||||
address: {{ address }}
|
|
||||||
port_value: 4001
|
|
||||||
|
|
||||||
- name: builder-dev
|
|
||||||
connect_timeout: 15s
|
|
||||||
type: strict_dns
|
|
||||||
lb_policy: round_robin
|
|
||||||
load_assignment:
|
|
||||||
cluster_name: builder-dev
|
|
||||||
endpoints:
|
|
||||||
- lb_endpoints:
|
|
||||||
- endpoint:
|
|
||||||
address:
|
|
||||||
socket_address:
|
|
||||||
address: {{ address }}
|
|
||||||
port_value: 3000
|
|
||||||
|
|
||||||
- name: worker-dev
|
|
||||||
connect_timeout: 0.25s
|
|
||||||
type: strict_dns
|
|
||||||
lb_policy: round_robin
|
|
||||||
load_assignment:
|
|
||||||
cluster_name: worker-dev
|
|
||||||
endpoints:
|
|
||||||
- lb_endpoints:
|
|
||||||
- endpoint:
|
|
||||||
address:
|
|
||||||
socket_address:
|
|
||||||
address: {{ address }}
|
|
||||||
port_value: 4002
|
|
|
@ -1,41 +0,0 @@
|
||||||
apiVersion: v2
|
|
||||||
name: budibase
|
|
||||||
description: Budibase is an open source low-code platform, helping thousands of teams build apps for their workplace in minutes.
|
|
||||||
keywords:
|
|
||||||
- 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.
|
|
||||||
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
|
|
||||||
|
|
||||||
# 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"
|
|
||||||
|
|
||||||
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
|
|
||||||
repository: https://github.com/kubernetes/ingress-nginx
|
|
||||||
condition: ingress.nginx
|
|
|
@ -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
|
|
|
@ -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 = <pbkdf2-hash>
|
|
||||||
```
|
|
||||||
|
|
||||||
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 <release-name> \
|
|
||||||
--reuse-values \
|
|
||||||
--set couchdbConfig.couchdb.uuid=<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
|
|
|
@ -1,3 +0,0 @@
|
||||||
couchdbConfig:
|
|
||||||
couchdb:
|
|
||||||
uuid: "decafbaddecafbaddecafbaddecafbad"
|
|
|
@ -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;']
|
|
|
@ -1,2 +0,0 @@
|
||||||
[admins]
|
|
||||||
{{ .Values.adminUsername }} = {{ .Values.adminHash }}
|
|
|
@ -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 <adminUsername>
|
|
||||||
{{- end }}
|
|
||||||
|
|
||||||
Then it's time to relax.
|
|
|
@ -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 -}}
|
|
|
@ -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" . }}
|
|
|
@ -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 }}
|
|
|
@ -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 -}}
|
|
|
@ -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 }}
|
|
|
@ -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 -}}
|
|
|
@ -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 -}}
|
|
|
@ -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 }}
|
|
|
@ -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 }}
|
|
|
@ -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
|
|
||||||
## <ReleaseName>-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 <ReleaseName>-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/
|
|
Binary file not shown.
|
@ -1,153 +0,0 @@
|
||||||
# Default values for budibase.
|
|
||||||
# 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.
|
|
||||||
tag: ""
|
|
||||||
|
|
||||||
imagePullSecrets: []
|
|
||||||
nameOverride: ""
|
|
||||||
# fullnameOverride: ""
|
|
||||||
|
|
||||||
serviceAccount:
|
|
||||||
# Specifies whether a service account should be created
|
|
||||||
create: true
|
|
||||||
# Annotations to add to the service account
|
|
||||||
annotations: {}
|
|
||||||
# The name of the service account to use.
|
|
||||||
# If not set and create is true, a name is generated using the fullname template
|
|
||||||
name: ""
|
|
||||||
|
|
||||||
podAnnotations: {}
|
|
||||||
|
|
||||||
podSecurityContext:
|
|
||||||
{}
|
|
||||||
# fsGroup: 2000
|
|
||||||
|
|
||||||
securityContext:
|
|
||||||
{}
|
|
||||||
# capabilities:
|
|
||||||
# drop:
|
|
||||||
# - ALL
|
|
||||||
# readOnlyRootFilesystem: true
|
|
||||||
# runAsNonRoot: true
|
|
||||||
# runAsUser: 1000
|
|
||||||
|
|
||||||
service:
|
|
||||||
type: ClusterIP
|
|
||||||
port: 10000
|
|
||||||
|
|
||||||
ingress:
|
|
||||||
enabled: false
|
|
||||||
aws: false
|
|
||||||
nginx: true
|
|
||||||
certificateArn: ""
|
|
||||||
className: ""
|
|
||||||
annotations:
|
|
||||||
kubernetes.io/ingress.class: nginx
|
|
||||||
hosts:
|
|
||||||
- host: # change if using custom domain
|
|
||||||
paths:
|
|
||||||
- path: /
|
|
||||||
pathType: Prefix
|
|
||||||
backend:
|
|
||||||
service:
|
|
||||||
name: proxy-service
|
|
||||||
port:
|
|
||||||
number: 10000
|
|
||||||
|
|
||||||
resources:
|
|
||||||
{}
|
|
||||||
# We usually recommend not to specify default resources and to leave this as a conscious
|
|
||||||
# choice for the user. This also increases chances charts run on environments with little
|
|
||||||
# resources, such as Minikube. If you do want to specify resources, uncomment the following
|
|
||||||
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
|
|
||||||
# limits:
|
|
||||||
# cpu: 100m
|
|
||||||
# memory: 128Mi
|
|
||||||
# requests:
|
|
||||||
# cpu: 100m
|
|
||||||
# memory: 128Mi
|
|
||||||
|
|
||||||
autoscaling:
|
|
||||||
enabled: false
|
|
||||||
minReplicas: 1
|
|
||||||
maxReplicas: 100
|
|
||||||
targetCPUUtilizationPercentage: 80
|
|
||||||
# targetMemoryUtilizationPercentage: 80
|
|
||||||
|
|
||||||
nodeSelector: {}
|
|
||||||
|
|
||||||
tolerations: []
|
|
||||||
|
|
||||||
affinity: {}
|
|
||||||
|
|
||||||
globals:
|
|
||||||
budibaseEnv: PRODUCTION
|
|
||||||
enableAnalytics: true
|
|
||||||
sentryDSN: ""
|
|
||||||
posthogToken: ""
|
|
||||||
logLevel: info
|
|
||||||
selfHosted: "1" # set to 0 for budibase cloud environment, set to 1 for self-hosted setup
|
|
||||||
multiTenancy: "0" # set to 0 to disable multiple orgs, set to 1 to enable multiple orgs
|
|
||||||
accountPortalUrl: ""
|
|
||||||
accountPortalApiKey: ""
|
|
||||||
cookieDomain: ""
|
|
||||||
platformUrl: ""
|
|
||||||
|
|
||||||
createSecrets: true # creates an internal API key, JWT secrets and redis password for you
|
|
||||||
|
|
||||||
# if createSecrets is set to false, you can hard-code your secrets here
|
|
||||||
internalApiKey: ""
|
|
||||||
jwtSecret: ""
|
|
||||||
|
|
||||||
smtp:
|
|
||||||
enabled: false
|
|
||||||
|
|
||||||
services:
|
|
||||||
dns: cluster.local
|
|
||||||
|
|
||||||
proxy:
|
|
||||||
port: 10000
|
|
||||||
replicaCount: 1
|
|
||||||
|
|
||||||
apps:
|
|
||||||
port: 4002
|
|
||||||
replicaCount: 1
|
|
||||||
logLevel: info
|
|
||||||
|
|
||||||
worker:
|
|
||||||
port: 4001
|
|
||||||
replicaCount: 1
|
|
||||||
|
|
||||||
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
|
|
||||||
port: 6379
|
|
||||||
replicaCount: 1
|
|
||||||
url: "" # only change if pointing to existing redis cluster and enabled: false
|
|
||||||
password: "budibase" # recommended to override if using built-in redis
|
|
||||||
storage: 100Mi
|
|
||||||
|
|
||||||
objectStore:
|
|
||||||
minio: true
|
|
||||||
browser: true
|
|
||||||
port: 9000
|
|
||||||
replicaCount: 1
|
|
||||||
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
|
|
||||||
storage: 100Mi
|
|
|
@ -1,4 +0,0 @@
|
||||||
FROM envoyproxy/envoy:v1.16-latest
|
|
||||||
COPY envoy.yaml /etc/envoy/envoy.yaml
|
|
||||||
RUN chmod go+r /etc/envoy/envoy.yaml
|
|
||||||
|
|
|
@ -1,138 +0,0 @@
|
||||||
static_resources:
|
|
||||||
listeners:
|
|
||||||
- name: main_listener
|
|
||||||
address:
|
|
||||||
socket_address: { address: 0.0.0.0, port_value: 10000 }
|
|
||||||
filter_chains:
|
|
||||||
- filters:
|
|
||||||
- name: envoy.filters.network.http_connection_manager
|
|
||||||
typed_config:
|
|
||||||
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
|
|
||||||
stat_prefix: ingress
|
|
||||||
codec_type: auto
|
|
||||||
route_config:
|
|
||||||
name: local_route
|
|
||||||
virtual_hosts:
|
|
||||||
- name: local_services
|
|
||||||
domains: ["*"]
|
|
||||||
routes:
|
|
||||||
- match: { prefix: "/app/" }
|
|
||||||
route:
|
|
||||||
cluster: app-service
|
|
||||||
prefix_rewrite: "/"
|
|
||||||
|
|
||||||
- match: { prefix: "/builder/" }
|
|
||||||
route:
|
|
||||||
cluster: app-service
|
|
||||||
|
|
||||||
- match: { prefix: "/builder" }
|
|
||||||
route:
|
|
||||||
cluster: app-service
|
|
||||||
|
|
||||||
- match: { prefix: "/app_" }
|
|
||||||
route:
|
|
||||||
cluster: app-service
|
|
||||||
|
|
||||||
# special cases for worker admin (deprecated), global and system API
|
|
||||||
- match: { prefix: "/api/global/" }
|
|
||||||
route:
|
|
||||||
cluster: worker-service
|
|
||||||
|
|
||||||
- match: { prefix: "/api/admin/" }
|
|
||||||
route:
|
|
||||||
cluster: worker-service
|
|
||||||
|
|
||||||
- match: { prefix: "/api/system/" }
|
|
||||||
route:
|
|
||||||
cluster: worker-service
|
|
||||||
|
|
||||||
- match: { path: "/" }
|
|
||||||
route:
|
|
||||||
cluster: app-service
|
|
||||||
|
|
||||||
- match: { path: "/api/deploy" }
|
|
||||||
route:
|
|
||||||
timeout: 60s
|
|
||||||
cluster: app-service
|
|
||||||
|
|
||||||
# special case for when API requests are made, can just forward, not to minio
|
|
||||||
- match: { prefix: "/api/" }
|
|
||||||
route:
|
|
||||||
cluster: app-service
|
|
||||||
|
|
||||||
- match: { prefix: "/worker/" }
|
|
||||||
route:
|
|
||||||
cluster: worker-service
|
|
||||||
prefix_rewrite: "/"
|
|
||||||
|
|
||||||
- match: { prefix: "/db/" }
|
|
||||||
route:
|
|
||||||
cluster: couchdb-service
|
|
||||||
prefix_rewrite: "/"
|
|
||||||
|
|
||||||
# minio is on the default route because this works
|
|
||||||
# best, minio + AWS SDK doesn't handle path proxy
|
|
||||||
- match: { prefix: "/" }
|
|
||||||
route:
|
|
||||||
cluster: minio-service
|
|
||||||
|
|
||||||
http_filters:
|
|
||||||
- name: envoy.filters.http.router
|
|
||||||
|
|
||||||
clusters:
|
|
||||||
- name: app-service
|
|
||||||
connect_timeout: 0.25s
|
|
||||||
type: strict_dns
|
|
||||||
lb_policy: round_robin
|
|
||||||
load_assignment:
|
|
||||||
cluster_name: app-service
|
|
||||||
endpoints:
|
|
||||||
- lb_endpoints:
|
|
||||||
- endpoint:
|
|
||||||
address:
|
|
||||||
socket_address:
|
|
||||||
address: app-service.budibase.svc.cluster.local
|
|
||||||
port_value: 4002
|
|
||||||
|
|
||||||
- name: minio-service
|
|
||||||
connect_timeout: 0.25s
|
|
||||||
type: strict_dns
|
|
||||||
lb_policy: round_robin
|
|
||||||
load_assignment:
|
|
||||||
cluster_name: minio-service
|
|
||||||
endpoints:
|
|
||||||
- lb_endpoints:
|
|
||||||
- endpoint:
|
|
||||||
address:
|
|
||||||
socket_address:
|
|
||||||
address: minio-service.budibase.svc.cluster.local
|
|
||||||
port_value: 9000
|
|
||||||
|
|
||||||
- name: worker-service
|
|
||||||
connect_timeout: 0.25s
|
|
||||||
type: strict_dns
|
|
||||||
lb_policy: round_robin
|
|
||||||
load_assignment:
|
|
||||||
cluster_name: worker-service
|
|
||||||
endpoints:
|
|
||||||
- lb_endpoints:
|
|
||||||
- endpoint:
|
|
||||||
address:
|
|
||||||
socket_address:
|
|
||||||
address: worker-service.budibase.svc.cluster.local
|
|
||||||
port_value: 4001
|
|
||||||
|
|
||||||
- name: couchdb-service
|
|
||||||
connect_timeout: 0.25s
|
|
||||||
type: strict_dns
|
|
||||||
lb_policy: round_robin
|
|
||||||
load_assignment:
|
|
||||||
cluster_name: couchdb-service
|
|
||||||
endpoints:
|
|
||||||
- lb_endpoints:
|
|
||||||
- endpoint:
|
|
||||||
address:
|
|
||||||
socket_address:
|
|
||||||
address: budibase-prod-svc-couchdb
|
|
||||||
port_value: 5984
|
|
||||||
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
user nginx;
|
||||||
|
error_log /var/log/nginx/error.log debug;
|
||||||
|
pid /var/run/nginx.pid;
|
||||||
|
worker_processes auto;
|
||||||
|
worker_rlimit_nofile 33282;
|
||||||
|
|
||||||
|
events {
|
||||||
|
worker_connections 1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
include /etc/nginx/mime.types;
|
||||||
|
default_type application/octet-stream;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
|
||||||
|
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
||||||
|
'$status $body_bytes_sent "$http_referer" '
|
||||||
|
'"$http_user_agent" "$http_x_forwarded_for"';
|
||||||
|
|
||||||
|
map $http_upgrade $connection_upgrade {
|
||||||
|
default "upgrade";
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 10000 default_server;
|
||||||
|
server_name _;
|
||||||
|
client_max_body_size 1000m;
|
||||||
|
ignore_invalid_headers off;
|
||||||
|
proxy_buffering off;
|
||||||
|
|
||||||
|
location /db/ {
|
||||||
|
proxy_pass http://couchdb-service:5984;
|
||||||
|
rewrite ^/db/(.*)$ /$1 break;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ ^/api/(system|admin|global)/ {
|
||||||
|
proxy_pass http://{{ address }}:4002;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /api/ {
|
||||||
|
proxy_read_timeout 120s;
|
||||||
|
proxy_connect_timeout 120s;
|
||||||
|
proxy_send_timeout 120s;
|
||||||
|
proxy_pass http://{{ address }}:4001;
|
||||||
|
}
|
||||||
|
|
||||||
|
location = / {
|
||||||
|
proxy_pass http://{{ address }}:4001;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /app_ {
|
||||||
|
proxy_pass http://{{ address }}:4001;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /app/ {
|
||||||
|
proxy_pass http://{{ address }}:4001;
|
||||||
|
rewrite ^/app/(.*)$ /$1 break;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /builder {
|
||||||
|
proxy_pass http://{{ address }}:3000;
|
||||||
|
rewrite ^/builder(.*)$ /builder/$1 break;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /builder/ {
|
||||||
|
proxy_pass http://{{ address }}:3000;
|
||||||
|
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Connection $connection_upgrade;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
}
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
|
||||||
|
proxy_connect_timeout 300;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Connection "";
|
||||||
|
chunked_transfer_encoding off;
|
||||||
|
|
||||||
|
proxy_pass http://minio-service:9000;
|
||||||
|
}
|
||||||
|
|
||||||
|
client_header_timeout 60;
|
||||||
|
client_body_timeout 60;
|
||||||
|
keepalive_timeout 60;
|
||||||
|
gzip off;
|
||||||
|
gzip_comp_level 4;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,147 @@
|
||||||
|
user nginx;
|
||||||
|
error_log /var/log/nginx/error.log debug;
|
||||||
|
pid /var/run/nginx.pid;
|
||||||
|
worker_processes auto;
|
||||||
|
worker_rlimit_nofile 33282;
|
||||||
|
|
||||||
|
events {
|
||||||
|
worker_connections 1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
limit_req_zone $binary_remote_addr zone=ratelimit:10m rate=20r/s;
|
||||||
|
include /etc/nginx/mime.types;
|
||||||
|
default_type application/octet-stream;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
charset utf-8;
|
||||||
|
sendfile on;
|
||||||
|
tcp_nopush on;
|
||||||
|
tcp_nodelay on;
|
||||||
|
server_tokens off;
|
||||||
|
types_hash_max_size 2048;
|
||||||
|
{{#if compose}}
|
||||||
|
resolver 127.0.0.11 ipv6=off;
|
||||||
|
{{/if}}
|
||||||
|
{{#if k8s}}
|
||||||
|
resolver kube-dns.kube-system.svc.cluster.local valid=10s;
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
|
||||||
|
# buffering
|
||||||
|
client_body_buffer_size 1K;
|
||||||
|
client_header_buffer_size 1k;
|
||||||
|
client_max_body_size 10M;
|
||||||
|
ignore_invalid_headers off;
|
||||||
|
proxy_buffering off;
|
||||||
|
|
||||||
|
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
||||||
|
'$status $body_bytes_sent "$http_referer" '
|
||||||
|
'"$http_user_agent" "$http_x_forwarded_for"';
|
||||||
|
|
||||||
|
map $http_upgrade $connection_upgrade {
|
||||||
|
default "upgrade";
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 10000 default_server;
|
||||||
|
listen [::]:10000 default_server;
|
||||||
|
server_name _;
|
||||||
|
client_max_body_size 1000m;
|
||||||
|
ignore_invalid_headers off;
|
||||||
|
proxy_buffering off;
|
||||||
|
# port_in_redirect off;
|
||||||
|
|
||||||
|
# Security Headers
|
||||||
|
add_header X-Frame-Options SAMEORIGIN always;
|
||||||
|
add_header X-Content-Type-Options nosniff always;
|
||||||
|
add_header X-XSS-Protection "1; mode=block" always;
|
||||||
|
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://cdn.budi.live https://js.intercomcdn.com https://widget.intercom.io; style-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net https://fonts.googleapis.com https://rsms.me https://maxcdn.bootstrapcdn.com; object-src 'none'; base-uri 'self'; connect-src 'self' https://api-iam.intercom.io https://app.posthog.com wss://nexus-websocket-a.intercom.io; font-src 'self' data https://cdn.jsdelivr.net https://fonts.gstatic.com https://rsms.me https://maxcdn.bootstrapcdn.com; frame-src 'self'; img-src http: https: data; manifest-src 'self'; media-src 'self'; worker-src 'none';" always;
|
||||||
|
|
||||||
|
# upstreams
|
||||||
|
set $apps {{ apps }};
|
||||||
|
set $worker {{ worker }};
|
||||||
|
set $minio {{ minio }};
|
||||||
|
set $couchdb {{ couchdb }};
|
||||||
|
{{#if watchtower}}
|
||||||
|
set $watchtower {{ watchtower }};
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
location /app {
|
||||||
|
proxy_pass http://$apps:4002;
|
||||||
|
rewrite ^/app/(.*)$ /$1 break;
|
||||||
|
}
|
||||||
|
|
||||||
|
location = / {
|
||||||
|
proxy_pass http://$apps:4002;
|
||||||
|
}
|
||||||
|
|
||||||
|
{{#if watchtower}}
|
||||||
|
location = /v1/update {
|
||||||
|
proxy_pass http://$watchtower:8080;
|
||||||
|
}
|
||||||
|
{{/if}}
|
||||||
|
location ~ ^/(builder|app_) {
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Connection $connection_upgrade;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_pass http://$apps:4002;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ ^/api/(system|admin|global)/ {
|
||||||
|
proxy_pass http://$worker:4003;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /worker/ {
|
||||||
|
proxy_pass http://$worker:4003;
|
||||||
|
rewrite ^/worker/(.*)$ /$1 break;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /api/ {
|
||||||
|
# calls to the API are rate limited with bursting
|
||||||
|
limit_req zone=ratelimit burst=20 nodelay;
|
||||||
|
|
||||||
|
# 120s timeout on API requests
|
||||||
|
proxy_read_timeout 120s;
|
||||||
|
proxy_connect_timeout 120s;
|
||||||
|
proxy_send_timeout 120s;
|
||||||
|
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Connection $connection_upgrade;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
|
||||||
|
proxy_pass http://$apps:4002;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /db/ {
|
||||||
|
proxy_pass http://$couchdb:5984;
|
||||||
|
rewrite ^/db/(.*)$ /$1 break;
|
||||||
|
}
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
|
||||||
|
proxy_connect_timeout 300;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Connection "";
|
||||||
|
chunked_transfer_encoding off;
|
||||||
|
proxy_pass http://$minio:9000;
|
||||||
|
}
|
||||||
|
|
||||||
|
client_header_timeout 60;
|
||||||
|
client_body_timeout 60;
|
||||||
|
keepalive_timeout 60;
|
||||||
|
|
||||||
|
# gzip
|
||||||
|
gzip on;
|
||||||
|
gzip_vary on;
|
||||||
|
gzip_proxied any;
|
||||||
|
gzip_comp_level 6;
|
||||||
|
gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,2 @@
|
||||||
|
FROM nginx:latest
|
||||||
|
COPY .generated-nginx.prod.conf /etc/nginx/nginx.conf
|
|
@ -0,0 +1,145 @@
|
||||||
|
user nginx;
|
||||||
|
error_log /var/log/nginx/error.log debug;
|
||||||
|
pid /var/run/nginx.pid;
|
||||||
|
worker_processes auto;
|
||||||
|
worker_rlimit_nofile 33282;
|
||||||
|
|
||||||
|
events {
|
||||||
|
worker_connections 1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
limit_req_zone $binary_remote_addr zone=ratelimit:10m rate=20r/s;
|
||||||
|
include /etc/nginx/mime.types;
|
||||||
|
default_type application/octet-stream;
|
||||||
|
charset utf-8;
|
||||||
|
sendfile on;
|
||||||
|
tcp_nopush on;
|
||||||
|
tcp_nodelay on;
|
||||||
|
server_tokens off;
|
||||||
|
types_hash_max_size 2048;
|
||||||
|
|
||||||
|
# buffering
|
||||||
|
client_body_buffer_size 1K;
|
||||||
|
client_header_buffer_size 1k;
|
||||||
|
client_max_body_size 1k;
|
||||||
|
ignore_invalid_headers off;
|
||||||
|
|
||||||
|
|
||||||
|
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
||||||
|
'$status $body_bytes_sent "$http_referer" '
|
||||||
|
'"$http_user_agent" "$http_x_forwarded_for"';
|
||||||
|
|
||||||
|
map $http_upgrade $connection_upgrade {
|
||||||
|
default "upgrade";
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 10000 default_server;
|
||||||
|
listen [::]:10000 default_server;
|
||||||
|
server_name _;
|
||||||
|
client_max_body_size 1000m;
|
||||||
|
ignore_invalid_headers off;
|
||||||
|
proxy_buffering off;
|
||||||
|
port_in_redirect off;
|
||||||
|
|
||||||
|
# Security Headers
|
||||||
|
add_header X-Frame-Options SAMEORIGIN always;
|
||||||
|
add_header X-Content-Type-Options nosniff always;
|
||||||
|
add_header X-XSS-Protection "1; mode=block" always;
|
||||||
|
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://cdn.budi.live https://js.intercomcdn.com https://widget.intercom.io; style-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net https://fonts.googleapis.com https://rsms.me; object-src 'none'; base-uri 'self'; connect-src 'self' https://api-iam.intercom.io https://app.posthog.com wss://nexus-websocket-a.intercom.io; font-src 'self' data: https://cdn.jsdelivr.net https://fonts.gstatic.com https://rsms.me; frame-src 'self'; img-src http: https: data:; manifest-src 'self'; media-src 'self'; worker-src 'none';" always;
|
||||||
|
|
||||||
|
location /app {
|
||||||
|
proxy_pass http://app-service:4002;
|
||||||
|
rewrite ^/app/(.*)$ /$1 break;
|
||||||
|
}
|
||||||
|
|
||||||
|
location = / {
|
||||||
|
port_in_redirect off;
|
||||||
|
proxy_pass http://app-service:4002;
|
||||||
|
}
|
||||||
|
|
||||||
|
location = /v1/update {
|
||||||
|
proxy_pass http://watchtower-service:8080;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /builder/ {
|
||||||
|
port_in_redirect off;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Connection $connection_upgrade;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_pass http://app-service:4002;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ ^/(builder|app_) {
|
||||||
|
port_in_redirect off;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Connection $connection_upgrade;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_pass http://app-service:4002;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ ^/api/(system|admin|global)/ {
|
||||||
|
proxy_pass http://worker-service:4003;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /worker/ {
|
||||||
|
proxy_pass http://worker-service:4003;
|
||||||
|
rewrite ^/worker/(.*)$ /$1 break;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /api/ {
|
||||||
|
# calls to the API are rate limited with bursting
|
||||||
|
limit_req zone=ratelimit burst=20 nodelay;
|
||||||
|
|
||||||
|
# 120s timeout on API requests
|
||||||
|
proxy_read_timeout 120s;
|
||||||
|
proxy_connect_timeout 120s;
|
||||||
|
proxy_send_timeout 120s;
|
||||||
|
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Connection $connection_upgrade;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
|
||||||
|
proxy_pass http://app-service:4002;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /db/ {
|
||||||
|
proxy_pass http://couchdb-service:5984;
|
||||||
|
rewrite ^/db/(.*)$ /$1 break;
|
||||||
|
}
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_set_header Host $http_host;
|
||||||
|
|
||||||
|
proxy_connect_timeout 300;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Connection "";
|
||||||
|
chunked_transfer_encoding off;
|
||||||
|
proxy_pass http://minio-service:9000;
|
||||||
|
}
|
||||||
|
|
||||||
|
client_header_timeout 60;
|
||||||
|
client_body_timeout 60;
|
||||||
|
keepalive_timeout 60;
|
||||||
|
|
||||||
|
# gzip
|
||||||
|
gzip on;
|
||||||
|
gzip_vary on;
|
||||||
|
gzip_proxied any;
|
||||||
|
gzip_comp_level 6;
|
||||||
|
gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;
|
||||||
|
}
|
||||||
|
}
|
|
@ -5,7 +5,7 @@ const path = require("path")
|
||||||
const IMAGES = {
|
const IMAGES = {
|
||||||
worker: "budibase/worker",
|
worker: "budibase/worker",
|
||||||
apps: "budibase/apps",
|
apps: "budibase/apps",
|
||||||
proxy: "envoyproxy/envoy:v1.16-latest",
|
proxy: "budibase/proxy",
|
||||||
minio: "minio/minio",
|
minio: "minio/minio",
|
||||||
couch: "ibmcom/couchdb3",
|
couch: "ibmcom/couchdb3",
|
||||||
curl: "curlimages/curl",
|
curl: "curlimages/curl",
|
||||||
|
@ -15,8 +15,7 @@ const IMAGES = {
|
||||||
|
|
||||||
const FILES = {
|
const FILES = {
|
||||||
COMPOSE: "docker-compose.yaml",
|
COMPOSE: "docker-compose.yaml",
|
||||||
ENVOY: "envoy.yaml",
|
ENV: ".env"
|
||||||
PROPERTIES: "hosting.properties"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const OUTPUT_DIR = path.join(__dirname, "../", "bb-airgapped")
|
const OUTPUT_DIR = path.join(__dirname, "../", "bb-airgapped")
|
||||||
|
@ -41,8 +40,7 @@ for (let image in IMAGES) {
|
||||||
|
|
||||||
// copy config files
|
// copy config files
|
||||||
copyFile(FILES.COMPOSE)
|
copyFile(FILES.COMPOSE)
|
||||||
copyFile(FILES.ENVOY)
|
copyFile(FILES.ENV)
|
||||||
copyFile(FILES.PROPERTIES)
|
|
||||||
|
|
||||||
// compress
|
// compress
|
||||||
execSync(`tar -czf bb-airgapped.tar.gz hosting/scripts/bb-airgapped`)
|
execSync(`tar -czf bb-airgapped.tar.gz hosting/scripts/bb-airgapped`)
|
||||||
|
|
|
@ -9,8 +9,10 @@ fi
|
||||||
|
|
||||||
echo "Tagging images with tag: $tag"
|
echo "Tagging images with tag: $tag"
|
||||||
|
|
||||||
|
docker tag proxy-service budibase/proxy:$tag
|
||||||
docker tag app-service budibase/apps:$tag
|
docker tag app-service budibase/apps:$tag
|
||||||
docker tag worker-service budibase/worker:$tag
|
docker tag worker-service budibase/worker:$tag
|
||||||
|
|
||||||
docker push --all-tags budibase/apps
|
docker push --all-tags budibase/apps
|
||||||
docker push --all-tags budibase/worker
|
docker push --all-tags budibase/worker
|
||||||
|
docker push --all-tags budibase/proxy
|
||||||
|
|
|
@ -0,0 +1,214 @@
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://www.budibase.com">
|
||||||
|
<img alt="Budibase" src="https://d33wubrfki0l68.cloudfront.net/aac32159d7207b5085e74a7ef67afbb7027786c5/2b1fd/img/logo/bb-emblem.svg" width="60" />
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
<h1 align="center">
|
||||||
|
Budibase
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<h3 align="center">
|
||||||
|
La plateform low-code que vous aimerez utiliser
|
||||||
|
</h3>
|
||||||
|
<p align="center">
|
||||||
|
Budibase est une plateforme low-code open source et c'est la façon la plus facile de créer des outils internes qui améliore la productivité.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3 align="center">
|
||||||
|
🤖 🎨 🚀
|
||||||
|
</h3>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img alt="Budibase design ui" src="https://res.cloudinary.com/daog6scxm/image/upload/v1633524049/ui/design-ui-wide-mobile_gdaveq.jpg">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://github.com/Budibase/budibase/releases">
|
||||||
|
<img alt="GitHub toutes les releases" src="https://img.shields.io/github/downloads/Budibase/budibase/total">
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/Budibase/budibase/releases">
|
||||||
|
<img alt="GitHub release (par ordre chronologique)" src="https://img.shields.io/github/v/release/Budibase/budibase">
|
||||||
|
</a>
|
||||||
|
<a href="https://twitter.com/intent/follow?screen_name=budibase">
|
||||||
|
<img src="https://img.shields.io/twitter/follow/budibase?style=social" alt="Suivre @budibase" />
|
||||||
|
</a>
|
||||||
|
<img src="https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg" alt="Code de conduite" />
|
||||||
|
<a href="https://codecov.io/gh/Budibase/budibase">
|
||||||
|
<img src="https://codecov.io/gh/Budibase/budibase/graph/badge.svg?token=E8W2ZFXQOH"/>
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3 align="center">
|
||||||
|
<a href="https://docs.budibase.com/getting-started">Commencer</a>
|
||||||
|
<span> · </span>
|
||||||
|
<a href="https://docs.budibase.com">Documentation</a>
|
||||||
|
<span> · </span>
|
||||||
|
<a href="https://github.com/Budibase/budibase/discussions?discussions_q=category%3AIdeas">Demandes d'amélioration</a>
|
||||||
|
<span> · </span>
|
||||||
|
<a href="https://github.com/Budibase/budibase/issues">Signaler un bug</a>
|
||||||
|
<span> · </span>
|
||||||
|
Support: <a href="https://github.com/Budibase/budibase/discussions">Discussions</a>
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<br /><br />
|
||||||
|
## ✨ Fontionnalités
|
||||||
|
|
||||||
|
### Construire et déployer un vrai logiciel
|
||||||
|
Contrairement à d'autres plateformes, avec Budibase vous construisez et déployez des applications one-page. Les applications Budibase sont très perfomantes et peuvent être designées de manière responsive, offrant ainsi à vos utilisateurs une expérience exceptionnelle.
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
### Source libre et extensible
|
||||||
|
Budibase est un logiciel libre - sous licence GPL v3. Cela devrait vous rassurer sur le fait que Budibase sera toujours là. Vous pouvez également coder dans Budibase ou le forker et apporter des modifications à votre guise, ce qui en fera une expérience conviviale pour les développeurs.
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
### Importer les données ou partir de zéro
|
||||||
|
Budibase peut tirer ses données de plusieurs sources, dont MongoDB, CouchDB, PostgreSQL, MySQL, Airtable, S3, DynamoDB ou une API REST. Et contrairement à d'autres plateformes, avec Budibase, vous pouvez partir de zéro et créer des applications métier sans aucune source de données. [Demander une nouvelle source de données](https://github.com/Budibase/budibase/discussions?discussions_q=category%3AIdeas).
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img alt="Budibase data" src="https://res.cloudinary.com/daog6scxm/image/upload/v1636970242/Out%20of%20beta%20launch/data_n1tlhf.png">
|
||||||
|
</p>
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
### Concevoir et créer des applications à l'aide de composants prédéfinis.
|
||||||
|
|
||||||
|
Budibase est livré avec des composants joliment conçus et puissants que vous pouvez utiliser comme des blocs de construction pour bâtir votre interface utilisateur. Nous exposons également un grand nombre de vos options de style CSS préférées afin que vous puissiez faire preuve d'une créativité accrue. [Demander un nouveau composant](https://github.com/Budibase/budibase/discussions?discussions_q=category%3AIdeas).
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img alt="Budibase design" src="https://res.cloudinary.com/daog6scxm/image/upload/v1636970243/Out%20of%20beta%20launch/design-like-a-pro_qhlfeu.gif">
|
||||||
|
</p>
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
### Automatiser les processus, intégrer d'autres outils et se connecter à des webhooks
|
||||||
|
Gagnez du temps en automatisant les processus manuels et les flux de travail. Qu'il s'agisse de se connecter à des webhooks ou d'automatiser des e-mails, il suffit de dire à Budibase ce qu'il doit faire et de le laisser travailler pour vous. Vous pouvez aisément [créer une nouvelle automatisation pour Budibase ici](https://github.com/Budibase/automations) ou [Demander une nouvelle automatisation](https://github.com/Budibase/budibase/discussions?discussions_q=category%3AIdeas).
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img alt="Budibase automations" src="https://res.cloudinary.com/daog6scxm/image/upload/v1636970486/Out%20of%20beta%20launch/automation_riro7u.png">
|
||||||
|
</p>
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
### Intégration avec vos outils préférés
|
||||||
|
Budibase s'intègre à un certain nombre d'outils populaires, ce qui vous permet de créer des applications qui s'adaptent parfaitement à votre pile technologique.
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img alt="Budibase integrations" src="https://res.cloudinary.com/daog6scxm/image/upload/v1636970242/Out%20of%20beta%20launch/integrations_kc7dqt.png">
|
||||||
|
</p>
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
### Paradis des admins
|
||||||
|
Budibase est conçu pour évoluer. Avec Budibase, vous pouvez vous auto-héberger sur votre propre infrastructure et gérer globalement les utilisateurs, l'accueil, le SMTP, les applications, les groupes, l'apparence et plus encore. Vous pouvez également fournir aux utilisateurs/groupes un portail d'applications et confier la gestion des utilisateurs au responsable du groupe.
|
||||||
|
|
||||||
|
- Regardez la vidéo de promotion: https://youtu.be/xoljVpty_Kw
|
||||||
|
|
||||||
|
<br /><br /><br />
|
||||||
|
|
||||||
|
## 🏁 Commencer
|
||||||
|
|
||||||
|
<img src="https://res.cloudinary.com/daog6scxm/image/upload/v1634808888/logo/deploy_npl9za.png" />
|
||||||
|
|
||||||
|
Déployez Budibase en auto-hébergement dans votre infrastructure existante, en utilisant Docker, Kubernetes et Digital Ocean.
|
||||||
|
Ou utilisez Budibase Cloud si vous n'avez pas besoin de vous auto-héberger, et que vous souhaitez démarrer rapidement.
|
||||||
|
|
||||||
|
### [Commencer avec Budibase](https://budibase.com)
|
||||||
|
|
||||||
|
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
## 🎓 Apprendre Budibase
|
||||||
|
|
||||||
|
La documentation Budibase [est ic](https://docs.budibase.com).
|
||||||
|
<br />
|
||||||
|
|
||||||
|
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
## 💬 Communauté
|
||||||
|
|
||||||
|
Si vous avez une question ou si vous souhaitez discuter avec d'autres utilisateurs de Budibase et rejoindre notre communauté, veuillez vous rendre à l'adresse suivante : [Discussions Github](https://github.com/Budibase/budibase/discussions)
|
||||||
|
|
||||||
|
<br /><br /><br />
|
||||||
|
|
||||||
|
|
||||||
|
## ❗ Code de conduite
|
||||||
|
|
||||||
|
Budibase s'engage à offrir à chacun une expérience accueillante, diversifiée et exempte de harcèlement. Nous attendons de tous les membres de la communauté Budibase qu'ils se conforment aux principes de notre [**Code de conduite**](https://github.com/Budibase/budibase/blob/HEAD/.github/CODE_OF_CONDUCT.md). Merci de le lire.
|
||||||
|
<br />
|
||||||
|
|
||||||
|
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
|
||||||
|
## 🙌 Contribuer à Budibase
|
||||||
|
|
||||||
|
Qu'il s'agisse d'ouvrir un rapport de bug ou de créer une Pull request, toute contribution est appréciée et bienvenue. Si vous envisagez de mettre en œuvre une nouvelle fonctionnalité ou de modifier l'API, veuillez d'abord créer un Issue. Nous pourrons ainsi nous assurer que votre travail n'est pas vain.
|
||||||
|
|
||||||
|
### Vous ne savez pas par où commencer ?
|
||||||
|
Un bon endroit pour commencer à contribuer, c'est ici : [Projets en cours](https://github.com/Budibase/budibase/projects/22).
|
||||||
|
|
||||||
|
### Comment le repo est-il organisé ?
|
||||||
|
Budibase est une monorepo gérée par lerna. Lerna gère la construction et la publication des paquets de Budibase. Voici, à un haut niveau, les paquets qui composent Budibase.
|
||||||
|
|
||||||
|
- [packages/builder](https://github.com/Budibase/budibase/tree/HEAD/packages/builder) - contient le code pour l'application svelte côté client du budibase builder.
|
||||||
|
|
||||||
|
- [packages/client](https://github.com/Budibase/budibase/tree/HEAD/packages/client) - Un module qui s'exécute dans le navigateur et qui est chargé de lire les définitions JSON et de créer des applications web vivantes à partir de celles-ci..
|
||||||
|
|
||||||
|
- [packages/server](https://github.com/Budibase/budibase/tree/HEAD/packages/server) - Le serveur budibase. Cette application Koa est responsable de servir le JS pour les applications builder et budibase, ainsi que de fournir l'API pour l'interaction avec la base de données et le système de fichiers.
|
||||||
|
|
||||||
|
Pour plus d'informations, voir [CONTRIBUTING.md](https://github.com/Budibase/budibase/blob/HEAD/.github/CONTRIBUTING.md)
|
||||||
|
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
|
||||||
|
## 📝 Licence
|
||||||
|
|
||||||
|
Budibase est open source, sous licence de [GPL v3](https://www.gnu.org/licenses/gpl-3.0.en.html). Les bibliothèques du client et des composants sont sous licence [MPL](https://directory.fsf.org/wiki/License:MPL-2.0) - afin que les applications que vous créez puissent être utilisées sous licence comme vous le souhaitez.
|
||||||
|
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
## ⭐ Stargazers dans le temps
|
||||||
|
|
||||||
|
[![Stargazers dans le temps](https://starchart.cc/Budibase/budibase.svg)](https://starchart.cc/Budibase/budibase)
|
||||||
|
|
||||||
|
Si vous rencontrez des problèmes entre les mises à jour du builder, veuillez utiliser le guide suivant [ici](https://github.com/Budibase/budibase/blob/HEAD/.github/CONTRIBUTING.md#troubleshooting) pour nettoyer votre environnement.
|
||||||
|
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
## Contributeurs ✨
|
||||||
|
|
||||||
|
Merci à ces personnes merveilleuses ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
|
||||||
|
|
||||||
|
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
||||||
|
<!-- prettier-ignore-start -->
|
||||||
|
<!-- markdownlint-disable -->
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="http://martinmck.com"><img src="https://avatars1.githubusercontent.com/u/11256663?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Martin McKeaveney</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=shogunpurple" title="Code">💻</a> <a href="https://github.com/Budibase/budibase/commits?author=shogunpurple" title="Documentation">📖</a> <a href="https://github.com/Budibase/budibase/commits?author=shogunpurple" title="Tests">⚠️</a> <a href="#infra-shogunpurple" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||||
|
<td align="center"><a href="http://www.michaeldrury.co.uk/"><img src="https://avatars2.githubusercontent.com/u/4407001?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Michael Drury</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=mike12345567" title="Documentation">📖</a> <a href="https://github.com/Budibase/budibase/commits?author=mike12345567" title="Code">💻</a> <a href="https://github.com/Budibase/budibase/commits?author=mike12345567" title="Tests">⚠️</a> <a href="#infra-mike12345567" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/aptkingston"><img src="https://avatars3.githubusercontent.com/u/9075550?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Andrew Kingston</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=aptkingston" title="Documentation">📖</a> <a href="https://github.com/Budibase/budibase/commits?author=aptkingston" title="Code">💻</a> <a href="https://github.com/Budibase/budibase/commits?author=aptkingston" title="Tests">⚠️</a> <a href="#design-aptkingston" title="Design">🎨</a></td>
|
||||||
|
<td align="center"><a href="https://budibase.com/"><img src="https://avatars3.githubusercontent.com/u/3524181?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Michael Shanks</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=mjashanks" title="Documentation">📖</a> <a href="https://github.com/Budibase/budibase/commits?author=mjashanks" title="Code">💻</a> <a href="https://github.com/Budibase/budibase/commits?author=mjashanks" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/kevmodrome"><img src="https://avatars3.githubusercontent.com/u/534488?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Kevin Åberg Kultalahti</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=kevmodrome" title="Documentation">📖</a> <a href="https://github.com/Budibase/budibase/commits?author=kevmodrome" title="Code">💻</a> <a href="https://github.com/Budibase/budibase/commits?author=kevmodrome" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center"><a href="https://www.budibase.com/"><img src="https://avatars2.githubusercontent.com/u/49767913?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Joe</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=joebudi" title="Documentation">📖</a> <a href="https://github.com/Budibase/budibase/commits?author=joebudi" title="Code">💻</a> <a href="#content-joebudi" title="Content">🖋</a> <a href="#design-joebudi" title="Design">🎨</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/Rory-Powell"><img src="https://avatars.githubusercontent.com/u/8755148?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Rory Powell</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=Rory-Powell" title="Code">💻</a> <a href="https://github.com/Budibase/budibase/commits?author=Rory-Powell" title="Documentation">📖</a> <a href="https://github.com/Budibase/budibase/commits?author=Rory-Powell" title="Tests">⚠️</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/PClmnt"><img src="https://avatars.githubusercontent.com/u/5665926?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Peter Clement</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=PClmnt" title="Code">💻</a> <a href="https://github.com/Budibase/budibase/commits?author=PClmnt" title="Documentation">📖</a> <a href="https://github.com/Budibase/budibase/commits?author=PClmnt" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/Conor-Mack"><img src="https://avatars1.githubusercontent.com/u/36074859?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Conor_Mack</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=Conor-Mack" title="Code">💻</a> <a href="https://github.com/Budibase/budibase/commits?author=Conor-Mack" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/pngwn"><img src="https://avatars1.githubusercontent.com/u/12937446?v=4?s=100" width="100px;" alt=""/><br /><sub><b>pngwn</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=pngwn" title="Code">💻</a> <a href="https://github.com/Budibase/budibase/commits?author=pngwn" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/HugoLd"><img src="https://avatars0.githubusercontent.com/u/26521848?v=4?s=100" width="100px;" alt=""/><br /><sub><b>HugoLd</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=HugoLd" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/victoriasloan"><img src="https://avatars.githubusercontent.com/u/9913651?v=4?s=100" width="100px;" alt=""/><br /><sub><b>victoriasloan</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=victoriasloan" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/yashank09"><img src="https://avatars.githubusercontent.com/u/37672190?v=4?s=100" width="100px;" alt=""/><br /><sub><b>yashank09</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=yashank09" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/SOVLOOKUP"><img src="https://avatars.githubusercontent.com/u/53158137?v=4?s=100" width="100px;" alt=""/><br /><sub><b>SOVLOOKUP</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=SOVLOOKUP" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/seoulaja"><img src="https://avatars.githubusercontent.com/u/15101654?v=4?s=100" width="100px;" alt=""/><br /><sub><b>seoulaja</b></sub></a><br /><a href="#translation-seoulaja" title="Translation">🌍</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/mslourens"><img src="https://avatars.githubusercontent.com/u/1907152?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Maurits Lourens</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=mslourens" title="Tests">⚠️</a> <a href="https://github.com/Budibase/budibase/commits?author=mslourens" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/Rory-Powell"><img src="https://avatars.githubusercontent.com/u/8755148?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Rory Powell</b></sub></a><br /><a href="#infra-Rory-Powell" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/Budibase/budibase/commits?author=Rory-Powell" title="Tests">⚠️</a> <a href="https://github.com/Budibase/budibase/commits?author=Rory-Powell" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<!-- markdownlint-restore -->
|
||||||
|
<!-- prettier-ignore-end -->
|
||||||
|
|
||||||
|
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||||
|
|
||||||
|
Ce projet suit la spécification [all-contributors](https://allcontributors.org/docs/fr/overview). Les contributions de toute nature sont les bienvenues !
|
|
@ -0,0 +1,214 @@
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://www.budibase.com">
|
||||||
|
<img alt="Budibase" src="https://d33wubrfki0l68.cloudfront.net/aac32159d7207b5085e74a7ef67afbb7027786c5/2b1fd/img/logo/bb-emblem.svg" width="60" />
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
<h1 align="center">
|
||||||
|
Budibase
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<h3 align="center">
|
||||||
|
使って楽しいローコードプラットフォーム
|
||||||
|
</h3>
|
||||||
|
<p align="center">
|
||||||
|
Budibaseはオープンソースのローコードプラットフォームで、生産性を向上させるツールを簡単に構築することができます。
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3 align="center">
|
||||||
|
🤖 🎨 🚀
|
||||||
|
</h3>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img alt="Budibase design ui" src="https://res.cloudinary.com/daog6scxm/image/upload/v1633524049/ui/design-ui-wide-mobile_gdaveq.jpg">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://github.com/Budibase/budibase/releases">
|
||||||
|
<img alt="GitHub all releases" src="https://img.shields.io/github/downloads/Budibase/budibase/total">
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/Budibase/budibase/releases">
|
||||||
|
<img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Budibase/budibase">
|
||||||
|
</a>
|
||||||
|
<a href="https://twitter.com/intent/follow?screen_name=budibase">
|
||||||
|
<img src="https://img.shields.io/twitter/follow/budibase?style=social" alt="Follow @budibase" />
|
||||||
|
</a>
|
||||||
|
<img src="https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg" alt="Code of conduct" />
|
||||||
|
<a href="https://codecov.io/gh/Budibase/budibase">
|
||||||
|
<img src="https://codecov.io/gh/Budibase/budibase/graph/badge.svg?token=E8W2ZFXQOH"/>
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3 align="center">
|
||||||
|
<a href="https://docs.budibase.com/getting-started">はじめに</a>
|
||||||
|
<span> · </span>
|
||||||
|
<a href="https://docs.budibase.com">ドキュメント</a>
|
||||||
|
<span> · </span>
|
||||||
|
<a href="https://github.com/Budibase/budibase/discussions?discussions_q=category%3AIdeas">機能リクエスト</a>
|
||||||
|
<span> · </span>
|
||||||
|
<a href="https://github.com/Budibase/budibase/issues">バグ報告</a>
|
||||||
|
<span> · </span>
|
||||||
|
サポート: <a href="https://github.com/Budibase/budibase/discussions">ディスカッション</a>
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<br /><br />
|
||||||
|
## ✨ 特徴
|
||||||
|
|
||||||
|
### "本物"のソフトウェアを構築できます
|
||||||
|
ほかのプラットフォームとは違い、Budibaseだけでシングルページのアプリケーションを制作し完成させることができます。Budibaseで作られたアプリケーションは素晴らしいパフォーマンスを持っており、レスポンシブデザインにも対応しています。ユーザー達にいい印象を与えること間違いなしでしょう!
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
### 拡張性が高くオープンソース
|
||||||
|
Budibaseはオープンソースで、GPL v3ライセンスの下に公開されています。このことは、Budibaseが常にあなたのそばにいるという安心感を与えてくれることでしょう。そして、私たちは開発者に優しい環境を提供しているので、あなたは好きなだけにソースコードをフォークして改造、もしくは直接Budibaseにコントリビュートすることができます。
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
### 既存のデータ、もしくは一から始める
|
||||||
|
Budibaseはいろんなツールから既存のデータを使用できます。たとえばMongoDB、CouchDB、 PostgreSQL、MySQL、Airtable、S3、DynamoDB、REST APIなど。ほかのプラットフォームにない特徴として、Budibaseはデータなしの状態でビジネスアプリケーションの構築を一から始めることができます。 [新しいデータリソースをリクエスト](https://github.com/Budibase/budibase/discussions?discussions_q=category%3AIdeas)。
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img alt="Budibase data" src="https://res.cloudinary.com/daog6scxm/image/upload/v1636970242/Out%20of%20beta%20launch/data_n1tlhf.png">
|
||||||
|
</p>
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
### パワフルな内蔵コンポーネントでアプリケーションを設計し構築
|
||||||
|
|
||||||
|
Budibaseには、美しくデザインされた強力なコンポーネントが付属しており、それら使用しUIを簡単に構築することができます。また、CSSによるスタイリングオプションも豊富に用意されているので、よりクリエイティブな表現もも可能です。
|
||||||
|
[Request new component](https://github.com/Budibase/budibase/discussions?discussions_q=category%3AIdeas)。
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img alt="Budibase design" src="https://res.cloudinary.com/daog6scxm/image/upload/v1636970243/Out%20of%20beta%20launch/design-like-a-pro_qhlfeu.gif">
|
||||||
|
</p>
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
### プロセスを自動化し、ほかのツールと連携し、Webhookをでつながる!
|
||||||
|
定型化した作業を自動化して時間を節約しましょう。Webhookに接続、Eメールの自動送信など、すべてBudibaseに任せましょう。 こちらで簡単に [新しいオートメーションを作る](https://github.com/Budibase/automations)または[新しいオートメーションをリクエストすることができます](https://github.com/Budibase/budibase/discussions?discussions_q=category%3AIdeas)。
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img alt="Budibase automations" src="https://res.cloudinary.com/daog6scxm/image/upload/v1636970486/Out%20of%20beta%20launch/automation_riro7u.png">
|
||||||
|
</p>
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
### 使い親しんだツールとの統合
|
||||||
|
Budibaseは多くの人気ツールと統合されており、あなたのニーズに合わせたパーフェクトなアプリケーションを構築することができます。
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img alt="Budibase integrations" src="https://res.cloudinary.com/daog6scxm/image/upload/v1636970242/Out%20of%20beta%20launch/integrations_kc7dqt.png">
|
||||||
|
</p>
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
### 管理者のパラダイス
|
||||||
|
Budibaseはどんな規模のプロジェクトにも柔軟に対応できます。Budibaseを使えば、個人または組織のサーバーでセルフホスティングし、ユーザー、オンボーディング、SMTP、アプリ、グループ、テーマなどをひとまとめに管理することが可能です。また、ユーザーやグループにアプリポータルを提供し、グループ管理者にユーザー管理を委ねることも可能です。
|
||||||
|
- プロモーションビデオを視聴する: https://youtu.be/xoljVpty_Kw
|
||||||
|
|
||||||
|
<br /><br /><br />
|
||||||
|
|
||||||
|
## 🏁 始めましょう
|
||||||
|
|
||||||
|
<a href="https://docs.budibase.com/self-hosting/self-host"><img src="https://res.cloudinary.com/daog6scxm/image/upload/v1634808888/logo/deploy_npl9za.png" /></a>
|
||||||
|
|
||||||
|
Docker、KubernetesもしくはDegital Oceanを使用しセルフホスティングするか、セルフホスティングに困難がある、もしくは今すぐ開始したい場合はBudibase Cloudを使用しすぐに始めましょう。
|
||||||
|
|
||||||
|
### [Budibaseをセルフホスティングする](https://docs.budibase.com/self-hosting/self-host)
|
||||||
|
|
||||||
|
### [Budibase Cloudを使用する](https://budibase.com)
|
||||||
|
|
||||||
|
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
## 🎓 Budibaseを学ぶ
|
||||||
|
|
||||||
|
Budibaseのドキュメント[はここです](https://docs.budibase.com)。
|
||||||
|
<br />
|
||||||
|
|
||||||
|
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
## 💬 コミュニティ
|
||||||
|
|
||||||
|
もし何か問題がある、もしくはBudibaseコミュニティのほかのユーザーと交流したいのであれば私たちの[Github discussions](https://github.com/Budibase/budibase/discussions)までお越しください。
|
||||||
|
|
||||||
|
<br /><br /><br />
|
||||||
|
|
||||||
|
|
||||||
|
## ❗ 行動規範
|
||||||
|
|
||||||
|
Budibase は、すべての人を歓迎し、多様で、ハラスメントのない環境を提供することに尽力しています。Budibase コミュニティに参加するすべての人たちが私たちの[**行動規範**](https://github.com/Budibase/budibase/blob/HEAD/.github/CODE_OF_CONDUCT.md)を遵守していただくことお願いします。必ず読んでください。
|
||||||
|
<br />
|
||||||
|
|
||||||
|
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
|
||||||
|
## 🙌 Budibaseにコントリビュート
|
||||||
|
|
||||||
|
|
||||||
|
バグレポートからプルリクエストの作成まで、すべての貢献は感謝、そして歓迎されております。新しい新機能の実装やAPIの変更を計画している場合は、まずIssueを作成してください。これであなたの貴重な考えは私たちにも伝わり、無駄とはなりません。
|
||||||
|
|
||||||
|
### どこから始めるか混乱していますか?
|
||||||
|
ここはコントリビュートをはじめるための最適な場所です! [First time issues project](https://github.com/Budibase/budibase/projects/22).
|
||||||
|
|
||||||
|
### リポジトリの構成
|
||||||
|
Budibaseは、lernaによってmonorepo方式で管理されています。budibase パッケージのビルドと公開はlernaによって管理されています。Budibaseを構成するパッケージは以下の通り:
|
||||||
|
|
||||||
|
- [packages/builder](https://github.com/Budibase/budibase/tree/HEAD/packages/builder) - budibase builder クライアントサイドのsvelteアプリケーションのコードが含まれています。
|
||||||
|
|
||||||
|
- [packages/client](https://github.com/Budibase/budibase/tree/HEAD/packages/client) - ブラウザ上で動作するモジュールで、JSONの定義を読み取り、そこから"生きている"Webアプリケーションを作成します。
|
||||||
|
|
||||||
|
- [packages/server](https://github.com/Budibase/budibase/tree/HEAD/packages/server) - budibaseのサーバーです。この Koa アプリは、builder アプリと budibase アプリの JS を提供し、データベースとファイル システムと対話するための API を提供する役割を担っています。
|
||||||
|
|
||||||
|
詳しくは[CONTRIBUTING.md](https://github.com/Budibase/budibase/blob/HEAD/.github/CONTRIBUTING.md)をご覧ください。
|
||||||
|
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
|
||||||
|
## 📝 ライセンス
|
||||||
|
|
||||||
|
Budibase はオープンソースであり、[GPL v3](https://www.gnu.org/licenses/gpl-3.0.en.html)ライセンスの下に公開されています。クライアントとコンポーネントライブラリは [MPL](https://directory.fsf.org/wiki/License:MPL-2.0)で公開されています - ですから、あなたが制作したアプリケーションはどのようなライセンスでも公開することができます。
|
||||||
|
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
## ⭐ スター数の履歴
|
||||||
|
|
||||||
|
[![Stargazers over time](https://starchart.cc/Budibase/budibase.svg)](https://starchart.cc/Budibase/budibase)
|
||||||
|
|
||||||
|
ビルダーのアップデートの間に問題が発生する場合は[ここ](https://github.com/Budibase/budibase/blob/HEAD/.github/CONTRIBUTING.md#troubleshooting)を参考に環境をクリアにしてください。
|
||||||
|
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
## Contributors ✨
|
||||||
|
|
||||||
|
すばらしい皆さまに感謝しかありません。([emoji key](https://allcontributors.org/docs/en/emoji-key)):
|
||||||
|
|
||||||
|
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
||||||
|
<!-- prettier-ignore-start -->
|
||||||
|
<!-- markdownlint-disable -->
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="http://martinmck.com"><img src="https://avatars1.githubusercontent.com/u/11256663?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Martin McKeaveney</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=shogunpurple" title="Code">💻</a> <a href="https://github.com/Budibase/budibase/commits?author=shogunpurple" title="Documentation">📖</a> <a href="https://github.com/Budibase/budibase/commits?author=shogunpurple" title="Tests">⚠️</a> <a href="#infra-shogunpurple" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||||
|
<td align="center"><a href="http://www.michaeldrury.co.uk/"><img src="https://avatars2.githubusercontent.com/u/4407001?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Michael Drury</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=mike12345567" title="Documentation">📖</a> <a href="https://github.com/Budibase/budibase/commits?author=mike12345567" title="Code">💻</a> <a href="https://github.com/Budibase/budibase/commits?author=mike12345567" title="Tests">⚠️</a> <a href="#infra-mike12345567" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/aptkingston"><img src="https://avatars3.githubusercontent.com/u/9075550?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Andrew Kingston</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=aptkingston" title="Documentation">📖</a> <a href="https://github.com/Budibase/budibase/commits?author=aptkingston" title="Code">💻</a> <a href="https://github.com/Budibase/budibase/commits?author=aptkingston" title="Tests">⚠️</a> <a href="#design-aptkingston" title="Design">🎨</a></td>
|
||||||
|
<td align="center"><a href="https://budibase.com/"><img src="https://avatars3.githubusercontent.com/u/3524181?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Michael Shanks</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=mjashanks" title="Documentation">📖</a> <a href="https://github.com/Budibase/budibase/commits?author=mjashanks" title="Code">💻</a> <a href="https://github.com/Budibase/budibase/commits?author=mjashanks" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/kevmodrome"><img src="https://avatars3.githubusercontent.com/u/534488?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Kevin Åberg Kultalahti</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=kevmodrome" title="Documentation">📖</a> <a href="https://github.com/Budibase/budibase/commits?author=kevmodrome" title="Code">💻</a> <a href="https://github.com/Budibase/budibase/commits?author=kevmodrome" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center"><a href="https://www.budibase.com/"><img src="https://avatars2.githubusercontent.com/u/49767913?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Joe</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=joebudi" title="Documentation">📖</a> <a href="https://github.com/Budibase/budibase/commits?author=joebudi" title="Code">💻</a> <a href="#content-joebudi" title="Content">🖋</a> <a href="#design-joebudi" title="Design">🎨</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/Rory-Powell"><img src="https://avatars.githubusercontent.com/u/8755148?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Rory Powell</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=Rory-Powell" title="Code">💻</a> <a href="https://github.com/Budibase/budibase/commits?author=Rory-Powell" title="Documentation">📖</a> <a href="https://github.com/Budibase/budibase/commits?author=Rory-Powell" title="Tests">⚠️</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/PClmnt"><img src="https://avatars.githubusercontent.com/u/5665926?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Peter Clement</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=PClmnt" title="Code">💻</a> <a href="https://github.com/Budibase/budibase/commits?author=PClmnt" title="Documentation">📖</a> <a href="https://github.com/Budibase/budibase/commits?author=PClmnt" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/Conor-Mack"><img src="https://avatars1.githubusercontent.com/u/36074859?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Conor_Mack</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=Conor-Mack" title="Code">💻</a> <a href="https://github.com/Budibase/budibase/commits?author=Conor-Mack" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/pngwn"><img src="https://avatars1.githubusercontent.com/u/12937446?v=4?s=100" width="100px;" alt=""/><br /><sub><b>pngwn</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=pngwn" title="Code">💻</a> <a href="https://github.com/Budibase/budibase/commits?author=pngwn" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/HugoLd"><img src="https://avatars0.githubusercontent.com/u/26521848?v=4?s=100" width="100px;" alt=""/><br /><sub><b>HugoLd</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=HugoLd" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/victoriasloan"><img src="https://avatars.githubusercontent.com/u/9913651?v=4?s=100" width="100px;" alt=""/><br /><sub><b>victoriasloan</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=victoriasloan" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/yashank09"><img src="https://avatars.githubusercontent.com/u/37672190?v=4?s=100" width="100px;" alt=""/><br /><sub><b>yashank09</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=yashank09" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/SOVLOOKUP"><img src="https://avatars.githubusercontent.com/u/53158137?v=4?s=100" width="100px;" alt=""/><br /><sub><b>SOVLOOKUP</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=SOVLOOKUP" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/seoulaja"><img src="https://avatars.githubusercontent.com/u/15101654?v=4?s=100" width="100px;" alt=""/><br /><sub><b>seoulaja</b></sub></a><br /><a href="#translation-seoulaja" title="Translation">🌍</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/mslourens"><img src="https://avatars.githubusercontent.com/u/1907152?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Maurits Lourens</b></sub></a><br /><a href="https://github.com/Budibase/budibase/commits?author=mslourens" title="Tests">⚠️</a> <a href="https://github.com/Budibase/budibase/commits?author=mslourens" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<!-- markdownlint-restore -->
|
||||||
|
<!-- prettier-ignore-end -->
|
||||||
|
|
||||||
|
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||||
|
|
||||||
|
このプロジェクトは、[all-contributors](https://github.com/all-contributors/all-contributors)仕様に準拠しています。どのような貢献でも歓迎します。
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
apiVersion: v1
|
||||||
|
entries: {}
|
||||||
|
generated: "2021-12-13T12:46:40.291206+01:00"
|
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
"version": "0.9.190-alpha.3",
|
"version": "1.0.76-alpha.3",
|
||||||
"npmClient": "yarn",
|
"npmClient": "yarn",
|
||||||
"packages": [
|
"packages": [
|
||||||
"packages/*"
|
"packages/*"
|
||||||
|
|
21
package.json
21
package.json
|
@ -8,6 +8,7 @@
|
||||||
"eslint-plugin-cypress": "^2.11.3",
|
"eslint-plugin-cypress": "^2.11.3",
|
||||||
"eslint-plugin-svelte3": "^3.2.0",
|
"eslint-plugin-svelte3": "^3.2.0",
|
||||||
"husky": "^7.0.1",
|
"husky": "^7.0.1",
|
||||||
|
"js-yaml": "^4.1.0",
|
||||||
"kill-port": "^1.6.1",
|
"kill-port": "^1.6.1",
|
||||||
"lerna": "3.14.1",
|
"lerna": "3.14.1",
|
||||||
"prettier": "^2.3.1",
|
"prettier": "^2.3.1",
|
||||||
|
@ -22,8 +23,8 @@
|
||||||
"build": "lerna run build",
|
"build": "lerna run build",
|
||||||
"publishdev": "lerna run publishdev",
|
"publishdev": "lerna run publishdev",
|
||||||
"publishnpm": "yarn build && lerna publish --force-publish",
|
"publishnpm": "yarn build && lerna publish --force-publish",
|
||||||
"release": "yarn build && lerna publish patch --yes --force-publish",
|
"release": "lerna publish patch --yes --force-publish",
|
||||||
"release:develop": "yarn build && lerna publish prerelease --yes --force-publish --dist-tag develop",
|
"release:develop": "lerna publish prerelease --yes --force-publish --dist-tag develop",
|
||||||
"restore": "yarn run clean && yarn run bootstrap && yarn run build",
|
"restore": "yarn run clean && yarn run bootstrap && yarn run build",
|
||||||
"nuke": "yarn run nuke:packages && yarn run nuke:docker",
|
"nuke": "yarn run nuke:packages && yarn run nuke:docker",
|
||||||
"nuke:packages": "yarn run restore",
|
"nuke:packages": "yarn run restore",
|
||||||
|
@ -35,19 +36,25 @@
|
||||||
"dev:server": "lerna run --parallel dev:builder --concurrency 1 --scope @budibase/worker --scope @budibase/server",
|
"dev:server": "lerna run --parallel dev:builder --concurrency 1 --scope @budibase/worker --scope @budibase/server",
|
||||||
"test": "lerna run test",
|
"test": "lerna run test",
|
||||||
"lint:eslint": "eslint packages",
|
"lint:eslint": "eslint packages",
|
||||||
"lint:prettier": "prettier --check \"packages/**/*.{js,svelte}\"",
|
"lint:prettier": "prettier --check \"packages/**/*.{js,ts,svelte}\"",
|
||||||
"lint": "yarn run lint:eslint && yarn run lint:prettier",
|
"lint": "yarn run lint:eslint && yarn run lint:prettier",
|
||||||
"lint:fix:eslint": "eslint --fix packages",
|
"lint:fix:eslint": "eslint --fix packages",
|
||||||
"lint:fix:prettier": "prettier --write \"packages/**/*.{js,svelte}\"",
|
"lint:fix:prettier": "prettier --write \"packages/**/*.{js,ts,svelte}\"",
|
||||||
"lint:fix:ts": "lerna run lint:fix",
|
"lint:fix:ts": "lerna run lint:fix",
|
||||||
"lint:fix": "yarn run lint:fix:ts && yarn run lint:fix:prettier && yarn run lint:fix:eslint",
|
"lint:fix": "yarn run lint:fix:ts && yarn run lint:fix:prettier && yarn run lint:fix:eslint",
|
||||||
"test:e2e": "lerna run cy:test",
|
"test:e2e": "lerna run cy:test",
|
||||||
"test:e2e:ci": "lerna run cy:ci",
|
"test:e2e:ci": "lerna run cy:ci",
|
||||||
"build:docker": "lerna run build:docker && cd hosting/scripts/linux/ && ./release-to-docker-hub.sh $BUDIBASE_RELEASE_VERSION && cd -",
|
"build:docker": "lerna run build:docker && npm run build:docker:proxy:compose && cd hosting/scripts/linux/ && ./release-to-docker-hub.sh $BUDIBASE_RELEASE_VERSION && cd -",
|
||||||
|
"build:docker:proxy": "docker build hosting/proxy -t proxy-service",
|
||||||
|
"build:docker:proxy:compose": "lerna run generate:proxy:compose && npm run build:docker:proxy",
|
||||||
|
"build:docker:proxy:preprod": "lerna run generate:proxy:preprod && npm run build:docker:proxy",
|
||||||
|
"build:docker:proxy:prod": "lerna run generate:proxy:prod && npm run build:docker:proxy",
|
||||||
"build:docker:selfhost": "lerna run build:docker && cd hosting/scripts/linux/ && ./release-to-docker-hub.sh latest && cd -",
|
"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:develop": "node scripts/pinVersions && lerna run build:docker && npm run build:docker:proxy:compose && cd hosting/scripts/linux/ && ./release-to-docker-hub.sh develop && cd -",
|
||||||
"build:docker:airgap": "node hosting/scripts/airgapped/airgappedDockerBuild",
|
"build:docker:airgap": "node hosting/scripts/airgapped/airgappedDockerBuild",
|
||||||
"release:helm": "./scripts/release_helm_chart.sh",
|
"build:digitalocean": "cd hosting/digitalocean && ./build.sh && cd -",
|
||||||
|
"build:docs": "lerna run build:docs",
|
||||||
|
"release:helm": "node scripts/releaseHelmChart",
|
||||||
"env:multi:enable": "lerna run env:multi:enable",
|
"env:multi:enable": "lerna run env:multi:enable",
|
||||||
"env:multi:disable": "lerna run env:multi:disable",
|
"env:multi:disable": "lerna run env:multi:disable",
|
||||||
"env:selfhost:enable": "lerna run env:selfhost:enable",
|
"env:selfhost:enable": "lerna run env:selfhost:enable",
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
module.exports = require("./src/tenancy/deprovision")
|
|
|
@ -1,61 +0,0 @@
|
||||||
const { DocumentTypes } = require("../db/constants")
|
|
||||||
const { getGlobalDB } = require("../tenancy")
|
|
||||||
|
|
||||||
exports.MIGRATION_DBS = {
|
|
||||||
GLOBAL_DB: "GLOBAL_DB",
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.MIGRATIONS = {
|
|
||||||
USER_EMAIL_VIEW_CASING: "user_email_view_casing",
|
|
||||||
}
|
|
||||||
|
|
||||||
const DB_LOOKUP = {
|
|
||||||
[exports.MIGRATION_DBS.GLOBAL_DB]: [
|
|
||||||
exports.MIGRATIONS.USER_EMAIL_VIEW_CASING,
|
|
||||||
],
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.getMigrationsDoc = async db => {
|
|
||||||
// get the migrations doc
|
|
||||||
try {
|
|
||||||
return await db.get(DocumentTypes.MIGRATIONS)
|
|
||||||
} catch (err) {
|
|
||||||
if (err.status && err.status === 404) {
|
|
||||||
return { _id: DocumentTypes.MIGRATIONS }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.migrateIfRequired = async (migrationDb, migrationName, migrateFn) => {
|
|
||||||
try {
|
|
||||||
let db
|
|
||||||
if (migrationDb === exports.MIGRATION_DBS.GLOBAL_DB) {
|
|
||||||
db = getGlobalDB()
|
|
||||||
} else {
|
|
||||||
throw new Error(`Unrecognised migration db [${migrationDb}]`)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!DB_LOOKUP[migrationDb].includes(migrationName)) {
|
|
||||||
throw new Error(
|
|
||||||
`Unrecognised migration name [${migrationName}] for db [${migrationDb}]`
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
const doc = await exports.getMigrationsDoc(db)
|
|
||||||
// exit if the migration has been performed
|
|
||||||
if (doc[migrationName]) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log(`Performing migration: ${migrationName}`)
|
|
||||||
await migrateFn()
|
|
||||||
console.log(`Migration complete: ${migrationName}`)
|
|
||||||
|
|
||||||
// mark as complete
|
|
||||||
doc[migrationName] = Date.now()
|
|
||||||
await db.put(doc)
|
|
||||||
} catch (err) {
|
|
||||||
console.error(`Error performing migration: ${migrationName}: `, err)
|
|
||||||
throw err
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,60 +0,0 @@
|
||||||
require("../../tests/utilities/dbConfig")
|
|
||||||
|
|
||||||
const { migrateIfRequired, MIGRATION_DBS, MIGRATIONS, getMigrationsDoc } = require("../index")
|
|
||||||
const database = require("../../db")
|
|
||||||
const {
|
|
||||||
StaticDatabases,
|
|
||||||
} = require("../../db/utils")
|
|
||||||
|
|
||||||
Date.now = jest.fn(() => 1487076708000)
|
|
||||||
let db
|
|
||||||
|
|
||||||
describe("migrations", () => {
|
|
||||||
|
|
||||||
const migrationFunction = jest.fn()
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
db = database.getDB(StaticDatabases.GLOBAL.name)
|
|
||||||
})
|
|
||||||
|
|
||||||
afterEach(async () => {
|
|
||||||
jest.clearAllMocks()
|
|
||||||
await db.destroy()
|
|
||||||
})
|
|
||||||
|
|
||||||
const validMigration = () => {
|
|
||||||
return migrateIfRequired(MIGRATION_DBS.GLOBAL_DB, MIGRATIONS.USER_EMAIL_VIEW_CASING, migrationFunction)
|
|
||||||
}
|
|
||||||
|
|
||||||
it("should run a new migration", async () => {
|
|
||||||
await validMigration()
|
|
||||||
expect(migrationFunction).toHaveBeenCalled()
|
|
||||||
})
|
|
||||||
|
|
||||||
it("should match snapshot", async () => {
|
|
||||||
await validMigration()
|
|
||||||
const doc = await getMigrationsDoc(db)
|
|
||||||
expect(doc).toMatchSnapshot()
|
|
||||||
})
|
|
||||||
|
|
||||||
it("should skip a previously run migration", async () => {
|
|
||||||
await validMigration()
|
|
||||||
await validMigration()
|
|
||||||
expect(migrationFunction).toHaveBeenCalledTimes(1)
|
|
||||||
})
|
|
||||||
|
|
||||||
it("should reject an unknown migration name", async () => {
|
|
||||||
expect(async () => {
|
|
||||||
await migrateIfRequired(MIGRATION_DBS.GLOBAL_DB, "bogus_name", migrationFunction)
|
|
||||||
}).rejects.toThrow()
|
|
||||||
expect(migrationFunction).not.toHaveBeenCalled()
|
|
||||||
})
|
|
||||||
|
|
||||||
it("should reject an unknown database name", async () => {
|
|
||||||
expect(async () => {
|
|
||||||
await migrateIfRequired("bogus_db", MIGRATIONS.USER_EMAIL_VIEW_CASING, migrationFunction)
|
|
||||||
}).rejects.toThrow()
|
|
||||||
expect(migrationFunction).not.toHaveBeenCalled()
|
|
||||||
})
|
|
||||||
|
|
||||||
})
|
|
|
@ -1,84 +0,0 @@
|
||||||
const env = require("../environment")
|
|
||||||
const { Headers } = require("../../constants")
|
|
||||||
const cls = require("./FunctionContext")
|
|
||||||
|
|
||||||
exports.DEFAULT_TENANT_ID = "default"
|
|
||||||
|
|
||||||
exports.isDefaultTenant = () => {
|
|
||||||
return exports.getTenantId() === exports.DEFAULT_TENANT_ID
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.isMultiTenant = () => {
|
|
||||||
return env.MULTI_TENANCY
|
|
||||||
}
|
|
||||||
|
|
||||||
const TENANT_ID = "tenantId"
|
|
||||||
|
|
||||||
// used for automations, API endpoints should always be in context already
|
|
||||||
exports.doInTenant = (tenantId, task) => {
|
|
||||||
return cls.run(() => {
|
|
||||||
// set the tenant id
|
|
||||||
cls.setOnContext(TENANT_ID, tenantId)
|
|
||||||
|
|
||||||
// invoke the task
|
|
||||||
return task()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.updateTenantId = tenantId => {
|
|
||||||
cls.setOnContext(TENANT_ID, tenantId)
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.setTenantId = (
|
|
||||||
ctx,
|
|
||||||
opts = { allowQs: false, allowNoTenant: false }
|
|
||||||
) => {
|
|
||||||
let tenantId
|
|
||||||
// exit early if not multi-tenant
|
|
||||||
if (!exports.isMultiTenant()) {
|
|
||||||
cls.setOnContext(TENANT_ID, this.DEFAULT_TENANT_ID)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const allowQs = opts && opts.allowQs
|
|
||||||
const allowNoTenant = opts && opts.allowNoTenant
|
|
||||||
const header = ctx.request.headers[Headers.TENANT_ID]
|
|
||||||
const user = ctx.user || {}
|
|
||||||
if (allowQs) {
|
|
||||||
const query = ctx.request.query || {}
|
|
||||||
tenantId = query.tenantId
|
|
||||||
}
|
|
||||||
// override query string (if allowed) by user, or header
|
|
||||||
// URL params cannot be used in a middleware, as they are
|
|
||||||
// processed later in the chain
|
|
||||||
tenantId = user.tenantId || header || tenantId
|
|
||||||
|
|
||||||
// Set the tenantId from the subdomain
|
|
||||||
if (!tenantId) {
|
|
||||||
tenantId = ctx.subdomains && ctx.subdomains[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!tenantId && !allowNoTenant) {
|
|
||||||
ctx.throw(403, "Tenant id not set")
|
|
||||||
}
|
|
||||||
// check tenant ID just incase no tenant was allowed
|
|
||||||
if (tenantId) {
|
|
||||||
cls.setOnContext(TENANT_ID, tenantId)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.isTenantIdSet = () => {
|
|
||||||
const tenantId = cls.getFromContext(TENANT_ID)
|
|
||||||
return !!tenantId
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.getTenantId = () => {
|
|
||||||
if (!exports.isMultiTenant()) {
|
|
||||||
return exports.DEFAULT_TENANT_ID
|
|
||||||
}
|
|
||||||
const tenantId = cls.getFromContext(TENANT_ID)
|
|
||||||
if (!tenantId) {
|
|
||||||
throw Error("Tenant id not found")
|
|
||||||
}
|
|
||||||
return tenantId
|
|
||||||
}
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue