From c5821ad9c1213b803b8ba982ab93087f3accf139 Mon Sep 17 00:00:00 2001 From: Marco Pedone Date: Thu, 16 Oct 2025 16:30:01 +0200 Subject: [PATCH] feat: add deployment workflow and Docker Compose configuration for services --- .github/workflows/deploy.yml | 18 ++++ build_and_push_ghcr.sh | 65 ++++++++++++++ ref-docker-compose.yml | 168 +++++++++++++++++++++++++++++++++++ 3 files changed, 251 insertions(+) create mode 100644 .github/workflows/deploy.yml create mode 100644 build_and_push_ghcr.sh create mode 100644 ref-docker-compose.yml diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..c4cfd01 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,18 @@ +name: Deploy on package push + +on: + registry_package: + types: ["published", "updated"] + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: Deploy command + run: | + curl -X 'POST' \ + 'https://dock.marcopedone.it/api/compose.deploy' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'x-api-key: gbiVIPaEQtkPywiAOIxiBtLrjKVuIqcnXXNMTzMXZoyTgJtgyLpHrlfBEqIcyEUM' \ + -d '{"composeId": "1Q1nPft6iaEDENfpYxq99"}' diff --git a/build_and_push_ghcr.sh b/build_and_push_ghcr.sh new file mode 100644 index 0000000..7088339 --- /dev/null +++ b/build_and_push_ghcr.sh @@ -0,0 +1,65 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Build and push multiple Docker images to a registry (GHCR or self-hosted) +# Usage: +# ./build_and_push_ghcr.sh [TAG] +# Environment variables (defaults shown): +# TAG (arg or env, default: latest) +# IMAGE_REGISTRY (default: ghcr.io) +# OWNER (default: marcopedone) +# SERVICES (space-separated list, default: backend web db) +# USERNAME (optional): registry username for docker login +# TOKEN (optional): registry password/token for docker login +# +# The script expects subfolders for services when building from source: +# - db -> ./apps/db +# - backend -> ./apps/backend +# - web -> ./apps/infoalloggi + +TAG=${1:-${TAG:-latest}} +IMAGE_REGISTRY=${IMAGE_REGISTRY:-ghcr.io} +OWNER=${OWNER:-marcopedone} +SERVICES=${SERVICES:-"backend web db"} +USERNAME=${USERNAME:-marcopedone} +TOKEN=${TOKEN:-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} + +set -x + +# Optional login +if [[ -n "${USERNAME}" && -n "${TOKEN}" ]]; then + echo "Logging into ${IMAGE_REGISTRY} as ${USERNAME}..." + echo "${TOKEN}" | docker login "${IMAGE_REGISTRY}" -u "${USERNAME}" --password-stdin +else + echo "No credentials provided; assuming you're already logged into ${IMAGE_REGISTRY} or using a credential helper." +fi + +for svc in ${SERVICES}; do + case "${svc}" in + db) + ctx="./apps/db" + dockerfile="Dockerfile" + ;; + backend) + ctx="./apps/backend" + dockerfile="Dockerfile" + ;; + web) + ctx="./apps/infoalloggi" + dockerfile="Dockerfile" + ;; + *) + echo "Unknown service: ${svc}, skipping..."; + continue + ;; + esac + + IMAGE="${IMAGE_REGISTRY}/${OWNER}/infoalloggi-${svc}:${TAG}" + echo "Building ${svc} -> ${IMAGE} (context: ${ctx})" + docker build -t "${IMAGE}" -f "$ctx/$dockerfile" "$ctx" + + echo "Pushing ${IMAGE}" + docker push "${IMAGE}" +done + +echo "All done. Built and pushed services: ${SERVICES} with tag ${TAG} to ${IMAGE_REGISTRY}/${OWNER}/infoalloggi-:${TAG}" diff --git a/ref-docker-compose.yml b/ref-docker-compose.yml new file mode 100644 index 0000000..90fa57b --- /dev/null +++ b/ref-docker-compose.yml @@ -0,0 +1,168 @@ +services: + db: + image: "${IMAGE_REGISTRY:-ghcr.io}/${OWNER:-marcopedone}/infoalloggi-db:${TAG:-latest}" + environment: + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + restart: unless-stopped + networks: + - dokploy-network + expose: + - "5432" + volumes: + - dbdata:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"] + interval: 1s + timeout: 5s + retries: 10 + + minio: + image: minio/minio + expose: + - "9000" + - "9001" + volumes: + - minio_storage:/data + networks: + - dokploy-network + environment: + MINIO_ROOT_USER: ${MINIO_ROOT_USER} + MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD} + command: server --console-address ":9001" /data + healthcheck: + test: [ "CMD", "curl", "-f", "http://minio:9000/minio/health/live" ] + interval: 10s + timeout: 10s + retries: 5 + + tiles: + image: eqalpha/keydb:latest + volumes: + - tiles-data:/data + networks: + - dokploy-network + expose: + - "6379" + command: keydb-server /etc/keydb/keydb.conf --maxmemory 100mb --maxmemory-policy volatile-lru --maxmemory-samples 5 + healthcheck: + test: ["CMD", "keydb-cli", "-h", "localhost", "ping"] + interval: 5s + timeout: 3s + retries: 5 + restart: unless-stopped + deploy: + resources: + limits: + cpus: "0.5" + + keydb: + image: eqalpha/keydb:latest + volumes: + - keydb-data:/data + networks: + - dokploy-network + expose: + - "6379" + healthcheck: + test: ["CMD", "keydb-cli", "-h", "localhost", "ping"] + interval: 5s + timeout: 3s + retries: 5 + restart: unless-stopped + deploy: + resources: + limits: + cpus: "0.5" + + backend: + image: "${IMAGE_REGISTRY:-ghcr.io}/${OWNER:-marcopedone}/infoalloggi-backend:${TAG:-latest}" + networks: + - dokploy-network + expose: + - 1323 + restart: unless-stopped + volumes: + - images_volume:/app/images + - storage_volume:/app/storage + environment: + STORAGE_STRATEGY: "s3" + MINIO_URL: minio:9000 + MINIO_ROOT_USER: ${MINIO_ROOT_USER} + MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD} + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + PGHOST: db + PGPORT: "5432" + IMAGEOPTION: "true" + CONCURRENT_IMAGES: ${CONCURRENT_IMAGES} + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:1323/"] + interval: 10s + timeout: 5s + retries: 5 + depends_on: + minio: + condition: service_healthy + db: + condition: service_healthy + keydb: + condition: service_healthy + tiles: + condition: service_healthy + + web: + image: "${IMAGE_REGISTRY:-ghcr.io}/${OWNER:-marcopedone}/infoalloggi-web:${TAG:-latest}" + working_dir: /app + environment: + INTERNAL_BASE_URL: http://web:3000 + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + PGHOST: db + PGPORT: "5432" + BACKENDSERVER_URL: http://backend:1323 + KEYDB_URL: keydb:6379 + TILES_URL: tiles:6379 + BASE_URL: ${BASE_URL} + SENDGRID_API_KEY: ${SENDGRID_API_KEY} + STRIPE_SECRET_KEY: ${STRIPE_SECRET_KEY} + NEXT_PUBLIC_STRIPE_PUBLIC_KEY: ${NEXT_PUBLIC_STRIPE_PUBLIC_KEY} + STRIPE_WEBHOOK_SECRET: ${STRIPE_WEBHOOK_SECRET} + FIC_CLIENT_ID: ${FIC_CLIENT_ID} + FIC_ACCESS_TOKEN: ${FIC_ACCESS_TOKEN} + FIC_COMPANY_ID: ${FIC_COMPANY_ID} + ARUBA_USER: ${ARUBA_USER} + ARUBA_PASS: ${ARUBA_PASS} + EXP_API_USER: ${EXP_API_USER} + EXP_API_PASS: ${EXP_API_PASS} + JWT_SECRET: ${JWT_SECRET} + SKEBBY_USER: ${SKEBBY_USER} + SKEBBY_PASS: ${SKEBBY_PASS} + networks: + - dokploy-network + ports: + - "3000" + depends_on: + backend: + condition: service_healthy + db: + condition: service_healthy + keydb: + condition: service_healthy + tiles: + condition: service_healthy + +networks: + dokploy-network: + external: true + +volumes: + minio_storage: + images_volume: + storage_volume: + tiles-data: + keydb-data: + dbdata: