Documentação ComusThumbz
Login de Admin

Resolução de problemas do ComusThumbz


Visão geral

Este guia consolida informações de solução de problemas para todo o ComusThumbz CMS, cobrindo tanto o painel de administração de infraestrutura (ct/admin/) e as páginas públicas frontend (root do projeto). As questões são organizadas por categoria com sintomas, causas e soluções.

Dica: Antes de mergulhar em problemas específicos, execute a Lista de Verificação Diagnóstico Rápido abaixo para identificar os problemas mais comuns.


Lista de verificação diagnóstica rápida

Execute estas verificações para encontrar qualquer problema:

  1. Registo de erros PHP - Verificado. ct/logs/ e o registro de erro PHP do seu servidor para erros recentes
  2. Trabalhos do Cron - Verifique as tarefas do cron em execução (a maioria dos problemas de "dados não atualizados")
  3. Permissões de arquivos - Servidor web deve ter acesso de leitura / gravação para uploads/, ct/logs/, ct/dat/
  4. Ligação à base de dados - Teste com https://yourdomain.com/tools/simpletest.php?key=comus2025
  5. Saúde da API - Teste com https://yourdomain.com/ct/api/v1/features
  6. Alternações de Caracteres - Recursos desativados são a causa mais comum de "página não mostrando"
  7. Consola de navegador - Verificar erros no JavaScript (F12 -> Console)
  8. Página da rede - Verificar pedidos de API falhou (F12 -> Rede)

Erros no servidor & PHP

Erro de Página em Branco / 500 Servidor Interno

Erro:
Sintomas: Página mostra completamente em branco ou retorna HTTP 500 sem erro visível.

Causas Frequentes:

  1. declare(stricttypes=1) colocação - Deve ser a primeira linha depois . Qualquer espaço em branco, caráter BOM, ou código antes de causar um erro fatal.
  1. Erro de sintaxe PHP - Verifique o registo de erros:
tail -50 /var/log/php/error.log
  1. Falta o arquivo de inclusão - A requireonce para um arquivo que não existe:
grep -r "requireonce" ct/admin/yourpage.php
  1. Mostrar os erros desactivados - Habilitar temporariamente para depuração:
iniset('displayerrors', 1);
   errorreporting(EALL);

Solução: Verifique primeiro o registro de erro do PHP. Se estiver vazio, activar displayerrors temporariamente para ver o erro real.

Erro no AdminLanguage Singleton

Erro:
Sintomas: Fatal error: Cannot instantiate AdminLanguage ou erro semelhante de 500 páginas de administração.

Causa: Utilização new AdminLanguage() em vez do padrão singleton.

Corrigir:

// WRONG

$lang = new AdminLanguage();


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

Limite de memória esgotado

Erro:
Sintomas: Fatal error: Allowed memory size of X bytes exhausted

Gatilhos comuns:

  • Envios de arquivos de vídeo grandes
  • Processando grandes galerias de imagens
  • Operações em massa em registros de 400K+

Solução: Aumentar o limite de memória PHP:

; php.ini

memorylimit = 512M        ; Minimum recommended

uploadmaxfilesize = 2G    ; For video uploads

postmaxsize = 2G          ; Must be >= uploadmaxfilesize

Ou por escrito:

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

Tempo máximo de execução excedida

Erro:
Sintomas: Fatal error: Maximum execution time of 30 seconds exceeded

Gatilhos comuns:

  • Trabalhos de processamento de vídeo cron
  • Consultas de bases de dados grandes
  • Chamadas de API externas no tempo

Solução:

; php.ini

maxexecutiontime = 300    ; 5 minutes for web requests

Para trabalhos cron, definir ilimitado:

settimelimit(0);

Erros de Permissão do Ficheiro

Erro:
Sintomas: Permission denied erros ao escrever arquivos ou criar diretórios.

Permissões necessárias:

PastaPermissãoObjecto
uploads/775Envios de usuários, avatares, conteúdo
uploads/videos/original/775Envios de vídeo em bruto
uploads/ftpuploads/775Entrada de envio em massa de FTP
ct/logs/775Registos de aplicações
ct/dat/775Arquivos de configuração
assets/images/755Imagens estáticas
Corrigir:
chown -R www-data:www-data uploads/ ct/logs/ ct/dat/
chmod -R 775 uploads/ ct/logs/ ct/dat/

Questões de Base de Dados

A Ligação à Base de Dados Falhou

Erro:
Sintomas: Páginas falham ao carregar, API retorna 500 erros, "Conecção recusada" em logs.

Diagnóstico:

  1. Teste com a ferramenta de banco de dados rápida:

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

  1. Verificar as credenciais em ct/dat/config.inc.php:
$dbhost = 'localhost';
   $dbuser = 'admincomus';
   $dbpasswd = 'yourpassword';
   $db = 'admincomus';
  1. Verificar MySQL está em execução:
systemctl status mysql

Solução: Verifique o serviço MySQL em execução e as credenciais correspondem à configuração do banco de dados.

Bloqueios de Mesa e Bloqueios

Erro:
Sintomas: Tempo limite de chamadas da API, mas as consultas diretas no banco de dados são rápidas. Páginas penduradas por 30-60 segundos.

Diagnóstico:

  1. Executar a ferramenta Estado MySQL:
https://yourdomain.com/tools/mysqlstatus.php?key=comus2025

  1. Verificar as consultas de bloqueio:
SHOW FULL PROCESSLIST;
Procure por consultas com mais de 30 segundos.
  1. Use o inspetor de bloqueio de banco de dados para análise de bloqueio InnoDB:
https://yourdomain.com/tools/dblockinspector.php?key=comus2025

Solução:

  1. Matar a consulta de bloqueio:

KILL ;

  1. Ou através da ferramenta de depuração:
https://yourdomain.com/tools/mysqlstatus.php?key=comus2025&kill=PROCESSID

Culpado comum: A apicron.php marksiteperformersoffline() função atualizando todos os artistas ao mesmo tempo. Isto foi corrigido com atualizações em lote (1000 linhas de cada vez com pausas de 10ms).

Consultas Lentas

Erro:
Sintomas: Páginas específicas carregam lentamente, especialmente artistas de cam ou listas de vídeo.

Diagnóstico:

-- Check table locks

SHOW OPEN TABLES WHERE Inuse > 0;


-- Analisar o desempenho da tabela
TABELA ANALYZE tblCamsPerformers;
TABELA ANALYZE tblVídeos;


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

Solução:

  1. Verificar os índices em colunas frequentemente procuradas
  2. Utilização EXPLAIN em consultas lentas para identificar os índices em falta
  3. Verifique se a cache APCu está funcionando (php -m | grep apcu)
  4. Para artistas de câmara, utilizar ?fast=1 para ignorar as consultas de COUNT

Comandos de depuração SQL

Configuração necessária:
Referência rápida para depuração manual do banco de dados:

-- Show all running queries
SHOW FULL PROCESSLIST;

-- Matar uma consulta específica
Assassinato 123;


-- Matar todas as conexões de dormir com mais de 30 segundos
SELECT CONCAT( 'KILL', id, ';')
FONTES DE INFORMAÇÕESschema.processlist
Onde Comando='Dormir' E Tempo > 30;


-- Verificar fechaduras de mesa
Mostrar mesas abertas onde dentro
Utilização > 0;


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


Processamento de Vídeo

Vídeos Presos em 'pendentes'

Erro:
Sintomas: Vídeos enviados mas nunca processam. A situação continua a ser 'pendente' indefinidamente.

Esta é a questão de vídeo mais comum. Verifique isto em ordem:

  1. Trabalhos do Cron não em execução - O processador de vídeo é executado em uma programação:
# Must be in crontab
  • php /path/to/ct/admin/cron/ftpvídeoprocessador.php

   /5     php /path/to/ct/admin/cron/videoprocessor.php
  1. Ficheiro erradoformato do caminho na base de dados - O erro de dados mais comum:
-- Check filepath format
   SELECT videoid, filepath, status FROM tblVideos WHERE status='pending';

O caminho do arquivo deve ser: uploads/videos/original/{filename}

NÃO apenas o nome do ficheiro, e NÃO incluindo ct/ prefixo.

  1. Corrigir os caminhos incorretos do arquivo:
-- 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. Limpar a fila de processamento encravada:
DELETE FROM tblVideoProcessingJobs
   WHERE videoid IN (SELECT videoid FROM tblVideos WHERE status = 'pending');
  1. Verificar se o ficheiro existe no disco:
ls -la /path/to/ct/uploads/videos/original/

FFmpeg / FFprobe Não Encontrado

Erro:
Sintomas: O processamento de vídeo falha com "FFmpeg não encontrado" ou "FFprobe não encontrado" em logs.

Diagnóstico:

which ffmpeg

which ffprobe

ffmpeg -version

Solução:

  1. Instalar o FFmpeg:

sudo apt install ffmpeg    # Debian/Ubuntu

  1. Verificar os caminhos na configuração correspondem às localizações reais:
// ct/dat/config.inc.php
   $ffmpegpath = '/usr/bin/ffmpeg';
   $ffprobepath = '/usr/bin/ffprobe';
  1. Garantir que o PHP possa executar comandos de shell:
// Check if exec() is disabled
   vardump(functionexists('exec'));

Erros de Processamento de Vídeo

Erro:
Sintomas: Os vídeos mudam para status 'erro' após a tentativa de processamento.

Diagnóstico:

  1. Verificar os registos de processamento:

tail -100 ct/logs/videoprocessor/.log

  1. Verifique o registro de vídeo:
SELECT videoid, filepath, status, errormessage
   FROM tblVideos WHERE status = 'error'
   ORDER BY videoid DESC LIMIT 10;

Causas comuns:

  • Ficheiro de código corrompido
  • Codec não suportado
  • Espaço em disco insuficiente
  • Versão FFmpeg muito antiga (necessidade 4.0+)

Solução: Corrigir a causa subjacente, em seguida, redefinir o vídeo para reprocessamento:

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

WHERE videoid = ;

O Streaming do HLS não Funciona

Erro:
Sintomas: O leitor de vídeo mostra erro ou cai de volta para MP4. HLS .m3u8 arquivos não carregados.

Diagnóstico:

  1. Verifique se os arquivos HLS foram gerados:

SELECT videoid, hlspath FROM tblVideoFiles WHERE videoid = ;

  1. Verificar se a lista de reprodução principal está acessível:
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;