обновлён /admin/config и API для os_registry. - Molecule/раннер: env из конфигурации, ensure roleforge-os (ensure_roleforge_os.yml), os_registry_pull и доработки executors / runner / create.yml. - /admin/os-images: выбор реестра, buildx (в т.ч. split amd64+arm64 + imagetools), опция --no-cache, стрим логов; domain.py: план команд build, ретраи push. - UI: брендинг (app_name, app_tagline) из app_config через get_ui_branding_context; base.xhtml, role-create / role-view, core.js, pages-main, стили. - Dockerfiles: требование Python ≥3.9 (assert), доработки alt9/astra/debian9/ubuntu20 и др.; новые Dockerfile.arm64 для centos7/centos8. - Конфиг: .env.example, config.py, pyproject.toml.
108 lines
6.6 KiB
HTML
108 lines
6.6 KiB
HTML
{% extends "base.xhtml" %}
|
|
{% from "macros/page-hero.xhtml" import page_hero %}
|
|
{% block content %}
|
|
<div class="dashboard-page">
|
|
{{ page_hero("Admin", "Config", "Project settings and OS test-image registry for Molecule pulls.") }}
|
|
|
|
<section class="dashboard-panel dashboard-panel--primary">
|
|
<div class="dashboard-panel-h">
|
|
<div>
|
|
<h2 class="dashboard-panel-title">Project & runner</h2>
|
|
<p class="dashboard-panel-sub">Stored in the database (<code>app_config.project</code>). Used by workers and UI labels where applicable.</p>
|
|
</div>
|
|
</div>
|
|
<div class="admin-config-grid">
|
|
<div class="schema-field schema-field--wide admin-config-field">
|
|
<label class="schema-field-label" for="admin-config-app-name">App name</label>
|
|
<input id="admin-config-app-name" type="text" autocomplete="off" placeholder="RoleForge" />
|
|
</div>
|
|
<div class="schema-field schema-field--wide admin-config-field">
|
|
<label class="schema-field-label" for="admin-config-app-tagline">Tagline</label>
|
|
<input id="admin-config-app-tagline" type="text" autocomplete="off" placeholder="Ansible Orchestrator" />
|
|
<p class="muted small-note">Shown under the logo in the sidebar and in the browser tab title (with App name).</p>
|
|
</div>
|
|
<div class="schema-field schema-field--wide admin-config-field">
|
|
<label class="schema-field-label" for="admin-config-runner-image">Runner image</label>
|
|
<input id="admin-config-runner-image" type="text" autocomplete="off" placeholder="roleforge-backend:latest" />
|
|
</div>
|
|
<div class="schema-field schema-field--wide admin-config-field">
|
|
<label class="schema-field-label" for="admin-config-docker-network">Docker network</label>
|
|
<input id="admin-config-docker-network" type="text" autocomplete="off" />
|
|
</div>
|
|
<div class="schema-field admin-config-field">
|
|
<label class="schema-field-label" for="admin-config-runner-timeout">Runner timeout (sec)</label>
|
|
<input id="admin-config-runner-timeout" type="number" min="1" step="1" />
|
|
</div>
|
|
<div class="schema-field admin-config-field">
|
|
<label class="schema-field-label" for="admin-config-runner-poll">Runner poll interval (sec)</label>
|
|
<input id="admin-config-runner-poll" type="number" min="0.1" step="0.1" />
|
|
</div>
|
|
<div class="schema-field admin-config-field">
|
|
<label class="schema-field-label" for="admin-config-runner-max-errors">Max runner poll errors</label>
|
|
<input id="admin-config-runner-max-errors" type="number" min="1" step="1" />
|
|
</div>
|
|
</div>
|
|
<div class="roles-form-actions admin-config-actions">
|
|
<button type="button" class="cta-button" id="admin-config-save-project-btn">Save project settings</button>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="dashboard-panel dashboard-panel--primary">
|
|
<div class="dashboard-panel-h">
|
|
<div>
|
|
<h2 class="dashboard-panel-title">OS images registry (Molecule pull)</h2>
|
|
<p class="dashboard-panel-sub">When a test uses <code>roleforge-os:<os></code> and the image is not local, RoleForge pulls from this registry and tags it. Credentials are encrypted in the database (Fernet, app secret). Public Docker Hub repos need no login.</p>
|
|
</div>
|
|
</div>
|
|
<div class="admin-os-registry-target admin-config-registry">
|
|
<div class="schema-field schema-field--wide admin-os-registry-field">
|
|
<label class="schema-field-label" for="admin-config-registry-provider">Registry</label>
|
|
<select id="admin-config-registry-provider" aria-label="Registry type">
|
|
<option value="hub">Docker Hub</option>
|
|
<option value="harbor">Harbor</option>
|
|
<option value="nexus">Sonatype Nexus</option>
|
|
</select>
|
|
</div>
|
|
<div id="admin-config-registry-panel-hub" class="admin-os-registry-panel">
|
|
<div class="schema-field schema-field--wide admin-os-registry-field">
|
|
<label class="schema-field-label" for="admin-config-repo-path-hub">Repository path</label>
|
|
<input id="admin-config-repo-path-hub" type="text" autocomplete="off" placeholder="inecs/roleforge" />
|
|
</div>
|
|
</div>
|
|
<div id="admin-config-registry-panel-harbor" class="admin-os-registry-panel admin-os-registry-panel--hidden" hidden="hidden">
|
|
<div class="schema-field schema-field--wide admin-os-registry-field">
|
|
<label class="schema-field-label" for="admin-config-registry-host-harbor">Registry host</label>
|
|
<input id="admin-config-registry-host-harbor" type="text" autocomplete="off" placeholder="harbor.example.com" />
|
|
</div>
|
|
<div class="schema-field schema-field--wide admin-os-registry-field">
|
|
<label class="schema-field-label" for="admin-config-repo-path-harbor">Project / image path</label>
|
|
<input id="admin-config-repo-path-harbor" type="text" autocomplete="off" />
|
|
</div>
|
|
</div>
|
|
<div id="admin-config-registry-panel-nexus" class="admin-os-registry-panel admin-os-registry-panel--hidden" hidden="hidden">
|
|
<div class="schema-field schema-field--wide admin-os-registry-field">
|
|
<label class="schema-field-label" for="admin-config-registry-host-nexus">Registry host</label>
|
|
<input id="admin-config-registry-host-nexus" type="text" autocomplete="off" placeholder="nexus.example.com:8083" />
|
|
</div>
|
|
<div class="schema-field schema-field--wide admin-os-registry-field">
|
|
<label class="schema-field-label" for="admin-config-repo-path-nexus">Docker repository path</label>
|
|
<input id="admin-config-repo-path-nexus" type="text" autocomplete="off" />
|
|
</div>
|
|
</div>
|
|
<div class="schema-field schema-field--wide admin-os-registry-field">
|
|
<label class="schema-field-label" for="admin-config-registry-username">Registry username</label>
|
|
<input id="admin-config-registry-username" type="text" autocomplete="username" />
|
|
</div>
|
|
<div class="schema-field schema-field--wide admin-os-registry-field">
|
|
<label class="schema-field-label" for="admin-config-registry-password">Registry password / token</label>
|
|
<input id="admin-config-registry-password" type="password" autocomplete="new-password" placeholder="Leave blank to keep saved secret" />
|
|
</div>
|
|
<p id="admin-config-registry-password-hint" class="muted small-note" style="display:none">A password is stored encrypted. Submit empty to keep it unchanged.</p>
|
|
</div>
|
|
<div class="roles-form-actions admin-config-actions">
|
|
<button type="button" class="cta-button" id="admin-config-save-registry-btn">Save registry settings</button>
|
|
</div>
|
|
</section>
|
|
</div>
|
|
{% endblock %}
|