From 378f0e08309168e33390d63839274ac8ea909f0b Mon Sep 17 00:00:00 2001 From: Josue Modesto Date: Wed, 17 Jun 2026 11:52:21 -0300 Subject: [PATCH 1/3] =?UTF-8?q?Implementa=C3=A7=C3=A3o=20parcial=20do=20ba?= =?UTF-8?q?ckup=20no=20Drive?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/database-backup/.env.example | 17 ++++ script/database-backup/.gitignore | 1 + script/database-backup/Dockerfile | 35 +++++++++ script/database-backup/README.md | 77 +++++++++++++++++++ script/database-backup/backup.sh | 61 +++++++++++++++ .../database-backup/captain-definition.json | 4 + script/database-backup/docker-compose.yml | 21 +++++ script/database-backup/entrypoint.sh | 26 +++++++ 8 files changed, 242 insertions(+) create mode 100644 script/database-backup/.env.example create mode 100644 script/database-backup/.gitignore create mode 100644 script/database-backup/Dockerfile create mode 100644 script/database-backup/README.md create mode 100644 script/database-backup/backup.sh create mode 100644 script/database-backup/captain-definition.json create mode 100644 script/database-backup/docker-compose.yml create mode 100644 script/database-backup/entrypoint.sh diff --git a/script/database-backup/.env.example b/script/database-backup/.env.example new file mode 100644 index 00000000..315e07e6 --- /dev/null +++ b/script/database-backup/.env.example @@ -0,0 +1,17 @@ + +PG_HOST=10.0.10.80 +PG_PORT=5432 +PG_USERNAME=postgres +PG_PASSWORD=masterkey +PG_DATABASE=herbario_prod + +# Google Drive (Dados reais que você gerou) +GDRIVE_TOKEN={"access_token":"SEU_ACCESS_TOKEN_AQUI","token_type":"Bearer","refresh_token":"SEU_REFRESH_TOKEN_AQUI","expiry":"2026-01-01T00:00:00Z"} +# ID extraído da URL da pasta do Google Drive destino +GDRIVE_FOLDER_ID=COLE_O_ID_DA_PASTA_DO_DRIVE_AQUI + +# Configurações do serviço +RETENTION_DAILY=5 +RETENTION_WEEKLY=4 +CRON_SCHEDULE="0 2 * * *" +TZ=America/Sao_Paulo \ No newline at end of file diff --git a/script/database-backup/.gitignore b/script/database-backup/.gitignore new file mode 100644 index 00000000..2eea525d --- /dev/null +++ b/script/database-backup/.gitignore @@ -0,0 +1 @@ +.env \ No newline at end of file diff --git a/script/database-backup/Dockerfile b/script/database-backup/Dockerfile new file mode 100644 index 00000000..7a08db25 --- /dev/null +++ b/script/database-backup/Dockerfile @@ -0,0 +1,35 @@ +FROM debian:12-slim + +RUN \ + apt-get update && \ + apt-get install -y \ + cron \ + tzdata \ + gnupg \ + curl \ + ca-certificates \ + rclone \ + gzip && \ + curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor -o /usr/share/keyrings/postgresql.gpg && \ + echo "deb [signed-by=/usr/share/keyrings/postgresql.gpg] https://apt.postgresql.org/pub/repos/apt bookworm-pgdg main" > /etc/apt/sources.list.d/pgdg.list && \ + apt-get update && \ + apt-get install -y \ + postgresql-client-18 && \ + apt-get remove -y \ + curl \ + ca-certificates \ + gnupg && \ + rm -rf /var/lib/apt/lists/* + +ENV TZ=America/Sao_Paulo +ENV CRON_SCHEDULE="0 2 * * *" + +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +COPY backup.sh entrypoint.sh / + +RUN chmod +x /backup.sh /entrypoint.sh + +ENTRYPOINT ["/entrypoint.sh"] + +CMD ["cron", "-f"] diff --git a/script/database-backup/README.md b/script/database-backup/README.md new file mode 100644 index 00000000..2153b1cd --- /dev/null +++ b/script/database-backup/README.md @@ -0,0 +1,77 @@ +# database-backup + +Serviço de backup automatizado do PostgreSQL para o Google Drive. + +--- + +## Restore de backup do PostgreSQL + +### Formato do arquivo de backup + +Os arquivos gerados pelo serviço seguem o padrão: + +``` +{DATABASE_NAME}_{unix_timestamp}.sql.gz +``` + +Exemplo: `herbario_prod_1748469600.sql.gz` + +O conteúdo é um dump plain SQL (`pg_dump -Fp`) comprimido com `gzip`. +Para restaurar, o comando é `psql` (não `pg_restore`). + +--- + +### Pré-requisitos + +- `psql` instalado na máquina de destino (`postgresql-client`) +- Banco de destino já criado no PostgreSQL alvo +- **Nunca restaurar diretamente sobre o banco de produção sem validação prévia** + +--- + +### Comando de restore + +```bash +gunzip -c herbario_prod_1748469600.sql.gz | \ + PGPASSWORD="SENHA" psql \ + -h 10.0.10.80 \ + -p 5432 \ + -U postgres \ + -d herbario_restore +``` + +| Parâmetro | Descrição | +|---------------|------------------------------------------------| +| `-h` | Host do PostgreSQL | +| `-p` | Porta do PostgreSQL | +| `-U` | Usuário do banco | +| `-d` | Banco de destino (deve existir previamente) | +| `PGPASSWORD` | Senha do usuário (evita prompt interativo) | + +--- + +### Fluxo recomendado para validação + +1. Baixar o arquivo `.sql.gz` da pasta do Google Drive. +2. Criar um banco temporário para o restore: + ```bash + PGPASSWORD="SENHA" psql -h 10.0.10.80 -U postgres -c "CREATE DATABASE herbario_restore;" + ``` +3. Restaurar o backup no banco temporário. +4. Validar a integridade: + ```bash + PGPASSWORD="SENHA" psql -h 10.0.10.80 -U postgres -d herbario_restore -c "\dt" + ``` +5. Confirmar contagem de registros em tabelas críticas. +6. Remover o banco temporário após validação: + ```bash + PGPASSWORD="SENHA" psql -h 10.0.10.80 -U postgres -c "DROP DATABASE herbario_restore;" + ``` + +--- + +### Observações de segurança + +- O `access_token` no `.env` expira em ~1 hora; o `refresh_token` é o que mantém o serviço funcionando a longo prazo. +- Nunca commite o arquivo `.env` com tokens reais (já está no `.gitignore`). +- Em caso de comprometimento do token, revogue-o em [Google Account Security](https://myaccount.google.com/permissions) e gere um novo via `rclone config reconnect gdrive:`. diff --git a/script/database-backup/backup.sh b/script/database-backup/backup.sh new file mode 100644 index 00000000..8ec7405a --- /dev/null +++ b/script/database-backup/backup.sh @@ -0,0 +1,61 @@ +#!/bin/bash + +set -euo pipefail + +TIMESTAMP=$(date +%s) +FILE_NAME="${POSTGRES_DATABASE}_${TIMESTAMP}.sql.gz" +TMP_FILE="/tmp/${FILE_NAME}" + +echo "Iniciando processo de backup: ${FILE_NAME}" + +echo "Dumping e comprimindo database..." +PGPASSWORD="${POSTGRES_PASSWORD}" pg_dump \ + -h "${POSTGRES_HOST}" \ + -p "${POSTGRES_PORT}" \ + -U "${POSTGRES_USER}" \ + -d "${POSTGRES_DATABASE}" \ + -Fp | gzip > "${TMP_FILE}" + +echo "Enviando para o Google Drive..." +rclone copy "${TMP_FILE}" gdrive: + +echo "Limpando arquivo local..." +rm -f "${TMP_FILE}" + +echo "Aplicando política de retenção..." +# Lista e ordena do mais novo para o mais antigo +FILES=$(rclone lsf gdrive: | grep '\.sql\.gz$' | sort -t_ -k3 -rn) + +DAILY_KEPT=0 +WEEKLY_KEPT=0 +WEEKLY_SEEN_WEEKS="" +MAX_DAILY=${RETENTION_DAILY:-5} +MAX_WEEKLY=${RETENTION_WEEKLY:-4} + +for FILE in $FILES; do + FILE_TS=$(echo "$FILE" | grep -oP '\d{10,}') + + if [ -z "$FILE_TS" ]; then continue; fi + + ISO_WEEK=$(date -d "@$FILE_TS" +%G-W%V) + + if [ "$DAILY_KEPT" -lt "$MAX_DAILY" ]; then + echo " -> [DIÁRIO] Mantendo backup recente: $FILE (Semana: $ISO_WEEK)" + DAILY_KEPT=$((DAILY_KEPT + 1)) + + else + # Se a semana deste arquivo restante ainda não foi guardada nesta fase + # e ainda temos vagas para backups semanais, nós o mantemos + if [[ ! "$WEEKLY_SEEN_WEEKS" =~ " $ISO_WEEK " ]] && [ "$WEEKLY_KEPT" -lt "$MAX_WEEKLY" ]; then + echo " -> [SEMANAL] Mantendo primeiro da semana: $FILE (Semana: $ISO_WEEK)" + WEEKLY_KEPT=$((WEEKLY_KEPT + 1)) + WEEKLY_SEEN_WEEKS="$WEEKLY_SEEN_WEEKS $ISO_WEEK " + else + # Não passou em nenhum critério das sobras: exclusão segura + echo " -> Deletando backup antigo: $FILE" + rclone deletefile gdrive:"$FILE" + fi + fi +done + +echo "Processo de backup concluído com sucesso: ${FILE_NAME}" \ No newline at end of file diff --git a/script/database-backup/captain-definition.json b/script/database-backup/captain-definition.json new file mode 100644 index 00000000..0e14f823 --- /dev/null +++ b/script/database-backup/captain-definition.json @@ -0,0 +1,4 @@ +{ + "schemaVersion": 2, + "dockerfilePath": "./Dockerfile" +} diff --git a/script/database-backup/docker-compose.yml b/script/database-backup/docker-compose.yml new file mode 100644 index 00000000..700b5e01 --- /dev/null +++ b/script/database-backup/docker-compose.yml @@ -0,0 +1,21 @@ +services: + database-backup: + image: database-backup:local + container_name: database-backup + build: . + environment: + #PostgreSQL + POSTGRES_HOST: ${PG_HOST} + POSTGRES_PORT: "${PG_PORT}" + POSTGRES_USER: "${PG_USERNAME}" + POSTGRES_PASSWORD: "${PG_PASSWORD}" + POSTGRES_DATABASE: "${PG_DATABASE}" + #Google Drive + GDRIVE_TOKEN: "${GDRIVE_TOKEN}" + GDRIVE_FOLDER_ID: "${GDRIVE_FOLDER_ID}" + + RETENTION_DAILY: "${RETENTION_DAILY}" + RETENTION_WEEKLY: "${RETENTION_WEEKLY}" + + CRON_SCHEDULE: "${CRON_SCHEDULE}" + TZ: "${TZ}" diff --git a/script/database-backup/entrypoint.sh b/script/database-backup/entrypoint.sh new file mode 100644 index 00000000..2c6a112d --- /dev/null +++ b/script/database-backup/entrypoint.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +echo "Configurando rclone..." +mkdir -p /root/.config/rclone +cat < /root/.config/rclone/rclone.conf +[gdrive] +type = drive +scope = drive.file +token = ${GDRIVE_TOKEN} +root_folder_id = ${GDRIVE_FOLDER_ID} +EOF + +echo "Configuring cron job with schedule: $CRON_SCHEDULE ($TZ)" + +printenv | grep -E "^(POSTGRES_|GDRIVE_|RETENTION_)" >> /etc/environment + +echo "$CRON_SCHEDULE /backup.sh 1> /proc/1/fd/1 2> /proc/1/fd/2" | crontab - + +if ! crontab -l >/dev/null 2>&1; then + echo "Failed to configure cron job" + exit 1 +fi + +crontab -l + +exec "$@" \ No newline at end of file From 62910eb1a73472230c05b8b9e2b9a173ee66265c Mon Sep 17 00:00:00 2001 From: Josue Modesto Date: Wed, 17 Jun 2026 12:01:40 -0300 Subject: [PATCH 2/3] README atualizado --- script/database-backup/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/script/database-backup/README.md b/script/database-backup/README.md index 2153b1cd..f81e49ce 100644 --- a/script/database-backup/README.md +++ b/script/database-backup/README.md @@ -46,7 +46,7 @@ gunzip -c herbario_prod_1748469600.sql.gz | \ | `-p` | Porta do PostgreSQL | | `-U` | Usuário do banco | | `-d` | Banco de destino (deve existir previamente) | -| `PGPASSWORD` | Senha do usuário (evita prompt interativo) | +| `PGPASSWORD` | Senha do usuário | --- @@ -73,5 +73,4 @@ gunzip -c herbario_prod_1748469600.sql.gz | \ ### Observações de segurança - O `access_token` no `.env` expira em ~1 hora; o `refresh_token` é o que mantém o serviço funcionando a longo prazo. -- Nunca commite o arquivo `.env` com tokens reais (já está no `.gitignore`). - Em caso de comprometimento do token, revogue-o em [Google Account Security](https://myaccount.google.com/permissions) e gere um novo via `rclone config reconnect gdrive:`. From c0fa2811c2164a4f017bb7a9c09cc6fadf87e00e Mon Sep 17 00:00:00 2001 From: Josue Modesto Date: Wed, 17 Jun 2026 14:06:15 -0300 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20Implementa=C3=A7=C3=A3o=20do=20scri?= =?UTF-8?q?pt=20de=20backup=20para=20o=20Google=20Drive?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/database-backup/.env.example | 13 ++- script/database-backup/Dockerfile | 5 +- script/database-backup/README.md | 112 ++++++++++++---------- script/database-backup/backup.sh | 62 ++++++++---- script/database-backup/docker-compose.yml | 23 ++--- script/database-backup/entrypoint.sh | 4 +- 6 files changed, 129 insertions(+), 90 deletions(-) diff --git a/script/database-backup/.env.example b/script/database-backup/.env.example index 315e07e6..72b61682 100644 --- a/script/database-backup/.env.example +++ b/script/database-backup/.env.example @@ -1,9 +1,8 @@ - -PG_HOST=10.0.10.80 -PG_PORT=5432 -PG_USERNAME=postgres -PG_PASSWORD=masterkey -PG_DATABASE=herbario_prod +DATABASE_HOST=10.0.10.80 +DATABASE_PORT=5432 +DATABASE_USER=postgres +DATABASE_PASSWORD=masterkey +DATABASE_NAME=herbario_prod # Google Drive (Dados reais que você gerou) GDRIVE_TOKEN={"access_token":"SEU_ACCESS_TOKEN_AQUI","token_type":"Bearer","refresh_token":"SEU_REFRESH_TOKEN_AQUI","expiry":"2026-01-01T00:00:00Z"} @@ -14,4 +13,4 @@ GDRIVE_FOLDER_ID=COLE_O_ID_DA_PASTA_DO_DRIVE_AQUI RETENTION_DAILY=5 RETENTION_WEEKLY=4 CRON_SCHEDULE="0 2 * * *" -TZ=America/Sao_Paulo \ No newline at end of file +TZ=America/Sao_Paulo diff --git a/script/database-backup/Dockerfile b/script/database-backup/Dockerfile index 7a08db25..d36c3d9e 100644 --- a/script/database-backup/Dockerfile +++ b/script/database-backup/Dockerfile @@ -28,8 +28,9 @@ RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone COPY backup.sh entrypoint.sh / -RUN chmod +x /backup.sh /entrypoint.sh +RUN sed -i 's/\r$//' /backup.sh /entrypoint.sh && \ + chmod +x /backup.sh /entrypoint.sh -ENTRYPOINT ["/entrypoint.sh"] +ENTRYPOINT ["/bin/sh", "/entrypoint.sh"] CMD ["cron", "-f"] diff --git a/script/database-backup/README.md b/script/database-backup/README.md index f81e49ce..6794a989 100644 --- a/script/database-backup/README.md +++ b/script/database-backup/README.md @@ -1,35 +1,71 @@ # database-backup -Serviço de backup automatizado do PostgreSQL para o Google Drive. +Serviço standalone de backup automático do PostgreSQL para o Google Drive. ---- +Arquitetura: -## Restore de backup do PostgreSQL +- Container Debian slim com `postgresql-client-18`, `rclone`, `cron` e `gzip` +- Deploy como app separado no CapRover +- Container stateless (arquivo temporário em `/tmp`) -### Formato do arquivo de backup +Fluxo: -Os arquivos gerados pelo serviço seguem o padrão: +`cron -> backup.sh -> pg_dump -Fp -> gzip -> rclone copy -> retenção` -``` +## Formato do backup + +Arquivos seguem o padrão: + +```text {DATABASE_NAME}_{unix_timestamp}.sql.gz ``` Exemplo: `herbario_prod_1748469600.sql.gz` -O conteúdo é um dump plain SQL (`pg_dump -Fp`) comprimido com `gzip`. -Para restaurar, o comando é `psql` (não `pg_restore`). +## Variáveis de ambiente + +Veja `.env.example` para o contrato completo. + +- `DATABASE_HOST` +- `DATABASE_PORT` +- `DATABASE_USER` +- `DATABASE_PASSWORD` +- `DATABASE_NAME` +- `GDRIVE_TOKEN` +- `GDRIVE_FOLDER_ID` +- `RETENTION_DAILY` (default: `5`) +- `RETENTION_WEEKLY` (default: `4`) +- `CRON_SCHEDULE` (ex.: `0 2 * * *`) +- `TZ` (ex.: `America/Sao_Paulo`) + +## Política de retenção + +Após upload bem-sucedido: + +- mantém os `RETENTION_DAILY` backups mais recentes +- entre os restantes, mantém até `RETENTION_WEEKLY` semanas ISO distintas +- exclui o restante com `rclone deletefile` + +Com valores padrão: máximo de 9 arquivos. ---- +## Teste local -### Pré-requisitos +No diretório `script/database-backup`: -- `psql` instalado na máquina de destino (`postgresql-client`) -- Banco de destino já criado no PostgreSQL alvo -- **Nunca restaurar diretamente sobre o banco de produção sem validação prévia** +```bash +docker compose build +docker compose run --rm database-backup /backup.sh +``` + +Para validar remoto configurado no container: ---- +```bash +docker compose run --rm database-backup rclone lsf gdrive: +``` -### Comando de restore +## Restore de backup + +O dump é SQL plain comprimido (`.sql.gz`), então restore é via `psql`: ```bash gunzip -c herbario_prod_1748469600.sql.gz | \ @@ -40,37 +76,15 @@ gunzip -c herbario_prod_1748469600.sql.gz | \ -d herbario_restore ``` -| Parâmetro | Descrição | -|---------------|------------------------------------------------| -| `-h` | Host do PostgreSQL | -| `-p` | Porta do PostgreSQL | -| `-U` | Usuário do banco | -| `-d` | Banco de destino (deve existir previamente) | -| `PGPASSWORD` | Senha do usuário | - ---- - -### Fluxo recomendado para validação - -1. Baixar o arquivo `.sql.gz` da pasta do Google Drive. -2. Criar um banco temporário para o restore: - ```bash - PGPASSWORD="SENHA" psql -h 10.0.10.80 -U postgres -c "CREATE DATABASE herbario_restore;" - ``` -3. Restaurar o backup no banco temporário. -4. Validar a integridade: - ```bash - PGPASSWORD="SENHA" psql -h 10.0.10.80 -U postgres -d herbario_restore -c "\dt" - ``` -5. Confirmar contagem de registros em tabelas críticas. -6. Remover o banco temporário após validação: - ```bash - PGPASSWORD="SENHA" psql -h 10.0.10.80 -U postgres -c "DROP DATABASE herbario_restore;" - ``` - ---- - -### Observações de segurança - -- O `access_token` no `.env` expira em ~1 hora; o `refresh_token` é o que mantém o serviço funcionando a longo prazo. -- Em caso de comprometimento do token, revogue-o em [Google Account Security](https://myaccount.google.com/permissions) e gere um novo via `rclone config reconnect gdrive:`. +Fluxo recomendado: + +1. Baixar `.sql.gz` do Google Drive. +2. Criar banco temporário de restore. +3. Restaurar no banco temporário. +4. Validar integridade e tabelas. +5. Remover banco temporário. + +## Segurança + +- O `access_token` expira; o `refresh_token` mantém o acesso de longo prazo. +- Se houver exposição do token, revogue no Google e gere um novo. diff --git a/script/database-backup/backup.sh b/script/database-backup/backup.sh index 8ec7405a..7d87ec01 100644 --- a/script/database-backup/backup.sh +++ b/script/database-backup/backup.sh @@ -3,17 +3,17 @@ set -euo pipefail TIMESTAMP=$(date +%s) -FILE_NAME="${POSTGRES_DATABASE}_${TIMESTAMP}.sql.gz" +FILE_NAME="${DATABASE_NAME}_${TIMESTAMP}.sql.gz" TMP_FILE="/tmp/${FILE_NAME}" echo "Iniciando processo de backup: ${FILE_NAME}" echo "Dumping e comprimindo database..." -PGPASSWORD="${POSTGRES_PASSWORD}" pg_dump \ - -h "${POSTGRES_HOST}" \ - -p "${POSTGRES_PORT}" \ - -U "${POSTGRES_USER}" \ - -d "${POSTGRES_DATABASE}" \ +PGPASSWORD="${DATABASE_PASSWORD}" pg_dump \ + -h "${DATABASE_HOST}" \ + -p "${DATABASE_PORT}" \ + -U "${DATABASE_USER}" \ + -d "${DATABASE_NAME}" \ -Fp | gzip > "${TMP_FILE}" echo "Enviando para o Google Drive..." @@ -23,8 +23,32 @@ echo "Limpando arquivo local..." rm -f "${TMP_FILE}" echo "Aplicando política de retenção..." -# Lista e ordena do mais novo para o mais antigo -FILES=$(rclone lsf gdrive: | grep '\.sql\.gz$' | sort -t_ -k3 -rn) +FILES=() +INDEX_FILE=$(mktemp) + +while IFS= read -r file; do + file="${file%$'\r'}" + + ts="${file##*_}" + ts="${ts%.sql.gz}" + ts="${ts%$'\r'}" + + if [[ "$ts" =~ ^[0-9]{10,}$ ]]; then + printf '%s\t%s\n' "$ts" "$file" >> "$INDEX_FILE" + fi +done < <(rclone lsf gdrive: --files-only) + +if [ -s "$INDEX_FILE" ]; then + mapfile -t FILES < <(sort -rn "$INDEX_FILE" | cut -f2-) +fi + +echo " -> Arquivos elegiveis para retenção: ${#FILES[@]}" + +rm -f "$INDEX_FILE" + +if [ "${#FILES[@]}" -eq 0 ]; then + echo " -> Nenhum arquivo elegivel para retenção foi encontrado em gdrive:." +fi DAILY_KEPT=0 WEEKLY_KEPT=0 @@ -32,30 +56,30 @@ WEEKLY_SEEN_WEEKS="" MAX_DAILY=${RETENTION_DAILY:-5} MAX_WEEKLY=${RETENTION_WEEKLY:-4} -for FILE in $FILES; do - FILE_TS=$(echo "$FILE" | grep -oP '\d{10,}') - - if [ -z "$FILE_TS" ]; then continue; fi - +for FILE in "${FILES[@]}"; do + FILE_TS="${FILE##*_}" + FILE_TS="${FILE_TS%.sql.gz}" + + if [[ ! "$FILE_TS" =~ ^[0-9]{10,}$ ]]; then + continue + fi + ISO_WEEK=$(date -d "@$FILE_TS" +%G-W%V) - + if [ "$DAILY_KEPT" -lt "$MAX_DAILY" ]; then echo " -> [DIÁRIO] Mantendo backup recente: $FILE (Semana: $ISO_WEEK)" DAILY_KEPT=$((DAILY_KEPT + 1)) - + else - # Se a semana deste arquivo restante ainda não foi guardada nesta fase - # e ainda temos vagas para backups semanais, nós o mantemos if [[ ! "$WEEKLY_SEEN_WEEKS" =~ " $ISO_WEEK " ]] && [ "$WEEKLY_KEPT" -lt "$MAX_WEEKLY" ]; then echo " -> [SEMANAL] Mantendo primeiro da semana: $FILE (Semana: $ISO_WEEK)" WEEKLY_KEPT=$((WEEKLY_KEPT + 1)) WEEKLY_SEEN_WEEKS="$WEEKLY_SEEN_WEEKS $ISO_WEEK " else - # Não passou em nenhum critério das sobras: exclusão segura echo " -> Deletando backup antigo: $FILE" rclone deletefile gdrive:"$FILE" fi fi done -echo "Processo de backup concluído com sucesso: ${FILE_NAME}" \ No newline at end of file +echo "Processo de backup concluído com sucesso: ${FILE_NAME}" diff --git a/script/database-backup/docker-compose.yml b/script/database-backup/docker-compose.yml index 700b5e01..a04f1643 100644 --- a/script/database-backup/docker-compose.yml +++ b/script/database-backup/docker-compose.yml @@ -4,18 +4,19 @@ services: container_name: database-backup build: . environment: - #PostgreSQL - POSTGRES_HOST: ${PG_HOST} - POSTGRES_PORT: "${PG_PORT}" - POSTGRES_USER: "${PG_USERNAME}" - POSTGRES_PASSWORD: "${PG_PASSWORD}" - POSTGRES_DATABASE: "${PG_DATABASE}" - #Google Drive + # PostgreSQL + DATABASE_HOST: "${DATABASE_HOST}" + DATABASE_PORT: "${DATABASE_PORT}" + DATABASE_USER: "${DATABASE_USER}" + DATABASE_PASSWORD: "${DATABASE_PASSWORD}" + DATABASE_NAME: "${DATABASE_NAME}" + + # Google Drive GDRIVE_TOKEN: "${GDRIVE_TOKEN}" GDRIVE_FOLDER_ID: "${GDRIVE_FOLDER_ID}" - RETENTION_DAILY: "${RETENTION_DAILY}" - RETENTION_WEEKLY: "${RETENTION_WEEKLY}" + RETENTION_DAILY: "${RETENTION_DAILY}" + RETENTION_WEEKLY: "${RETENTION_WEEKLY}" - CRON_SCHEDULE: "${CRON_SCHEDULE}" - TZ: "${TZ}" + CRON_SCHEDULE: "${CRON_SCHEDULE}" + TZ: "${TZ}" diff --git a/script/database-backup/entrypoint.sh b/script/database-backup/entrypoint.sh index 2c6a112d..ad6176c8 100644 --- a/script/database-backup/entrypoint.sh +++ b/script/database-backup/entrypoint.sh @@ -12,7 +12,7 @@ EOF echo "Configuring cron job with schedule: $CRON_SCHEDULE ($TZ)" -printenv | grep -E "^(POSTGRES_|GDRIVE_|RETENTION_)" >> /etc/environment +printenv | grep -E "^(DATABASE_|GDRIVE_|RETENTION_|CRON_SCHEDULE|TZ)" >> /etc/environment echo "$CRON_SCHEDULE /backup.sh 1> /proc/1/fd/1 2> /proc/1/fd/2" | crontab - @@ -23,4 +23,4 @@ fi crontab -l -exec "$@" \ No newline at end of file +exec "$@"