release: v1.1.3 — dual-domain separation and URL options
ci / ci (22, ubuntu-latest) (push) Canceled after 0s
Publish Docker image / build (linux/amd64, ubuntu-latest, amd64) (push) Canceled after 0s
Publish Docker image / build (linux/arm64, ubuntu-24.04-arm, arm64) (push) Canceled after 0s
Publish Docker image / merge (push) Canceled after 0s
GitHub Release / release (push) Canceled after 0s

Add admin/image domain separation with host isolation middleware,
optional hide-folder public URLs, GitHub release update check, and
Lucky/Nginx deployment docs. Switch license to GPL-3.0-only.
This commit is contained in:
O96u committed 2026-08-27 12:13:58 +08:00
1 parent 55effa204e
commit d8c1303c32
41 files changed
+2170 -299

No files matched your search

+73 -8
View File
@@ -16,14 +16,21 @@ const username = ref('')
const password = ref('')
const confirmPassword = ref('')
const allowRegistration = ref(false)
const domainSeparation = ref(false)
const siteBaseUrl = ref('')
const imageBaseUrl = ref('')
const loading = ref(false)
const canSubmit = computed(() =>
Boolean(username.value && password.value && confirmPassword.value)
&& password.value === confirmPassword.value
&& isPasswordValid(password.value)
&& AUTH_USERNAME_PATTERN.test(username.value.trim())
)
const canSubmit = computed(() => {
if (!username.value || !password.value || !confirmPassword.value) return false
if (password.value !== confirmPassword.value) return false
if (!isPasswordValid(password.value)) return false
if (!AUTH_USERNAME_PATTERN.test(username.value.trim())) return false
if (domainSeparation.value) {
return Boolean(siteBaseUrl.value.trim() && imageBaseUrl.value.trim())
}
return true
})
onMounted(async () => {
const status = await fetchStatus()
@@ -34,6 +41,10 @@ onMounted(async () => {
}
if (status.initialized && !status.needsMigration) {
await router.replace('/')
return
}
if (import.meta.client) {
siteBaseUrl.value = window.location.origin
}
})
@@ -50,7 +61,10 @@ async function submit() {
const payload = {
username: username.value.trim(),
password: password.value,
allowRegistration: allowRegistration.value
allowRegistration: allowRegistration.value,
domainSeparation: domainSeparation.value,
siteBaseUrl: domainSeparation.value ? siteBaseUrl.value.trim() : undefined,
imageBaseUrl: domainSeparation.value ? imageBaseUrl.value.trim() : undefined
}
const result = isMigrate.value
? await migrate(payload)
@@ -76,7 +90,7 @@ async function submit() {
<div class="absolute top-4 right-4">
<AuthPagePreferences />
</div>
<div class="w-full max-w-sm rounded-2xl border border-default bg-elevated p-6 shadow-lg sm:p-8">
<div class="w-full max-w-sm rounded-2xl border border-default bg-elevated p-6 shadow-lg sm:max-w-md sm:p-8">
<div class="mb-8 space-y-3 text-center">
<div class="mx-auto inline-flex items-center justify-center">
<img
@@ -164,6 +178,57 @@ async function submit() {
{{ t('setup.allowRegistration') }}
</label>
<div class="space-y-3 rounded-xl border border-default bg-muted/20 p-4">
<label class="flex cursor-pointer items-start gap-2.5">
<UCheckbox
v-model="domainSeparation"
class="mt-0.5"
/>
<span>
<span class="block text-sm font-medium">{{ t('setup.domainSeparation') }}</span>
<span class="mt-1 block text-xs leading-relaxed text-muted">
{{ t('setup.domainSeparationHint') }}
</span>
</span>
</label>
<template v-if="domainSeparation">
<p class="text-xs leading-relaxed text-warning">
{{ t('setup.domainSeparationProxyHint') }}
<a
href="https://github.com/O96u/PicHost/blob/main/docs/domain-separation.md"
target="_blank"
rel="noopener noreferrer"
class="text-primary hover:underline"
>
{{ t('setup.domainSeparationProxyExample') }}
</a>
</p>
<div class="space-y-2">
<label class="text-sm">{{ t('setup.siteBaseUrl') }}</label>
<p class="text-xs text-muted">
{{ t('setup.siteBaseUrlHint') }}
</p>
<UInput
v-model="siteBaseUrl"
:placeholder="t('setup.siteBaseUrlPlaceholder')"
class="w-full font-mono text-sm"
/>
</div>
<div class="space-y-2">
<label class="text-sm">{{ t('setup.imageBaseUrl') }}</label>
<p class="text-xs text-muted">
{{ t('setup.imageBaseUrlHint') }}
</p>
<UInput
v-model="imageBaseUrl"
:placeholder="t('setup.imageBaseUrlPlaceholder')"
class="w-full font-mono text-sm"
/>
</div>
</template>
</div>
<UButton
type="submit"
:label="isMigrate ? t('setup.migrateSubmit') : t('setup.initSubmit')"