The user reported runs logged as "success" locally weren't showing up
in MassPrice's own Activity Log. Live-debugged directly against
production: clicking the dropdown's "Run Rule" item opens a
confirmation modal ("Are you sure you want to continue?") rather than
running the rule immediately. Confirmed by network capture — without
clicking the modal's #Confirmation_Run button, zero requests fire, no
error is thrown, and the rule silently never runs. Every prior
"success" in run_history.json for real production traffic was
therefore a false positive.
Verified the fix live: clicking through #ConfirmationModal's
#Confirmation_Run now fires a real POST /Rule/Run request.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H6TgffxTvYhqxykAbVQg2v
5.5 KiB
| name | description |
|---|---|
| deploy-massprice | Use when deploying MassPrice Scheduler, restarting the massprice container on Unraid, confirming a deploy landed, logging into MassPrice via the Session page, or troubleshooting its scheduled-rule automation. |
Deployment
Target: Unraid server, container path /mnt/user/appdata/massprice,
built from Dockerfile/docker-compose.yml in this repo. Container name
massprice, port 5057 (overridable via HOST_PORT — 5056 was
already taken by arr-summary, despite its own docs saying 5055) →
container port 5000.
Deploy mechanism: Forgejo push-to-deploy, the same pattern as
arr-summary, card-grader, lunch-notifier, n64-tracker — see
arr-summary's deploy-arr-summary skill or card-grader's CLAUDE.md
for the full runner mechanics. Push to main on the forgejo remote
(https://git.hippofam.com/ninja_hippo/massprice.git) triggers
.forgejo/workflows/deploy.yml, which syncs into
/mnt/user/appdata/massprice (excluding .git, .env, data/) and
runs docker compose up -d --build.
Restarting the container manually: use Compose, not the Unraid Docker UI — same reasoning as the other projects (every deploy recreates the container with a new Docker ID; Unraid's UI caches the old one). From the Unraid terminal:
cd /mnt/user/appdata/massprice && docker compose restart
docker compose up -d --force-recreate for a guaranteed-clean recreate;
docker ps --filter name=massprice to check real state.
Confirming a deploy landed: the footer renders
v<APP_VERSION> · <APP_VERSION_DATE> from constants near the top of
app.py. Bump them every commit.
First deploy checklist
- Create
/mnt/user/appdata/masspriceon Unraid and a real.envthere (copy.env.example, fill inLOGIN_PASSWORD,SECRET_KEY,HOST_PORT,TZ— and optionallyGMAIL_USER/GMAIL_APP_PASSWORD/ALERT_EMAILfor the session-expiry email alert, same Gmail-app- password pattern aslunch-notifier). - First
docker compose up -d --build— confirm the container starts and/loginresponds onHOST_PORT. - Log into the webui, go to the Session page, and follow its
instructions: log into massprice.tcgplayer.com in your own regular
Chrome, export its cookies with the Cookie-Editor extension, paste
them into the box, and click "Import Session". MassPrice's login is
behind hCaptcha, which blocks any form of automated login (confirmed
by testing — see
CLAUDE.md), so this manual export is the only path in, and needs repeating whenever the session eventually expires. - Click "Refresh Rules" on the Dashboard — confirms the saved session actually works and pulls the real rule list.
- Set up at least one schedule and use "Run Now" once to confirm a
click actually lands — cross-check by looking at MassPrice's own
Activity Log (
https://massprice.tcgplayer.com/Activity/List) for a fresh timestamp on that rule. - Only after step 5 succeeds, go to each existing rule on massprice.tcgplayer.com (three-dot menu → Edit Schedule) and set Status to Inactive, so native scheduling stops double-triggering runs and this tool becomes the sole source of scheduled runs.
Persistent state, never touched by deploys
.env holds LOGIN_PASSWORD, SECRET_KEY, and (optionally)
GMAIL_USER/GMAIL_APP_PASSWORD/ALERT_EMAIL. data/ (bind-mounted to
/data) holds schedules.json (the schedules set from the webui),
auth_state.json (the saved MassPrice session imported via the Session
page — a live bearer credential for the user's MassPrice account while
valid, see CLAUDE.md; losing this just costs one re-import, not data),
run_history.json, rules_cache.json, and notify_state.json (the
session-expiry alert's send-once dedupe flag). Both are excluded from the
deploy rsync (which runs --delete) and from git.
If scheduled runs stop working
Check, in order:
0. Local Activity says success but nothing shows up in MassPrice's own
Activity Log — this exact symptom happened in production once
already: run_rule() was only opening MassPrice's "Are you sure?"
confirmation modal, never clicking its #Confirmation_Run button, so
zero requests ever fired despite no error being thrown. Fixed, but if
it recurs (e.g. a MassPrice redesign changes the modal/selectors),
this is the first thing to suspect — see CLAUDE.md.
- Dashboard banner / Activity page — a "session expired or missing" message means go log in again via the Session page. "rule id not found" means a rule was renamed/deleted on MassPrice — click "Refresh Rules".
- Is the container still running —
docker ps --filter name=massprice— a Chromium crash inside the container (rare, but possible ifshm_sizeever gets dropped fromdocker-compose.yml) would show as the container restarting. - Timezone —
TZin.envcontrols what "6:00 AM" means for every schedule; confirm it matches what the user actually expects before assuming a schedule itself is wrong. - Session import fails with "didn't authenticate" — the export was
probably taken from the wrong tab or before login finished. Re-export
only after you're actually looking at massprice.tcgplayer.com's own
Dashboard/Rules pages, not the login page or
store.tcgplayer.com. - Session import fails with "none of the pasted cookies are for tcgplayer.com" — the extension exported the wrong site's cookies; make sure the active tab was massprice.tcgplayer.com when you clicked Export.