You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
2.1 KiB
81 lines
2.1 KiB
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
APP_DIR="${APP_DIR:-/opt/hw}"
|
|
CONFIG_DIR="${CONFIG_DIR:-/opt/hw.conf.d}"
|
|
ENV_FILE="${ENV_FILE:-$CONFIG_DIR/hw.env}"
|
|
CONTAINER_NAME="${CONTAINER_NAME:-hw}"
|
|
IMAGE_NAME="${IMAGE_NAME:-hw}"
|
|
IMAGE_TAG="${IMAGE_TAG:-py313}"
|
|
APP_PORT="${APP_PORT:-8000}"
|
|
RUN_SEED_ALL="${RUN_SEED_ALL:-0}"
|
|
HOST_PORT="${HOST_PORT:-8000}"
|
|
ALLOW_NON_ROOT="${ALLOW_NON_ROOT:-0}"
|
|
CONTAINER_UID="${CONTAINER_UID:-10001}"
|
|
CONTAINER_GID="${CONTAINER_GID:-10001}"
|
|
|
|
require_root() {
|
|
if [[ "$ALLOW_NON_ROOT" == "1" ]]; then
|
|
return
|
|
fi
|
|
if [[ "${EUID}" -ne 0 ]]; then
|
|
printf 'Please run this script as root.\n' >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
require_file() {
|
|
local path="$1"
|
|
if [[ ! -f "$path" ]]; then
|
|
printf 'Required file not found: %s\n' "$path" >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
require_docker_daemon() {
|
|
if ! docker info >/dev/null 2>&1; then
|
|
printf 'Docker daemon is not available. Please start Docker and re-run this script.\n' >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
main() {
|
|
require_root
|
|
require_file "$ENV_FILE"
|
|
require_file "$APP_DIR/Dockerfile"
|
|
require_file "$APP_DIR/run.py"
|
|
require_docker_daemon
|
|
|
|
install -d -m 755 "$APP_DIR/instance"
|
|
install -d -m 755 "$APP_DIR/instance/csv_previews"
|
|
|
|
if [[ "$ALLOW_NON_ROOT" == "1" ]]; then
|
|
chown -R "$CONTAINER_UID:$CONTAINER_GID" "$APP_DIR/instance" >/dev/null 2>&1 || true
|
|
else
|
|
chown -R "$CONTAINER_UID:$CONTAINER_GID" "$APP_DIR/instance"
|
|
fi
|
|
|
|
docker build -t "${IMAGE_NAME}:${IMAGE_TAG}" "$APP_DIR"
|
|
|
|
if docker ps -a --format '{{.Names}}' | grep -Fxq "$CONTAINER_NAME"; then
|
|
docker rm -f "$CONTAINER_NAME" >/dev/null
|
|
fi
|
|
|
|
docker run -d \
|
|
--name "$CONTAINER_NAME" \
|
|
--env-file "$ENV_FILE" \
|
|
-e RUN_SEED_ALL="$RUN_SEED_ALL" \
|
|
-e HW_GUNICORN_PORT="$APP_PORT" \
|
|
-p "$HOST_PORT:$APP_PORT" \
|
|
-v "$APP_DIR/instance:/opt/hw/instance" \
|
|
-v "$CONFIG_DIR:/opt/hw.conf.d:ro" \
|
|
--restart unless-stopped \
|
|
"${IMAGE_NAME}:${IMAGE_TAG}"
|
|
|
|
printf 'Container deployment completed.\n'
|
|
printf 'Container: %s\n' "$CONTAINER_NAME"
|
|
printf 'Image: %s:%s\n' "$IMAGE_NAME" "$IMAGE_TAG"
|
|
printf 'Published port: %s -> %s\n' "$HOST_PORT" "$APP_PORT"
|
|
}
|
|
|
|
main "$@"
|
|
|