feat(infra): banco DEV isolado (pg-dev) + bump scoreodonto.com/subdominio
- pg-dev/: container PostGIS único multi-DB (ref+dev por template) p/ desgrudar dev da produção; scripts refresh/reset + manifesto (secrets fora do git) - bump scoreodonto.com e subdominio.clube67.com (backends dev apontam p/ pgdev via .env) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,3 @@
|
|||||||
|
secrets.env
|
||||||
|
.env
|
||||||
|
*.dump
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
# Banco DEV isolado da VPS4 (rootless) — ver scoreodonto.com/documentação/BANCO-DEV-ESTRATEGIA.md
|
||||||
|
# Subir: set -a; source secrets.env; set +a; docker compose up -d
|
||||||
|
services:
|
||||||
|
pgdev:
|
||||||
|
image: postgis/postgis:18-3.6
|
||||||
|
container_name: pgdev
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
POSTGRES_USER: devadmin
|
||||||
|
POSTGRES_PASSWORD: ${PGDEV_PASSWORD:?defina PGDEV_PASSWORD (source secrets.env)}
|
||||||
|
POSTGRES_DB: postgres
|
||||||
|
volumes:
|
||||||
|
- pgdev-data:/var/lib/postgresql # PG18+: montar a raiz, não /data
|
||||||
|
networks:
|
||||||
|
- soc # mesma rede dos backends de dev → acesso por DNS "pgdev"
|
||||||
|
# SEM "ports:" → não exposto ao host/internet (só acessível via rede soc)
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
pgdev-data:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
soc:
|
||||||
|
external: true
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
# Manifesto de projetos DEV — adicione 1 linha por projeto novo.
|
||||||
|
# formato: nome_projeto : banco_origem_na_VPS3 : usuario_origem
|
||||||
|
# (a senha de origem vai em secrets.env como SRC_<nome_projeto>_PASS)
|
||||||
|
scoreodonto : scoreodonto : scoreodonto_user
|
||||||
|
rx : dental_images : clube67
|
||||||
|
subdominio : subdominio : mercado_admin
|
||||||
Executable
+38
@@ -0,0 +1,38 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Atualiza o banco-referência <projeto>_ref a partir da PRODUÇÃO (VPS3, somente leitura)
|
||||||
|
# e recria <projeto>_dev a partir dele. Uso: ./pg-dev-refresh.sh <projeto>
|
||||||
|
set -euo pipefail
|
||||||
|
PROJ="${1:?uso: ./pg-dev-refresh.sh <projeto> (ex.: scoreodonto)}"
|
||||||
|
cd "$(dirname "$0")"
|
||||||
|
set -a; source ./secrets.env; set +a
|
||||||
|
export XDG_RUNTIME_DIR=/run/user/1000 DOCKER_HOST=unix:///run/user/1000/docker.sock
|
||||||
|
VPS3=10.99.0.3; PGIMG=postgres:18
|
||||||
|
|
||||||
|
line=$(grep -E "^[[:space:]]*${PROJ}[[:space:]]*:" pg-dev-projects.conf | head -1 || true)
|
||||||
|
[ -z "$line" ] && { echo "ERRO: '$PROJ' não está em pg-dev-projects.conf"; exit 1; }
|
||||||
|
SRC_DB=$(echo "$line" | awk -F: '{gsub(/[[:space:]]/,"",$2);print $2}')
|
||||||
|
SRC_USER=$(echo "$line"| awk -F: '{gsub(/[[:space:]]/,"",$3);print $3}')
|
||||||
|
pvar="SRC_${PROJ}_PASS"; SRC_PASS="${!pvar:?sem senha SRC_${PROJ}_PASS em secrets.env}"
|
||||||
|
REF="${PROJ}_ref"; DEV="${PROJ}_dev"; W=$(mktemp -d)
|
||||||
|
trap 'rm -rf "$W"' EXIT
|
||||||
|
|
||||||
|
PSQL(){ docker run --rm --network soc -e PGPASSWORD="$PGDEV_PASSWORD" "$PGIMG" \
|
||||||
|
psql -h pgdev -U devadmin -d postgres -v ON_ERROR_STOP=1 "$@"; }
|
||||||
|
|
||||||
|
echo "[1/4] pg_dump de '$SRC_DB' (VPS3 $VPS3, somente leitura)..."
|
||||||
|
docker run --rm -e PGPASSWORD="$SRC_PASS" -v "$W":/w "$PGIMG" \
|
||||||
|
pg_dump -h "$VPS3" -U "$SRC_USER" -d "$SRC_DB" -Fc -f /w/dump
|
||||||
|
|
||||||
|
echo "[2/4] recriando $REF..."
|
||||||
|
PSQL -c "DROP DATABASE IF EXISTS $DEV WITH (FORCE);"
|
||||||
|
PSQL -c "DROP DATABASE IF EXISTS $REF WITH (FORCE);"
|
||||||
|
PSQL -c "CREATE DATABASE $REF;"
|
||||||
|
|
||||||
|
echo "[3/4] restaurando dump em $REF (avisos de owner/postgis são normais)..."
|
||||||
|
docker run --rm --network soc -e PGPASSWORD="$PGDEV_PASSWORD" -v "$W":/w "$PGIMG" \
|
||||||
|
pg_restore -h pgdev -U devadmin -d "$REF" --no-owner --no-privileges /w/dump || true
|
||||||
|
|
||||||
|
echo "[4/4] criando $DEV a partir do template $REF..."
|
||||||
|
PSQL -c "CREATE DATABASE $DEV TEMPLATE $REF;"
|
||||||
|
|
||||||
|
echo "OK: $DEV pronto (origem: $SRC_DB @ VPS3)."
|
||||||
Executable
+16
@@ -0,0 +1,16 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Reset rápido (segundos): recria <projeto>_dev a partir do <projeto>_ref já existente,
|
||||||
|
# SEM ir à VPS3. Uso: ./pg-dev-reset.sh <projeto>
|
||||||
|
set -euo pipefail
|
||||||
|
PROJ="${1:?uso: ./pg-dev-reset.sh <projeto>}"
|
||||||
|
cd "$(dirname "$0")"
|
||||||
|
set -a; source ./secrets.env; set +a
|
||||||
|
export XDG_RUNTIME_DIR=/run/user/1000 DOCKER_HOST=unix:///run/user/1000/docker.sock
|
||||||
|
REF="${PROJ}_ref"; DEV="${PROJ}_dev"
|
||||||
|
PSQL(){ docker run --rm --network soc -e PGPASSWORD="$PGDEV_PASSWORD" postgres:18 \
|
||||||
|
psql -h pgdev -U devadmin -d postgres -v ON_ERROR_STOP=1 "$@"; }
|
||||||
|
PSQL -tAc "SELECT 1 FROM pg_database WHERE datname='$REF';" | grep -q 1 \
|
||||||
|
|| { echo "ERRO: $REF não existe — rode ./pg-dev-refresh.sh $PROJ primeiro"; exit 1; }
|
||||||
|
PSQL -c "DROP DATABASE IF EXISTS $DEV WITH (FORCE);"
|
||||||
|
PSQL -c "CREATE DATABASE $DEV TEMPLATE $REF;"
|
||||||
|
echo "OK: $DEV resetado a partir de $REF."
|
||||||
+1
-1
Submodule scoreodonto.com updated: efa9553536...deaddfbf68
+1
-1
Submodule subdominio.clube67.com updated: 8a35da646a...4c431f742b
Reference in New Issue
Block a user