Big performance improvement! Added Caddyfile, using Caddy's file server to serve large files instead of PHP

This commit is contained in:
markmental 2026-03-02 16:58:47 -05:00
commit 10502157a3
4 changed files with 73 additions and 3 deletions

38
Caddyfile Normal file
View file

@ -0,0 +1,38 @@
{
frankenphp {
num_threads {$FRANKENPHP_NUM_THREADS:8}
max_threads {$FRANKENPHP_MAX_THREADS:16}
}
servers {
trusted_proxies static private_ranges
}
}
{$FREAX_SITE_ADDR::9000} {
root * {$FREAX_DOCROOT:/home/user/freax-media}
encode zstd gzip
@static path /assets/* /freaxlogo.png
handle @static {
file_server
}
handle_path /media/* {
@allowed_media path_regexp allowed_media (?i).*\.(mp4|mkv|avi|mov|wmv|flv|webm|m4v|mp3|wav|ogg|flac|m4a|aac|wma|opus)$
handle @allowed_media {
root * {$FREAX_MEDIA_ROOT:/__FREAX_MEDIA_ROOT_NOT_SET__}
forward_auth {$FREAX_AUTH_UPSTREAM:127.0.0.1:9000} {
uri /authz_media.php
}
file_server
}
respond "Forbidden" 403
}
php_server
file_server
}

View file

@ -475,6 +475,17 @@ function navigateToPlayback(path) {
window.location.href = `index.php?${params.toString()}`; window.location.href = `index.php?${params.toString()}`;
} }
function buildMediaStreamUrl(path) {
const normalized = String(path || '').replace(/\\/g, '/');
const encodedPath = normalized
.split('/')
.filter(Boolean)
.map(part => encodeURIComponent(part))
.join('/');
return `/media/${encodedPath}`;
}
function playFile(path, name) { function playFile(path, name) {
const container = $('playerContainer'); const container = $('playerContainer');
const ext = path.toLowerCase().split('.').pop(); const ext = path.toLowerCase().split('.').pop();
@ -483,7 +494,7 @@ function playFile(path, name) {
const media = document.createElement(isVideo ? 'video' : 'audio'); const media = document.createElement(isVideo ? 'video' : 'audio');
media.controls = true; media.controls = true;
media.autoplay = true; media.autoplay = true;
media.src = `serve_media.php?file=${encodeURIComponent(path)}`; media.src = buildMediaStreamUrl(path);
media.addEventListener('error', () => { media.addEventListener('error', () => {
container.innerHTML = ` container.innerHTML = `

8
authz_media.php Normal file
View file

@ -0,0 +1,8 @@
<?php
declare(strict_types=1);
require_once __DIR__ . '/auth.php';
require_auth(false);
http_response_code(204);
exit;

View file

@ -148,7 +148,20 @@ if [[ -n "$DOCROOT" ]]; then
fi fi
echo "Using PHP runner: $PHP_RUNNER" echo "Using PHP runner: $PHP_RUNNER"
echo "Starting frankenphp on :$PORT" export FREAX_DOCROOT="$(pwd)"
export FREAX_SITE_ADDR=":$PORT"
if [[ -n "${MEDIA_ROOT:-}" && -d "${MEDIA_ROOT}" ]]; then
export FREAX_MEDIA_ROOT="$(cd "$MEDIA_ROOT" && pwd -P)"
else
export FREAX_MEDIA_ROOT="/__FREAX_MEDIA_ROOT_NOT_SET__"
fi
export FREAX_AUTH_UPSTREAM="127.0.0.1:$PORT"
echo "Starting frankenphp with Caddyfile"
echo "FREAX_SITE_ADDR=$FREAX_SITE_ADDR"
echo "FREAX_DOCROOT=$FREAX_DOCROOT"
echo "FREAX_MEDIA_ROOT=$FREAX_MEDIA_ROOT"
echo "FREAX_AUTH_UPSTREAM=$FREAX_AUTH_UPSTREAM"
echo "MEDIA_USER=$MEDIA_USER" echo "MEDIA_USER=$MEDIA_USER"
echo "MEDIA_PASS_HASH set (bcrypt)" echo "MEDIA_PASS_HASH set (bcrypt)"
if [[ -n "${MEDIA_ROOT:-}" ]]; then if [[ -n "${MEDIA_ROOT:-}" ]]; then
@ -199,6 +212,6 @@ CACHE_LOOP_PID=$!
trap cleanup EXIT INT TERM trap cleanup EXIT INT TERM
frankenphp php-server --listen ":$PORT" & frankenphp run --config "$(pwd)/Caddyfile" --adapter caddyfile &
SERVER_PID=$! SERVER_PID=$!
wait "$SERVER_PID" wait "$SERVER_PID"