Skip to content

Commit 8b080d0

Browse files
lcs-crrcrypt0rrgithub-actions[bot]jackspiering
authored
Added dockge and radicale (#266)
* Added dockge and radicale * re-added paperless * Updated readme * docs(contributors): update README contributors * docs(contributors): update README contributors * docs(contributors): update README contributors * docs(contributors): update README contributors * docs(contributor): contrib-readme-action has updated readme * Restored template format * docs(contributor): contrib-readme-action has updated readme * refactor(dockge): update .env and README for clarity; adjust compose.yaml environment variables * docs(dockge): add comments for SERVICE and IMAGE_URL in .env for clarity * docs(README): add Dockge service to the list of available configurations * fix(radicale): set SERVICEPORT to 5232 for local network exposure * Added documentation on how to get started and creating users * Apply suggestions from code review Co-authored-by: Jack Spiering <46534141+jackspiering@users.noreply.github.com> * Minor tweaks to README * md lint * docs(contributor): contrib-readme-action has updated readme * docs(contributor): contrib-readme-action has updated readme * Clarify Dockge description in README Updated the description of Dockge to remove 'modern' and clarify the UI. --------- Co-authored-by: Bart <57799908+crypt0rr@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Jack Spiering <46534141+jackspiering@users.noreply.github.com>
1 parent 92c8c91 commit 8b080d0

7 files changed

Lines changed: 315 additions & 17 deletions

File tree

README.md

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ ScaleTail provides ready-to-run [Docker Compose](https://docs.docker.com/compose
147147
| 📝 **Nanote** | A lightweight, self-hosted note-taking app with Markdown support. | [Details](services/nanote) |
148148
| 🤖 **Open WebUI** | A self-hosted AI platform with a ChatGPT-style interface for local and cloud-based models. | [Details](services/open-webui) |
149149
| 🔗 **Pingvin Share** | **PROJECT ARCHIVED** A self-hosted file sharing platform. | [Details](services/pingvin-share) |
150+
| 📅 **Radicale** | A lightweight CalDAV and CardDAV server for self-hosted calendar, to-do, and contact sync. | [Details](services/radicale) |
150151
| 🔄 **Resilio Sync** | A fast, reliable, and simple file sync and share solution. | [Details](services/resilio-sync) |
151152
| 🗂️ **Stirling-PDF** | A web application for managing and editing PDF files. | [Details](services/stirlingpdf) |
152153
| 📄 **BentoPDF** | A lightweight, self-hosted web app for viewing and managing PDF documents. | [Details](services/bentopdf) |
@@ -173,6 +174,7 @@ ScaleTail provides ready-to-run [Docker Compose](https://docs.docker.com/compose
173174
| 🛠️ **Coder** | Self-hosted cloud dev environments with browser IDEs, Terraform-managed workspaces. | [Details](services/coder) |
174175
| 🔧 **Cyberchef** | A web app for encryption, encoding, compression, and data analysis. | [Details](services/cyberchef) |
175176
| 🐳 **Dockhand** | A modern, lightweight Docker management UI for containers and Compose stacks. | [Details](services/dockhand) |
177+
| 🐳 **Dockge** | A lightweight, self-hosted Docker Compose stack manager with a web UI. | [Details](services/dockge) |
176178
| 🖥️ **Dozzle** | A real-time log viewer for Docker containers. | [Details](services/dozzle) |
177179
| 🔁 **FossFLOW** | A self-hosted tool to make beautiful isometric infrastructure diagrams. | [Details](services/fossflow) |
178180
| 🖥️ **GitSave** | A self-hosted service to back up your GitHub repositories via a simple REST API and scheduled runs. | [Details](services/gitsave) |
@@ -270,10 +272,10 @@ A huge thank you to all our contributors! ScaleTail wouldn’t be what it is tod
270272
</a>
271273
</td>
272274
<td align="center">
273-
<a href="https://github.com/ChillBill77">
274-
<img src="https://avatars.githubusercontent.com/u/129118422?v=4" width="100;" alt="ChillBill77"/>
275+
<a href="https://github.com/lcs-crr">
276+
<img src="https://avatars.githubusercontent.com/u/98816628?v=4" width="100;" alt="lcs-crr"/>
275277
<br />
276-
<sub><b>ChillBill77</b></sub>
278+
<sub><b>lcs-crr</b></sub>
277279
</a>
278280
</td>
279281
<td align="center">
@@ -283,22 +285,29 @@ A huge thank you to all our contributors! ScaleTail wouldn’t be what it is tod
283285
<sub><b>michaelhodges</b></sub>
284286
</a>
285287
</td>
288+
<td align="center">
289+
<a href="https://github.com/ChillBill77">
290+
<img src="https://avatars.githubusercontent.com/u/129118422?v=4" width="100;" alt="ChillBill77"/>
291+
<br />
292+
<sub><b>ChillBill77</b></sub>
293+
</a>
294+
</td>
286295
<td align="center">
287296
<a href="https://github.com/adamsthws">
288297
<img src="https://avatars.githubusercontent.com/u/52178922?v=4" width="100;" alt="adamsthws"/>
289298
<br />
290299
<sub><b>adamsthws</b></sub>
291300
</a>
292301
</td>
302+
</tr>
303+
<tr>
293304
<td align="center">
294305
<a href="https://github.com/theryukverse">
295306
<img src="https://avatars.githubusercontent.com/u/22323518?v=4" width="100;" alt="theryukverse"/>
296307
<br />
297308
<sub><b>theryukverse</b></sub>
298309
</a>
299310
</td>
300-
</tr>
301-
<tr>
302311
<td align="center">
303312
<a href="https://github.com/KhaaL">
304313
<img src="https://avatars.githubusercontent.com/u/692524?v=4" width="100;" alt="KhaaL"/>
@@ -314,17 +323,17 @@ A huge thank you to all our contributors! ScaleTail wouldn’t be what it is tod
314323
</a>
315324
</td>
316325
<td align="center">
317-
<a href="https://github.com/onlykshitij">
318-
<img src="https://avatars.githubusercontent.com/u/30444410?v=4" width="100;" alt="onlykshitij"/>
326+
<a href="https://github.com/LaijieJi">
327+
<img src="https://avatars.githubusercontent.com/u/108839952?v=4" width="100;" alt="LaijieJi"/>
319328
<br />
320-
<sub><b>onlykshitij</b></sub>
329+
<sub><b>LaijieJi</b></sub>
321330
</a>
322331
</td>
323332
<td align="center">
324-
<a href="https://github.com/LaijieJi">
325-
<img src="https://avatars.githubusercontent.com/u/108839952?v=4" width="100;" alt="LaijieJi"/>
333+
<a href="https://github.com/MeheheCedy22">
334+
<img src="https://avatars.githubusercontent.com/u/96355171?v=4" width="100;" alt="MeheheCedy22"/>
326335
<br />
327-
<sub><b>LaijieJi</b></sub>
336+
<sub><b>MeheheCedy22</b></sub>
328337
</a>
329338
</td>
330339
<td align="center">
@@ -334,15 +343,15 @@ A huge thank you to all our contributors! ScaleTail wouldn’t be what it is tod
334343
<sub><b>MajnuRangeela</b></sub>
335344
</a>
336345
</td>
346+
</tr>
347+
<tr>
337348
<td align="center">
338349
<a href="https://github.com/mikkotor">
339350
<img src="https://avatars.githubusercontent.com/u/1879886?v=4" width="100;" alt="mikkotor"/>
340351
<br />
341352
<sub><b>mikkotor</b></sub>
342353
</a>
343354
</td>
344-
</tr>
345-
<tr>
346355
<td align="center">
347356
<a href="https://github.com/NI-R0">
348357
<img src="https://avatars.githubusercontent.com/u/98448863?v=4" width="100;" alt="NI-R0"/>
@@ -378,22 +387,29 @@ A huge thank you to all our contributors! ScaleTail wouldn’t be what it is tod
378387
<sub><b>guybrush115</b></sub>
379388
</a>
380389
</td>
390+
</tr>
391+
<tr>
381392
<td align="center">
382393
<a href="https://github.com/pjv">
383394
<img src="https://avatars.githubusercontent.com/u/327716?v=4" width="100;" alt="pjv"/>
384395
<br />
385396
<sub><b>pjv</b></sub>
386397
</a>
387398
</td>
388-
</tr>
389-
<tr>
390399
<td align="center">
391400
<a href="https://github.com/wedge22">
392401
<img src="https://avatars.githubusercontent.com/u/34723349?v=4" width="100;" alt="wedge22"/>
393402
<br />
394403
<sub><b>wedge22</b></sub>
395404
</a>
396405
</td>
406+
<td align="center">
407+
<a href="https://github.com/onlykshitij">
408+
<img src="https://avatars.githubusercontent.com/u/30444410?v=4" width="100;" alt="onlykshitij"/>
409+
<br />
410+
<sub><b>onlykshitij</b></sub>
411+
</a>
412+
</td>
397413
<td align="center">
398414
<a href="https://github.com/jpmurray">
399415
<img src="https://avatars.githubusercontent.com/u/1550428?v=4" width="100;" alt="jpmurray"/>
@@ -415,6 +431,8 @@ A huge thank you to all our contributors! ScaleTail wouldn’t be what it is tod
415431
<sub><b>gnr8shn</b></sub>
416432
</a>
417433
</td>
434+
</tr>
435+
<tr>
418436
<td align="center">
419437
<a href="https://github.com/gaetan-petit">
420438
<img src="https://avatars.githubusercontent.com/u/851486?v=4" width="100;" alt="gaetan-petit"/>
@@ -429,8 +447,6 @@ A huge thank you to all our contributors! ScaleTail wouldn’t be what it is tod
429447
<sub><b>dfilvtov</b></sub>
430448
</a>
431449
</td>
432-
</tr>
433-
<tr>
434450
<td align="center">
435451
<a href="https://github.com/cdkooistra">
436452
<img src="https://avatars.githubusercontent.com/u/70811244?v=4" width="100;" alt="cdkooistra"/>
@@ -459,6 +475,8 @@ A huge thank you to all our contributors! ScaleTail wouldn’t be what it is tod
459475
<sub><b>adivardhan1000</b></sub>
460476
</a>
461477
</td>
478+
</tr>
479+
<tr>
462480
<td align="center">
463481
<a href="https://github.com/orchard0">
464482
<img src="https://avatars.githubusercontent.com/u/55663276?v=4" width="100;" alt="orchard0"/>

services/dockge/.env

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#version=1.1
2+
#URL=https://github.com/tailscale-dev/ScaleTail
3+
#COMPOSE_PROJECT_NAME= # Optional: only use when running multiple deployments on the same infrastructure.
4+
5+
# Service Configuration
6+
SERVICE=dockge # Service name (e.g., adguard). Used as hostname in Tailscale and for container naming (app-${SERVICE}).
7+
IMAGE_URL=louislam/dockge:1 # Docker image URL from container registry (e.g., adguard/adguard-home).
8+
9+
# Network Configuration
10+
SERVICEPORT= # Port to expose to local network. Uncomment the "ports:" section in compose.yaml to enable.
11+
DNS_SERVER=9.9.9.9 # Preferred DNS server for Tailscale. Uncomment the "dns:" section in compose.yaml to enable.
12+
13+
# Tailscale Configuration
14+
TS_AUTHKEY= # Auth key from https://tailscale.com/admin/authkeys. See: https://tailscale.com/kb/1085/auth-keys#generate-an-auth-key for instructions.
15+
16+
# Optional Service variables
17+
STACKS_DIR= # Absolute path on host to store stack files. Must be bind mounted to the same path in compose.yaml.
18+
# For example, create a folder in your docker compose folder with the name stacks (mkdir stacks) and use /path/to/docker-compose-container-folder/stacks.
19+
PUID=1000 # Set the stack file/dir ownership to this user
20+
PGID=1000 # Set the stack file/dir ownership to this group

services/dockge/README.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Dockge with Tailscale Sidecar Configuration
2+
3+
This Docker Compose configuration sets up Dockge with a Tailscale sidecar container, enabling secure, private access to your Docker Compose management UI over your Tailnet. With this setup, your Dockge instance is not exposed to the public internet and is only accessible from authorized devices connected via Tailscale.
4+
5+
## Dockge
6+
7+
[Dockge](https://github.com/louislam/dockge) is a lightweight, self-hosted Docker Compose stack manager built for simplicity and control. Created by the developer behind Uptime Kuma, Dockge provides an intuitive web interface for managing, editing, and deploying docker-compose.yml stacks without relying solely on the CLI.
8+
9+
It is especially well-suited for homelabs, self-hosted environments, and DevOps workflows where multiple services are managed via Docker Compose.
10+
11+
## Key Features
12+
13+
* 🐳 Web-based Docker Compose stack management
14+
* ✏️ Live editing of docker-compose.yml files
15+
* ▶️ One-click start, stop, and restart of stacks
16+
* 📜 Real-time container logs viewer
17+
* 📦 Multi-stack organization via directories
18+
* ⚡ Lightweight and fast interface
19+
* 🔍 Clear visibility into container status
20+
21+
## Important Notice
22+
23+
Make sure to populate the `STACKS_DIR=` variable in the `.env` before first startup.

services/dockge/compose.yaml

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
configs:
2+
ts-serve:
3+
content: |
4+
{"TCP":{"443":{"HTTPS":true}},
5+
"Web":{"$${TS_CERT_DOMAIN}:443":
6+
{"Handlers":{"/":
7+
{"Proxy":"http://127.0.0.1:5001"}}}},
8+
"AllowFunnel":{"$${TS_CERT_DOMAIN}:443":false}}
9+
10+
services:
11+
# Make sure you have updated/checked the .env file with the correct variables.
12+
# All the ${ xx } need to be defined there.
13+
# Tailscale Sidecar Configuration
14+
tailscale:
15+
image: tailscale/tailscale:latest # Image to be used
16+
container_name: tailscale-${SERVICE} # Name for local container management
17+
hostname: ${SERVICE} # Name used within your Tailscale environment
18+
environment:
19+
- TS_AUTHKEY=${TS_AUTHKEY}
20+
- TS_STATE_DIR=/var/lib/tailscale
21+
- TS_SERVE_CONFIG=/config/serve.json # Tailscale Serve configuration to expose the web interface on your local Tailnet - remove this line if not required
22+
- TS_USERSPACE=false
23+
- TS_ENABLE_HEALTH_CHECK=true # Enable healthcheck endpoint: "/healthz"
24+
- TS_LOCAL_ADDR_PORT=127.0.0.1:41234 # The <addr>:<port> for the healthz endpoint
25+
#- TS_ACCEPT_DNS=true # Uncomment when using MagicDNS
26+
- TS_AUTH_ONCE=true
27+
configs:
28+
- source: ts-serve
29+
target: /config/serve.json
30+
volumes:
31+
- ./config:/config # Config folder used to store Tailscale files - you may need to change the path
32+
- ./ts/state:/var/lib/tailscale # Tailscale requirement - you may need to change the path
33+
devices:
34+
- /dev/net/tun:/dev/net/tun # Network configuration for Tailscale to work
35+
cap_add:
36+
- net_admin # Tailscale requirement
37+
#ports:
38+
# - 0.0.0.0:${SERVICEPORT}:${SERVICEPORT} # Binding port ${SERVICE}PORT to the local network - may be removed if only exposure to your Tailnet is required
39+
# If any DNS issues arise, use your preferred DNS provider by uncommenting the config below
40+
#dns:
41+
# - ${DNS_SERVER}
42+
healthcheck:
43+
test: [ "CMD", "wget", "--spider", "-q", "http://127.0.0.1:41234/healthz" ] # Check Tailscale has a Tailnet IP and is operational
44+
interval: 1m # How often to perform the check
45+
timeout: 10s # Time to wait for the check to succeed
46+
retries: 3 # Number of retries before marking as unhealthy
47+
start_period: 10s # Time to wait before starting health checks
48+
restart: always
49+
50+
# ${SERVICE}
51+
application:
52+
image: ${IMAGE_URL} # Image to be used
53+
network_mode: service:tailscale # Sidecar configuration to route ${SERVICE} through Tailscale
54+
container_name: app-${SERVICE} # Name for local container management
55+
environment:
56+
# Varibles are delared in .env file.
57+
- DOCKGE_STACKS_DIR=${STACKS_DIR} # Tell Dockge where your stacks directory is
58+
- PUID=${PUID} # Set the stack file/dir ownership to this user
59+
- PGID=${PGID} # Set the stack file/dir ownership to this group
60+
volumes:
61+
- ./${SERVICE}-data/app/config:/app/data
62+
- /var/run/docker.sock:/var/run/docker.sock
63+
- ${STACKS_DIR}:/stacks
64+
depends_on:
65+
tailscale:
66+
condition: service_healthy
67+
restart: always

services/radicale/.env

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#version=1.1
2+
#URL=https://github.com/tailscale-dev/ScaleTail
3+
#COMPOSE_PROJECT_NAME= # Optional: only use when running multiple deployments on the same infrastructure.
4+
5+
# Service Configuration
6+
SERVICE=radicale # Service name (e.g., adguard). Used as hostname in Tailscale and for container naming (app-${SERVICE}).
7+
IMAGE_URL=tomsquest/docker-radicale # Docker image URL from container registry (e.g., adguard/adguard-home).
8+
9+
# Network Configuration
10+
SERVICEPORT=5232 # Port to expose to local network. Uncomment the "ports:" section in compose.yaml to enable.
11+
DNS_SERVER=9.9.9.9 # Preferred DNS server for Tailscale. Uncomment the "dns:" section in compose.yaml to enable.
12+
13+
# Tailscale Configuration
14+
TS_AUTHKEY=... # Auth key from https://tailscale.com/admin/authkeys. See: https://tailscale.com/kb/1085/auth-keys#generate-an-auth-key for instructions.
15+
16+
# Optional Service variables
17+
# PUID=1000

services/radicale/README.md

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
# Radicale with Tailscale Sidecar Configuration
2+
3+
This Docker Compose configuration sets up [Radicale](https://radicale.org/) with Tailscale as a sidecar container to keep the app reachable over your Tailnet.
4+
5+
## Radicale
6+
7+
[Radicale](https://radicale.org/) is a small but powerful CalDAV (calendars, to-do lists) and CardDAV (contacts) server. It is lightweight, easy to configure, and requires minimal resources, making it a great self-hosted alternative to cloud-based calendar and contact sync services.
8+
9+
## Key Features
10+
11+
- CalDAV and CardDAV support for syncing calendars, to-do lists, and contacts
12+
- Works with any compliant client (Thunderbird, GNOME Calendar, DAVx5, Apple Calendar, etc.)
13+
- Lightweight with minimal resource usage
14+
- Simple file-based storage
15+
- Web interface for managing collections
16+
- Built-in access control and authentication
17+
18+
## Configuration Overview
19+
20+
In this setup, the `tailscale-radicale` service runs Tailscale, which manages secure networking for Radicale. The `radicale` service utilizes the Tailscale network stack via Docker's `network_mode: service:` configuration. This keeps the app Tailnet-only unless you intentionally expose ports.
21+
22+
The container runs with hardened security settings: read-only filesystem, no new privileges, dropped capabilities, and resource limits (256M memory, 50 pids).
23+
24+
## Prerequisites
25+
26+
- This image uses [tomsquest/docker-radicale](https://github.com/tomsquest/docker-radicale). Refer to their documentation for advanced configuration options.
27+
- To configure users and authentication, mount a custom config file or refer to the [Radicale documentation](https://radicale.org/v3.html#configuration).
28+
29+
## Creating Users
30+
31+
Radicale uses `htpasswd` for authentication. To set up users:
32+
33+
1. **Create the required directories:**
34+
35+
```bash
36+
set -a && source .env && set +a
37+
mkdir -p ./${SERVICE}-data/config
38+
```
39+
40+
2. **Create an `htpasswd` file** with your first user (requires `apache2-utils` on Debian/Ubuntu or `httpd-tools` on Fedora):
41+
42+
```bash
43+
htpasswd -B -c ./${SERVICE}-data/users <username>
44+
```
45+
46+
To add more users without overwriting the file, omit `-c`:
47+
48+
```bash
49+
htpasswd -B ./${SERVICE}-data/users <username>
50+
```
51+
52+
3. **Fill out config file**:
53+
54+
```bash
55+
nano ./${SERVICE}-data/config/radicale.conf
56+
```
57+
58+
With:
59+
60+
```ini
61+
[auth]
62+
type = htpasswd
63+
htpasswd_filename = /config/users
64+
htpasswd_encryption = bcrypt
65+
66+
[storage]
67+
filesystem_folder = /data/collections
68+
```
69+
70+
4. **Restart the stack:**
71+
72+
```bash
73+
docker compose down && docker compose up -d
74+
```
75+
76+
## Files to check
77+
78+
Please check the following contents for validity as some variables need to be defined upfront.
79+
80+
- `.env` — Main variable: `TS_AUTHKEY`

0 commit comments

Comments
 (0)