- Исправлена незакрытая скобка в _build_test_command (строка 745) - Добавлена поддержка k8s preset'ов: выполнение create_k8s_cluster.py перед create.yml - Обновлены образы в k8s preset'ах: заменен недоступный ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy на inecs/ansible-lab:ubuntu22-latest - Обновлены preset'ы в базе данных через SQL - Обновлены файлы: k8s-single.yml, k8s-multi.yml, k8s-istio-full.yml
201 lines
8.7 KiB
HTML
201 lines
8.7 KiB
HTML
{% extends "base.html" %}
|
||
|
||
{% block title %}Настройки Docker - DevOpsLab{% endblock %}
|
||
{% block page_title %}Настройки Docker (Harbor и Docker Hub){% endblock %}
|
||
|
||
{% block header_actions %}
|
||
<a href="/profile" class="btn btn-secondary btn-sm">
|
||
<i class="fas fa-arrow-left me-2"></i>
|
||
Назад к профилю
|
||
</a>
|
||
{% endblock %}
|
||
|
||
{% block content %}
|
||
<div class="row">
|
||
<!-- Docker Hub настройки -->
|
||
<div class="col-12 col-lg-6 mb-3">
|
||
<div class="card">
|
||
<div class="card-header">
|
||
<h5 class="mb-0">
|
||
<i class="fab fa-docker me-2"></i>
|
||
Docker Hub
|
||
</h5>
|
||
</div>
|
||
<div class="card-body">
|
||
<form
|
||
hx-post="/api/v1/profile/docker-settings"
|
||
hx-swap="none"
|
||
>
|
||
<div class="mb-3">
|
||
<label class="form-label">Имя пользователя</label>
|
||
<input
|
||
type="text"
|
||
name="dockerhub_username"
|
||
value="{{ profile.dockerhub_username if profile and profile.dockerhub_username else '' }}"
|
||
class="form-control"
|
||
placeholder="username"
|
||
>
|
||
</div>
|
||
|
||
<div class="mb-3">
|
||
<label class="form-label">Пароль / Access Token</label>
|
||
<input
|
||
type="password"
|
||
name="dockerhub_password"
|
||
value=""
|
||
class="form-control"
|
||
placeholder="Оставьте пустым, чтобы не изменять"
|
||
>
|
||
<div class="form-text">
|
||
Используйте Access Token вместо пароля для большей безопасности
|
||
</div>
|
||
</div>
|
||
|
||
<div class="mb-3">
|
||
<label class="form-label">Репозиторий по умолчанию</label>
|
||
<input
|
||
type="text"
|
||
name="dockerhub_repository"
|
||
value="{{ profile.dockerhub_repository if profile and profile.dockerhub_repository else '' }}"
|
||
class="form-control"
|
||
placeholder="ansible-lab"
|
||
>
|
||
<div class="form-text">
|
||
Имя репозитория (без namespace)
|
||
</div>
|
||
</div>
|
||
|
||
<button type="submit" class="btn btn-primary w-100">
|
||
<i class="fas fa-save me-2"></i>
|
||
Сохранить настройки Docker Hub
|
||
</button>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Harbor настройки -->
|
||
<div class="col-12 col-lg-6 mb-3">
|
||
<div class="card">
|
||
<div class="card-header">
|
||
<h5 class="mb-0">
|
||
<i class="fas fa-server me-2"></i>
|
||
Harbor
|
||
</h5>
|
||
</div>
|
||
<div class="card-body">
|
||
<form
|
||
hx-post="/api/v1/profile/docker-settings"
|
||
hx-swap="none"
|
||
>
|
||
<div class="mb-3">
|
||
<label class="form-label">URL Harbor</label>
|
||
<input
|
||
type="url"
|
||
name="harbor_url"
|
||
value="{{ profile.harbor_url if profile and profile.harbor_url else '' }}"
|
||
class="form-control"
|
||
placeholder="https://harbor.example.com"
|
||
>
|
||
</div>
|
||
|
||
<div class="mb-3">
|
||
<label class="form-label">Имя пользователя</label>
|
||
<input
|
||
type="text"
|
||
name="harbor_username"
|
||
value="{{ profile.harbor_username if profile and profile.harbor_username else '' }}"
|
||
class="form-control"
|
||
placeholder="admin"
|
||
>
|
||
</div>
|
||
|
||
<div class="mb-3">
|
||
<label class="form-label">Пароль</label>
|
||
<input
|
||
type="password"
|
||
name="harbor_password"
|
||
value=""
|
||
class="form-control"
|
||
placeholder="Оставьте пустым, чтобы не изменять"
|
||
>
|
||
</div>
|
||
|
||
<div class="mb-3">
|
||
<label class="form-label">Проект</label>
|
||
<input
|
||
type="text"
|
||
name="harbor_project"
|
||
value="{{ profile.harbor_project if profile and profile.harbor_project else '' }}"
|
||
class="form-control"
|
||
placeholder="library"
|
||
>
|
||
<div class="form-text">
|
||
Имя проекта в Harbor
|
||
</div>
|
||
</div>
|
||
|
||
<button type="submit" class="btn btn-primary w-100">
|
||
<i class="fas fa-save me-2"></i>
|
||
Сохранить настройки Harbor
|
||
</button>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
{% block scripts %}
|
||
<script>
|
||
document.addEventListener('DOMContentLoaded', function() {
|
||
// Обработка успешного сохранения настроек Docker
|
||
document.body.addEventListener('htmx:afterRequest', function(event) {
|
||
if (event.detail.path === '/api/v1/profile/docker-settings' && event.detail.xhr.status === 200) {
|
||
try {
|
||
const response = JSON.parse(event.detail.xhr.responseText);
|
||
if (response.success) {
|
||
// Показываем модальное окно с успешным сообщением
|
||
if (window.showMessageModal) {
|
||
window.showMessageModal(
|
||
response.message || 'Настройки успешно сохранены',
|
||
'success',
|
||
'Успешно',
|
||
function() {
|
||
// После закрытия модального окна обновляем страницу
|
||
location.reload();
|
||
}
|
||
);
|
||
} else {
|
||
// Если функция недоступна, просто обновляем страницу
|
||
location.reload();
|
||
}
|
||
}
|
||
} catch (e) {
|
||
console.error('Ошибка парсинга ответа:', e);
|
||
if (window.showMessageModal) {
|
||
window.showMessageModal('Ошибка при сохранении настроек', 'error');
|
||
}
|
||
}
|
||
} else if (event.detail.path === '/api/v1/profile/docker-settings' && event.detail.xhr.status !== 200) {
|
||
// Ошибка - показываем в модальном окне
|
||
try {
|
||
const response = JSON.parse(event.detail.xhr.responseText);
|
||
const errorMessage = response.detail || response.message || 'Ошибка при сохранении настроек';
|
||
if (window.showMessageModal) {
|
||
window.showMessageModal(errorMessage, 'error');
|
||
} else {
|
||
alert(errorMessage);
|
||
}
|
||
} catch (e) {
|
||
if (window.showMessageModal) {
|
||
window.showMessageModal('Ошибка при сохранении настроек', 'error');
|
||
} else {
|
||
alert('Ошибка при сохранении настроек');
|
||
}
|
||
}
|
||
}
|
||
});
|
||
});
|
||
</script>
|
||
{% endblock %}
|