|
|
<?php
|
|
|
require_once __DIR__ . '/storage.php';
|
|
|
|
|
|
|
|
|
$testAuth = false;
|
|
|
if (isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) {
|
|
|
$users = StorageConfig::getUsers();
|
|
|
$testAuth = isset($users[$_SERVER['PHP_AUTH_USER']]) &&
|
|
|
$users[$_SERVER['PHP_AUTH_USER']] === $_SERVER['PHP_AUTH_PW'];
|
|
|
}
|
|
|
|
|
|
if (!$testAuth) {
|
|
|
header('WWW-Authenticate: Basic realm="VvvebJs GitHub Debug"');
|
|
|
header('HTTP/1.0 401 Unauthorized');
|
|
|
die('Authentication required');
|
|
|
}
|
|
|
|
|
|
|
|
|
$isHuggingFace = StorageConfig::isHuggingFaceSpace();
|
|
|
$github = StorageConfig::getGitHubConfig();
|
|
|
$envDebug = StorageConfig::debugEnvironment();
|
|
|
|
|
|
|
|
|
$testResults = [];
|
|
|
if ($_POST['test_save'] ?? false) {
|
|
|
$testHtml = '<!DOCTYPE html><html><head><title>VvvebJs Test</title></head><body><h1>Test file created at ' . date('Y-m-d H:i:s') . '</h1><p>This is a test file created to verify GitHub save functionality.</p></body></html>';
|
|
|
$testFilename = 'test-' . time() . '.html';
|
|
|
|
|
|
try {
|
|
|
$storageManager = new StorageManager();
|
|
|
$result = $storageManager->saveFile($testFilename, $testHtml);
|
|
|
|
|
|
$testResults['save_test'] = [
|
|
|
'success' => $result,
|
|
|
'filename' => $testFilename,
|
|
|
'content_length' => strlen($testHtml),
|
|
|
'message' => $result ? 'File saved successfully!' : 'Save failed!'
|
|
|
];
|
|
|
|
|
|
|
|
|
if ($result) {
|
|
|
$retrievedContent = $storageManager->getFile($testFilename);
|
|
|
$testResults['read_test'] = [
|
|
|
'success' => $retrievedContent !== false,
|
|
|
'content_matches' => $retrievedContent === $testHtml,
|
|
|
'retrieved_length' => $retrievedContent ? strlen($retrievedContent) : 0
|
|
|
];
|
|
|
}
|
|
|
|
|
|
} catch (Exception $e) {
|
|
|
$testResults['save_test'] = [
|
|
|
'success' => false,
|
|
|
'error' => $e->getMessage(),
|
|
|
'filename' => $testFilename
|
|
|
];
|
|
|
}
|
|
|
}
|
|
|
?>
|
|
|
|
|
|
<!DOCTYPE html>
|
|
|
<html lang="en">
|
|
|
<head>
|
|
|
<meta charset="utf-8">
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
|
<title>VvvebJs GitHub 保存调试</title>
|
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
|
|
<style>
|
|
|
.config-value { background-color:
|
|
|
.status-ok { color:
|
|
|
.status-error { color:
|
|
|
.status-warning { color:
|
|
|
.debug-output { background:
|
|
|
</style>
|
|
|
</head>
|
|
|
<body>
|
|
|
<div class="container mt-5">
|
|
|
<div class="row">
|
|
|
<div class="col-md-10 mx-auto">
|
|
|
<h1 class="mb-4">🚨 VvvebJs GitHub 保存问题调试</h1>
|
|
|
|
|
|
<!-- 环境状态 -->
|
|
|
<div class="card mb-4">
|
|
|
<div class="card-header">
|
|
|
<h3>🌐 环境状态检查</h3>
|
|
|
</div>
|
|
|
<div class="card-body">
|
|
|
<div class="row">
|
|
|
<div class="col-md-6">
|
|
|
<p><strong>运行环境:</strong>
|
|
|
<span class="<?= $isHuggingFace ? 'status-ok' : 'status-warning' ?>">
|
|
|
<?= $isHuggingFace ? '✅ Hugging Face Space' : '⚠️ 本地环境' ?>
|
|
|
</span>
|
|
|
</p>
|
|
|
<p><strong>主机:</strong> <span class="config-value"><?= htmlspecialchars($_SERVER['HTTP_HOST'] ?? 'unknown') ?></span></p>
|
|
|
<p><strong>Space ID:</strong> <span class="config-value"><?= htmlspecialchars($envDebug['space_id']) ?></span></p>
|
|
|
</div>
|
|
|
<div class="col-md-6">
|
|
|
<p><strong>当前用户:</strong> <span class="config-value"><?= htmlspecialchars(StorageConfig::getCurrentUser()) ?></span></p>
|
|
|
<p><strong>用户路径:</strong> <span class="config-value"><?= htmlspecialchars(StorageConfig::getUserPath()) ?></span></p>
|
|
|
<p><strong>存储类型:</strong> <span class="config-value"><?= htmlspecialchars(StorageConfig::getStorageType()) ?></span></p>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
<!-- GitHub 配置状态 -->
|
|
|
<div class="card mb-4">
|
|
|
<div class="card-header">
|
|
|
<h3>🔧 GitHub 配置状态</h3>
|
|
|
</div>
|
|
|
<div class="card-body">
|
|
|
<div class="row">
|
|
|
<div class="col-md-6">
|
|
|
<p><strong>GITHUB_TOKEN:</strong>
|
|
|
<span class="config-value <?= empty($github['token']) ? 'status-error' : 'status-ok' ?>">
|
|
|
<?php
|
|
|
if (empty($github['token'])) {
|
|
|
echo '❌ 未设置';
|
|
|
} else {
|
|
|
echo '✅ 已设置 (长度: ' . strlen($github['token']) . ')';
|
|
|
}
|
|
|
?>
|
|
|
</span>
|
|
|
</p>
|
|
|
<p><strong>GITHUB_OWNER:</strong>
|
|
|
<span class="config-value <?= empty($github['owner']) ? 'status-error' : 'status-ok' ?>">
|
|
|
<?= empty($github['owner']) ? '❌ 未设置' : '✅ ' . htmlspecialchars($github['owner']) ?>
|
|
|
</span>
|
|
|
</p>
|
|
|
<p><strong>GITHUB_REPO:</strong>
|
|
|
<span class="config-value <?= empty($github['repo']) ? 'status-error' : 'status-ok' ?>">
|
|
|
<?= empty($github['repo']) ? '❌ 未设置' : '✅ ' . htmlspecialchars($github['repo']) ?>
|
|
|
</span>
|
|
|
</p>
|
|
|
</div>
|
|
|
<div class="col-md-6">
|
|
|
<p><strong>GITHUB_BRANCH:</strong>
|
|
|
<span class="config-value"><?= htmlspecialchars($github['branch']) ?></span>
|
|
|
</p>
|
|
|
<p><strong>GITHUB_PATH:</strong>
|
|
|
<span class="config-value"><?= htmlspecialchars($github['path']) ?></span>
|
|
|
</p>
|
|
|
<p><strong>完整API URL:</strong>
|
|
|
<span class="config-value">https://api.github.com/repos/<?= htmlspecialchars($github['owner']) ?>/<?= htmlspecialchars($github['repo']) ?></span>
|
|
|
</p>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
<!-- 保存测试 -->
|
|
|
<div class="card mb-4">
|
|
|
<div class="card-header">
|
|
|
<h3>🧪 实际保存测试</h3>
|
|
|
</div>
|
|
|
<div class="card-body">
|
|
|
<?php if (empty($testResults)): ?>
|
|
|
<p>点击下方按钮来测试实际的文件保存功能:</p>
|
|
|
<form method="POST">
|
|
|
<button type="submit" name="test_save" value="1" class="btn btn-primary">
|
|
|
🚀 测试保存到 GitHub
|
|
|
</button>
|
|
|
</form>
|
|
|
<?php else: ?>
|
|
|
<div class="row">
|
|
|
<div class="col-md-6">
|
|
|
<h5>保存测试结果</h5>
|
|
|
<?php $saveTest = $testResults['save_test']; ?>
|
|
|
<div class="alert alert-<?= $saveTest['success'] ? 'success' : 'danger' ?>">
|
|
|
<strong>状态:</strong>
|
|
|
<span class="<?= $saveTest['success'] ? 'status-ok' : 'status-error' ?>">
|
|
|
<?= $saveTest['success'] ? '✅ 成功' : '❌ 失败' ?>
|
|
|
</span>
|
|
|
<br><strong>文件名:</strong> <?= htmlspecialchars($saveTest['filename']) ?>
|
|
|
<br><strong>内容长度:</strong> <?= $saveTest['content_length'] ?? 0 ?> 字符
|
|
|
<?php if (!$saveTest['success'] && isset($saveTest['error'])): ?>
|
|
|
<br><strong>错误:</strong> <?= htmlspecialchars($saveTest['error']) ?>
|
|
|
<?php endif; ?>
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="col-md-6">
|
|
|
<?php if (isset($testResults['read_test'])): ?>
|
|
|
<h5>读取验证结果</h5>
|
|
|
<?php $readTest = $testResults['read_test']; ?>
|
|
|
<div class="alert alert-<?= $readTest['success'] && $readTest['content_matches'] ? 'success' : 'warning' ?>">
|
|
|
<strong>读取状态:</strong>
|
|
|
<span class="<?= $readTest['success'] ? 'status-ok' : 'status-error' ?>">
|
|
|
<?= $readTest['success'] ? '✅ 成功' : '❌ 失败' ?>
|
|
|
</span>
|
|
|
<br><strong>内容匹配:</strong>
|
|
|
<span class="<?= $readTest['content_matches'] ? 'status-ok' : 'status-error' ?>">
|
|
|
<?= $readTest['content_matches'] ? '✅ 一致' : '❌ 不一致' ?>
|
|
|
</span>
|
|
|
<br><strong>读取长度:</strong> <?= $readTest['retrieved_length'] ?> 字符
|
|
|
</div>
|
|
|
<?php endif; ?>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
<div class="mt-3">
|
|
|
<form method="POST">
|
|
|
<button type="submit" name="test_save" value="1" class="btn btn-secondary">
|
|
|
🔄 重新测试
|
|
|
</button>
|
|
|
</form>
|
|
|
</div>
|
|
|
<?php endif; ?>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
<!-- 环境变量调试信息 -->
|
|
|
<div class="card mb-4">
|
|
|
<div class="card-header">
|
|
|
<h3>🔍 环境变量调试信息</h3>
|
|
|
</div>
|
|
|
<div class="card-body">
|
|
|
<div class="debug-output">
|
|
|
<?= json_encode($envDebug, JSON_PRETTY_PRINT) ?>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
<!-- 服务器日志信息 -->
|
|
|
<div class="card mb-4">
|
|
|
<div class="card-header">
|
|
|
<h3>📋 最近的服务器日志</h3>
|
|
|
</div>
|
|
|
<div class="card-body">
|
|
|
<p class="text-muted">请检查Hugging Face Space的日志面板查看详细的错误信息。关键日志标识符:</p>
|
|
|
<ul>
|
|
|
<li><code>GitHub Save Debug:</code> - GitHub保存调试信息</li>
|
|
|
<li><code>GitHub Save Error:</code> - GitHub保存错误</li>
|
|
|
<li><code>GitHub API Error:</code> - GitHub API错误响应</li>
|
|
|
<li><code>StorageManager saveFile:</code> - 存储管理器保存过程</li>
|
|
|
</ul>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
<!-- 问题诊断建议 -->
|
|
|
<div class="card mb-4">
|
|
|
<div class="card-header">
|
|
|
<h3>💡 常见问题诊断</h3>
|
|
|
</div>
|
|
|
<div class="card-body">
|
|
|
<div class="accordion" id="diagnosticAccordion">
|
|
|
<div class="accordion-item">
|
|
|
<h2 class="accordion-header">
|
|
|
<button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#diag1">
|
|
|
Token 配置问题
|
|
|
</button>
|
|
|
</h2>
|
|
|
<div id="diag1" class="accordion-collapse collapse show" data-bs-parent="#diagnosticAccordion">
|
|
|
<div class="accordion-body">
|
|
|
<strong>检查项目:</strong>
|
|
|
<ul>
|
|
|
<li>确认 <code>GITHUB_TOKEN</code> 在Hugging Face Space Settings中正确设置为Private Secret</li>
|
|
|
<li>GitHub Token必须有 <code>repo</code> 权限(不仅是public_repo)</li>
|
|
|
<li>Token没有过期</li>
|
|
|
<li>Token对目标仓库有写入权限</li>
|
|
|
</ul>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="accordion-item">
|
|
|
<h2 class="accordion-header">
|
|
|
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#diag2">
|
|
|
仓库配置问题
|
|
|
</button>
|
|
|
</h2>
|
|
|
<div id="diag2" class="accordion-collapse collapse" data-bs-parent="#diagnosticAccordion">
|
|
|
<div class="accordion-body">
|
|
|
<strong>检查项目:</strong>
|
|
|
<ul>
|
|
|
<li>仓库名和所有者名称完全正确(区分大小写)</li>
|
|
|
<li>分支名称正确(通常是main或master)</li>
|
|
|
<li>目标路径存在或可以创建</li>
|
|
|
<li>仓库没有分支保护规则阻止直接推送</li>
|
|
|
</ul>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="accordion-item">
|
|
|
<h2 class="accordion-header">
|
|
|
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#diag3">
|
|
|
Hugging Face Space 特殊情况
|
|
|
</button>
|
|
|
</h2>
|
|
|
<div id="diag3" class="accordion-collapse collapse" data-bs-parent="#diagnosticAccordion">
|
|
|
<div class="accordion-body">
|
|
|
<strong>可能的问题:</strong>
|
|
|
<ul>
|
|
|
<li>环境变量需要在设置后重启Space才能生效</li>
|
|
|
<li>网络限制或超时问题</li>
|
|
|
<li>Space的文件系统权限限制</li>
|
|
|
<li>GitHub API速率限制</li>
|
|
|
</ul>
|
|
|
<strong>解决方案:</strong>
|
|
|
<ul>
|
|
|
<li>确保点击了"Restart this Space"</li>
|
|
|
<li>检查所有环境变量拼写正确</li>
|
|
|
<li>使用GitHub Personal Access Token (classic)</li>
|
|
|
</ul>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
<!-- 操作按钮 -->
|
|
|
<div class="card">
|
|
|
<div class="card-body text-center">
|
|
|
<div class="row">
|
|
|
<div class="col-md-3">
|
|
|
<a href="hf-space-check.php" class="btn btn-info w-100">HF Space 检查</a>
|
|
|
</div>
|
|
|
<div class="col-md-3">
|
|
|
<a href="github-advanced-test.php" class="btn btn-primary w-100">GitHub 完整测试</a>
|
|
|
</div>
|
|
|
<div class="col-md-3">
|
|
|
<a href="config-check.php" class="btn btn-secondary w-100">配置检查</a>
|
|
|
</div>
|
|
|
<div class="col-md-3">
|
|
|
<a href="editor.html" class="btn btn-success w-100">返回编辑器</a>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
|
|
</body>
|
|
|
</html> |