feat(infra): add CasaOS compose with persistent /DATA bind

CasaOS copies imported compose files to /tmp/casaos-compose-app-* and
runs them from there, so the repo compose's relative ./data bind fails
at install ("bind source path does not exist") and would be wiped on
reboot. infra/compose.casaos.yaml mounts /DATA/AppData/dash instead and
carries x-casaos metadata for the app tile.

Authored By: TDvorak <[email protected]>

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
Tomas DvorakandDevin committed 2026-10-03 10:21:18 +02:00
1 parent 3ffc01d710
commit a94ae1889a
4 files changed
+79

No files matched your search

+7
View File
@@ -6,6 +6,13 @@ All notable changes to Dash. Format follows
## [Unreleased] ## [Unreleased]
### Added
- CasaOS deployment file `infra/compose.casaos.yaml` with app-store
(`x-casaos`) metadata and a persistent `/DATA/AppData/dash` bind mount;
the repo compose's relative `./data` fails under CasaOS, which runs
compose from `/tmp` and loses it on reboot
## [2.1.0] — 2026-09-23 ## [2.1.0] — 2026-09-23
### Added ### Added
+2
View File
@@ -9,5 +9,7 @@ services:
ports: ports:
- "3000:3000" - "3000:3000"
volumes: volumes:
# CasaOS: use infra/compose.casaos.yaml — CasaOS runs compose from /tmp,
# so this relative path fails there and would not survive a reboot.
- ./data:/data - ./data:/data
restart: unless-stopped restart: unless-stopped
+13
View File
@@ -43,6 +43,19 @@ To build the image locally instead of pulling:
docker compose up --build docker compose up --build
``` ```
## CasaOS
Do not paste `docker-compose.yml` into CasaOS's custom install. CasaOS copies
imported compose files to `/tmp/casaos-compose-app-*` and runs them there, so
the relative `./data` bind resolves under `/tmp` — install fails with
`bind source path does not exist`, and anything written would be wiped on
reboot anyway.
Use `infra/compose.casaos.yaml` instead (Apps → Custom Install → Import). It
mounts `/DATA/AppData/dash` on the host — persistent across reboots and
browsable in the CasaOS Files app — and carries the `x-casaos` metadata the
app tile uses.
## Binary ## Binary
Release archives contain a static `dash` binary (no CGO, no dependencies). Release archives contain a static `dash` binary (no CGO, no dependencies).
+57
View File
@@ -0,0 +1,57 @@
# CasaOS-ready compose. Import via Apps -> Custom Install -> Import from file.
#
# Do NOT paste the repo's docker-compose.yml into CasaOS: it copies imported
# files to /tmp/casaos-compose-app-* and runs them there, so a relative
# "./data" bind resolves under /tmp — install fails with "bind source path
# does not exist", and even if created the data dies on reboot. This file
# binds /DATA/AppData/dash instead — CasaOS's persistent app-data root,
# browsable in the Files app.
name: dash
services:
dash:
image: ghcr.io/dvorinka/dash:latest
container_name: dash
restart: unless-stopped
ports:
- "3000:3000"
environment:
- TZ=${TZ:-UTC}
volumes:
# Short-form bind auto-creates the host dir; long-form "type: bind" does
# not unless bind.create_host_path is set.
- /DATA/AppData/dash:/data
x-casaos:
envs:
- container: TZ
description:
en_us: "Timezone, e.g. Europe/Prague"
ports:
- container: "3000"
description:
en_us: "Web UI and API"
volumes:
- container: /data
description:
en_us: "All Dash state: SQLite database and uploaded icons"
x-casaos:
architectures:
- amd64
- arm64
main: dash
author: Dvorinka
category: Dashboard
developer: Dvorinka
description:
en_us: "Self-hosted homelab dashboard: services, uptime monitors, domain watch, system metrics. Single container, all state in /data."
icon: https://raw.githubusercontent.com/Dvorinka/Dash/main/dash.svg
tagline:
en_us: "Homelab dashboard in a single container"
thumbnail: ""
title:
en_us: Dash
scheme: http
port_map: "3000"
index: /
store_app_id: dash