feat: add deployment workflow and Docker Compose configuration for services
This commit is contained in:
parent
7db56a50ec
commit
c5821ad9c1
3 changed files with 251 additions and 0 deletions
18
.github/workflows/deploy.yml
vendored
Normal file
18
.github/workflows/deploy.yml
vendored
Normal file
|
|
@ -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"}'
|
||||||
65
build_and_push_ghcr.sh
Normal file
65
build_and_push_ghcr.sh
Normal file
|
|
@ -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-<service>:${TAG}"
|
||||||
168
ref-docker-compose.yml
Normal file
168
ref-docker-compose.yml
Normal file
|
|
@ -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:
|
||||||
Loading…
Add table
Reference in a new issue