add custom path to site env (#629)

This commit is contained in:
Saeed Vaziry
2025-06-25 21:50:07 +02:00
committed by GitHub
parent a593525939
commit f4414a931e
7 changed files with 32 additions and 6 deletions

View File

@ -17,12 +17,15 @@ public function update(Site $site, array $input): void
{
Validator::make($input, [
'env' => ['required', 'string'],
'path' => ['required', 'string'],
])->validate();
$site->server->os()->write(
$site->path.'/.env',
$input['path'],
trim((string) $input['env']),
$site->user,
);
$site->jsonUpdate('type_data', 'env_path', $input['path']);
}
}

View File

@ -55,12 +55,17 @@ public function share(Request $request): array
$data = [];
if ($request->route('server')) {
$data['server'] = ServerResource::make($request->route('server'));
/** @var Server $server */
$server = $request->route('server');
if ($user && $user->can('view', $server) && $user->current_project_id !== $server->project_id) {
$user->current_project_id = $server->project_id;
$user->save();
}
$data['server'] = ServerResource::make($server);
// sites
$sites = [];
/** @var Server $server */
$server = $request->route('server');
if ($user && $user->can('viewAny', [Site::class, $server])) {
$sites = SiteResource::collection($server->sites);
}

View File

@ -19,7 +19,7 @@ export function AppHeader() {
<ProjectSwitch />
<SlashIcon className="size-3" />
<ServerSwitch />
{page.props.server && (
{page.props.server && page.props.server.services['webserver'] && (
<>
<SlashIcon className="size-3" />
<SiteSwitch />

View File

@ -11,14 +11,17 @@ import { LoaderCircleIcon } from 'lucide-react';
import { registerDotEnvLanguage } from '@/lib/editor';
import { Site } from '@/types/site';
import { useAppearance } from '@/hooks/use-appearance';
import { Input } from '@/components/ui/input';
export default function Env({ site, children }: { site: Site; children: ReactNode }) {
const { getActualAppearance } = useAppearance();
const [open, setOpen] = useState(false);
const form = useForm<{
env: string;
path: string;
}>({
env: '',
path: site.type_data.env_path || `${site.path}/.env`,
});
const submit = (e: FormEvent) => {
@ -55,7 +58,15 @@ export default function Env({ site, children }: { site: Site; children: ReactNod
<SheetTrigger asChild>{children}</SheetTrigger>
<SheetContent className="sm:max-w-5xl">
<SheetHeader>
<SheetTitle>Edit .env</SheetTitle>
<SheetTitle>
<Input
name="path"
value={form.data.path}
onChange={(e) => form.setData('path', e.target.value)}
autoFocus={false}
className="max-w-[80%]"
/>
</SheetTitle>
<SheetDescription className="sr-only">Edit .env file</SheetDescription>
</SheetHeader>
<Form id="update-env-form" className="h-full" onSubmit={submit}>

View File

@ -9,6 +9,7 @@ export interface Site {
type: string;
type_data: {
method?: 'round-robin' | 'least-connections' | 'ip-hash';
env_path?: string;
[key: string]: unknown;
};
domain: string;

View File

@ -381,6 +381,7 @@ public function test_update_env(): void
'site' => $site,
]), [
'env' => $envContent,
'path' => '/home/vito/some-path/.env',
])
->assertSuccessful()
->assertJsonFragment([

View File

@ -147,8 +147,13 @@ public function test_update_env_file(): void
'site' => $this->site,
]), [
'env' => 'APP_ENV="production"',
'path' => '/home/vito/some-path/.env',
])
->assertSessionDoesntHaveErrors();
$this->site->refresh();
$this->assertEquals('/home/vito/some-path/.env', data_get($this->site->type_data, 'env_path'));
}
/**