Add pgAdmin service configuration to Docker Compose

This commit is contained in:
Mohmmed Elfateh Sabry
2025-09-14 01:26:45 +03:00
parent 7d6c6169e9
commit 13819bf672
2 changed files with 25 additions and 113 deletions

View File

@@ -25,106 +25,17 @@ jobs:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Setup SSH key
run: |
mkdir -p ~/.ssh
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan -p "${{ secrets.SSH_PORT }}" "${{ secrets.SSH_HOST }}" >> ~/.ssh/known_hosts
- name: Create target dir
run: |
ssh -p "${{ secrets.SSH_PORT }}" "${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}" "sudo mkdir -p '${REMOTE_DIR}' && sudo chown -R \$USER:\$USER '${REMOTE_DIR}'"
- name: Reset any local changes on VPS
run: |
ssh -p "${{ secrets.SSH_PORT }}" "${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}" \
"export REMOTE_DIR='${{ secrets.REMOTE_DIR }}'; bash -se" <<'EOF'
set -euo pipefail
cd "$REMOTE_DIR"
# Force reset any local changes and pull latest
if [ -d ".git" ]; then
echo "Git repository detected, resetting and pulling..."
git reset --hard HEAD
git clean -fd
git pull origin main
else
echo "No git repository found, creating backup of modified files..."
# Backup any existing files that might conflict
[ -f "docker-compose.yml" ] && cp docker-compose.yml docker-compose.yml.backup.$(date +%s) || true
fi
EOF
- name: Sync repo to VPS (rsync)
run: |
rsync -az --delete \
-e "ssh -p ${{ secrets.SSH_PORT }}" \
--exclude ".git" \
--exclude ".github" \
--exclude ".env" \
./ "${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}:${REMOTE_DIR}/"
- name: Write .env on VPS (from GitHub Secrets)
run: |
ssh -p "${{ secrets.SSH_PORT }}" "${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}" \
"export REMOTE_DIR='${{ secrets.REMOTE_DIR }}'; bash -se" <<'EOF'
set -euo pipefail
cd "$REMOTE_DIR"
cat > .env <<'ENVVARS'
# --- Domain / Timezone ---
DOMAIN=${{ secrets.DOMAIN }}
TZ=${{ secrets.TZ }}
# --- ACME / Let's Encrypt (email only) ---
ACME_EMAIL=${{ secrets.ACME_EMAIL }}
# --- Basic Authentication ---
BASIC_AUTH_USERS=${{ secrets.BASIC_AUTH_USERS }}
# --- Namecheap DNS API ---
NAMECHEAP_API_USER=${{ secrets.NAMECHEAP_API_USER }}
NAMECHEAP_API_KEY=${{ secrets.NAMECHEAP_API_KEY }}
# --- CrowdSec ---
CROWDSEC_BOUNCER_KEY=${{ secrets.CROWDSEC_BOUNCER_KEY }}
# --- Umami (PostgreSQL) ---
UMAMI_DB_USER=${{ secrets.UMAMI_DB_USER }}
UMAMI_DB_PASS=${{ secrets.UMAMI_DB_PASS }}
UMAMI_DB_NAME=${{ secrets.UMAMI_DB_NAME }}
UMAMI_APP_SECRET=${{ secrets.UMAMI_APP_SECRET }}
# --- Grafana ---
GRAFANA_ADMIN_USER=${{ secrets.GRAFANA_ADMIN_USER }}
GRAFANA_ADMIN_PASS=${{ secrets.GRAFANA_ADMIN_PASS }}
ENVVARS
EOF
- name: Pre-flight checks (docker + compose)
run: |
ssh -p "${{ secrets.SSH_PORT }}" "${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}" "
docker version && docker compose version
"
- name: Deploy (pull, up, prune) - name: Deploy (pull, up, prune)
run: | run: |
ssh -p "${{ secrets.SSH_PORT }}" "${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}" \ ssh -p "${{ secrets.SSH_PORT }}" "${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}" \
"export REMOTE_DIR='${{ secrets.REMOTE_DIR }}'; bash -se" <<'EOF' "export REMOTE_DIR='${{ secrets.REMOTE_DIR }}'; bash -se" <<'EOF'
set -euo pipefail set -euo pipefail
cd "$REMOTE_DIR" cd "$REMOTE_DIR"
# Warm up networks/volumes and pull images
git pull origin main
docker compose pull docker compose pull
# Bring up (idempotent), remove old orphans
docker compose up -d --remove-orphans docker compose up -d --remove-orphans
# Light cleanup of old images (keeps running ones)
docker image prune -af || true docker image prune -af || true
echo
echo '--- Running containers ---'
docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}'
EOF EOF
- name: Post-deploy smoke checks - name: Post-deploy smoke checks
@@ -134,3 +45,4 @@ jobs:
echo "Portainer: https://portainer.gate.${{ secrets.DOMAIN }}" echo "Portainer: https://portainer.gate.${{ secrets.DOMAIN }}"
echo "Uptime Kuma: https://uptime.gate.${{ secrets.DOMAIN }}" echo "Uptime Kuma: https://uptime.gate.${{ secrets.DOMAIN }}"
echo "Umami: https://umami.gate.${{ secrets.DOMAIN }}" echo "Umami: https://umami.gate.${{ secrets.DOMAIN }}"
echo "pgAdmin: https://pgadmin.gate.${{ secrets.DOMAIN }}"

View File

@@ -199,25 +199,25 @@ services:
volumes: volumes:
- umami_data:/var/lib/postgresql/data - umami_data:/var/lib/postgresql/data
## ───────────────────────────────────────────── # ─────────────────────────────────────────────
## pgAdmin — PostgreSQL administration # pgAdmin — PostgreSQL administration
## ───────────────────────────────────────────── # ─────────────────────────────────────────────
# pgadmin: pgadmin:
# image: dpage/pgadmin4:latest image: dpage/pgadmin4:latest
# container_name: pgadmin container_name: pgadmin
# restart: unless-stopped restart: unless-stopped
# networks: [traefik_proxy] networks: [traefik_proxy]
# environment: environment:
# PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL} PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL}
# PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD} PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD}
# PGADMIN_CONFIG_SERVER_MODE: 'False' PGADMIN_CONFIG_SERVER_MODE: 'False'
# PGADMIN_CONFIG_MASTER_PASSWORD_REQUIRED: 'False' PGADMIN_CONFIG_MASTER_PASSWORD_REQUIRED: 'False'
# volumes: volumes:
# - pgadmin_data:/var/lib/pgadmin - pgadmin_data:/var/lib/pgadmin
# labels: labels:
# - traefik.enable=true - traefik.enable=true
# - traefik.http.routers.pgadmin.rule=Host(`pgadmin.gate.${DOMAIN}`) - traefik.http.routers.pgadmin.rule=Host(`pgadmin.gate.${DOMAIN}`)
# - traefik.http.routers.pgadmin.entrypoints=websecure - traefik.http.routers.pgadmin.entrypoints=websecure
# - traefik.http.routers.pgadmin.tls.certresolver=le - traefik.http.routers.pgadmin.tls.certresolver=le
# - traefik.http.routers.pgadmin.middlewares=basic-auth,security-headers - traefik.http.routers.pgadmin.middlewares=basic-auth,security-headers
# - traefik.http.services.pgadmin.loadbalancer.server.port=80 - traefik.http.services.pgadmin.loadbalancer.server.port=80