Compare commits

..

2 Commits

Author SHA1 Message Date
Lance Pioch
c784037ed4 Resolve real .env path and escape APP_URL for sed replacement 2026-02-07 23:21:04 -05:00
Lance Pioch
f4d572b0d3 Fix ASSET_URL not reaching PHP-FPM behind reverse proxy (#2026)
PHP-FPM's clear_env default strips shell environment variables, so the exported ASSET_URL was never visible to Laravel. This persists it to .env where Dotenv can read it.
2026-02-06 02:45:01 -05:00
9 changed files with 27 additions and 63 deletions

View File

@@ -30,7 +30,6 @@ use App\Traits\Filament\CanCustomizeTabs;
use Exception;
use Filament\Actions\Action;
use Filament\Actions\ActionGroup;
use Filament\Forms\Components\Checkbox;
use Filament\Forms\Components\CheckboxList;
use Filament\Forms\Components\FileUpload;
use Filament\Forms\Components\Hidden;
@@ -1107,13 +1106,9 @@ class EditServer extends EditRecord
->modalHeading(trans('filament-actions::delete.single.modal.heading', ['label' => $this->getRecordTitle()]))
->modalSubmitActionLabel(trans('filament-actions::delete.single.label'))
->requiresConfirmation()
->form(fn (Server $server) => $server->backups()->where('is_locked', false)->exists() ? [
Checkbox::make('delete_backups')
->label(trans('admin/server.delete_backups', ['count' => $server->backups()->where('is_locked', false)->count()])),
] : [])
->action(function (array $data, Server $server, ServerDeletionService $service) {
->action(function (Server $server, ServerDeletionService $service) {
try {
$service->withDeleteBackups($data['delete_backups'] ?? false)->handle($server);
$service->handle($server);
return redirect(ListServers::getUrl(panel: 'admin'));
} catch (ConnectionException) {
@@ -1137,13 +1132,9 @@ class EditServer extends EditRecord
->modalHeading(trans('filament-actions::force-delete.single.modal.heading', ['label' => $this->getRecordTitle()]))
->modalSubmitActionLabel(trans('filament-actions::force-delete.single.label'))
->requiresConfirmation()
->form(fn (Server $server) => $server->backups()->where('is_locked', false)->exists() ? [
Checkbox::make('delete_backups')
->label(trans('admin/server.delete_backups', ['count' => $server->backups()->where('is_locked', false)->count()])),
] : [])
->action(function (array $data, Server $server, ServerDeletionService $service) {
->action(function (Server $server, ServerDeletionService $service) {
try {
$service->withForce()->withDeleteBackups($data['delete_backups'] ?? false)->handle($server);
$service->withForce()->handle($server);
return redirect(ListServers::getUrl(panel: 'admin'));
} catch (ConnectionException) {

View File

@@ -78,15 +78,11 @@ class Console extends Page
$feature = data_get($data, 'key');
$feature = $this->featureService->get($feature);
if (!$feature) {
if (!$feature || $this->getMountedAction()) {
return;
}
if ($this->getMountedAction()) {
$this->replaceMountedAction($feature->getId());
} else {
$this->mountAction($feature->getId());
}
$this->mountAction($feature->getId());
sleep(2); // TODO find a better way
}
public function getWidgetData(): array

View File

@@ -209,18 +209,16 @@ class ListFiles extends ListRecords
->required()
->live(),
TextEntry::make('new_location')
->state(fn (Get $get, File $file) => resolve_path(join_paths($this->path, str_ends_with($get('location') ?? '/', '/') ? join_paths($get('location') ?? '/', $file->name) : $get('location') ?? '/'))),
->state(fn (Get $get, File $file) => resolve_path(join_paths($this->path, $get('location') ?? '/', $file->name))),
])
->action(function ($data, File $file) {
$location = $data['location'];
$endsWithSlash = str_ends_with($location, '/');
$to = $endsWithSlash ? join_paths($location, $file->name) : $location;
$files = [['to' => $to, 'from' => $file->name]];
$files = [['to' => join_paths($location, $file->name), 'from' => $file->name]];
$this->getDaemonFileRepository()->renameFiles($this->path, $files);
$oldLocation = join_paths($this->path, $file->name);
$newLocation = resolve_path(join_paths($this->path, $to));
$newLocation = resolve_path(join_paths($this->path, $location, $file->name));
Activity::event('server:file.rename')
->property('directory', $this->path)

View File

@@ -74,7 +74,7 @@ class OAuthController extends Controller
$email = $oauthUser->getEmail();
if (!$email) {
return $this->errorRedirect('No email was linked to your account on the OAuth provider.');
return $this->errorRedirect();
}
$user = User::whereEmail($email)->first();

View File

@@ -358,7 +358,7 @@ class Node extends Model implements Validatable
'disk_used' => 0,
];
return cache()->flexible("nodes.$this->id.statistics", [5, 30], function () use ($default) {
return cache()->remember("nodes.$this->id.statistics", now()->addSeconds(360), function () use ($default) {
try {
$data = Http::daemon($this)

View File

@@ -5,7 +5,6 @@ namespace App\Services\Servers;
use App\Exceptions\DisplayException;
use App\Models\Server;
use App\Repositories\Daemon\DaemonServerRepository;
use App\Services\Backups\DeleteBackupService;
use App\Services\Databases\DatabaseManagementService;
use Exception;
use Illuminate\Database\ConnectionInterface;
@@ -17,16 +16,13 @@ class ServerDeletionService
{
protected bool $force = false;
protected bool $deleteBackups = false;
/**
* ServerDeletionService constructor.
*/
public function __construct(
private ConnectionInterface $connection,
private DaemonServerRepository $daemonServerRepository,
private DatabaseManagementService $databaseManagementService,
private DeleteBackupService $deleteBackupService
private DatabaseManagementService $databaseManagementService
) {}
/**
@@ -39,16 +35,6 @@ class ServerDeletionService
return $this;
}
/**
* Set if unlocked backups should be deleted from storage when the server is deleted.
*/
public function withDeleteBackups(bool $bool = true): self
{
$this->deleteBackups = $bool;
return $this;
}
/**
* Delete a server from the panel and remove any associated databases from hosts.
*
@@ -92,22 +78,6 @@ class ServerDeletionService
}
}
if ($this->deleteBackups) {
foreach ($server->backups()->where('is_locked', false)->get() as $backup) {
try {
$this->deleteBackupService->handle($backup);
} catch (Exception $exception) {
if (!$this->force) {
throw $exception;
}
$backup->delete();
logger()->warning($exception);
}
}
}
$server->allocations()->update([
'server_id' => null,
'notes' => null,

View File

@@ -65,6 +65,20 @@ if [ "${BEHIND_PROXY}" == "true" ]; then
export PARSED_APP_URL=":80"
export PARSED_AUTO_HTTPS="auto_https off"
export ASSET_URL=${APP_URL}
# Write ASSET_URL to .env so PHP-FPM workers can read it (clear_env = yes by default)
ENV_FILE="/var/www/html/.env"
if [ -e "$ENV_FILE" ]; then
ENV_FILE="$(readlink -f "$ENV_FILE")"
else
ENV_FILE="/pelican-data/.env"
fi
ESCAPED_APP_URL="$(printf '%s' "$APP_URL" | sed 's/[&|]/\\&/g')"
if grep -q "^ASSET_URL=" "$ENV_FILE"; then
sed -i "s|^ASSET_URL=.*|ASSET_URL=${ESCAPED_APP_URL}|" "$ENV_FILE"
else
echo "ASSET_URL=${APP_URL}" >> "$ENV_FILE"
fi
fi
# disable caddy if SKIP_CADDY is set

View File

@@ -98,7 +98,6 @@ return [
'delete_db' => 'Are you sure you want to delete :name ?',
'delete_db_heading' => 'Delete Database?',
'backups' => 'Backups',
'delete_backups' => 'Also delete :count backup(s) from storage',
'egg' => 'Egg',
'mounts' => 'Mounts',
'no_mounts' => 'No Mounts exist for this Node',

View File

@@ -5,10 +5,6 @@
RewriteEngine On
# Handle X-Forwarded-Proto Header
RewriteCond %{HTTP:X-Forwarded-Proto} =https [NC]
RewriteRule .* - [E=HTTPS:on]
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]