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.
- package/.claude/settings.local.json +280 -0
- package/CLAUDE.md +46 -0
- package/CONNECT4_PRODUCTION_DEPLOY.md +155 -0
- package/CURRENT_SESSION.md +171 -0
- package/CURRENT_SESSION_DRAW.md +516 -0
- package/MARCH_MADNESS_SURVIVOR.md +254 -0
- package/PANDA.md +166 -0
- package/Procfile +4 -0
- package/README.md +476 -0
- package/controllers/livescoresController.js +376 -0
- package/controllers/pickemController.js +554 -0
- package/controllers/survivorAdminController.js +887 -0
- package/controllers/survivorController.js +623 -0
- package/cron/oracleMonitor.js +77 -0
- package/cron/pickemOracleMonitor.js +73 -0
- package/data/jackpot-history.json +952 -0
- package/data/ncaaTeams.js +406 -0
- package/documentation/API_SECURITY_GUIDE.md +327 -0
- package/documentation/ARCADE_API.md +593 -0
- package/documentation/ARCADE_IMPLEMENTATION_SUMMARY.md +399 -0
- package/documentation/ARCADE_QUICKSTART.md +242 -0
- package/documentation/AUTOMATIC_MODE_ORACLE.md +321 -0
- package/documentation/BUG_FIX_COHORT_DATE_DISPLAY.md +171 -0
- package/documentation/CLAIM_MIGRATION_INSTRUCTIONS.md +52 -0
- package/documentation/CLAIM_STATUS_FIX.md +67 -0
- package/documentation/CLI_TOOL_GUIDE.md +372 -0
- package/documentation/COHORT_RETENTION_ANALYSIS.md +295 -0
- package/documentation/COHORT_RETENTION_IMPLEMENTATION_COMPLETE.md +461 -0
- package/documentation/COHORT_RETENTION_SUMMARY.md +204 -0
- package/documentation/COMPLETE_PROJECT_SUMMARY.md +490 -0
- package/documentation/DATABASE_QUERIES.md +269 -0
- package/documentation/DATABASE_RETENTION_POLICY.md +390 -0
- package/documentation/DATABASE_SETUP_GUIDE.md +361 -0
- package/documentation/DATABASE_SETUP_SUMMARY.md +247 -0
- package/documentation/DEMO_API_CURL_COMMANDS.md +656 -0
- package/documentation/DEPLOYMENT_SUMMARY.txt +100 -0
- package/documentation/DUPLICATE_NOTIFICATIONS_FIXED.md +201 -0
- package/documentation/EXCHANGE_RATES_INTEGRATION.md +371 -0
- package/documentation/FINAL_API_PROTECTION_TABLE.md +175 -0
- package/documentation/GAME_START_NOTIFICATIONS_DEPLOYMENT.md +256 -0
- package/documentation/GAME_START_NOTIFICATIONS_INTEGRATION.md +275 -0
- package/documentation/HEROKU_DEPLOYMENT.md +134 -0
- package/documentation/HEROKU_SCHEDULER_SETUP.md +271 -0
- package/documentation/JACKPOT_API.md +521 -0
- package/documentation/JACKPOT_DEPLOYMENT_GUIDE.md +362 -0
- package/documentation/JWT_IMPLEMENTATION_SUMMARY.md +373 -0
- package/documentation/JWT_QUICK_SETUP.md +268 -0
- package/documentation/JWT_TESTING_GUIDE.md +404 -0
- package/documentation/KEEPER_RECOVERY_GUIDE.md +381 -0
- package/documentation/KEEPER_SETUP.md +206 -0
- package/documentation/KEEPER_STATE_MACHINE.md +423 -0
- package/documentation/LATEST_PRODUCTION_SETUP.md +387 -0
- package/documentation/LOCAL_VOTING_TEST.md +279 -0
- package/documentation/ORACLE_FIXES_SUMMARY.md +188 -0
- package/documentation/ORACLE_POSTGRESQL_UPDATE.md +202 -0
- package/documentation/PAYMENT_DEPLOYMENT.md +209 -0
- package/documentation/PNL_TRACKING_SETUP.md +189 -0
- package/documentation/PREVENTING_LOCKUP_ERRORS.md +472 -0
- package/documentation/PRODUCTION_READY_SUMMARY.md +227 -0
- package/documentation/PUBLIC_VS_PRIVATE_ENDPOINTS.md +278 -0
- package/documentation/QUICK_AUTH_SETUP.md +99 -0
- package/documentation/QUICK_DEPLOY.md +224 -0
- package/documentation/QUICK_FIX.md +114 -0
- package/documentation/QUICK_START.md +152 -0
- package/documentation/REFEREE_MODE_GUIDE.md +392 -0
- package/documentation/RETENTION_CORE_ACTION_UPDATE.md +313 -0
- package/documentation/RETENTION_UPDATE_SUMMARY.md +108 -0
- package/documentation/RUN_MIGRATION_NOW.md +39 -0
- package/documentation/SCRIPTS_UPDATE_SUMMARY.md +251 -0
- package/documentation/SETUP_GUIDE.md +184 -0
- package/documentation/STATE_MACHINE_IMPLEMENTATION.md +250 -0
- package/documentation/TELEGRAM_NOTIFICATIONS_DIAGNOSIS.md +361 -0
- package/documentation/UNIFIED_ARCHITECTURE.md +231 -0
- package/documentation/VOTING_DEPLOYMENT_SUMMARY.md +392 -0
- package/documentation/WEBSOCKET_ARCHITECTURE.md +881 -0
- package/documentation/WHAT_WE_BUILT_TODAY.md +369 -0
- package/documentation/latest/LATEST_PRODUCTION_SETUP.md +865 -0
- package/ecosystem.config.js +65 -0
- package/env.template +125 -0
- package/middleware/apiKeyAuth.js +136 -0
- package/middleware/authenticate.js +214 -0
- package/middleware/developerUserAuth.js +76 -0
- package/middleware/socketAuth.js +69 -0
- package/package.json +49 -0
- package/postman/Dubs-API-v1-With-Voting.postman_collection.json +555 -0
- package/postman/Dubs-API-v1.postman_collection.json +205 -0
- package/postman/Dubs_Developer_API.postman_collection.json +662 -0
- package/postman/QUICKSTART.md +118 -0
- package/postman/QUICK_REFERENCE.md +246 -0
- package/postman/README.md +71 -0
- package/postman/VOTING_API_GUIDE.md +426 -0
- package/refactor/Animations.md +148 -0
- package/refactor/Chat.md +252 -0
- package/routes/actionsRoutes.js +699 -0
- package/routes/adminRoutes.js +370 -0
- package/routes/analyticsRoutes.js +1262 -0
- package/routes/arcadeRoutes.js +557 -0
- package/routes/authRoutes.js +2310 -0
- package/routes/avatarRoutes.js +85 -0
- package/routes/botRoutes.js +211 -0
- package/routes/chatRoutes.js +377 -0
- package/routes/cryptoPriceRoutes.js +105 -0
- package/routes/developerRoutes.js +4201 -0
- package/routes/deviceRoutes.js +214 -0
- package/routes/dmRoutes.js +167 -0
- package/routes/esportsRoutes.js +806 -0
- package/routes/exchangeRateRoutes.js +233 -0
- package/routes/gamesRoutes.js +3028 -0
- package/routes/jackpotRoutes.js +754 -0
- package/routes/keeperMonitoringRoutes.js +156 -0
- package/routes/keeperWebhookRoutes.js +466 -0
- package/routes/livescoresRoutes.js +31 -0
- package/routes/pickemAdminRoutes.js +199 -0
- package/routes/pickemRoutes.js +231 -0
- package/routes/playerStatsRoutes.js +147 -0
- package/routes/portfolioRoutes.js +217 -0
- package/routes/promoRoutes.js +418 -0
- package/routes/referralEarningsRoutes.js +392 -0
- package/routes/socialRoutes.js +459 -0
- package/routes/sportsRoutes.js +1271 -0
- package/routes/survivorAdminRoutes.js +345 -0
- package/routes/survivorRoutes.js +756 -0
- package/routes/uploadRoutes.js +256 -0
- package/routes/userProfileRoutes.js +244 -0
- package/routes/whatsNewRoutes.js +331 -0
- package/scripts/.claude/settings.local.json +15 -0
- package/scripts/README.md +170 -0
- package/scripts/RESTART_EVERYTHING.sh +104 -0
- package/scripts/add-claim-columns.sql +48 -0
- package/scripts/add-crypto-prices-cache.sql +27 -0
- package/scripts/add-exchange-rates-cache.sql +40 -0
- package/scripts/add-game-invite-column.sql +23 -0
- package/scripts/add-game-invite-notification.sql +33 -0
- package/scripts/add-game-invite-telegram-pref.sql +16 -0
- package/scripts/add-game-joined-notification.sql +16 -0
- package/scripts/add-game-joined-pref.js +40 -0
- package/scripts/add-game-joined-preference.sql +6 -0
- package/scripts/add-game-start-notifications.sql +41 -0
- package/scripts/add-notification-flags-to-games.sql +55 -0
- package/scripts/add-pending-game-dismissals.sql +19 -0
- package/scripts/add-preferred-currency.sql +34 -0
- package/scripts/add-winner-columns.js +61 -0
- package/scripts/add_mention_system.sql +53 -0
- package/scripts/add_payment_system.sql +96 -0
- package/scripts/add_sports_event_id_column.sql +22 -0
- package/scripts/analyze-cohort-data-heroku.js +276 -0
- package/scripts/analyze-cohort-data.js +295 -0
- package/scripts/analyze-prod-cohorts.sh +10 -0
- package/scripts/backfill-matchup-images.js +245 -0
- package/scripts/backfill-missing-signatures.js +175 -0
- package/scripts/backfill-referral-earnings.js +202 -0
- package/scripts/check-chat-schema.js +130 -0
- package/scripts/check-db.sh +14 -0
- package/scripts/check_oracle_in_game.js +54 -0
- package/scripts/cleanup-database.js +193 -0
- package/scripts/clear-notification-cache.js +85 -0
- package/scripts/convert-mnemonic.js +50 -0
- package/scripts/create-users-table.sql +44 -0
- package/scripts/debug-cohort-counts.js +248 -0
- package/scripts/debug-winner-calc.js +84 -0
- package/scripts/deploy-payment-system.sh +118 -0
- package/scripts/deploy-to-heroku.sh +63 -0
- package/scripts/diagnose-locked-round.js +143 -0
- package/scripts/dubs-cli.js +720 -0
- package/scripts/dump-account.js +65 -0
- package/scripts/find-vrf-offset.js +48 -0
- package/scripts/fix-chat-notifications-constraint.sql +122 -0
- package/scripts/fix-claim-columns.js +124 -0
- package/scripts/fix-constraint-now.js +44 -0
- package/scripts/fix-lock-timestamps.js +96 -0
- package/scripts/fix-locked-round.sh +126 -0
- package/scripts/fix-missing-badges.sql +91 -0
- package/scripts/fix-payment-notifications.sql +41 -0
- package/scripts/force-new-round.js +55 -0
- package/scripts/force-resolve-and-claim.js +278 -0
- package/scripts/important/README.md +115 -0
- package/scripts/important/authority-force-lock.js +197 -0
- package/scripts/important/authority-resolve-game.js +267 -0
- package/scripts/important/check-game-status.js +373 -0
- package/scripts/important/list-pending-games-by-version.js +270 -0
- package/scripts/important/reconcile-v1-v2-payouts.js +270 -0
- package/scripts/initialize-jackpot.js +111 -0
- package/scripts/jackpot/.claude/settings.local.json +10 -0
- package/scripts/jackpot/force-reset.js +84 -0
- package/scripts/jackpot/initialize-mainnet.js +100 -0
- package/scripts/jackpot/keeper.js +742 -0
- package/scripts/jackpot/status.js +107 -0
- package/scripts/jackpot/update-round-duration.js +143 -0
- package/scripts/keeper-bot.js +112 -0
- package/scripts/list-pending-games.js +131 -0
- package/scripts/migrate-chat-v2.js +127 -0
- package/scripts/migrate-chat-winners.js +84 -0
- package/scripts/migrate-chat.sh +17 -0
- package/scripts/migrate-game-invite.js +83 -0
- package/scripts/migrate-heroku-game-notifications.sh +159 -0
- package/scripts/migrations/001_analytics_tables.sql +422 -0
- package/scripts/migrations/002_add_matchup_image_url.sql +14 -0
- package/scripts/migrations/003_referral_earnings.sql +208 -0
- package/scripts/migrations/004_add_whats_new_notification_type.sql +62 -0
- package/scripts/migrations/005_add_connect4_your_turn_notification.sql +61 -0
- package/scripts/migrations/005_push_notifications.sql +55 -0
- package/scripts/migrations/006_add_draw_team_players.sql +28 -0
- package/scripts/migrations/006_add_game_cancelled_notification.sql +62 -0
- package/scripts/migrations/007_add_gif_url.sql +8 -0
- package/scripts/migrations/008_add_connect4_columns.sql +139 -0
- package/scripts/migrations/008_add_pool_tracking.sql +22 -0
- package/scripts/migrations/009_create_survivor_pool_tables.sql +174 -0
- package/scripts/migrations/010_add_survivor_pool_outcome.sql +28 -0
- package/scripts/migrations/011_create_developer_tables.sql +67 -0
- package/scripts/migrations/011_fix_keeper_tables.sql +85 -0
- package/scripts/migrations/012_create_developer_webhooks.sql +31 -0
- package/scripts/migrations/013_add_network_mode.sql +18 -0
- package/scripts/migrations/014_create_developer_app_users.sql +19 -0
- package/scripts/migrations/015_add_ui_config.sql +4 -0
- package/scripts/migrations/016_add_resolution_secret.sql +4 -0
- package/scripts/migrations/017_add_external_game_id.sql +3 -0
- package/scripts/migrations/018_create_pickem_tables.sql +115 -0
- package/scripts/migrations/019_expo_push_tokens.sql +19 -0
- package/scripts/migrations/create_whats_new_tables.sql +88 -0
- package/scripts/migrations/drop_live_games_tables.sql +34 -0
- package/scripts/open-jackpot-round.js +85 -0
- package/scripts/purge-all-data.sh +329 -0
- package/scripts/purge-all-data.sql +142 -0
- package/scripts/purge-heroku-data.sh +149 -0
- package/scripts/purge-heroku-data.sql +62 -0
- package/scripts/rebuild-heroku-database.sh +113 -0
- package/scripts/recover-funds.js +357 -0
- package/scripts/regenerate-epl-images.js +278 -0
- package/scripts/resize-s3-matchup-images.js +374 -0
- package/scripts/resolve-direct.js +88 -0
- package/scripts/resolve-mock-game.js +124 -0
- package/scripts/resolve-pickem-game.js +55 -0
- package/scripts/resolve-round-manual.js +83 -0
- package/scripts/resolve-stuck-game.js +382 -0
- package/scripts/resolve-stuck-round.js +42 -0
- package/scripts/run-connect4-migration.sh +16 -0
- package/scripts/run-mention-migration.sh +32 -0
- package/scripts/run-payment-migration.sh +51 -0
- package/scripts/run-preferred-currency-migration.sh +31 -0
- package/scripts/run-referral-earnings-migration.sh +32 -0
- package/scripts/run-survivor-outcome-migration.sh +16 -0
- package/scripts/seed-test-users.js +346 -0
- package/scripts/setup-auth-tables.js +78 -0
- package/scripts/setup-complete-database.sql +992 -0
- package/scripts/setup-database-fresh.sh +359 -0
- package/scripts/setup-heroku-keeper.sh +48 -0
- package/scripts/setup-keeper-database.js +83 -0
- package/scripts/setup-keeper-state-db.sql +110 -0
- package/scripts/setup-oracle.sh +39 -0
- package/scripts/setup-pnl-tracking.js +111 -0
- package/scripts/start-devnet.sh +14 -0
- package/scripts/test-arcade-devnet.sh +160 -0
- package/scripts/test-arcade-match.sh +109 -0
- package/scripts/test-automatic-mode.sh +239 -0
- package/scripts/test-connect4-cancel-claim.js +370 -0
- package/scripts/test-connect4-e2e.js +369 -0
- package/scripts/test-connect4-resolve.js +369 -0
- package/scripts/test-game-state-endpoint.js +136 -0
- package/scripts/test-invite-notification.js +86 -0
- package/scripts/test-jackpot-api.sh +71 -0
- package/scripts/test-poll-confirmation.js +267 -0
- package/scripts/test-resolve-game.js +271 -0
- package/scripts/test-resolve-signature.js +223 -0
- package/scripts/test-signature-preservation.js +124 -0
- package/scripts/test-state-machine.js +291 -0
- package/scripts/test-webhook-receiver.js +60 -0
- package/scripts/update-notification-constraint.js +52 -0
- package/scripts/verify-account-layout.js +145 -0
- package/scripts/verify-winner-algorithm.js +278 -0
- package/server.js +5259 -0
- package/services/arcadeMatchService.js +763 -0
- package/services/automaticGameOracle.js +1596 -0
- package/services/chatService.js +1612 -0
- package/services/connect4GameService.js +1049 -0
- package/services/connect4NotificationService.js +374 -0
- package/services/cryptoPriceService.js +223 -0
- package/services/customGameResolver.js +260 -0
- package/services/db.js +79 -0
- package/services/directMessageService.js +389 -0
- package/services/discordNotifications.js +160 -0
- package/services/exchangeRateService.js +289 -0
- package/services/expoPushService.js +314 -0
- package/services/gamesCacheService.js +539 -0
- package/services/jackpotHistory.js +331 -0
- package/services/jackpotService.js +856 -0
- package/services/keeperStateService.js +355 -0
- package/services/matchupImageService.js +591 -0
- package/services/notificationCacheService.js +407 -0
- package/services/pickemOracle.js +440 -0
- package/services/playerStatsService.js +389 -0
- package/services/portfolioService.js +555 -0
- package/services/promoService.js +757 -0
- package/services/promoTreasuryService.js +239 -0
- package/services/pushNotifications.js +353 -0
- package/services/redisService.js +422 -0
- package/services/referralEarningsService.js +728 -0
- package/services/s3Service.js +396 -0
- package/services/socialService.js +1202 -0
- package/services/survivorOracle.js +469 -0
- package/services/survivorSimulator.js +475 -0
- package/services/telegramNotifications.js +461 -0
- package/services/userProfileStatsService.js +1185 -0
- package/services/whatsNewService.js +388 -0
- 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
|
+
|