Compare commits
82 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
563e4a2ee6 | ||
|
|
7b22b310df | ||
|
|
66996bced9 | ||
|
|
ffddb96ec4 | ||
|
|
e9891556d9 | ||
|
|
7a0b20aed6 | ||
|
|
cdfe98a4e1 | ||
|
|
cfeff3e168 | ||
|
|
b9e339f1d0 | ||
|
|
9da6fd80f7 | ||
|
|
9de844b8eb | ||
|
|
4d0f09ff6b | ||
|
|
8bac5ad244 | ||
|
|
4cbcefdb0f | ||
|
|
ddf4d4d58c | ||
|
|
de11d2f9b1 | ||
|
|
fefed14b39 | ||
|
|
de492a3aa1 | ||
|
|
8cb329581f | ||
|
|
23cf608add | ||
|
|
0bedfa6dde | ||
|
|
f6be651ab1 | ||
|
|
b0bd29f770 | ||
|
|
0d23b71c28 | ||
|
|
eeecc9127c | ||
|
|
a72a118e71 | ||
|
|
4d6972fd4b | ||
|
|
6822c923a0 | ||
|
|
7c63d5c04d | ||
|
|
aa2b3c8b86 | ||
|
|
b97b7ce2e6 | ||
|
|
483e6c54cc | ||
|
|
476ccb73e1 | ||
|
|
6ca823d417 | ||
|
|
114fc89ec3 | ||
|
|
7f4a5d2b09 | ||
|
|
224173e5dc | ||
|
|
51efb0150b | ||
|
|
31ade32c05 | ||
|
|
f6523d1917 | ||
|
|
7b3b134b49 | ||
|
|
dc3ae48aed | ||
|
|
f62d233fdd | ||
|
|
956bc4aafa | ||
|
|
dd83b621f2 | ||
|
|
d0060ad532 | ||
|
|
19b4960ea2 | ||
|
|
2cd56cdf4b | ||
|
|
6285aa7d68 | ||
|
|
b11dea9734 | ||
|
|
78da679ea6 | ||
|
|
4db7db89be | ||
|
|
6479bb4d30 | ||
|
|
a9fabcb0dd | ||
|
|
de80e058bf | ||
|
|
a7a226318c | ||
|
|
06ab80ae76 | ||
|
|
b3f28d3496 | ||
|
|
15fc2cbc0f | ||
|
|
76054a308f | ||
|
|
ddf0662068 | ||
|
|
af649d8085 | ||
|
|
56832abe7d | ||
|
|
140185ae06 | ||
|
|
9a23c62941 | ||
|
|
75dc0c925d | ||
|
|
5ad3a5604b | ||
|
|
919e8644c8 | ||
|
|
22dd667b2c | ||
|
|
61664799dd | ||
|
|
0b6a76d6e4 | ||
|
|
5156079c19 | ||
|
|
432894e297 | ||
|
|
a99902a39e | ||
|
|
48a9828f39 | ||
|
|
90698a2e9d | ||
|
|
b76659d914 | ||
|
|
ac4010f12b | ||
|
|
259316d664 | ||
|
|
9a420cc991 | ||
|
|
2da57f1336 | ||
|
|
f5e0d87501 |
24
.devcontainer/20_init_plugin
Executable file
24
.devcontainer/20_init_plugin
Executable 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
26
.devcontainer/Dockerfile
Normal file
@@ -0,0 +1,26 @@
|
||||
FROM dokku/dokku:latest
|
||||
|
||||
RUN apt-get update
|
||||
RUN apt-get install --no-install-recommends -y build-essential && \
|
||||
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
8
.devcontainer/bin/copy-file
Executable 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 "$@"
|
||||
16
.devcontainer/devcontainer.json
Normal file
16
.devcontainer/devcontainer.json
Normal 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
6
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "docker"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "daily"
|
||||
100
.github/workflows/ci.yml
vendored
Normal file
100
.github/workflows/ci.yml
vendored
Normal 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
1
.gitignore
vendored
@@ -1,2 +1,3 @@
|
||||
/tmp
|
||||
.vagrant
|
||||
bootstrap.sh
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
dist: trusty
|
||||
language: bash
|
||||
env:
|
||||
- DOKKU_VERSION=master
|
||||
- DOKKU_VERSION=v0.17.0
|
||||
install: make setup
|
||||
before_script: sudo sysctl -w vm.max_map_count=262144
|
||||
script: make test
|
||||
after_failure: make report
|
||||
1
Dockerfile
Normal file
1
Dockerfile
Normal file
@@ -0,0 +1 @@
|
||||
FROM mongo:5.0.2
|
||||
@@ -1,4 +1,4 @@
|
||||
Copyright (C) 2018 Jose Diaz-Gonzalez
|
||||
Copyright (C) 2020 Jose Diaz-Gonzalez
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
|
||||
40
Makefile
40
Makefile
@@ -1,5 +1,9 @@
|
||||
HARDWARE = $(shell uname -m)
|
||||
SYSTEM_NAME = $(shell uname -s | tr '[:upper:]' '[:lower:]')
|
||||
SHFMT_VERSION = 3.0.2
|
||||
XUNIT_TO_GITHUB_VERSION = 0.3.0
|
||||
XUNIT_READER_VERSION = 0.1.0
|
||||
|
||||
|
||||
bats:
|
||||
ifeq ($(SYSTEM_NAME),darwin)
|
||||
@@ -7,7 +11,7 @@ ifneq ($(shell bats --version >/dev/null 2>&1 ; echo $$?),0)
|
||||
brew install bats-core
|
||||
endif
|
||||
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
|
||||
rm -rf /tmp/bats
|
||||
endif
|
||||
@@ -28,7 +32,7 @@ ifneq ($(shell shfmt --version >/dev/null 2>&1 ; echo $$?),0)
|
||||
ifeq ($(shfmt),Darwin)
|
||||
brew install shfmt
|
||||
else
|
||||
wget -qO /tmp/shfmt https://github.com/mvdan/sh/releases/download/v2.6.2/shfmt_v2.6.2_linux_amd64
|
||||
wget -qO /tmp/shfmt https://github.com/mvdan/sh/releases/download/v$(SHFMT_VERSION)/shfmt_v$(SHFMT_VERSION)_linux_amd64
|
||||
chmod +x /tmp/shfmt
|
||||
sudo mv /tmp/shfmt /usr/local/bin/shfmt
|
||||
endif
|
||||
@@ -59,13 +63,13 @@ unit-tests:
|
||||
@echo running unit tests...
|
||||
@mkdir -p tmp/test-results/bats
|
||||
@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-to-github:
|
||||
tmp/xunit-reader:
|
||||
mkdir -p tmp
|
||||
curl -o tmp/xunit-to-github.tgz -sL https://github.com/josegonzalez/go-xunit-to-github/releases/download/v0.3.0/xunit-to-github_0.3.0_$(SYSTEM_NAME)_$(HARDWARE).tgz
|
||||
tar xf tmp/xunit-to-github.tgz -C tmp
|
||||
chmod +x tmp/xunit-to-github
|
||||
curl -o tmp/xunit-reader.tgz -sL https://github.com/josegonzalez/go-xunit-reader/releases/download/v$(XUNIT_READER_VERSION)/xunit-reader_$(XUNIT_READER_VERSION)_$(SYSTEM_NAME)_$(HARDWARE).tgz
|
||||
tar xf tmp/xunit-reader.tgz -C tmp
|
||||
chmod +x tmp/xunit-reader
|
||||
|
||||
setup:
|
||||
bash tests/setup.sh
|
||||
@@ -73,11 +77,17 @@ setup:
|
||||
|
||||
test: lint unit-tests
|
||||
|
||||
report: tmp/xunit-to-github
|
||||
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
|
||||
report: tmp/xunit-reader
|
||||
tmp/xunit-reader -p 'tmp/test-results/bats/*.xml'
|
||||
tmp/xunit-reader -p 'tmp/test-results/shellcheck/*.xml'
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
rm -f README.md
|
||||
|
||||
.PHONY: generate
|
||||
generate: clean README.md
|
||||
|
||||
.PHONY: README.md
|
||||
README.md:
|
||||
bin/generate
|
||||
|
||||
745
README.md
745
README.md
@@ -1,87 +1,127 @@
|
||||
# dokku mongo [](https://travis-ci.org/dokku/dokku-mongo) [](https://webchat.freenode.net/?channels=dokku)
|
||||
# dokku mongo [](https://github.com/dokku/dokku-mongo/actions/workflows/ci.yml?query=branch%3Amaster) [](https://webchat.libera.chat/?channels=dokku)
|
||||
|
||||
Official mongo plugin for dokku. Currently defaults to installing [mongo 3.6.15](https://hub.docker.com/_/mongo/).
|
||||
Official mongo plugin for dokku. Currently defaults to installing [mongo 5.0.2](https://hub.docker.com/_/mongo/).
|
||||
|
||||
## requirements
|
||||
## Requirements
|
||||
|
||||
- dokku 0.12.x+
|
||||
- dokku 0.19.x+
|
||||
- docker 1.8.x
|
||||
|
||||
## installation
|
||||
## Installation
|
||||
|
||||
```shell
|
||||
# on 0.12.x+
|
||||
# on 0.19.x+
|
||||
sudo dokku plugin:install https://github.com/dokku/dokku-mongo.git mongo
|
||||
```
|
||||
|
||||
## commands
|
||||
## Commands
|
||||
|
||||
```
|
||||
mongo:app-links <app> List all mongo service links for a given app
|
||||
mongo:backup <name> <bucket> (--use-iam) Create a backup of the mongo service to an existing s3 bucket
|
||||
mongo:backup-auth <name> <aws_access_key_id> <aws_secret_access_key> (<aws_default_region>) (<aws_signature_version>) (<endpoint_url>) Sets up authentication for backups on the mongo service
|
||||
mongo:backup-deauth <name> Removes backup authentication for the mongo service
|
||||
mongo:backup-schedule <name> <schedule> <bucket> Schedules a backup of the mongo service
|
||||
mongo:backup-schedule-cat <name> Cat the contents of the configured backup cronfile for the service
|
||||
mongo:backup-set-encryption <name> <passphrase> Set a GPG passphrase for backups
|
||||
mongo:backup-unschedule <name> Unschedules the backup of the mongo service
|
||||
mongo:backup-unset-encryption <name> Removes backup encryption for future backups of the mongo service
|
||||
mongo:clone <name> <new-name> Create container <new-name> then copy data from <name> into <new-name>
|
||||
mongo:connect <name> Connect via telnet to a mongo service
|
||||
mongo:connect-admin <name> Connect via telnet to a mongo service as admin user
|
||||
mongo:create <name> Create a mongo service with environment variables
|
||||
mongo:destroy <name> Delete the service, delete the data and stop its container if there are no links left
|
||||
mongo:enter <name> [command] Enter or run a command in a running mongo service container
|
||||
mongo:exists <service> Check if the mongo service exists
|
||||
mongo:export <name> > <file> Export a dump of the mongo service database (as gzipped archive file)
|
||||
mongo:expose <name> [port] Expose a mongo service on custom port if provided (random port otherwise)
|
||||
mongo:import <name> < <file> Import a dump into the mongo service database
|
||||
mongo:info <name> Print the connection information
|
||||
mongo:link <name> <app> Link the mongo service to the app
|
||||
mongo:linked <name> <app> Check if the mongo service is linked to an app
|
||||
mongo:list List all mongo services
|
||||
mongo:logs <name> [-t] Print the most recent log(s) for this service
|
||||
mongo:promote <name> <app> Promote service <name> as MONGO_URL in <app>
|
||||
mongo:restart <name> Graceful shutdown and restart of the mongo service container
|
||||
mongo:start <name> Start a previously stopped mongo service
|
||||
mongo:stop <name> Stop a running mongo service
|
||||
mongo:unexpose <name> Unexpose a previously exposed mongo service
|
||||
mongo:unlink <name> <app> Unlink the mongo service from the app
|
||||
mongo:upgrade <name> Upgrade service <service> to the specified version
|
||||
mongo:app-links <app> # list all mongo service links for a given app
|
||||
mongo:backup <service> <bucket-name> [--use-iam] # creates a backup of the mongo service to an existing s3 bucket
|
||||
mongo: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 mongo service
|
||||
mongo:backup-deauth <service> # removes backup authentication for the mongo service
|
||||
mongo:backup-schedule <service> <schedule> <bucket-name> [--use-iam] # schedules a backup of the mongo service
|
||||
mongo:backup-schedule-cat <service> # cat the contents of the configured backup cronfile for the service
|
||||
mongo:backup-set-encryption <service> <passphrase> # sets encryption for all future backups of mongo service
|
||||
mongo:backup-unschedule <service> # unschedules the backup of the mongo service
|
||||
mongo:backup-unset-encryption <service> # unsets encryption for future backups of the mongo service
|
||||
mongo:clone <service> <new-service> [--clone-flags...] # create container <new-name> then copy data from <name> into <new-name>
|
||||
mongo:connect <service> # connect to the service via the mongo connection tool
|
||||
mongo:connect-admin <service> # connect via mongo to a mongo service as admin user
|
||||
mongo:create <service> [--create-flags...] # create a mongo service
|
||||
mongo:destroy <service> [-f|--force] # delete the mongo service/data/container if there are no links left
|
||||
mongo:enter <service> # enter or run a command in a running mongo service container
|
||||
mongo:exists <service> # check if the mongo service exists
|
||||
mongo:export <service> # export a dump of the mongo service database
|
||||
mongo:expose <service> <ports...> # expose a mongo service on custom port if provided (random port otherwise)
|
||||
mongo:import <service> # import a dump into the mongo service database
|
||||
mongo:info <service> [--single-info-flag] # print the service information
|
||||
mongo:link <service> <app> [--link-flags...] # link the mongo service to the app
|
||||
mongo:linked <service> <app> # check if the mongo service is linked to an app
|
||||
mongo:links <service> # list all apps linked to the mongo service
|
||||
mongo:list # list all mongo services
|
||||
mongo:logs <service> [-t|--tail] # print the most recent log(s) for this service
|
||||
mongo:promote <service> <app> # promote service <service> as MONGO_URL in <app>
|
||||
mongo:restart <service> # graceful shutdown and restart of the mongo service container
|
||||
mongo:start <service> # start a previously stopped mongo service
|
||||
mongo:stop <service> # stop a running mongo service
|
||||
mongo:unexpose <service> # unexpose a previously exposed mongo service
|
||||
mongo:unlink <service> <app> # unlink the mongo service from the app
|
||||
mongo:upgrade <service> [--upgrade-flags...] # upgrade service <service> to the specified versions
|
||||
```
|
||||
|
||||
## usage
|
||||
## Usage
|
||||
|
||||
Help for any commands can be displayed by specifying the command as an argument to mongo:help. Please consult the `mongo:help` command for any undocumented commands.
|
||||
|
||||
### Basic Usage
|
||||
|
||||
### create a mongo service
|
||||
|
||||
```shell
|
||||
# create a mongo service named lolipop
|
||||
dokku mongo:create lolipop
|
||||
# usage
|
||||
dokku mongo:create <service> [--create-flags...]
|
||||
```
|
||||
|
||||
# you can also specify the image and image
|
||||
# version to use for the service
|
||||
# it *must* be compatible with the
|
||||
# official mongo image
|
||||
flags:
|
||||
|
||||
- `-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-version IMAGE_VERSION`: the image version to start the service with
|
||||
- `-p|--password PASSWORD`: override the user-level service password
|
||||
- `-r|--root-password PASSWORD`: override the root-level service password
|
||||
|
||||
Create a mongo service named lolipop:
|
||||
|
||||
```shell
|
||||
dokku mongo:create lolipop
|
||||
```
|
||||
|
||||
You can also specify the image and image version to use for the service. It *must* be compatible with the mongo image.
|
||||
|
||||
```shell
|
||||
export MONGO_IMAGE="mongo"
|
||||
export MONGO_IMAGE_VERSION="3.0.5"
|
||||
export MONGO_IMAGE_VERSION="${PLUGIN_IMAGE_VERSION}"
|
||||
dokku mongo:create lolipop
|
||||
```
|
||||
|
||||
# you can also specify custom environment
|
||||
# variables to start the mongo service
|
||||
# in semi-colon separated form
|
||||
You can also specify custom environment variables to start the mongo service in semi-colon separated form.
|
||||
|
||||
```shell
|
||||
export MONGO_CUSTOM_ENV="USER=alpha;HOST=beta"
|
||||
dokku mongo:create lolipop
|
||||
```
|
||||
|
||||
# by default we use the wiredTiger storage solution
|
||||
# if you are using an image version less than 3.x
|
||||
# you will need to set a custom MONGO_CONFIG_OPTIONS
|
||||
# environment variable
|
||||
export MONGO_CONFIG_OPTIONS=" --auth "
|
||||
export MONGO_IMAGE_VERSION="2.6.11"
|
||||
dokku mongo:create lolipop
|
||||
### print the service information
|
||||
|
||||
# get connection information as follows
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:info <service> [--single-info-flag]
|
||||
```
|
||||
|
||||
flags:
|
||||
|
||||
- `--config-dir`: show the service configuration directory
|
||||
- `--data-dir`: show the service data directory
|
||||
- `--dsn`: show the service DSN
|
||||
- `--exposed-ports`: show service exposed ports
|
||||
- `--id`: show the service container id
|
||||
- `--internal-ip`: show the service internal ip
|
||||
- `--links`: show the service app links
|
||||
- `--service-root`: show the service root directory
|
||||
- `--status`: show the service running status
|
||||
- `--version`: show the service image version
|
||||
|
||||
Get connection information as follows:
|
||||
|
||||
```shell
|
||||
dokku mongo:info lolipop
|
||||
```
|
||||
|
||||
# you can also retrieve a specific piece of service info via flags
|
||||
You can also retrieve a specific piece of service info via flags:
|
||||
|
||||
```shell
|
||||
dokku mongo:info lolipop --config-dir
|
||||
dokku mongo:info lolipop --data-dir
|
||||
dokku mongo:info lolipop --dsn
|
||||
@@ -92,152 +132,525 @@ dokku mongo:info lolipop --links
|
||||
dokku mongo:info lolipop --service-root
|
||||
dokku mongo:info lolipop --status
|
||||
dokku mongo:info lolipop --version
|
||||
```
|
||||
|
||||
# a bash prompt can be opened against a running service
|
||||
# filesystem changes will not be saved to disk
|
||||
dokku mongo:enter lolipop
|
||||
### list all mongo services
|
||||
|
||||
# you may also run a command directly against the service
|
||||
# filesystem changes will not be saved to disk
|
||||
dokku mongo:enter lolipop ls -lah /
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:list
|
||||
```
|
||||
|
||||
# a mongo 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
|
||||
dokku mongo:link lolipop playground
|
||||
List all services:
|
||||
|
||||
# the following environment variables will be set automatically by docker (not
|
||||
# on the app itself, so they won’t be listed when calling dokku config)
|
||||
#
|
||||
# DOKKU_MONGO_LOLIPOP_NAME=/lolipop/DATABASE
|
||||
# DOKKU_MONGO_LOLIPOP_PORT=tcp://172.17.0.1:27017
|
||||
# DOKKU_MONGO_LOLIPOP_PORT_27017_TCP=tcp://172.17.0.1:27017
|
||||
# DOKKU_MONGO_LOLIPOP_PORT_27017_TCP_PROTO=tcp
|
||||
# DOKKU_MONGO_LOLIPOP_PORT_27017_TCP_PORT=27017
|
||||
# DOKKU_MONGO_LOLIPOP_PORT_27017_TCP_ADDR=172.17.0.1
|
||||
#
|
||||
# and the following will be set on the linked application by default
|
||||
#
|
||||
# MONGO_URL=mongodb://lolipop:SOME_PASSWORD@dokku-mongo-lolipop:27017/lolipop
|
||||
#
|
||||
# NOTE: the host exposed here only works internally in docker containers. If
|
||||
# you want your container to be reachable from outside, you should use `expose`.
|
||||
```shell
|
||||
dokku mongo:list
|
||||
```
|
||||
|
||||
# another service can be linked to your app
|
||||
dokku mongo:link other_service playground
|
||||
### print the most recent log(s) for this service
|
||||
|
||||
# since DATABASE_URL is already in use, another environment variable will be
|
||||
# generated automatically
|
||||
#
|
||||
# DOKKU_MONGO_BLUE_URL=mongodb://other_service:ANOTHER_PASSWORD@dokku-mongo-other-service:27017/other_service
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:logs <service> [-t|--tail]
|
||||
```
|
||||
|
||||
# you can then promote the new service to be the primary one
|
||||
# NOTE: this will restart your app
|
||||
dokku mongo:promote other_service playground
|
||||
flags:
|
||||
|
||||
# this will replace MONGO_URL with the url from other_service and generate
|
||||
# another environment variable to hold the previous value if necessary.
|
||||
# you could end up with the following for example:
|
||||
#
|
||||
# MONGO_URL=mongodb://other_service:ANOTHER_PASSWORD@dokku-mongo-other-service:27017/other_service
|
||||
# DOKKU_MONGO_BLUE_URL=mongodb://other_service:ANOTHER_PASSWORD@dokku-mongo-other-service:27017/other_service
|
||||
# DOKKU_MONGO_SILVER_URL=mongodb://lolipop:SOME_PASSWORD@dokku-mongo-lolipop:27017/lolipop
|
||||
- `-t|--tail`: do not stop when end of the logs are reached and wait for additional output
|
||||
|
||||
# you can also unlink a mongo service
|
||||
# NOTE: this will restart your app and unset related environment variables
|
||||
dokku mongo:unlink lolipop playground
|
||||
You can tail logs for a particular service:
|
||||
|
||||
# you can tail logs for a particular service
|
||||
```shell
|
||||
dokku mongo:logs lolipop
|
||||
dokku mongo:logs lolipop -t # to tail
|
||||
|
||||
# you can dump the database
|
||||
dokku mongo:export lolipop > lolipop.dump.gz
|
||||
|
||||
# you can import a dump
|
||||
dokku mongo:import lolipop < database.dump.gz
|
||||
|
||||
# you can clone an existing database to a new one
|
||||
dokku mongo:clone lolipop new_database
|
||||
|
||||
# finally, you can destroy the container
|
||||
dokku mongo:destroy lolipop
|
||||
```
|
||||
|
||||
## Changing database adapter
|
||||
|
||||
It's possible to change the protocol for MONGO_URL by setting
|
||||
the environment variable MONGO_DATABASE_SCHEME on the app:
|
||||
By default, logs will not be tailed, but you can do this with the --tail flag:
|
||||
|
||||
```shell
|
||||
dokku mongo:logs lolipop --tail
|
||||
```
|
||||
dokku config:set playground MONGO_DATABASE_SCHEME=mongo2
|
||||
|
||||
### link the mongo service to the app
|
||||
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:link <service> <app> [--link-flags...]
|
||||
```
|
||||
|
||||
flags:
|
||||
|
||||
- `-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
|
||||
|
||||
A mongo 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
|
||||
|
||||
```shell
|
||||
dokku mongo:link lolipop playground
|
||||
```
|
||||
|
||||
Will cause MONGO_URL to be set as
|
||||
mongo2://lolipop:SOME_PASSWORD@dokku-mongo-lolipop:27017/lolipop
|
||||
The following environment variables will be set automatically by docker (not on the app itself, so they won’t be listed when calling dokku config):
|
||||
|
||||
CAUTION: Changing MONGO_DATABASE_SCHEME after linking will cause dokku to
|
||||
believe the mongo is not linked when attempting to use `dokku mongo:unlink`
|
||||
or `dokku mongo:promote`.
|
||||
You should be able to fix this by
|
||||
```
|
||||
DOKKU_MONGO_LOLIPOP_NAME=/lolipop/DATABASE
|
||||
DOKKU_MONGO_LOLIPOP_PORT=tcp://172.17.0.1:27017
|
||||
DOKKU_MONGO_LOLIPOP_PORT_27017_TCP=tcp://172.17.0.1:27017
|
||||
DOKKU_MONGO_LOLIPOP_PORT_27017_TCP_PROTO=tcp
|
||||
DOKKU_MONGO_LOLIPOP_PORT_27017_TCP_PORT=27017
|
||||
DOKKU_MONGO_LOLIPOP_PORT_27017_TCP_ADDR=172.17.0.1
|
||||
```
|
||||
|
||||
- Changing MONGO_URL manually to the new value.
|
||||
The following will be set on the linked application by default:
|
||||
|
||||
OR
|
||||
```
|
||||
MONGO_URL=mongodb://lolipop:SOME_PASSWORD@dokku-mongo-lolipop:27017/lolipop
|
||||
```
|
||||
|
||||
- Set MONGO_DATABASE_SCHEME back to its original setting
|
||||
- Unlink the service
|
||||
- Change MONGO_DATABASE_SCHEME to the desired setting
|
||||
- Relink the service
|
||||
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:
|
||||
|
||||
## Backups
|
||||
```shell
|
||||
dokku mongo:link other_service playground
|
||||
```
|
||||
|
||||
It is possible to change the protocol for `MONGO_URL` by setting the environment variable `MONGO_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
|
||||
dokku config:set playground MONGO_DATABASE_SCHEME=mongodb2
|
||||
dokku mongo:link lolipop playground
|
||||
```
|
||||
|
||||
This will cause `MONGO_URL` to be set as:
|
||||
|
||||
```
|
||||
mongodb2://lolipop:SOME_PASSWORD@dokku-mongo-lolipop:27017/lolipop
|
||||
```
|
||||
|
||||
### unlink the mongo service from the app
|
||||
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:unlink <service> <app>
|
||||
```
|
||||
|
||||
You can unlink a mongo service:
|
||||
|
||||
> NOTE: this will restart your app and unset related environment variables
|
||||
|
||||
```shell
|
||||
dokku mongo:unlink lolipop playground
|
||||
```
|
||||
|
||||
### Service Lifecycle
|
||||
|
||||
The lifecycle of each service can be managed through the following commands:
|
||||
|
||||
### connect to the service via the mongo connection tool
|
||||
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:connect <service>
|
||||
```
|
||||
|
||||
Connect to the service via the mongo connection tool:
|
||||
|
||||
```shell
|
||||
dokku mongo:connect lolipop
|
||||
```
|
||||
|
||||
### enter or run a command in a running mongo service container
|
||||
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:enter <service>
|
||||
```
|
||||
|
||||
A bash prompt can be opened against a running service. Filesystem changes will not be saved to disk.
|
||||
|
||||
```shell
|
||||
dokku mongo:enter lolipop
|
||||
```
|
||||
|
||||
You may also run a command directly against the service. Filesystem changes will not be saved to disk.
|
||||
|
||||
```shell
|
||||
dokku mongo:enter lolipop touch /tmp/test
|
||||
```
|
||||
|
||||
### expose a mongo service on custom port if provided (random port otherwise)
|
||||
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:expose <service> <ports...>
|
||||
```
|
||||
|
||||
Expose the service on the service's normal ports, allowing access to it from the public interface (`0.0.0.0`):
|
||||
|
||||
```shell
|
||||
dokku mongo:expose lolipop 27017 27018 27019 28017
|
||||
```
|
||||
|
||||
### unexpose a previously exposed mongo service
|
||||
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:unexpose <service>
|
||||
```
|
||||
|
||||
Unexpose the service, removing access to it from the public interface (`0.0.0.0`):
|
||||
|
||||
```shell
|
||||
dokku mongo:unexpose lolipop
|
||||
```
|
||||
|
||||
### promote service <service> as MONGO_URL in <app>
|
||||
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:promote <service> <app>
|
||||
```
|
||||
|
||||
If you have a mongo service linked to an app and try to link another mongo service another link environment variable will be generated automatically:
|
||||
|
||||
```
|
||||
DOKKU_MONGO_BLUE_URL=mongodb://other_service:ANOTHER_PASSWORD@dokku-mongo-other-service:27017/other_service
|
||||
```
|
||||
|
||||
You can promote the new service to be the primary one:
|
||||
|
||||
> NOTE: this will restart your app
|
||||
|
||||
```shell
|
||||
dokku mongo:promote other_service playground
|
||||
```
|
||||
|
||||
This will replace `MONGO_URL` with the url from other_service and generate another environment variable to hold the previous value if necessary. You could end up with the following for example:
|
||||
|
||||
```
|
||||
MONGO_URL=mongodb://other_service:ANOTHER_PASSWORD@dokku-mongo-other-service:27017/other_service
|
||||
DOKKU_MONGO_BLUE_URL=mongodb://other_service:ANOTHER_PASSWORD@dokku-mongo-other-service:27017/other_service
|
||||
DOKKU_MONGO_SILVER_URL=mongodb://lolipop:SOME_PASSWORD@dokku-mongo-lolipop:27017/lolipop
|
||||
```
|
||||
|
||||
### start a previously stopped mongo service
|
||||
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:start <service>
|
||||
```
|
||||
|
||||
Start the service:
|
||||
|
||||
```shell
|
||||
dokku mongo:start lolipop
|
||||
```
|
||||
|
||||
### stop a running mongo service
|
||||
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:stop <service>
|
||||
```
|
||||
|
||||
Stop the service and the running container:
|
||||
|
||||
```shell
|
||||
dokku mongo:stop lolipop
|
||||
```
|
||||
|
||||
### graceful shutdown and restart of the mongo service container
|
||||
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:restart <service>
|
||||
```
|
||||
|
||||
Restart the service:
|
||||
|
||||
```shell
|
||||
dokku mongo:restart lolipop
|
||||
```
|
||||
|
||||
### upgrade service <service> to the specified versions
|
||||
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:upgrade <service> [--upgrade-flags...]
|
||||
```
|
||||
|
||||
flags:
|
||||
|
||||
- `-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-version IMAGE_VERSION`: the image version to start the service with
|
||||
- `-R|--restart-apps "true"`: whether to force an app restart
|
||||
|
||||
You can upgrade an existing service to a new image or image-version:
|
||||
|
||||
```shell
|
||||
dokku mongo:upgrade lolipop
|
||||
```
|
||||
|
||||
### Service Automation
|
||||
|
||||
Service scripting can be executed using the following commands:
|
||||
|
||||
### list all mongo service links for a given app
|
||||
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:app-links <app>
|
||||
```
|
||||
|
||||
List all mongo services that are linked to the 'playground' app.
|
||||
|
||||
```shell
|
||||
dokku mongo:app-links playground
|
||||
```
|
||||
|
||||
### create container <new-name> then copy data from <name> into <new-name>
|
||||
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:clone <service> <new-service> [--clone-flags...]
|
||||
```
|
||||
|
||||
flags:
|
||||
|
||||
- `-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-version IMAGE_VERSION`: the image version to start the service with
|
||||
- `-p|--password PASSWORD`: override the user-level service password
|
||||
- `-r|--root-password PASSWORD`: override the root-level service password
|
||||
|
||||
You can clone an existing service to a new one:
|
||||
|
||||
```shell
|
||||
dokku mongo:clone lolipop lolipop-2
|
||||
```
|
||||
|
||||
### check if the mongo service exists
|
||||
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:exists <service>
|
||||
```
|
||||
|
||||
Here we check if the lolipop mongo service exists.
|
||||
|
||||
```shell
|
||||
dokku mongo:exists lolipop
|
||||
```
|
||||
|
||||
### check if the mongo service is linked to an app
|
||||
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:linked <service> <app>
|
||||
```
|
||||
|
||||
Here we check if the lolipop mongo service is linked to the 'playground' app.
|
||||
|
||||
```shell
|
||||
dokku mongo:linked lolipop playground
|
||||
```
|
||||
|
||||
### list all apps linked to the mongo service
|
||||
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:links <service>
|
||||
```
|
||||
|
||||
List all apps linked to the 'lolipop' mongo service.
|
||||
|
||||
```shell
|
||||
dokku mongo:links lolipop
|
||||
```
|
||||
|
||||
### Data Management
|
||||
|
||||
The underlying service data can be imported and exported with the following commands:
|
||||
|
||||
### import a dump into the mongo service database
|
||||
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:import <service>
|
||||
```
|
||||
|
||||
Import a datastore dump:
|
||||
|
||||
```shell
|
||||
dokku mongo:import lolipop < database.dump
|
||||
```
|
||||
|
||||
### export a dump of the mongo service database
|
||||
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:export <service>
|
||||
```
|
||||
|
||||
By default, datastore output is exported to stdout:
|
||||
|
||||
```shell
|
||||
dokku mongo:export lolipop
|
||||
```
|
||||
|
||||
You can redirect this output to a file:
|
||||
|
||||
```shell
|
||||
dokku mongo:export lolipop > lolipop.dump
|
||||
```
|
||||
|
||||
### Backups
|
||||
|
||||
Datastore backups are supported via AWS S3 and S3 compatible services like [minio](https://github.com/minio/minio).
|
||||
|
||||
You may skip the `backup-auth` step if your dokku install is running within EC2
|
||||
and has access to the bucket via an IAM profile. In that case, use the `--use-iam`
|
||||
option with the `backup` command.
|
||||
You may skip the `backup-auth` step if your dokku install is running within EC2 and has access to the bucket via an IAM profile. In that case, use the `--use-iam` option with the `backup` command.
|
||||
|
||||
Backups can be performed using the backup commands:
|
||||
|
||||
### sets up authentication for backups on the mongo service
|
||||
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:backup-auth <service> <aws-access-key-id> <aws-secret-access-key> <aws-default-region> <aws-signature-version> <endpoint-url>
|
||||
```
|
||||
# setup s3 backup authentication
|
||||
|
||||
Setup s3 backup authentication:
|
||||
|
||||
```shell
|
||||
dokku mongo:backup-auth lolipop AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY
|
||||
|
||||
# remove s3 authentication
|
||||
dokku mongo:backup-deauth lolipop
|
||||
|
||||
# backup the `lolipop` service to the `BUCKET_NAME` bucket on AWS
|
||||
dokku mongo:backup lolipop BUCKET_NAME
|
||||
|
||||
# schedule a backup
|
||||
# CRON_SCHEDULE is a crontab expression, eg. "0 3 * * *" for each day at 3am
|
||||
dokku mongo:backup-schedule lolipop CRON_SCHEDULE BUCKET_NAME
|
||||
|
||||
# cat the contents of the configured backup cronfile for the service
|
||||
dokku mongo:backup-schedule-cat lolipop
|
||||
|
||||
# remove the scheduled backup from cron
|
||||
dokku mongo:backup-unschedule lolipop
|
||||
```
|
||||
|
||||
Backup auth can also be set up for different regions, signature versions and endpoints (e.g. for minio):
|
||||
|
||||
```
|
||||
# setup s3 backup authentication with different region
|
||||
Setup s3 backup authentication with different region:
|
||||
|
||||
```shell
|
||||
dokku mongo:backup-auth lolipop AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_REGION
|
||||
|
||||
# setup s3 backup authentication with different signature version and endpoint
|
||||
```
|
||||
|
||||
Setup s3 backup authentication with different signature version and endpoint:
|
||||
|
||||
```shell
|
||||
dokku mongo:backup-auth lolipop AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_REGION AWS_SIGNATURE_VERSION ENDPOINT_URL
|
||||
|
||||
# more specific example for minio auth
|
||||
```
|
||||
|
||||
More specific example for minio auth:
|
||||
|
||||
```shell
|
||||
dokku mongo:backup-auth lolipop MINIO_ACCESS_KEY_ID MINIO_SECRET_ACCESS_KEY us-east-1 s3v4 https://YOURMINIOSERVICE
|
||||
```
|
||||
|
||||
## Disabling `docker pull` calls
|
||||
### removes backup authentication for the mongo service
|
||||
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:backup-deauth <service>
|
||||
```
|
||||
|
||||
Remove s3 authentication:
|
||||
|
||||
```shell
|
||||
dokku mongo:backup-deauth lolipop
|
||||
```
|
||||
|
||||
### creates a backup of the mongo service to an existing s3 bucket
|
||||
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:backup <service> <bucket-name> [--use-iam]
|
||||
```
|
||||
|
||||
flags:
|
||||
|
||||
- `-u|--use-iam`: use the IAM profile associated with the current server
|
||||
|
||||
Backup the 'lolipop' service to the 'my-s3-bucket' bucket on ``AWS`:`
|
||||
|
||||
```shell
|
||||
dokku mongo:backup lolipop my-s3-bucket --use-iam
|
||||
```
|
||||
|
||||
### sets encryption for all future backups of mongo service
|
||||
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:backup-set-encryption <service> <passphrase>
|
||||
```
|
||||
|
||||
Set the GPG-compatible passphrase for encrypting backups for backups:
|
||||
|
||||
```shell
|
||||
dokku mongo:backup-set-encryption lolipop
|
||||
```
|
||||
|
||||
### unsets encryption for future backups of the mongo service
|
||||
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:backup-unset-encryption <service>
|
||||
```
|
||||
|
||||
Unset the `GPG` encryption passphrase for backups:
|
||||
|
||||
```shell
|
||||
dokku mongo:backup-unset-encryption lolipop
|
||||
```
|
||||
|
||||
### schedules a backup of the mongo service
|
||||
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:backup-schedule <service> <schedule> <bucket-name> [--use-iam]
|
||||
```
|
||||
|
||||
flags:
|
||||
|
||||
- `-u|--use-iam`: use the IAM profile associated with the current server
|
||||
|
||||
Schedule a backup:
|
||||
|
||||
> 'schedule' is a crontab expression, eg. "0 3 * * *" for each day at 3am
|
||||
|
||||
```shell
|
||||
dokku mongo:backup-schedule lolipop "0 3 * * *" my-s3-bucket
|
||||
```
|
||||
|
||||
Schedule a backup and authenticate via iam:
|
||||
|
||||
```shell
|
||||
dokku mongo:backup-schedule lolipop "0 3 * * *" my-s3-bucket --use-iam
|
||||
```
|
||||
|
||||
### cat the contents of the configured backup cronfile for the service
|
||||
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:backup-schedule-cat <service>
|
||||
```
|
||||
|
||||
Cat the contents of the configured backup cronfile for the service:
|
||||
|
||||
```shell
|
||||
dokku mongo:backup-schedule-cat lolipop
|
||||
```
|
||||
|
||||
### unschedules the backup of the mongo service
|
||||
|
||||
```shell
|
||||
# usage
|
||||
dokku mongo:backup-unschedule <service>
|
||||
```
|
||||
|
||||
Remove the scheduled backup from cron:
|
||||
|
||||
```shell
|
||||
dokku mongo:backup-unschedule lolipop
|
||||
```
|
||||
|
||||
### Disabling `docker pull` calls
|
||||
|
||||
If you wish to disable the `docker pull` calls that the plugin triggers, you may set the `MONGO_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.
|
||||
|
||||
|
||||
518
bin/generate
Executable file
518
bin/generate
Executable file
@@ -0,0 +1,518 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import print_function
|
||||
import os
|
||||
import re
|
||||
|
||||
|
||||
def compile(service, version, variable, alias, image, scheme, ports, sponsors, 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 (
|
||||
"\n\n".join(
|
||||
[
|
||||
prefix,
|
||||
requirements_section(dokku_version),
|
||||
installation_section(service, dokku_version),
|
||||
commands_section(service, variable, alias, image, scheme, ports, unimplemented),
|
||||
usage_section(service, variable, alias, image, scheme, ports, unimplemented),
|
||||
]
|
||||
)
|
||||
.replace("\n\n\n\n\n", "\n")
|
||||
.replace("\n\n\n\n", "\n")
|
||||
.replace("\n\n\n", "\n\n")
|
||||
)
|
||||
|
||||
|
||||
def header(service):
|
||||
return " ".join(
|
||||
[
|
||||
f"# dokku {service}",
|
||||
f'[](https://github.com/dokku/dokku-{service}/actions/workflows/ci.yml?query=branch%3Amaster)',
|
||||
f'[](https://webchat.libera.chat/?channels=dokku)',
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
def description(service, full_image, version):
|
||||
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):
|
||||
return "\n".join(
|
||||
["## Requirements", "", f"- dokku {dokku_version}", "- docker 1.8.x",]
|
||||
)
|
||||
|
||||
|
||||
def installation_section(service, dokku_version):
|
||||
return "\n".join(
|
||||
[
|
||||
"## Installation",
|
||||
"",
|
||||
"```shell",
|
||||
f"# on {dokku_version}",
|
||||
f"sudo dokku plugin:install https://github.com/dokku/dokku-{service}.git {service}",
|
||||
"```",
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
def commands_section(service, variable, alias, image, scheme, ports, unimplemented):
|
||||
content = [
|
||||
"## Commands",
|
||||
"",
|
||||
"```",
|
||||
]
|
||||
|
||||
subcommands = os.listdir("subcommands")
|
||||
subcommands.sort()
|
||||
|
||||
command_list = []
|
||||
descriptions = []
|
||||
for filename in subcommands:
|
||||
if filename in unimplemented:
|
||||
continue
|
||||
data = command_data(filename, service, variable, alias, image, scheme, ports)
|
||||
description = data["description"]
|
||||
arguments = data["arguments_string"]
|
||||
|
||||
command_list.append(f"{service}:{filename} {arguments}")
|
||||
descriptions.append(description)
|
||||
|
||||
maxlen = max(map(len, command_list))
|
||||
if maxlen > 50:
|
||||
maxlen = 50
|
||||
for command, description in zip(command_list, descriptions):
|
||||
space_count = maxlen - len(command)
|
||||
content.append("{0}{1} # {2}".format(command, " " * space_count, description))
|
||||
|
||||
content.append("```")
|
||||
return "\n".join(content)
|
||||
|
||||
|
||||
def usage_section(service, variable, alias, image, scheme, ports, unimplemented):
|
||||
return "\n\n".join(
|
||||
[
|
||||
"## 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.",
|
||||
usage_intro(service, variable, alias, image, scheme, ports, unimplemented),
|
||||
usage_lifecycle(service, variable, alias, image, scheme, ports, unimplemented),
|
||||
usage_automation(service, variable, alias, image, scheme, ports, unimplemented),
|
||||
usage_data_management(service, variable, alias, image, scheme, ports, unimplemented),
|
||||
usage_backup(service, variable, alias, image, scheme, ports, unimplemented),
|
||||
usage_docker_pull(service, variable, alias, image, scheme, ports, unimplemented),
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
def usage_intro(service, variable, alias, image, scheme, ports, unimplemented):
|
||||
commands = ["create", "info", "list", "logs", "link", "unlink"]
|
||||
content = ["### Basic Usage"]
|
||||
|
||||
return fetch_commands_content(
|
||||
service, variable, alias, image, scheme, ports, unimplemented, commands, content
|
||||
)
|
||||
|
||||
|
||||
def usage_lifecycle(service, variable, alias, image, scheme, ports, unimplemented):
|
||||
commands = [
|
||||
"connect",
|
||||
"enter",
|
||||
"expose",
|
||||
"unexpose",
|
||||
"promote",
|
||||
"start",
|
||||
"stop",
|
||||
"restart",
|
||||
"upgrade",
|
||||
]
|
||||
content = [
|
||||
"### Service Lifecycle",
|
||||
"",
|
||||
"The lifecycle of each service can be managed through the following commands:",
|
||||
"",
|
||||
]
|
||||
|
||||
return fetch_commands_content(
|
||||
service, variable, alias, image, scheme, ports, unimplemented, commands, content
|
||||
)
|
||||
|
||||
|
||||
def usage_automation(service, variable, alias, image, scheme, ports, unimplemented):
|
||||
commands = ["app-links", "clone", "exists", "linked", "links"]
|
||||
content = [
|
||||
"### Service Automation",
|
||||
"",
|
||||
"Service scripting can be executed using the following commands:",
|
||||
"",
|
||||
]
|
||||
|
||||
return fetch_commands_content(
|
||||
service, variable, alias, image, scheme, ports, unimplemented, commands, content
|
||||
)
|
||||
|
||||
|
||||
def usage_data_management(service, variable, alias, image, scheme, ports, unimplemented):
|
||||
commands = ["import", "export"]
|
||||
content = [
|
||||
"### Data Management",
|
||||
"",
|
||||
"The underlying service data can be imported and exported with the following commands:",
|
||||
"",
|
||||
]
|
||||
|
||||
return fetch_commands_content(
|
||||
service, variable, alias, image, scheme, ports, unimplemented, commands, content
|
||||
)
|
||||
|
||||
|
||||
def usage_backup(service, variable, alias, image, scheme, ports, unimplemented):
|
||||
commands = [
|
||||
"backup-auth",
|
||||
"backup-deauth",
|
||||
"backup",
|
||||
"backup-set-encryption",
|
||||
"backup-unset-encryption",
|
||||
"backup-schedule",
|
||||
"backup-schedule-cat",
|
||||
"backup-unschedule",
|
||||
]
|
||||
content = [
|
||||
"### Backups",
|
||||
"",
|
||||
"Datastore backups are supported via AWS S3 and S3 compatible services like [minio](https://github.com/minio/minio).",
|
||||
"",
|
||||
"You may skip the `backup-auth` step if your dokku install is running within EC2 and has access to the bucket via an IAM profile. In that case, use the `--use-iam` option with the `backup` command.",
|
||||
"",
|
||||
"Backups can be performed using the backup commands:",
|
||||
"",
|
||||
]
|
||||
|
||||
return fetch_commands_content(
|
||||
service, variable, alias, image, scheme, ports, unimplemented, commands, content
|
||||
)
|
||||
|
||||
|
||||
def usage_docker_pull(service, variable, alias, image, scheme, ports, unimplemented):
|
||||
service_prefix = service.upper()
|
||||
return "\n".join(
|
||||
[
|
||||
"### Disabling `docker pull` calls",
|
||||
"",
|
||||
f"If you wish to disable the `docker pull` calls that the plugin triggers, you may set the `{service_prefix}_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.",
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
def fetch_commands_content(
|
||||
service, variable, alias, image, scheme, ports, unimplemented, commands, content
|
||||
):
|
||||
i = 0
|
||||
for command in commands:
|
||||
output = command_help(command, service, variable, alias, image, scheme, ports, unimplemented)
|
||||
if output == "":
|
||||
continue
|
||||
content.append(output)
|
||||
i += 1
|
||||
|
||||
if i == 0:
|
||||
return ""
|
||||
|
||||
return "\n".join(content)
|
||||
|
||||
|
||||
def parse_args(line):
|
||||
line = line.strip()
|
||||
arguments = []
|
||||
for arg in re.findall("([A-Z_]+)", line):
|
||||
arg = arg.replace("_", "-").lower()
|
||||
if arg.endswith("optional-flag"):
|
||||
arg = arg.replace("-optional-flag", "")
|
||||
arguments.append(f"[--{arg}]")
|
||||
elif arg.endswith("-flag"):
|
||||
if arg == "info-flag":
|
||||
arguments.append(f"[--single-info-flag]")
|
||||
else:
|
||||
arg = arg.replace("-flag", "")
|
||||
first_letter = arg[0]
|
||||
arguments.append(f"[-{first_letter}|--{arg}]")
|
||||
elif arg.endswith("-flags-list"):
|
||||
arg = arg.replace("-list", "")
|
||||
arguments.append(f"[--{arg}...]")
|
||||
elif arg.endswith("list"):
|
||||
arg = arg.replace("-list", "")
|
||||
arguments.append(f"<{arg}...>")
|
||||
else:
|
||||
arguments.append(f"<{arg}>")
|
||||
return " ".join(arguments)
|
||||
|
||||
|
||||
def command_help(command, service, variable, alias, image, scheme, ports, unimplemented):
|
||||
if command in unimplemented:
|
||||
return ""
|
||||
|
||||
data = command_data(command, service, variable, alias, image, scheme, ports)
|
||||
content = [
|
||||
f"### {data['description']}",
|
||||
"",
|
||||
"```shell",
|
||||
"# usage",
|
||||
f"dokku {service}:{command} {data['arguments_string']}",
|
||||
"```",
|
||||
]
|
||||
|
||||
# if len(data["arguments"]) > 0:
|
||||
# content.append("")
|
||||
# content.append("arguments:")
|
||||
# content.append("")
|
||||
# for argument in data["arguments"]:
|
||||
# content.append(f"- {argument}")
|
||||
|
||||
if len(data["flags"]) > 0:
|
||||
content.append("")
|
||||
content.append("flags:")
|
||||
content.append("")
|
||||
for flag in data["flags"]:
|
||||
content.append(f"- {flag}")
|
||||
|
||||
if len(data["examples"]) > 0:
|
||||
content.append("")
|
||||
content.append(data["examples"])
|
||||
|
||||
return "\n" + "\n".join(content)
|
||||
|
||||
|
||||
def command_data(command, service, variable, alias, image, scheme, ports):
|
||||
description = None
|
||||
arguments = []
|
||||
arguments_string = ""
|
||||
example_lines = []
|
||||
flags = []
|
||||
with open(os.path.join("subcommands", command)) as f:
|
||||
for line in f.readlines():
|
||||
line = line.strip()
|
||||
line = line.replace("$PLUGIN_SERVICE", service)
|
||||
line = line.replace("$PLUGIN_COMMAND_PREFIX", service)
|
||||
line = line.replace("${PLUGIN_COMMAND_PREFIX}", service)
|
||||
line = line.replace("${PLUGIN_VARIABLE}", variable)
|
||||
line = line.replace("${PLUGIN_DEFAULT_ALIAS}", alias)
|
||||
line = line.replace("${PLUGIN_IMAGE}", image)
|
||||
line = line.replace("${PLUGIN_SCHEME}", scheme)
|
||||
line = line.replace("${PLUGIN_DATASTORE_PORTS[0]}", ports[0])
|
||||
line = line.replace("${PLUGIN_DATASTORE_PORTS[@]}", " ".join(ports))
|
||||
|
||||
if "declare desc" in line:
|
||||
description = re.search('"(.+)"', line).group(1)
|
||||
elif "$1" in line:
|
||||
arguments_string = parse_args(line)
|
||||
elif line.startswith("#A "):
|
||||
argument = line.replace("#A ", "")
|
||||
parts = [a.strip() for a in argument.split(",", 1)]
|
||||
arguments.append(f"`{parts[0]}`: {parts[1]}")
|
||||
elif line.startswith("#F "):
|
||||
flag = line.replace("#F ", "")
|
||||
parts = [a.strip() for a in flag.split(",", 1)]
|
||||
flags.append(f"`{parts[0]}`: {parts[1]}")
|
||||
elif line.startswith("#E "):
|
||||
example_lines.append(line.replace("#E ", ""))
|
||||
|
||||
examples = []
|
||||
sentence_lines = []
|
||||
command_lines = []
|
||||
codeblock_lines = []
|
||||
blockquote_lines = []
|
||||
for line in example_lines:
|
||||
if line.startswith("export") or line.startswith("dokku"):
|
||||
if len(blockquote_lines) > 0:
|
||||
examples.append("\n" + process_blockquote(blockquote_lines))
|
||||
blockquote_lines = []
|
||||
if len(codeblock_lines) > 0:
|
||||
examples.append("\n" + process_codeblock(codeblock_lines))
|
||||
codeblock_lines = []
|
||||
if len(sentence_lines) > 0:
|
||||
examples.append("\n" + process_sentence(sentence_lines))
|
||||
sentence_lines = []
|
||||
|
||||
command_lines.append(line)
|
||||
elif line.startswith(" "):
|
||||
if len(blockquote_lines) > 0:
|
||||
examples.append("\n" + process_blockquote(blockquote_lines))
|
||||
blockquote_lines = []
|
||||
if len(command_lines) > 0:
|
||||
examples.append("\n" + process_command(command_lines))
|
||||
command_lines = []
|
||||
if len(sentence_lines) > 0:
|
||||
examples.append("\n" + process_sentence(sentence_lines))
|
||||
sentence_lines = []
|
||||
|
||||
codeblock_lines.append(line.strip())
|
||||
elif line.startswith(">"):
|
||||
if len(codeblock_lines) > 0:
|
||||
examples.append("\n" + process_codeblock(codeblock_lines))
|
||||
codeblock_lines = []
|
||||
if len(command_lines) > 0:
|
||||
examples.append("\n" + process_command(command_lines))
|
||||
command_lines = []
|
||||
if len(sentence_lines) > 0:
|
||||
examples.append("\n" + process_sentence(sentence_lines))
|
||||
sentence_lines = []
|
||||
|
||||
blockquote_lines.append(line)
|
||||
else:
|
||||
if len(blockquote_lines) > 0:
|
||||
examples.append("\n" + process_blockquote(blockquote_lines))
|
||||
blockquote_lines = []
|
||||
if len(codeblock_lines) > 0:
|
||||
examples.append("\n" + process_codeblock(codeblock_lines))
|
||||
codeblock_lines = []
|
||||
if len(command_lines) > 0:
|
||||
examples.append("\n" + process_command(command_lines))
|
||||
command_lines = []
|
||||
|
||||
sentence_lines.append(line)
|
||||
|
||||
if len(blockquote_lines) > 0:
|
||||
examples.append("\n" + process_blockquote(blockquote_lines))
|
||||
blockquote_lines = []
|
||||
if len(codeblock_lines) > 0:
|
||||
examples.append("\n" + process_codeblock(codeblock_lines))
|
||||
codeblock_lines = []
|
||||
if len(command_lines) > 0:
|
||||
examples.append("\n" + process_command(command_lines))
|
||||
command_lines = []
|
||||
if len(sentence_lines) > 0:
|
||||
examples.append("\n" + process_sentence(sentence_lines))
|
||||
sentence_lines = []
|
||||
|
||||
return {
|
||||
"description": description,
|
||||
"arguments_string": arguments_string,
|
||||
"arguments": arguments,
|
||||
"flags": flags,
|
||||
"examples": "\n".join(examples).strip(),
|
||||
}
|
||||
|
||||
|
||||
def process_sentence(sentence_lines):
|
||||
sentence_lines = " ".join(sentence_lines)
|
||||
sentences = ". ".join(
|
||||
upperfirst(i.strip()) for i in sentence_lines.split(".")
|
||||
).strip()
|
||||
if not sentences.endswith(".") and not sentences.endswith(":"):
|
||||
sentences += ":"
|
||||
|
||||
text = []
|
||||
for sentence in sentences.split("."):
|
||||
parts = []
|
||||
for word in sentence.strip().split(" "):
|
||||
if word.isupper() and len(word) > 1:
|
||||
for ending in [':', '.']:
|
||||
if word.endswith(ending):
|
||||
word = '`{0}`{1}'.format(word[:-1], ending)
|
||||
else:
|
||||
word = '`{0}`'.format(word)
|
||||
parts.append(word)
|
||||
text.append(" ".join(parts))
|
||||
|
||||
text = ". ".join(text)
|
||||
|
||||
# some cleanup
|
||||
text = text.replace("(0. 0. 0. 0)", "(`0.0.0.0`)")
|
||||
|
||||
return text
|
||||
|
||||
|
||||
def upperfirst(x):
|
||||
return x[:1].upper() + x[1:]
|
||||
|
||||
|
||||
def process_blockquote(blockquote_lines):
|
||||
return "\n".join(blockquote_lines)
|
||||
|
||||
|
||||
def process_command(command_lines):
|
||||
command_lines = "\n".join(command_lines)
|
||||
return f"```shell\n{command_lines}\n```"
|
||||
|
||||
|
||||
def process_codeblock(codeblock_lines):
|
||||
codeblock_lines = "\n".join(codeblock_lines)
|
||||
return f"```\n{codeblock_lines}\n```"
|
||||
|
||||
|
||||
def main():
|
||||
service = None
|
||||
version = None
|
||||
variable = None
|
||||
image = None
|
||||
alias = None
|
||||
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:
|
||||
for line in f.readlines():
|
||||
if "PLUGIN_COMMAND_PREFIX=" in line:
|
||||
service = re.search('"(.+)"', line).group(1)
|
||||
if "PLUGIN_DEFAULT_ALIAS=" in line:
|
||||
alias = re.search('"(.+)"', line).group(1)
|
||||
if "PLUGIN_VARIABLE=" in line:
|
||||
variable = re.search('"(.+)"', line).group(1)
|
||||
if "PLUGIN_SCHEME=" in line:
|
||||
scheme = re.search('"(.+)"', line).group(1)
|
||||
if "PLUGIN_DATASTORE_PORTS=" in line:
|
||||
ports = re.search("\((.+)\)", line).group(1).split(" ")
|
||||
if "PLUGIN_UNIMPLEMENTED_SUBCOMMANDS=" in line:
|
||||
match = re.search("\((.+)\)", line)
|
||||
if match is not None:
|
||||
unimplemented = [s.strip('"') for s in match.group(1).split(" ")]
|
||||
|
||||
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, unimplemented, "0.19.x+")
|
||||
|
||||
base_path = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
|
||||
readme_file = os.path.join(base_path, "README.md")
|
||||
with open(readme_file, "w") as f:
|
||||
f.write(text + "\n")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,4 +1,5 @@
|
||||
#!/usr/bin/env bash
|
||||
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/config"
|
||||
set -eo pipefail
|
||||
[[ $DOKKU_TRACE ]] && set -x
|
||||
source "$PLUGIN_AVAILABLE_PATH/config/functions"
|
||||
@@ -119,7 +120,7 @@ retry-docker-command() {
|
||||
local i=0 success=false
|
||||
until [ $i -ge 100 ]; do
|
||||
set +e
|
||||
docker exec -it "$ID" sh -c "$COMMAND" 2>/dev/null
|
||||
suppress_output docker exec "$ID" sh -c "$COMMAND"
|
||||
exit_code=$?
|
||||
set -e
|
||||
if [[ "$exit_code" == 0 ]]; then
|
||||
@@ -187,18 +188,18 @@ service_backup() {
|
||||
dokku_log_fail "Provide AWS credentials or use the --use-iam flag"
|
||||
fi
|
||||
|
||||
TMPDIR=$(mktemp -d)
|
||||
trap 'rm -rf "$TMPDIR" > /dev/null' RETURN INT TERM EXIT
|
||||
BACKUP_TMPDIR=$(mktemp -d --tmpdir)
|
||||
trap 'rm -rf "$BACKUP_TMPDIR" > /dev/null' RETURN INT TERM EXIT
|
||||
|
||||
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"
|
||||
|
||||
(service_export "$SERVICE" >"${TMPDIR}/export")
|
||||
(service_export "$SERVICE" >"${BACKUP_TMPDIR}/export")
|
||||
|
||||
# Build parameter list for s3backup tool
|
||||
BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e BUCKET_NAME=$BUCKET_NAME"
|
||||
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
|
||||
BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e AWS_DEFAULT_REGION=$(cat "$SERVICE_BACKUP_ROOT/AWS_DEFAULT_REGION")"
|
||||
@@ -217,7 +218,7 @@ service_backup() {
|
||||
fi
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
docker run --rm $BACKUP_PARAMETERS dokku/s3backup:0.10.1
|
||||
docker run --rm $BACKUP_PARAMETERS "$PLUGIN_S3BACKUP_IMAGE"
|
||||
}
|
||||
|
||||
service_backup_auth() {
|
||||
@@ -382,7 +383,7 @@ service_info() {
|
||||
local flag key valid_flags
|
||||
|
||||
local flag_map=(
|
||||
"--config-dir: ${SERVICE_ROOT}/config"
|
||||
"--config-dir: ${SERVICE_ROOT}/${PLUGIN_CONFIG_SUFFIX}"
|
||||
"--data-dir: ${SERVICE_ROOT}/data"
|
||||
"--dsn: ${SERVICE_URL}"
|
||||
"--exposed-ports: $(service_exposed_ports "$SERVICE")"
|
||||
@@ -394,7 +395,7 @@ service_info() {
|
||||
"--version: $(service_version "$SERVICE")"
|
||||
)
|
||||
if [[ -z "$INFO_FLAG" ]]; then
|
||||
dokku_log_info2 "Container Information"
|
||||
dokku_log_info2 "$SERVICE $PLUGIN_COMMAND_PREFIX service information"
|
||||
for flag in "${flag_map[@]}"; do
|
||||
key="$(echo "${flag#--}" | cut -f1 -d' ' | tr - ' ')"
|
||||
dokku_log_verbose "$(printf "%-20s %-25s" "${key^}" "${flag#*: }")"
|
||||
@@ -452,6 +453,7 @@ service_link() {
|
||||
fi
|
||||
|
||||
[[ -n $LINK ]] && dokku_log_fail "Already linked as $LINK"
|
||||
plugn trigger service-action pre-link "$SERVICE" "$APP"
|
||||
touch "$LINKS_FILE"
|
||||
echo "$APP" >>"$LINKS_FILE"
|
||||
sort "$LINKS_FILE" -u -o "$LINKS_FILE"
|
||||
@@ -464,7 +466,9 @@ service_link() {
|
||||
dokku docker-options:add "$APP" build,deploy,run "--link $SERVICE_NAME:$SERVICE_DNS_HOSTNAME"
|
||||
fi
|
||||
[[ -n "$SERVICE_QUERYSTRING" ]] && SERVICE_URL="${SERVICE_URL}?${SERVICE_QUERYSTRING}"
|
||||
plugn trigger service-action post-link "$SERVICE" "$APP"
|
||||
config_set "$APP" "${ALIAS}_URL=$SERVICE_URL"
|
||||
plugn trigger service-action post-link-complete "$SERVICE" "$APP"
|
||||
}
|
||||
|
||||
service_linked_apps() {
|
||||
@@ -494,19 +498,16 @@ service_links() {
|
||||
service_list() {
|
||||
declare desc="Lists all services and their status"
|
||||
local SERVICES=$(ls "$PLUGIN_DATA_ROOT" 2>/dev/null)
|
||||
|
||||
if [[ -z $SERVICES ]]; then
|
||||
dokku_log_warn "There are no $PLUGIN_SERVICE services"
|
||||
else
|
||||
LIST=""
|
||||
if [[ -z "$DOKKU_QUIET_OUTPUT" ]]; then
|
||||
LIST="NAME,VERSION,STATUS,EXPOSED PORTS,LINKS\n"
|
||||
fi
|
||||
|
||||
for SERVICE in $SERVICES; do
|
||||
LIST+="$SERVICE,$(service_version "$SERVICE"),$(service_status "$SERVICE"),$(service_exposed_ports "$SERVICE"),$(service_linked_apps "$SERVICE")\n"
|
||||
done
|
||||
printf "%b" "$LIST" | column -t -s,
|
||||
return
|
||||
fi
|
||||
|
||||
dokku_log_info2_quiet "$PLUGIN_SERVICE services"
|
||||
for SERVICE in $SERVICES; do
|
||||
echo "$SERVICE"
|
||||
done
|
||||
}
|
||||
|
||||
service_logs() {
|
||||
@@ -689,7 +690,7 @@ service_port_unpause() {
|
||||
echo "${PORTS[@]}" >"$PORT_FILE"
|
||||
|
||||
# shellcheck disable=SC2046
|
||||
docker run -d --link "$SERVICE_NAME:$PLUGIN_COMMAND_PREFIX" --name "$EXPOSED_NAME" $(docker_ports_options "${PORTS[@]}") --restart always --label dokku=ambassador --label "dokku.ambassador=$PLUGIN_COMMAND_PREFIX" dokku/ambassador:0.3.1 >/dev/null
|
||||
docker run -d --link "$SERVICE_NAME:$PLUGIN_COMMAND_PREFIX" --name "$EXPOSED_NAME" $(docker_ports_options "${PORTS[@]}") --restart always --label dokku=ambassador --label "dokku.ambassador=$PLUGIN_COMMAND_PREFIX" "$PLUGIN_AMBASSADOR_IMAGE" >/dev/null
|
||||
if [[ "$LOG_FAIL" == "true" ]]; then
|
||||
dokku_log_info1 "Service $SERVICE exposed on port(s) [container->host]: $(service_exposed_ports "$SERVICE")"
|
||||
fi
|
||||
@@ -740,13 +741,7 @@ service_status() {
|
||||
local ID="$(cat "$SERVICE_ROOT/ID")"
|
||||
local CONTAINER_STATUS
|
||||
|
||||
is_container_status "$ID" "Dead" && echo "dead" && return 0
|
||||
is_container_status "$ID" "OOMKilled" && echo "oomkilled" && return 0
|
||||
is_container_status "$ID" "Paused" && echo "paused" && return 0
|
||||
is_container_status "$ID" "Restarting" && echo "restarting" && return 0
|
||||
is_container_status "$ID" "Running" && echo "running" && return 0
|
||||
|
||||
CONTAINER_STATUS=$(docker inspect -f "{{.State.Status}}" "$CID" 2>/dev/null || true)
|
||||
CONTAINER_STATUS=$(docker inspect -f "{{.State.Status}}" "$ID" 2>/dev/null || true)
|
||||
[[ -n "$CONTAINER_STATUS" ]] && echo "$CONTAINER_STATUS" && return 0
|
||||
echo "missing" && return 0
|
||||
}
|
||||
@@ -779,6 +774,7 @@ service_unlink() {
|
||||
local SERVICE_DNS_HOSTNAME=$(service_dns_hostname "$SERVICE")
|
||||
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"
|
||||
|
||||
if declare -f -F add_passed_docker_option >/dev/null; then
|
||||
@@ -790,7 +786,9 @@ service_unlink() {
|
||||
fi
|
||||
|
||||
[[ -z ${LINK[*]} ]] && dokku_log_fail "Not linked to app $APP"
|
||||
plugn trigger service-action post-unlink "$SERVICE" "$APP"
|
||||
config_unset "$APP" "${LINK[*]}"
|
||||
plugn trigger service-action post-unlink-complete "$SERVICE" "$APP"
|
||||
}
|
||||
|
||||
service_version() {
|
||||
|
||||
11
config
11
config
@@ -1,6 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
export MONGO_IMAGE=${MONGO_IMAGE:="mongo"}
|
||||
export MONGO_IMAGE_VERSION=${MONGO_IMAGE_VERSION:="3.6.15"}
|
||||
_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
export MONGO_IMAGE=${MONGO_IMAGE:="$(awk -F '[ :]' '{print $2}' "${_DIR}/Dockerfile")"}
|
||||
export MONGO_IMAGE_VERSION=${MONGO_IMAGE_VERSION:="$(awk -F '[ :]' '{print $3}' "${_DIR}/Dockerfile")"}
|
||||
export MONGO_ROOT=${MONGO_ROOT:="$DOKKU_LIB_ROOT/services/mongo"}
|
||||
export MONGO_HOST_ROOT=${MONGO_HOST_ROOT:=$MONGO_ROOT}
|
||||
|
||||
@@ -21,8 +22,14 @@ export PLUGIN_SCHEME="mongodb"
|
||||
export PLUGIN_SERVICE="MongoDB"
|
||||
export PLUGIN_VARIABLE="MONGO"
|
||||
export PLUGIN_BASE_PATH="$PLUGIN_PATH"
|
||||
export PLUGIN_CONFIG_SUFFIX="config"
|
||||
if [[ -n $DOKKU_API_VERSION ]]; then
|
||||
export PLUGIN_BASE_PATH="$PLUGIN_ENABLED_PATH"
|
||||
fi
|
||||
|
||||
export PLUGIN_BUSYBOX_IMAGE="busybox:1.31.1-uclibc"
|
||||
export PLUGIN_AMBASSADOR_IMAGE="dokku/ambassador:0.3.3"
|
||||
export PLUGIN_S3BACKUP_IMAGE="dokku/s3backup:0.10.3"
|
||||
export PLUGIN_WAIT_IMAGE="dokku/wait:0.4.3"
|
||||
|
||||
export MONGO_CONFIG_OPTIONS=${MONGO_CONFIG_OPTIONS:=" --storageEngine wiredTiger --auth "}
|
||||
|
||||
13
functions
13
functions
@@ -41,9 +41,10 @@ service_create() {
|
||||
docker pull "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION" || dokku_log_fail "$PLUGIN_SERVICE image $PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION pull failed"
|
||||
fi
|
||||
|
||||
plugn trigger service-action pre-create "$SERVICE"
|
||||
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/config" || dokku_log_fail "Unable to create service config directory"
|
||||
mkdir -p "$SERVICE_ROOT/$PLUGIN_CONFIG_SUFFIX" || dokku_log_fail "Unable to create service config directory"
|
||||
touch "$LINKS_FILE"
|
||||
|
||||
ROOTPASSWORD=$(openssl rand -hex 16)
|
||||
@@ -75,7 +76,9 @@ service_create() {
|
||||
fi
|
||||
|
||||
write_database_name "$SERVICE"
|
||||
plugn trigger service-action post-create "$SERVICE"
|
||||
service_create_container "$SERVICE"
|
||||
plugn trigger service-action post-create-complete "$SERVICE"
|
||||
}
|
||||
|
||||
service_create_container() {
|
||||
@@ -96,7 +99,7 @@ service_create_container() {
|
||||
echo "$ID" >"$SERVICE_ROOT/ID"
|
||||
|
||||
dokku_log_verbose_quiet "Waiting for container to be ready"
|
||||
docker run --rm --link "$SERVICE_NAME:$PLUGIN_COMMAND_PREFIX" dokku/wait:0.4.0 -p "$PLUGIN_DATASTORE_WAIT_PORT" >/dev/null
|
||||
docker run --rm --link "$SERVICE_NAME:$PLUGIN_COMMAND_PREFIX" "$PLUGIN_WAIT_IMAGE" -p "$PLUGIN_DATASTORE_WAIT_PORT" >/dev/null
|
||||
|
||||
echo "db.createUser({user:'admin',pwd:'$ROOTPASSWORD',roles:[{role:'userAdminAnyDatabase',db:'admin'},{role:'__system',db:'admin'},{role:'root',db:'admin'}]})" | docker exec -i "$SERVICE_NAME" mongo admin >/dev/null
|
||||
echo "db.createUser({user:'$SERVICE',pwd:'$PASSWORD',roles:[{role:'readWrite',db:'$DATABASE_NAME'}]})" | docker exec -i "$SERVICE_NAME" mongo -u admin -p "$ROOTPASSWORD" --authenticationDatabase admin "$DATABASE_NAME" >/dev/null
|
||||
@@ -159,7 +162,11 @@ service_start() {
|
||||
elif service_image_exists "$SERVICE" && [[ -n "$ROOTPASSWORD" ]] && [[ -n "$PASSWORD" ]]; then
|
||||
service_create_container "$SERVICE"
|
||||
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
|
||||
}
|
||||
|
||||
|
||||
@@ -76,10 +76,10 @@ fn-help-contents() {
|
||||
|
||||
fn-help-contents-subcommand() {
|
||||
declare SUBCOMMAND="$1" FULL_OUTPUT="$2"
|
||||
local TMPDIR=$(mktemp -d)
|
||||
local UNCLEAN_FILE="${TMPDIR}/cmd-unclean" CLEAN_FILE="${TMPDIR}/cmd-clean"
|
||||
local HELP_TMPDIR=$(mktemp -d --tmpdir)
|
||||
local UNCLEAN_FILE="${HELP_TMPDIR}/cmd-unclean" CLEAN_FILE="${HELP_TMPDIR}/cmd-clean"
|
||||
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"
|
||||
cat "$SUBCOMMAND_ROOT/$SUBCOMMAND" >"$UNCLEAN_FILE"
|
||||
@@ -164,8 +164,8 @@ fn-help-list-example() {
|
||||
# shellcheck disable=SC2034
|
||||
declare desc="return $PLUGIN_COMMAND_PREFIX plugin help content"
|
||||
cat <<help_list
|
||||
NAME, VERSION, STATUS, EXPOSED PORTS, LINKS
|
||||
service-name, $PLUGIN_COMMAND_PREFIX:$PLUGIN_IMAGE_VERSION, running, -, app-name
|
||||
$PLUGIN_SERVICE services
|
||||
service-name
|
||||
help_list
|
||||
}
|
||||
|
||||
@@ -191,7 +191,7 @@ fn-help-subcommand-args() {
|
||||
if [[ "$arg" == *_FLAG ]]; then
|
||||
arg="${arg/_FLAG/}"
|
||||
if [[ $arg == "INFO" ]]; then
|
||||
arg="SINGLE_INFO_FLAG..."
|
||||
arg="SINGLE_INFO_FLAG"
|
||||
args+=" ${BLUE}[--${arg//_/-}]${NORMAL}"
|
||||
else
|
||||
args+=" ${BLUE}[-${arg:0:1}|--${arg//_/-}]${NORMAL}"
|
||||
|
||||
8
install
8
install
@@ -17,10 +17,10 @@ plugin-install() {
|
||||
}
|
||||
|
||||
pull-docker-image "${PLUGIN_IMAGE}:${PLUGIN_IMAGE_VERSION}"
|
||||
pull-docker-image "busybox:1.31.0-uclibc"
|
||||
pull-docker-image "dokku/ambassador:0.3.1"
|
||||
pull-docker-image "dokku/s3backup:0.10.1"
|
||||
pull-docker-image "dokku/wait:0.4.0"
|
||||
pull-docker-image "$PLUGIN_BUSYBOX_IMAGE"
|
||||
pull-docker-image "$PLUGIN_AMBASSADOR_IMAGE"
|
||||
pull-docker-image "$PLUGIN_S3BACKUP_IMAGE"
|
||||
pull-docker-image "$PLUGIN_WAIT_IMAGE"
|
||||
|
||||
mkdir -p "$PLUGIN_DATA_ROOT" || echo "Failed to create $PLUGIN_SERVICE data directory"
|
||||
chown dokku:dokku "$PLUGIN_DATA_ROOT"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[plugin]
|
||||
description = "dokku mongo service plugin"
|
||||
version = "1.9.4"
|
||||
version = "1.13.0"
|
||||
[plugin.config]
|
||||
|
||||
@@ -6,7 +6,7 @@ source "$PLUGIN_BASE_PATH/common/functions"
|
||||
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
|
||||
|
||||
service-backup-set-encryption-cmd() {
|
||||
#E set a GPG passphrase for backups
|
||||
#E set the GPG-compatible passphrase for encrypting backups for backups
|
||||
#E dokku $PLUGIN_COMMAND_PREFIX:backup-set-encryption lolipop
|
||||
#A service, service to run command against
|
||||
#A passphrase, a GPG-compatible passphrase
|
||||
|
||||
@@ -6,7 +6,7 @@ source "$PLUGIN_BASE_PATH/common/functions"
|
||||
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
|
||||
|
||||
service-backup-unset-encryption-cmd() {
|
||||
#E unset a GPG encryption key for backups
|
||||
#E unset the GPG encryption passphrase for backups
|
||||
#E dokku $PLUGIN_COMMAND_PREFIX:backup-unset-encryption lolipop
|
||||
#A service, service to run command against
|
||||
declare desc="unsets encryption for future backups of the $PLUGIN_SERVICE service"
|
||||
|
||||
@@ -41,13 +41,15 @@ service-destroy-cmd() {
|
||||
fi
|
||||
|
||||
dokku_log_info2_quiet "Deleting $SERVICE"
|
||||
plugn trigger service-action pre-delete "$SERVICE"
|
||||
service_backup_unschedule "$SERVICE"
|
||||
service_container_rm "$SERVICE"
|
||||
|
||||
dokku_log_verbose_quiet "Removing data"
|
||||
docker run --rm -v "$SERVICE_HOST_ROOT/data:/data" -v "$SERVICE_HOST_ROOT/config:/config" busybox:1.31.0-uclibc 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"
|
||||
|
||||
plugn trigger service-action post-delete "$SERVICE"
|
||||
dokku_log_info2 "$PLUGIN_SERVICE container deleted: $SERVICE"
|
||||
}
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ service-info-cmd() {
|
||||
#F --service-root, show the service root directory
|
||||
#F --status, show the service running status
|
||||
#F --version, show the service image version
|
||||
declare desc="print the connection information"
|
||||
declare desc="print the service information"
|
||||
local cmd="$PLUGIN_COMMAND_PREFIX:info" argv=("$@")
|
||||
[[ ${argv[0]} == "$cmd" ]] && shift 1
|
||||
declare SERVICE="$1" INFO_FLAG="$2"
|
||||
|
||||
@@ -30,10 +30,10 @@ service-link-cmd() {
|
||||
#E use the 'expose' subcommand. another service can be linked to your app:
|
||||
#E dokku $PLUGIN_COMMAND_PREFIX:link other_service playground
|
||||
#E it is possible to change the protocol for ${PLUGIN_DEFAULT_ALIAS}_URL by setting the
|
||||
#E environment variable ${PLUGIN_DEFAULT_ALIAS}_DATABASE_SCHEME on the app. doing so will
|
||||
#E environment variable ${PLUGIN_VARIABLE}_DATABASE_SCHEME on the app. doing so will
|
||||
#E after linking will cause the plugin to think the service is not
|
||||
#E linked, and we advise you to unlink before proceeding.
|
||||
#E dokku config:set playground ${PLUGIN_DEFAULT_ALIAS}_DATABASE_SCHEME=${PLUGIN_SCHEME}2
|
||||
#E dokku config:set playground ${PLUGIN_VARIABLE}_DATABASE_SCHEME=${PLUGIN_SCHEME}2
|
||||
#E dokku $PLUGIN_COMMAND_PREFIX:link lolipop playground
|
||||
#E this will cause ${PLUGIN_DEFAULT_ALIAS}_URL to be set as:
|
||||
#E
|
||||
|
||||
@@ -2,18 +2,18 @@
|
||||
load test_helper
|
||||
|
||||
setup() {
|
||||
dokku apps:create my_app
|
||||
dokku apps:create my-app
|
||||
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() {
|
||||
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
|
||||
}
|
||||
|
||||
@test "($PLUGIN_COMMAND_PREFIX:hook:pre-delete) removes app from links file when destroying app" {
|
||||
[[ -n $(< "$PLUGIN_DATA_ROOT/l/LINKS") ]]
|
||||
dokku --force apps:destroy my_app
|
||||
dokku --force apps:destroy my-app
|
||||
[[ -z $(< "$PLUGIN_DATA_ROOT/l/LINKS") ]]
|
||||
}
|
||||
|
||||
@@ -20,6 +20,9 @@ teardown() {
|
||||
}
|
||||
|
||||
@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`
|
||||
run dokku "$PLUGIN_COMMAND_PREFIX:export" l
|
||||
echo "output: $output"
|
||||
|
||||
@@ -24,6 +24,9 @@ teardown() {
|
||||
}
|
||||
|
||||
@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
|
||||
assert_contains "${lines[*]}" "No data provided on stdin"
|
||||
assert_failure
|
||||
|
||||
@@ -4,13 +4,13 @@ load test_helper
|
||||
setup() {
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:create" l
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:create" m
|
||||
dokku apps:create my_app
|
||||
dokku apps:create my-app
|
||||
}
|
||||
|
||||
teardown() {
|
||||
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" m
|
||||
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" {
|
||||
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 "status: $status"
|
||||
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" {
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app
|
||||
run 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
|
||||
echo "output: $output"
|
||||
echo "status: $status"
|
||||
assert_contains "${lines[*]}" "Already linked as MONGO_URL"
|
||||
assert_failure
|
||||
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
|
||||
}
|
||||
|
||||
@test "($PLUGIN_COMMAND_PREFIX:link) exports MONGO_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 "status: $status"
|
||||
url=$(dokku config:get my_app MONGO_URL)
|
||||
url=$(dokku config:get my-app MONGO_URL)
|
||||
password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")"
|
||||
assert_contains "$url" "mongodb://l:$password@dokku-mongo-l:27017/l"
|
||||
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 MONGO_URL already in use" {
|
||||
dokku config:set my_app MONGO_URL=mongodb://user:pass@host:27017/db
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app
|
||||
run dokku config my_app
|
||||
dokku config:set my-app MONGO_URL=mongodb://user:pass@host:27017/db
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app
|
||||
run dokku config my-app
|
||||
assert_contains "${lines[*]}" "DOKKU_MONGO_AQUA_URL"
|
||||
assert_success
|
||||
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:link" m my_app
|
||||
run dokku config my_app
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:link" m my-app
|
||||
run dokku config my-app
|
||||
assert_contains "${lines[*]}" "DOKKU_MONGO_BLACK_URL"
|
||||
assert_success
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:unlink" m my_app
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:unlink" m my-app
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
|
||||
}
|
||||
|
||||
@test "($PLUGIN_COMMAND_PREFIX:link) links to app with docker-options" {
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app
|
||||
run dokku docker-options my_app
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app
|
||||
run dokku docker-options:report my-app
|
||||
assert_contains "${lines[*]}" "--link dokku.mongo.l:dokku-mongo-l"
|
||||
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 MONGO_DATABASE_SCHEME variable" {
|
||||
dokku config:set my_app MONGO_DATABASE_SCHEME=mongodb2
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app
|
||||
url=$(dokku config:get my_app MONGO_URL)
|
||||
dokku config:set my-app MONGO_DATABASE_SCHEME=mongodb2
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app
|
||||
url=$(dokku config:get my-app MONGO_URL)
|
||||
password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")"
|
||||
assert_contains "$url" "mongodb2://l:$password@dokku-mongo-l:27017/l"
|
||||
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" {
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app --querystring "pool=5"
|
||||
url=$(dokku config:get my_app MONGO_URL)
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app --querystring "pool=5"
|
||||
url=$(dokku config:get my-app MONGO_URL)
|
||||
assert_contains "$url" "?pool=5"
|
||||
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" {
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app --alias "ALIAS"
|
||||
url=$(dokku config:get my_app ALIAS_URL)
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app --alias "ALIAS"
|
||||
url=$(dokku config:get my-app ALIAS_URL)
|
||||
password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")"
|
||||
assert_contains "$url" "mongodb://l:$password@dokku-mongo-l:27017/l"
|
||||
assert_success
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
|
||||
}
|
||||
|
||||
@@ -10,27 +10,13 @@ teardown() {
|
||||
}
|
||||
|
||||
@test "($PLUGIN_COMMAND_PREFIX:list) with no exposed ports, no linked apps" {
|
||||
run dokku "$PLUGIN_COMMAND_PREFIX:list"
|
||||
assert_contains "${lines[*]}" "l mongo:3.6.15 running - -"
|
||||
}
|
||||
|
||||
@test "($PLUGIN_COMMAND_PREFIX:list) with exposed ports" {
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:expose" l 4242 4243 4244 4245
|
||||
run dokku "$PLUGIN_COMMAND_PREFIX:list"
|
||||
assert_contains "${lines[*]}" "l mongo:3.6.15 running 27017->4242 27018->4243 27019->4244 28017->4245 -"
|
||||
}
|
||||
|
||||
@test "($PLUGIN_COMMAND_PREFIX:list) with linked app" {
|
||||
dokku apps:create my_app
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app
|
||||
run dokku "$PLUGIN_COMMAND_PREFIX:list"
|
||||
assert_contains "${lines[*]}" "l mongo:3.6.15 running - my_app"
|
||||
dokku --force apps:destroy my_app
|
||||
run dokku --quiet "$PLUGIN_COMMAND_PREFIX:list"
|
||||
assert_output "l"
|
||||
}
|
||||
|
||||
@test "($PLUGIN_COMMAND_PREFIX:list) when there are no services" {
|
||||
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" l
|
||||
run dokku "$PLUGIN_COMMAND_PREFIX:list"
|
||||
assert_contains "${lines[*]}" "There are no MongoDB services"
|
||||
assert_output "${lines[*]}" "There are no $PLUGIN_SERVICE services"
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:create" l
|
||||
}
|
||||
|
||||
@@ -3,14 +3,14 @@ load test_helper
|
||||
|
||||
setup() {
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:create" l
|
||||
dokku apps:create my_app
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app
|
||||
dokku apps:create my-app
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app
|
||||
}
|
||||
|
||||
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 apps:destroy my_app
|
||||
dokku --force apps:destroy my-app
|
||||
}
|
||||
|
||||
@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" {
|
||||
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"
|
||||
}
|
||||
|
||||
@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 MONGO_URL"
|
||||
}
|
||||
|
||||
@test "($PLUGIN_COMMAND_PREFIX:promote) changes MONGO_URL" {
|
||||
password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")"
|
||||
dokku config:set my_app "MONGO_URL=mongodb://u:p@host:27017/db" "DOKKU_MONGO_BLUE_URL=mongodb://l:$password@dokku-mongo-l:27017/l"
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:promote" l my_app
|
||||
url=$(dokku config:get my_app MONGO_URL)
|
||||
dokku config:set my-app "MONGO_URL=mongodb://u:p@host:27017/db" "DOKKU_MONGO_BLUE_URL=mongodb://l:$password@dokku-mongo-l:27017/l"
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:promote" l my-app
|
||||
url=$(dokku config:get my-app MONGO_URL)
|
||||
assert_equal "$url" "mongodb://l:$password@dokku-mongo-l:27017/l"
|
||||
}
|
||||
|
||||
@test "($PLUGIN_COMMAND_PREFIX:promote) creates new config url when needed" {
|
||||
password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")"
|
||||
dokku config:set my_app "MONGO_URL=mongodb://u:p@host:27017/db" "DOKKU_MONGO_BLUE_URL=mongodb://l:$password@dokku-mongo-l:27017/l"
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:promote" l my_app
|
||||
run dokku config my_app
|
||||
dokku config:set my-app "MONGO_URL=mongodb://u:p@host:27017/db" "DOKKU_MONGO_BLUE_URL=mongodb://l:$password@dokku-mongo-l:27017/l"
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:promote" l my-app
|
||||
run dokku config my-app
|
||||
assert_contains "${lines[*]}" "DOKKU_MONGO_"
|
||||
}
|
||||
@test "($PLUGIN_COMMAND_PREFIX:promote) uses MONGO_DATABASE_SCHEME variable" {
|
||||
password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")"
|
||||
dokku config:set my_app "MONGO_DATABASE_SCHEME=mongodb2" "MONGO_URL=mongodb://u:p@host:27017/db" "DOKKU_MONGO_BLUE_URL=mongodb2://l:$password@dokku-mongo-l:27017/l"
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:promote" l my_app
|
||||
url=$(dokku config:get my_app MONGO_URL)
|
||||
dokku config:set my-app "MONGO_DATABASE_SCHEME=mongodb2" "MONGO_URL=mongodb://u:p@host:27017/db" "DOKKU_MONGO_BLUE_URL=mongodb2://l:$password@dokku-mongo-l:27017/l"
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:promote" l my-app
|
||||
url=$(dokku config:get my-app MONGO_URL)
|
||||
assert_contains "$url" "mongodb2://l:$password@dokku-mongo-l:27017/l"
|
||||
}
|
||||
|
||||
@@ -2,13 +2,13 @@
|
||||
load test_helper
|
||||
|
||||
setup() {
|
||||
dokku apps:create my_app
|
||||
dokku apps:create my-app
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:create" l
|
||||
}
|
||||
|
||||
teardown() {
|
||||
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" {
|
||||
@@ -27,27 +27,27 @@ teardown() {
|
||||
}
|
||||
|
||||
@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"
|
||||
}
|
||||
|
||||
@test "($PLUGIN_COMMAND_PREFIX:unlink) error when service not linked to app" {
|
||||
run dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app
|
||||
assert_contains "${lines[*]}" "Not linked to app my_app"
|
||||
run dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
|
||||
assert_contains "${lines[*]}" "Not linked to app my-app"
|
||||
}
|
||||
|
||||
@test "($PLUGIN_COMMAND_PREFIX:unlink) removes link from docker-options" {
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app >&2
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app >&2
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
|
||||
|
||||
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"
|
||||
}
|
||||
|
||||
@test "($PLUGIN_COMMAND_PREFIX:unlink) unsets config url from app" {
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app >&2
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app
|
||||
config=$(dokku config:get my_app MONGO_URL || true)
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app >&2
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
|
||||
config=$(dokku config:get my-app MONGO_URL || true)
|
||||
assert_equal "$config" ""
|
||||
}
|
||||
|
||||
@@ -2,9 +2,13 @@
|
||||
set -eo pipefail
|
||||
[[ $TRACE ]] && set -x
|
||||
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 762E3157
|
||||
echo "deb http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
|
||||
echo "deb http://nginx.org/packages/ubuntu $(lsb_release -cs) nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
|
||||
curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add -
|
||||
|
||||
sudo mkdir -p /etc/nginx
|
||||
sudo curl https://raw.githubusercontent.com/dokku/dokku/master/tests/dhparam.pem -o /etc/nginx/dhparam.pem
|
||||
|
||||
echo "dokku dokku/skip_key_file boolean true" | sudo debconf-set-selections
|
||||
wget https://raw.githubusercontent.com/dokku/dokku/master/bootstrap.sh
|
||||
if [[ "$DOKKU_VERSION" == "master" ]]; then
|
||||
sudo bash bootstrap.sh
|
||||
@@ -15,12 +19,15 @@ echo "Dokku version $DOKKU_VERSION"
|
||||
|
||||
export DOKKU_LIB_ROOT="/var/lib/dokku"
|
||||
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 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" \;
|
||||
[[ -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 "./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 dokku plugin:enable "$PLUGIN_COMMAND_PREFIX"
|
||||
sudo dokku plugin:install
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
# SC1090 - Can't follow non-constant source. Use a directive to specify location - https://github.com/koalaman/shellcheck/wiki/SC1090
|
||||
# SC2034 - Variable appears unused. Verify it or export it - https://github.com/koalaman/shellcheck/wiki/SC2034
|
||||
# SC2155 - Declare and assign separately to avoid masking return values - https://github.com/koalaman/shellcheck/wiki/SC2155
|
||||
# SC2206 - Quote to prevent word splitting/globbing, or split robustly with mapfile or read -a - https://github.com/koalaman/shellcheck/wiki/SC2206
|
||||
# SC2207 - Prefer mapfile or read -a to split command output (or quote to avoid splitting) - https://github.com/koalaman/shellcheck/wiki/SC2207
|
||||
# SC2220 - Invalid flags are not handled. Add a *) case - https://github.com/koalaman/shellcheck/wiki/SC2220
|
||||
# SC2230 - which is non-standard. Use builtin 'command -v' instead - https://github.com/koalaman/shellcheck/wiki/SC2230
|
||||
|
||||
Reference in New Issue
Block a user