Created
April 6, 2026 12:50
-
-
Save konverner/d2e2d08e4aed5b5e0fffb0bfced67e2b to your computer and use it in GitHub Desktop.
Production Server Setup Script (Docker + PostgreSQL Backup)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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