Troubleshooting.
Symptoms and fixes.
The most common problems and how to solve them. Console → Status and Console → Media jobs usually tell you the exact cause first.
01Where to look first
Commands on this page are for macOS or Linux. On Windows, run them in WSL (Windows Subsystem for Linux) or Git Bash.
- Console → Status: failing checks with what to set.
- Console → Media jobs: the exact error of each conversion or AI job, with Retry.
- The server log:
journalctl -u reelora,pm2 logs reeloraordocker logs reelora. - Health check:
curl https://<your domain>/healthzshould answer{"ok":true}.
02Server and console
| Symptom | Fix |
|---|---|
| Uploads stay "processing" or fail | Install ffmpeg (or set FFMPEG_PATH / FFPROBE_PATH); open Media jobs for the exact error and retry. |
| Upload fails at once behind nginx | Raise client_max_body_size to your largest upload. |
| Videos do not play on the web | Check Media & CDN → Public server address. With a CDN, check the pull zone origin. A 403 in the browser console means an expired link: reload. |
| With BunnyCDN token mode every video fails | The edge rule must send x-origin-secret with exactly the value of ORIGIN_PULL_SECRET; restart the server after changing .env. |
| Stripe payments do not arrive | The webhook endpoint must be https://<domain>/api/webhooks/stripe with the three events listed on Payments and the signing secret saved in Integrations. |
| A viewer forgot their password | Viewers see "Forgot your password?" on the sign-in screen, which tells them to write to your support e-mail (Console → Brand → Support e-mail) from the account's address. Check that the e-mail matches, then open Viewers, the viewer, Reset password, and give a reason. The console shows a new one-time password once; send it to the viewer. The viewer is signed out everywhere and the reset is in the audit log. Coins, VIP days and purchases stay on the account. |
| Console says "Too many sign-in attempts" | Wait 15 minutes, or reset the owner password on the server (reset-owner). Behind a proxy, set TRUST_PROXY_HOPS so that one visitor does not slow sign-in for everyone. |
| Saved secrets cannot be read after a move | The new server has a different ADMIN_SECRET_KEY. Restore the original key, or enter the secrets again. |
| Warning "ADMIN_SECRET_KEY is not set" | Set it in .env (how). Until then a generated key file in the data folder is used. |
npm ci fails building better-sqlite3 | Install python3, make and g++ (or use the Docker image). |
seed:sample fails | It needs ffmpeg and ImageMagick 7 (magick, or set MAGICK_PATH). |
| Blocked countries has no effect | Set COUNTRY_HEADER to the header your CDN fills (Cloudflare: cf-ipcountry) and restart. |
03"Too many attempts" when opening the app or web player
Guest accounts are limited to 30 per IP address per hour (server/src/api.ts). Real viewers never reach it, but repeated test runs or many devices behind one office IP can.
Wait an hour, or on a test server (stopped, test data folder only) run npm run e2e:prepare, which clears the guest sign-up limit but also changes missions and series for the test suite.
Behind a proxy, make sure TRUST_PROXY_HOPS is set, otherwise every viewer appears to come from the proxy's address.
04Mobile app
| Symptom | Fix |
|---|---|
| "No connection to the server" | Build with --dart-define=API_BASE_URL=https://… and check the server is reachable over https from the phone. |
| Android emulator cannot reach the local server | The emulator reaches your computer as 10.0.2.2; that is the default without API_BASE_URL. |
| Store shows no products | Payments must be on, the mode for that platform must include store purchases, and the product ids in Console → Store must match App Store Connect / Play Console exactly. New products can take a while to appear in the stores. |
| Purchases fail verification | Check iOS bundle id and App Store environment (sandbox needs "Sandbox and Production"), Android package name and the Google Play service account (use Test in Integrations). |
| No ads in a release build | Set the AdMob unit ids in the console and your own app ids in the platform files; turn Rewarded ads on. |
| Ad watched but no reward | The SSV callback URL in AdMob must be https://<domain>/api/ads/admob/ssv. |
| No push notifications | All Firebase defines passed at build time, Push on in the console, service account saved; on iOS the APNs key uploaded and the Push Notifications capability added. |
| Share links open the browser, not the app | Console → App links filled in, appLinkHost set (Android), Associated Domains added (iOS). Check https://<domain>/.well-known/assetlinks.json. |
05Xcode 27: simulator build fails
flutter build ios --simulator fails on Xcode 27. Run the app on the simulator with flutter run, or open app/ios/Runner.xcworkspace in Xcode and press Run. Device and archive builds (flutter build ipa, Product → Archive) are separate from this.
The project already contains the SceneDelegate that recent iOS versions expect (app/ios/Runner/SceneDelegate.swift); keep it when you change the iOS project.
06CocoaPods errors
cd app/ios && pod install --repo-update
cd .. && flutter clean && flutter pub get