<?php
/**
* TMITStore — One-Time Server Setup Script
* =========================================
* cPanel-এ upload করার পর browser থেকে একবার run করো:
* https://yourdomain.com/setup.php
*
* ⚠️ RUN করার পর এই ফাইলটি DELETE করো!
*/
// Secret token — অন্য কেউ যাতে run না করতে পারে
$setupToken = 'tmit_setup_2024';
if (($_GET['token'] ?? '') !== $setupToken) {
http_response_code(403);
die('<h2>403 Forbidden</h2><p>Add ?token=tmit_setup_2024 to the URL to run setup.</p>');
}
header('Content-Type: text/html; charset=UTF-8');
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>TMITStore — Server Setup</title>
<style>
body { font-family: monospace; background: #1a1a2e; color: #eee; padding: 30px; }
.box { background: #16213e; border-radius: 12px; padding: 30px; max-width: 700px; margin: 0 auto; }
h2 { color: #e63946; }
.ok { color: #4ade80; }
.fail { color: #f87171; }
.warn { color: #fbbf24; }
.info { color: #60a5fa; }
p { margin: 8px 0; font-size: 15px; }
hr { border-color: #333; margin: 20px 0; }
.done { background: #0f3460; border-radius: 8px; padding: 16px; margin-top: 20px; }
</style>
</head>
<body>
<div class="box">
<h2>⚙️ TMITStore Server Setup</h2>
<hr>
<?php
// Auto-detect app root
if (file_exists(__DIR__ . '/../vendor/autoload.php')) {
$appRoot = realpath(__DIR__ . '/..');
$mode = 'local';
} elseif (file_exists(__DIR__ . '/../ecommerce/vendor/autoload.php')) {
$appRoot = realpath(__DIR__ . '/../ecommerce');
$mode = 'cpanel';
} else {
echo '<p class="fail">❌ Laravel application root not found!</p>';
echo '<p class="warn">Make sure the "ecommerce" folder is uploaded beside public_html.</p>';
exit;
}
echo "<p class='info'>📂 Mode: <strong>$mode</strong></p>";
echo "<p class='info'>📂 App Root: <strong>$appRoot</strong></p>";
// ── 1. Storage symlink ──────────────────────────────────────────────────────
echo '<hr><p><strong>1. Storage Symlink</strong></p>';
$symlinkTarget = $appRoot . '/storage/app/public';
$symlinkPath = __DIR__ . '/storage';
if (is_link($symlinkPath)) {
echo "<p class='ok'>✅ Storage symlink already exists.</p>";
} elseif (is_dir($symlinkPath)) {
// A real folder exists — delete it first (safe on fresh installs)
$deleted = true;
$files = @scandir($symlinkPath);
if ($files && count($files) > 2) {
// Has files inside — don't auto-delete, warn instead
echo "<p class='warn'>⚠️ /storage folder exists and has files. Delete it manually from File Manager then re-run setup.</p>";
$deleted = false;
} else {
@rmdir($symlinkPath);
if (file_exists($symlinkPath)) {
echo "<p class='fail'>❌ Could not delete existing /storage folder. Delete manually from cPanel File Manager.</p>";
$deleted = false;
} else {
echo "<p class='ok'>✅ Old empty /storage folder removed.</p>";
}
}
if ($deleted) {
if (@symlink($symlinkTarget, $symlinkPath)) {
echo "<p class='ok'>✅ Storage symlink created successfully.</p>";
} else {
echo "<p class='fail'>❌ Symlink failed after folder removal.</p>";
echo "<p class='warn'>SSH: <code>ln -s $symlinkTarget $symlinkPath</code></p>";
}
}
} else {
if (@symlink($symlinkTarget, $symlinkPath)) {
echo "<p class='ok'>✅ Storage symlink created successfully.</p>";
} else {
echo "<p class='fail'>❌ Could not create symlink automatically.</p>";
echo "<p class='warn'>SSH: <code>ln -s $symlinkTarget $symlinkPath</code></p>";
echo "<p class='warn'>Or ask your host to enable symlinks.</p>";
}
}
// ── 2. Storage directory permissions ───────────────────────────────────────
echo '<hr><p><strong>2. Storage Permissions</strong></p>';
$storageDirs = [
$appRoot . '/storage',
$appRoot . '/storage/app',
$appRoot . '/storage/app/public',
$appRoot . '/storage/framework',
$appRoot . '/storage/framework/cache',
$appRoot . '/storage/framework/sessions',
$appRoot . '/storage/framework/views',
$appRoot . '/storage/logs',
$appRoot . '/bootstrap/cache',
];
$allOk = true;
foreach ($storageDirs as $dir) {
if (!is_dir($dir)) {
@mkdir($dir, 0775, true);
}
if (is_writable($dir)) {
echo "<p class='ok'>✅ Writable: " . str_replace($appRoot, '', $dir) . "</p>";
} else {
if (@chmod($dir, 0775)) {
echo "<p class='ok'>✅ Fixed permissions: " . str_replace($appRoot, '', $dir) . "</p>";
} else {
echo "<p class='fail'>❌ Not writable: " . str_replace($appRoot, '', $dir) . "</p>";
$allOk = false;
}
}
}
// ── 3. .env file check ──────────────────────────────────────────────────────
echo '<hr><p><strong>3. Environment File</strong></p>';
if (file_exists($appRoot . '/.env')) {
echo "<p class='ok'>✅ .env file found.</p>";
$envContent = file_get_contents($appRoot . '/.env');
if (str_contains($envContent, 'APP_ENV=production')) {
echo "<p class='ok'>✅ APP_ENV=production</p>";
} else {
echo "<p class='warn'>⚠️ APP_ENV is not set to production. Edit .env file.</p>";
}
if (str_contains($envContent, 'APP_DEBUG=false')) {
echo "<p class='ok'>✅ APP_DEBUG=false</p>";
} else {
echo "<p class='warn'>⚠️ APP_DEBUG is not false. Set APP_DEBUG=false in .env!</p>";
}
} else {
echo "<p class='fail'>❌ .env file NOT found! Copy .env.production to .env and fill in your credentials.</p>";
}
// ── 4. PHP version ──────────────────────────────────────────────────────────
echo '<hr><p><strong>4. PHP Version</strong></p>';
$phpVer = PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION;
if (PHP_MAJOR_VERSION >= 8) {
echo "<p class='ok'>✅ PHP $phpVer (required: 8.0+)</p>";
} else {
echo "<p class='fail'>❌ PHP $phpVer — Need PHP 8.0 or higher!</p>";
}
// ── 5. Required extensions ─────────────────────────────────────────────────
echo '<hr><p><strong>5. PHP Extensions</strong></p>';
$required = ['pdo', 'pdo_mysql', 'mbstring', 'openssl', 'tokenizer', 'xml', 'ctype', 'json', 'bcmath', 'fileinfo', 'curl'];
foreach ($required as $ext) {
if (extension_loaded($ext)) {
echo "<p class='ok'>✅ $ext</p>";
} else {
echo "<p class='fail'>❌ $ext — Missing! Contact your host.</p>";
}
}
// ── 6. Clear License Cache ─────────────────────────────────────────────────
echo '<hr><p><strong>6. License Cache</strong></p>';
$cacheDir = $appRoot . '/storage/framework/cache/data';
$cleared = 0;
if (is_dir($cacheDir)) {
$iter = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($cacheDir, FilesystemIterator::SKIP_DOTS)
);
foreach ($iter as $file) {
if ($file->isFile()) {
$content = @file_get_contents($file->getPathname());
// Only delete license-related cache files
if ($content && (str_contains($content, '_tmit_lic'))) {
@unlink($file->getPathname());
$cleared++;
}
}
}
}
if ($cleared > 0) {
echo "<p class='ok'>✅ License cache cleared ($cleared file removed).</p>";
} else {
echo "<p class='info'>ℹ️ No license cache found (already clean).</p>";
}
// ── Done ────────────────────────────────────────────────────────────────────
echo '<hr>';
echo '<div class="done">';
echo '<p class="ok" style="font-size:18px;font-weight:bold">✅ Setup Complete!</p>';
echo '<p class="warn">⚠️ <strong>DELETE this file immediately:</strong> <code>setup.php</code></p>';
echo '<p>Your site should now be live at your domain.</p>';
echo '</div>';
?>
</div>
</body>
</html>