-
+
@@ -18,12 +18,21 @@
> ⚠️ **AVISO CRÍTICO:** Aplicação em estágio inicial de desenvolvimento. Não use em produção — há risco de perda de dados.
-Versão atual: **0.0.9**
+Versão atual: **0.1.0**
---
## � Changelog
+### [0.1.0] — 2026-05-09
+#### Adicionado
+- **Aba Agendamentos:** nova aba que permite criar e gerenciar agendamentos de backup, com suporte a execução única, diária, semanal e mensal.
+- **Formulário de agendamento:** o usuário informa o profile, o tipo de backup (full ou incremental), a frequência, a data/hora de início e se o agendamento está ativo. Para backups incrementais, é possível escolher o backup full base ou usar "Auto" (mais recente disponível).
+- **Scheduler no backend:** loop que roda a cada 60 segundos e dispara automaticamente os backups agendados no horário correto, calculando a próxima execução após cada run recorrente. Agendamentos do tipo "única vez" são desativados automaticamente após execução.
+- **API de agendamentos:** novas rotas `GET /api/schedules`, `POST /api/schedules`, `PATCH /api/schedules/:id/toggle` e `DELETE /api/schedules/:id`.
+- **Toggle ativo/inativo:** o agendamento pode ser pausado ou reativado diretamente na tabela sem precisar editar o formulário.
+
+---
### [0.0.9] — 2026-05-09
#### Corrigido
diff --git a/package.json b/package.json
index d438caf..0ae94af 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "dockerbackup-app",
- "version": "0.0.9",
+ "version": "0.1.0",
"description": "Aplicacao web para backup e restauracao de volumes Docker",
"main": "src/server.js",
"scripts": {
diff --git a/public/app.js b/public/app.js
index 5d137bc..4e5c8a4 100644
--- a/public/app.js
+++ b/public/app.js
@@ -55,6 +55,7 @@ const state = {
containers: [],
profiles: [],
storageLocations: [],
+ schedules: [],
activeRuns: new Map(),
volumeSelections: {},
};
@@ -117,6 +118,9 @@ function navigateTo(viewName) {
if (viewName === 'backups') {
renderBackupsView();
}
+ if (viewName === 'schedules') {
+ loadSchedules();
+ }
if (viewName === 'storage') {
loadStorageLocations();
}
@@ -1386,6 +1390,282 @@ async function handleProfileAction(event) {
}
}
+// ─── Schedules ────────────────────────────────────────────
+const FREQUENCY_LABELS = {
+ once: 'Única vez',
+ daily: 'Diária',
+ weekly: 'Semanal',
+ monthly: 'Mensal',
+};
+
+async function loadSchedules() {
+ try {
+ state.schedules = await api('/api/schedules');
+ renderSchedulesList();
+ } catch (error) {
+ showToast(error.message, true);
+ }
+}
+
+function renderSchedulesList() {
+ const list = document.querySelector('#schedulesList');
+ if (!list) return;
+
+ if (!state.schedules.length) {
+ list.innerHTML = '
Nenhum agendamento configurado. Crie um para automatizar seus backups.