# Services several peers share: one Postgres and one MySQL (each peer gets its own database), and one Redis (each its own # db number). shared_postgres_up() { podman container exists pasture-postgres && return 0 podman run -d --replace --name pasture-postgres --network $net --network-alias postgres \ -e POSTGRES_USER=pasture -e POSTGRES_PASSWORD=pasture -e POSTGRES_DB=pasture docker.io/library/postgres:17-alpine >/dev/null for _ in $(seq 1 60); do podman exec pasture-postgres pg_isready -U pasture >/dev/null 2>&1 && return 0; sleep 1; done echo "postgres did not start" >&2; return 1 } shared_redis_up() { podman container exists pasture-redis && return 0 podman run -d --replace --name pasture-redis --network $net --network-alias redis docker.io/library/redis:7-alpine >/dev/null } # pg_db [extension...]: a database of the shared Postgres for one peer, with the extensions it needs pg_db() { local name=$1; shift podman exec pasture-postgres sh -c "psql -U pasture -tc \"select 1 from pg_database where datname='$name'\" | grep -q 1 || createdb -U pasture $name" for ext in "$@"; do podman exec pasture-postgres psql -U pasture -d "$name" -qc "create extension if not exists \"$ext\";" >/dev/null done } shared_mysql_up() { podman container exists pasture-mysql && return 0 podman run -d --replace --name pasture-mysql --network $net --network-alias mysql \ -e MYSQL_ROOT_PASSWORD=pasture -e MYSQL_USER=pasture -e MYSQL_PASSWORD=pasture docker.io/library/mysql:8.4 >/dev/null # its first start runs a temporary server without networking to set itself up: only TCP answers when it is ready for _ in $(seq 1 90); do podman exec pasture-mysql mysqladmin ping -h127.0.0.1 --protocol=tcp -uroot -ppasture --silent >/dev/null 2>&1 && return 0; sleep 2; done echo "mysql did not start" >&2; return 1 } # mysql_db : a database of the shared MySQL for one peer, the pasture user owning it mysql_db() { podman exec pasture-mysql mysql -uroot -ppasture -e \ "create database if not exists \`$1\` character set utf8mb4 collate utf8mb4_unicode_ci; grant all on \`$1\`.* to 'pasture'@'%';" 2>/dev/null }