furniture-3d-system-Wu/furniture-3d-system/scripts/install-supply-chain-product-archive-sync-timer.sh

82 lines
2.8 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
BASE="${FURNITURE_PROD_BASE:-/opt/furniture-3d-system-prod}"
SERVICE_NAME="${SUPPLY_CHAIN_ARCHIVE_SYNC_SERVICE_NAME:-furniture-supply-chain-product-archive-sync}"
APP_ROOT="$BASE/current/furniture-3d-system"
SHARED="$BASE/shared"
APP_ENV="$SHARED/.env"
SYNC_ENV="$SHARED/supply-chain-product-archive-sync.env"
SERVICE_FILE="/etc/systemd/system/$SERVICE_NAME.service"
TIMER_FILE="/etc/systemd/system/$SERVICE_NAME.timer"
SYNC_ON_BOOT_SEC="${SUPPLY_CHAIN_ARCHIVE_SYNC_ON_BOOT_SEC:-3min}"
SYNC_INTERVAL="${SUPPLY_CHAIN_ARCHIVE_SYNC_INTERVAL:-15min}"
if [ "$(id -u)" -ne 0 ]; then
echo "This installer must run as root." >&2
exit 1
fi
if [ ! -d "$APP_ROOT" ]; then
echo "Missing app root: $APP_ROOT" >&2
exit 1
fi
if [ ! -f "$APP_ENV" ]; then
echo "Missing app env: $APP_ENV" >&2
exit 1
fi
mkdir -p "$SHARED"
if [ ! -f "$SYNC_ENV" ]; then
umask 077
cat >"$SYNC_ENV" <<'EOF'
# Product archive source sync guard identities.
# Fill these values on the production server. Do not commit secrets to Git.
SUPPLY_CHAIN_ARCHIVE_EXPECTED_DATABASE_IDENTITY=
SUPPLY_CHAIN_ARCHIVE_EXPECTED_SOURCE_DATABASE_IDENTITY=
SUPPLY_CHAIN_ARCHIVE_ENRICHMENT_BATCH_SIZE=200
SUPPLY_CHAIN_ARCHIVE_JST_BATCH_SIZE=500
SUPPLY_CHAIN_ARCHIVE_JST_CONCURRENCY=8
EOF
echo "Created env template: $SYNC_ENV"
fi
chmod 600 "$SYNC_ENV"
cat >"$SERVICE_FILE" <<EOF
[Unit]
Description=Sync product archive from JST and supply-chain source tables
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
WorkingDirectory=$APP_ROOT
Environment=NODE_ENV=production
EnvironmentFile=$APP_ENV
EnvironmentFile=$SYNC_ENV
ExecStart=/bin/bash -lc 'set -euo pipefail; cd "$APP_ROOT"; ./node_modules/.bin/tsx scripts/sync-supply-chain-product-archive-enrichment.ts --apply --sync-jst-base --confirm=sync-supply-chain-product-archive-enrichment --expected-database-identity="\${SUPPLY_CHAIN_ARCHIVE_EXPECTED_DATABASE_IDENTITY:?Set SUPPLY_CHAIN_ARCHIVE_EXPECTED_DATABASE_IDENTITY in $SYNC_ENV}" --expected-source-database-identity="\${SUPPLY_CHAIN_ARCHIVE_EXPECTED_SOURCE_DATABASE_IDENTITY:?Set SUPPLY_CHAIN_ARCHIVE_EXPECTED_SOURCE_DATABASE_IDENTITY in $SYNC_ENV}" --batch-size="\${SUPPLY_CHAIN_ARCHIVE_ENRICHMENT_BATCH_SIZE:-200}" --jst-batch-size="\${SUPPLY_CHAIN_ARCHIVE_JST_BATCH_SIZE:-500}" --jst-concurrency="\${SUPPLY_CHAIN_ARCHIVE_JST_CONCURRENCY:-8}"'
StandardOutput=journal
StandardError=journal
EOF
cat >"$TIMER_FILE" <<EOF
[Unit]
Description=Sync product archive source tables every 15 minutes
[Timer]
OnBootSec=$SYNC_ON_BOOT_SEC
OnUnitActiveSec=$SYNC_INTERVAL
Persistent=true
RandomizedDelaySec=60
Unit=$SERVICE_NAME.service
[Install]
WantedBy=timers.target
EOF
systemctl daemon-reload
systemctl enable --now "$SERVICE_NAME.timer"
systemctl list-timers --all "$SERVICE_NAME.timer" --no-pager