Skip to content

Instantly share code, notes, and snippets.

@konverner
Created April 6, 2026 12:50
Show Gist options
  • Select an option

  • Save konverner/d2e2d08e4aed5b5e0fffb0bfced67e2b to your computer and use it in GitHub Desktop.

Select an option

Save konverner/d2e2d08e4aed5b5e0fffb0bfced67e2b to your computer and use it in GitHub Desktop.
Production Server Setup Script (Docker + PostgreSQL Backup)
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
###############################################################################
# Production Server Setup Script (Docker + PostgreSQL Backup)
#
# What the script does:
# 1. Installs Docker Engine and Docker Compose (if not installed)
# 2. Configures automated PostgreSQL backups
# 3. Adds daily cron backup job
# 4. Configures Docker log rotation
# 5. Cleans existing Docker logs
# 6. Validates installation
#
# Usage:
# chmod +x setup.sh
# ./setup.sh
###############################################################################
# --- CONFIGURATION ---
PROJECT_ROOT="$HOME/full-stack-template"
BACKUP_DIR="/root/backups/postgres"
echo "πŸš€ Starting Production Setup..."
# ---------------------------------------------------------------------------
# 1. INSTALL DOCKER & DOCKER-COMPOSE (IDEMPOTENT)
# ---------------------------------------------------------------------------
echo "πŸ“¦ Checking Docker installation..."
if ! command -v docker >/dev/null 2>&1; then
echo "Installing Docker and Docker Compose..."
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
| sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \
| sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
else
echo "βœ… Docker already installed"
fi
# ---------------------------------------------------------------------------
# 2. SET POSTGRES BACKUP ROUTINE
# ---------------------------------------------------------------------------
echo "πŸ’Ύ Configuring Backup Routine..."
mkdir -p "$PROJECT_ROOT"
mkdir -p "$BACKUP_DIR"
cat <<EOF > "$PROJECT_ROOT/backup.sh"
#!/bin/bash
set -euo pipefail
TIMESTAMP=\$(date +"%Y%m%d_%H%M%S")
docker exec astore-office-db-1 \
pg_dump -U \${PG_USER:-postgres} \${PG_DB:-astore_db} \
| gzip > $BACKUP_DIR/db_backup_\$TIMESTAMP.sql.gz
find $BACKUP_DIR -type f -mtime +30 -delete
EOF
chmod +x "$PROJECT_ROOT/backup.sh"
echo "πŸ“… Installing daily backup cron job (02:00)..."
(crontab -l 2>/dev/null | grep -v "$PROJECT_ROOT/backup.sh"; \
echo "0 2 * * * /bin/bash $PROJECT_ROOT/backup.sh") | crontab -
# ---------------------------------------------------------------------------
# 3. CONFIGURE DOCKER LOG ROTATION
# ---------------------------------------------------------------------------
echo "🧹 Configuring Docker log rotation..."
DOCKER_DAEMON_CONFIG="/etc/docker/daemon.json"
sudo mkdir -p /etc/docker
if [ ! -f "$DOCKER_DAEMON_CONFIG" ]; then
sudo tee "$DOCKER_DAEMON_CONFIG" > /dev/null <<EOF
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
EOF
echo "Restarting Docker service..."
sudo systemctl restart docker
else
echo "Docker daemon config already exists β€” skipping overwrite"
fi
# ---------------------------------------------------------------------------
# 4. CLEAN EXISTING DOCKER LOG FILES
# ---------------------------------------------------------------------------
echo "🧽 Cleaning existing Docker container logs..."
sudo find /var/lib/docker/containers/ -name "*-json.log" \
-exec truncate -s 0 {} \; 2>/dev/null || true
echo "βœ… Existing logs cleared"
# ---------------------------------------------------------------------------
# 5. VALIDATION
# ---------------------------------------------------------------------------
echo "πŸ” Validating Setup..."
echo -n "Checking Docker Compose: "
if docker compose version >/dev/null 2>&1
then echo "βœ… OK"
else echo "❌ FAILED"
fi
echo -n "Checking Backup Cron: "
if crontab -l | grep -q "$PROJECT_ROOT/backup.sh"
then echo "βœ… OK"
else echo "❌ FAILED"
fi
echo "-------------------------------------------------------"
echo "βœ… Setup Complete!"
echo ""
echo "Next step:"
echo "Put your docker-compose.yml and .env in:"
echo "$PROJECT_ROOT"
echo ""
echo "Then run:"
echo "docker compose up -d"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment