Профили серверов: несколько миров с раздельными настройками

Профиль — это отдельный сервер: свой мир, .ini, песочница, набор модов и
лимит памяти JVM. Project Zomboid различает их по -servername, поэтому
файлы профилей не пересекаются. Работает всегда один профиль: серверные
файлы, игровые порты и файл запуска JVM общие, так что переключение
разрешено только на остановленном сервере.

- config: список профилей вместо одиночных server_name/admin_password/
  java_memory; старые поля переносятся в первый профиль при загрузке;
- supervisor: запускает активный профиль и выставляет его -Xmx на каждом
  старте, потому что файл запуска общий;
- бэкапы: архив снимается с одного профиля (мир + его конфиги), имя
  профиля попадает в имя файла, ротация считается по профилям;
- API профилей: список, создание с копированием настроек из другого
  профиля, правка, удаление и переключение активного;
- панель: селектор профиля в шапке и вкладка со списком профилей.

Удаление профиля убирает его только из панели: мир и конфиги остаются на
диске, чтобы случайное нажатие не стоило сохранений.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-04 00:27:12 +03:00
co-authored by Claude Opus 5
parent c384d60416
commit 277ab7af4a
13 changed files with 1317 additions and 183 deletions
+34
View File
@@ -382,3 +382,37 @@ input.input-sm, .input-sm { width: auto; padding: 6px 10px; font-size: 13px; }
.controls .btn { flex: 1; }
.content { padding: 14px; }
}
/* ---------- Профили ---------- */
.profile-picker {
display: inline-flex;
align-items: center;
gap: 8px;
font-size: 13px;
color: var(--muted);
}
.profile-picker select {
width: auto;
padding: 5px 10px;
font-size: 13px;
}
.profile-picker select:disabled { opacity: .55; cursor: not-allowed; }
.profile-card .field { margin-bottom: 10px; }
.profile-card .key { margin-bottom: 8px; }
.profile-actions { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 12px; }
.badge {
display: inline-block;
vertical-align: middle;
margin-left: 6px;
padding: 2px 8px;
border-radius: 999px;
background: var(--accent-dark);
color: #fff;
font-size: 11px;
text-transform: none;
letter-spacing: 0;
}