diff --git a/README.md b/README.md index 30870d5..c804fb5 100644 --- a/README.md +++ b/README.md @@ -25,13 +25,19 @@ A self-hosted digital notice board / signage system built on ASP.NET Core 8, des - **Live Updates** — display polls for changes every 30 seconds - **Full-Screen Display** — hidden cursor, clock overlay, progress bar - **Smooth Transitions** — fade or slide transitions +- **Meow Expiration** — give any slide an expiry date/time; it's automatically skipped on displays afterwards (and stays in the library, unedited, in case you need it again) +- **Docker Support** — run via `docker compose up` as an alternative to IIS, with volumes for the database and uploads ## Requirements +**IIS (Windows Server):** - Windows Server 2019 or 2022 - IIS with ASP.NET Core Hosting Bundle - .NET 8 SDK (for building) / .NET 8 Runtime (for hosting) +**Docker (any host):** +- Docker Engine + Docker Compose — see [Docker Deployment](#docker-deployment) below + ## Quick Start ### 1. Install Prerequisites @@ -73,6 +79,62 @@ The SQLite database (`noticeboard.db`) is created automatically on first start w | `http://server/frontofhouse` | Front of House display | | `http://server/staffroom` | Staff Room display | +## Docker Deployment + +An alternative to IIS — runs anywhere Docker does (Linux, Windows with WSL2 backend, Synology/QNAP NAS, a Raspberry Pi, etc.). + +### 1. Build and run + +```bash +git clone https://gitea.hideawaygaming.com.au/jessikitty/ScratchingPost.git +cd ScratchingPost +docker compose up -d --build +``` + +That's it — the container listens on port **8080**, so open `http://server:8080`. + +### 2. What the compose file sets up + +`docker-compose.yml` builds the image from the included `Dockerfile` and wires up two bind-mounted folders next to the compose file so your data survives container rebuilds/updates: + +| Host path | Container path | Purpose | +|-----------|-----------------|---------| +| `./data` | `/data` | `noticeboard.db` (SQLite) | +| `./uploads` | `/app/wwwroot/uploads` | Images uploaded via TinyMCE, plus uploaded ICS files | + +Both folders are created automatically on first run. + +### 3. Configuration + +Same settings as IIS, just as environment variables in `docker-compose.yml` (nested keys use a double underscore): + +```yaml +environment: + - DataDirectory=/data + - Admin__Username=admin + - Admin__Password=ScratchingPost2026! + - MaxUploadSizeMB=20 +``` + +**Change the admin password before exposing this beyond your local network.** + +### 4. Updating + +```bash +git pull +docker compose up -d --build +``` + +The database and uploads persist across rebuilds since they live in the bind-mounted `./data` and `./uploads` folders, not inside the image. On startup the app checks the SQLite schema and adds any new columns it needs (e.g. the `ExpiresAt` column below) automatically — no manual migration step. + +### 5. Reverse proxy / HTTPS + +The container serves plain HTTP on 8080. For a public-facing deployment, put it behind a reverse proxy (Caddy, nginx, Traefik) that terminates HTTPS and forwards to `scratchingpost:8080`. + +### Running IIS and Docker side by side + +The IIS deployment and the Docker image are built from the same codebase and don't share a database or uploads folder by default — they're independent instances unless you point them at the same SQLite file and uploads directory yourself. + ## Configuration Edit `appsettings.json`: @@ -92,6 +154,16 @@ Edit `appsettings.json`: The display page polls for changes every 30 seconds, so updates appear on devices without restarting. +## Meow Expiration + +Any Meow can be given an **Expires** date/time in its editor (under **Scheduling**). Once that time passes: + +- The Meow is automatically skipped by every Kitten it's assigned to — no manual removal needed +- It stays fully intact in **Meows** (with a red **Expired** badge) so it can be re-used or have its expiry pushed back later +- Nothing is deleted — expiry only affects playback, not the stored slide + +Leave it blank for a Meow that should run indefinitely. This is checked using the server's local clock, so make sure the server's time zone is set correctly. + ## Display Controls Keyboard shortcuts on display pages (useful during setup): @@ -107,7 +179,8 @@ Keyboard shortcuts on display pages (useful during setup): - **Database**: SQLite (`noticeboard.db`) — created automatically, zero config - **Uploads**: `wwwroot/uploads/` — images uploaded via TinyMCE or the file upload API -- Both need write permissions for the IIS App Pool identity +- On IIS, both need write permissions for the App Pool identity +- On Docker, both live in bind-mounted host folders (`./data`, `./uploads`) — see [Docker Deployment](#docker-deployment) ## TinyMCE Note @@ -133,9 +206,13 @@ ScratchingPost/ │ └── uploads/ # User-uploaded images ├── appsettings.json # Configuration ├── web.config # IIS configuration +├── Dockerfile # Container build (alternative to IIS) +├── docker-compose.yml # Container run config (ports, volumes) +├── .dockerignore └── NoticeBoard.csproj # Project file ``` ## Version History +- **v1.1.0** — Docker deployment (`Dockerfile` + `docker-compose.yml`, configurable data directory, volume-backed DB/uploads), Meow expiration (`ExpiresAt` field, automatic playback filtering, auto-migrating column for existing databases) - **v1.0.0** — Initial release: WYSIWYG slides, embed, ICS calendar, device playlists, drag-and-drop ordering, live polling, IIS-ready deployment