471cfdd161
- 1 - Add: Gitea now creates timestamped database backup bundles under `[backup].PATH`, exposes the backup schedule in the installer, and surfaces the `database_backup` cron task in admin monitoring. - 2 - Add: installed instances now use `.gitea-installed` and `.gitea-recovery.ini` to enter email-gated recovery instead of falling back to public install mode when configuration or database access is broken. - 3 - Mod: the installer recovery flow now covers backup-bundle restore, bundled or manual `app.ini` reuse, uploaded SQL/GZ database restores, and repository-filesystem recovery with source-specific validation, confirmations, and preserved launcher state. - 4 - Fix: recovery now restores bundled `app.ini` snapshots when needed, discovers backup bundles from both the active backup path and persisted `.gitea-recovery.ini` path, and preserves SMTP and other rebuilt settings correctly when `app.ini` is missing or incomplete. - 5 - Fix: recovery validation and restore handling now accept either a selected backup bundle or an uploaded SQL/GZ dump, keep sensitive secrets and existing `LFS_JWT_SECRET` when appropriate, clear SQLite restore targets before import, and complete the post-install handoff without redirect loops. - 6 - Mod: fresh installs now default recovery email authorization to enabled with first-admin fallback, and the install/recovery UI, styling, and EN/RO wording were refined to match the final launcher behavior. Co-Authored-By: petru @ codex (GPT-5) <codex@openai.com> (cherry picked from commit 9879caf2292691b0cb521d12e6fee924b066bae2)
465 lines
12 KiB
CSS
465 lines
12 KiB
CSS
.page-content.install {
|
|
padding-bottom: calc(96px + env(safe-area-inset-bottom));
|
|
}
|
|
|
|
.page-content.install .install-config-container {
|
|
max-width: 900px;
|
|
margin: auto;
|
|
}
|
|
|
|
.page-footer.page-footer-install {
|
|
position: fixed;
|
|
left: 0;
|
|
right: 0;
|
|
bottom: 0;
|
|
z-index: 30;
|
|
}
|
|
|
|
.page-content.install form.ui.form .inline.field > label {
|
|
text-align: right;
|
|
width: 30%;
|
|
padding-right: 10px;
|
|
margin-right: 0;
|
|
}
|
|
|
|
.page-content.install .ui.form .field > .help,
|
|
.page-content.install .ui.form .field > .ui.checkbox:first-child,
|
|
.page-content.install .ui.form .field > .right-content {
|
|
margin-left: calc(30% + 5px);
|
|
width: auto;
|
|
}
|
|
|
|
summary.right-content.tw-py-2 {
|
|
margin-top: 17px;
|
|
}
|
|
|
|
.page-content.install form.ui.form input:not([type="checkbox"],[type="radio"]),
|
|
.page-content.install form.ui.form .ui.selection.dropdown {
|
|
width: 60%;
|
|
}
|
|
|
|
.page-content.install form.ui.form .inline.field > .js-password-toggle-group {
|
|
width: 60%;
|
|
}
|
|
|
|
.page-content.install form.ui.form details.optional.field[open] {
|
|
padding-bottom: 10px;
|
|
}
|
|
|
|
/* start edit/add - by petru @ codex */
|
|
.page-content.install .install-recovery-entry {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
gap: 1.5rem;
|
|
margin: 0 0 1.5rem;
|
|
padding: 1.25rem 1.5rem;
|
|
border: 1px solid var(--color-secondary-alpha-40);
|
|
border-radius: var(--border-radius-medium);
|
|
background: var(--color-box-body);
|
|
}
|
|
|
|
.page-content.install .install-recovery-entry-copy {
|
|
text-align: left;
|
|
}
|
|
|
|
.page-content.install .install-recovery-entry-copy .ui.header {
|
|
margin-bottom: 0.45rem;
|
|
}
|
|
|
|
.page-content.install .install-recovery-entry-copy p {
|
|
margin: 0;
|
|
color: var(--color-text-light-2);
|
|
}
|
|
|
|
.page-content.install .install-recovery-entry-actions {
|
|
flex: 0 0 auto;
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-modal {
|
|
max-width: 760px;
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-modal .install-recovery-launcher-problem {
|
|
margin-bottom: 1rem;
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-modal .content {
|
|
padding-top: 1.25rem;
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-modal .ui.dividing.header {
|
|
margin-top: 0;
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-modal .ui.raised.segment {
|
|
padding: 1rem 1rem 1.1rem;
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-modal .ui.small.header {
|
|
margin-bottom: 0.85rem;
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-modal .install-recovery-inline-field {
|
|
display: flex !important;
|
|
align-items: center;
|
|
gap: 0.85rem;
|
|
width: 100%;
|
|
margin-bottom: 0;
|
|
flex-wrap: nowrap;
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-modal .install-recovery-inline-field > label {
|
|
flex: 0 0 11rem;
|
|
margin: 0;
|
|
font-weight: var(--font-weight-semibold);
|
|
white-space: nowrap;
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-modal .install-recovery-inline-control-row {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.75rem;
|
|
flex: 1 1 auto;
|
|
width: auto;
|
|
min-width: 0;
|
|
flex-wrap: nowrap;
|
|
}
|
|
|
|
.install-recovery-inline-control-row > label {
|
|
text-align: right;
|
|
width: 30%;
|
|
padding-right: 12px;
|
|
margin-right: 0;
|
|
/* vertical-align: -webkit-baseline-middle; */
|
|
}
|
|
|
|
.install-recovery-select {
|
|
padding: .78571429em 3.2em .78571429em 1em;
|
|
width: 70% !important;
|
|
}
|
|
|
|
.install-recovery-inline-control-row > input {
|
|
width: 66% !important;
|
|
vertical-align: unset !important;
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-modal .install-recovery-inline-field > input[type="file"],
|
|
.page-content.install .install-recovery-launcher-modal .install-recovery-inline-field > select {
|
|
width: 100% !important;
|
|
min-width: 0;
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-modal .install-recovery-inline-control-row > input[type="file"] {
|
|
flex: 1 1 auto;
|
|
min-width: 0;
|
|
padding: 0.35rem;
|
|
border: 1px solid var(--color-secondary-alpha-40);
|
|
border-radius: 0.85rem;
|
|
background: var(--color-box-body);
|
|
color: var(--color-text);
|
|
}
|
|
|
|
.install-recovery-inline-control-row > button {
|
|
font-size: 14px !important;
|
|
min-height: 42px !important;
|
|
background: #322226 !important;
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-modal .install-recovery-inline-control-row > .button {
|
|
flex: 0 0 auto;
|
|
margin: 0 !important;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-modal .install-recovery-inline-control-row > input[type="file"]::file-selector-button {
|
|
margin-right: 0.85rem;
|
|
padding: 0.6rem 0.9rem;
|
|
border: 1px solid var(--color-secondary-alpha-40);
|
|
border-radius: 0.6rem;
|
|
background: var(--color-body);
|
|
color: var(--color-text);
|
|
cursor: pointer;
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-modal .install-recovery-inline-control-row > input[type="file"]::-webkit-file-upload-button {
|
|
margin-right: 0.85rem;
|
|
padding: 0.6rem 0.9rem;
|
|
border: 1px solid var(--color-secondary-alpha-40);
|
|
border-radius: 0.6rem;
|
|
background: var(--color-body);
|
|
color: var(--color-text);
|
|
cursor: pointer;
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-modal .install-recovery-select {
|
|
display: block;
|
|
appearance: none;
|
|
min-height: 2.95rem;
|
|
padding: 0.8rem 3rem 0.8rem 1rem;
|
|
border: 1px solid var(--color-secondary-alpha-40);
|
|
border-radius: 0.85rem;
|
|
background-color: var(--color-box-body);
|
|
background-image: linear-gradient(45deg, transparent 50%, var(--color-text-light-2) 50%), linear-gradient(135deg, var(--color-text-light-2) 50%, transparent 50%);
|
|
background-position: calc(100% - 22px) calc(50% - 3px), calc(100% - 16px) calc(50% - 3px);
|
|
background-size: 6px 6px, 6px 6px;
|
|
background-repeat: no-repeat;
|
|
color: var(--color-text);
|
|
box-shadow: inset 0 1px 0 var(--color-secondary-alpha-20);
|
|
transition: border-color 0.15s ease, box-shadow 0.15s ease, background-color 0.15s ease;
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-modal .install-recovery-select:hover {
|
|
border-color: var(--color-primary-light-2);
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-modal .install-recovery-select:focus {
|
|
border-color: var(--color-primary);
|
|
box-shadow: 0 0 0 3px var(--color-primary-alpha-20), inset 0 1px 0 var(--color-secondary-alpha-20);
|
|
outline: none;
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-layout {
|
|
display: grid;
|
|
gap: 1rem;
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-section {
|
|
padding: 1rem 1.1rem;
|
|
border: 1px solid var(--color-secondary-alpha-40);
|
|
border-radius: var(--border-radius-medium);
|
|
background: var(--color-box-header);
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-section-header {
|
|
margin-bottom: 0.85rem;
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-section-header h5 {
|
|
margin: 0;
|
|
font-size: 1rem;
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-section .field,
|
|
.page-content.install .install-recovery-launcher-section .reinstall-confirm {
|
|
width: 100%;
|
|
margin: 0;
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-section .field + .reinstall-confirm,
|
|
.page-content.install .install-recovery-launcher-section .reinstall-confirm + .reinstall-confirm {
|
|
margin-top: 0.85rem;
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-section label {
|
|
display: block;
|
|
margin-bottom: 0.4rem;
|
|
font-weight: var(--font-weight-semibold);
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-section input[type="file"],
|
|
.page-content.install .install-recovery-launcher-section select {
|
|
width: 100%;
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-section .help {
|
|
display: block;
|
|
margin-top: 0.45rem;
|
|
color: var(--color-text-light-2);
|
|
line-height: 1.45;
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-section .ui.checkbox label {
|
|
margin-bottom: 0;
|
|
font-weight: var(--font-weight-normal);
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-checkboxes {
|
|
display: grid;
|
|
gap: 0.75rem;
|
|
margin-top: 0.9rem;
|
|
}
|
|
/* end edit/add - by petru @ codex */
|
|
|
|
.page-content.install form.ui.form details.optional.field[open]:not(:last-child) {
|
|
border-bottom: 1px dashed var(--color-secondary);
|
|
}
|
|
.page-content.install form.ui.form details.optional.field[open] summary {
|
|
margin-bottom: 10px;
|
|
margin-top: 17px;
|
|
}
|
|
|
|
.page-content.install form.ui.form details.optional.field * {
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
.page-content.install form.ui.form .field {
|
|
text-align: left;
|
|
}
|
|
|
|
.page-content.install .ui .reinstall-message {
|
|
width: 70%;
|
|
margin: 20px auto;
|
|
color: var(--color-red);
|
|
text-align: left;
|
|
font-weight: var(--font-weight-semibold);
|
|
}
|
|
|
|
.page-content.install .ui .reinstall-confirm {
|
|
width: 70%;
|
|
text-align: left;
|
|
margin: 10px auto;
|
|
}
|
|
|
|
/* start edit/add - by petru @ codex */
|
|
.page-content.install .install-reinstall-confirm-modal .content {
|
|
padding-top: 1.25rem;
|
|
}
|
|
|
|
.page-content.install .install-reinstall-confirm-modal .recovery-source-block {
|
|
margin-bottom: 1rem;
|
|
}
|
|
|
|
.page-content.install .install-reinstall-confirm-modal .recovery-source-option {
|
|
padding: 0.75rem 0;
|
|
border-top: 1px solid var(--color-secondary-alpha-40);
|
|
}
|
|
|
|
.page-content.install .install-reinstall-confirm-modal .recovery-source-option:first-of-type {
|
|
border-top: 0;
|
|
padding-top: 0.25rem;
|
|
}
|
|
|
|
.page-content.install .install-reinstall-confirm-modal .recovery-source-option .help {
|
|
display: block;
|
|
margin-top: 0.35rem;
|
|
margin-left: 1.5rem;
|
|
}
|
|
|
|
.page-content.install .install-reinstall-confirm-modal .js-install-recovery-confirm-panel {
|
|
display: none;
|
|
}
|
|
|
|
.page-content.install .install-reinstall-confirm-modal .js-install-recovery-confirm-panel.is-active {
|
|
display: block;
|
|
}
|
|
|
|
.ui.negative.message.install-reinstall-alert {
|
|
font-size: 19px;
|
|
}
|
|
|
|
.page-content.install .install-reinstall-confirm-modal .install-reinstall-alert {
|
|
margin-bottom: 1rem;
|
|
text-align: center;
|
|
font-weight: var(--font-weight-semibold);
|
|
}
|
|
|
|
.page-content.install .install-reinstall-confirm-modal .reinstall-message,
|
|
.page-content.install .install-reinstall-confirm-modal .reinstall-confirm {
|
|
width: 100%;
|
|
margin-left: 0;
|
|
margin-right: 0;
|
|
}
|
|
|
|
.page-content.install .install-reinstall-confirm-modal .reinstall-message {
|
|
margin-top: 0;
|
|
margin-bottom: 1rem;
|
|
color: var(--color-error-text);
|
|
font-weight: var(--font-weight-semibold);
|
|
}
|
|
|
|
.page-content.install .install-reinstall-confirm-modal .reinstall-confirm {
|
|
padding: 0;
|
|
}
|
|
|
|
.page-content.install .install-reinstall-confirm-modal .reinstall-confirm + .reinstall-confirm {
|
|
margin-top: 0.6rem;
|
|
}
|
|
|
|
.page-content.install .install-reinstall-confirm-modal .reinstall-confirm .ui.checkbox label {
|
|
display: block;
|
|
padding-left: 1.5rem;
|
|
line-height: 1.5;
|
|
font-weight: var(--font-weight-normal);
|
|
}
|
|
|
|
.page-content.install .install-reinstall-confirm-modal .actions {
|
|
display: flex;
|
|
justify-content: flex-end;
|
|
gap: 0.75rem;
|
|
}
|
|
/* end edit/add - by petru @ codex */
|
|
|
|
.install-language-balloon {
|
|
position: fixed;
|
|
right: 10.5rem;
|
|
bottom: calc(56px + env(safe-area-inset-bottom));
|
|
z-index: 40;
|
|
max-width: 240px;
|
|
padding: 0.75rem 0.9rem;
|
|
border-radius: 8px;
|
|
background: var(--color-green);
|
|
color: var(--color-white);
|
|
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.18);
|
|
opacity: 0;
|
|
pointer-events: none;
|
|
transform: translateY(6px);
|
|
transition: opacity 0.15s ease, transform 0.15s ease;
|
|
}
|
|
|
|
.install-language-balloon::after {
|
|
content: "";
|
|
position: absolute;
|
|
right: 2rem;
|
|
bottom: -8px;
|
|
width: 16px;
|
|
height: 16px;
|
|
background: var(--color-green);
|
|
transform: rotate(45deg);
|
|
}
|
|
|
|
.install-language-balloon.is-visible {
|
|
opacity: 1;
|
|
transform: translateY(0);
|
|
}
|
|
|
|
.install-language-balloon.is-hidden {
|
|
opacity: 0;
|
|
transform: translateY(6px);
|
|
}
|
|
|
|
@media (max-width: 880px) {
|
|
.page-content.install {
|
|
padding-bottom: calc(150px + env(safe-area-inset-bottom));
|
|
}
|
|
|
|
/* start edit/add - by petru @ codex */
|
|
.page-content.install .install-recovery-entry {
|
|
flex-direction: column;
|
|
align-items: stretch;
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-modal .install-recovery-inline-field {
|
|
display: flex !important;
|
|
}
|
|
|
|
.page-content.install .install-recovery-launcher-modal .install-recovery-inline-field > label {
|
|
flex: 0 0 11rem;
|
|
}
|
|
|
|
.page-content.install .install-recovery-entry-actions .button {
|
|
width: 100%;
|
|
}
|
|
/* end edit/add - by petru @ codex */
|
|
|
|
.install-language-balloon {
|
|
right: 1rem;
|
|
bottom: calc(118px + env(safe-area-inset-bottom));
|
|
max-width: min(240px, calc(100vw - 2rem));
|
|
}
|
|
|
|
.install-language-balloon::after {
|
|
right: 1.5rem;
|
|
}
|
|
}
|