dubs-server 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (304) hide show
  1. package/.claude/settings.local.json +280 -0
  2. package/CLAUDE.md +46 -0
  3. package/CONNECT4_PRODUCTION_DEPLOY.md +155 -0
  4. package/CURRENT_SESSION.md +171 -0
  5. package/CURRENT_SESSION_DRAW.md +516 -0
  6. package/MARCH_MADNESS_SURVIVOR.md +254 -0
  7. package/PANDA.md +166 -0
  8. package/Procfile +4 -0
  9. package/README.md +476 -0
  10. package/controllers/livescoresController.js +376 -0
  11. package/controllers/pickemController.js +554 -0
  12. package/controllers/survivorAdminController.js +887 -0
  13. package/controllers/survivorController.js +623 -0
  14. package/cron/oracleMonitor.js +77 -0
  15. package/cron/pickemOracleMonitor.js +73 -0
  16. package/data/jackpot-history.json +952 -0
  17. package/data/ncaaTeams.js +406 -0
  18. package/documentation/API_SECURITY_GUIDE.md +327 -0
  19. package/documentation/ARCADE_API.md +593 -0
  20. package/documentation/ARCADE_IMPLEMENTATION_SUMMARY.md +399 -0
  21. package/documentation/ARCADE_QUICKSTART.md +242 -0
  22. package/documentation/AUTOMATIC_MODE_ORACLE.md +321 -0
  23. package/documentation/BUG_FIX_COHORT_DATE_DISPLAY.md +171 -0
  24. package/documentation/CLAIM_MIGRATION_INSTRUCTIONS.md +52 -0
  25. package/documentation/CLAIM_STATUS_FIX.md +67 -0
  26. package/documentation/CLI_TOOL_GUIDE.md +372 -0
  27. package/documentation/COHORT_RETENTION_ANALYSIS.md +295 -0
  28. package/documentation/COHORT_RETENTION_IMPLEMENTATION_COMPLETE.md +461 -0
  29. package/documentation/COHORT_RETENTION_SUMMARY.md +204 -0
  30. package/documentation/COMPLETE_PROJECT_SUMMARY.md +490 -0
  31. package/documentation/DATABASE_QUERIES.md +269 -0
  32. package/documentation/DATABASE_RETENTION_POLICY.md +390 -0
  33. package/documentation/DATABASE_SETUP_GUIDE.md +361 -0
  34. package/documentation/DATABASE_SETUP_SUMMARY.md +247 -0
  35. package/documentation/DEMO_API_CURL_COMMANDS.md +656 -0
  36. package/documentation/DEPLOYMENT_SUMMARY.txt +100 -0
  37. package/documentation/DUPLICATE_NOTIFICATIONS_FIXED.md +201 -0
  38. package/documentation/EXCHANGE_RATES_INTEGRATION.md +371 -0
  39. package/documentation/FINAL_API_PROTECTION_TABLE.md +175 -0
  40. package/documentation/GAME_START_NOTIFICATIONS_DEPLOYMENT.md +256 -0
  41. package/documentation/GAME_START_NOTIFICATIONS_INTEGRATION.md +275 -0
  42. package/documentation/HEROKU_DEPLOYMENT.md +134 -0
  43. package/documentation/HEROKU_SCHEDULER_SETUP.md +271 -0
  44. package/documentation/JACKPOT_API.md +521 -0
  45. package/documentation/JACKPOT_DEPLOYMENT_GUIDE.md +362 -0
  46. package/documentation/JWT_IMPLEMENTATION_SUMMARY.md +373 -0
  47. package/documentation/JWT_QUICK_SETUP.md +268 -0
  48. package/documentation/JWT_TESTING_GUIDE.md +404 -0
  49. package/documentation/KEEPER_RECOVERY_GUIDE.md +381 -0
  50. package/documentation/KEEPER_SETUP.md +206 -0
  51. package/documentation/KEEPER_STATE_MACHINE.md +423 -0
  52. package/documentation/LATEST_PRODUCTION_SETUP.md +387 -0
  53. package/documentation/LOCAL_VOTING_TEST.md +279 -0
  54. package/documentation/ORACLE_FIXES_SUMMARY.md +188 -0
  55. package/documentation/ORACLE_POSTGRESQL_UPDATE.md +202 -0
  56. package/documentation/PAYMENT_DEPLOYMENT.md +209 -0
  57. package/documentation/PNL_TRACKING_SETUP.md +189 -0
  58. package/documentation/PREVENTING_LOCKUP_ERRORS.md +472 -0
  59. package/documentation/PRODUCTION_READY_SUMMARY.md +227 -0
  60. package/documentation/PUBLIC_VS_PRIVATE_ENDPOINTS.md +278 -0
  61. package/documentation/QUICK_AUTH_SETUP.md +99 -0
  62. package/documentation/QUICK_DEPLOY.md +224 -0
  63. package/documentation/QUICK_FIX.md +114 -0
  64. package/documentation/QUICK_START.md +152 -0
  65. package/documentation/REFEREE_MODE_GUIDE.md +392 -0
  66. package/documentation/RETENTION_CORE_ACTION_UPDATE.md +313 -0
  67. package/documentation/RETENTION_UPDATE_SUMMARY.md +108 -0
  68. package/documentation/RUN_MIGRATION_NOW.md +39 -0
  69. package/documentation/SCRIPTS_UPDATE_SUMMARY.md +251 -0
  70. package/documentation/SETUP_GUIDE.md +184 -0
  71. package/documentation/STATE_MACHINE_IMPLEMENTATION.md +250 -0
  72. package/documentation/TELEGRAM_NOTIFICATIONS_DIAGNOSIS.md +361 -0
  73. package/documentation/UNIFIED_ARCHITECTURE.md +231 -0
  74. package/documentation/VOTING_DEPLOYMENT_SUMMARY.md +392 -0
  75. package/documentation/WEBSOCKET_ARCHITECTURE.md +881 -0
  76. package/documentation/WHAT_WE_BUILT_TODAY.md +369 -0
  77. package/documentation/latest/LATEST_PRODUCTION_SETUP.md +865 -0
  78. package/ecosystem.config.js +65 -0
  79. package/env.template +125 -0
  80. package/middleware/apiKeyAuth.js +136 -0
  81. package/middleware/authenticate.js +214 -0
  82. package/middleware/developerUserAuth.js +76 -0
  83. package/middleware/socketAuth.js +69 -0
  84. package/package.json +49 -0
  85. package/postman/Dubs-API-v1-With-Voting.postman_collection.json +555 -0
  86. package/postman/Dubs-API-v1.postman_collection.json +205 -0
  87. package/postman/Dubs_Developer_API.postman_collection.json +662 -0
  88. package/postman/QUICKSTART.md +118 -0
  89. package/postman/QUICK_REFERENCE.md +246 -0
  90. package/postman/README.md +71 -0
  91. package/postman/VOTING_API_GUIDE.md +426 -0
  92. package/refactor/Animations.md +148 -0
  93. package/refactor/Chat.md +252 -0
  94. package/routes/actionsRoutes.js +699 -0
  95. package/routes/adminRoutes.js +370 -0
  96. package/routes/analyticsRoutes.js +1262 -0
  97. package/routes/arcadeRoutes.js +557 -0
  98. package/routes/authRoutes.js +2310 -0
  99. package/routes/avatarRoutes.js +85 -0
  100. package/routes/botRoutes.js +211 -0
  101. package/routes/chatRoutes.js +377 -0
  102. package/routes/cryptoPriceRoutes.js +105 -0
  103. package/routes/developerRoutes.js +4201 -0
  104. package/routes/deviceRoutes.js +214 -0
  105. package/routes/dmRoutes.js +167 -0
  106. package/routes/esportsRoutes.js +806 -0
  107. package/routes/exchangeRateRoutes.js +233 -0
  108. package/routes/gamesRoutes.js +3028 -0
  109. package/routes/jackpotRoutes.js +754 -0
  110. package/routes/keeperMonitoringRoutes.js +156 -0
  111. package/routes/keeperWebhookRoutes.js +466 -0
  112. package/routes/livescoresRoutes.js +31 -0
  113. package/routes/pickemAdminRoutes.js +199 -0
  114. package/routes/pickemRoutes.js +231 -0
  115. package/routes/playerStatsRoutes.js +147 -0
  116. package/routes/portfolioRoutes.js +217 -0
  117. package/routes/promoRoutes.js +418 -0
  118. package/routes/referralEarningsRoutes.js +392 -0
  119. package/routes/socialRoutes.js +459 -0
  120. package/routes/sportsRoutes.js +1271 -0
  121. package/routes/survivorAdminRoutes.js +345 -0
  122. package/routes/survivorRoutes.js +756 -0
  123. package/routes/uploadRoutes.js +256 -0
  124. package/routes/userProfileRoutes.js +244 -0
  125. package/routes/whatsNewRoutes.js +331 -0
  126. package/scripts/.claude/settings.local.json +15 -0
  127. package/scripts/README.md +170 -0
  128. package/scripts/RESTART_EVERYTHING.sh +104 -0
  129. package/scripts/add-claim-columns.sql +48 -0
  130. package/scripts/add-crypto-prices-cache.sql +27 -0
  131. package/scripts/add-exchange-rates-cache.sql +40 -0
  132. package/scripts/add-game-invite-column.sql +23 -0
  133. package/scripts/add-game-invite-notification.sql +33 -0
  134. package/scripts/add-game-invite-telegram-pref.sql +16 -0
  135. package/scripts/add-game-joined-notification.sql +16 -0
  136. package/scripts/add-game-joined-pref.js +40 -0
  137. package/scripts/add-game-joined-preference.sql +6 -0
  138. package/scripts/add-game-start-notifications.sql +41 -0
  139. package/scripts/add-notification-flags-to-games.sql +55 -0
  140. package/scripts/add-pending-game-dismissals.sql +19 -0
  141. package/scripts/add-preferred-currency.sql +34 -0
  142. package/scripts/add-winner-columns.js +61 -0
  143. package/scripts/add_mention_system.sql +53 -0
  144. package/scripts/add_payment_system.sql +96 -0
  145. package/scripts/add_sports_event_id_column.sql +22 -0
  146. package/scripts/analyze-cohort-data-heroku.js +276 -0
  147. package/scripts/analyze-cohort-data.js +295 -0
  148. package/scripts/analyze-prod-cohorts.sh +10 -0
  149. package/scripts/backfill-matchup-images.js +245 -0
  150. package/scripts/backfill-missing-signatures.js +175 -0
  151. package/scripts/backfill-referral-earnings.js +202 -0
  152. package/scripts/check-chat-schema.js +130 -0
  153. package/scripts/check-db.sh +14 -0
  154. package/scripts/check_oracle_in_game.js +54 -0
  155. package/scripts/cleanup-database.js +193 -0
  156. package/scripts/clear-notification-cache.js +85 -0
  157. package/scripts/convert-mnemonic.js +50 -0
  158. package/scripts/create-users-table.sql +44 -0
  159. package/scripts/debug-cohort-counts.js +248 -0
  160. package/scripts/debug-winner-calc.js +84 -0
  161. package/scripts/deploy-payment-system.sh +118 -0
  162. package/scripts/deploy-to-heroku.sh +63 -0
  163. package/scripts/diagnose-locked-round.js +143 -0
  164. package/scripts/dubs-cli.js +720 -0
  165. package/scripts/dump-account.js +65 -0
  166. package/scripts/find-vrf-offset.js +48 -0
  167. package/scripts/fix-chat-notifications-constraint.sql +122 -0
  168. package/scripts/fix-claim-columns.js +124 -0
  169. package/scripts/fix-constraint-now.js +44 -0
  170. package/scripts/fix-lock-timestamps.js +96 -0
  171. package/scripts/fix-locked-round.sh +126 -0
  172. package/scripts/fix-missing-badges.sql +91 -0
  173. package/scripts/fix-payment-notifications.sql +41 -0
  174. package/scripts/force-new-round.js +55 -0
  175. package/scripts/force-resolve-and-claim.js +278 -0
  176. package/scripts/important/README.md +115 -0
  177. package/scripts/important/authority-force-lock.js +197 -0
  178. package/scripts/important/authority-resolve-game.js +267 -0
  179. package/scripts/important/check-game-status.js +373 -0
  180. package/scripts/important/list-pending-games-by-version.js +270 -0
  181. package/scripts/important/reconcile-v1-v2-payouts.js +270 -0
  182. package/scripts/initialize-jackpot.js +111 -0
  183. package/scripts/jackpot/.claude/settings.local.json +10 -0
  184. package/scripts/jackpot/force-reset.js +84 -0
  185. package/scripts/jackpot/initialize-mainnet.js +100 -0
  186. package/scripts/jackpot/keeper.js +742 -0
  187. package/scripts/jackpot/status.js +107 -0
  188. package/scripts/jackpot/update-round-duration.js +143 -0
  189. package/scripts/keeper-bot.js +112 -0
  190. package/scripts/list-pending-games.js +131 -0
  191. package/scripts/migrate-chat-v2.js +127 -0
  192. package/scripts/migrate-chat-winners.js +84 -0
  193. package/scripts/migrate-chat.sh +17 -0
  194. package/scripts/migrate-game-invite.js +83 -0
  195. package/scripts/migrate-heroku-game-notifications.sh +159 -0
  196. package/scripts/migrations/001_analytics_tables.sql +422 -0
  197. package/scripts/migrations/002_add_matchup_image_url.sql +14 -0
  198. package/scripts/migrations/003_referral_earnings.sql +208 -0
  199. package/scripts/migrations/004_add_whats_new_notification_type.sql +62 -0
  200. package/scripts/migrations/005_add_connect4_your_turn_notification.sql +61 -0
  201. package/scripts/migrations/005_push_notifications.sql +55 -0
  202. package/scripts/migrations/006_add_draw_team_players.sql +28 -0
  203. package/scripts/migrations/006_add_game_cancelled_notification.sql +62 -0
  204. package/scripts/migrations/007_add_gif_url.sql +8 -0
  205. package/scripts/migrations/008_add_connect4_columns.sql +139 -0
  206. package/scripts/migrations/008_add_pool_tracking.sql +22 -0
  207. package/scripts/migrations/009_create_survivor_pool_tables.sql +174 -0
  208. package/scripts/migrations/010_add_survivor_pool_outcome.sql +28 -0
  209. package/scripts/migrations/011_create_developer_tables.sql +67 -0
  210. package/scripts/migrations/011_fix_keeper_tables.sql +85 -0
  211. package/scripts/migrations/012_create_developer_webhooks.sql +31 -0
  212. package/scripts/migrations/013_add_network_mode.sql +18 -0
  213. package/scripts/migrations/014_create_developer_app_users.sql +19 -0
  214. package/scripts/migrations/015_add_ui_config.sql +4 -0
  215. package/scripts/migrations/016_add_resolution_secret.sql +4 -0
  216. package/scripts/migrations/017_add_external_game_id.sql +3 -0
  217. package/scripts/migrations/018_create_pickem_tables.sql +115 -0
  218. package/scripts/migrations/019_expo_push_tokens.sql +19 -0
  219. package/scripts/migrations/create_whats_new_tables.sql +88 -0
  220. package/scripts/migrations/drop_live_games_tables.sql +34 -0
  221. package/scripts/open-jackpot-round.js +85 -0
  222. package/scripts/purge-all-data.sh +329 -0
  223. package/scripts/purge-all-data.sql +142 -0
  224. package/scripts/purge-heroku-data.sh +149 -0
  225. package/scripts/purge-heroku-data.sql +62 -0
  226. package/scripts/rebuild-heroku-database.sh +113 -0
  227. package/scripts/recover-funds.js +357 -0
  228. package/scripts/regenerate-epl-images.js +278 -0
  229. package/scripts/resize-s3-matchup-images.js +374 -0
  230. package/scripts/resolve-direct.js +88 -0
  231. package/scripts/resolve-mock-game.js +124 -0
  232. package/scripts/resolve-pickem-game.js +55 -0
  233. package/scripts/resolve-round-manual.js +83 -0
  234. package/scripts/resolve-stuck-game.js +382 -0
  235. package/scripts/resolve-stuck-round.js +42 -0
  236. package/scripts/run-connect4-migration.sh +16 -0
  237. package/scripts/run-mention-migration.sh +32 -0
  238. package/scripts/run-payment-migration.sh +51 -0
  239. package/scripts/run-preferred-currency-migration.sh +31 -0
  240. package/scripts/run-referral-earnings-migration.sh +32 -0
  241. package/scripts/run-survivor-outcome-migration.sh +16 -0
  242. package/scripts/seed-test-users.js +346 -0
  243. package/scripts/setup-auth-tables.js +78 -0
  244. package/scripts/setup-complete-database.sql +992 -0
  245. package/scripts/setup-database-fresh.sh +359 -0
  246. package/scripts/setup-heroku-keeper.sh +48 -0
  247. package/scripts/setup-keeper-database.js +83 -0
  248. package/scripts/setup-keeper-state-db.sql +110 -0
  249. package/scripts/setup-oracle.sh +39 -0
  250. package/scripts/setup-pnl-tracking.js +111 -0
  251. package/scripts/start-devnet.sh +14 -0
  252. package/scripts/test-arcade-devnet.sh +160 -0
  253. package/scripts/test-arcade-match.sh +109 -0
  254. package/scripts/test-automatic-mode.sh +239 -0
  255. package/scripts/test-connect4-cancel-claim.js +370 -0
  256. package/scripts/test-connect4-e2e.js +369 -0
  257. package/scripts/test-connect4-resolve.js +369 -0
  258. package/scripts/test-game-state-endpoint.js +136 -0
  259. package/scripts/test-invite-notification.js +86 -0
  260. package/scripts/test-jackpot-api.sh +71 -0
  261. package/scripts/test-poll-confirmation.js +267 -0
  262. package/scripts/test-resolve-game.js +271 -0
  263. package/scripts/test-resolve-signature.js +223 -0
  264. package/scripts/test-signature-preservation.js +124 -0
  265. package/scripts/test-state-machine.js +291 -0
  266. package/scripts/test-webhook-receiver.js +60 -0
  267. package/scripts/update-notification-constraint.js +52 -0
  268. package/scripts/verify-account-layout.js +145 -0
  269. package/scripts/verify-winner-algorithm.js +278 -0
  270. package/server.js +5259 -0
  271. package/services/arcadeMatchService.js +763 -0
  272. package/services/automaticGameOracle.js +1596 -0
  273. package/services/chatService.js +1612 -0
  274. package/services/connect4GameService.js +1049 -0
  275. package/services/connect4NotificationService.js +374 -0
  276. package/services/cryptoPriceService.js +223 -0
  277. package/services/customGameResolver.js +260 -0
  278. package/services/db.js +79 -0
  279. package/services/directMessageService.js +389 -0
  280. package/services/discordNotifications.js +160 -0
  281. package/services/exchangeRateService.js +289 -0
  282. package/services/expoPushService.js +314 -0
  283. package/services/gamesCacheService.js +539 -0
  284. package/services/jackpotHistory.js +331 -0
  285. package/services/jackpotService.js +856 -0
  286. package/services/keeperStateService.js +355 -0
  287. package/services/matchupImageService.js +591 -0
  288. package/services/notificationCacheService.js +407 -0
  289. package/services/pickemOracle.js +440 -0
  290. package/services/playerStatsService.js +389 -0
  291. package/services/portfolioService.js +555 -0
  292. package/services/promoService.js +757 -0
  293. package/services/promoTreasuryService.js +239 -0
  294. package/services/pushNotifications.js +353 -0
  295. package/services/redisService.js +422 -0
  296. package/services/referralEarningsService.js +728 -0
  297. package/services/s3Service.js +396 -0
  298. package/services/socialService.js +1202 -0
  299. package/services/survivorOracle.js +469 -0
  300. package/services/survivorSimulator.js +475 -0
  301. package/services/telegramNotifications.js +461 -0
  302. package/services/userProfileStatsService.js +1185 -0
  303. package/services/whatsNewService.js +388 -0
  304. package/utils/urlHelper.js +95 -0
@@ -0,0 +1,134 @@
1
+ # 🚀 Heroku Deployment Guide - Dubs Server
2
+
3
+ ## Quick Deploy Commands
4
+
5
+ ```bash
6
+ cd /Users/adamdahan/Developer/iheartsolana/solana-programs/dubs-server
7
+
8
+ # 1. Commit latest changes
9
+ git add .
10
+ git commit -m "Update jackpot keeper and fix program ID"
11
+
12
+ # 2. Deploy to Heroku
13
+ git push heroku-dev main
14
+
15
+ # 3. Set environment variables (if not already set)
16
+ heroku config:set SOLANA_NETWORK=https://api.devnet.solana.com -a dubs-server-dev
17
+ heroku config:set PROGRAM_ID=8DJTkgk6MDr6tPtw4v2VzYAz9WWvmCg6786vZrEK3o5q -a dubs-server-dev
18
+ heroku config:set JACKPOT_PROGRAM_ID=bqoSjTSPLweMuqNG6jy39jmzGyZvZdWjsr4csGfD8F6 -a dubs-server-dev
19
+
20
+ # 4. Enable jackpot keeper dyno
21
+ heroku ps:scale jackpot-keeper=1 -a dubs-server-dev
22
+
23
+ # 5. Check status
24
+ heroku ps -a dubs-server-dev
25
+
26
+ # 6. View logs
27
+ heroku logs --tail -a dubs-server-dev
28
+ ```
29
+
30
+ ## What's Running
31
+
32
+ Your Heroku app should have 3 processes:
33
+
34
+ 1. **web** - API server (always on)
35
+ 2. **oracle** - Sports betting oracle (for automatic game resolution)
36
+ 3. **jackpot-keeper** - Jackpot round manager (NEW!)
37
+
38
+ ## Verify Deployment
39
+
40
+ ```bash
41
+ # Health check
42
+ curl https://dubs-server-dev.herokuapp.com/jackpot/health | python3 -m json.tool
43
+
44
+ # Current round
45
+ curl https://dubs-server-dev.herokuapp.com/jackpot/round/current | python3 -m json.tool
46
+
47
+ # Config
48
+ curl https://dubs-server-dev.herokuapp.com/jackpot/config | python3 -m json.tool
49
+ ```
50
+
51
+ ## Troubleshooting
52
+
53
+ ### Check Logs
54
+
55
+ ```bash
56
+ # All logs
57
+ heroku logs --tail -a dubs-server-dev
58
+
59
+ # Keeper logs only
60
+ heroku logs --tail --ps jackpot-keeper -a dubs-server-dev
61
+
62
+ # API logs only
63
+ heroku logs --tail --ps web -a dubs-server-dev
64
+ ```
65
+
66
+ ### Restart Services
67
+
68
+ ```bash
69
+ # Restart everything
70
+ heroku ps:restart -a dubs-server-dev
71
+
72
+ # Restart keeper only
73
+ heroku ps:restart jackpot-keeper -a dubs-server-dev
74
+ ```
75
+
76
+ ### Check Process Status
77
+
78
+ ```bash
79
+ heroku ps -a dubs-server-dev
80
+ ```
81
+
82
+ Expected output:
83
+ ```
84
+ === web (Free): node server.js (1)
85
+ web.1: up 2024/11/16 14:00:00 -0500 (~ 1h ago)
86
+
87
+ === jackpot-keeper (Free): node scripts/jackpot-keeper.js (1)
88
+ jackpot-keeper.1: up 2024/11/16 14:00:00 -0500 (~ 1h ago)
89
+
90
+ === oracle (Free): node cron/oracleMonitor.js (1)
91
+ oracle.1: up 2024/11/16 14:00:00 -0500 (~ 1h ago)
92
+ ```
93
+
94
+ ## Important Notes
95
+
96
+ ⚠️ **Free Tier Limitations:**
97
+ - Heroku free tier only allows 550 dyno hours per month
98
+ - With 3 processes, that's ~183 hours each (~7.6 days)
99
+ - Consider upgrading to Hobby tier ($7/month per dyno) for 24/7 operation
100
+
101
+ 💡 **Optimization Tip:**
102
+ If on free tier, you can disable the oracle dyno when not using sports betting:
103
+ ```bash
104
+ heroku ps:scale oracle=0 -a dubs-server-dev
105
+ ```
106
+
107
+ ## Environment Variables
108
+
109
+ View all config vars:
110
+ ```bash
111
+ heroku config -a dubs-server-dev
112
+ ```
113
+
114
+ Set a config var:
115
+ ```bash
116
+ heroku config:set VARIABLE_NAME=value -a dubs-server-dev
117
+ ```
118
+
119
+ ## Deploy Process
120
+
121
+ 1. Make code changes locally
122
+ 2. Test locally: `node server.js` and `node scripts/jackpot-keeper.js`
123
+ 3. Commit changes: `git add . && git commit -m "Your message"`
124
+ 4. Push to Heroku: `git push heroku-dev main`
125
+ 5. Watch logs: `heroku logs --tail -a dubs-server-dev`
126
+
127
+ ## Success Indicators
128
+
129
+ ✅ API responds at `/jackpot/health`
130
+ ✅ Current round exists at `/jackpot/round/current`
131
+ ✅ Keeper logs show round management activity
132
+ ✅ New rounds open automatically every ~1 minute
133
+ ✅ Frontend can connect and place bets
134
+
@@ -0,0 +1,271 @@
1
+ # ⏰ Heroku Scheduler Setup Guide
2
+
3
+ **Purpose:** Automate daily database cleanup
4
+ **Cost:** FREE (included with Heroku)
5
+
6
+ ---
7
+
8
+ ## 🚀 Quick Setup (5 minutes)
9
+
10
+ ### Step 1: Add Scheduler Addon
11
+
12
+ ```bash
13
+ heroku addons:create scheduler:standard -a dubs-server-dev
14
+ ```
15
+
16
+ **Output:**
17
+ ```
18
+ Creating scheduler:standard on dubs-server-dev... free
19
+ Created scheduler-regular-12345
20
+ Use heroku addons:docs scheduler to view documentation
21
+ ```
22
+
23
+ ### Step 2: Open Scheduler Dashboard
24
+
25
+ ```bash
26
+ heroku addons:open scheduler -a dubs-server-dev
27
+ ```
28
+
29
+ This opens the web interface in your browser.
30
+
31
+ ### Step 3: Add Daily Cleanup Job
32
+
33
+ **In the Scheduler Dashboard, click "Add Job":**
34
+
35
+ ```
36
+ Command: node scripts/cleanup-database.js
37
+ Frequency: Daily
38
+ Time (UTC): 03:00 (3:00 AM UTC = 10pm PST / 11pm EST)
39
+ Dyno Size: Standard-1X
40
+ ```
41
+
42
+ Click **"Save Job"**
43
+
44
+ ### Step 4: Test It Works
45
+
46
+ ```bash
47
+ # Trigger job manually (doesn't wait for schedule)
48
+ heroku run node scripts/cleanup-database.js -a dubs-server-dev
49
+ ```
50
+
51
+ Should see:
52
+ ```
53
+ 🧹 DATABASE CLEANUP STARTING
54
+ 📊 Before Cleanup: ...
55
+ ✅ CLEANUP COMPLETE
56
+ ```
57
+
58
+ ---
59
+
60
+ ## 📊 What Gets Cleaned Daily
61
+
62
+ **At 3am UTC every day, the job:**
63
+
64
+ 1. Deletes `keeper_actions` older than 30 days
65
+ 2. Deletes `keeper_health` snapshots older than 90 days
66
+ 3. Archives incomplete `keeper_rounds` older than 30 days
67
+ 4. Runs VACUUM to reclaim disk space
68
+ 5. Logs summary to scheduler logs
69
+
70
+ **Keeps forever:**
71
+ - ✅ All resolved rounds (`keeper_rounds` where status='resolved')
72
+ - ✅ All jackpot history (`jackpot_rounds` for user verification)
73
+
74
+ ---
75
+
76
+ ## 🔍 Verify Scheduler is Running
77
+
78
+ ### **Check if addon is active:**
79
+
80
+ ```bash
81
+ heroku addons -a dubs-server-dev | grep scheduler
82
+ ```
83
+
84
+ Should show:
85
+ ```
86
+ scheduler (scheduler:standard) free
87
+ ```
88
+
89
+ ### **View scheduled jobs:**
90
+
91
+ ```bash
92
+ heroku addons:open scheduler -a dubs-server-dev
93
+ ```
94
+
95
+ Or via CLI:
96
+ ```bash
97
+ heroku run:detached heroku scheduler:jobs -a dubs-server-dev
98
+ ```
99
+
100
+ ### **Check scheduler logs:**
101
+
102
+ ```bash
103
+ heroku logs --ps scheduler -a dubs-server-dev --tail
104
+ ```
105
+
106
+ **After cleanup runs, you'll see:**
107
+ ```
108
+ 2025-11-18T03:00:15 app[scheduler.1]: 🧹 DATABASE CLEANUP STARTING
109
+ 2025-11-18T03:00:16 app[scheduler.1]: ✅ CLEANUP COMPLETE
110
+ ```
111
+
112
+ ---
113
+
114
+ ## ⚙️ Advanced Configuration
115
+
116
+ ### **Change Cleanup Time:**
117
+
118
+ 1. Open dashboard: `heroku addons:open scheduler -a dubs-server-dev`
119
+ 2. Click on the job
120
+ 3. Change "Time (UTC)"
121
+ 4. Save
122
+
123
+ **Best times:**
124
+ - **3:00 AM UTC** - Off-peak for US/Europe
125
+ - **10:00 AM UTC** - Off-peak for Asia
126
+
127
+ ### **Change Frequency:**
128
+
129
+ **Daily:** Current setting (recommended)
130
+ **Hourly:** Overkill unless you have 1000s of rounds/day
131
+ **Every 10 min:** Never needed
132
+
133
+ ### **Run Cleanup Manually:**
134
+
135
+ ```bash
136
+ # One-time execution
137
+ heroku run node scripts/cleanup-database.js -a dubs-server-dev
138
+ ```
139
+
140
+ ---
141
+
142
+ ## 🔧 Modify Retention Policies
143
+
144
+ **Edit `scripts/cleanup-database.js`:**
145
+
146
+ ```javascript
147
+ const RETENTION_POLICIES = {
148
+ keeper_actions: 30, // Change to 7, 14, 60, etc.
149
+ keeper_health: 90, // Change to 30, 60, 180, etc.
150
+ keeper_rounds_incomplete: 30,
151
+ };
152
+ ```
153
+
154
+ **Then redeploy:**
155
+ ```bash
156
+ git add scripts/cleanup-database.js
157
+ git commit -m "Adjust retention policies"
158
+ git push heroku-dev main
159
+ ```
160
+
161
+ ---
162
+
163
+ ## 📊 Monitor Cleanup Effectiveness
164
+
165
+ ### **Before/After Comparison:**
166
+
167
+ ```bash
168
+ # Run cleanup
169
+ heroku run node scripts/cleanup-database.js -a dubs-server-dev
170
+
171
+ # Check size reduction
172
+ heroku pg:info -a dubs-server-dev
173
+ ```
174
+
175
+ ### **Track Over Time:**
176
+
177
+ ```bash
178
+ # See database size trend
179
+ heroku pg:info -a dubs-server-dev | grep "Data Size"
180
+
181
+ # Today: 7.93 MB / 1 GB
182
+ # Next week: Should stay similar or grow slowly
183
+ ```
184
+
185
+ ### **Alert if Growing Fast:**
186
+
187
+ ```bash
188
+ # If size > 100 MB (10%), investigate:
189
+ heroku pg:psql -a dubs-server-dev -c "
190
+ SELECT
191
+ schemaname,
192
+ tablename,
193
+ pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size
194
+ FROM pg_tables
195
+ WHERE schemaname = 'public'
196
+ ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
197
+ "
198
+ ```
199
+
200
+ ---
201
+
202
+ ## 💡 Pro Tips
203
+
204
+ ### **Tip 1: Set Up Alerts**
205
+
206
+ Create a simple alert script:
207
+
208
+ ```bash
209
+ #!/bin/bash
210
+ # check-db-size.sh
211
+
212
+ SIZE=$(heroku pg:info -a dubs-server-dev | grep "Data Size" | awk '{print $3}')
213
+ LIMIT=500 # Alert if > 500 MB
214
+
215
+ if (( $(echo "$SIZE > $LIMIT" | bc -l) )); then
216
+ echo "⚠️ Database size: ${SIZE}MB (exceeds ${LIMIT}MB limit)"
217
+ # Send alert email/SMS here
218
+ fi
219
+ ```
220
+
221
+ ### **Tip 2: Export Before Cleanup**
222
+
223
+ ```bash
224
+ # Backup old data before deleting
225
+ heroku pg:backups:capture -a dubs-server-dev
226
+ heroku pg:backups:download -a dubs-server-dev
227
+ ```
228
+
229
+ ### **Tip 3: Monitor Cleanup in Postico**
230
+
231
+ **Create a "Cleanup Stats" view:**
232
+ ```sql
233
+ CREATE VIEW cleanup_stats AS
234
+ SELECT
235
+ (SELECT COUNT(*) FROM keeper_actions WHERE timestamp < NOW() - INTERVAL '30 days') as actions_to_clean,
236
+ (SELECT COUNT(*) FROM keeper_health WHERE timestamp < NOW() - INTERVAL '90 days') as health_to_clean,
237
+ (SELECT COUNT(*) FROM keeper_rounds WHERE status NOT IN ('resolved','open') AND updated_at < NOW() - INTERVAL '30 days') as rounds_to_clean;
238
+ ```
239
+
240
+ Then query it: `SELECT * FROM cleanup_stats;`
241
+
242
+ ---
243
+
244
+ ## 🎯 Summary
245
+
246
+ **Your cleanup strategy:**
247
+
248
+ ✅ **Automated** - Runs daily at 3am via Heroku Scheduler
249
+ ✅ **Smart** - Keeps audit data forever, cleans temporary logs
250
+ ✅ **Free** - No additional cost
251
+ ✅ **Safe** - Never deletes user verification data
252
+ ✅ **Tested** - Working in production
253
+
254
+ **Current database size:** 7.93 MB / 1 GB (0.77%)
255
+ **Projected 1-year size:** <50 MB (<5%)
256
+ **Years until full:** 20+ years
257
+
258
+ **You don't need to worry about storage!** But the cleanup is good practice. ✅
259
+
260
+ ---
261
+
262
+ ## 📋 Setup Checklist
263
+
264
+ - [ ] Add scheduler addon: `heroku addons:create scheduler:standard -a dubs-server-dev`
265
+ - [ ] Open dashboard: `heroku addons:open scheduler -a dubs-server-dev`
266
+ - [ ] Add job: `node scripts/cleanup-database.js` at 3am daily
267
+ - [ ] Test run: `heroku run node scripts/cleanup-database.js -a dubs-server-dev`
268
+ - [ ] Verify in logs: `heroku logs --ps scheduler -a dubs-server-dev`
269
+
270
+ **Done in 5 minutes!** ✅
271
+