forked from 0k/0k-charms
Valentin Lab
2 months ago
17 changed files with 212 additions and 32 deletions
-
7cyclos/hooks/postgres_database-relation-joined
-
6docuseal/hooks/postgres_database-relation-joined
-
9etherpad/hooks/postgres_database-relation-joined
-
11gitea/hooks/postgres_database-relation-joined
-
6hedgedoc/hooks/postgres_database-relation-joined
-
4keycloak/hooks/postgres_database-relation-joined
-
9mattermost/hooks/postgres_database-relation-joined
-
9odoo-tecnativa/hooks/postgres_database-relation-joined
-
8onlyoffice/hooks/postgres_database-relation-joined
-
11peertube/hooks/postgres_database-relation-joined
-
46postgres-stub/README.org
-
62postgres-stub/hooks/postgres_database-relation-joined
-
29postgres-stub/lib/common
-
7postgres-stub/metadata.yml
-
4postgres/hooks/postgres_database-relation-joined
-
6rallly/hooks/postgres_database-relation-joined
-
10synapse/hooks/postgres_database-relation-joined
@ -0,0 +1,46 @@ |
|||||
|
# -*- ispell-local-dictionary: "english" -*- |
||||
|
|
||||
|
* Description |
||||
|
|
||||
|
=postgres-stub= allows you to declare an external =postgres= so that |
||||
|
your local services can connect to it. It assumes you have the host, |
||||
|
port of the external postgres access, and a login, password, and a |
||||
|
database (already created) to connect to. |
||||
|
|
||||
|
For now, this stub can't manage an admin access to create database, and |
||||
|
more. This would be an easy addition thou. |
||||
|
|
||||
|
This can be useful for instance if you have an external provider giving |
||||
|
you access to their postgres (use SSL then!), or in your private cloud, |
||||
|
or on the same host but not managed by docker, either directly on the host |
||||
|
or by other virtual services (LXC, VMWare...). |
||||
|
|
||||
|
* Usage |
||||
|
|
||||
|
You can declare a stub service by specifying at least the host of your |
||||
|
external =postgres= database. |
||||
|
|
||||
|
#+begin_src yaml |
||||
|
my-postgres-stub: |
||||
|
charm: postgres-stub |
||||
|
options: |
||||
|
host: my-host.mydomain.fr:20432 |
||||
|
#+end_src |
||||
|
|
||||
|
If you don't specify a port, then it'll be defaulted to ~5432~ |
||||
|
|
||||
|
Any service that want to connect to this database could then: |
||||
|
|
||||
|
#+begin_src yaml |
||||
|
myservice: |
||||
|
# ... |
||||
|
relations: |
||||
|
postgres-database: |
||||
|
postgres-stub: |
||||
|
my-postgres-stub: |
||||
|
dbname: my-db-name |
||||
|
user: my-username |
||||
|
password: my-p4s5w0rd |
||||
|
#+end_src |
||||
|
|
||||
|
|
@ -0,0 +1,62 @@ |
|||||
|
#!/bin/bash |
||||
|
|
||||
|
## When writing relation script, remember: |
||||
|
## - they should be idempotents |
||||
|
## - they can be launched while the dockers is already up |
||||
|
## - they are launched from the host |
||||
|
## - the target of the link is launched first, and get a chance to ``relation-set`` |
||||
|
## - both side of the scripts get to use ``relation-get``. |
||||
|
|
||||
|
|
||||
|
DBNAME=$(relation-get dbname) || { |
||||
|
DBNAME="$BASE_SERVICE_NAME" |
||||
|
relation-set dbname "$DBNAME" |
||||
|
} |
||||
|
|
||||
|
USER=$(relation-get user) || { |
||||
|
USER="$BASE_SERVICE_NAME" |
||||
|
relation-set user "$USER" |
||||
|
} |
||||
|
|
||||
|
HOST=$(options-get host) || true |
||||
|
if [ -z "$HOST" ]; then |
||||
|
err "No host specified. Please specify ${WHITE}host${NORMAL}" \ |
||||
|
"in ${DARKYELLOW}$SERVICE_NAME${NORMAL}'s option." |
||||
|
exit 1 |
||||
|
fi |
||||
|
|
||||
|
if [[ "$HOST" =~ :[0-9]+$ ]]; then |
||||
|
PORT="${HOST##*:}" |
||||
|
HOST="${HOST%:*}" |
||||
|
fi |
||||
|
if ! [[ "$HOST" =~ ^[0-9a-zA-Z.-]+$ ]]; then |
||||
|
err "Invalid host specified: '$HOST'. Please provide a valid" \ |
||||
|
"network target as ${WHITE}host${NORMAL} value" \ |
||||
|
"in ${DARKYELLOW}$SERVICE_NAME${NORMAL}'s option." |
||||
|
exit 1 |
||||
|
fi |
||||
|
|
||||
|
PORT=${PORT:-5432} |
||||
|
|
||||
|
relation-set host "$HOST" |
||||
|
relation-set port "$PORT" |
||||
|
|
||||
|
. lib/common |
||||
|
|
||||
|
set -e |
||||
|
|
||||
|
if ! PASSWORD="$(relation-get password 2>/dev/null)"; then |
||||
|
err "Please provide a password" |
||||
|
exit 1 |
||||
|
fi |
||||
|
|
||||
|
echo "SELECT 1;" | ddb "$DBNAME" || { |
||||
|
err "Connection failed to $DBNAME on $HOST:$PORT with user $USER and given password" |
||||
|
exit 1 |
||||
|
} |
||||
|
|
||||
|
array_read-0 extensions < <(relation-get extensions 2>/dev/null | shyaml get-values-0) |
||||
|
|
||||
|
if [ "${#extensions[@]}" -gt 0 ]; then |
||||
|
db_install_extensions "$DBNAME" "${extensions[@]}" || exit 1 |
||||
|
fi |
@ -0,0 +1,29 @@ |
|||||
|
# -*- mode: shell-script -*- |
||||
|
|
||||
|
POSTGRES_IMAGE=docker.0k.io/postgres:12.15.0-myc |
||||
|
|
||||
|
|
||||
|
ddb () { |
||||
|
docker run --rm -i \ |
||||
|
-e PGPASSWORD="$PASSWORD" \ |
||||
|
-e PGHOST="$HOST" \ |
||||
|
-e PGUSER="$USER" \ |
||||
|
-e PGPORT="$PORT" \ |
||||
|
--entrypoint psql \ |
||||
|
"${POSTGRES_IMAGE}" \ |
||||
|
-qAt "$@" |
||||
|
} |
||||
|
|
||||
|
|
||||
|
## |
||||
|
## Entrypoints |
||||
|
## |
||||
|
|
||||
|
db_install_extensions() { |
||||
|
local dbname="$1" |
||||
|
shift |
||||
|
for ext in "$@"; do |
||||
|
ddb -d "$dbname" < <(echo "CREATE EXTENSION IF NOT EXISTS $ext;") || return 1 |
||||
|
info "Installed $ext extension on database '$dbname'." |
||||
|
done |
||||
|
} |
@ -0,0 +1,7 @@ |
|||||
|
type: stub |
||||
|
|
||||
|
provides: |
||||
|
postgres-database: |
||||
|
|
||||
|
default-options: |
||||
|
host: ## Can contain a port specification (if not, port is 5432) |
Write
Preview
Loading…
Cancel
Save
Reference in new issue