-
+
@@ -18,12 +18,20 @@
> ⚠️ **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.2.1**
+Versão atual: **0.2.2**
---
## 📋 Changelog
+### [0.2.2] — 2026-05-12
+
+#### Corrigido
+- **Volumes de container remoto:** ao clicar em um container para selecionar volumes no modal de criação de perfil, a busca de mounts agora utiliza a conexão correta (TCP remoto) quando a origem selecionada é uma conexão Docker remota (porta 2375), corrigindo o erro `ENOENT /var/run/docker.sock` que ocorria ao usar origens remotas.
+- **Agrupamento por Docker Compose na lista de containers:** containers do modal de criação de profile agora são agrupados visualmente por projeto Compose, com cabeçalho identificando o stack. Containers sem Compose aparecem em grupo separado "Containers avulsos".
+
+---
+
### [0.2.1] — 2026-05-12
#### Adicionado
diff --git a/package.json b/package.json
index 1546360..f0deff6 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "dockerbackup-app",
- "version": "0.2.1",
+ "version": "0.2.2",
"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 e6a7408..2f46175 100644
--- a/public/app.js
+++ b/public/app.js
@@ -1048,6 +1048,20 @@ function isMountBlocked(destination) {
);
}
+function renderContainerOption(container, selected) {
+ const hasVolumeSelection = Boolean(state.volumeSelections[container.id]?.length);
+ return `
+
+ `;
+}
+
function renderContainers() {
elements.containerCount.textContent = String(state.containers.length);
@@ -1059,19 +1073,48 @@ function renderContainers() {
}
const selected = new Set(getSelectedContainerIds());
- elements.containerOptions.innerHTML = eligible.map((container) => {
- const hasVolumeSelection = Boolean(state.volumeSelections[container.id]?.length);
- return `
-
- `;
- }).join('');
+
+ // Separate compose containers from standalone
+ const composeGroups = new Map(); // project -> container[]
+ const standalone = [];
+
+ for (const container of eligible) {
+ if (container.composeProject) {
+ if (!composeGroups.has(container.composeProject)) composeGroups.set(container.composeProject, []);
+ composeGroups.get(container.composeProject).push(container);
+ } else {
+ standalone.push(container);
+ }
+ }
+
+ const parts = [];
+
+ // Compose groups first, sorted by project name
+ for (const [project, containers] of [...composeGroups.entries()].sort(([a], [b]) => a.localeCompare(b))) {
+ parts.push(`