ComusThumbz Documentation
Admin Login

ComusThumbz Troubleshooting


Overview

This guide consolidates troubleshooting information for the entire ComusThumbz CMS, covering both the backend admin panel (ct/admin/) and the frontend public pages (project root). Issues are organized by category with symptoms, causes, and solutions.

 

Tip: Before diving into specific issues, run through the Quick Diagnostic Checklist below to identify the most common problems.

 


Quick Diagnostic Checklist

Run through these checks in order when encountering any issue:

  1. PHP error log - Check ct/logs/ and your server's PHP error log for recent errors
  2. Cron jobs - Verify cron jobs are running (most "data not updating" issues)
  3. File permissions - Web server must have read/write access to uploads/, ct/logs/, ct/dat/
  4. Database connection - Test with https://yourdomain.com/tools/simpletest.php?key=comus2025
  5. API health - Test with https://yourdomain.com/ct/api/v1/features
  6. Feature toggles - Disabled features are the most common cause of "page not showing"
  7. Browser console - Check for JavaScript errors (F12 -> Console)
  8. Network tab - Check for failed API requests (F12 -> Network)

Server & PHP Errors

Blank Page / 500 Internal Server Error

 

Error:
Symptom: Page shows completely blank or returns HTTP 500 with no visible error.

 

Common Causes:

  1. declare(stricttypes=1) placement - Must be the FIRST line after <?php. Any whitespace, BOM character, or code before it causes a fatal error.
<?php
   declare(stricttypes=1);  // MUST be here, line 2
  1. PHP syntax error - Check the error log:
tail -50 /var/log/php/error.log
  1. Missing include file - A requireonce for a file that doesn't exist:
grep -r "requireonce" ct/admin/yourpage.php
  1. Display errors disabled - Temporarily enable for debugging:
iniset('displayerrors', 1);
   errorreporting(EALL);

Solution: Check PHP error log first. If empty, enable displayerrors temporarily to see the actual error.

 

AdminLanguage Singleton Error

 

Error:
Symptom: Fatal error: Cannot instantiate AdminLanguage or similar 500 error on admin pages.

 

Cause: Using new AdminLanguage() instead of the singleton pattern.

Fix:

// WRONG

$lang = new AdminLanguage();

 


// CORRECT
$lang = AdminLanguage::getInstance();

 

Memory Limit Exhausted

 

Error:
Symptom: Fatal error: Allowed memory size of X bytes exhausted

 

Common triggers:

  • Large video file uploads
  • Processing large image galleries
  • Bulk operations on 400K+ cam performer records

 

Solution: Increase PHP memory limit:

; php.ini

memorylimit = 512M        ; Minimum recommended

uploadmaxfilesize = 2G    ; For video uploads

postmaxsize = 2G          ; Must be >= uploadmaxfilesize

 

Or per-script:

iniset('memorylimit', '512M');

 

Max Execution Time Exceeded

 

Error:
Symptom: Fatal error: Maximum execution time of 30 seconds exceeded

 

Common triggers:

  • Video processing cron jobs
  • Large database queries
  • External API calls timing out

 

Solution:

; php.ini

maxexecutiontime = 300    ; 5 minutes for web requests

 

For cron jobs, set unlimited:

settimelimit(0);

 

File Permission Errors

 

Error:
Symptom: Permission denied errors when writing files or creating directories.

 

Required permissions:

Directory Permission Purpose
uploads/ 775 User uploads, avatars, content
uploads/videos/original/ 775 Raw video uploads
uploads/ftpuploads/ 775 FTP bulk upload intake
ct/logs/ 775 Application logs
ct/dat/ 775 Configuration files
assets/images/ 755 Static images
Fix:
chown -R www-data:www-data uploads/ ct/logs/ ct/dat/
chmod -R 775 uploads/ ct/logs/ ct/dat/

Database Issues

Database Connection Failed

 

Error:
Symptom: Pages fail to load, API returns 500 errors, "Connection refused" in logs.

 

Diagnosis:

  1. Test with the quick database tool:

https://yourdomain.com/tools/simpletest.php?key=comus2025

 

  1. Verify credentials in ct/dat/config.inc.php:
$dbhost = 'localhost';
   $dbuser = 'admincomus';
   $dbpasswd = 'yourpassword';
   $db = 'admincomus';
  1. Check MySQL is running:
systemctl status mysql

Solution: Verify MySQL service is running and credentials match the database configuration.

 

Table Locks & Blocking Queries

 

Error:
Symptom: API calls timeout but direct database queries are fast. Pages hang for 30-60 seconds.

 

Diagnosis:

  1. Run the MySQL Status tool:
https://yourdomain.com/tools/mysqlstatus.php?key=comus2025

 

  1. Check for blocking queries:
SHOW FULL PROCESSLIST;
Look for queries running longer than 30 seconds.
  1. Use the Database Lock Inspector for InnoDB lock analysis:
https://yourdomain.com/tools/dblockinspector.php?key=comus2025

Solution:

  1. Kill the blocking query:

KILL <processid>;

 

  1. Or via the debug tool:
https://yourdomain.com/tools/mysqlstatus.php?key=comus2025&kill=PROCESSID

Common culprit: The apicron.php marksiteperformersoffline() function updating all performers at once. This was fixed with batched updates (1000 rows at a time with 10ms pauses).

 

Slow Queries

 

Error:
Symptom: Specific pages load slowly, especially cam performers or video listings.

 

Diagnosis:

-- Check table locks

SHOW OPEN TABLES WHERE Inuse > 0;

 


-- Analyze table performance
ANALYZE TABLE tblCamsPerformers;
ANALYZE TABLE tblVideos;


-- Check index usage
SHOW INDEX FROM tblCamsPerformers;
SHOW INDEX FROM tblVideos;

 

Solution:

  1. Verify indexes exist on frequently-queried columns
  2. Use EXPLAIN on slow queries to identify missing indexes
  3. Check if APCu cache is working (php -m | grep apcu)
  4. For cam performers, use ?fast=1 to skip COUNT queries

 

SQL Debugging Commands

 

Configuration Required:
Quick reference for manual database debugging:

 

-- Show all running queries
SHOW FULL PROCESSLIST;

-- Kill a specific query
KILL 123;


-- Kill all sleeping connections older than 30 seconds
SELECT CONCAT('KILL ', id, ';')
FROM informationschema.processlist
WHERE Command='Sleep' AND Time > 30;


-- Check table locks
SHOW OPEN TABLES WHERE In
use > 0;


-- Check InnoDB status for deadlocks
SHOW ENGINE INNODB STATUS;

 


Video Processing

Videos Stuck at 'pending'

 

Error:
Symptom: Videos uploaded but never process. Status remains 'pending' indefinitely.

 

This is the most common video issue. Check these in order:

  1. Cron jobs not running - The video processor runs on a schedule:
# Must be in crontab
  • php /path/to/ct/admin/cron/ftpvideoprocessor.php

   /5     php /path/to/ct/admin/cron/videoprocessor.php
  1. Wrong filepath format in database - The most common data bug:
-- Check filepath format
   SELECT videoid, filepath, status FROM tblVideos WHERE status='pending';

File path MUST be: uploads/videos/original/{filename}

NOT just the filename, and NOT including ct/ prefix.

  1. Fix incorrect file paths:
-- Fix paths that are just filenames
   UPDATE tblVideos
   SET filepath = CONCAT('uploads/videos/original/', filepath)
   WHERE filepath NOT LIKE 'uploads/%'
     AND filepath NOT LIKE '%/%'
     AND status = 'pending';
  1. Clear stuck processing queue:
DELETE FROM tblVideoProcessingJobs
   WHERE videoid IN (SELECT videoid FROM tblVideos WHERE status = 'pending');
  1. Verify the file exists on disk:
ls -la /path/to/ct/uploads/videos/original/

FFmpeg / FFprobe Not Found

 

Error:
Symptom: Video processing fails with "FFmpeg not found" or "FFprobe not found" in logs.

 

Diagnosis:

which ffmpeg

which ffprobe

ffmpeg -version

 

Solution:

  1. Install FFmpeg:

sudo apt install ffmpeg    # Debian/Ubuntu

 

  1. Verify paths in config match actual locations:
// ct/dat/config.inc.php
   $ffmpegpath = '/usr/bin/ffmpeg';
   $ffprobepath = '/usr/bin/ffprobe';
  1. Ensure PHP can execute shell commands:
// Check if exec() is disabled
   vardump(functionexists('exec'));

Video Processing Errors

 

Error:
Symptom: Videos change to 'error' status after processing attempt.

 

Diagnosis:

  1. Check processing logs:

tail -100 ct/logs/videoprocessor/.log

 

  1. Check the video record:
SELECT videoid, filepath, status, errormessage
   FROM tblVideos WHERE status = 'error'
   ORDER BY videoid DESC LIMIT 10;

Common causes:

  • Corrupted source file
  • Unsupported codec
  • Insufficient disk space
  • FFmpeg version too old (need 4.0+)

 

Solution: Fix the underlying cause, then reset the video for reprocessing:

UPDATE tblVideos SET status = 'pending', errormessage = NULL

WHERE videoid = <ID>;

 

HLS Streaming Not Working

 

Error:
Symptom: Video player shows error or falls back to MP4. HLS .m3u8 files not loading.

 

Diagnosis:

  1. Check if HLS files were generated:

SELECT videoid, hlspath FROM tblVideoFiles WHERE videoid = <ID>;

 

  1. Verify the master playlist is accessible:
curl -I https://cdn.example.com/videos/{shard}/{id}/hls/master.m3u8
  1. Check MIME type configuration. Your web server must serve .m3u8 as application/vnd.apple.mpegurl:
# Apache .htaccess
   AddType application/vnd.apple.mpegurl .m3u8
   AddType video/MP2T .ts

Solution: Verify HLS files exist on CDN, MIME types are correct, and securemedia.php token is valid.

 

Thumbnails Not Generating

 

Error:
Symptom: Videos process but have no poster image, preview, or timeline thumbnails.

 

Diagnosis:

SELECT videoid, posterpath, previewpath

FROM tblVideoFiles WHERE videoid = <ID>;

 

Common causes:

  • ImageMagick not installed (convert command needed for contact sheets)
  • FFmpeg failed during thumbnail extraction
  • CDN upload for thumbnails failed (check storage server logs)

 

Solution:

# Verify ImageMagick

which convert

convert --version

 


Reprocess thumbnails only


php ct/admin/cron/videoprocessor.php --video-id=<ID> --thumbnails-only

CDN Upload Failures

 

Error:
Symptom: Video processes locally but files don't appear on CDN storage server.

 

Diagnosis:

  1. Check storage server configuration:

SELECT  FROM tblStorageServers WHERE enabled = 1;

   SELECT  FROM tblStorageServerGroups;

 

  1. Check file location records:
SELECT  FROM tblStorageFileLocations WHERE videoid = <ID>;
  1. Verify CDN credentials and connectivity from the admin panel.

File sharding formula: floor(videoid / 1000) 1000
Example: Video ID 4321 goes to shard 4000:

https://cdn.example.com/videos/4000/4321/webmp4/web.mp4

 

Solution: Check CDN credentials, test connectivity, verify storage server group assignment.

 

Distributed Conversion Server Issues

 

Error:
Symptom: Videos not being assigned to remote conversion servers, or remote processing fails.

 

Diagnosis:

  1. Check server status:

SELECT serverid, title, statusid, currentjobs, maxconcurrentjobs,

          lastheartbeat, loadaverage

   FROM tblConversionServers WHERE statusid = 1;

 

  1. Check conversion logs:
SELECT  FROM tblConversionServerLogs
   WHERE loglevel IN ('WARNING', 'ERROR')
   ORDER BY createdat DESC LIMIT 20;
  1. Verify settings:
SELECT  FROM tblSettings WHERE settinggroup = 'videoprocessing';

Solution:

  • Ensure conversionuseremoteservers is set to 1
  • Verify remote server SSH/FTP connectivity
  • Check that FFmpeg is installed on remote servers
  • Verify conversionfallbacktolocal is 1 for automatic fallback

 


API Issues

API Authentication Failures

 

Error:
Symptom: API returns 401 Unauthorized or "Invalid token" errors.

 

Common causes:

  1. Wrong user ID column - tblCMSUsers uses id, NOT userid:
-- CORRECT
   SELECT id, username, accountstatus FROM tblCMSUsers WHERE id = 123;

-- WRONG (column doesn't exist)
SELECT userid FROM tblCMSUsers;

 

  1. Wrong status column - tblCMSUsers uses accountstatus, NOT status:
-- CORRECT
   WHERE accountstatus = 'active'

-- WRONG
WHERE status = 'active'

 

  1. JWT token expired - Tokens have an expiration time. Re-authenticate:
POST /ct/api/v1/auth/login
  1. JWT secret mismatch - Verify in config:
$jwtsecret = md5($domain . $licensekey);

API Calls Failing from JavaScript

 

Error:
Symptom: Frontend pages can't load data. Browser console shows fetch errors.

 

Diagnosis:

  1. Check ApiClient base URL:

// Browser console

   const api = new ApiClient();

   console.log(api.baseUrl);

 

  1. Check Network tab (F12) for the failing request - note the URL, status code, and response body.
  1. Verify the endpoint exists in the router:
  • File: ct/api/v1/index.php
  • 90+ endpoints defined
  1. Check JWT token:
console.log(localStorage.getItem('authtoken'));

Solution: Verify base URL detection, check endpoint exists in router, verify authentication token if endpoint requires auth.

 

API Returns Empty Data

 

Error:
Symptom: API returns {"success": true, "data": []} with no content.

 

Diagnosis:

  1. Check if data exists in the database:

SELECT COUNT() FROM tblVideos WHERE status = 'active';

   SELECT COUNT() FROM tblCamsPerformers WHERE status = 1 AND enabled = 1;

 

  1. Check feature toggles - some API endpoints return empty when features are disabled.
  1. Check query parameters - pagination offset may be beyond available data.

Solution: Verify data exists in the database and feature toggles are enabled.

 

CORS Errors

 

Error:
Symptom: Browser console shows Access-Control-Allow-Origin errors.

 

Cause: API and frontend on different domains or ports.

Solution: Ensure the API sets proper CORS headers:

header('Access-Control-Allow-Origin: https://yourdomain.com');

header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');

header('Access-Control-Allow-Headers: Content-Type, Authorization');

 

Or in .htaccess:

Header set Access-Control-Allow-Origin "https://yourdomain.com"

 


Frontend Issues

Features Not Showing / All Disabled

 

Error:
Symptom: Pages redirect with "feature disabled" message, or navigation items are missing.

 

Diagnosis:

  1. Test the features API endpoint:

curl https://yourdomain.com/ct/api/v1/features

 

  1. Check feature cache - APCu may have stale data:
// Clear APCu cache
   apcuclearcache();
  1. Check featurehelper.php - all features default to enabled if not found in database.
  1. Verify feature settings in admin panel: Admin Panel -> Feature Toggles

Solution: Clear APCu cache, verify feature settings in admin panel, check that the API is reachable.

 

Translations Not Loading

 

Error:
Symptom: Translation keys displayed instead of text (e.g., videos.title instead of "Videos").

 

Diagnosis:

  1. Verify lang/en.json exists and is valid JSON:
php -r "jsondecode(filegetcontents('lang/en.json')); echo jsonlasterrormsg();"

 

  1. Check file permissions (must be readable by web server).
  1. Verify the translation key exists in the JSON:
# Search for a specific key
   grep -o '"videos"' lang/en.json
  1. Check for typos in nested keys - videos.sortby.videoid requires all parent keys to exist.

Solution: Validate JSON syntax, check file permissions, verify key path exists in the translation file.

 

CSS Styles Not Applying

 

Error:
Symptom: Page looks unstyled or broken layout.

 

Rules:

  1. Only use assets/css/style.css - no external CSS frameworks (Bootstrap, Tailwind, etc.)
  2. Check for specificity conflicts with Style Manager overrides (Phase 12)
  3. Verify the stylesheet is loaded in includes/header.php
  4. Check browser cache - append ?v=timestamp to stylesheet URL

 

Solution:

// Force cache bust

<link rel="stylesheet" href="assets/css/style.css?v=<?= time() ?>">

 

Dark Mode Not Working

 

Error:
Symptom: Dark mode toggle doesn't change the page appearance.

 

Diagnosis:

  1. Check featuredarkmode is enabled in feature toggles
  2. Verify localStorage is available:

console.log(localStorage.getItem('comusdarkmode'));

  1. Confirm body.dark-mode CSS rules exist in assets/css/style.css
  2. Check that both body and html elements get the class:

document.body.classList.contains('dark-mode');

   document.documentElement.classList.contains('dark-mode');

 

Solution: Enable the feature toggle, clear localStorage, verify CSS dark mode rules exist.

 

Video Player Not Loading

 

Error:
Symptom: Video player area is blank, shows error, or spinner never completes.

 

Diagnosis:

Check browser Network tab for /ct/api/v1/videos/{id} requestVerify video data is returned with valid URLsCheck access control - user may lack permission (free/premium/VIP)For HLS: verify HLS.js is loaded and browser supports it
  1. Check securemedia.php token generation:

GET /securemedia.php?token=...&type=video&id=...

 

Solution: Check API response, verify access control, ensure HLS.js or native HLS support is available, verify media token is valid.

 

Click Tracking Not Working

 

Error:
Symptom: External links not being tracked, or affiliate revenue is missing.

 

Critical rule: ALL external links MUST route through click.php. Direct links incur a 100% skim penalty.

Correct format:

// PHP

$url = sprintf('click.php?url=%s&type=video&id=%d',

    urlencode($externalurl), $videoid);

 


// JavaScript
const url = click.php?url=${encodeURIComponent(externalUrl)}&type=${type}&id=${id};

 

Diagnosis:

  1. Check that click.php exists at the project root
  2. Verify tblClickTracking is receiving records:

SELECT  FROM tblClickTracking ORDER BY clickid DESC LIMIT 10;

  1. Check tblContentClicks for aggregated counts

 

Solution: Audit all external links to ensure they use click.php. Use browser DevTools to verify link href attributes.

 

SEO Meta Tags Missing

 

Error:
Symptom: Social media shares show generic or missing preview data. Search engines don't index properly.

 

Cause: SEO data must be loaded BEFORE header.php is included.

Correct order:

// 1. Load config and API helper FIRST

requireonce DIR . '/ct/dat/config.inc.php';

requireonce DIR . '/includes/InternalApiHelper.php';

 


// 2. Fetch data for SEO
$api = InternalApiHelper::getInstance();
$videoData = $api->getVideoForSeo($videoId);


// 3. NOW include header (generates meta tags from loaded data)
requireonce DIR . '/includes/header.php';

 

Diagnosis:

View page source and check for <meta property="og:title"> tagsUse Facebook/Twitter debugger tools to validate Open Graph tags
  • Check ct/dat/seosettings.json for template configuration

 

Solution: Ensure SEO data is loaded before header, verify SeoHelper.php and InternalApiHelper.php are working.

 


Cam Performers System

No Performers Appearing

 

Error:
Symptom: Cam performers page is empty, no performer cards shown.

 

Diagnosis (in order):

  1. Check cron jobs are running:

php ct/admin/cronupdatecams.php

  1. Verify API credentials in Admin -> Cam Settings
  2. Check tblCamsSites for enabled sites:

SELECT recordnum, name, enabled FROM tblCamsSites WHERE enabled = 1;

  1. Verify featurelivecams is enabled in feature toggles
  2. Check logs:

tail -50 ct/logs/cron-update.log

  1. Test the internal API directly:
GET /ct/api/v1/cams/online?perpage=1&fast=1

 

Solution: Enable cron jobs, verify API credentials, enable the feature toggle.

 

All Performers Showing Offline

 

Error:
Symptom: Performers exist but all show as offline.

 

Diagnosis:

  1. Run the cron update manually:

php ct/admin/cronupdatecams.php

  1. Check if external API is responding:

curl --location 'https://performersext-api.pcvdaa.com/performers-ext/?token=<TOKEN>&gender=f&live=true&size=1&page=1' \

   --header 'x-api-key: <APIKEY>' \

   --header 'User-Agent: ComusThumbz/1.0'

  1. Verify API token hasn't expired
  2. Check database for online performers:
SELECT COUNT() FROM tblCamsPerformers WHERE status = 1;

 

Solution: Run cron manually, verify external API credentials are valid.

 

External API 403 Forbidden

 

Error:
Symptom: External CrakRevenue API returns {"message": "Forbidden"} or HTML error page.

 

Causes:

  1. Missing or invalid x-api-key header
  2. Missing User-Agent header (returns HTML error page)
  3. API key revoked by CrakRevenue

 

Diagnosis:

-- Check stored API credentials

SELECT recordnum, name, apiData, parameters FROM tblCamsSites WHERE enabled = 1;

 

Solution: Verify x-api-key (stored in tblCamsSites.apiData) and ensure requests include a User-Agent header. Contact CrakRevenue if key was revoked.

 

External API 401 Unauthorized

 

Error:
Symptom: External API returns {"message": "Unauthorized: brands not allowed"} or similar.

 

Causes:

  1. Invalid or missing token parameter
  2. Requesting brands not authorized for your token
  3. Token is domain-bound and being used from wrong domain

 

Diagnosis:

-- Check token values

SELECT recordnum, name, parameters, brand FROM tblCamsSites WHERE enabled = 1;

 

Solution: Verify token (stored in tblCamsSites.parameters), ensure you only request authorized brands, verify token is for your domain.

 

Slow Cam Performers Page

 

Error:
Symptom: Cam performers page takes 5+ seconds to load.

 

Diagnosis:

  1. Use the debug panel: add ?debug=1 to the URL to see timing breakdown
  2. Use the full debug tool:
https://yourdomain.com/tools/camperformersdebug.php?key=comus2025

 

Optimization checklist:

  1. Enable fast mode - ensure frontend uses ?fast=1 parameter
  2. Check APCu is installed and enabled:

php -m | grep apcu

  1. Verify stats cache cron is running:

/2     php /path/to/ct/admin/cron/updatecamperformerstats.php

  1. Reduce perpage to 24 or less
  2. Check for blocking database queries (see Table Locks)

 

Three-layer caching strategy:

  • Layer 1: APCu in-memory cache (30s TTL)
  • Layer 2: Database stats cache (tblCamsPerformersStatsCache)
  • Layer 3: Fast mode (skip COUNT queries entirely)

 

Solution: Enable all three caching layers and verify cron jobs are running.

 

Affiliate Revenue Missing

 

Error:
Symptom: Clicks on cam performers not tracking, affiliate commissions not appearing.

 

Cause: External performer links not routed through click.php.

Required format:

$clickurl = sprintf('click.php?url=%s&type=camperformer&id=%d',

    urlencode($performer['chatroomurl']), $performer['performerid']);

 

Also verify:

  • Affiliate ID is present in the roomUrl from the external API
  • tblClickTracking is recording cam performer clicks
  • Performer chatroomurl contains valid affiliate tracking parameters

 

Solution: Audit all performer links to ensure click.php routing. Verify affiliate ID in room URLs.

 


Live Streaming (LiveKit)

LiveKit Server Not Starting

 

Error:
Symptom: Docker container won't start or crashes immediately.

 

Diagnosis:

# Check container status

docker ps -a | grep livekit

 


Check logs


docker logs livekit

Verify Docker is running


systemctl status docker

Common causes:

  1. Port conflicts (7880, 7881, 40000-40100 already in use)
  2. Invalid livekit-config.yaml syntax
  3. Docker not installed or not running
  4. Insufficient permissions

 

Solution:

# Check port availability

ss -tlnp | grep 7880

 


Restart container


docker restart livekit

Or recreate


docker rm -f livekit
docker run -d --name livekit --network host \
  -v $(pwd)/livekit-config.yaml:/livekit.yaml:ro \
  livekit/livekit-server:latest --config /livekit.yaml

Stream Not Connecting

 

Error:
Symptom: Creator clicks "Start Streaming" but video never appears. Viewers see loading spinner.

 

Diagnosis:

  1. Check LiveKit config in ct/dat/config.inc.php:

define('LIVEKITHOST', 'wss://yourdomain.com/livekit/');

   define('LIVEKITAPIKEY', 'yourkey');

   define('LIVEKITAPISECRET', 'yoursecret');

 

  1. Verify WebSocket connection from browser:
  • Open browser console (F12)
  • Look for WebSocket connection errors
  • Check if wss:// URL is accessible
  1. Verify firewall rules:
sudo ufw status | grep -E "7880|7881|40000"

Required ports:

  • 7880 - WebSocket signaling
  • 7881 - TCP media
  • 40000-40100 - UDP media (WebRTC)

 

Solution: Verify LiveKit credentials match between config and server, check firewall ports, ensure SSL is configured for wss://.

 

High Latency / Buffering

 

Error:
Symptom: Live stream has noticeable delay (>2 seconds) or frequent buffering.

 

Causes:

  1. UDP ports blocked - WebRTC falls back to TCP (higher latency)
  2. Server overloaded
  3. Client bandwidth insufficient

 

Solution:

  1. Ensure UDP ports 40000-40100 are open
  2. Check server load:

top -bn1 | head -5
  1. Verify nodeip in livekit-config.yaml matches your public IP

 

Chat Not Working

 

Error:
Symptom: Chat messages not sending or not appearing for other viewers.

 

Diagnosis:

  1. Check tblLiveStreamChat for recent messages:
SELECT  FROM tblLiveStreamChat ORDER BY id DESC LIMIT 10;

  1. Verify WebSocket connection in browser console
  2. Check that the stream ID is valid in tblLiveStreams

 

Solution: Verify stream exists, WebSocket is connected, and chat API endpoint is responding.

 


Creator Monetization

Tips Not Processing

 

Error:
Symptom: Tips sent but not appearing in creator's balance or transaction history.

 

Diagnosis:

-- Check recent token transactions

SELECT  FROM tblTokenTransactions ORDER BY createdat DESC LIMIT 10;

 


-- Check creator tips
SELECT
FROM tblCreatorTips ORDER BY created
at DESC LIMIT 10;


-- Check user token balance
SELECT id, username, tokenbalance FROM tblCMSUsers WHERE id = <USERID>;

 

Common causes:

  • Insufficient token balance
  • Creator profile not verified
  • API endpoint error (check response)

 

Solution: Verify sender has sufficient tokens, creator profile is active, and POST /tips/send returns success.

 

Earnings Not Aggregating

 

Error:
Symptom: Creator earnings dashboard shows $0 despite receiving tips/subscriptions.

 

Cause: Earnings aggregation cron job not running.

Required cron:

     php /path/to/ct/admin/cron/aggregatecreatorearnings.php

 

Diagnosis:

-- Check daily earnings records

SELECT  FROM tblCreatorEarningsDaily

WHERE creatorid = <ID>

ORDER BY earningdate DESC LIMIT 10;

 


-- Check if raw transactions exist
SELECT SUM(amount) as total
FROM tblTokenTransactions
WHERE recipientid = <ID> AND createdat >= CURDATE();

 

Solution: Ensure the aggregatecreatorearnings.php cron job is running every minute.

 

Creator Posts Not Displaying

 

Error:
Symptom: Creator wall is empty or posts aren't visible.

 

Diagnosis:

  1. Check featurecreatorposts is enabled
  2. Verify posts exist:

SELECT  FROM tblCreatorPosts WHERE creatorid = <ID> ORDER BY createdat DESC LIMIT 10;

  1. Check post visibility settings (public vs subscriber-only vs PPV)
  2. Verify media uploads if post contains images/video:
SELECT  FROM tblCreatorPostMedia WHERE postid = <POSTID>;

 

Solution: Enable the feature toggle, verify posts exist in the database, check access control for post visibility.

 

Subscription Issues

 

Error:
Symptom: Subscriptions not activating, or subscribers can't access content.

 

Diagnosis:

-- Check active subscriptions

SELECT  FROM tblCreatorSubscriptions

WHERE subscriberid = <USERID> AND status = 'active';

 


-- Check subscription packages
SELECT
FROM tblCreatorSubscriptionPackages WHERE creatorid = <CREATORID>;

 

Solution: Verify featuresubscriptions is enabled, check payment processing, verify subscription record status.

 


Authentication & Users

Login Fails

 

Error:
Symptom: Login form returns error or redirects back without logging in.

 

Diagnosis:

  1. Test the auth API directly:

POST /ct/api/v1/auth/login

   {"username": "test", "password": "test"}

 

  1. Check user account status:
SELECT id, username, accountstatus, emailverified
   FROM tblCMSUsers WHERE username = 'testuser';

Remember: column is accountstatus, NOT status.

  1. Check if account is locked, suspended, or unverified.

Solution: Verify account exists, is active (accountstatus = 'active'), and email is verified if required.

 

Session Issues

 

Error:
Symptom: User logged in via API but pages don't recognize session. Constant redirects to login.

 

Diagnosis:

  1. Check auth/setsession.php is being called after login
  2. Verify session cookie is being set:

document.cookie  // Check for PHP session cookie

  1. Check PHP session configuration:
vardump(sessionstatus());  // Should be PHPSESSIONACTIVE

   vardump($SESSION);         // Should contain user data

 

Solution: Ensure setsession.php is called after API login returns JWT token. Verify session cookie domain matches.

 

2FA Problems

 

Error:
Symptom: Two-factor authentication code rejected, or 2FA setup fails.

 

Diagnosis:

  1. Check feature2fa is enabled
  2. Verify server time is accurate (TOTP codes are time-based):

date

   timedatectl status

  1. Time drift of >30 seconds will cause code rejection.

 

Solution: Sync server time with NTP, verify 2FA secret is stored correctly.

 


Cron Jobs

Verifying Cron Jobs Are Running

 

Configuration Required:
Check if cron jobs are configured:

 

crontab -l

Check if they've run recently:

# Check video processor logs
ls -la ct/logs/videoprocessor/

Check last modification of log files


stat ct/logs/cron-update.log

Test a cron job manually:

php ct/admin/cron/videoprocessor.php

echo $?  # 0 = success

 

Required Cron Schedule

 

Configuration Required:
The following cron jobs must be running for full system operation:

 

# Video Processing (CRITICAL)
  • php /path/to/ct/admin/cron/ftpvideoprocessor.php

/5     php /path/to/ct/admin/cron/videoprocessor.php
/5     php /path/to/ct/admin/cron/conversionpoller.php

Cam Performers


/5     php /path/to/ct/admin/cronupdatecams.php
/2     php /path/to/ct/admin/cron/updatecamperformerstats.php
0 3      php /path/to/ct/admin/cron/maintenancecamperformers.php

Creator Monetization


  • php /path/to/ct/admin/cron/aggregatecreatorearnings.php

Site Maintenance


0 0      php /path/to/ct/admin/cron/generatesitemap.php
0 1      php /path/to/ct/admin/cron/sitecron.php

Impact of missing cron jobs:

Missing Cron Impact
videoprocessor.php Videos stuck at 'pending' forever
ftpvideoprocessor.php FTP uploads never processed
cronupdatecams.php Cam performer data goes stale
updatecamperformerstats.php Stats cache outdated, slow page loads
aggregatecreatorearnings.php Creator earnings show $0
generatesitemap.php Search engines can't discover new content

Debug Tools Reference

 

Note:
All debug tools require the security key parameter: ?key=comus2025

 

Tool URL Purpose
simpletest.php /tools/simpletest.php?key=comus2025 Quick database connectivity test
camperformersdebug.php /tools/camperformersdebug.php?key=comus2025 Full cam API chain test (MySQL, sites API, online API, direct DB)
mysqlstatus.php /tools/mysqlstatus.php?key=comus2025 MySQL status + kill blocking queries
dblockinspector.php /tools/dblockinspector.php?key=comus2025 InnoDB lock analysis, metadata locks, deadlocks
baredbtest.php /tools/baredbtest.php?key=comus2025 Ultra-minimal database connection test

Kill a blocking query via URL:

https://yourdomain.com/tools/mysqlstatus.php?key=comus2025&kill=PROCESSID

Cam performers debug panel:

https://yourdomain.com/camperformers.php?debug=1


Shows: API URL, TTFB, download time, JSON parse time, DOM render time.

 


Log File Locations

Log Location Contains
Video Processor ct/logs/videoprocessor/ FFmpeg output, processing status, errors
Cron Updates ct/logs/cron-update.log Cam performer sync logs
API Errors ct/logs/api/ REST API error responses
PHP Errors /var/log/php/error.log (server-specific) PHP fatal errors, warnings
Apache/Nginx /var/log/apache2/error.log or /var/log/nginx/error.log Web server errors
LiveKit docker logs livekit Streaming server logs

Common SQL Fixes

 

Configuration Required:
Frequently-used SQL commands for fixing common data issues:

 

-- Fix videos with incorrect filepath (just filename, missing path)
UPDATE tblVideos
SET filepath = CONCAT('uploads/videos/original/', filepath)
WHERE filepath NOT LIKE 'uploads/%'
  AND filepath NOT LIKE '%/%'
  AND status IN ('pending', 'error');

-- Reset errored videos for reprocessing
UPDATE tblVideos SET status = 'pending', errormessage = NULL
WHERE status = 'error' AND video
id IN (1, 2, 3);


-- Clear stuck processing jobs
DELETE FROM tblVideoProcessingJobs
WHERE videoid IN (SELECT videoid FROM tblVideos WHERE status = 'pending');


-- Check cam performer online counts by site
SELECT s.name, COUNT(p.performerid) as onlinecount
FROM tblCamsPerformers p
JOIN tblCamsSites s ON p.site = s.recordnum
WHERE p.status = 1 AND p.enabled = 1
GROUP BY s.name;


-- Check feature toggle status
SELECT setting
key, settingvalue
FROM tblSettings
WHERE setting
key LIKE 'feature%'
ORDER BY setting
key;


-- Check recent click tracking
SELECT type, COUNT() as clicks, MAX(createdat) as lastclick
FROM tblClickTracking
GROUP BY type ORDER BY clicks DESC;


-- Find users with authentication issues
SELECT id, username, accountstatus, emailverified, lastlogin
FROM tblCMSUsers
WHERE account
status != 'active'
ORDER BY id DESC LIMIT 20;


-- Check storage server health
SELECT serverid, servername, servertype, enabled,
last
check, lasterror
FROM tblStorageServers;


-- Verify creator earnings aggregation
SELECT creator
id, earningdate, totaltips, totalsubscriptions,
total
ppv, totalearnings
FROM tblCreatorEarningsDaily
ORDER BY earning
date DESC LIMIT 20;