Merge branch 'feature/improved-backup' into develop

This commit is contained in:
Knee Cola
2025-11-25 19:28:27 +01:00
9 changed files with 86 additions and 158 deletions

37
db-backup-standalone.sh Executable file
View File

@@ -0,0 +1,37 @@
#!/usr/bin/env bash
set -euo pipefail
# Configuration
MONGO_SERVICE="mongo"
COMPOSE_FILE="docker-compose-standalone.yaml"
# stop mongo container while we copy its volume
docker compose -f "$COMPOSE_FILE" stop "$MONGO_SERVICE"
# timestamp for filename
TIMESTAMP=$(date +"%Y-%m-%d-%H-%M")
# backup directory and retention (can be overridden via env)
BACKUP_DIR="${BACKUP_DIR:-backups}"
KEEP="${KEEP:-7}"
mkdir -p "$BACKUP_DIR"
BACKUP_FILE="$BACKUP_DIR/mongo-volume-backup-$TIMESTAMP.tar.gz"
sudo tar -czvpf "$BACKUP_FILE" mongo-volume
# rotate old backups: keep only the newest $KEEP files
if [ "$KEEP" -gt 0 ]; then
# gather files sorted newest-first
mapfile -t files < <(ls -1t "$BACKUP_DIR"/mongo-volume-backup-*.tar.gz 2>/dev/null || true)
if [ "${#files[@]}" -gt "$KEEP" ]; then
for f in "${files[@]:$KEEP}"; do
echo "Removing old backup: $f"
rm -f -- "$f"
done
fi
fi
# bring mongo container back up
docker compose -f "$COMPOSE_FILE" start "$MONGO_SERVICE"

View File

@@ -1,38 +0,0 @@
#!/bin/bash
# print menu: (1) deploy stack, (2) follow logs of "web-app" service, (3) remove stack
echo "1. Deploy stack"
echo "2. Follow logs of 'web-app' service"
echo "3. Remove stack"
echo ""
echo "Ctrl+C to exit"
echo ""
# read user input
read -p "Enter your choice: " -n 1 -r
echo ""
# deploy stack
if [ $REPLY -eq 1 ]
then
#docker stack deploy -c docker-compose-deploy.yml utility-bills-tracker
HOSTNAME=0.0.0.0 \
NEXTAUTH_URL=https://rezije.app \
docker stack deploy \
-c docker-compose-deploy.yml utility-bills-tracker
fi
# follow logs of "web-app" service
if [ $REPLY -eq 2 ]
then
docker service logs -f utility-bills-tracker_web-app
fi
# remove stack
if [ $REPLY -eq 3 ]
then
docker stack rm utility-bills-tracker
fi
# go back to menu
./debug-deploy.sh

18
deploy-standalone.sh Executable file
View File

@@ -0,0 +1,18 @@
#!/bin/bash
if [ "$1" == "" ] ; then
printf "\nDocker image-a version param missing"
printf "\n\nSyntax:\n\n deploy-standalone.sh 1.0.0\n\n"
exit 1
fi
printf "\nBUILD START ...\n\n"
IMAGE_VERSION=$1
COMPOSE_FILE="docker-compose-standalone.yaml"
echo "Deploying with image version: $IMAGE_VERSION"
# Pass IMAGE_VERSION env var for compose variable substitution
IMAGE_VERSION="$IMAGE_VERSION" docker compose \
-f "$COMPOSE_FILE" \
up -d

View File

@@ -1,17 +1,18 @@
#!/bin/bash
if [ "$1" == "" ] ; then
printf "\nNisi zadao verziju Docker image-a koji treba deployati"
printf "\n\nSintaksa:\n\n deploy.sh 1.0.0\n\n"
printf "\nDocker image-a version param missing"
printf "\n\nSyntax:\n\n deploy-swarm.sh 1.0.0\n\n"
exit 1
fi
printf "\nBUILD START ...\n\n"
IMAGE_VERSION=$1
COMPOSE_FILE="docker-compose-swarm.yml"
echo "Deploying $STACK_NAME with image version: $IMAGE_VERSION"
echo "Deploying with image version: $IMAGE_VERSION"
# Pass IMAGE_VERSION env var for compose variable substitution
IMAGE_VERSION="$IMAGE_VERSION" docker stack deploy \
-c docker-compose-deploy.yml \
-c "$COMPOSE_FILE" \
utility-bills-tracker

View File

@@ -1,15 +0,0 @@
#!/bin/bash
if [ "$1" == "" ] ; then
printf "\nNisi zadao verziju Docker image-a koji treba deployati"
printf "\n\nSintaksa:\n\n deploy.sh 1.0.0\n\n"
exit 1
fi
printf "\nBUILD START ...\n\n"
IMAGE_VERSION=$1
echo "Deploying $STACK_NAME with image version: $IMAGE_VERSION"
# Pass IMAGE_VERSION env var for compose variable substitution
IMAGE_VERSION="$IMAGE_VERSION" docker compose up -d

View File

@@ -1,77 +0,0 @@
# this compose file runs Postgres db and exposes it's port to the host machine
version: "3.7"
networks:
traefik-network:
name: "traefik-network"
external: true
util-bills-mongo-network:
name: "util-bills-mongo-network"
attachable: false
external: false
internal: true
services:
app:
image: utility-bills-tracker:${IMAGE_VERSION}
networks:
- traefik-network
- util-bills-mongo-network
volumes:
- ./etc/hosts/:/etc/hosts
environment:
MONGODB_URI: mongodb://rezije.app:w4z4piJBgCdAm4tpawqB@mongo:27017/utility-bills
GOOGLE_ID: 355397364527-adjrokm6hromcaaar0qfhk050mfr35ou.apps.googleusercontent.com
GOOGLE_SECRET: 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
AUTH_SECRET: Gh0jQ35oq6DR8HkLR3heA8EaEDtxYN/xkP6blvukZ0w=
LINKEDIN_ID: 776qlcsykl1rag
LINKEDIN_SECRET: ugf61aJ2iyErLK40
HOSTNAME: rezije.app # IP address at which the server will be listening (0.0.0.0 = listen on all addresses)
NEXTAUTH_URL: https://rezije.app # URL next-auth will use while redirecting user during authentication (if not set - will use HOSTNAME)
PORT: ${PORT:-80}
deploy:
# u slucaju rušenja kontejnera čekamo 5s i dižemo novi kontejner => ako se i on sruši opet ceka 5s i pokusava ponovno (tako 5 puta)
restart_policy:
condition: any
delay: 5s
max_attempts: 0 # u slučaju rušenja containera pokušavaj ga pokrenuti dok ne uspije = BESKONAČNO
labels:
- traefik.enable=true
- traefik.docker.network=traefik-network # mreže preko koje ide komunikacija sa Traefikom
- traefik.http.services.web-app.loadbalancer.server.port=80
- traefik.http.routers.web-app.entrypoints=http
- traefik.http.routers.web-app.rule=Host(`${FQDN:-rezije.app}`)
mongo:
image: mongo:4.4.27
ulimits:
nofile:
soft: 64000
hard: 64000
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: example
volumes:
- ./mongo-volume:/data/db
networks:
- util-bills-mongo-network
mongo-express:
image: mongo-express
environment:
ME_CONFIG_MONGODB_ADMINUSERNAME: root
ME_CONFIG_MONGODB_ADMINPASSWORD: HjktJCPWMBtM1ACrDaw7
ME_CONFIG_MONGODB_URL: mongodb://root:HjktJCPWMBtM1ACrDaw7@mongo:27017/
networks:
- traefik-network
- util-bills-mongo-network
deploy:
# u slucaju rušenja kontejnera čekamo 5s i dižemo novi kontejner => ako se i on sruši opet ceka 5s i pokusava ponovno (tako 5 puta)
restart_policy:
condition: any
delay: 5s
max_attempts: 0 # u slučaju rušenja containera pokušavaj ga pokrenuti dok ne uspije = BESKONAČNO
labels:
- traefik.enable=true
- traefik.docker.network=traefik-network # mreže preko koje ide komunikacija sa Traefikom
- traefik.http.services.mongo-express.loadbalancer.server.port=8081
- traefik.http.routers.mongo-express.entrypoints=http
- traefik.http.routers.mongo-express.rule=Host(`mongo.rezije.app`)

View File

@@ -6,19 +6,17 @@ networks:
name: traefik-network
external: true
util-bills-mongo-network:
name: util-bills-mongo-network
internal: true # bridge network, isolated from host and other networks
name: "util-bills-mongo-network"
attachable: false
external: false
internal: true # bridge network, isolated from host and other networks
services:
web-app:
image: utility-bills-tracker:${IMAGE_VERSION}
container_name: evidencija-rezija__web-app
restart: unless-stopped # u slučaju rušenja containera pokušavaj ga pokrenuti dok ne uspije = BESKONAČNO
networks:
- traefik-network
- util-bills-mongo-network
depends_on:
- mongo
volumes:
- ./etc/hosts/:/etc/hosts
environment:
@@ -28,9 +26,13 @@ services:
AUTH_SECRET: Gh0jQ35oq6DR8HkLR3heA8EaEDtxYN/xkP6blvukZ0w=
LINKEDIN_ID: 776qlcsykl1rag
LINKEDIN_SECRET: ugf61aJ2iyErLK40
HOSTNAME: rezije.app # IP address at which the server will be listening (0.0.0.0 = listen on all addresses)
HOSTNAME: rezije.app # IP address at which the server will be listening (0.0.0.0 = listen on all addresses)
NEXTAUTH_URL: https://rezije.app # URL next-auth will use while redirecting user during authentication (if not set - will use HOSTNAME)
PORT: ${PORT:-80}
container_name: evidencija-rezija__web-app
restart: unless-stopped # u slučaju rušenja containera pokušavaj ga pokrenuti dok ne uspije = BESKONAČNO
depends_on:
- mongo
labels:
- traefik.enable=true
- traefik.docker.network=traefik-network # mreže preko koje ide komunikacija sa Traefikom
@@ -49,20 +51,19 @@ services:
- ./mongo-volume:/data/db
networks:
- util-bills-mongo-network
mongo-express:
image: mongo-express
container_name: evidencija-rezija__mongo-express
restart: unless-stopped
networks:
- traefik-network
- util-bills-mongo-network
depends_on:
- mongo
environment:
ME_CONFIG_MONGODB_ADMINUSERNAME: root
ME_CONFIG_MONGODB_ADMINPASSWORD: HjktJCPWMBtM1ACrDaw7
ME_CONFIG_MONGODB_URL: mongodb://root:HjktJCPWMBtM1ACrDaw7@mongo:27017/
networks:
- traefik-network
- util-bills-mongo-network
container_name: evidencija-rezija__mongo-express
restart: unless-stopped
depends_on:
- mongo
labels:
- traefik.enable=true
- traefik.docker.network=traefik-network # mreže preko koje ide komunikacija sa Traefikom

View File

@@ -5,22 +5,22 @@ networks:
traefik-network:
name: "traefik-network"
external: true
mongo-network:
name: "mongo-network"
util-bills-mongo-network:
name: "util-bills-mongo-network"
attachable: false
external: false
internal: true
internal: true # bridge network, isolated from host and other networks
services:
web-app:
image: utility-bills-tracker:${IMAGE_VERSION}
networks:
- traefik-network
- mongo-network
- util-bills-mongo-network
volumes:
- ./etc/hosts/:/etc/hosts
environment:
MONGODB_URI: mongodb://root:example@mongo:27017/
MONGODB_URI: mongodb://rezije.app:w4z4piJBgCdAm4tpawqB@mongo:27017/utility-bills
GOOGLE_ID: 355397364527-adjrokm6hromcaaar0qfhk050mfr35ou.apps.googleusercontent.com
GOOGLE_SECRET: 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
AUTH_SECRET: Gh0jQ35oq6DR8HkLR3heA8EaEDtxYN/xkP6blvukZ0w=
@@ -49,16 +49,16 @@ services:
volumes:
- ./mongo-volume:/data/db
networks:
- mongo-network
- util-bills-mongo-network
mongo-express:
image: mongo-express
environment:
ME_CONFIG_MONGODB_ADMINUSERNAME: root
ME_CONFIG_MONGODB_ADMINPASSWORD: example
ME_CONFIG_MONGODB_URL: mongodb://root:example@mongo:27017/
ME_CONFIG_MONGODB_ADMINPASSWORD: HjktJCPWMBtM1ACrDaw7
ME_CONFIG_MONGODB_URL: mongodb://root:HjktJCPWMBtM1ACrDaw7@mongo:27017/
networks:
- traefik-network
- mongo-network
- util-bills-mongo-network
deploy:
# u slucaju rušenja kontejnera čekamo 5s i dižemo novi kontejner => ako se i on sruši opet ceka 5s i pokusava ponovno (tako 5 puta)
restart_policy:
@@ -71,3 +71,4 @@ services:
- traefik.http.services.mongo-express.loadbalancer.server.port=8081
- traefik.http.routers.mongo-express.entrypoints=http
- traefik.http.routers.mongo-express.rule=Host(`mongo.rezije.app`)