mirror of
https://github.com/torrentpier/torrentpier
synced 2025-08-20 13:24:01 -07:00
[CLI] TorrentPier installer (#1576)
* Added CLI preparing installation script
* Update install.php
* Update install.php
* Update install.php
* Update install.php
* Update install.php
* Update install.php
* Update install.php
* Update install.php
* Update install.php
* Revert "Update install.php"
This reverts commit 554319e003
.
* Update install.php
* Update install.php
* Update install.php
* Update install.php
* Update install.php
* Update install.php
* Update install.php
* Update install.php
* Update install.php
* Update install.php
* Update .env.example
* Update install.php
* Update install.php
* Update install.php
* Update install.php
* Update install.php
* Update install.php
* Update install.php
* Update install.php
* Update install.php
* Update install.php
* Update install.php
* Update install.php
* Update install.php
* Update CHANGELOG.md
* Update install.php
* Update install.php
* Update install.php
* Update install.php
* Update install.php
This commit is contained in:
parent
45aaba883f
commit
434d4532eb
3 changed files with 261 additions and 1 deletions
|
@ -9,4 +9,4 @@ DB_HOST=localhost
|
||||||
DB_PORT=3306
|
DB_PORT=3306
|
||||||
DB_DATABASE=torrentpier
|
DB_DATABASE=torrentpier
|
||||||
DB_USERNAME=root
|
DB_USERNAME=root
|
||||||
DB_PASSWORD=secret
|
DB_PASSWORD=
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
**Merged pull requests:**
|
**Merged pull requests:**
|
||||||
|
|
||||||
- Release 2.4.5 🦕 ([belomaxorka](https://github.com/belomaxorka))
|
- Release 2.4.5 🦕 ([belomaxorka](https://github.com/belomaxorka))
|
||||||
|
- [CLI] TorrentPier installer ☕️ [\#1576](https://github.com/torrentpier/torrentpier/pull/1576) ([belomaxorka](https://github.com/belomaxorka))
|
||||||
- Added some new HTML meta-tags [\#1562](https://github.com/torrentpier/torrentpier/pull/1562) ([belomaxorka](https://github.com/belomaxorka))
|
- Added some new HTML meta-tags [\#1562](https://github.com/torrentpier/torrentpier/pull/1562) ([belomaxorka](https://github.com/belomaxorka))
|
||||||
- Added showing releaser stats in profile [\#1568](https://github.com/torrentpier/torrentpier/pull/1568) ([belomaxorka](https://github.com/belomaxorka))
|
- Added showing releaser stats in profile [\#1568](https://github.com/torrentpier/torrentpier/pull/1568) ([belomaxorka](https://github.com/belomaxorka))
|
||||||
- Fixed `md5()` deprecated in PHP 8.4 [\#1561](https://github.com/torrentpier/torrentpier/pull/1561) ([belomaxorka](https://github.com/belomaxorka))
|
- Fixed `md5()` deprecated in PHP 8.4 [\#1561](https://github.com/torrentpier/torrentpier/pull/1561) ([belomaxorka](https://github.com/belomaxorka))
|
||||||
|
|
259
install.php
Normal file
259
install.php
Normal file
|
@ -0,0 +1,259 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* TorrentPier – Bull-powered BitTorrent tracker engine
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) 2005-2024 TorrentPier (https://torrentpier.com)
|
||||||
|
* @link https://github.com/torrentpier/torrentpier for the canonical source repository
|
||||||
|
* @license https://github.com/torrentpier/torrentpier/blob/master/LICENSE MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
define('ROOT', __DIR__ . '/');
|
||||||
|
|
||||||
|
// Check CLI mode
|
||||||
|
if (php_sapi_name() !== 'cli') {
|
||||||
|
die('Please run <code style="background:#222;color:#00e01f;padding:2px 6px;border-radius:3px;">php ' . basename(__FILE__) . '</code> in CLI mode');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if already installed
|
||||||
|
if (is_file(ROOT . '.env')) {
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check readline extension
|
||||||
|
if (!extension_loaded('readline')) {
|
||||||
|
out('- ext-readline not found. Check out PHP instance', 'error');
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Colored console output
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @param string $type
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function out(string $str, string $type = ''): void
|
||||||
|
{
|
||||||
|
echo match ($type) {
|
||||||
|
'error' => "\033[31m$str \033[0m\n",
|
||||||
|
'success' => "\033[32m$str \033[0m\n",
|
||||||
|
'warning' => "\033[33m$str \033[0m\n",
|
||||||
|
'info' => "\033[36m$str \033[0m\n",
|
||||||
|
'debug' => "\033[90m$str \033[0m\n",
|
||||||
|
default => $str,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run process with realtime output
|
||||||
|
*
|
||||||
|
* @param string $cmd
|
||||||
|
* @param string|null $input
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function runProcess(string $cmd, string $input = null): void
|
||||||
|
{
|
||||||
|
$descriptorSpec = [
|
||||||
|
0 => ['pipe', 'r'],
|
||||||
|
1 => ['pipe', 'w'],
|
||||||
|
2 => ['pipe', 'w'],
|
||||||
|
];
|
||||||
|
|
||||||
|
$process = proc_open($cmd, $descriptorSpec, $pipes);
|
||||||
|
|
||||||
|
if (!is_resource($process)) {
|
||||||
|
out('- Could not start subprocess', 'error');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write input if provided
|
||||||
|
if ($input !== null) {
|
||||||
|
fwrite($pipes[0], $input);
|
||||||
|
fclose($pipes[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read and print output in real-time
|
||||||
|
while (!feof($pipes[1])) {
|
||||||
|
echo stream_get_contents($pipes[1], 1);
|
||||||
|
flush(); // Flush output buffer for immediate display
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read and print error output
|
||||||
|
while (!feof($pipes[2])) {
|
||||||
|
echo stream_get_contents($pipes[2], 1);
|
||||||
|
flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose($pipes[1]);
|
||||||
|
fclose($pipes[2]);
|
||||||
|
|
||||||
|
proc_close($process);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Welcoming message
|
||||||
|
out("- TorrentPier Installer\n", 'info');
|
||||||
|
|
||||||
|
// Check composer installation
|
||||||
|
if (!is_file(ROOT . 'vendor/autoload.php')) {
|
||||||
|
out('- Hmm, it seems there are no Composer dependencies', 'info');
|
||||||
|
|
||||||
|
// Downloading composer
|
||||||
|
if (!is_file(ROOT . 'composer.phar')) {
|
||||||
|
out('- Downloading Composer...', 'info');
|
||||||
|
if (copy('https://getcomposer.org/installer', ROOT . 'composer-setup.php')) {
|
||||||
|
out("- Composer successfully downloaded!\n", 'success');
|
||||||
|
runProcess('php ' . ROOT . 'composer-setup.php');
|
||||||
|
} else {
|
||||||
|
out('- Cannot download Composer', 'error');
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
if (is_file(ROOT . 'composer-setup.php')) {
|
||||||
|
if (unlink(ROOT . 'composer-setup.php')) {
|
||||||
|
out("- Composer installation file successfully removed!\n", 'success');
|
||||||
|
} else {
|
||||||
|
out('- Cannot remove Composer installation file. Delete it manually', 'warning');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Installing dependencies
|
||||||
|
if (is_file(ROOT . 'composer.phar')) {
|
||||||
|
out('- Installing dependencies...', 'info');
|
||||||
|
runProcess('php ' . ROOT . 'composer.phar install --no-interaction --no-ansi');
|
||||||
|
out("- Completed!\n", 'success');
|
||||||
|
} else {
|
||||||
|
out('- composer.phar not found', 'error');
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Preparing ENV
|
||||||
|
if (is_file(ROOT . '.env.example') && !is_file(ROOT . '.env')) {
|
||||||
|
if (copy(ROOT . '.env.example', ROOT . '.env')) {
|
||||||
|
out("- Environment file created!\n", 'success');
|
||||||
|
} else {
|
||||||
|
out('- Cannot create environment file', 'error');
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Editing ENV file
|
||||||
|
$DB_HOST = '';
|
||||||
|
$DB_PORT = 3306;
|
||||||
|
$DB_DATABASE = '';
|
||||||
|
$DB_USERNAME = '';
|
||||||
|
$DB_PASSWORD = '';
|
||||||
|
|
||||||
|
if (is_file(ROOT . '.env')) {
|
||||||
|
out("--- Configuring TorrentPier ---\n", 'info');
|
||||||
|
|
||||||
|
$envContent = file_get_contents(ROOT . '.env');
|
||||||
|
if ($envContent === false) {
|
||||||
|
out('- Cannot open environment file', 'error');
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
$envLines = explode("\n", $envContent);
|
||||||
|
|
||||||
|
$editedLines = [];
|
||||||
|
foreach ($envLines as $line) {
|
||||||
|
if (trim($line) !== '' && !str_starts_with($line, '#')) {
|
||||||
|
$parts = explode('=', $line, 2);
|
||||||
|
$key = trim($parts[0]);
|
||||||
|
$value = isset($parts[1]) ? trim($parts[1]) : '';
|
||||||
|
|
||||||
|
// Database default values
|
||||||
|
if (in_array($key, ['DB_HOST', 'DB_PORT', 'DB_DATABASE', 'DB_USERNAME', 'DB_PASSWORD'])) {
|
||||||
|
$$key = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
out("Current value of $key: $value", 'debug');
|
||||||
|
out("Enter a new value for $key (or leave empty to not change): ");
|
||||||
|
$newValue = readline();
|
||||||
|
|
||||||
|
if (!empty($newValue)) {
|
||||||
|
$line = "$key=$newValue";
|
||||||
|
// Configuring database connection
|
||||||
|
if (in_array($key, ['DB_HOST', 'DB_PORT', 'DB_DATABASE', 'DB_USERNAME', 'DB_PASSWORD'])) {
|
||||||
|
$$key = $newValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$editedLines[] = $line;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$newEnvContent = implode("\n", $editedLines);
|
||||||
|
if (file_put_contents(ROOT . '.env', $newEnvContent)) {
|
||||||
|
out("- TorrentPier successfully configured!\n", 'success');
|
||||||
|
} else {
|
||||||
|
out('- Cannot save environment file', 'error');
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
out('- Environment file not found', 'error');
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($DB_HOST) && !empty($DB_DATABASE) && !empty($DB_USERNAME)) {
|
||||||
|
out("--- Checking environment settings ---\n", 'info');
|
||||||
|
// Connecting to database
|
||||||
|
out("- Trying connect to MySQL...", 'info');
|
||||||
|
|
||||||
|
// Checking mysqli extension installed
|
||||||
|
if (!extension_loaded('mysqli')) {
|
||||||
|
out('- ext-mysqli not found. Check out php.ini file', 'error');
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Connect to MySQL server
|
||||||
|
try {
|
||||||
|
$conn = new mysqli($DB_HOST, $DB_USERNAME, $DB_PASSWORD, port: $DB_PORT);
|
||||||
|
} catch (mysqli_sql_exception $exception) {
|
||||||
|
out("- Connection failed: {$exception->getMessage()}", 'error');
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
if (!$conn->connect_error) {
|
||||||
|
out('- Connected successfully!', 'success');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Creating database if not exist
|
||||||
|
if ($conn->query("CREATE DATABASE IF NOT EXISTS $DB_DATABASE")) {
|
||||||
|
out('- Database created successfully!', 'success');
|
||||||
|
} else {
|
||||||
|
out("- Cannot create database: $DB_DATABASE", 'error');
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
$conn->select_db($DB_DATABASE);
|
||||||
|
|
||||||
|
// Checking SQL dump
|
||||||
|
$dumpPath = ROOT . 'install/sql/mysql.sql';
|
||||||
|
if (is_file($dumpPath) && is_readable($dumpPath)) {
|
||||||
|
out('- SQL dump file found and readable!', 'success');
|
||||||
|
} else {
|
||||||
|
out('- SQL dump file not found / not readable', 'error');
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inserting SQL dump
|
||||||
|
out('- Start importing SQL dump...', 'info');
|
||||||
|
$tempLine = '';
|
||||||
|
foreach (file($dumpPath) as $line) {
|
||||||
|
if (str_starts_with($line, '--') || $line == '') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$tempLine .= $line;
|
||||||
|
if (str_ends_with(trim($line), ';')) {
|
||||||
|
if (!$conn->query($tempLine)) {
|
||||||
|
out("- Error performing query: $tempLine", 'error');
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
$tempLine = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$conn->close();
|
||||||
|
out("- Importing SQL dump completed!\n", 'success');
|
||||||
|
out("- Voila! Good luck & have fun!", 'success');
|
||||||
|
rename(__FILE__, hash('md5', time()));
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue