Merge branch 'master' into fix-unlink

This commit is contained in:
Jose Diaz-Gonzalez
2021-09-13 00:02:52 -04:00
committed by GitHub
39 changed files with 560 additions and 304 deletions

View File

@@ -1,60 +0,0 @@
version: 2.1
commands:
build:
description: "run the build"
parameters:
python_version:
type: string
default: "3.7.0"
steps:
- checkout
- run: pyenv global << parameters.python_version >>
- run: make setup
- run: sudo sysctl -w vm.max_map_count=262144
- run:
command: |
make generate
if ! git diff --quiet README.md; then
echo "Please run `make generate`"
git status --short
git --no-pager diff README.md
exit 1
fi
- run: make test
- store_artifacts:
path: build
destination: build
- store_artifacts:
path: tmp/test-results
destination: test-results
- store_test_results:
path: tmp/test-results
executors:
machine:
machine:
docker_layer_caching: false
image: ubuntu-1604:201903-01
jobs:
build-master:
environment:
DOKKU_VERSION: master
executor: machine
steps:
- build
build-version:
environment:
DOKKU_VERSION: v0.19.0
executor: machine
steps:
- build
workflows:
version: 2
build:
jobs:
- "build-master"
- "build-version"

24
.devcontainer/20_init_plugin Executable file
View File

@@ -0,0 +1,24 @@
#!/bin/bash
set -eo pipefail
log-info() {
declare desc="Log info formatter"
echo " $*" 1>&2
}
log-fail() {
declare desc="Log fail formatter"
echo "! $*" 1>&2
exit 1
}
main() {
dokku plugin:install
# built in the Dockerfile
PLUGIN_NAME="$(source /tmp/.env && echo "$PLUGIN_NAME")"
PLUGIN_VARIABLE="$(source /tmp/.env && echo "$PLUGIN_VARIABLE")"
echo "export ${PLUGIN_VARIABLE}_HOST_ROOT=${SERVICE_HOST_ROOT}/$PLUGIN_NAME" > /etc/default/dokku
}
main "$@"

26
.devcontainer/Dockerfile Normal file
View File

@@ -0,0 +1,26 @@
FROM dokku/dokku:latest
RUN apt-get update
RUN apt-get install --no-install-recommends -y build-essential file nano && \
apt-get clean autoclean && \
apt-get autoremove --yes && \
rm -rf /var/lib/apt/lists/* && \
mkdir -p /mnt/dokku/home/dokku /mnt/dokku/var/lib/dokku/config /mnt/dokku/var/lib/dokku/data /mnt/dokku/var/lib/dokku/services && \
chown -R dokku:dokku /mnt/dokku/home/dokku /mnt/dokku/var/lib/dokku/config /mnt/dokku/var/lib/dokku/data /mnt/dokku/var/lib/dokku/services && \
echo "dokku.me" > /home/dokku/VHOST
ADD https://raw.githubusercontent.com/dokku/dokku/master/tests/dhparam.pem /mnt/dokku/etc/nginx/dhparam.pem
COPY .devcontainer/20_init_plugin /etc/my_init.d/20_init_plugin
COPY .devcontainer/bin/ /usr/local/bin/
COPY . .
RUN source /tmp/config && \
echo "export ${PLUGIN_DISABLE_PULL_VARIABLE}=true" > /tmp/.env && \
echo "export PLUGIN_NAME=${PLUGIN_COMMAND_PREFIX}" >> /tmp/.env && \
echo "export PLUGIN_VARIABLE=${PLUGIN_VARIABLE}" >> /tmp/.env
RUN source /tmp/.env && \
dokku plugin:install file:///tmp --name $PLUGIN_NAME && \
make ci-dependencies

8
.devcontainer/bin/copy-file Executable file
View File

@@ -0,0 +1,8 @@
#!/usr/bin/env bash
main() {
PLUGIN_NAME="$(source /tmp/.env && echo "$PLUGIN_NAME")"
cp "$1" "/var/lib/dokku/plugins/enabled/$PLUGIN_NAME/$1"
}
main "$@"

View File

@@ -0,0 +1,16 @@
{
"build": {
"dockerfile": "Dockerfile",
"context": ".."
},
"containerEnv": {
"SERVICE_HOST_ROOT": "${localWorkspaceFolder}/tmp/data"
},
"initializeCommand": ["mkdir", "-p", "tmp/data"],
"mounts": [
"source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind",
"source=${localWorkspaceFolder}/tmp/data/,target=/var/lib/dokku/services/,type=bind"
],
"overrideCommand": false,
"runArgs": ["--init"]
}

6
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,6 @@
version: 2
updates:
- package-ecosystem: "docker"
directory: "/"
schedule:
interval: "daily"

100
.github/workflows/ci.yml vendored Normal file
View File

@@ -0,0 +1,100 @@
---
name: CI
# yamllint disable-line rule:truthy
on:
pull_request:
branches:
- '*'
push:
branches:
- master
jobs:
unit-tests-master:
name: unit-tests
runs-on: ubuntu-18.04
strategy:
fail-fast: true
env:
DOKKU_VERSION: master
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- uses: actions/setup-python@v2
with:
python-version: '3.7.x'
- run: make setup
- run: sudo sysctl -w vm.max_map_count=262144
- run: |
git fetch -q origin master
changed=$(git --no-pager diff --name-only $GITHUB_SHA..origin/master)
if [ $changed = "Dockerfile" ]; then
echo "Please run 'make generate' to update the image version in the README.md"
else
make generate
if ! git diff --quiet README.md; then
echo "Please run 'make generate'"
git status --short
git --no-pager diff README.md
exit 1
fi
fi
- run: make test
- uses: actions/upload-artifact@v2
if: failure()
with:
name: tmp/test-results
path: test-results
unit-tests-0_19_0:
name: unit-tests-0.19.0
runs-on: ubuntu-18.04
strategy:
fail-fast: true
env:
DOKKU_TAG: v0.19.0
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- uses: actions/setup-python@v2
with:
python-version: '3.7.x'
- run: make setup
- run: sudo sysctl -w vm.max_map_count=262144
- run: |
git fetch -q origin master
changed=$(git --no-pager diff --name-only $GITHUB_SHA..origin/master)
if [ $changed = "Dockerfile" ]; then
echo "Please run 'make generate' to update the image version in the README.md"
else
make generate
if ! git diff --quiet README.md; then
echo "Please run 'make generate'"
git status --short
git --no-pager diff README.md
exit 1
fi
fi
- run: make test
- uses: actions/upload-artifact@v2
if: failure()
with:
name: tmp/test-results
path: test-results

1
.gitignore vendored
View File

@@ -1,2 +1,3 @@
/tmp /tmp
.vagrant .vagrant
bootstrap.sh

1
Dockerfile Normal file
View File

@@ -0,0 +1 @@
FROM postgres:13.4

View File

@@ -11,7 +11,7 @@ ifneq ($(shell bats --version >/dev/null 2>&1 ; echo $$?),0)
brew install bats-core brew install bats-core
endif endif
else else
git clone https://github.com/josegonzalez/bats-core.git /tmp/bats git clone https://github.com/bats-core/bats-core.git /tmp/bats
cd /tmp/bats && sudo ./install.sh /usr/local cd /tmp/bats && sudo ./install.sh /usr/local
rm -rf /tmp/bats rm -rf /tmp/bats
endif endif
@@ -63,7 +63,7 @@ unit-tests:
@echo running unit tests... @echo running unit tests...
@mkdir -p tmp/test-results/bats @mkdir -p tmp/test-results/bats
@cd tests && echo "executing tests: $(shell cd tests ; ls *.bats | xargs)" @cd tests && echo "executing tests: $(shell cd tests ; ls *.bats | xargs)"
cd tests && bats --formatter bats-format-junit -e -T -o ../tmp/test-results/bats *.bats cd tests && bats --report-formatter junit --timing -o ../tmp/test-results/bats *.bats
tmp/xunit-reader: tmp/xunit-reader:
mkdir -p tmp mkdir -p tmp
@@ -71,28 +71,15 @@ tmp/xunit-reader:
tar xf tmp/xunit-reader.tgz -C tmp tar xf tmp/xunit-reader.tgz -C tmp
chmod +x tmp/xunit-reader chmod +x tmp/xunit-reader
tmp/xunit-to-github:
mkdir -p tmp
curl -o tmp/xunit-to-github.tgz -sL https://github.com/josegonzalez/go-xunit-to-github/releases/download/v$(XUNIT_TO_GITHUB_VERSION)/xunit-to-github_$(XUNIT_TO_GITHUB_VERSION)_$(SYSTEM_NAME)_$(HARDWARE).tgz
tar xf tmp/xunit-to-github.tgz -C tmp
chmod +x tmp/xunit-to-github
setup: setup:
bash tests/setup.sh bash tests/setup.sh
$(MAKE) ci-dependencies $(MAKE) ci-dependencies
test: lint unit-tests test: lint unit-tests
report: tmp/xunit-reader tmp/xunit-to-github report: tmp/xunit-reader
tmp/xunit-reader -p 'tmp/test-results/bats/*.xml' tmp/xunit-reader -p 'tmp/test-results/bats/*.xml'
tmp/xunit-reader -p 'tmp/test-results/shellcheck/*.xml' tmp/xunit-reader -p 'tmp/test-results/shellcheck/*.xml'
ifdef TRAVIS_REPO_SLUG
ifdef GITHUB_ACCESS_TOKEN
ifneq ($(TRAVIS_PULL_REQUEST),false)
tmp/xunit-to-github --skip-ok --job-url "$(TRAVIS_JOB_WEB_URL)" --pull-request-id "$(TRAVIS_PULL_REQUEST)" --repository-slug "$(TRAVIS_REPO_SLUG)" --title "DOKKU_VERSION=$(DOKKU_VERSION)" tmp/test-results/bats tmp/test-results/shellcheck
endif
endif
endif
.PHONY: clean .PHONY: clean
clean: clean:

101
README.md
View File

@@ -1,16 +1,16 @@
# dokku postgres [![Build Status](https://img.shields.io/circleci/project/github/dokku/dokku-postgres.svg?branch=master&style=flat-square "Build Status")](https://circleci.com/gh/dokku/dokku-postgres/tree/master) [![IRC Network](https://img.shields.io/badge/irc-freenode-blue.svg?style=flat-square "IRC Freenode")](https://webchat.freenode.net/?channels=dokku) # dokku postgres [![Build Status](https://img.shields.io/github/workflow/status/dokku/dokku-postgres/CI/master?style=flat-square "Build Status")](https://github.com/dokku/dokku-postgres/actions/workflows/ci.yml?query=branch%3Amaster) [![IRC Network](https://img.shields.io/badge/irc-libera-blue.svg?style=flat-square "IRC Libera")](https://webchat.libera.chat/?channels=dokku)
Official postgres plugin for dokku. Currently defaults to installing [postgres 11.6](https://hub.docker.com/_/postgres/). Official postgres plugin for dokku. Currently defaults to installing [postgres 13.4](https://hub.docker.com/_/postgres/).
## Requirements ## Requirements
- dokku 0.12.x+ - dokku 0.19.x+
- docker 1.8.x - docker 1.8.x
## Installation ## Installation
```shell ```shell
# on 0.12.x+ # on 0.19.x+
sudo dokku plugin:install https://github.com/dokku/dokku-postgres.git postgres sudo dokku plugin:install https://github.com/dokku/dokku-postgres.git postgres
``` ```
@@ -18,14 +18,14 @@ sudo dokku plugin:install https://github.com/dokku/dokku-postgres.git postgres
``` ```
postgres:app-links <app> # list all postgres service links for a given app postgres:app-links <app> # list all postgres service links for a given app
postgres:backup <service> <bucket-name> [--use-iam] # creates a backup of the postgres service to an existing s3 bucket postgres:backup <service> <bucket-name> [--use-iam] # create a backup of the postgres service to an existing s3 bucket
postgres:backup-auth <service> <aws-access-key-id> <aws-secret-access-key> <aws-default-region> <aws-signature-version> <endpoint-url> # sets up authentication for backups on the postgres service postgres:backup-auth <service> <aws-access-key-id> <aws-secret-access-key> <aws-default-region> <aws-signature-version> <endpoint-url> # set up authentication for backups on the postgres service
postgres:backup-deauth <service> # removes backup authentication for the postgres service postgres:backup-deauth <service> # remove backup authentication for the postgres service
postgres:backup-schedule <service> <schedule> <bucket-name> [--use-iam] # schedules a backup of the postgres service postgres:backup-schedule <service> <schedule> <bucket-name> [--use-iam] # schedule a backup of the postgres service
postgres:backup-schedule-cat <service> # cat the contents of the configured backup cronfile for the service postgres:backup-schedule-cat <service> # cat the contents of the configured backup cronfile for the service
postgres:backup-set-encryption <service> <passphrase> # sets encryption for all future backups of postgres service postgres:backup-set-encryption <service> <passphrase> # set encryption for all future backups of postgres service
postgres:backup-unschedule <service> # unschedules the backup of the postgres service postgres:backup-unschedule <service> # unschedule the backup of the postgres service
postgres:backup-unset-encryption <service> # unsets encryption for future backups of the postgres service postgres:backup-unset-encryption <service> # unset encryption for future backups of the postgres service
postgres:clone <service> <new-service> [--clone-flags...] # create container <new-name> then copy data from <name> into <new-name> postgres:clone <service> <new-service> [--clone-flags...] # create container <new-name> then copy data from <name> into <new-name>
postgres:connect <service> # connect to the service via the postgres connection tool postgres:connect <service> # connect to the service via the postgres connection tool
postgres:create <service> [--create-flags...] # create a postgres service postgres:create <service> [--create-flags...] # create a postgres service
@@ -33,7 +33,7 @@ postgres:destroy <service> [-f|--force] # delete the postgres service
postgres:enter <service> # enter or run a command in a running postgres service container postgres:enter <service> # enter or run a command in a running postgres service container
postgres:exists <service> # check if the postgres service exists postgres:exists <service> # check if the postgres service exists
postgres:export <service> # export a dump of the postgres service database postgres:export <service> # export a dump of the postgres service database
postgres:expose <service> <ports...> # expose a postgres service on custom port if provided (random port otherwise) postgres:expose <service> <ports...> # expose a postgres service on custom host:port if provided (random port on the 0.0.0.0 interface if otherwise unspecified)
postgres:import <service> # import a dump into the postgres service database postgres:import <service> # import a dump into the postgres service database
postgres:info <service> [--single-info-flag] # print the service information postgres:info <service> [--single-info-flag] # print the service information
postgres:link <service> <app> [--link-flags...] # link the postgres service to the app postgres:link <service> <app> [--link-flags...] # link the postgres service to the app
@@ -65,9 +65,11 @@ dokku postgres:create <service> [--create-flags...]
flags: flags:
- `-c|--config-options "--args --go=here"`: extra arguments to pass to the container create command (default: `None`)
- `-C|--custom-env "USER=alpha;HOST=beta"`: semi-colon delimited environment variables to start the service with - `-C|--custom-env "USER=alpha;HOST=beta"`: semi-colon delimited environment variables to start the service with
- `-i|--image IMAGE`: the image name to start the service with - `-i|--image IMAGE`: the image name to start the service with
- `-I|--image-version IMAGE_VERSION`: the image version to start the service with - `-I|--image-version IMAGE_VERSION`: the image version to start the service with
- `-m|--memory MEMORY`: container memory limit (default: unlimited)
- `-p|--password PASSWORD`: override the user-level service password - `-p|--password PASSWORD`: override the user-level service password
- `-r|--root-password PASSWORD`: override the root-level service password - `-r|--root-password PASSWORD`: override the root-level service password
@@ -77,18 +79,18 @@ Create a postgres service named lolipop:
dokku postgres:create lolipop dokku postgres:create lolipop
``` ```
You can also specify the image and image version to use for the service. It *must* be compatible with the postgres image. You can also specify the image and image version to use for the service. It *must* be compatible with the postgres image.
```shell ```shell
export DATABASE_IMAGE="postgres" export POSTGRES_IMAGE="postgres"
export DATABASE_IMAGE_VERSION="${PLUGIN_IMAGE_VERSION}" export POSTGRES_IMAGE_VERSION="${PLUGIN_IMAGE_VERSION}"
dokku postgres:create lolipop dokku postgres:create lolipop
``` ```
You can also specify custom environment variables to start the postgres service in semi-colon separated form. You can also specify custom environment variables to start the postgres service in semi-colon separated form.
```shell ```shell
export DATABASE_CUSTOM_ENV="USER=alpha;HOST=beta" export POSTGRES_CUSTOM_ENV="USER=alpha;HOST=beta"
dokku postgres:create lolipop dokku postgres:create lolipop
``` ```
@@ -181,7 +183,7 @@ flags:
- `-a|--alias "BLUE_DATABASE"`: an alternative alias to use for linking to an app via environment variable - `-a|--alias "BLUE_DATABASE"`: an alternative alias to use for linking to an app via environment variable
- `-q|--querystring "pool=5"`: ampersand delimited querystring arguments to append to the service link - `-q|--querystring "pool=5"`: ampersand delimited querystring arguments to append to the service link
A postgres service can be linked to a container. This will use native docker links via the docker-options plugin. Here we link it to our 'playground' app. A postgres service can be linked to a container. This will use native docker links via the docker-options plugin. Here we link it to our `playground` app.
> NOTE: this will restart your app > NOTE: this will restart your app
@@ -192,12 +194,12 @@ dokku postgres:link lolipop playground
The following environment variables will be set automatically by docker (not on the app itself, so they wont be listed when calling dokku config): The following environment variables will be set automatically by docker (not on the app itself, so they wont be listed when calling dokku config):
``` ```
DOKKU_DATABASE_LOLIPOP_NAME=/lolipop/DATABASE DOKKU_POSTGRES_LOLIPOP_NAME=/lolipop/DATABASE
DOKKU_DATABASE_LOLIPOP_PORT=tcp://172.17.0.1:5432 DOKKU_POSTGRES_LOLIPOP_PORT=tcp://172.17.0.1:5432
DOKKU_DATABASE_LOLIPOP_PORT_5432_TCP=tcp://172.17.0.1:5432 DOKKU_POSTGRES_LOLIPOP_PORT_5432_TCP=tcp://172.17.0.1:5432
DOKKU_DATABASE_LOLIPOP_PORT_5432_TCP_PROTO=tcp DOKKU_POSTGRES_LOLIPOP_PORT_5432_TCP_PROTO=tcp
DOKKU_DATABASE_LOLIPOP_PORT_5432_TCP_PORT=5432 DOKKU_POSTGRES_LOLIPOP_PORT_5432_TCP_PORT=5432
DOKKU_DATABASE_LOLIPOP_PORT_5432_TCP_ADDR=172.17.0.1 DOKKU_POSTGRES_LOLIPOP_PORT_5432_TCP_ADDR=172.17.0.1
``` ```
The following will be set on the linked application by default: The following will be set on the linked application by default:
@@ -206,13 +208,13 @@ The following will be set on the linked application by default:
DATABASE_URL=postgres://lolipop:SOME_PASSWORD@dokku-postgres-lolipop:5432/lolipop DATABASE_URL=postgres://lolipop:SOME_PASSWORD@dokku-postgres-lolipop:5432/lolipop
``` ```
The host exposed here only works internally in docker containers. If you want your container to be reachable from outside, you should use the 'expose' subcommand. Another service can be linked to your app: The host exposed here only works internally in docker containers. If you want your container to be reachable from outside, you should use the `expose` subcommand. Another service can be linked to your app:
```shell ```shell
dokku postgres:link other_service playground dokku postgres:link other_service playground
``` ```
It is possible to change the protocol for `DATABASE_URL` by setting the environment variable `POSTGRES_DATABASE_SCHEME` on the app. Doing so will after linking will cause the plugin to think the service is not linked, and we advise you to unlink before proceeding. It is possible to change the protocol for `DATABASE_URL` by setting the environment variable `POSTGRES_DATABASE_SCHEME` on the app. Doing so will after linking will cause the plugin to think the service is not linked, and we advise you to unlink before proceeding.
```shell ```shell
dokku config:set playground POSTGRES_DATABASE_SCHEME=postgres2 dokku config:set playground POSTGRES_DATABASE_SCHEME=postgres2
@@ -264,19 +266,19 @@ dokku postgres:connect lolipop
dokku postgres:enter <service> dokku postgres:enter <service>
``` ```
A bash prompt can be opened against a running service. Filesystem changes will not be saved to disk. A bash prompt can be opened against a running service. Filesystem changes will not be saved to disk.
```shell ```shell
dokku postgres:enter lolipop dokku postgres:enter lolipop
``` ```
You may also run a command directly against the service. Filesystem changes will not be saved to disk. You may also run a command directly against the service. Filesystem changes will not be saved to disk.
```shell ```shell
dokku postgres:enter lolipop touch /tmp/test dokku postgres:enter lolipop touch /tmp/test
``` ```
### expose a postgres service on custom port if provided (random port otherwise) ### expose a postgres service on custom host:port if provided (random port on the 0.0.0.0 interface if otherwise unspecified)
```shell ```shell
# usage # usage
@@ -289,6 +291,12 @@ Expose the service on the service's normal ports, allowing access to it from the
dokku postgres:expose lolipop 5432 dokku postgres:expose lolipop 5432
``` ```
Expose the service on the service's normal ports, with the first on a specified ip adddress (127.0.0.1):
```shell
dokku postgres:expose lolipop 127.0.0.1:5432
```
### unexpose a previously exposed postgres service ### unexpose a previously exposed postgres service
```shell ```shell
@@ -379,6 +387,7 @@ dokku postgres:upgrade <service> [--upgrade-flags...]
flags: flags:
- `-c|--config-options "--args --go=here"`: extra arguments to pass to the container create command (default: `None`)
- `-C|--custom-env "USER=alpha;HOST=beta"`: semi-colon delimited environment variables to start the service with - `-C|--custom-env "USER=alpha;HOST=beta"`: semi-colon delimited environment variables to start the service with
- `-i|--image IMAGE`: the image name to start the service with - `-i|--image IMAGE`: the image name to start the service with
- `-I|--image-version IMAGE_VERSION`: the image version to start the service with - `-I|--image-version IMAGE_VERSION`: the image version to start the service with
@@ -401,7 +410,7 @@ Service scripting can be executed using the following commands:
dokku postgres:app-links <app> dokku postgres:app-links <app>
``` ```
List all postgres services that are linked to the 'playground' app. List all postgres services that are linked to the `playground` app.
```shell ```shell
dokku postgres:app-links playground dokku postgres:app-links playground
@@ -416,9 +425,11 @@ dokku postgres:clone <service> <new-service> [--clone-flags...]
flags: flags:
- `-c|--config-options "--args --go=here"`: extra arguments to pass to the container create command (default: `None`)
- `-C|--custom-env "USER=alpha;HOST=beta"`: semi-colon delimited environment variables to start the service with - `-C|--custom-env "USER=alpha;HOST=beta"`: semi-colon delimited environment variables to start the service with
- `-i|--image IMAGE`: the image name to start the service with - `-i|--image IMAGE`: the image name to start the service with
- `-I|--image-version IMAGE_VERSION`: the image version to start the service with - `-I|--image-version IMAGE_VERSION`: the image version to start the service with
- `-m|--memory MEMORY`: container memory limit (default: unlimited)
- `-p|--password PASSWORD`: override the user-level service password - `-p|--password PASSWORD`: override the user-level service password
- `-r|--root-password PASSWORD`: override the root-level service password - `-r|--root-password PASSWORD`: override the root-level service password
@@ -435,7 +446,7 @@ dokku postgres:clone lolipop lolipop-2
dokku postgres:exists <service> dokku postgres:exists <service>
``` ```
Here we check if the lolipop postgres service exists. Here we check if the lolipop postgres service exists.
```shell ```shell
dokku postgres:exists lolipop dokku postgres:exists lolipop
@@ -448,7 +459,7 @@ dokku postgres:exists lolipop
dokku postgres:linked <service> <app> dokku postgres:linked <service> <app>
``` ```
Here we check if the lolipop postgres service is linked to the 'playground' app. Here we check if the lolipop postgres service is linked to the `playground` app.
```shell ```shell
dokku postgres:linked lolipop playground dokku postgres:linked lolipop playground
@@ -461,7 +472,7 @@ dokku postgres:linked lolipop playground
dokku postgres:links <service> dokku postgres:links <service>
``` ```
List all apps linked to the 'lolipop' postgres service. List all apps linked to the `lolipop` postgres service.
```shell ```shell
dokku postgres:links lolipop dokku postgres:links lolipop
@@ -511,7 +522,7 @@ You may skip the `backup-auth` step if your dokku install is running within EC2
Backups can be performed using the backup commands: Backups can be performed using the backup commands:
### sets up authentication for backups on the postgres service ### set up authentication for backups on the postgres service
```shell ```shell
# usage # usage
@@ -542,7 +553,7 @@ More specific example for minio auth:
dokku postgres:backup-auth lolipop MINIO_ACCESS_KEY_ID MINIO_SECRET_ACCESS_KEY us-east-1 s3v4 https://YOURMINIOSERVICE dokku postgres:backup-auth lolipop MINIO_ACCESS_KEY_ID MINIO_SECRET_ACCESS_KEY us-east-1 s3v4 https://YOURMINIOSERVICE
``` ```
### removes backup authentication for the postgres service ### remove backup authentication for the postgres service
```shell ```shell
# usage # usage
@@ -555,7 +566,7 @@ Remove s3 authentication:
dokku postgres:backup-deauth lolipop dokku postgres:backup-deauth lolipop
``` ```
### creates a backup of the postgres service to an existing s3 bucket ### create a backup of the postgres service to an existing s3 bucket
```shell ```shell
# usage # usage
@@ -566,13 +577,19 @@ flags:
- `-u|--use-iam`: use the IAM profile associated with the current server - `-u|--use-iam`: use the IAM profile associated with the current server
Backup the 'lolipop' service to the 'my-s3-bucket' bucket on ``AWS`:` Backup the `lolipop` service to the `my-s3-bucket` bucket on `AWS`:`
```shell ```shell
dokku postgres:backup lolipop my-s3-bucket --use-iam dokku postgres:backup lolipop my-s3-bucket --use-iam
``` ```
### sets encryption for all future backups of postgres service Restore a backup file (assuming it was extracted via `tar -xf backup.tgz`):
```shell
dokku postgres:import lolipop < backup-folder/export
```
### set encryption for all future backups of postgres service
```shell ```shell
# usage # usage
@@ -585,7 +602,7 @@ Set the GPG-compatible passphrase for encrypting backups for backups:
dokku postgres:backup-set-encryption lolipop dokku postgres:backup-set-encryption lolipop
``` ```
### unsets encryption for future backups of the postgres service ### unset encryption for future backups of the postgres service
```shell ```shell
# usage # usage
@@ -598,7 +615,7 @@ Unset the `GPG` encryption passphrase for backups:
dokku postgres:backup-unset-encryption lolipop dokku postgres:backup-unset-encryption lolipop
``` ```
### schedules a backup of the postgres service ### schedule a backup of the postgres service
```shell ```shell
# usage # usage
@@ -636,7 +653,7 @@ Cat the contents of the configured backup cronfile for the service:
dokku postgres:backup-schedule-cat lolipop dokku postgres:backup-schedule-cat lolipop
``` ```
### unschedules the backup of the postgres service ### unschedule the backup of the postgres service
```shell ```shell
# usage # usage
@@ -653,4 +670,4 @@ dokku postgres:backup-unschedule lolipop
If you wish to disable the `docker pull` calls that the plugin triggers, you may set the `POSTGRES_DISABLE_PULL` environment variable to `true`. Once disabled, you will need to pull the service image you wish to deploy as shown in the `stderr` output. If you wish to disable the `docker pull` calls that the plugin triggers, you may set the `POSTGRES_DISABLE_PULL` environment variable to `true`. Once disabled, you will need to pull the service image you wish to deploy as shown in the `stderr` output.
Please ensure the proper images are in place when `docker pull` is disabled. Please ensure the proper images are in place when `docker pull` is disabled.

View File

@@ -5,16 +5,24 @@ import os
import re import re
def compile(service, version, variable, alias, image, scheme, ports, unimplemented, dokku_version): def compile(service, version, variable, alias, image, scheme, ports, sponsors, options, unimplemented, dokku_version):
prefix = "\n\n".join([
header(service),
description(service, image, version),
])
if len(sponsors) > 0:
prefix += "\n\n"
prefix += sponsors_section(service, sponsors)
return ( return (
"\n\n".join( "\n\n".join(
[ [
header(service), prefix,
description(service, version),
requirements_section(dokku_version), requirements_section(dokku_version),
installation_section(service, dokku_version), installation_section(service, dokku_version),
commands_section(service, variable, alias, image, scheme, ports, unimplemented), commands_section(service, variable, alias, image, scheme, ports, unimplemented),
usage_section(service, variable, alias, image, scheme, ports, unimplemented), usage_section(service, variable, alias, image, scheme, ports, options, unimplemented),
] ]
) )
.replace("\n\n\n\n\n", "\n") .replace("\n\n\n\n\n", "\n")
@@ -27,14 +35,32 @@ def header(service):
return " ".join( return " ".join(
[ [
f"# dokku {service}", f"# dokku {service}",
f'[![Build Status](https://img.shields.io/circleci/project/github/dokku/dokku-{service}.svg?branch=master&style=flat-square "Build Status")](https://circleci.com/gh/dokku/dokku-{service}/tree/master)', f'[![Build Status](https://img.shields.io/github/workflow/status/dokku/dokku-{service}/CI/master?style=flat-square "Build Status")](https://github.com/dokku/dokku-{service}/actions/workflows/ci.yml?query=branch%3Amaster)',
f'[![IRC Network](https://img.shields.io/badge/irc-freenode-blue.svg?style=flat-square "IRC Freenode")](https://webchat.freenode.net/?channels=dokku)', f'[![IRC Network](https://img.shields.io/badge/irc-libera-blue.svg?style=flat-square "IRC Libera")](https://webchat.libera.chat/?channels=dokku)',
] ]
) )
def description(service, version): def description(service, full_image, version):
return f"Official {service} plugin for dokku. Currently defaults to installing [{service} {version}](https://hub.docker.com/_/{service}/)." base = "_"
image = full_image
if "/" in full_image:
base = "r/" + full_image.split("/")[0]
image = full_image.split("/")[1]
return f"Official {service} plugin for dokku. Currently defaults to installing [{full_image} {version}](https://hub.docker.com/{base}/{image}/)."
def sponsors_section(service, sponsors):
if len(sponsors) == 0:
return ""
sponsor_data = ["## Sponsors", "", f"The {service} plugin was generously sponsored by the following:", ""]
sponsor_data.extend([f"- [{s}](https://github.com/{s})" for s in sponsors])
return "\n".join(
sponsor_data
)
def requirements_section(dokku_version): def requirements_section(dokku_version):
@@ -89,31 +115,31 @@ def commands_section(service, variable, alias, image, scheme, ports, unimplement
return "\n".join(content) return "\n".join(content)
def usage_section(service, variable, alias, image, scheme, ports, unimplemented): def usage_section(service, variable, alias, image, scheme, ports, options, unimplemented):
return "\n\n".join( return "\n\n".join(
[ [
"## Usage", "## Usage",
f"Help for any commands can be displayed by specifying the command as an argument to {service}:help. Please consult the `{service}:help` command for any undocumented commands.", f"Help for any commands can be displayed by specifying the command as an argument to {service}:help. Please consult the `{service}:help` command for any undocumented commands.",
usage_intro(service, variable, alias, image, scheme, ports, unimplemented), usage_intro(service, variable, alias, image, scheme, ports, options, unimplemented),
usage_lifecycle(service, variable, alias, image, scheme, ports, unimplemented), usage_lifecycle(service, variable, alias, image, scheme, ports, options, unimplemented),
usage_automation(service, variable, alias, image, scheme, ports, unimplemented), usage_automation(service, variable, alias, image, scheme, ports, options, unimplemented),
usage_data_management(service, variable, alias, image, scheme, ports, unimplemented), usage_data_management(service, variable, alias, image, scheme, ports, options, unimplemented),
usage_backup(service, variable, alias, image, scheme, ports, unimplemented), usage_backup(service, variable, alias, image, scheme, ports, options, unimplemented),
usage_docker_pull(service, variable, alias, image, scheme, ports, unimplemented), usage_docker_pull(service, variable, alias, image, scheme, ports, options, unimplemented),
] ]
) )
def usage_intro(service, variable, alias, image, scheme, ports, unimplemented): def usage_intro(service, variable, alias, image, scheme, ports, options, unimplemented):
commands = ["create", "info", "list", "logs", "link", "unlink"] commands = ["create", "info", "list", "logs", "link", "unlink"]
content = ["### Basic Usage"] content = ["### Basic Usage"]
return fetch_commands_content( return fetch_commands_content(
service, variable, alias, image, scheme, ports, unimplemented, commands, content service, variable, alias, image, scheme, ports, options, unimplemented, commands, content
) )
def usage_lifecycle(service, variable, alias, image, scheme, ports, unimplemented): def usage_lifecycle(service, variable, alias, image, scheme, ports, options, unimplemented):
commands = [ commands = [
"connect", "connect",
"enter", "enter",
@@ -133,11 +159,11 @@ def usage_lifecycle(service, variable, alias, image, scheme, ports, unimplemente
] ]
return fetch_commands_content( return fetch_commands_content(
service, variable, alias, image, scheme, ports, unimplemented, commands, content service, variable, alias, image, scheme, ports, options, unimplemented, commands, content
) )
def usage_automation(service, variable, alias, image, scheme, ports, unimplemented): def usage_automation(service, variable, alias, image, scheme, ports, options, unimplemented):
commands = ["app-links", "clone", "exists", "linked", "links"] commands = ["app-links", "clone", "exists", "linked", "links"]
content = [ content = [
"### Service Automation", "### Service Automation",
@@ -147,11 +173,11 @@ def usage_automation(service, variable, alias, image, scheme, ports, unimplement
] ]
return fetch_commands_content( return fetch_commands_content(
service, variable, alias, image, scheme, ports, unimplemented, commands, content service, variable, alias, image, scheme, ports, options, unimplemented, commands, content
) )
def usage_data_management(service, variable, alias, image, scheme, ports, unimplemented): def usage_data_management(service, variable, alias, image, scheme, ports, options, unimplemented):
commands = ["import", "export"] commands = ["import", "export"]
content = [ content = [
"### Data Management", "### Data Management",
@@ -161,11 +187,11 @@ def usage_data_management(service, variable, alias, image, scheme, ports, unimpl
] ]
return fetch_commands_content( return fetch_commands_content(
service, variable, alias, image, scheme, ports, unimplemented, commands, content service, variable, alias, image, scheme, ports, options, unimplemented, commands, content
) )
def usage_backup(service, variable, alias, image, scheme, ports, unimplemented): def usage_backup(service, variable, alias, image, scheme, ports, options, unimplemented):
commands = [ commands = [
"backup-auth", "backup-auth",
"backup-deauth", "backup-deauth",
@@ -188,11 +214,11 @@ def usage_backup(service, variable, alias, image, scheme, ports, unimplemented):
] ]
return fetch_commands_content( return fetch_commands_content(
service, variable, alias, image, scheme, ports, unimplemented, commands, content service, variable, alias, image, scheme, ports, options, unimplemented, commands, content
) )
def usage_docker_pull(service, variable, alias, image, scheme, ports, unimplemented): def usage_docker_pull(service, variable, alias, image, scheme, ports, options, unimplemented):
service_prefix = service.upper() service_prefix = service.upper()
return "\n".join( return "\n".join(
[ [
@@ -206,11 +232,11 @@ def usage_docker_pull(service, variable, alias, image, scheme, ports, unimplemen
def fetch_commands_content( def fetch_commands_content(
service, variable, alias, image, scheme, ports, unimplemented, commands, content service, variable, alias, image, scheme, ports, options, unimplemented, commands, content
): ):
i = 0 i = 0
for command in commands: for command in commands:
output = command_help(command, service, variable, alias, image, scheme, ports, unimplemented) output = command_help(command, service, variable, alias, image, scheme, ports, options, unimplemented)
if output == "": if output == "":
continue continue
content.append(output) content.append(output)
@@ -248,7 +274,7 @@ def parse_args(line):
return " ".join(arguments) return " ".join(arguments)
def command_help(command, service, variable, alias, image, scheme, ports, unimplemented): def command_help(command, service, variable, alias, image, scheme, ports, options, unimplemented):
if command in unimplemented: if command in unimplemented:
return "" return ""
@@ -274,6 +300,8 @@ def command_help(command, service, variable, alias, image, scheme, ports, unimpl
content.append("flags:") content.append("flags:")
content.append("") content.append("")
for flag in data["flags"]: for flag in data["flags"]:
if "--config-options" in flag and options != "":
flag = f"{flag} (default: `{options}`)"
content.append(f"- {flag}") content.append(f"- {flag}")
if len(data["examples"]) > 0: if len(data["examples"]) > 0:
@@ -397,13 +425,13 @@ def command_data(command, service, variable, alias, image, scheme, ports):
def process_sentence(sentence_lines): def process_sentence(sentence_lines):
sentence_lines = " ".join(sentence_lines) sentence_lines = " ".join(sentence_lines)
sentences = ". ".join( sentences = ". ".join(
upperfirst(i.strip()) for i in sentence_lines.split(".") upperfirst(i.strip()) for i in sentence_lines.split(". ")
).strip() ).strip()
if not sentences.endswith(".") and not sentences.endswith(":"): if not sentences.endswith(".") and not sentences.endswith(":"):
sentences += ":" sentences += ":"
text = [] text = []
for sentence in sentences.split("."): for sentence in sentences.split(". "):
parts = [] parts = []
for word in sentence.strip().split(" "): for word in sentence.strip().split(" "):
if word.isupper() and len(word) > 1: if word.isupper() and len(word) > 1:
@@ -418,7 +446,11 @@ def process_sentence(sentence_lines):
text = ". ".join(text) text = ". ".join(text)
# some cleanup # some cleanup
text = text.replace("(0. 0. 0. 0)", "(`0.0.0.0`)") text = text.replace("(0.0.0.0)", "(`0.0.0.0`)")
text = text.replace("'", "`")
text = text.replace("`s", "'s")
text = text.replace("``", "`")
text = text.strip(" ")
return text return text
@@ -447,13 +479,18 @@ def main():
variable = None variable = None
image = None image = None
alias = None alias = None
options = None
unimplemented = [] unimplemented = []
with open("Dockerfile") as f:
for line in f.readlines():
if "FROM " in line:
image, version = line.split(" ")[1].split(":")
image = image.strip()
version = version.strip()
with open("config") as f: with open("config") as f:
for line in f.readlines(): for line in f.readlines():
if "IMAGE_VERSION=${" in line:
version = re.search('"(.+)"', line).group(1)
if "_IMAGE=${" in line:
image = re.search('"(.+)"', line).group(1)
if "PLUGIN_COMMAND_PREFIX=" in line: if "PLUGIN_COMMAND_PREFIX=" in line:
service = re.search('"(.+)"', line).group(1) service = re.search('"(.+)"', line).group(1)
if "PLUGIN_DEFAULT_ALIAS=" in line: if "PLUGIN_DEFAULT_ALIAS=" in line:
@@ -469,12 +506,26 @@ def main():
if match is not None: if match is not None:
unimplemented = [s.strip('"') for s in match.group(1).split(" ")] unimplemented = [s.strip('"') for s in match.group(1).split(" ")]
text = compile(service, version, variable, alias, image, scheme, ports, unimplemented, "0.12.x+") with open("config") as f:
for line in f.readlines():
if f"{variable}_CONFIG_OPTIONS" in line:
match = re.search('"(.+)"', line)
if match is not None:
options = match.group(1)
sponsors = []
with open("plugin.toml") as f:
for line in f.readlines():
if line.startswith("sponsors"):
sponsors = re.search("\[([\"\w\s,_-]+)\]", line).group(1)
sponsors = [s.strip("\"") for s in sponsors.split(",")]
text = compile(service, version, variable, alias, image, scheme, ports, sponsors, options, unimplemented, "0.19.x+")
base_path = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) base_path = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
readme_file = os.path.join(base_path, "README.md") readme_file = os.path.join(base_path, "README.md")
with open(readme_file, "w") as f: with open(readme_file, "w") as f:
f.write(text) f.write(text + "\n")
if __name__ == "__main__": if __name__ == "__main__":

View File

@@ -5,7 +5,7 @@ set -eo pipefail
source "$PLUGIN_AVAILABLE_PATH/config/functions" source "$PLUGIN_AVAILABLE_PATH/config/functions"
docker_ports_options() { docker_ports_options() {
declare desc="Exports a list of exposed ports" declare desc="export a list of exposed ports"
declare PORTS=("$@") declare PORTS=("$@")
for ((i = 0; i < ${#PLUGIN_DATASTORE_PORTS[@]}; i++)); do for ((i = 0; i < ${#PLUGIN_DATASTORE_PORTS[@]}; i++)); do
echo -n "-p ${PORTS[i]}:${PLUGIN_DATASTORE_PORTS[i]} " echo -n "-p ${PORTS[i]}:${PLUGIN_DATASTORE_PORTS[i]} "
@@ -13,13 +13,13 @@ docker_ports_options() {
} }
get_container_ip() { get_container_ip() {
declare desc="Retrieves the ip address of a container" declare desc="retrieve the ip address of a container"
declare CONTAINER_ID="$1" declare CONTAINER_ID="$1"
docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$CONTAINER_ID" 2>/dev/null docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$CONTAINER_ID" 2>/dev/null
} }
get_database_name() { get_database_name() {
declare desc="Retrieves a sanitized database name" declare desc="retrieve a sanitized database name"
declare SERVICE="$1" declare SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
@@ -31,7 +31,7 @@ get_database_name() {
} }
get_random_ports() { get_random_ports() {
declare desc="Retrieves N random ports" declare desc="retrieve N random ports"
declare iterations="${1:-1}" declare iterations="${1:-1}"
for ((i = 0; i < iterations; i++)); do for ((i = 0; i < iterations; i++)); do
local port=$RANDOM local port=$RANDOM
@@ -50,19 +50,19 @@ get_random_ports() {
} }
get_service_name() { get_service_name() {
declare desc="Retrieves a docker service label" declare desc="retrieve a docker service label"
declare SERVICE="$1" declare SERVICE="$1"
echo "dokku.${PLUGIN_COMMAND_PREFIX}.$SERVICE" echo "dokku.${PLUGIN_COMMAND_PREFIX}.$SERVICE"
} }
get_url_from_config() { get_url_from_config() {
declare desc="Retrieves a given _URL from a list of configuration variables" declare desc="retrieve a given _URL from a list of configuration variables"
declare EXISTING_CONFIG="$1" CONFIG_VAR="$2" declare EXISTING_CONFIG="$1" CONFIG_VAR="$2"
echo "$EXISTING_CONFIG" | grep "$CONFIG_VAR" | sed "s/$CONFIG_VAR:\s*//" | xargs echo "$EXISTING_CONFIG" | grep "$CONFIG_VAR" | sed "s/$CONFIG_VAR:\s*//" | xargs
} }
is_container_status() { is_container_status() {
declare desc="Returns 0 or 1 depending upon whether a given container has a certain status" declare desc="return 0 or 1 depending upon whether a given container has a certain status"
declare CID="$1" STATUS="$2" declare CID="$1" STATUS="$2"
local TEMPLATE="{{.State.$STATUS}}" local TEMPLATE="{{.State.$STATUS}}"
local CONTAINER_STATUS=$(docker inspect -f "$TEMPLATE" "$CID" 2>/dev/null || true) local CONTAINER_STATUS=$(docker inspect -f "$TEMPLATE" "$CID" 2>/dev/null || true)
@@ -90,7 +90,7 @@ is_implemented_command() {
} }
is_valid_service_name() { is_valid_service_name() {
declare desc="Validates a service name" declare desc="validate a service name"
declare SERVICE="$1" declare SERVICE="$1"
[[ -z "$SERVICE" ]] && return 1 [[ -z "$SERVICE" ]] && return 1
@@ -102,7 +102,7 @@ is_valid_service_name() {
} }
remove_from_links_file() { remove_from_links_file() {
declare desc="Removes an app from the service link file" declare desc="remove an app from the service link file"
declare SERVICE="$1" APP="$2" declare SERVICE="$1" APP="$2"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local LINKS_FILE="$SERVICE_ROOT/LINKS" local LINKS_FILE="$SERVICE_ROOT/LINKS"
@@ -120,7 +120,7 @@ retry-docker-command() {
local i=0 success=false local i=0 success=false
until [ $i -ge 100 ]; do until [ $i -ge 100 ]; do
set +e set +e
docker exec -it "$ID" sh -c "$COMMAND" 2>/dev/null suppress_output docker exec "$ID" sh -c "$COMMAND"
exit_code=$? exit_code=$?
set -e set -e
if [[ "$exit_code" == 0 ]]; then if [[ "$exit_code" == 0 ]]; then
@@ -137,7 +137,7 @@ retry-docker-command() {
} }
service_alternative_alias() { service_alternative_alias() {
declare desc="Retrieves an alternative alias for a service" declare desc="retrieve an alternative alias for a service"
declare EXISTING_CONFIG="$1" declare EXISTING_CONFIG="$1"
local COLORS=(AQUA BLACK BLUE FUCHSIA GRAY GREEN LIME MAROON NAVY OLIVE PURPLE RED SILVER TEAL WHITE YELLOW) local COLORS=(AQUA BLACK BLUE FUCHSIA GRAY GREEN LIME MAROON NAVY OLIVE PURPLE RED SILVER TEAL WHITE YELLOW)
local ALIAS local ALIAS
@@ -154,7 +154,7 @@ service_alternative_alias() {
} }
service_app_links() { service_app_links() {
declare desc="Outputs all service links for a given app" declare desc="output all service links for a given app"
declare APP="$1" declare APP="$1"
local SERVICE LINKED_APP local SERVICE LINKED_APP
@@ -170,7 +170,7 @@ service_app_links() {
} }
service_backup() { service_backup() {
declare desc="Creates a backup of a service to an existing s3 bucket" declare desc="create a backup of a service to an existing s3 bucket"
declare SERVICE="$1" BUCKET_NAME="$2" USE_IAM_OPTIONAL_FLAG="$3" declare SERVICE="$1" BUCKET_NAME="$2" USE_IAM_OPTIONAL_FLAG="$3"
local SERVICE_BACKUP_ROOT="$PLUGIN_DATA_ROOT/$SERVICE/backup" local SERVICE_BACKUP_ROOT="$PLUGIN_DATA_ROOT/$SERVICE/backup"
local BACKUP_ENCRYPTION_CONFIG_ROOT="$PLUGIN_DATA_ROOT/$SERVICE/backup-encryption" local BACKUP_ENCRYPTION_CONFIG_ROOT="$PLUGIN_DATA_ROOT/$SERVICE/backup-encryption"
@@ -188,18 +188,18 @@ service_backup() {
dokku_log_fail "Provide AWS credentials or use the --use-iam flag" dokku_log_fail "Provide AWS credentials or use the --use-iam flag"
fi fi
TMPDIR=$(mktemp -d --tmpdir) BACKUP_TMPDIR=$(mktemp -d --tmpdir)
trap 'rm -rf "$TMPDIR" > /dev/null' RETURN INT TERM EXIT trap 'rm -rf "$BACKUP_TMPDIR" > /dev/null' RETURN INT TERM EXIT
docker inspect "$ID" &>/dev/null || dokku_log_fail "Service container does not exist" docker inspect "$ID" &>/dev/null || dokku_log_fail "Service container does not exist"
is_container_status "$ID" "Running" || dokku_log_fail "Service container is not running" is_container_status "$ID" "Running" || dokku_log_fail "Service container is not running"
(service_export "$SERVICE" >"${TMPDIR}/export") (service_export "$SERVICE" >"${BACKUP_TMPDIR}/export")
# Build parameter list for s3backup tool # Build parameter list for s3backup tool
BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e BUCKET_NAME=$BUCKET_NAME" BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e BUCKET_NAME=$BUCKET_NAME"
BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e BACKUP_NAME=${PLUGIN_COMMAND_PREFIX}-${SERVICE}" BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e BACKUP_NAME=${PLUGIN_COMMAND_PREFIX}-${SERVICE}"
BACKUP_PARAMETERS="$BACKUP_PARAMETERS -v ${TMPDIR}:/backup" BACKUP_PARAMETERS="$BACKUP_PARAMETERS -v ${BACKUP_TMPDIR}:/backup"
if [[ -f "$SERVICE_BACKUP_ROOT/AWS_DEFAULT_REGION" ]]; then if [[ -f "$SERVICE_BACKUP_ROOT/AWS_DEFAULT_REGION" ]]; then
BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e AWS_DEFAULT_REGION=$(cat "$SERVICE_BACKUP_ROOT/AWS_DEFAULT_REGION")" BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e AWS_DEFAULT_REGION=$(cat "$SERVICE_BACKUP_ROOT/AWS_DEFAULT_REGION")"
@@ -221,8 +221,36 @@ service_backup() {
docker run --rm $BACKUP_PARAMETERS "$PLUGIN_S3BACKUP_IMAGE" docker run --rm $BACKUP_PARAMETERS "$PLUGIN_S3BACKUP_IMAGE"
} }
service_commit_config() {
declare SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local CONFIG_VARIABLE="${PLUGIN_VARIABLE}_CONFIG_OPTIONS"
local ENV_VARIABLE="${PLUGIN_VARIABLE}_CUSTOM_ENV"
custom_env="${!ENV_VARIABLE}"
[[ -n "$SERVICE_CUSTOM_ENV" ]] && custom_env="$SERVICE_CUSTOM_ENV"
if [[ -n $custom_env ]]; then
echo "$custom_env" | tr ';' "\n" >"$SERVICE_ROOT/ENV"
else
echo "" >"$SERVICE_ROOT/ENV"
fi
config_options="${!CONFIG_VARIABLE}"
[[ -n "$PLUGIN_CONFIG_OPTIONS" ]] && config_options="$PLUGIN_CONFIG_OPTIONS"
if [[ -n "$config_options" ]]; then
echo "$config_options" >"$SERVICE_ROOT/CONFIG_OPTIONS"
else
echo "" >"$SERVICE_ROOT/CONFIG_OPTIONS"
fi
if [[ -n "$SERVICE_MEMORY" ]]; then
echo "$SERVICE_MEMORY" >"$SERVICE_ROOT/SERVICE_MEMORY"
fi
}
service_backup_auth() { service_backup_auth() {
declare desc="Sets up authentication" declare desc="set up authentication"
declare SERVICE="$1" AWS_ACCESS_KEY_ID="$2" AWS_SECRET_ACCESS_KEY="$3" AWS_DEFAULT_REGION="$4" AWS_SIGNATURE_VERSION="$5" ENDPOINT_URL="$6" declare SERVICE="$1" AWS_ACCESS_KEY_ID="$2" AWS_SECRET_ACCESS_KEY="$3" AWS_DEFAULT_REGION="$4" AWS_SIGNATURE_VERSION="$5" ENDPOINT_URL="$6"
local SERVICE_BACKUP_ROOT="$PLUGIN_DATA_ROOT/$SERVICE/backup" local SERVICE_BACKUP_ROOT="$PLUGIN_DATA_ROOT/$SERVICE/backup"
@@ -244,7 +272,7 @@ service_backup_auth() {
} }
service_backup_deauth() { service_backup_deauth() {
declare desc="Removes authentication" declare desc="remove authentication"
declare SERVICE="$1" declare SERVICE="$1"
local SERVICE_ROOT="${PLUGIN_DATA_ROOT}/${SERVICE}" local SERVICE_ROOT="${PLUGIN_DATA_ROOT}/${SERVICE}"
local SERVICE_BACKUP_ROOT="${SERVICE_ROOT}/backup/" local SERVICE_BACKUP_ROOT="${SERVICE_ROOT}/backup/"
@@ -282,7 +310,7 @@ service_backup_schedule_cat() {
} }
service_backup_set_encryption() { service_backup_set_encryption() {
declare desc="Sets up backup encryption" declare desc="set up backup encryption"
declare SERVICE="$1" ENCRYPTION_KEY="$2" declare SERVICE="$1" ENCRYPTION_KEY="$2"
local SERVICE_ROOT="${PLUGIN_DATA_ROOT}/${SERVICE}" local SERVICE_ROOT="${PLUGIN_DATA_ROOT}/${SERVICE}"
local SERVICE_BACKUP_ENCRYPTION_ROOT="${SERVICE_ROOT}/backup-encryption/" local SERVICE_BACKUP_ENCRYPTION_ROOT="${SERVICE_ROOT}/backup-encryption/"
@@ -292,7 +320,7 @@ service_backup_set_encryption() {
} }
service_backup_unschedule() { service_backup_unschedule() {
declare desc="unschedules the backup of the service" declare desc="unschedule the backup of the service"
declare SERVICE="$1" declare SERVICE="$1"
local CRON_FILE="/etc/cron.d/dokku-${PLUGIN_COMMAND_PREFIX}-${SERVICE}" local CRON_FILE="/etc/cron.d/dokku-${PLUGIN_COMMAND_PREFIX}-${SERVICE}"
@@ -300,7 +328,7 @@ service_backup_unschedule() {
} }
service_backup_unset_encryption() { service_backup_unset_encryption() {
declare desc="Removes backup encryption" declare desc="remove backup encryption"
declare SERVICE="$1" declare SERVICE="$1"
local SERVICE_ROOT="${PLUGIN_DATA_ROOT}/${SERVICE}" local SERVICE_ROOT="${PLUGIN_DATA_ROOT}/${SERVICE}"
local SERVICE_BACKUP_ENCRYPTION_ROOT="${SERVICE_ROOT}/backup-encryption/" local SERVICE_BACKUP_ENCRYPTION_ROOT="${SERVICE_ROOT}/backup-encryption/"
@@ -309,7 +337,7 @@ service_backup_unset_encryption() {
} }
service_container_rm() { service_container_rm() {
declare desc="Stops a service and removes the running container" declare desc="stop a service and remove the running container"
declare SERVICE="$1" declare SERVICE="$1"
local SERVICE_NAME="$(get_service_name "$SERVICE")" local SERVICE_NAME="$(get_service_name "$SERVICE")"
local ID local ID
@@ -329,14 +357,14 @@ service_container_rm() {
} }
service_dns_hostname() { service_dns_hostname() {
declare desc="Retrieves the alias of a service" declare desc="retrieve the alias of a service"
declare SERVICE="$1" declare SERVICE="$1"
local SERVICE_NAME="$(get_service_name "$SERVICE")" local SERVICE_NAME="$(get_service_name "$SERVICE")"
echo "$SERVICE_NAME" | tr ._ - echo "$SERVICE_NAME" | tr ._ -
} }
service_enter() { service_enter() {
declare desc="enters running app container of specified proc type" declare desc="enter running app container of specified proc type"
declare SERVICE="$1" && shift 1 declare SERVICE="$1" && shift 1
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local ID="$(cat "$SERVICE_ROOT/ID")" local ID="$(cat "$SERVICE_ROOT/ID")"
@@ -351,7 +379,7 @@ service_enter() {
} }
service_exposed_ports() { service_exposed_ports() {
declare desc="Lists exposed ports for a service" declare desc="list exposed ports for a service"
declare SERVICE="$1" declare SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local PORT_FILE="$SERVICE_ROOT/PORT" local PORT_FILE="$SERVICE_ROOT/PORT"
@@ -363,7 +391,7 @@ service_exposed_ports() {
} }
service_image_exists() { service_image_exists() {
declare desc="Checks if the current image exists" declare desc="check if the current image exists"
local IMAGE="$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION" local IMAGE="$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION"
if [[ "$(docker images -q "$IMAGE" 2>/dev/null)" == "" ]]; then if [[ "$(docker images -q "$IMAGE" 2>/dev/null)" == "" ]]; then
@@ -374,7 +402,7 @@ service_image_exists() {
} }
service_info() { service_info() {
declare desc="Retrieves information about a given service" declare desc="retrieve information about a given service"
declare SERVICE="$1" INFO_FLAG="$2" declare SERVICE="$1" INFO_FLAG="$2"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local SERVICE_URL=$(service_url "$SERVICE") local SERVICE_URL=$(service_url "$SERVICE")
@@ -384,6 +412,7 @@ service_info() {
local flag_map=( local flag_map=(
"--config-dir: ${SERVICE_ROOT}/${PLUGIN_CONFIG_SUFFIX}" "--config-dir: ${SERVICE_ROOT}/${PLUGIN_CONFIG_SUFFIX}"
"--config-options: $(cat "$SERVICE_ROOT/CONFIG_OPTIONS")"
"--data-dir: ${SERVICE_ROOT}/data" "--data-dir: ${SERVICE_ROOT}/data"
"--dsn: ${SERVICE_URL}" "--dsn: ${SERVICE_URL}"
"--exposed-ports: $(service_exposed_ports "$SERVICE")" "--exposed-ports: $(service_exposed_ports "$SERVICE")"
@@ -413,7 +442,7 @@ service_info() {
} }
service_is_linked() { service_is_linked() {
declare desc="Links a service to an application" declare desc="link a service to an application"
declare SERVICE="$1" APP="$2" declare SERVICE="$1" APP="$2"
update_plugin_scheme_for_app "$APP" update_plugin_scheme_for_app "$APP"
local SERVICE_URL=$(service_url "$SERVICE") local SERVICE_URL=$(service_url "$SERVICE")
@@ -427,7 +456,7 @@ service_is_linked() {
} }
service_link() { service_link() {
declare desc="Links a service to an application" declare desc="link a service to an application"
declare SERVICE="$1" APP="$2" declare SERVICE="$1" APP="$2"
update_plugin_scheme_for_app "$APP" update_plugin_scheme_for_app "$APP"
local SERVICE_URL=$(service_url "$SERVICE") local SERVICE_URL=$(service_url "$SERVICE")
@@ -453,6 +482,7 @@ service_link() {
fi fi
[[ -n $LINK ]] && dokku_log_fail "Already linked as $LINK" [[ -n $LINK ]] && dokku_log_fail "Already linked as $LINK"
plugn trigger service-action pre-link "$SERVICE" "$APP"
touch "$LINKS_FILE" touch "$LINKS_FILE"
echo "$APP" >>"$LINKS_FILE" echo "$APP" >>"$LINKS_FILE"
sort "$LINKS_FILE" -u -o "$LINKS_FILE" sort "$LINKS_FILE" -u -o "$LINKS_FILE"
@@ -465,11 +495,13 @@ service_link() {
dokku docker-options:add "$APP" build,deploy,run "--link $SERVICE_NAME:$SERVICE_DNS_HOSTNAME" dokku docker-options:add "$APP" build,deploy,run "--link $SERVICE_NAME:$SERVICE_DNS_HOSTNAME"
fi fi
[[ -n "$SERVICE_QUERYSTRING" ]] && SERVICE_URL="${SERVICE_URL}?${SERVICE_QUERYSTRING}" [[ -n "$SERVICE_QUERYSTRING" ]] && SERVICE_URL="${SERVICE_URL}?${SERVICE_QUERYSTRING}"
plugn trigger service-action post-link "$SERVICE" "$APP"
config_set "$APP" "${ALIAS}_URL=$SERVICE_URL" config_set "$APP" "${ALIAS}_URL=$SERVICE_URL"
plugn trigger service-action post-link-complete "$SERVICE" "$APP"
} }
service_linked_apps() { service_linked_apps() {
declare desc="Lists all apps linked to a service for info output" declare desc="list all apps linked to a service for info output"
declare SERVICE="$1" declare SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local LINKS_FILE="$SERVICE_ROOT/LINKS" local LINKS_FILE="$SERVICE_ROOT/LINKS"
@@ -481,7 +513,7 @@ service_linked_apps() {
} }
service_links() { service_links() {
declare desc="Lists all apps linked to a service" declare desc="list all apps linked to a service"
declare SERVICE="$1" declare SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local LINKS_FILE="$SERVICE_ROOT/LINKS" local LINKS_FILE="$SERVICE_ROOT/LINKS"
@@ -493,7 +525,7 @@ service_links() {
} }
service_list() { service_list() {
declare desc="Lists all services and their status" declare desc="list all services and their status"
local SERVICES=$(ls "$PLUGIN_DATA_ROOT" 2>/dev/null) local SERVICES=$(ls "$PLUGIN_DATA_ROOT" 2>/dev/null)
if [[ -z $SERVICES ]]; then if [[ -z $SERVICES ]]; then
@@ -508,7 +540,7 @@ service_list() {
} }
service_logs() { service_logs() {
declare desc="Displays logs for a service" declare desc="display logs for a service"
declare SERVICE="$1" TAIL_FLAG="$2" declare SERVICE="$1" TAIL_FLAG="$2"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local ID=$(cat "$SERVICE_ROOT/ID") local ID=$(cat "$SERVICE_ROOT/ID")
@@ -597,7 +629,7 @@ service_parse_args() {
} }
service_password() { service_password() {
declare desc="Fetch the password for a service" declare desc="fetch the password for a service"
declare SERVICE="$1" declare SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local PASSWORD_FILE="$SERVICE_ROOT/PASSWORD" local PASSWORD_FILE="$SERVICE_ROOT/PASSWORD"
@@ -607,7 +639,7 @@ service_password() {
} }
service_root_password() { service_root_password() {
declare desc="Fetch the root password for a service" declare desc="fetch the root password for a service"
declare SERVICE="$1" declare SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local PASSWORD_FILE="$SERVICE_ROOT/ROOTPASSWORD" local PASSWORD_FILE="$SERVICE_ROOT/ROOTPASSWORD"
@@ -617,14 +649,14 @@ service_root_password() {
} }
service_port_expose() { service_port_expose() {
declare desc="Wrapper for exposing service ports" declare desc="wrapper for exposing service ports"
declare SERVICE="$1" declare SERVICE="$1"
service_start "$SERVICE" "true" service_start "$SERVICE" "true"
service_port_unpause "$SERVICE" "true" "${@:2}" service_port_unpause "$SERVICE" "true" "${@:2}"
} }
service_port_pause() { service_port_pause() {
declare desc="Pauses service exposure" declare desc="pause service exposure"
declare SERVICE="$1" LOG_FAIL="$2" declare SERVICE="$1" LOG_FAIL="$2"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local EXPOSED_NAME="$(get_service_name "$SERVICE").ambassador" local EXPOSED_NAME="$(get_service_name "$SERVICE").ambassador"
@@ -654,7 +686,7 @@ service_port_pause() {
} }
service_port_unexpose() { service_port_unexpose() {
declare desc="Wrapper for pausing exposed service ports" declare desc="wrapper for pausing exposed service ports"
declare SERVICE="$1" declare SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local PORT_FILE="$SERVICE_ROOT/PORT" local PORT_FILE="$SERVICE_ROOT/PORT"
@@ -663,7 +695,7 @@ service_port_unexpose() {
} }
service_port_unpause() { service_port_unpause() {
declare desc="Starts service exposure" declare desc="start service exposure"
declare SERVICE="$1" LOG_FAIL="$2" declare SERVICE="$1" LOG_FAIL="$2"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local SERVICE_NAME="$(get_service_name "$SERVICE")" local SERVICE_NAME="$(get_service_name "$SERVICE")"
@@ -694,7 +726,7 @@ service_port_unpause() {
} }
service_promote() { service_promote() {
declare desc="Promotes a secondary service to the primary env var" declare desc="promote a secondary service to the primary env var"
declare SERVICE="$1" APP="$2" declare SERVICE="$1" APP="$2"
local PLUGIN_DEFAULT_CONFIG_VAR="${PLUGIN_DEFAULT_ALIAS}_URL" local PLUGIN_DEFAULT_CONFIG_VAR="${PLUGIN_DEFAULT_ALIAS}_URL"
local EXISTING_CONFIG=$(config_all "$APP") local EXISTING_CONFIG=$(config_all "$APP")
@@ -722,7 +754,7 @@ service_promote() {
} }
service_set_alias() { service_set_alias() {
declare desc="Sets the alias in use for a service" declare desc="sets the alias in use for a service"
declare SERVICE="$1" ALIAS="$2" declare SERVICE="$1" ALIAS="$2"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local ALIAS_FILE="$SERVICE_ROOT/ALIAS" local ALIAS_FILE="$SERVICE_ROOT/ALIAS"
@@ -732,7 +764,7 @@ service_set_alias() {
} }
service_status() { service_status() {
declare desc="Displays the status of a service" declare desc="display the status of a service"
declare SERVICE="$1" declare SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local ID="$(cat "$SERVICE_ROOT/ID")" local ID="$(cat "$SERVICE_ROOT/ID")"
@@ -744,7 +776,7 @@ service_status() {
} }
service_stop() { service_stop() {
declare desc="Stops a running service" declare desc="stop a running service"
declare SERVICE="$1" declare SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local SERVICE_NAME="$(get_service_name "$SERVICE")" local SERVICE_NAME="$(get_service_name "$SERVICE")"
@@ -762,7 +794,7 @@ service_stop() {
} }
service_unlink() { service_unlink() {
declare desc="Unlinks an application from a service" declare desc="unlink an application from a service"
declare SERVICE="$1" APP="$2" declare SERVICE="$1" APP="$2"
update_plugin_scheme_for_app "$APP" update_plugin_scheme_for_app "$APP"
local SERVICE_URL=$(service_url "$SERVICE") local SERVICE_URL=$(service_url "$SERVICE")
@@ -771,6 +803,7 @@ service_unlink() {
local SERVICE_DNS_HOSTNAME=$(service_dns_hostname "$SERVICE") local SERVICE_DNS_HOSTNAME=$(service_dns_hostname "$SERVICE")
local LINK=($(echo "$EXISTING_CONFIG" | grep "$SERVICE_URL" | cut -d: -f1)) || true local LINK=($(echo "$EXISTING_CONFIG" | grep "$SERVICE_URL" | cut -d: -f1)) || true
plugn trigger service-action pre-unlink "$SERVICE" "$APP"
remove_from_links_file "$SERVICE" "$APP" remove_from_links_file "$SERVICE" "$APP"
if declare -f -F add_passed_docker_option >/dev/null; then if declare -f -F add_passed_docker_option >/dev/null; then
@@ -782,18 +815,20 @@ service_unlink() {
fi fi
[[ -z ${LINK[*]} ]] && dokku_log_fail "Not linked to app $APP" [[ -z ${LINK[*]} ]] && dokku_log_fail "Not linked to app $APP"
plugn trigger service-action post-unlink "$SERVICE" "$APP"
config_unset "$APP" "${LINK[@]}" config_unset "$APP" "${LINK[@]}"
plugn trigger service-action post-unlink-complete "$SERVICE" "$APP"
} }
service_version() { service_version() {
declare desc="Displays the running version for an image" declare desc="display the running version for an image"
declare SERVICE="$1" declare SERVICE="$1"
local SERVICE_NAME="$(get_service_name "$SERVICE")" local SERVICE_NAME="$(get_service_name "$SERVICE")"
docker inspect -f '{{.Config.Image}}' "$SERVICE_NAME" 2>/dev/null || true docker inspect -f '{{.Config.Image}}' "$SERVICE_NAME" 2>/dev/null || true
} }
update_plugin_scheme_for_app() { update_plugin_scheme_for_app() {
declare desc="Retrieves the updated plugin scheme" declare desc="retrieve the updated plugin scheme"
declare APP="$1" declare APP="$1"
local DATABASE_SCHEME local DATABASE_SCHEME
@@ -802,7 +837,7 @@ update_plugin_scheme_for_app() {
} }
verify_service_name() { verify_service_name() {
declare desc="Verifies that a service exists" declare desc="verify that a service exists"
declare SERVICE="$1" declare SERVICE="$1"
[[ -z "$SERVICE" ]] && dokku_log_fail "(verify_service_name) SERVICE must not be null" [[ -z "$SERVICE" ]] && dokku_log_fail "(verify_service_name) SERVICE must not be null"
[[ ! -d "$PLUGIN_DATA_ROOT/$SERVICE" ]] && dokku_log_fail "$PLUGIN_SERVICE service $SERVICE does not exist" [[ ! -d "$PLUGIN_DATA_ROOT/$SERVICE" ]] && dokku_log_fail "$PLUGIN_SERVICE service $SERVICE does not exist"
@@ -810,7 +845,7 @@ verify_service_name() {
} }
write_database_name() { write_database_name() {
declare desc="Writes a sanitized database name" declare desc="write a sanitized database name"
declare SERVICE="$1" declare SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"

7
config
View File

@@ -1,6 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
export POSTGRES_IMAGE=${POSTGRES_IMAGE:="postgres"} _DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
export POSTGRES_IMAGE_VERSION=${POSTGRES_IMAGE_VERSION:="11.6"} export POSTGRES_IMAGE=${POSTGRES_IMAGE:="$(awk -F '[ :]' '{print $2}' "${_DIR}/Dockerfile")"}
export POSTGRES_IMAGE_VERSION=${POSTGRES_IMAGE_VERSION:="$(awk -F '[ :]' '{print $3}' "${_DIR}/Dockerfile")"}
export POSTGRES_ROOT=${POSTGRES_ROOT:="$DOKKU_LIB_ROOT/services/postgres"} export POSTGRES_ROOT=${POSTGRES_ROOT:="$DOKKU_LIB_ROOT/services/postgres"}
export POSTGRES_HOST_ROOT=${POSTGRES_HOST_ROOT:=$POSTGRES_ROOT} export POSTGRES_HOST_ROOT=${POSTGRES_HOST_ROOT:=$POSTGRES_ROOT}
@@ -30,3 +31,5 @@ export PLUGIN_BUSYBOX_IMAGE="busybox:1.31.1-uclibc"
export PLUGIN_AMBASSADOR_IMAGE="dokku/ambassador:0.3.3" export PLUGIN_AMBASSADOR_IMAGE="dokku/ambassador:0.3.3"
export PLUGIN_S3BACKUP_IMAGE="dokku/s3backup:0.10.3" export PLUGIN_S3BACKUP_IMAGE="dokku/s3backup:0.10.3"
export PLUGIN_WAIT_IMAGE="dokku/wait:0.4.3" export PLUGIN_WAIT_IMAGE="dokku/wait:0.4.3"
export POSTGRES_CONFIG_OPTIONS=${POSTGRES_CONFIG_OPTIONS:=""}

View File

@@ -17,7 +17,7 @@ service_connect() {
local SERVICE_TTY_OPTS local SERVICE_TTY_OPTS
has_tty && SERVICE_TTY_OPTS="-t" has_tty && SERVICE_TTY_OPTS="-t"
docker exec -i $SERVICE_TTY_OPTS "$SERVICE_NAME" psql -h localhost -U postgres "$DATABASE_NAME" docker exec --env=LANG=C.UTF-8 --env=LC_ALL=C.UTF-8 -i $SERVICE_TTY_OPTS "$SERVICE_NAME" psql -h localhost -U postgres "$DATABASE_NAME"
} }
service_create() { service_create() {
@@ -40,6 +40,7 @@ service_create() {
docker pull "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION" || dokku_log_fail "$PLUGIN_SERVICE image $PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION pull failed" docker pull "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION" || dokku_log_fail "$PLUGIN_SERVICE image $PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION pull failed"
fi fi
plugn trigger service-action pre-create "$SERVICE"
mkdir -p "$SERVICE_ROOT" || dokku_log_fail "Unable to create service directory" mkdir -p "$SERVICE_ROOT" || dokku_log_fail "Unable to create service directory"
mkdir -p "$SERVICE_ROOT/data" || dokku_log_fail "Unable to create service data directory" mkdir -p "$SERVICE_ROOT/data" || dokku_log_fail "Unable to create service data directory"
touch "$LINKS_FILE" touch "$LINKS_FILE"
@@ -52,15 +53,11 @@ service_create() {
echo "$PASSWORD" >"$SERVICE_ROOT/PASSWORD" echo "$PASSWORD" >"$SERVICE_ROOT/PASSWORD"
chmod 640 "$SERVICE_ROOT/PASSWORD" chmod 640 "$SERVICE_ROOT/PASSWORD"
[[ -n "$SERVICE_CUSTOM_ENV" ]] && POSTGRES_CUSTOM_ENV="$SERVICE_CUSTOM_ENV" service_commit_config "$SERVICE"
if [[ -n $POSTGRES_CUSTOM_ENV ]]; then
echo "$POSTGRES_CUSTOM_ENV" | tr ';' "\n" >"$SERVICE_ROOT/ENV"
else
echo "" >"$SERVICE_ROOT/ENV"
fi
write_database_name "$SERVICE" write_database_name "$SERVICE"
plugn trigger service-action post-create "$SERVICE"
service_create_container "$SERVICE" service_create_container "$SERVICE"
plugn trigger service-action post-create-complete "$SERVICE"
} }
service_create_container() { service_create_container() {
@@ -72,7 +69,17 @@ service_create_container() {
local DATABASE_NAME="$(get_database_name "$SERVICE")" local DATABASE_NAME="$(get_database_name "$SERVICE")"
local PREVIOUS_ID local PREVIOUS_ID
ID=$(docker run --name "$SERVICE_NAME" -v "$SERVICE_HOST_ROOT/data:/var/lib/postgresql/data" -e "POSTGRES_PASSWORD=$PASSWORD" --env-file="$SERVICE_ROOT/ENV" -d --restart always --label dokku=service --label dokku.service=postgres "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION") if [[ -f "$SERVICE_ROOT/CONFIG_OPTIONS" ]]; then
export CONFIG_OPTIONS="$(cat "$SERVICE_ROOT/CONFIG_OPTIONS")"
fi
[[ -f "$SERVICE_ROOT/SERVICE_MEMORY" ]] && SERVICE_MEMORY="$(cat "$SERVICE_ROOT/SERVICE_MEMORY")"
if [[ -n "$SERVICE_MEMORY" ]]; then
MEMORY_LIMIT="--memory=${SERVICE_MEMORY}m"
fi
# shellcheck disable=SC2086
ID=$(docker run --name "$SERVICE_NAME" $MEMORY_LIMIT -v "$SERVICE_HOST_ROOT/data:/var/lib/postgresql/data" -e "POSTGRES_PASSWORD=$PASSWORD" --env-file="$SERVICE_ROOT/ENV" -d --restart always --label dokku=service --label dokku.service=postgres "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION" $CONFIG_OPTIONS)
echo "$ID" >"$SERVICE_ROOT/ID" echo "$ID" >"$SERVICE_ROOT/ID"
dokku_log_verbose_quiet "Waiting for container to be ready" dokku_log_verbose_quiet "Waiting for container to be ready"
@@ -118,7 +125,7 @@ service_import() {
if [[ -t 0 ]]; then if [[ -t 0 ]]; then
dokku_log_fail "No data provided on stdin." dokku_log_fail "No data provided on stdin."
fi fi
docker exec -i "$SERVICE_NAME" env PGPASSWORD="$PASSWORD" pg_restore -h localhost -cO --if-exists -d "$DATABASE_NAME" -U postgres -w docker exec -i "$SERVICE_NAME" env PGPASSWORD="$PASSWORD" pg_restore -h localhost -cO --if-exists -C -d "$DATABASE_NAME" -U postgres -w
} }
service_start() { service_start() {
@@ -147,7 +154,11 @@ service_start() {
elif service_image_exists "$SERVICE" && [[ -n "$PASSWORD" ]]; then elif service_image_exists "$SERVICE" && [[ -n "$PASSWORD" ]]; then
service_create_container "$SERVICE" service_create_container "$SERVICE"
else else
dokku_log_verbose_quiet "Neither container nor valid configuration exists for $SERVICE" if ! service_image_exists "$SERVICE"; then
dokku_log_verbose_quiet "Missing image $PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION for $SERVICE"
else
dokku_log_verbose_quiet "Neither container nor valid configuration exists for $SERVICE"
fi
fi fi
} }

View File

@@ -76,10 +76,10 @@ fn-help-contents() {
fn-help-contents-subcommand() { fn-help-contents-subcommand() {
declare SUBCOMMAND="$1" FULL_OUTPUT="$2" declare SUBCOMMAND="$1" FULL_OUTPUT="$2"
local TMPDIR=$(mktemp -d --tmpdir) local HELP_TMPDIR=$(mktemp -d --tmpdir)
local UNCLEAN_FILE="${TMPDIR}/cmd-unclean" CLEAN_FILE="${TMPDIR}/cmd-clean" local UNCLEAN_FILE="${HELP_TMPDIR}/cmd-unclean" CLEAN_FILE="${HELP_TMPDIR}/cmd-clean"
local BOLD CMD_OUTPUT CYAN EXAMPLE LIGHT_GRAY NORMAL local BOLD CMD_OUTPUT CYAN EXAMPLE LIGHT_GRAY NORMAL
trap 'rm -rf "$TMPDIR" > /dev/null' RETURN INT TERM EXIT trap 'rm -rf "$HELP_TMPDIR" > /dev/null' RETURN INT TERM EXIT
rm -rf "$UNCLEAN_FILE" "$CLEAN_FILE" rm -rf "$UNCLEAN_FILE" "$CLEAN_FILE"
cat "$SUBCOMMAND_ROOT/$SUBCOMMAND" >"$UNCLEAN_FILE" cat "$SUBCOMMAND_ROOT/$SUBCOMMAND" >"$UNCLEAN_FILE"
@@ -141,7 +141,7 @@ fn-help-contents-subcommand() {
} }
fn-help-fancy-tput() { fn-help-fancy-tput() {
declare desc="A wrapper around tput" declare desc="a wrapper around tput"
if [[ -n "$DOKKU_NO_COLOR" ]] || [[ "$TERM" == "unknown" ]] || [[ "$TERM" == "dumb" ]]; then if [[ -n "$DOKKU_NO_COLOR" ]] || [[ "$TERM" == "unknown" ]] || [[ "$TERM" == "dumb" ]]; then
return return
@@ -151,7 +151,7 @@ fn-help-fancy-tput() {
} }
fn-help-fancy-color() { fn-help-fancy-color() {
declare desc="A wrapper around colors" declare desc="a wrapper around colors"
if [[ -n "$DOKKU_NO_COLOR" ]] || [[ "$TERM" == "unknown" ]] || [[ "$TERM" == "dumb" ]]; then if [[ -n "$DOKKU_NO_COLOR" ]] || [[ "$TERM" == "unknown" ]] || [[ "$TERM" == "dumb" ]]; then
return return
@@ -309,7 +309,7 @@ fn-help-subcommand-sanitize() {
} }
_fn-help-apply-shell-expansion() { _fn-help-apply-shell-expansion() {
declare desc="Expand environment variables for a shell command" declare desc="expand environment variables for a shell command"
declare data="$1" declare data="$1"
declare delimiter="__apply_shell_expansion_delimiter__" declare delimiter="__apply_shell_expansion_delimiter__"
declare command="cat <<$delimiter"$'\n'"$data"$'\n'"$delimiter" declare command="cat <<$delimiter"$'\n'"$data"$'\n'"$delimiter"

View File

@@ -42,6 +42,14 @@ plugin-install() {
EOL EOL
chmod 0440 "$_SUDOERS_FILE" chmod 0440 "$_SUDOERS_FILE"
local SERVICES=$(ls "$PLUGIN_DATA_ROOT" 2>/dev/null)
for SERVICE in $SERVICES; do
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
if [[ -f "$SERVICE_ROOT/${PLUGIN_VARIABLE}_CONFIG_OPTIONS" ]]; then
mv "$SERVICE_ROOT/${PLUGIN_VARIABLE}_CONFIG_OPTIONS" "$SERVICE_ROOT/CONFIG_OPTIONS"
fi
done
} }
plugin-install "$@" plugin-install "$@"

View File

@@ -1,4 +1,4 @@
[plugin] [plugin]
description = "dokku postgres service plugin" description = "dokku postgres service plugin"
version = "1.11.5" version = "1.13.0"
[plugin.config] [plugin.config]

View File

@@ -8,10 +8,12 @@ source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-backup-cmd() { service-backup-cmd() {
#E backup the 'lolipop' service to the 'my-s3-bucket' bucket on AWS #E backup the 'lolipop' service to the 'my-s3-bucket' bucket on AWS
#E dokku $PLUGIN_COMMAND_PREFIX:backup lolipop my-s3-bucket --use-iam #E dokku $PLUGIN_COMMAND_PREFIX:backup lolipop my-s3-bucket --use-iam
#E restore a backup file (assuming it was extracted via 'tar -xf backup.tgz')
#E dokku $PLUGIN_COMMAND_PREFIX:import lolipop < backup-folder/export
#F -u|--use-iam, use the IAM profile associated with the current server #F -u|--use-iam, use the IAM profile associated with the current server
#A service, service to run command against #A service, service to run command against
#A bucket-name, name of the s3 bucket to upload backups to #A bucket-name, name of the s3 bucket to upload backups to
declare desc="creates a backup of the $PLUGIN_SERVICE service to an existing s3 bucket" declare desc="create a backup of the $PLUGIN_SERVICE service to an existing s3 bucket"
local cmd="$PLUGIN_COMMAND_PREFIX:backup" argv=("$@") local cmd="$PLUGIN_COMMAND_PREFIX:backup" argv=("$@")
[[ ${argv[0]} == "$cmd" ]] && shift 1 [[ ${argv[0]} == "$cmd" ]] && shift 1
declare SERVICE="$1" BUCKET_NAME="$2" USE_IAM_OPTIONAL_FLAG="$3" declare SERVICE="$1" BUCKET_NAME="$2" USE_IAM_OPTIONAL_FLAG="$3"

View File

@@ -20,7 +20,7 @@ service-backup-auth-cmd() {
#A aws-default-region, (optional) a valid amazon S3 region #A aws-default-region, (optional) a valid amazon S3 region
#A aws-signature-version, (optional) the AWS signature version to use when signing S3 requests #A aws-signature-version, (optional) the AWS signature version to use when signing S3 requests
#A endpoint-url, (optional) an aws endpoint to upload to #A endpoint-url, (optional) an aws endpoint to upload to
declare desc="sets up authentication for backups on the $PLUGIN_SERVICE service" declare desc="set up authentication for backups on the $PLUGIN_SERVICE service"
local cmd="$PLUGIN_COMMAND_PREFIX:backup-auth" argv=("$@") local cmd="$PLUGIN_COMMAND_PREFIX:backup-auth" argv=("$@")
[[ ${argv[0]} == "$cmd" ]] && shift 1 [[ ${argv[0]} == "$cmd" ]] && shift 1
declare SERVICE="$1" AWS_ACCESS_KEY_ID="$2" AWS_SECRET_ACCESS_KEY="$3" AWS_DEFAULT_REGION="$4" AWS_SIGNATURE_VERSION="$5" ENDPOINT_URL="$6" declare SERVICE="$1" AWS_ACCESS_KEY_ID="$2" AWS_SECRET_ACCESS_KEY="$3" AWS_DEFAULT_REGION="$4" AWS_SIGNATURE_VERSION="$5" ENDPOINT_URL="$6"

View File

@@ -9,7 +9,7 @@ service-backup-deauth-cmd() {
#E remove s3 authentication #E remove s3 authentication
#E dokku $PLUGIN_COMMAND_PREFIX:backup-deauth lolipop #E dokku $PLUGIN_COMMAND_PREFIX:backup-deauth lolipop
#A service, service to run command against #A service, service to run command against
declare desc="removes backup authentication for the $PLUGIN_SERVICE service" declare desc="remove backup authentication for the $PLUGIN_SERVICE service"
local cmd="$PLUGIN_COMMAND_PREFIX:backup-deauth" argv=("$@") local cmd="$PLUGIN_COMMAND_PREFIX:backup-deauth" argv=("$@")
[[ ${argv[0]} == "$cmd" ]] && shift 1 [[ ${argv[0]} == "$cmd" ]] && shift 1
declare SERVICE="$1" declare SERVICE="$1"

View File

@@ -15,7 +15,7 @@ service-backup-schedule-cmd() {
#A service, service to run command against #A service, service to run command against
#A schedule, a cron schedule to run backups on #A schedule, a cron schedule to run backups on
#A bucket-name, name of the s3 bucket to upload backups to #A bucket-name, name of the s3 bucket to upload backups to
declare desc="schedules a backup of the $PLUGIN_SERVICE service" declare desc="schedule a backup of the $PLUGIN_SERVICE service"
local cmd="$PLUGIN_COMMAND_PREFIX:backup-schedule" argv=("$@") local cmd="$PLUGIN_COMMAND_PREFIX:backup-schedule" argv=("$@")
[[ ${argv[0]} == "$cmd" ]] && shift 1 [[ ${argv[0]} == "$cmd" ]] && shift 1
declare SERVICE="$1" SCHEDULE="$2" BUCKET_NAME="$3" USE_IAM_OPTIONAL_FLAG="$4" declare SERVICE="$1" SCHEDULE="$2" BUCKET_NAME="$3" USE_IAM_OPTIONAL_FLAG="$4"

View File

@@ -10,7 +10,7 @@ service-backup-set-encryption-cmd() {
#E dokku $PLUGIN_COMMAND_PREFIX:backup-set-encryption lolipop #E dokku $PLUGIN_COMMAND_PREFIX:backup-set-encryption lolipop
#A service, service to run command against #A service, service to run command against
#A passphrase, a GPG-compatible passphrase #A passphrase, a GPG-compatible passphrase
declare desc="sets encryption for all future backups of $PLUGIN_SERVICE service" declare desc="set encryption for all future backups of $PLUGIN_SERVICE service"
local cmd="$PLUGIN_COMMAND_PREFIX:backup-set-encryption" argv=("$@") local cmd="$PLUGIN_COMMAND_PREFIX:backup-set-encryption" argv=("$@")
[[ ${argv[0]} == "$cmd" ]] && shift 1 [[ ${argv[0]} == "$cmd" ]] && shift 1
declare SERVICE="$1" PASSPHRASE="$2" declare SERVICE="$1" PASSPHRASE="$2"

View File

@@ -9,7 +9,7 @@ service-backup-unschedule-cmd() {
#E remove the scheduled backup from cron #E remove the scheduled backup from cron
#E dokku $PLUGIN_COMMAND_PREFIX:backup-unschedule lolipop #E dokku $PLUGIN_COMMAND_PREFIX:backup-unschedule lolipop
#A service, service to run command against #A service, service to run command against
declare desc="unschedules the backup of the $PLUGIN_SERVICE service" declare desc="unschedule the backup of the $PLUGIN_SERVICE service"
local cmd="$PLUGIN_COMMAND_PREFIX:backup-unschedule" argv=("$@") local cmd="$PLUGIN_COMMAND_PREFIX:backup-unschedule" argv=("$@")
[[ ${argv[0]} == "$cmd" ]] && shift 1 [[ ${argv[0]} == "$cmd" ]] && shift 1
declare SERVICE="$1" declare SERVICE="$1"

View File

@@ -9,7 +9,7 @@ service-backup-unset-encryption-cmd() {
#E unset the GPG encryption passphrase for backups #E unset the GPG encryption passphrase for backups
#E dokku $PLUGIN_COMMAND_PREFIX:backup-unset-encryption lolipop #E dokku $PLUGIN_COMMAND_PREFIX:backup-unset-encryption lolipop
#A service, service to run command against #A service, service to run command against
declare desc="unsets encryption for future backups of the $PLUGIN_SERVICE service" declare desc="unset encryption for future backups of the $PLUGIN_SERVICE service"
local cmd="$PLUGIN_COMMAND_PREFIX:backup-unset-encryption" argv=("$@") local cmd="$PLUGIN_COMMAND_PREFIX:backup-unset-encryption" argv=("$@")
[[ ${argv[0]} == "$cmd" ]] && shift 1 [[ ${argv[0]} == "$cmd" ]] && shift 1
declare SERVICE="$1" declare SERVICE="$1"

View File

@@ -10,9 +10,11 @@ service-clone-cmd() {
#E dokku $PLUGIN_COMMAND_PREFIX:clone lolipop lolipop-2 #E dokku $PLUGIN_COMMAND_PREFIX:clone lolipop lolipop-2
#A service, service to run command against #A service, service to run command against
#A new-service, name of new service #A new-service, name of new service
#F -c|--config-options "--args --go=here", extra arguments to pass to the container create command
#F -C|--custom-env "USER=alpha;HOST=beta", semi-colon delimited environment variables to start the service with #F -C|--custom-env "USER=alpha;HOST=beta", semi-colon delimited environment variables to start the service with
#F -i|--image IMAGE, the image name to start the service with #F -i|--image IMAGE, the image name to start the service with
#F -I|--image-version IMAGE_VERSION, the image version to start the service with #F -I|--image-version IMAGE_VERSION, the image version to start the service with
#F -m|--memory MEMORY, container memory limit (default: unlimited)
#F -p|--password PASSWORD, override the user-level service password #F -p|--password PASSWORD, override the user-level service password
#F -r|--root-password PASSWORD, override the root-level service password #F -r|--root-password PASSWORD, override the root-level service password
declare desc="create container <new-name> then copy data from <name> into <new-name>" declare desc="create container <new-name> then copy data from <name> into <new-name>"

View File

@@ -10,17 +10,19 @@ service-create-cmd() {
#E dokku $PLUGIN_COMMAND_PREFIX:create lolipop #E dokku $PLUGIN_COMMAND_PREFIX:create lolipop
#E you can also specify the image and image version to use for the service. #E you can also specify the image and image version to use for the service.
#E it *must* be compatible with the ${PLUGIN_IMAGE} image. #E it *must* be compatible with the ${PLUGIN_IMAGE} image.
#E export ${PLUGIN_DEFAULT_ALIAS}_IMAGE="${PLUGIN_IMAGE}" #E export ${PLUGIN_VARIABLE}_IMAGE="${PLUGIN_IMAGE}"
#E export ${PLUGIN_DEFAULT_ALIAS}_IMAGE_VERSION="${PLUGIN_IMAGE_VERSION}" #E export ${PLUGIN_VARIABLE}_IMAGE_VERSION="${PLUGIN_IMAGE_VERSION}"
#E dokku $PLUGIN_COMMAND_PREFIX:create lolipop #E dokku $PLUGIN_COMMAND_PREFIX:create lolipop
#E you can also specify custom environment variables to start #E you can also specify custom environment variables to start
#E the ${PLUGIN_COMMAND_PREFIX} service in semi-colon separated form. #E the ${PLUGIN_COMMAND_PREFIX} service in semi-colon separated form.
#E export ${PLUGIN_DEFAULT_ALIAS}_CUSTOM_ENV="USER=alpha;HOST=beta" #E export ${PLUGIN_VARIABLE}_CUSTOM_ENV="USER=alpha;HOST=beta"
#E dokku $PLUGIN_COMMAND_PREFIX:create lolipop #E dokku $PLUGIN_COMMAND_PREFIX:create lolipop
#A service, service to run command against #A service, service to run command against
#F -c|--config-options "--args --go=here", extra arguments to pass to the container create command
#F -C|--custom-env "USER=alpha;HOST=beta", semi-colon delimited environment variables to start the service with #F -C|--custom-env "USER=alpha;HOST=beta", semi-colon delimited environment variables to start the service with
#F -i|--image IMAGE, the image name to start the service with #F -i|--image IMAGE, the image name to start the service with
#F -I|--image-version IMAGE_VERSION, the image version to start the service with #F -I|--image-version IMAGE_VERSION, the image version to start the service with
#F -m|--memory MEMORY, container memory limit (default: unlimited)
#F -p|--password PASSWORD, override the user-level service password #F -p|--password PASSWORD, override the user-level service password
#F -r|--root-password PASSWORD, override the root-level service password #F -r|--root-password PASSWORD, override the root-level service password
declare desc="create a $PLUGIN_SERVICE service" declare desc="create a $PLUGIN_SERVICE service"

View File

@@ -41,6 +41,7 @@ service-destroy-cmd() {
fi fi
dokku_log_info2_quiet "Deleting $SERVICE" dokku_log_info2_quiet "Deleting $SERVICE"
plugn trigger service-action pre-delete "$SERVICE"
service_backup_unschedule "$SERVICE" service_backup_unschedule "$SERVICE"
service_container_rm "$SERVICE" service_container_rm "$SERVICE"
@@ -48,6 +49,7 @@ service-destroy-cmd() {
docker run --rm -v "$SERVICE_HOST_ROOT/data:/data" -v "$SERVICE_HOST_ROOT/$PLUGIN_CONFIG_SUFFIX:/config" "$PLUGIN_BUSYBOX_IMAGE" chmod 777 -R /config /data docker run --rm -v "$SERVICE_HOST_ROOT/data:/data" -v "$SERVICE_HOST_ROOT/$PLUGIN_CONFIG_SUFFIX:/config" "$PLUGIN_BUSYBOX_IMAGE" chmod 777 -R /config /data
rm -rf "$SERVICE_ROOT" rm -rf "$SERVICE_ROOT"
plugn trigger service-action post-delete "$SERVICE"
dokku_log_info2 "$PLUGIN_SERVICE container deleted: $SERVICE" dokku_log_info2 "$PLUGIN_SERVICE container deleted: $SERVICE"
} }

View File

@@ -8,9 +8,11 @@ source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-expose-cmd() { service-expose-cmd() {
#E expose the service on the service's normal ports, allowing access to it from the public interface (0.0.0.0) #E expose the service on the service's normal ports, allowing access to it from the public interface (0.0.0.0)
#E dokku $PLUGIN_COMMAND_PREFIX:expose lolipop ${PLUGIN_DATASTORE_PORTS[@]} #E dokku $PLUGIN_COMMAND_PREFIX:expose lolipop ${PLUGIN_DATASTORE_PORTS[@]}
#E expose the service on the service's normal ports, with the first on a specified ip adddress (127.0.0.1)
#E dokku $PLUGIN_COMMAND_PREFIX:expose lolipop 127.0.0.1:${PLUGIN_DATASTORE_PORTS[@]}
#A service, service to run command against #A service, service to run command against
#A ports, a list of ports to run against #A ports, a list of ports to run against
declare desc="expose a $PLUGIN_SERVICE service on custom port if provided (random port otherwise)" declare desc="expose a $PLUGIN_SERVICE service on custom host:port if provided (random port on the 0.0.0.0 interface if otherwise unspecified)"
local cmd="$PLUGIN_COMMAND_PREFIX:expose" argv=("$@") local cmd="$PLUGIN_COMMAND_PREFIX:expose" argv=("$@")
[[ ${argv[0]} == "$cmd" ]] && shift 1 [[ ${argv[0]} == "$cmd" ]] && shift 1
declare SERVICE="$1" PORTS_LIST=("${@:2}") declare SERVICE="$1" PORTS_LIST=("${@:2}")

View File

@@ -14,12 +14,12 @@ service-link-cmd() {
#E the following environment variables will be set automatically by docker #E the following environment variables will be set automatically by docker
#E (not on the app itself, so they wont be listed when calling dokku config): #E (not on the app itself, so they wont be listed when calling dokku config):
#E #E
#E DOKKU_${PLUGIN_DEFAULT_ALIAS}_LOLIPOP_NAME=/lolipop/DATABASE #E DOKKU_${PLUGIN_VARIABLE}_LOLIPOP_NAME=/lolipop/DATABASE
#E DOKKU_${PLUGIN_DEFAULT_ALIAS}_LOLIPOP_PORT=tcp://172.17.0.1:${PLUGIN_DATASTORE_PORTS[0]} #E DOKKU_${PLUGIN_VARIABLE}_LOLIPOP_PORT=tcp://172.17.0.1:${PLUGIN_DATASTORE_PORTS[0]}
#E DOKKU_${PLUGIN_DEFAULT_ALIAS}_LOLIPOP_PORT_${PLUGIN_DATASTORE_PORTS[0]}_TCP=tcp://172.17.0.1:${PLUGIN_DATASTORE_PORTS[0]} #E DOKKU_${PLUGIN_VARIABLE}_LOLIPOP_PORT_${PLUGIN_DATASTORE_PORTS[0]}_TCP=tcp://172.17.0.1:${PLUGIN_DATASTORE_PORTS[0]}
#E DOKKU_${PLUGIN_DEFAULT_ALIAS}_LOLIPOP_PORT_${PLUGIN_DATASTORE_PORTS[0]}_TCP_PROTO=tcp #E DOKKU_${PLUGIN_VARIABLE}_LOLIPOP_PORT_${PLUGIN_DATASTORE_PORTS[0]}_TCP_PROTO=tcp
#E DOKKU_${PLUGIN_DEFAULT_ALIAS}_LOLIPOP_PORT_${PLUGIN_DATASTORE_PORTS[0]}_TCP_PORT=${PLUGIN_DATASTORE_PORTS[0]} #E DOKKU_${PLUGIN_VARIABLE}_LOLIPOP_PORT_${PLUGIN_DATASTORE_PORTS[0]}_TCP_PORT=${PLUGIN_DATASTORE_PORTS[0]}
#E DOKKU_${PLUGIN_DEFAULT_ALIAS}_LOLIPOP_PORT_${PLUGIN_DATASTORE_PORTS[0]}_TCP_ADDR=172.17.0.1 #E DOKKU_${PLUGIN_VARIABLE}_LOLIPOP_PORT_${PLUGIN_DATASTORE_PORTS[0]}_TCP_ADDR=172.17.0.1
#E #E
#E the following will be set on the linked application by default: #E the following will be set on the linked application by default:
#E #E

View File

@@ -10,6 +10,7 @@ service-upgrade-cmd() {
#E you can upgrade an existing service to a new image or image-version #E you can upgrade an existing service to a new image or image-version
#E dokku $PLUGIN_COMMAND_PREFIX:upgrade lolipop #E dokku $PLUGIN_COMMAND_PREFIX:upgrade lolipop
#A service, service to run command against #A service, service to run command against
#F -c|--config-options "--args --go=here", extra arguments to pass to the container create command
#F -C|--custom-env "USER=alpha;HOST=beta", semi-colon delimited environment variables to start the service with #F -C|--custom-env "USER=alpha;HOST=beta", semi-colon delimited environment variables to start the service with
#F -i|--image IMAGE, the image name to start the service with #F -i|--image IMAGE, the image name to start the service with
#F -I|--image-version IMAGE_VERSION, the image version to start the service with #F -I|--image-version IMAGE_VERSION, the image version to start the service with
@@ -36,6 +37,8 @@ service-upgrade-cmd() {
return return
fi fi
service_commit_config "$SERVICE"
dokku_log_info2 "Upgrading $SERVICE to $NEW_PLUGIN_IMAGE_TAG" dokku_log_info2 "Upgrading $SERVICE to $NEW_PLUGIN_IMAGE_TAG"
if [[ "$SERVICE_RESTART_APPS" == "true" ]]; then if [[ "$SERVICE_RESTART_APPS" == "true" ]]; then
dokku_log_info2 "Stopping all linked services" dokku_log_info2 "Stopping all linked services"

View File

@@ -2,18 +2,18 @@
load test_helper load test_helper
setup() { setup() {
dokku apps:create my_app dokku apps:create my-app
dokku "$PLUGIN_COMMAND_PREFIX:create" l dokku "$PLUGIN_COMMAND_PREFIX:create" l
dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app >&2 dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app >&2
} }
teardown() { teardown() {
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app >&2 dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app >&2
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" l dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" l
} }
@test "($PLUGIN_COMMAND_PREFIX:hook:pre-delete) removes app from links file when destroying app" { @test "($PLUGIN_COMMAND_PREFIX:hook:pre-delete) removes app from links file when destroying app" {
[[ -n $(< "$PLUGIN_DATA_ROOT/l/LINKS") ]] [[ -n $(< "$PLUGIN_DATA_ROOT/l/LINKS") ]]
dokku --force apps:destroy my_app dokku --force apps:destroy my-app
[[ -z $(< "$PLUGIN_DATA_ROOT/l/LINKS") ]] [[ -z $(< "$PLUGIN_DATA_ROOT/l/LINKS") ]]
} }

View File

@@ -20,6 +20,9 @@ teardown() {
} }
@test "($PLUGIN_COMMAND_PREFIX:export) success with SSH_TTY" { @test "($PLUGIN_COMMAND_PREFIX:export) success with SSH_TTY" {
if [[ -n "$GITHUB_WORKFLOW" ]]; then
skip "No tty is available on Github Actions"
fi
export SSH_TTY=`tty` export SSH_TTY=`tty`
run dokku "$PLUGIN_COMMAND_PREFIX:export" l run dokku "$PLUGIN_COMMAND_PREFIX:export" l
echo "output: $output" echo "output: $output"

View File

@@ -24,6 +24,9 @@ teardown() {
} }
@test "($PLUGIN_COMMAND_PREFIX:import) error when data is not provided" { @test "($PLUGIN_COMMAND_PREFIX:import) error when data is not provided" {
if [[ -n "$GITHUB_WORKFLOW" ]]; then
skip "No tty is available on Github Actions"
fi
run dokku "$PLUGIN_COMMAND_PREFIX:import" l run dokku "$PLUGIN_COMMAND_PREFIX:import" l
assert_contains "${lines[*]}" "No data provided on stdin" assert_contains "${lines[*]}" "No data provided on stdin"
assert_failure assert_failure

View File

@@ -4,13 +4,13 @@ load test_helper
setup() { setup() {
dokku "$PLUGIN_COMMAND_PREFIX:create" l dokku "$PLUGIN_COMMAND_PREFIX:create" l
dokku "$PLUGIN_COMMAND_PREFIX:create" m dokku "$PLUGIN_COMMAND_PREFIX:create" m
dokku apps:create my_app dokku apps:create my-app
} }
teardown() { teardown() {
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" m dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" m
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" l dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" l
dokku --force apps:destroy my_app dokku --force apps:destroy my-app
} }
@@ -39,7 +39,7 @@ teardown() {
} }
@test "($PLUGIN_COMMAND_PREFIX:link) error when the service does not exist" { @test "($PLUGIN_COMMAND_PREFIX:link) error when the service does not exist" {
run dokku "$PLUGIN_COMMAND_PREFIX:link" not_existing_service my_app run dokku "$PLUGIN_COMMAND_PREFIX:link" not_existing_service my-app
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_contains "${lines[*]}" "service not_existing_service does not exist" assert_contains "${lines[*]}" "service not_existing_service does not exist"
@@ -47,73 +47,73 @@ teardown() {
} }
@test "($PLUGIN_COMMAND_PREFIX:link) error when the service is already linked to app" { @test "($PLUGIN_COMMAND_PREFIX:link) error when the service is already linked to app" {
dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app
run dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app run dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_contains "${lines[*]}" "Already linked as DATABASE_URL" assert_contains "${lines[*]}" "Already linked as DATABASE_URL"
assert_failure assert_failure
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
} }
@test "($PLUGIN_COMMAND_PREFIX:link) exports DATABASE_URL to app" { @test "($PLUGIN_COMMAND_PREFIX:link) exports DATABASE_URL to app" {
run dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app run dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
url=$(dokku config:get my_app DATABASE_URL) url=$(dokku config:get my-app DATABASE_URL)
password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")"
assert_contains "$url" "postgres://postgres:$password@dokku-postgres-l:5432/l" assert_contains "$url" "postgres://postgres:$password@dokku-postgres-l:5432/l"
assert_success assert_success
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
} }
@test "($PLUGIN_COMMAND_PREFIX:link) generates an alternate config url when DATABASE_URL already in use" { @test "($PLUGIN_COMMAND_PREFIX:link) generates an alternate config url when DATABASE_URL already in use" {
dokku config:set my_app DATABASE_URL=postgres://user:pass@host:5432/db dokku config:set my-app DATABASE_URL=postgres://user:pass@host:5432/db
dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app
run dokku config my_app run dokku config my-app
assert_contains "${lines[*]}" "DOKKU_POSTGRES_AQUA_URL" assert_contains "${lines[*]}" "DOKKU_POSTGRES_AQUA_URL"
assert_success assert_success
dokku "$PLUGIN_COMMAND_PREFIX:link" m my_app dokku "$PLUGIN_COMMAND_PREFIX:link" m my-app
run dokku config my_app run dokku config my-app
assert_contains "${lines[*]}" "DOKKU_POSTGRES_BLACK_URL" assert_contains "${lines[*]}" "DOKKU_POSTGRES_BLACK_URL"
assert_success assert_success
dokku "$PLUGIN_COMMAND_PREFIX:unlink" m my_app dokku "$PLUGIN_COMMAND_PREFIX:unlink" m my-app
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
} }
@test "($PLUGIN_COMMAND_PREFIX:link) links to app with docker-options" { @test "($PLUGIN_COMMAND_PREFIX:link) links to app with docker-options" {
dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app
run dokku docker-options:report my_app run dokku docker-options:report my-app
assert_contains "${lines[*]}" "--link dokku.postgres.l:dokku-postgres-l" assert_contains "${lines[*]}" "--link dokku.postgres.l:dokku-postgres-l"
assert_success assert_success
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
} }
@test "($PLUGIN_COMMAND_PREFIX:link) uses apps POSTGRES_DATABASE_SCHEME variable" { @test "($PLUGIN_COMMAND_PREFIX:link) uses apps POSTGRES_DATABASE_SCHEME variable" {
dokku config:set my_app POSTGRES_DATABASE_SCHEME=postgres2 dokku config:set my-app POSTGRES_DATABASE_SCHEME=postgres2
dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app
url=$(dokku config:get my_app DATABASE_URL) url=$(dokku config:get my-app DATABASE_URL)
password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")"
assert_contains "$url" "postgres2://postgres:$password@dokku-postgres-l:5432/l" assert_contains "$url" "postgres2://postgres:$password@dokku-postgres-l:5432/l"
assert_success assert_success
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
} }
@test "($PLUGIN_COMMAND_PREFIX:link) adds a querystring" { @test "($PLUGIN_COMMAND_PREFIX:link) adds a querystring" {
dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app --querystring "pool=5" dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app --querystring "pool=5"
url=$(dokku config:get my_app DATABASE_URL) url=$(dokku config:get my-app DATABASE_URL)
assert_contains "$url" "?pool=5" assert_contains "$url" "?pool=5"
assert_success assert_success
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
} }
@test "($PLUGIN_COMMAND_PREFIX:link) uses a specified config url when alias is specified" { @test "($PLUGIN_COMMAND_PREFIX:link) uses a specified config url when alias is specified" {
dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app --alias "ALIAS" dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app --alias "ALIAS"
url=$(dokku config:get my_app ALIAS_URL) url=$(dokku config:get my-app ALIAS_URL)
password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")"
assert_contains "$url" "postgres://postgres:$password@dokku-postgres-l:5432/l" assert_contains "$url" "postgres://postgres:$password@dokku-postgres-l:5432/l"
assert_success assert_success
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
} }

View File

@@ -3,14 +3,14 @@ load test_helper
setup() { setup() {
dokku "$PLUGIN_COMMAND_PREFIX:create" l dokku "$PLUGIN_COMMAND_PREFIX:create" l
dokku apps:create my_app dokku apps:create my-app
dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app
} }
teardown() { teardown() {
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" l dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" l
dokku --force apps:destroy my_app dokku --force apps:destroy my-app
} }
@test "($PLUGIN_COMMAND_PREFIX:promote) error when there are no arguments" { @test "($PLUGIN_COMMAND_PREFIX:promote) error when there are no arguments" {
@@ -29,34 +29,34 @@ teardown() {
} }
@test "($PLUGIN_COMMAND_PREFIX:promote) error when the service does not exist" { @test "($PLUGIN_COMMAND_PREFIX:promote) error when the service does not exist" {
run dokku "$PLUGIN_COMMAND_PREFIX:promote" not_existing_service my_app run dokku "$PLUGIN_COMMAND_PREFIX:promote" not_existing_service my-app
assert_contains "${lines[*]}" "service not_existing_service does not exist" assert_contains "${lines[*]}" "service not_existing_service does not exist"
} }
@test "($PLUGIN_COMMAND_PREFIX:promote) error when the service is already promoted" { @test "($PLUGIN_COMMAND_PREFIX:promote) error when the service is already promoted" {
run dokku "$PLUGIN_COMMAND_PREFIX:promote" l my_app run dokku "$PLUGIN_COMMAND_PREFIX:promote" l my-app
assert_contains "${lines[*]}" "already promoted as DATABASE_URL" assert_contains "${lines[*]}" "already promoted as DATABASE_URL"
} }
@test "($PLUGIN_COMMAND_PREFIX:promote) changes DATABASE_URL" { @test "($PLUGIN_COMMAND_PREFIX:promote) changes DATABASE_URL" {
password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")"
dokku config:set my_app "DATABASE_URL=postgres://u:p@host:5432/db" "DOKKU_POSTGRES_BLUE_URL=postgres://postgres:$password@dokku-postgres-l:5432/l" dokku config:set my-app "DATABASE_URL=postgres://u:p@host:5432/db" "DOKKU_POSTGRES_BLUE_URL=postgres://postgres:$password@dokku-postgres-l:5432/l"
dokku "$PLUGIN_COMMAND_PREFIX:promote" l my_app dokku "$PLUGIN_COMMAND_PREFIX:promote" l my-app
url=$(dokku config:get my_app DATABASE_URL) url=$(dokku config:get my-app DATABASE_URL)
assert_equal "$url" "postgres://postgres:$password@dokku-postgres-l:5432/l" assert_equal "$url" "postgres://postgres:$password@dokku-postgres-l:5432/l"
} }
@test "($PLUGIN_COMMAND_PREFIX:promote) creates new config url when needed" { @test "($PLUGIN_COMMAND_PREFIX:promote) creates new config url when needed" {
password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")"
dokku config:set my_app "DATABASE_URL=postgres://u:p@host:5432/db" "DOKKU_POSTGRES_BLUE_URL=postgres://postgres:$password@dokku-postgres-l:5432/l" dokku config:set my-app "DATABASE_URL=postgres://u:p@host:5432/db" "DOKKU_POSTGRES_BLUE_URL=postgres://postgres:$password@dokku-postgres-l:5432/l"
dokku "$PLUGIN_COMMAND_PREFIX:promote" l my_app dokku "$PLUGIN_COMMAND_PREFIX:promote" l my-app
run dokku config my_app run dokku config my-app
assert_contains "${lines[*]}" "DOKKU_POSTGRES_" assert_contains "${lines[*]}" "DOKKU_POSTGRES_"
} }
@test "($PLUGIN_COMMAND_PREFIX:promote) uses POSTGRES_DATABASE_SCHEME variable" { @test "($PLUGIN_COMMAND_PREFIX:promote) uses POSTGRES_DATABASE_SCHEME variable" {
password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")"
dokku config:set my_app "POSTGRES_DATABASE_SCHEME=postgres2" "DATABASE_URL=postgres://u:p@host:5432/db" "DOKKU_POSTGRES_BLUE_URL=postgres2://postgres:$password@dokku-postgres-l:5432/l" dokku config:set my-app "POSTGRES_DATABASE_SCHEME=postgres2" "DATABASE_URL=postgres://u:p@host:5432/db" "DOKKU_POSTGRES_BLUE_URL=postgres2://postgres:$password@dokku-postgres-l:5432/l"
dokku "$PLUGIN_COMMAND_PREFIX:promote" l my_app dokku "$PLUGIN_COMMAND_PREFIX:promote" l my-app
url=$(dokku config:get my_app DATABASE_URL) url=$(dokku config:get my-app DATABASE_URL)
assert_contains "$url" "postgres2://postgres:$password@dokku-postgres-l:5432/l" assert_contains "$url" "postgres2://postgres:$password@dokku-postgres-l:5432/l"
} }

View File

@@ -2,13 +2,13 @@
load test_helper load test_helper
setup() { setup() {
dokku apps:create my_app dokku apps:create my-app
dokku "$PLUGIN_COMMAND_PREFIX:create" l dokku "$PLUGIN_COMMAND_PREFIX:create" l
} }
teardown() { teardown() {
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" l dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" l
dokku --force apps:destroy my_app dokku --force apps:destroy my-app
} }
@test "($PLUGIN_COMMAND_PREFIX:unlink) error when there are no arguments" { @test "($PLUGIN_COMMAND_PREFIX:unlink) error when there are no arguments" {
@@ -27,27 +27,27 @@ teardown() {
} }
@test "($PLUGIN_COMMAND_PREFIX:unlink) error when the service does not exist" { @test "($PLUGIN_COMMAND_PREFIX:unlink) error when the service does not exist" {
run dokku "$PLUGIN_COMMAND_PREFIX:unlink" not_existing_service my_app run dokku "$PLUGIN_COMMAND_PREFIX:unlink" not_existing_service my-app
assert_contains "${lines[*]}" "service not_existing_service does not exist" assert_contains "${lines[*]}" "service not_existing_service does not exist"
} }
@test "($PLUGIN_COMMAND_PREFIX:unlink) error when service not linked to app" { @test "($PLUGIN_COMMAND_PREFIX:unlink) error when service not linked to app" {
run dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app run dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
assert_contains "${lines[*]}" "Not linked to app my_app" assert_contains "${lines[*]}" "Not linked to app my-app"
} }
@test "($PLUGIN_COMMAND_PREFIX:unlink) removes link from docker-options" { @test "($PLUGIN_COMMAND_PREFIX:unlink) removes link from docker-options" {
dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app >&2 dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app >&2
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
check_value="Docker options build: Docker options deploy: --restart=on-failure:10 Docker options run:" check_value="Docker options build: Docker options deploy: --restart=on-failure:10 Docker options run:"
options=$(dokku --quiet docker-options:report my_app | xargs) options=$(dokku --quiet docker-options:report my-app | xargs)
assert_equal "$options" "$check_value" assert_equal "$options" "$check_value"
} }
@test "($PLUGIN_COMMAND_PREFIX:unlink) unsets config url from app" { @test "($PLUGIN_COMMAND_PREFIX:unlink) unsets config url from app" {
dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app >&2 dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app >&2
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
config=$(dokku config:get my_app DATABASE_URL || true) config=$(dokku config:get my-app DATABASE_URL || true)
assert_equal "$config" "" assert_equal "$config" ""
} }

View File

@@ -19,12 +19,15 @@ echo "Dokku version $DOKKU_VERSION"
export DOKKU_LIB_ROOT="/var/lib/dokku" export DOKKU_LIB_ROOT="/var/lib/dokku"
export DOKKU_PLUGINS_ROOT="$DOKKU_LIB_ROOT/plugins/available" export DOKKU_PLUGINS_ROOT="$DOKKU_LIB_ROOT/plugins/available"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config" pushd "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")" >/dev/null
source "config"
popd >/dev/null
sudo rm -rf "$DOKKU_PLUGINS_ROOT/$PLUGIN_COMMAND_PREFIX" sudo rm -rf "$DOKKU_PLUGINS_ROOT/$PLUGIN_COMMAND_PREFIX"
sudo mkdir -p "$DOKKU_PLUGINS_ROOT/$PLUGIN_COMMAND_PREFIX" "$DOKKU_PLUGINS_ROOT/$PLUGIN_COMMAND_PREFIX/subcommands" "$DOKKU_PLUGINS_ROOT/$PLUGIN_COMMAND_PREFIX/scripts" sudo mkdir -p "$DOKKU_PLUGINS_ROOT/$PLUGIN_COMMAND_PREFIX" "$DOKKU_PLUGINS_ROOT/$PLUGIN_COMMAND_PREFIX/subcommands" "$DOKKU_PLUGINS_ROOT/$PLUGIN_COMMAND_PREFIX/scripts" "$DOKKU_PLUGINS_ROOT/$PLUGIN_COMMAND_PREFIX/templates"
sudo find ./ -maxdepth 1 -type f -exec cp '{}' "$DOKKU_PLUGINS_ROOT/$PLUGIN_COMMAND_PREFIX" \; sudo find ./ -maxdepth 1 -type f -exec cp '{}' "$DOKKU_PLUGINS_ROOT/$PLUGIN_COMMAND_PREFIX" \;
[[ -d "./scripts" ]] && sudo find ./scripts -maxdepth 1 -type f -exec cp '{}' "$DOKKU_PLUGINS_ROOT/$PLUGIN_COMMAND_PREFIX/scripts" \; [[ -d "./scripts" ]] && sudo find ./scripts -maxdepth 1 -type f -exec cp '{}' "$DOKKU_PLUGINS_ROOT/$PLUGIN_COMMAND_PREFIX/scripts" \;
[[ -d "./subcommands" ]] && sudo find ./subcommands -maxdepth 1 -type f -exec cp '{}' "$DOKKU_PLUGINS_ROOT/$PLUGIN_COMMAND_PREFIX/subcommands" \; [[ -d "./subcommands" ]] && sudo find ./subcommands -maxdepth 1 -type f -exec cp '{}' "$DOKKU_PLUGINS_ROOT/$PLUGIN_COMMAND_PREFIX/subcommands" \;
[[ -d "./templates" ]] && sudo find ./templates -maxdepth 1 -type f -exec cp '{}' "$DOKKU_PLUGINS_ROOT/$PLUGIN_COMMAND_PREFIX/templates" \;
sudo mkdir -p "$PLUGIN_CONFIG_ROOT" "$PLUGIN_DATA_ROOT" sudo mkdir -p "$PLUGIN_CONFIG_ROOT" "$PLUGIN_DATA_ROOT"
sudo dokku plugin:enable "$PLUGIN_COMMAND_PREFIX" sudo dokku plugin:enable "$PLUGIN_COMMAND_PREFIX"
sudo dokku plugin:install sudo dokku plugin:install

View File

@@ -1,4 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python3
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import print_function from __future__ import print_function
import argparse import argparse