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