feat: add deployment configuration and scripts for managed-portal, including Dockerfiles and environment settings
This commit is contained in:
4
deploy/Dockerfile.runtime-overlay
Normal file
4
deploy/Dockerfile.runtime-overlay
Normal file
@@ -0,0 +1,4 @@
|
||||
ARG BASE_IMAGE
|
||||
FROM ${BASE_IMAGE}
|
||||
|
||||
COPY rootfs/ /
|
||||
75
deploy/docker-compose.ota-release.yml
Normal file
75
deploy/docker-compose.ota-release.yml
Normal file
@@ -0,0 +1,75 @@
|
||||
name: managed-portal
|
||||
|
||||
services:
|
||||
managed-portal:
|
||||
image: ${MANAGED_PORTAL_IMAGE:?MANAGED_PORTAL_IMAGE is required}
|
||||
container_name: managed-portal
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
- store-dwell-alert
|
||||
- people-flow-project
|
||||
environment:
|
||||
TZ: ${TZ:-Asia/Shanghai}
|
||||
MANAGED_PORTAL_HTTP_ADDR: ":9080"
|
||||
MANAGED_PORTAL_REGISTRY_PATH: "/app/managed_services.yaml"
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
networks:
|
||||
- managed-portal
|
||||
|
||||
store-dwell-alert:
|
||||
image: ${STORE_DWELL_ALERT_IMAGE:?STORE_DWELL_ALERT_IMAGE is required}
|
||||
container_name: store-dwell-alert
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
TZ: ${TZ:-Asia/Shanghai}
|
||||
CAMERA_ID: ${MANAGED_STORE_DWELL_CAMERA_ID:-store_cam_01}
|
||||
RTSP_URL: ${MANAGED_STORE_DWELL_RTSP_URL:-}
|
||||
EVENT_SINK_PATH: ${MANAGED_STORE_DWELL_EVENT_SINK_PATH:-logs/events.jsonl}
|
||||
API_HOST: 0.0.0.0
|
||||
API_PORT: 18081
|
||||
CONFIG_PATH: /app/config/local.yaml
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway"
|
||||
volumes:
|
||||
- ${MANAGED_STORE_DWELL_CONFIG_DIR:-../managed/store_dwell_alert/config}:/app/config
|
||||
- ${MANAGED_STORE_DWELL_DATA_DIR:-../managed/store_dwell_alert/data}:/app/data
|
||||
networks:
|
||||
- managed-portal
|
||||
|
||||
people-flow-project:
|
||||
image: ${PEOPLE_FLOW_PROJECT_IMAGE:?PEOPLE_FLOW_PROJECT_IMAGE is required}
|
||||
container_name: people-flow-project
|
||||
restart: unless-stopped
|
||||
gpus: all
|
||||
shm_size: "1gb"
|
||||
environment:
|
||||
TZ: ${TZ:-Asia/Shanghai}
|
||||
CONFIG_PATH: /opt/people-flow/config/local.yaml
|
||||
RTSP_URL: ${MANAGED_PEOPLE_FLOW_RTSP_URL:-}
|
||||
OUTPUT_DIR: /opt/people-flow/outputs
|
||||
API_HOST: 0.0.0.0
|
||||
API_PORT: 18082
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway"
|
||||
volumes:
|
||||
- ${MANAGED_PEOPLE_FLOW_CONFIG_DIR:-../managed/people_flow_project/config}:/opt/people-flow/config
|
||||
- ${MANAGED_PEOPLE_FLOW_OUTPUT_DIR:-../managed/people_flow_project/outputs}:/opt/people-flow/outputs
|
||||
- ${MANAGED_PEOPLE_FLOW_WEIGHTS_DIR:-../managed/people_flow_project/weights}:/opt/people-flow/weights
|
||||
networks:
|
||||
- managed-portal
|
||||
|
||||
managed-portal-web:
|
||||
image: ${MANAGED_PORTAL_WEB_IMAGE:?MANAGED_PORTAL_WEB_IMAGE is required}
|
||||
container_name: managed-portal-web
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
- managed-portal
|
||||
ports:
|
||||
- "${MANAGED_PORTAL_WEB_PORT:-13000}:80"
|
||||
networks:
|
||||
- managed-portal
|
||||
|
||||
networks:
|
||||
managed-portal:
|
||||
driver: bridge
|
||||
@@ -66,6 +66,7 @@ services:
|
||||
volumes:
|
||||
- ${MANAGED_PEOPLE_FLOW_CONFIG_DIR:-../managed/people_flow_project/config}:/opt/people-flow/config
|
||||
- ${MANAGED_PEOPLE_FLOW_OUTPUT_DIR:-../managed/people_flow_project/outputs}:/opt/people-flow/outputs
|
||||
- ${MANAGED_PEOPLE_FLOW_WEIGHTS_DIR:-../managed/people_flow_project/weights}:/opt/people-flow/weights
|
||||
networks:
|
||||
- managed-portal
|
||||
|
||||
|
||||
111
deploy/install-managed-portal-ota.sh
Normal file
111
deploy/install-managed-portal-ota.sh
Normal file
@@ -0,0 +1,111 @@
|
||||
#!/usr/bin/env sh
|
||||
set -eu
|
||||
|
||||
RELEASE_VERSION="${RELEASE_VERSION:-20260513-330373b-11}"
|
||||
BASE_URL="${BASE_URL:-http://10.8.0.1/ai_deploy}"
|
||||
BUNDLE_NAME="${BUNDLE_NAME:-managed-portal-${RELEASE_VERSION}.zip}"
|
||||
INSTALL_ROOT="${INSTALL_ROOT:-/opt/managed-portal-releases}"
|
||||
TARGET_DIR="${TARGET_DIR:-${INSTALL_ROOT}/managed-portal-${RELEASE_VERSION}}"
|
||||
|
||||
require_command() {
|
||||
if ! command -v "$1" >/dev/null 2>&1; then
|
||||
echo "missing required command: $1" >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
run_compose() {
|
||||
if command -v docker-compose >/dev/null 2>&1; then
|
||||
docker-compose "$@"
|
||||
return 0
|
||||
fi
|
||||
docker compose "$@"
|
||||
}
|
||||
|
||||
download_bundle() {
|
||||
tmp_dir="$1"
|
||||
bundle_zip="$tmp_dir/$BUNDLE_NAME"
|
||||
bundle_url="${BASE_URL%/}/$BUNDLE_NAME"
|
||||
|
||||
echo "downloading $bundle_url" >&2
|
||||
curl -fL "$bundle_url" -o "$bundle_zip"
|
||||
echo "$bundle_zip"
|
||||
}
|
||||
|
||||
build_overlay_image() {
|
||||
overlay_name="$1"
|
||||
base_image="$2"
|
||||
overlay_root="$3"
|
||||
overlay_image="$4"
|
||||
overlay_context="$(dirname "$overlay_root")"
|
||||
|
||||
if [ ! -d "$overlay_root" ]; then
|
||||
printf '%s\n' "$base_image"
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [ -z "$(find "$overlay_root" -mindepth 1 -print -quit)" ]; then
|
||||
printf '%s\n' "$base_image"
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo "building runtime overlay for $overlay_name" >&2
|
||||
docker build \
|
||||
-f "$TARGET_DIR/deploy/Dockerfile.runtime-overlay" \
|
||||
--build-arg "BASE_IMAGE=$base_image" \
|
||||
-t "$overlay_image" \
|
||||
"$overlay_context" >/dev/null
|
||||
printf '%s\n' "$overlay_image"
|
||||
}
|
||||
|
||||
require_command curl
|
||||
require_command unzip
|
||||
require_command docker
|
||||
|
||||
tmp_dir="$(mktemp -d)"
|
||||
trap 'rm -rf "$tmp_dir"' EXIT INT TERM
|
||||
|
||||
mkdir -p "$INSTALL_ROOT"
|
||||
bundle_zip="$(download_bundle "$tmp_dir")"
|
||||
rm -rf "$TARGET_DIR"
|
||||
unzip -oq "$bundle_zip" -d "$INSTALL_ROOT"
|
||||
|
||||
if [ ! -f "$TARGET_DIR/release-manifest.env" ]; then
|
||||
echo "release-manifest.env not found in $TARGET_DIR" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
set -a
|
||||
. "$TARGET_DIR/release-manifest.env"
|
||||
set +a
|
||||
|
||||
echo "pulling release images"
|
||||
docker pull "$MANAGED_PORTAL_IMAGE"
|
||||
docker pull "$MANAGED_PORTAL_WEB_IMAGE"
|
||||
docker pull "$PEOPLE_FLOW_PROJECT_IMAGE"
|
||||
docker pull "$STORE_DWELL_ALERT_IMAGE"
|
||||
|
||||
PEOPLE_FLOW_PROJECT_IMAGE="$(build_overlay_image \
|
||||
people-flow-project \
|
||||
"$PEOPLE_FLOW_PROJECT_IMAGE" \
|
||||
"$TARGET_DIR/runtime-overlays/people-flow-project/rootfs" \
|
||||
"managed-portal-runtime/people-flow-project:${RELEASE_VERSION}")"
|
||||
|
||||
STORE_DWELL_ALERT_IMAGE="$(build_overlay_image \
|
||||
store-dwell-alert \
|
||||
"$STORE_DWELL_ALERT_IMAGE" \
|
||||
"$TARGET_DIR/runtime-overlays/store-dwell-alert/rootfs" \
|
||||
"managed-portal-runtime/store-dwell-alert:${RELEASE_VERSION}")"
|
||||
|
||||
export MANAGED_PORTAL_IMAGE
|
||||
export MANAGED_PORTAL_WEB_IMAGE
|
||||
export PEOPLE_FLOW_PROJECT_IMAGE
|
||||
export STORE_DWELL_ALERT_IMAGE
|
||||
|
||||
cd "$TARGET_DIR/deploy"
|
||||
run_compose \
|
||||
--env-file managed-portal.release.env \
|
||||
-f docker-compose.ota-release.yml \
|
||||
up -d
|
||||
|
||||
echo "release installed under $TARGET_DIR"
|
||||
14
deploy/managed-portal.10.8.0.12.env
Normal file
14
deploy/managed-portal.10.8.0.12.env
Normal file
@@ -0,0 +1,14 @@
|
||||
IMAGE_VERSION=dev
|
||||
TZ=Asia/Shanghai
|
||||
MANAGED_PORTAL_WEB_PORT=13000
|
||||
|
||||
MANAGED_STORE_DWELL_CAMERA_ID=cam_192_168_1_10
|
||||
MANAGED_STORE_DWELL_RTSP_URL=rtsp://admin:Zxjp2026@192.168.1.10:554/Streaming/Channels/101
|
||||
MANAGED_STORE_DWELL_EVENT_SINK_PATH=logs/events.jsonl
|
||||
MANAGED_STORE_DWELL_CONFIG_DIR=../managed/store_dwell_alert/config
|
||||
MANAGED_STORE_DWELL_DATA_DIR=../managed/store_dwell_alert/data
|
||||
|
||||
MANAGED_PEOPLE_FLOW_RTSP_URL=rtsp://admin:Zxjp2026@192.168.1.10:554/Streaming/Channels/101
|
||||
MANAGED_PEOPLE_FLOW_CONFIG_DIR=../managed/people_flow_project/config
|
||||
MANAGED_PEOPLE_FLOW_OUTPUT_DIR=../managed/people_flow_project/outputs
|
||||
MANAGED_PEOPLE_FLOW_WEIGHTS_DIR=/home/xiaozheng/people_flow_project/weights
|
||||
Reference in New Issue
Block a user