====================================================================== POSESIF - MEDIA RETRIEVAL AUDIT ====================================================================== ===== [1] PAUSE STORAGE WORKER CRON ===== Crontab backup: /root/posesif-crontab-before-media-fix-20261004-144244.txt Storage cron sekarang: # PAUSED_MEDIA_RETRIEVAL_FIX * * * * * /opt/cpanel/ea-php85/root/usr/bin/php /home/posesif/app/bin/storage-worker.php 5 >> /home/posesif/storage/logs/storage-worker.log 2>&1 ===== [2] STORAGE WORKER PROCESS ===== CATATAN: Jika satu worker sedang aktif, kita biarkan batch itu selesai. Cron berikutnya sudah dihentikan. ===== [3] MEDIA.PHP ===== /home/posesif/public_html/media.php | size=10280 | owner=posesif:posesif | mode=644 | modified=2026-10-03 12:31:47.537662366 +0700 --- FULL media.php --- 1 prepare(" 104 SELECT 105 s.id, 106 s.account_id, 107 s.message_id, 108 s.object_type, 109 s.status, 110 s.local_path, 111 s.original_name, 112 s.mime_type, 113 s.size_bytes, 114 s.provider, 115 s.drive_file_id 116 117 FROM storage_objects s 118 119 INNER JOIN wa_accounts a 120 ON a.id=s.account_id 121 122 INNER JOIN messages m 123 ON m.id=s.message_id 124 AND m.account_id=s.account_id 125 126 WHERE s.id=? 127 AND a.owner_customer_id=? 128 AND s.message_id IS NOT NULL 129 130 AND s.object_type IN 131 ( 132 'image', 133 'video', 134 'audio', 135 'document', 136 'thumbnail' 137 ) 138 139 LIMIT 1 140 "); 141 142 143 $stmt->execute([ 144 $id, 145 $customerId 146 ]); 147 148 149 $media= 150 $stmt->fetch( 151 PDO::FETCH_ASSOC 152 ); 153 154 155 if(!$media){ 156 157 media_fail( 158 404, 159 'Media tidak ditemukan.' 160 ); 161 } 162 163 164 /* 165 |-------------------------------------------------------------------------- 166 | LOCAL MEDIA 167 |-------------------------------------------------------------------------- 168 | 169 | Status "pending" TIDAK berarti file belum tersedia. 170 | Pending saat ini berarti belum selesai dikirim ke Google Drive. 171 |-------------------------------------------------------------------------- 172 */ 173 174 $localPath= 175 trim( 176 (string)( 177 $media['local_path'] 178 ?? '' 179 ) 180 ); 181 182 183 if($localPath===''){ 184 185 media_fail( 186 404, 187 'File media belum tersedia di server.' 188 ); 189 } 190 191 192 $storageRoot= 193 realpath( 194 '/home/posesif/storage' 195 ); 196 197 $realPath= 198 realpath( 199 $localPath 200 ); 201 202 203 if( 204 !$storageRoot 205 || 206 !$realPath 207 || 208 !str_starts_with( 209 $realPath, 210 $storageRoot. 211 DIRECTORY_SEPARATOR 212 ) 213 ){ 214 215 media_fail( 216 404, 217 'File media tidak tersedia.' 218 ); 219 } 220 221 222 if( 223 !is_file( 224 $realPath 225 ) 226 || 227 !is_readable( 228 $realPath 229 ) 230 ){ 231 232 media_fail( 233 404, 234 'File media tidak tersedia.' 235 ); 236 } 237 238 239 /* 240 |-------------------------------------------------------------------------- 241 | MIME TYPE 242 |-------------------------------------------------------------------------- 243 */ 244 245 $mime= 246 trim( 247 (string)( 248 $media['mime_type'] 249 ?? '' 250 ) 251 ); 252 253 254 /* 255 * Hindari header injection. 256 */ 257 $mime= 258 str_replace( 259 [ 260 "\r", 261 "\n" 262 ], 263 '', 264 $mime 265 ); 266 267 268 if($mime===''){ 269 270 $finfo= 271 new finfo( 272 FILEINFO_MIME_TYPE 273 ); 274 275 $mime= 276 $finfo->file( 277 $realPath 278 ) 279 ?: 'application/octet-stream'; 280 } 281 282 283 /* 284 |-------------------------------------------------------------------------- 285 | FILE NAME 286 |-------------------------------------------------------------------------- 287 */ 288 289 $fileName= 290 trim( 291 (string)( 292 $media['original_name'] 293 ?? '' 294 ) 295 ); 296 297 298 if($fileName===''){ 299 300 $fileName= 301 basename( 302 $realPath 303 ); 304 } 305 306 307 $fallbackName= 308 preg_replace( 309 '/[^A-Za-z0-9._-]+/', 310 '_', 311 $fileName 312 ); 313 314 315 if( 316 !$fallbackName 317 || 318 $fallbackName==='' 319 ){ 320 321 $fallbackName= 322 'media'; 323 } 324 325 326 $encodedName= 327 rawurlencode( 328 $fileName 329 ); 330 331 332 $download= 333 isset( 334 $_GET['download'] 335 ) 336 && 337 (string)$_GET['download'] 338 === 339 '1'; 340 341 342 $disposition= 343 $download 344 ? 'attachment' 345 : 'inline'; 346 347 348 /* 349 |-------------------------------------------------------------------------- 350 | FILE SIZE 351 |-------------------------------------------------------------------------- 352 */ 353 354 $size= 355 filesize( 356 $realPath 357 ); 358 359 360 if( 361 $size===false 362 || 363 $size<0 364 ){ 365 366 media_fail( 367 500, 368 'Ukuran file tidak dapat dibaca.' 369 ); 370 } 371 372 373 /* 374 |-------------------------------------------------------------------------- 375 | RESPONSE HEADERS 376 |-------------------------------------------------------------------------- 377 */ 378 379 header( 380 'X-Content-Type-Options: nosniff' 381 ); 382 383 header( 384 'Cache-Control: private, no-store, max-age=0' 385 ); 386 387 header( 388 'Pragma: no-cache' 389 ); 390 391 header( 392 'Accept-Ranges: bytes' 393 ); 394 395 header( 396 'Content-Type: '. 397 $mime 398 ); 399 400 header( 401 'Content-Disposition: '. 402 $disposition. 403 '; filename="'. 404 addcslashes( 405 $fallbackName, 406 "\\\"" 407 ). 408 '"; filename*=UTF-8\'\''. 409 $encodedName 410 ); 411 412 413 /* 414 |-------------------------------------------------------------------------- 415 | RANGE SUPPORT 416 |-------------------------------------------------------------------------- 417 */ 418 419 $start=0; 420 $end=max( 421 0, 422 $size-1 423 ); 424 425 $statusCode=200; 426 427 428 $range= 429 $_SERVER[ 430 'HTTP_RANGE' 431 ] 432 ?? ''; 433 434 435 if( 436 $size>0 437 && 438 is_string( 439 $range 440 ) 441 && 442 $range!=='' 443 ){ 444 445 if( 446 preg_match( 447 '/^bytes=(\d*)-(\d*)$/', 448 trim( 449 $range 450 ), 451 $match 452 ) 453 ){ 454 455 $first= 456 $match[1]; 457 458 $last= 459 $match[2]; 460 461 462 /* 463 |-------------------------------------------------------------------------- 464 | bytes=-500 465 |-------------------------------------------------------------------------- 466 */ 467 468 if( 469 $first==='' 470 && 471 $last!=='' 472 ){ 473 474 $suffix= 475 (int)$last; 476 477 478 if($suffix<=0){ 479 480 header( 481 'Content-Range: bytes */'. 482 $size 483 ); 484 485 media_fail( 486 416, 487 'Range tidak valid.' 488 ); 489 } 490 491 492 $start= 493 max( 494 0, 495 $size-$suffix 496 ); 497 498 $end= 499 $size-1; 500 501 }else{ 502 503 $start= 504 (int)$first; 505 506 507 if($last!==''){ 508 509 $end= 510 min( 511 (int)$last, 512 $size-1 513 ); 514 515 }else{ 516 517 $end= 518 $size-1; 519 } 520 } 521 522 523 if( 524 $start<0 525 || 526 $start>=$size 527 || 528 $end<$start 529 ){ 530 531 header( 532 'Content-Range: bytes */'. 533 $size 534 ); 535 536 media_fail( 537 416, 538 'Range tidak valid.' 539 ); 540 } 541 542 543 $statusCode=206; 544 } 545 } 546 547 548 $length= 549 $size===0 550 ? 0 551 : ( 552 $end 553 - 554 $start 555 + 556 1 557 ); 558 559 560 http_response_code( 561 $statusCode 562 ); 563 564 565 if($statusCode===206){ 566 567 header( 568 'Content-Range: bytes '. 569 $start. 570 '-'. 571 $end. 572 '/'. 573 $size 574 ); 575 } 576 577 578 header( 579 'Content-Length: '. 580 $length 581 ); 582 583 584 /* 585 |-------------------------------------------------------------------------- 586 | Jangan lock session selama browser streaming video/audio. 587 |-------------------------------------------------------------------------- 588 */ 589 590 if( 591 session_status() 592 === 593 PHP_SESSION_ACTIVE 594 ){ 595 596 session_write_close(); 597 } 598 599 600 /* 601 |-------------------------------------------------------------------------- 602 | HEAD REQUEST 603 |-------------------------------------------------------------------------- 604 */ 605 606 if( 607 ( 608 $_SERVER[ 609 'REQUEST_METHOD' 610 ] 611 ?? 'GET' 612 ) 613 === 614 'HEAD' 615 ){ 616 617 exit; 618 } 619 620 621 /* 622 |-------------------------------------------------------------------------- 623 | STREAM FILE 624 |-------------------------------------------------------------------------- 625 */ 626 627 while( 628 ob_get_level()>0 629 ){ 630 631 ob_end_clean(); 632 } 633 634 635 set_time_limit( 636 0 637 ); 638 639 640 $fp= 641 fopen( 642 $realPath, 643 'rb' 644 ); 645 646 647 if(!$fp){ 648 649 media_fail( 650 500, 651 'File tidak dapat dibuka.' 652 ); 653 } 654 655 656 if($start>0){ 657 658 fseek( 659 $fp, 660 $start 661 ); 662 } 663 664 665 $remaining= 666 $length; 667 668 $chunkSize= 669 1024*1024; 670 671 672 while( 673 $remaining>0 674 && 675 !feof( 676 $fp 677 ) 678 ){ 679 680 $read= 681 min( 682 $chunkSize, 683 $remaining 684 ); 685 686 687 $buffer= 688 fread( 689 $fp, 690 $read 691 ); 692 693 694 if( 695 $buffer===false 696 || 697 $buffer==='' 698 ){ 699 700 break; 701 } 702 703 704 echo $buffer; 705 706 707 $remaining-= 708 strlen( 709 $buffer 710 ); 711 712 713 flush(); 714 715 716 if( 717 connection_aborted() 718 ){ 719 720 break; 721 } 722 } 723 724 725 fclose( 726 $fp 727 ); 728 729 exit; ===== [4] INBOX MEDIA REFERENCES ===== 688: ON s.id=m.storage_object_id 2322: 2705 2706
2707 2708 🔒 Media / lampiran dikunci 2709 2710
2711 2712 2713 2714 2715
2716 2717 🔒 Isi pesan terkunci 2718 2719
2720 2721 2722 2723 2724 2725 2730 2731
2732 2733 2740 2741
2742 2743 2744 2745 2746 2751 2752 2802 2803 2804
2805 2806 2809 2810 2816 2817 <?=e(
  2821	        $mediaName
  2822	        ?: 'Foto WhatsApp'
  2823	    )?> 2826 2827 2828 2829 2830 2833 2834 2851 2852 2853 2856 2857
2858 2859
2860 🎙️ Pesan suara / Audio 2861
2862 2863 2879 2880
2881 2882 2883 2884 2885
2886 2887
2888 2889 2895 2896 📕 2897 2898 📄 2899 2900 2901
2902 2903
2904 2905
2912 2913 2917 2918
2919 2920
2921 2922 0): ?> 2923 2924 2929 2930 2931 2932 2933 2934 0): ?> 2935  •  2936 2937 2938 2939 2940 2941 2942
2943 2944
2945 2946 2952 👁 Buka 2953 2954 2955 2962 ⬇ Unduh 2963 2964 2965
2966 2967
2968 2969
2970 2971 2972 2973 2974
2979 2980 2983 2984 ✓ Tersimpan di server 2985 • menunggu cloud 2986 2987 2990 2991 ✓ Tersimpan di server 2992 • sedang dikirim ke cloud 2993 2994 2997 2998 ✓ Media tersimpan 2999 3000 3001 3002 ✓ Media tersedia 3003 3004 3005 3006
3007 3008
3009 3010 3011 3033 3034
3035 3036 Media ini diterima sebelum aktivasi paket 3037 dan tidak disimpan. 3038 3039
3040 3041 3042 3043 3044
3045 3046 3051 3052
3053 3054 3055 3056 3057 3058 3059 ===== [5] WORKER STORED / LOCAL DELETE LOGIC ===== 297: 'local_path' 327: $object['local_path'], 330: $object['local_path'] 355: storage_safe_unlink( 356: $object['local_path'] 366: drive_file_id=?, 368: local_path=NULL, 370: uploaded_at=NOW(), 393: drive_file_id=?, 395: local_path=NULL, 396: status='stored', 397: uploaded_at=NOW(), 444: 'drive_file_id' 452: 'drive_file_id' 458: storage_safe_unlink( 460: 'local_path' 471: drive_file_id=NULL, 472: local_path=NULL, ===== [5B] POTONGAN WORKER ===== 225 } 226 227 228 $result['processed']++; 229 230 231 try{ 232 233 $stmt= 234 $db->prepare(" 235 SELECT * 236 FROM storage_objects 237 WHERE id=? 238 LIMIT 1 239 "); 240 241 242 $stmt->execute([ 243 $job[ 244 'storage_object_id' 245 ] 246 ]); 247 248 249 $object= 250 $stmt->fetch(); 251 252 253 if(!$object){ 254 255 throw new RuntimeException( 256 'Storage object tidak ditemukan.' 257 ); 258 } 259 260 261 if( 262 $job['job_type'] 263 === 264 'upload' 265 ){ 266 267 if( 268 !in_array( 269 $object['status'], 270 [ 271 'pending', 272 'failed' 273 ], 274 true 275 ) 276 ){ 277 278 $db->prepare(" 279 UPDATE storage_jobs 280 281 SET 282 status='completed', 283 completed_at=NOW() 284 285 WHERE id=? 286 ")->execute([ 287 $job['id'] 288 ]); 289 290 continue; 291 } 292 293 294 if( 295 !storage_valid_spool_file( 296 (string)$object[ 297 'local_path' 298 ] 299 ) 300 ){ 301 302 throw new RuntimeException( 303 'File spool tidak ditemukan.' 304 ); 305 } 306 307 308 $db->prepare(" 309 UPDATE storage_objects 310 SET status='uploading' 311 WHERE id=? 312 ")->execute([ 313 $object['id'] 314 ]); 315 316 317 $folder= 318 storage_object_folder( 319 $db, 320 $object 321 ); 322 323 324 $uploaded= 325 google_drive_resumable_upload( 326 $db, 327 $object['local_path'], 328 $object['original_name'] 329 ?: basename( 330 $object['local_path'] 331 ), 332 $object['mime_type'] 333 ?: 'application/octet-stream', 334 $folder 335 ); 336 337 338 $stmt= 339 $db->prepare(" 340 SELECT delete_requested_at 341 FROM storage_objects 342 WHERE id=? 343 "); 344 345 346 $stmt->execute([ 347 $object['id'] 348 ]); 349 350 351 $deleteRequested= 352 $stmt->fetchColumn(); 353 354 355 storage_safe_unlink( 356 $object['local_path'] 357 ); 358 359 360 if($deleteRequested){ 361 362 $db->prepare(" 363 UPDATE storage_objects 364 365 SET 366 drive_file_id=?, 367 drive_folder_id=?, 368 local_path=NULL, 369 status='delete_pending', 370 uploaded_at=NOW(), 371 last_error=NULL 372 373 WHERE id=? 374 ")->execute([ 375 $uploaded['id'], 376 $folder, 377 $object['id'] 378 ]); 379 380 381 storage_queue_delete( 382 $db, 383 (int)$object['id'] 384 ); 385 386 387 }else{ 388 389 $db->prepare(" 390 UPDATE storage_objects 391 392 SET 393 drive_file_id=?, 394 drive_folder_id=?, 395 local_path=NULL, 396 status='stored', 397 uploaded_at=NOW(), 398 last_error=NULL 399 400 WHERE id=? 401 ")->execute([ 402 $uploaded['id'], 403 $folder, 404 $object['id'] 405 ]); 406 } 407 408 409 $db->prepare(" 410 UPDATE storage_jobs 411 412 SET 413 status='completed', 414 completed_at=NOW(), 415 last_error=NULL 416 417 WHERE id=? 418 ")->execute([ 419 $job['id'] 420 ]); 421 422 423 $result['uploaded']++; 424 425 426 }elseif( 427 $job['job_type'] 428 === 429 'delete' 430 ){ 431 432 $db->prepare(" 433 UPDATE storage_objects 434 SET status='deleting' 435 WHERE id=? 436 ")->execute([ 437 $object['id'] 438 ]); 439 440 441 if( 442 !empty( 443 $object[ 444 'drive_file_id' 445 ] 446 ) 447 ){ 448 449 google_drive_delete_file( 450 $db, 451 $object[ 452 'drive_file_id' 453 ] 454 ); 455 } 456 457 458 storage_safe_unlink( 459 $object[ 460 'local_path' 461 ] 462 ?? null 463 ); 464 465 466 $db->prepare(" 467 UPDATE storage_objects 468 469 SET 470 status='deleted', 471 drive_file_id=NULL, 472 local_path=NULL, 473 deleted_at=NOW(), 474 last_error=NULL 475 476 WHERE id=? 477 ")->execute([ 478 $object['id'] 479 ]); 480 481 482 $db->prepare(" 483 UPDATE storage_jobs 484 485 SET 486 status='completed', 487 completed_at=NOW(), 488 last_error=NULL 489 490 WHERE id=? 491 ")->execute([ 492 $job['id'] 493 ]); 494 495 ===== [6] STORAGE FUNCTIONS ===== 9:function storage_setting_int( 42:function storage_spool_root(): string 49:function storage_spool_usage_bytes(): int 91:function storage_limits( 120:function storage_disk_free_bytes(): int 137:function storage_can_accept_bytes( 183:function storage_health( 267:function storage_valid_spool_file( 302:function storage_enqueue_file( 464:function storage_folder_cache( 496:function storage_cache_folder( 541:function storage_ensure_folder( 582:function storage_object_folder( 678: 'media/'.$customer, 680: $root['media'] 687: 'media/'. 699: 'media/'. 713: 'media/'. 727:function storage_safe_unlink( 772:function storage_queue_delete( 828:function storage_schedule_customer_delete( 880: 'drive_file_id' ===== [6B] GOOGLE DRIVE FUNCTIONS ===== 9:function google_oauth_config_path(): string 16:function google_oauth_config(): array 64:function google_oauth_redirect_uri(): string 71:function google_drive_connection( 100:function google_http_form( 211:function google_build_auth_url( 261:function google_exchange_code( 292:function google_refresh_token( 320:function google_store_tokens( 422:function google_access_token( 564:function google_drive_json_request( 712:function google_user_info( 784:function google_drive_find_folder( 870:function google_drive_create_folder( 915:function google_drive_find_or_create_folder( 944:function google_drive_ensure_root_structure( 1042:function google_drive_resumable_upload( 1422:function google_drive_delete_file( 1441: 'https://www.googleapis.com/drive/v3/files/'. ===== [7] STORAGE SCHEMA ===== --- messages --- CREATE TABLE `messages` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `account_id` bigint(20) unsigned NOT NULL, `conversation_id` bigint(20) unsigned DEFAULT NULL, `wa_message_id` varchar(190) DEFAULT NULL, `direction` enum('in','out','forward') NOT NULL, `sender_jid` varchar(190) DEFAULT NULL, `recipient_jid` varchar(190) DEFAULT NULL, `message_type` varchar(60) NOT NULL DEFAULT 'text', `body` longtext DEFAULT NULL, `media_path` varchar(500) DEFAULT NULL, `storage_object_id` bigint(20) unsigned DEFAULT NULL, `media_mime` varchar(160) DEFAULT NULL, `media_size` bigint(20) unsigned DEFAULT NULL, `message_ts` datetime NOT NULL, `raw_json` longtext DEFAULT NULL, `created_at` datetime NOT NULL DEFAULT current_timestamp(), `is_history_sync` tinyint(1) NOT NULL DEFAULT 0, `forward_status` varchar(40) DEFAULT NULL, `forwarded_at` datetime DEFAULT NULL, `preview_locked` tinyint(1) NOT NULL DEFAULT 0, PRIMARY KEY (`id`), UNIQUE KEY `uq_message` (`account_id`,`wa_message_id`,`direction`), UNIQUE KEY `uq_message_wa_direction` (`account_id`,`wa_message_id`,`direction`), KEY `idx_message_conversation` (`conversation_id`,`message_ts`), KEY `idx_message_account` (`account_id`,`message_ts`), KEY `idx_message_storage_object` (`storage_object_id`), CONSTRAINT `fk_message_account` FOREIGN KEY (`account_id`) REFERENCES `wa_accounts` (`id`) ON DELETE CASCADE, CONSTRAINT `fk_message_conversation` FOREIGN KEY (`conversation_id`) REFERENCES `conversations` (`id`) ON DELETE SET NULL ) ENGINE=InnoDB AUTO_INCREMENT=6915 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci --- storage_objects --- CREATE TABLE `storage_objects` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `customer_id` bigint(20) unsigned DEFAULT NULL, `account_id` bigint(20) unsigned DEFAULT NULL, `message_id` bigint(20) unsigned DEFAULT NULL, `parent_storage_object_id` bigint(20) unsigned DEFAULT NULL, `object_type` enum('image','video','audio','document','thumbnail','export','backup','other') NOT NULL DEFAULT 'other', `provider` varchar(40) NOT NULL DEFAULT 'google_drive', `local_path` varchar(700) DEFAULT NULL, `drive_file_id` varchar(255) DEFAULT NULL, `drive_folder_id` varchar(255) DEFAULT NULL, `original_name` varchar(500) DEFAULT NULL, `mime_type` varchar(190) DEFAULT NULL, `size_bytes` bigint(20) unsigned NOT NULL DEFAULT 0, `sha256` char(64) DEFAULT NULL, `md5_checksum` char(32) DEFAULT NULL, `status` enum('pending','uploading','stored','delete_pending','deleting','deleted','failed') NOT NULL DEFAULT 'pending', `delete_requested_at` datetime DEFAULT NULL, `uploaded_at` datetime DEFAULT NULL, `deleted_at` datetime DEFAULT NULL, `last_error` text DEFAULT NULL, `created_at` datetime NOT NULL DEFAULT current_timestamp(), `updated_at` datetime NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), PRIMARY KEY (`id`), KEY `idx_storage_customer` (`customer_id`,`status`), KEY `idx_storage_account` (`account_id`,`status`), KEY `idx_storage_message` (`message_id`), KEY `idx_storage_status` (`status`,`created_at`), KEY `idx_storage_drive_file` (`drive_file_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1227 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ===== [8] CURRENT STORAGE IMPACT ===== stored=1226 stored_local_null=1226 stored_local_exists=0 messages_with_storage=1226 messages_media=1226 ===== [9] SAMPLE STORED MEDIA ===== object_id=1226 | message_id=6912 | name=image-ACB48550954D844859760612D9D9EE9B.jpeg type=imageMessage | mime=image/jpeg | size=63892 drive_file_id=SET | uploaded=2026-10-04 14:27:15 object_local_path=NULL | exists=NO message_media_path=/home/posesif/storage/spool/media/a2/2026/10/1791086078598-622f9f9a5060-image-ACB48550954D844859760612D9D9EE9B.jpeg | exists=NO object_id=1225 | message_id=6856 | name=image-ACA516603C743D91ED47D3406A166783.jpeg type=imageMessage | mime=image/jpeg | size=37278 drive_file_id=SET | uploaded=2026-10-04 14:27:12 object_local_path=NULL | exists=NO message_media_path=/home/posesif/storage/spool/media/a2/2026/10/1791039586131-c1709a563f59-image-ACA516603C743D91ED47D3406A166783.jpeg | exists=NO object_id=1224 | message_id=6855 | name=image-ACDD4C5BD36E821A155E826F26DA04BD.jpeg type=imageMessage | mime=image/jpeg | size=29496 drive_file_id=SET | uploaded=2026-10-04 14:27:09 object_local_path=NULL | exists=NO message_media_path=/home/posesif/storage/spool/media/a2/2026/10/1791039585400-bf1b31ad7c45-image-ACDD4C5BD36E821A155E826F26DA04BD.jpeg | exists=NO object_id=1223 | message_id=6851 | name=image-AC78CD2D5D0E72F650CDEC9E5E0B6F45.jpeg type=imageMessage | mime=image/jpeg | size=46412 drive_file_id=SET | uploaded=2026-10-04 14:27:07 object_local_path=NULL | exists=NO message_media_path=/home/posesif/storage/spool/media/a2/2026/10/1791037709388-63159093a08d-image-AC78CD2D5D0E72F650CDEC9E5E0B6F45.jpeg | exists=NO object_id=1222 | message_id=6841 | name=image-ACC8ED60130BD66072A1B2EBDB0D70BB.jpeg type=imageMessage | mime=image/jpeg | size=93054 drive_file_id=SET | uploaded=2026-10-04 14:27:04 object_local_path=NULL | exists=NO message_media_path=/home/posesif/storage/spool/media/a1/2026/10/1791033339520-ea9830c04bba-image-ACC8ED60130BD66072A1B2EBDB0D70BB.jpeg | exists=NO object_id=1221 | message_id=6824 | name=image-AC2D44071CAE535A77E50B339299B33A.jpeg type=imageMessage | mime=image/jpeg | size=90329 drive_file_id=SET | uploaded=2026-10-04 14:26:15 object_local_path=NULL | exists=NO message_media_path=/home/posesif/storage/spool/media/a1/2026/10/1791033339018-1acd47260ea0-image-AC2D44071CAE535A77E50B339299B33A.jpeg | exists=NO object_id=1220 | message_id=6823 | name=image-AC140F1A0A33861CA347E6DFB543F51B.jpeg type=imageMessage | mime=image/jpeg | size=43016 drive_file_id=SET | uploaded=2026-10-04 14:26:13 object_local_path=NULL | exists=NO message_media_path=/home/posesif/storage/spool/media/a1/2026/10/1791033338997-ac5a29d1d498-image-AC140F1A0A33861CA347E6DFB543F51B.jpeg | exists=NO object_id=1219 | message_id=6817 | name=image-AC126329C840B9BF1A596DD550373632.jpeg type=imageMessage | mime=image/jpeg | size=85413 drive_file_id=SET | uploaded=2026-10-04 14:26:10 object_local_path=NULL | exists=NO message_media_path=/home/posesif/storage/spool/media/a1/2026/10/1791033338946-1d96eff396da-image-AC126329C840B9BF1A596DD550373632.jpeg | exists=NO object_id=1218 | message_id=6807 | name=image-ACF1025E85B1A8D0DE08C36F9418E832.jpeg type=imageMessage | mime=image/jpeg | size=158591 drive_file_id=SET | uploaded=2026-10-04 14:26:08 object_local_path=NULL | exists=NO message_media_path=/home/posesif/storage/spool/media/a1/2026/10/1791033338887-1715195ee1ef-image-ACF1025E85B1A8D0DE08C36F9418E832.jpeg | exists=NO object_id=1217 | message_id=6805 | name=image-3EB0F886D1D39E76F11C57.jpeg type=imageMessage | mime=image/jpeg | size=527917 drive_file_id=SET | uploaded=2026-10-04 14:26:05 object_local_path=NULL | exists=NO message_media_path=/home/posesif/storage/spool/media/a1/2026/10/1791033338855-9ad3c60b823d-image-3EB0F886D1D39E76F11C57.jpeg | exists=NO object_id=1216 | message_id=6802 | name=image-ACB1B82A925EF5795B83D23C1157E9AD.jpeg type=imageMessage | mime=image/jpeg | size=88458 drive_file_id=SET | uploaded=2026-10-04 14:25:13 object_local_path=NULL | exists=NO message_media_path=/home/posesif/storage/spool/media/a1/2026/10/1791033338827-25f9db72023e-image-ACB1B82A925EF5795B83D23C1157E9AD.jpeg | exists=NO object_id=1215 | message_id=6799 | name=image-AC83C872CB96387C19A7EBEE4B5CF406.jpeg type=imageMessage | mime=image/jpeg | size=576937 drive_file_id=SET | uploaded=2026-10-04 14:25:10 object_local_path=NULL | exists=NO message_media_path=/home/posesif/storage/spool/media/a1/2026/10/1791033338782-6e0e05f091bf-image-AC83C872CB96387C19A7EBEE4B5CF406.jpeg | exists=NO object_id=1214 | message_id=6793 | name=Kartu_Bimbingan_PKL_DKV_SMKN1_Sukalarang_v2 _1_.pdf type=documentMessage | mime=application/pdf | size=32338 drive_file_id=SET | uploaded=2026-10-04 14:25:08 object_local_path=NULL | exists=NO message_media_path=/home/posesif/storage/spool/media/a1/2026/10/1791033338170-117a2ee7e38e-Kartu_Bimbingan_PKL_DKV_SMKN1_Sukalarang_v2 _1_.pdf | exists=NO object_id=1213 | message_id=6790 | name=Kartu_Bimbingan_PKL_DKV_SMKN1_Sukalarang_v2 _1_.pdf type=documentMessage | mime=application/pdf | size=32338 drive_file_id=SET | uploaded=2026-10-04 14:25:06 object_local_path=NULL | exists=NO message_media_path=/home/posesif/storage/spool/media/a1/2026/10/1791033338115-69c2daf19f83-Kartu_Bimbingan_PKL_DKV_SMKN1_Sukalarang_v2 _1_.pdf | exists=NO object_id=1212 | message_id=6749 | name=image-ACE298B7E0A2D968027DCFD3CF615959.jpeg type=imageMessage | mime=image/jpeg | size=147540 drive_file_id=SET | uploaded=2026-10-04 14:25:04 object_local_path=NULL | exists=NO message_media_path=/home/posesif/storage/spool/media/a1/2026/10/1791033337520-0d5290ae837f-image-ACE298B7E0A2D968027DCFD3CF615959.jpeg | exists=NO ===== [10] MESSAGE MEDIA PATH EXISTENCE ===== message_media_total=1226 local_exists=0 local_missing=1226 missing_but_stored_in_drive=1226 ===== [11] PHP SYNTAX ===== No syntax errors detected in /home/posesif/public_html/media.php No syntax errors detected in /home/posesif/public_html/inbox.php No syntax errors detected in /home/posesif/app/services/storage.php No syntax errors detected in /home/posesif/app/services/google_drive.php No syntax errors detected in /home/posesif/app/bin/storage-worker.php ===== [12] STORAGE COUNTS ===== pending=0 uploading=0 stored=1226 failed=0 ===== [13] WHATSAPP GATEWAY ===== active 483792 ====================================================================== AUDIT SELESAI STORAGE WORKER CRON SEMENTARA DI-PAUSE. WHATSAPP TIDAK DIUBAH. Audit: /root/posesif-media-drive-audit-20261004-144244.txt Crontab backup: /root/posesif-crontab-before-media-fix-20261004-144244.txt ====================================================================== [?2004h]0;root@151-245-85-46: ~root@151-245-85-46:~# [?2004l [?2004l