Files
RoleForge/app/templates/admin-os-images.xhtml
Sergey Antropoff 01d598eea5 - Админка: настройка pull-реестра (Hub / Harbor / Nexus) в БД, шифрование секретов;
обновлён /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.
2026-05-06 07:52:29 +03:00

115 lines
7.5 KiB
HTML

{% extends "base.xhtml" %}
{% from "macros/page-hero.xhtml" import page_hero %}
{% block content %}
<div class="dashboard-page">
{{ page_hero("Admin", "OS Images", "Build test images from dockerfiles for Molecule runs.") }}
<section class="dashboard-panel dashboard-panel--primary">
<div class="dashboard-panel-h">
<div>
<h2 class="dashboard-panel-title">Image Build</h2>
<p class="dashboard-panel-sub">Build images from <code>dockerfiles/</code>. Push layout uses <code>:&lt;os&gt;</code> tag on the registry; after build, copy the suggested <code>docker pull</code> / <code>docker tag</code> lines so Molecule keeps using <code>roleforge-os:&lt;os&gt;</code> locally.</p>
<p id="admin-os-registry-note" class="muted small-note" style="display:none"></p>
</div>
</div>
<div class="admin-os-registry-target">
<div class="schema-field schema-field--wide admin-os-registry-field">
<label class="schema-field-label" for="admin-os-registry-provider">Push registry</label>
<select id="admin-os-registry-provider" aria-label="Push registry">
<option value="hub">Docker Hub (hub.docker.com)</option>
<option value="harbor">Harbor</option>
<option value="nexus">Sonatype Nexus Repository</option>
</select>
</div>
<div id="admin-os-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-os-repo-path-hub">Repository path</label>
<input id="admin-os-repo-path-hub" type="text" autocomplete="off" placeholder="username/repo (e.g. inecs/roleforge)" />
</div>
<div class="admin-os-registry-doc-links" role="group" aria-label="Docker Hub">
<a id="admin-os-dynamic-repo-link" class="admin-os-doc-link" href="https://hub.docker.com/" target="_blank" rel="noopener noreferrer">
<span class="admin-os-doc-link__text">Repository on Hub</span>
</a>
<a class="admin-os-doc-link" href="https://docs.docker.com/docker-hub/" target="_blank" rel="noopener noreferrer">
<span class="admin-os-doc-link__text">Docker Hub docs</span>
</a>
</div>
</div>
<div id="admin-os-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-os-registry-host-harbor">Registry host</label>
<input id="admin-os-registry-host-harbor" type="text" autocomplete="off" placeholder="harbor.example.com or host:443" />
</div>
<div class="schema-field schema-field--wide admin-os-registry-field">
<label class="schema-field-label" for="admin-os-repo-path-harbor">Project / image path</label>
<input id="admin-os-repo-path-harbor" type="text" autocomplete="off" placeholder="project/service-image" />
</div>
<div class="admin-os-registry-doc-links" role="group" aria-label="Harbor documentation">
<a id="admin-os-help-harbor" class="admin-os-doc-link" href="https://goharbor.io/docs/" target="_blank" rel="noopener noreferrer">
<span class="admin-os-doc-link__text">Harbor documentation</span>
</a>
</div>
</div>
<div id="admin-os-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-os-registry-host-nexus">Registry host</label>
<input id="admin-os-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-os-repo-path-nexus">Docker repository path</label>
<input id="admin-os-repo-path-nexus" type="text" autocomplete="off" placeholder="repository/docker-hosted/my-image" />
</div>
<div class="admin-os-registry-doc-links" role="group" aria-label="Nexus Docker repositories">
<a id="admin-os-help-nexus" class="admin-os-doc-link" href="https://help.sonatype.com/repomanager3/formats/docker-registry/docker-registry-repositories" target="_blank" rel="noopener noreferrer">
<span class="admin-os-doc-link__text">Nexus Docker repositories</span>
</a>
</div>
</div>
</div>
<div class="admin-os-docker-auth schema-field schema-field--wide">
<label class="schema-field-label" for="admin-os-docker-user">Registry username</label>
<input id="admin-os-docker-user" type="text" name="docker-login-user" autocomplete="username" placeholder="Username for docker login" />
<label class="schema-field-label" for="admin-os-docker-password">Password or access token</label>
<input id="admin-os-docker-password" type="password" name="docker-login-password" autocomplete="current-password" placeholder="Required before each build" />
<p class="muted small-note">Sent only for this session to run <code>docker login</code> on the server; not stored.</p>
</div>
<div class="admin-os-selectors">
<div class="admin-os-selectors__head">
<strong>Images to build</strong>
<div class="admin-os-selectors__actions">
<button type="button" class="menu-link" id="admin-os-images-select-all">Select all</button>
<button type="button" class="menu-link" id="admin-os-images-select-none">Select none</button>
</div>
</div>
<div id="admin-os-images-list" class="admin-os-images-list" aria-live="polite"></div>
</div>
<div class="admin-os-mini-card" aria-live="polite">
<div class="admin-os-mini-card__top">
<span id="admin-os-images-state" class="admin-os-mini-card__state admin-os-state--idle">Idle</span>
<span id="admin-os-images-summary" class="admin-os-mini-card__summary muted small-note">Discovered 0 dockerfile variants.</span>
</div>
<div class="admin-os-mini-card__chips">
<span class="admin-os-build-status__chip admin-os-build-status__chip--built">Built: <strong id="admin-os-images-built">0</strong></span>
<span class="admin-os-build-status__chip admin-os-build-status__chip--failed">Failed: <strong id="admin-os-images-failed">0</strong></span>
<span class="admin-os-build-status__chip admin-os-build-status__chip--total">Total: <strong id="admin-os-images-total">0</strong></span>
</div>
<div class="admin-os-mini-card__bar-wrap">
<div id="admin-os-images-progress" class="admin-os-build-status__bar" style="width:0%"></div>
</div>
</div>
<label class="schema-field schema-field--wide">
<textarea id="admin-os-images-logs" rows="20" readonly placeholder="Build logs will appear here..."></textarea>
</label>
<div class="admin-os-toolbar">
<label class="admin-os-no-cache" for="admin-os-images-no-cache">
<input type="checkbox" id="admin-os-images-no-cache" />
<span>Do not use build cache (<code>--no-cache</code>)</span>
</label>
<div class="roles-form-actions admin-os-toolbar__actions">
<button type="button" class="cta-button" id="admin-os-images-build-btn">Build selected images</button>
<button type="button" class="btn-danger" id="admin-os-images-stop-btn" disabled="disabled">Stop build</button>
</div>
</div>
</section>
</div>
{% endblock %}