updated deploy scripts and locations
This commit is contained in:
104
cfg/amar/.env
Normal file
104
cfg/amar/.env
Normal file
@@ -0,0 +1,104 @@
|
||||
# =============================================================================
|
||||
# AMAR - Local Development Configuration
|
||||
# =============================================================================
|
||||
|
||||
# =============================================================================
|
||||
# DEPLOYMENT
|
||||
# =============================================================================
|
||||
DEPLOYMENT_NAME=amar
|
||||
|
||||
# =============================================================================
|
||||
# NETWORK (shared with soleprint)
|
||||
# =============================================================================
|
||||
NETWORK_NAME=soleprint_network
|
||||
|
||||
# =============================================================================
|
||||
# PATHS (local code locations)
|
||||
# =============================================================================
|
||||
BACKEND_PATH=/home/mariano/wdir/ama/amar_django_back
|
||||
FRONTEND_PATH=/home/mariano/wdir/ama/amar_frontend
|
||||
DOCKERFILE_BACKEND=/home/mariano/wdir/spr/cfg/amar/Dockerfile.backend
|
||||
DOCKERFILE_FRONTEND=/home/mariano/wdir/spr/cfg/amar/Dockerfile.frontend
|
||||
|
||||
# =============================================================================
|
||||
# DATABASE
|
||||
# =============================================================================
|
||||
DB_DUMP=dev.sql
|
||||
|
||||
# =============================================================================
|
||||
# PORTS
|
||||
# =============================================================================
|
||||
BACKEND_PORT=8000
|
||||
FRONTEND_PORT=3000
|
||||
|
||||
# =============================================================================
|
||||
# BACKEND SERVER (Uvicorn)
|
||||
# =============================================================================
|
||||
BACKEND_WORKERS=1
|
||||
BACKEND_RELOAD=--reload
|
||||
|
||||
# Database connection
|
||||
POSTGRES_DB=amarback
|
||||
POSTGRES_USER=postgres
|
||||
POSTGRES_PASSWORD=localdev123
|
||||
|
||||
# =============================================================================
|
||||
# DJANGO
|
||||
# =============================================================================
|
||||
SECRET_KEY=local-dev-key
|
||||
DEBUG=True
|
||||
DJANGO_ENV=development
|
||||
ALLOWED_HOSTS=*
|
||||
|
||||
# =============================================================================
|
||||
# CORS
|
||||
# =============================================================================
|
||||
CORS_ALLOW_ALL=true
|
||||
CORS_ALLOWED_ORIGINS=
|
||||
|
||||
# =============================================================================
|
||||
# GOOGLE SERVICES
|
||||
# =============================================================================
|
||||
SUBJECT_CALENDAR=
|
||||
SHEET_ID=
|
||||
RANGE_NAME=
|
||||
GOOGLE_MAPS_API_KEY=
|
||||
|
||||
# =============================================================================
|
||||
# ANALYTICS
|
||||
# =============================================================================
|
||||
GA4_MEASUREMENT_ID=
|
||||
AMPLITUDE_API_KEY=
|
||||
HOTJAR_API_KEY=
|
||||
|
||||
# =============================================================================
|
||||
# MERCADO PAGO
|
||||
# =============================================================================
|
||||
ACCESS_TOKEN_MERCADO_PAGO=
|
||||
MP_PLATFORM_ACCESS_TOKEN=
|
||||
USER_ID=
|
||||
|
||||
# =============================================================================
|
||||
# WEB PUSH
|
||||
# =============================================================================
|
||||
WEBPUSH_VAPID_PUBLIC_KEY=
|
||||
WEBPUSH_VAPID_PRIVATE_KEY=
|
||||
WEBPUSH_VAPID_ADMIN_EMAIL=
|
||||
|
||||
# =============================================================================
|
||||
# INIT
|
||||
# =============================================================================
|
||||
USER_PASSWORD=initial_admin_password
|
||||
|
||||
# =============================================================================
|
||||
# FRONTEND
|
||||
# =============================================================================
|
||||
NEXT_PUBLIC_APP_API_URL_BACKOFFICE=
|
||||
NEXT_PUBLIC_APP_API_URL_STAGE=
|
||||
NEXT_PUBLIC_IS_STAGE=false
|
||||
NEXT_PUBLIC_FB_PIXEL_ID=
|
||||
NEXT_PUBLIC_TAG_MANAGER=
|
||||
NEXT_PUBLIC_WHATSAPP_CONTACT=
|
||||
NEXT_PUBLIC_API_KEY=
|
||||
NEXT_PUBLIC_AMPLITUDE_API_KEY=
|
||||
NEXT_PUBLIC_GMAPS_API_KEY=
|
||||
71
cfg/amar/Dockerfile.backend
Normal file
71
cfg/amar/Dockerfile.backend
Normal file
@@ -0,0 +1,71 @@
|
||||
# =============================================================================
|
||||
# Dockerfile for Django Backend with Uvicorn
|
||||
# =============================================================================
|
||||
# Usage:
|
||||
# Development: WORKERS=1 RELOAD=--reload (source mounted, hot reload)
|
||||
# Production: WORKERS=4 RELOAD="" (no reload, multiple workers)
|
||||
|
||||
# =============================================================================
|
||||
# Stage 1: Base with system dependencies
|
||||
# =============================================================================
|
||||
FROM python:3.11-slim AS base
|
||||
|
||||
ENV PYTHONDONTWRITEBYTECODE=1
|
||||
ENV PYTHONUNBUFFERED=1
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Install system dependencies (cached layer)
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
build-essential \
|
||||
libpq-dev \
|
||||
gdal-bin \
|
||||
libgdal-dev \
|
||||
libgeos-dev \
|
||||
libproj-dev \
|
||||
postgresql-client \
|
||||
# WeasyPrint dependencies (for django-afip PDF generation)
|
||||
libglib2.0-0 \
|
||||
libpango-1.0-0 \
|
||||
libpangocairo-1.0-0 \
|
||||
libgdk-pixbuf-2.0-0 \
|
||||
libffi-dev \
|
||||
libcairo2 \
|
||||
libgirepository1.0-dev \
|
||||
gir1.2-pango-1.0 \
|
||||
fonts-dejavu-core \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# =============================================================================
|
||||
# Stage 2: Dependencies (cached layer)
|
||||
# =============================================================================
|
||||
FROM base AS deps
|
||||
|
||||
# Copy only requirements for dependency installation
|
||||
COPY requirements.txt .
|
||||
|
||||
# Install Python dependencies
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
|
||||
# =============================================================================
|
||||
# Stage 3: Runtime (uvicorn with configurable workers)
|
||||
# =============================================================================
|
||||
FROM base AS runtime
|
||||
|
||||
# Copy dependencies from deps stage
|
||||
COPY --from=deps /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
|
||||
COPY --from=deps /usr/local/bin /usr/local/bin
|
||||
|
||||
# Copy requirements (for reference)
|
||||
COPY requirements.txt .
|
||||
|
||||
# Create directories
|
||||
RUN mkdir -p /var/etc/static /app/media
|
||||
|
||||
# Note: Source code mounted at runtime for dev, copied for prod
|
||||
EXPOSE 8000
|
||||
|
||||
# Uvicorn with configurable workers and reload
|
||||
# Dev: WORKERS=1 RELOAD=--reload
|
||||
# Prod: WORKERS=4 RELOAD=""
|
||||
CMD uvicorn amar_django_back.asgi:application --host 0.0.0.0 --port 8000 --workers ${WORKERS:-1} ${RELOAD}
|
||||
80
cfg/amar/Dockerfile.frontend
Normal file
80
cfg/amar/Dockerfile.frontend
Normal file
@@ -0,0 +1,80 @@
|
||||
# =============================================================================
|
||||
# Multi-stage Dockerfile for Next.js Frontend
|
||||
# =============================================================================
|
||||
# Usage:
|
||||
# Development: docker compose up (mounts source, hot reload)
|
||||
# Production: docker compose -f docker-compose.yml -f docker-compose.prod.yml up
|
||||
|
||||
# =============================================================================
|
||||
# Stage 1: Dependencies (cached layer)
|
||||
# =============================================================================
|
||||
FROM node:18-alpine AS deps
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Copy only package files for dependency installation
|
||||
COPY package*.json ./
|
||||
|
||||
# Install ALL dependencies (including devDependencies for dev mode)
|
||||
RUN npm ci
|
||||
|
||||
# =============================================================================
|
||||
# Stage 2: Development (hot reload, source mounted)
|
||||
# =============================================================================
|
||||
FROM node:18-alpine AS development
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Copy dependencies from deps stage
|
||||
COPY --from=deps /app/node_modules ./node_modules
|
||||
|
||||
# Copy package files (for npm scripts)
|
||||
COPY package*.json ./
|
||||
|
||||
# Copy config files
|
||||
COPY next.config.js postcss.config.js tailwind.config.js tsconfig.json ./
|
||||
|
||||
# Note: src/ and public/ are mounted at runtime for hot reload
|
||||
# Start dev server
|
||||
EXPOSE 3000
|
||||
CMD ["npm", "run", "dev"]
|
||||
|
||||
# =============================================================================
|
||||
# Stage 3: Builder (compile for production)
|
||||
# =============================================================================
|
||||
FROM node:18-alpine AS builder
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Copy dependencies
|
||||
COPY --from=deps /app/node_modules ./node_modules
|
||||
|
||||
# Copy all source files
|
||||
COPY . .
|
||||
|
||||
# Build for production
|
||||
RUN npm run build
|
||||
|
||||
# =============================================================================
|
||||
# Stage 4: Production (optimized, minimal)
|
||||
# =============================================================================
|
||||
FROM node:18-alpine AS production
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
ENV NODE_ENV=production
|
||||
|
||||
# Copy only production dependencies
|
||||
COPY package*.json ./
|
||||
RUN npm ci --only=production && npm cache clean --force
|
||||
|
||||
# Copy built application from builder
|
||||
COPY --from=builder /app/.next ./.next
|
||||
COPY --from=builder /app/public ./public
|
||||
COPY --from=builder /app/next.config.js ./
|
||||
|
||||
EXPOSE 3000
|
||||
|
||||
USER node
|
||||
|
||||
CMD ["npm", "run", "start"]
|
||||
33
cfg/amar/ctrl/logs.sh
Executable file
33
cfg/amar/ctrl/logs.sh
Executable file
@@ -0,0 +1,33 @@
|
||||
#!/bin/bash
|
||||
# View amar room logs
|
||||
#
|
||||
# Usage:
|
||||
# ./logs.sh # All logs (tail)
|
||||
# ./logs.sh -f # Follow mode
|
||||
# ./logs.sh backend # Specific container
|
||||
# ./logs.sh soleprint # Soleprint logs
|
||||
|
||||
set -e
|
||||
cd "$(dirname "$0")/.."
|
||||
|
||||
FOLLOW=""
|
||||
TARGET=""
|
||||
|
||||
for arg in "$@"; do
|
||||
case $arg in
|
||||
-f|--follow) FOLLOW="-f" ;;
|
||||
*) TARGET="$arg" ;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ -z "$TARGET" ]; then
|
||||
echo "=== Amar ==="
|
||||
docker compose logs --tail=20 $FOLLOW
|
||||
echo ""
|
||||
echo "=== Soleprint ==="
|
||||
(cd soleprint && docker compose logs --tail=20 $FOLLOW)
|
||||
elif [ "$TARGET" = "soleprint" ]; then
|
||||
(cd soleprint && docker compose logs $FOLLOW)
|
||||
else
|
||||
docker logs $FOLLOW "amar_$TARGET" 2>/dev/null || docker logs $FOLLOW "$TARGET"
|
||||
fi
|
||||
40
cfg/amar/ctrl/start.sh
Executable file
40
cfg/amar/ctrl/start.sh
Executable file
@@ -0,0 +1,40 @@
|
||||
#!/bin/bash
|
||||
# Start amar room (managed app + soleprint)
|
||||
#
|
||||
# Usage:
|
||||
# ./start.sh # Start all (foreground)
|
||||
# ./start.sh -d # Start all (detached)
|
||||
# ./start.sh amar # Start only amar
|
||||
# ./start.sh soleprint # Start only soleprint
|
||||
# ./start.sh --build # Rebuild images
|
||||
|
||||
set -e
|
||||
cd "$(dirname "$0")/.."
|
||||
|
||||
BUILD=""
|
||||
DETACH=""
|
||||
TARGET="all"
|
||||
|
||||
for arg in "$@"; do
|
||||
case $arg in
|
||||
-d|--detached) DETACH="-d" ;;
|
||||
--build) BUILD="--build" ;;
|
||||
amar) TARGET="amar" ;;
|
||||
soleprint) TARGET="soleprint" ;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ "$TARGET" = "all" ] || [ "$TARGET" = "amar" ]; then
|
||||
echo "Starting amar..."
|
||||
docker compose up $DETACH $BUILD
|
||||
fi
|
||||
|
||||
if [ "$TARGET" = "all" ] || [ "$TARGET" = "soleprint" ]; then
|
||||
echo "Starting soleprint..."
|
||||
(cd soleprint && docker compose up $DETACH $BUILD)
|
||||
fi
|
||||
|
||||
if [ -n "$DETACH" ]; then
|
||||
echo ""
|
||||
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | grep -E "(amar|soleprint|NAMES)"
|
||||
fi
|
||||
7
cfg/amar/ctrl/status.sh
Executable file
7
cfg/amar/ctrl/status.sh
Executable file
@@ -0,0 +1,7 @@
|
||||
#!/bin/bash
|
||||
# Show amar room status
|
||||
|
||||
cd "$(dirname "$0")/.."
|
||||
|
||||
echo "=== Containers ==="
|
||||
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | grep -E "(amar|soleprint|NAMES)" || echo "No containers running"
|
||||
25
cfg/amar/ctrl/stop.sh
Executable file
25
cfg/amar/ctrl/stop.sh
Executable file
@@ -0,0 +1,25 @@
|
||||
#!/bin/bash
|
||||
# Stop amar room (managed app + soleprint)
|
||||
#
|
||||
# Usage:
|
||||
# ./stop.sh # Stop all
|
||||
# ./stop.sh amar # Stop only amar
|
||||
# ./stop.sh soleprint # Stop only soleprint
|
||||
|
||||
set -e
|
||||
cd "$(dirname "$0")/.."
|
||||
|
||||
TARGET="all"
|
||||
[ -n "$1" ] && TARGET="$1"
|
||||
|
||||
if [ "$TARGET" = "all" ] || [ "$TARGET" = "soleprint" ]; then
|
||||
echo "Stopping soleprint..."
|
||||
(cd soleprint && docker compose down)
|
||||
fi
|
||||
|
||||
if [ "$TARGET" = "all" ] || [ "$TARGET" = "amar" ]; then
|
||||
echo "Stopping amar..."
|
||||
docker compose down
|
||||
fi
|
||||
|
||||
echo "Done."
|
||||
117
cfg/amar/ctrl/xtras/reload-db.sh
Executable file
117
cfg/amar/ctrl/xtras/reload-db.sh
Executable file
@@ -0,0 +1,117 @@
|
||||
#!/bin/bash
|
||||
# Smart database reload - only swaps if DB_DUMP changed
|
||||
#
|
||||
# Tracks which dump is currently loaded and only reloads if different.
|
||||
# Edit DB_DUMP in .env and run this script - it handles the rest.
|
||||
#
|
||||
# Usage:
|
||||
# ./reload-db.sh # Reload if DB_DUMP changed
|
||||
# ./reload-db.sh --force # Force reload even if same
|
||||
|
||||
set -e
|
||||
|
||||
cd "$(dirname "$0")/../.."
|
||||
|
||||
FORCE=false
|
||||
if [ "$1" = "--force" ]; then
|
||||
FORCE=true
|
||||
fi
|
||||
|
||||
# Get config from .env
|
||||
DEPLOYMENT_NAME=$(grep "^DEPLOYMENT_NAME=" .env 2>/dev/null | cut -d'=' -f2 || echo "amar")
|
||||
POSTGRES_DB=$(grep "^POSTGRES_DB=" .env 2>/dev/null | cut -d'=' -f2 || echo "amarback")
|
||||
POSTGRES_USER=$(grep "^POSTGRES_USER=" .env 2>/dev/null | cut -d'=' -f2 || echo "postgres")
|
||||
DB_DUMP=$(grep "^DB_DUMP=" .env 2>/dev/null | cut -d'=' -f2)
|
||||
|
||||
if [ -z "$DB_DUMP" ]; then
|
||||
echo "Error: DB_DUMP not set in .env"
|
||||
echo ""
|
||||
echo "Add to .env:"
|
||||
echo " DB_DUMP=dev.sql"
|
||||
echo ""
|
||||
echo "Available dumps:"
|
||||
ls -1 dumps/*.sql 2>/dev/null | sed 's/dumps\// /' || echo " No dumps found in dumps/"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DUMP_FILE="dumps/${DB_DUMP}"
|
||||
if [ ! -f "$DUMP_FILE" ]; then
|
||||
echo "Error: Dump file not found: $DUMP_FILE"
|
||||
echo ""
|
||||
echo "Available dumps:"
|
||||
ls -1 dumps/*.sql 2>/dev/null | sed 's/dumps\// /' || echo " No dumps found in dumps/"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DB_CONTAINER="${DEPLOYMENT_NAME}_db"
|
||||
BACKEND_CONTAINER="${DEPLOYMENT_NAME}_backend"
|
||||
STATE_FILE=".db_state"
|
||||
|
||||
# Check if db container is running
|
||||
if ! docker ps --format "{{.Names}}" | grep -q "^${DB_CONTAINER}$"; then
|
||||
echo "Error: Database container not running: $DB_CONTAINER"
|
||||
echo "Start services first with: ./ctrl/start.sh -d"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check current state
|
||||
if [ -f "$STATE_FILE" ] && [ "$FORCE" = false ]; then
|
||||
CURRENT_DUMP=$(cat "$STATE_FILE")
|
||||
if [ "$CURRENT_DUMP" = "$DB_DUMP" ]; then
|
||||
echo "Database already loaded with: $DB_DUMP"
|
||||
echo "Use --force to reload anyway"
|
||||
exit 0
|
||||
fi
|
||||
echo "Database dump changed: $CURRENT_DUMP → $DB_DUMP"
|
||||
else
|
||||
if [ "$FORCE" = true ]; then
|
||||
echo "Force reloading database with: $DB_DUMP"
|
||||
else
|
||||
echo "Loading database with: $DB_DUMP"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
read -p "Continue with database reload? (y/N) " -n 1 -r
|
||||
echo ""
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
echo "Cancelled."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "[1/5] Stopping backend and celery services..."
|
||||
docker compose stop backend celery celery-beat 2>/dev/null || true
|
||||
|
||||
echo ""
|
||||
echo "[2/5] Dropping and recreating database..."
|
||||
docker exec "$DB_CONTAINER" psql -U "$POSTGRES_USER" -d postgres -c "DROP DATABASE IF EXISTS $POSTGRES_DB WITH (FORCE);"
|
||||
docker exec "$DB_CONTAINER" psql -U "$POSTGRES_USER" -d postgres -c "CREATE DATABASE $POSTGRES_DB;"
|
||||
docker exec "$DB_CONTAINER" psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" -c "CREATE EXTENSION IF NOT EXISTS postgis_topology;"
|
||||
|
||||
echo ""
|
||||
echo "[3/5] Loading dump: $DB_DUMP..."
|
||||
docker exec -i "$DB_CONTAINER" psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" < "$DUMP_FILE"
|
||||
|
||||
echo ""
|
||||
echo "[4/5] Restarting services and running migrations..."
|
||||
docker compose start backend celery celery-beat
|
||||
|
||||
echo "Waiting for backend to start..."
|
||||
sleep 3
|
||||
|
||||
echo "Running migrations..."
|
||||
docker exec "$BACKEND_CONTAINER" python manage.py migrate --noinput
|
||||
|
||||
echo ""
|
||||
echo "[5/5] Updating state..."
|
||||
echo "$DB_DUMP" > "$STATE_FILE"
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo " Database Reloaded Successfully"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
echo "Current dump: $DB_DUMP"
|
||||
echo "Database: $POSTGRES_DB"
|
||||
echo ""
|
||||
159267
cfg/amar/dumps/dev.sql
Normal file
159267
cfg/amar/dumps/dev.sql
Normal file
File diff suppressed because it is too large
Load Diff
35
cfg/amar/soleprint/.env
Normal file
35
cfg/amar/soleprint/.env
Normal file
@@ -0,0 +1,35 @@
|
||||
# =============================================================================
|
||||
# SOLEPRINT - Amar Room Configuration
|
||||
# =============================================================================
|
||||
|
||||
# =============================================================================
|
||||
# DEPLOYMENT
|
||||
# =============================================================================
|
||||
DEPLOYMENT_NAME=amar_soleprint
|
||||
|
||||
# =============================================================================
|
||||
# NETWORK (shared with amar)
|
||||
# =============================================================================
|
||||
NETWORK_NAME=soleprint_network
|
||||
|
||||
# =============================================================================
|
||||
# PATHS
|
||||
# =============================================================================
|
||||
SOLEPRINT_BARE_PATH=/home/mariano/wdir/spr/gen
|
||||
|
||||
# =============================================================================
|
||||
# PORTS
|
||||
# =============================================================================
|
||||
SOLEPRINT_PORT=12000
|
||||
ARTERY_PORT=12001
|
||||
ATLAS_PORT=12002
|
||||
STATION_PORT=12003
|
||||
|
||||
# =============================================================================
|
||||
# DATABASE (amar's DB for station tools)
|
||||
# =============================================================================
|
||||
DB_HOST=amar_db
|
||||
DB_PORT=5432
|
||||
DB_NAME=amarback
|
||||
DB_USER=postgres
|
||||
DB_PASSWORD=localdev123
|
||||
34
cfg/amar/soleprint/docker-compose.yml
Normal file
34
cfg/amar/soleprint/docker-compose.yml
Normal file
@@ -0,0 +1,34 @@
|
||||
# Soleprint Services - Docker Compose
|
||||
#
|
||||
# Runs soleprint hub as a single service
|
||||
# Artery, atlas, station are accessed via path-based routing
|
||||
#
|
||||
# Usage:
|
||||
# cd mainroom/soleprint && docker compose up -d
|
||||
|
||||
services:
|
||||
soleprint:
|
||||
build:
|
||||
context: ${SOLEPRINT_BARE_PATH}
|
||||
dockerfile: Dockerfile
|
||||
container_name: ${DEPLOYMENT_NAME}_soleprint
|
||||
volumes:
|
||||
- ${SOLEPRINT_BARE_PATH}:/app
|
||||
ports:
|
||||
- "${SOLEPRINT_PORT}:8000"
|
||||
env_file:
|
||||
- .env
|
||||
environment:
|
||||
# For single-port mode, all subsystems are internal routes
|
||||
- ARTERY_EXTERNAL_URL=/artery
|
||||
- ATLAS_EXTERNAL_URL=/atlas
|
||||
- STATION_EXTERNAL_URL=/station
|
||||
networks:
|
||||
- default
|
||||
# Use run.py for single-port bare-metal mode
|
||||
command: uvicorn run:app --host 0.0.0.0 --port 8000 --reload
|
||||
|
||||
networks:
|
||||
default:
|
||||
external: true
|
||||
name: ${NETWORK_NAME}
|
||||
Reference in New Issue
Block a user