- 新增 ProductInventorySnapshot / ProductInventorySnapshotRun 模型与正式迁移(条码×实际仓库) - 同步任务复用现有库存/云仓/档案读取,临时表+事务原子替换,advisory lock 防重叠,失败保留上一份快照 - 新增 15 分钟 systemd timer 安装脚本与同步脚本(身份校验、凭据走环境变量) - 列表/导出接口改读快照并展示 syncedAt,保留全零行过滤与导出字段选择
64 lines
2.2 KiB
Bash
64 lines
2.2 KiB
Bash
#!/usr/bin/env bash
|
||
set -euo pipefail
|
||
|
||
BASE="${FURNITURE_PROD_BASE:-/opt/furniture-3d-system-prod}"
|
||
APP_ROOT="$BASE/current/furniture-3d-system"
|
||
SERVICE_NAME="${PRODUCT_INVENTORY_SNAPSHOT_SERVICE_NAME:-furniture-product-inventory-snapshot}"
|
||
SYNC_ENV="$BASE/shared/product-inventory-snapshot.env"
|
||
CALENDAR="${PRODUCT_INVENTORY_SNAPSHOT_CALENDAR:-*:0/15}"
|
||
|
||
if [ "$(id -u)" -ne 0 ]; then
|
||
echo "This installer requires root." >&2
|
||
exit 1
|
||
fi
|
||
if [ ! -f "$APP_ROOT/scripts/sync-product-inventory-snapshot.ts" ]; then
|
||
echo "Missing deployed snapshot script: $APP_ROOT/scripts/sync-product-inventory-snapshot.ts" >&2
|
||
exit 1
|
||
fi
|
||
|
||
if [ ! -f "$SYNC_ENV" ]; then
|
||
umask 077
|
||
cat >"$SYNC_ENV" <<EOF
|
||
# 商品库存管理 · 15 分钟库存快照
|
||
# 身份校验值必须填生产实际值,否则同步脚本拒绝写入。
|
||
# 取值方式:node_modules/.bin/tsx -e "import {loadEnvConfig} from '@next/env';loadEnvConfig(process.cwd());console.log(process.env.DATABASE_URL)"
|
||
PRODUCT_INVENTORY_SNAPSHOT_EXPECTED_DATABASE_IDENTITY=
|
||
PRODUCT_INVENTORY_SNAPSHOT_EXPECTED_SOURCE_DATABASE_IDENTITY=
|
||
EOF
|
||
echo "Created env template: $SYNC_ENV"
|
||
fi
|
||
|
||
chmod 600 "$SYNC_ENV"
|
||
|
||
cat >"/etc/systemd/system/$SERVICE_NAME.service" <<EOF
|
||
[Unit]
|
||
Description=Materialize product inventory snapshot
|
||
After=network-online.target
|
||
Wants=network-online.target
|
||
[Service]
|
||
Type=oneshot
|
||
WorkingDirectory=$APP_ROOT
|
||
Environment=NODE_ENV=production
|
||
EnvironmentFile=$BASE/shared/.env
|
||
EnvironmentFile=$SYNC_ENV
|
||
ExecStart=/bin/bash -lc 'exec ./node_modules/.bin/tsx scripts/sync-product-inventory-snapshot.ts --apply --confirm=sync-product-inventory-snapshot --expected-database-identity="\${PRODUCT_INVENTORY_SNAPSHOT_EXPECTED_DATABASE_IDENTITY:?Missing expected local identity}" --expected-source-database-identity="\${PRODUCT_INVENTORY_SNAPSHOT_EXPECTED_SOURCE_DATABASE_IDENTITY:?Missing expected source identity}"'
|
||
TimeoutStartSec=30min
|
||
Restart=on-failure
|
||
RestartSec=15min
|
||
EOF
|
||
|
||
cat >"/etc/systemd/system/$SERVICE_NAME.timer" <<EOF
|
||
[Unit]
|
||
Description=Product inventory snapshot every 15 minutes
|
||
[Timer]
|
||
OnCalendar=$CALENDAR
|
||
Persistent=true
|
||
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
|