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 {
access_log /dev/stdout;
error_log /dev/stdout;
# Log format
log_format main '[$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
include mime.types;
default_type application/octet-stream;
access_log /dev/stdout main; # Log access to stdout
error_log /dev/stdout; # Log errors to stdout
include mime.types; # Include the mime types file
default_type application/octet-stream; # Default type
sendfile on; # Send files directly from disk
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
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 15;
types_hash_max_size 4096;
server {
server_name _;
listen 80;
server_name _; # Listen on all hostnames
listen 80; # Listen on port 80
root /var/www/html;
index index.html index.htm;
root /var/www/html; # Serve files from /var/www/html
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
# Upload endpoint
location /upload.php {
try_files $uri =404;
@ -35,9 +51,15 @@ http {
include fastcgi_params;
}
# Serve your files
location / {
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
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
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"
/etc/init.d/php8.1-fpm start &&
chmod 777 /run/php/php8.1-fpm.sock &&
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!!!!!!!!
*/
$SCRIPT_VERSION = "0.1.0"; // The version of the script
$before = microtime(true); // Start time of the script
$defaultSecretKey = "set me"; // The default secret key
header('Content-type:application/json;charset=utf-8'); // Set the response content type to JSON
@ -80,19 +81,38 @@ function returnJson($data): void
die();
}
/**
* Log to nginx
*/
function logToNginx($message): void
{
error_log($message);
}
try {
$secret = $_POST['secret']; // The secret key
$file = $_FILES['sharex']; // The uploaded file
$secret = isset($_POST['secret']) ? $_POST['secret'] : null; // The secret key
$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
if (!checkSecret($secret)) {
returnJson(array(
'status' => 'ERROR',
'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()
));
logToNginx("An upload was attempted with an invalid secret key: " . $secret);
die();
}
@ -103,6 +123,7 @@ try {
'url' => 'You need to set your upload secret in the configuration section of the upload.php file',
'timeTaken' => getTimeTaken()
));
logToNginx("An upload was attempted with the default secret key");
die();
}
@ -113,23 +134,26 @@ try {
'url' => 'No file was uploaded',
'timeTaken' => getTimeTaken()
));
logToNginx("An upload was attempted without providing a file");
die();
}
$target_file = 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.)
$originalFileName = preg_replace("/[^A-Za-z0-9_.]/", '', $_FILES["sharex"]["name"]); // Remove unwanted characters
$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
if (file_exists($uploadDir . $target_file)) {
if (file_exists($uploadDir . $originalFileName)) {
returnJson(array(
'status' => 'ERROR',
'url' => 'File already exists',
'timeTaken' => getTimeTaken()
));
logToNginx("An upload was attempted with a file that already exists: " . $originalFileName);
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
$finalName = generateRandomString($fileNameLength) . "." . $fileType;
}
@ -155,6 +179,8 @@ try {
$image->clear();
$image->destroy();
$fileSize = filesize($webp_file); // Update the file size
// Update the final filename
$finalName = $webp_file;
$needsToBeSaved = false;
@ -169,6 +195,7 @@ try {
'url' => 'Failed to save file. Check the permissions of the upload directory.',
'timeTaken' => getTimeTaken()
));
logToNginx("An upload was attempted but the file could not be saved: " . $finalName);
die();
}
}
@ -177,6 +204,7 @@ try {
'url' => $finalName,
'timeTaken' => getTimeTaken()
));
logToNginx("An upload was successful. original id: $originalFileName, final id: $finalName, size: $fileSize");
die();
} catch (Exception $e) { // Handle any errors
returnJson(array(
@ -184,5 +212,6 @@ try {
'url' => $e->getMessage(),
'timeTaken' => getTimeTaken()
));
logToNginx("An upload was attempted but an error occurred: " . $e->getMessage());
die();
}