Merge pull request 'Many improvements to the server' (#4) from development into master
All checks were successful
/ docker (push) Successful in 1m50s

Reviewed-on: #4
This commit is contained in:
Lee 2023-07-07 23:07:19 +00:00
commit 780ea18f5b
3 changed files with 85 additions and 27 deletions

@ -3,27 +3,43 @@ events {
} }
http { http {
access_log /dev/stdout; # Log format
error_log /dev/stdout; log_format main '[$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
include mime.types; access_log /dev/stdout main; # Log access to stdout
default_type application/octet-stream; error_log /dev/stdout; # Log errors to stdout
sendfile on; include mime.types; # Include the mime types file
tcp_nopush on; default_type application/octet-stream; # Default type
tcp_nodelay on;
keepalive_timeout 15; sendfile on; # Send files directly from disk
types_hash_max_size 4096; keepalive_timeout 15; # Keep connections alive for 15 seconds
types_hash_max_size 4096; # Max number of mime types
# TCP optimizations
tcp_nopush on; # Send headers in one packet
tcp_nodelay on; # Don't wait for packets to be full
server { server {
server_name _; server_name _; # Listen on all hostnames
listen 80; listen 80; # Listen on port 80
root /var/www/html; root /var/www/html; # Serve files from /var/www/html
index index.html index.htm; index index.html index.htm; # Serve index.html and index.htm by default
# Gzip
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 8;
gzip_buffers 16 64k;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
client_max_body_size 500M; # Will get replaced by the environment variable MAX_UPLOAD_SIZE client_max_body_size 500M; # Will get replaced by the environment variable MAX_UPLOAD_SIZE
# Upload endpoint
location /upload.php { location /upload.php {
try_files $uri =404; try_files $uri =404;
@ -35,9 +51,15 @@ http {
include fastcgi_params; include fastcgi_params;
} }
location / { # Serve your files
location / {
expires 7d; expires 7d;
open_file_cache max=1000 inactive=60s;
open_file_cache_valid 60s;
open_file_cache_min_uses 1;
open_file_cache_errors on;
# Serve the file directly from disk # Serve the file directly from disk
try_files $uri $uri/ =404; try_files $uri $uri/ =404;
} }

@ -26,8 +26,15 @@ sed -i "s/^post_max_size = .*/post_max_size = ${MAX_UPLOAD_SIZE}/" /etc/php/8.1/
# Set max upload size for nginx # Set max upload size for nginx
sed -i "s/client_max_body_size 500M;/client_max_body_size ${MAX_UPLOAD_SIZE};/" /etc/nginx/nginx.conf sed -i "s/client_max_body_size 500M;/client_max_body_size ${MAX_UPLOAD_SIZE};/" /etc/nginx/nginx.conf
# Start Nginx function start() {
echo "Starting PHP & Nginx" echo "Starting PHP & Nginx"
/etc/init.d/php8.1-fpm start && /etc/init.d/php8.1-fpm start &&
chmod 777 /run/php/php8.1-fpm.sock && chmod 777 /run/php/php8.1-fpm.sock &&
nginx -g 'daemon off;' nginx -g 'daemon off;'
}
# Start Nginx and retry if it fails
until start; do
echo "Nginx failed to start, retrying in 5 seconds..."
sleep 5
done

@ -3,6 +3,7 @@
/** /**
* DO NOT TOUCH!!!!!!!! * DO NOT TOUCH!!!!!!!!
*/ */
$SCRIPT_VERSION = "0.1.0"; // The version of the script
$before = microtime(true); // Start time of the script $before = microtime(true); // Start time of the script
$defaultSecretKey = "set me"; // The default secret key $defaultSecretKey = "set me"; // The default secret key
header('Content-type:application/json;charset=utf-8'); // Set the response content type to JSON header('Content-type:application/json;charset=utf-8'); // Set the response content type to JSON
@ -80,19 +81,38 @@ function returnJson($data): void
die(); die();
} }
/**
* Log to nginx
*/
function logToNginx($message): void
{
error_log($message);
}
try { try {
$secret = $_POST['secret']; // The secret key $secret = isset($_POST['secret']) ? $_POST['secret'] : null; // The secret key
$file = $_FILES['sharex']; // The uploaded file $file = isset($_FILES['sharex']) ? $_FILES['sharex'] : null; // The uploaded file
// Page to show if someone visits the upload script
if ($secret == null && $file == null) {
returnJson(array(
'status' => 'OK',
'url' => 'Welcome to the ShareX PHP Uploader! v' . $SCRIPT_VERSION,
// Remove this if you don't want to show the support URL
'support' => "For support, visit - https://git.fascinated.cc/Fascinated/sharex-php-uploader",
'timeTaken' => getTimeTaken()
));
die();
}
// Check if the token is valid // Check if the token is valid
if (!checkSecret($secret)) { if (!checkSecret($secret)) {
returnJson(array( returnJson(array(
'status' => 'ERROR', 'status' => 'ERROR',
'url' => 'Invalid or missing upload secret', 'url' => 'Invalid or missing upload secret',
// Remove this if you don't want to show the support URL
'support' => "For support, visit - https://git.fascinated.cc/Fascinated/sharex-php-uploader",
'timeTaken' => getTimeTaken() 'timeTaken' => getTimeTaken()
)); ));
logToNginx("An upload was attempted with an invalid secret key: " . $secret);
die(); die();
} }
@ -103,6 +123,7 @@ try {
'url' => 'You need to set your upload secret in the configuration section of the upload.php file', 'url' => 'You need to set your upload secret in the configuration section of the upload.php file',
'timeTaken' => getTimeTaken() 'timeTaken' => getTimeTaken()
)); ));
logToNginx("An upload was attempted with the default secret key");
die(); die();
} }
@ -113,23 +134,26 @@ try {
'url' => 'No file was uploaded', 'url' => 'No file was uploaded',
'timeTaken' => getTimeTaken() 'timeTaken' => getTimeTaken()
)); ));
logToNginx("An upload was attempted without providing a file");
die(); die();
} }
$target_file = preg_replace("/[^A-Za-z0-9_.]/", '', $_FILES["sharex"]["name"]); // Remove unwanted characters $originalFileName = preg_replace("/[^A-Za-z0-9_.]/", '', $_FILES["sharex"]["name"]); // Remove unwanted characters
$fileType = pathinfo($target_file, PATHINFO_EXTENSION); // File extension (e.g. png, jpg, etc.) $fileType = pathinfo($originalFileName, PATHINFO_EXTENSION); // File extension (e.g. png, jpg, etc.)
$fileSize = $_FILES["sharex"]["size"]; // File size in bytes
// Check if the file already exists // Check if the file already exists
if (file_exists($uploadDir . $target_file)) { if (file_exists($uploadDir . $originalFileName)) {
returnJson(array( returnJson(array(
'status' => 'ERROR', 'status' => 'ERROR',
'url' => 'File already exists', 'url' => 'File already exists',
'timeTaken' => getTimeTaken() 'timeTaken' => getTimeTaken()
)); ));
logToNginx("An upload was attempted with a file that already exists: " . $originalFileName);
die(); die();
} }
$finalName = $target_file; // The final name of the file $finalName = $originalFileName; // The final name of the file
if ($useRandomFileNames) { // Generate a random file name if enabled if ($useRandomFileNames) { // Generate a random file name if enabled
$finalName = generateRandomString($fileNameLength) . "." . $fileType; $finalName = generateRandomString($fileNameLength) . "." . $fileType;
} }
@ -155,6 +179,8 @@ try {
$image->clear(); $image->clear();
$image->destroy(); $image->destroy();
$fileSize = filesize($webp_file); // Update the file size
// Update the final filename // Update the final filename
$finalName = $webp_file; $finalName = $webp_file;
$needsToBeSaved = false; $needsToBeSaved = false;
@ -169,6 +195,7 @@ try {
'url' => 'Failed to save file. Check the permissions of the upload directory.', 'url' => 'Failed to save file. Check the permissions of the upload directory.',
'timeTaken' => getTimeTaken() 'timeTaken' => getTimeTaken()
)); ));
logToNginx("An upload was attempted but the file could not be saved: " . $finalName);
die(); die();
} }
} }
@ -177,6 +204,7 @@ try {
'url' => $finalName, 'url' => $finalName,
'timeTaken' => getTimeTaken() 'timeTaken' => getTimeTaken()
)); ));
logToNginx("An upload was successful. original id: $originalFileName, final id: $finalName, size: $fileSize");
die(); die();
} catch (Exception $e) { // Handle any errors } catch (Exception $e) { // Handle any errors
returnJson(array( returnJson(array(
@ -184,5 +212,6 @@ try {
'url' => $e->getMessage(), 'url' => $e->getMessage(),
'timeTaken' => getTimeTaken() 'timeTaken' => getTimeTaken()
)); ));
logToNginx("An upload was attempted but an error occurred: " . $e->getMessage());
die(); die();
} }