Update Docker_GUI_Managers/dockhand/README.md
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
Source: https://dockhand.pro/
|
Source: https://dockhand.pro/
|
||||||
|
|
||||||
|
# Deploy
|
||||||
Must have Docker installed: https://wiki.gabesville.com/books/docker/page/install-docker
|
Must have Docker installed: https://wiki.gabesville.com/books/docker/page/install-docker
|
||||||
|
|
||||||
Run the docker command to install and run Dockhand:
|
Run the docker command to install and run Dockhand:
|
||||||
@@ -9,7 +10,7 @@ Go to http://IPADDRESS:3000 to access
|
|||||||
|
|
||||||
If firewall(UFW) is enabled you may need to allow port 3000 (test first before creating the rule)
|
If firewall(UFW) is enabled you may need to allow port 3000 (test first before creating the rule)
|
||||||
|
|
||||||
For updating:
|
# Updating
|
||||||
1. CD to location you want the update script created
|
1. CD to location you want the update script created
|
||||||
2. `sudo nano update-dockhand.sh`
|
2. `sudo nano update-dockhand.sh`
|
||||||
3. Copypasta into file:
|
3. Copypasta into file:
|
||||||
@@ -22,4 +23,153 @@ sleep 10s
|
|||||||
sudo docker run -d -p 3000:3000 --name dockhand --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /srv/docker/dockhand/dockhand_data:/app/data fnsys/dockhand:latest
|
sudo docker run -d -p 3000:3000 --name dockhand --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /srv/docker/dockhand/dockhand_data:/app/data fnsys/dockhand:latest
|
||||||
```
|
```
|
||||||
4. `sudo chmod u+x update-dockhand.sh`
|
4. `sudo chmod u+x update-dockhand.sh`
|
||||||
5. to run: `bash update-dockhand.sh`
|
5. to run: `bash update-dockhand.sh`
|
||||||
|
|
||||||
|
# How variables and secrets are handled:
|
||||||
|
|
||||||
|
This document summarizes how environment variables and secrets behave when using **Dockerhand** to deploy a stack from a `compose.yaml` and `.env` file.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Mental Model
|
||||||
|
|
||||||
|
Dockerhand has **two different injection mechanisms**:
|
||||||
|
|
||||||
|
| Type | When injected | Usable in `${VAR}` | Available in container |
|
||||||
|
|---------------------|--------------------------|--------------------|------------------------|
|
||||||
|
| **Variables** | Before `docker compose` | ✅ Yes | ✅ Yes |
|
||||||
|
| **Secrets** | At container runtime | ❌ No | ✅ Yes |
|
||||||
|
|
||||||
|
**Key takeaway:**
|
||||||
|
> Dockerhand secrets do **not** participate in Docker Compose variable interpolation.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## `.env` File Usage
|
||||||
|
|
||||||
|
Use `.env` for:
|
||||||
|
- Non-secret defaults
|
||||||
|
- Local development
|
||||||
|
- Structural configuration
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```env
|
||||||
|
DB_USERNAME=postgres
|
||||||
|
DB_HOSTNAME=database
|
||||||
|
DB_PORT=5432
|
||||||
|
DB_DATABASE_NAME=immich
|
||||||
|
IMMICH_VERSION=release
|
||||||
|
UPLOAD_LOCATION=/mnt/media
|
||||||
|
|
||||||
|
|
||||||
|
⚠️ Do not rely on .env for secrets in production.
|
||||||
|
|
||||||
|
❌ What Does NOT Work (Common Pitfall)
|
||||||
|
|
||||||
|
This fails when DB_PASSWORD is marked as a secret in Dockerhand:
|
||||||
|
|
||||||
|
environment:
|
||||||
|
DB_PASSWORD: ${DB_PASSWORD}
|
||||||
|
|
||||||
|
|
||||||
|
Reason:
|
||||||
|
|
||||||
|
Secrets are injected after Compose parsing
|
||||||
|
|
||||||
|
${DB_PASSWORD} resolves to empty
|
||||||
|
|
||||||
|
✅ Correct Pattern for Dockerhand Secrets
|
||||||
|
Rule
|
||||||
|
|
||||||
|
Never interpolate secrets with ${VAR}.
|
||||||
|
Declare the variable name only.
|
||||||
|
|
||||||
|
compose.yaml (Canonical Pattern)
|
||||||
|
Application container (e.g. Immich)
|
||||||
|
services:
|
||||||
|
immich-server:
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
environment:
|
||||||
|
DB_USERNAME:
|
||||||
|
DB_PASSWORD:
|
||||||
|
DB_HOSTNAME:
|
||||||
|
DB_PORT:
|
||||||
|
DB_DATABASE_NAME:
|
||||||
|
|
||||||
|
Database container (Postgres)
|
||||||
|
services:
|
||||||
|
database:
|
||||||
|
environment:
|
||||||
|
POSTGRES_USER:
|
||||||
|
POSTGRES_PASSWORD:
|
||||||
|
|
||||||
|
Dockerhand Configuration
|
||||||
|
Variables (non-secret)
|
||||||
|
DB_USERNAME=postgres
|
||||||
|
POSTGRES_USER=postgres
|
||||||
|
|
||||||
|
Secrets
|
||||||
|
DB_PASSWORD=********
|
||||||
|
POSTGRES_PASSWORD=********
|
||||||
|
|
||||||
|
|
||||||
|
✔ Secrets are injected by name
|
||||||
|
✔ Containers receive them at runtime
|
||||||
|
✔ No ${VAR} expansion involved
|
||||||
|
|
||||||
|
Why This Works
|
||||||
|
|
||||||
|
Compose does not attempt interpolation
|
||||||
|
|
||||||
|
Dockerhand injects secrets directly into container environments
|
||||||
|
|
||||||
|
Applications read expected variables normally
|
||||||
|
|
||||||
|
No accidental empty passwords
|
||||||
|
|
||||||
|
No secret leakage via docker inspect
|
||||||
|
|
||||||
|
Postgres-Specific Notes
|
||||||
|
|
||||||
|
POSTGRES_PASSWORD is only used on initial DB creation
|
||||||
|
|
||||||
|
Existing volumes require password changes via:
|
||||||
|
|
||||||
|
ALTER USER postgres WITH PASSWORD 'newpassword';
|
||||||
|
|
||||||
|
|
||||||
|
Authentication failures can be misleading when the app receives an empty password
|
||||||
|
|
||||||
|
Debugging Checklist
|
||||||
|
|
||||||
|
If authentication fails:
|
||||||
|
|
||||||
|
Confirm secret is not interpolated (${VAR})
|
||||||
|
|
||||||
|
Confirm variable name matches what the app expects
|
||||||
|
|
||||||
|
Check inside container:
|
||||||
|
|
||||||
|
env | grep PASSWORD
|
||||||
|
|
||||||
|
|
||||||
|
Check Postgres logs for auth method (scram-sha-256)
|
||||||
|
|
||||||
|
TL;DR
|
||||||
|
|
||||||
|
.env = defaults & structure
|
||||||
|
|
||||||
|
Dockerhand variables = safe overrides
|
||||||
|
|
||||||
|
Dockerhand secrets = runtime injection only
|
||||||
|
|
||||||
|
Never use ${VAR} for secrets
|
||||||
|
|
||||||
|
Declare env var names and let Dockerhand fill them
|
||||||
|
|
||||||
|
Final Rule to Remember
|
||||||
|
|
||||||
|
If it’s marked as a secret in Dockerhand,
|
||||||
|
Compose must never try to expand it.
|
||||||
Reference in New Issue
Block a user