feat: Update environment variables and Docker configuration for improved directory management

This commit is contained in:
JB
2025-10-06 15:26:17 -07:00
parent 153d5ba92c
commit dc7a115e2e
4 changed files with 65 additions and 16 deletions
+11 -4
View File
@@ -1,14 +1,21 @@
# Copy this file to `.env` and customize the paths to match your environment. # Copy this file to `.env` and customize the paths to match your environment.
# Relative paths are resolved from the repository root when running locally. # Relative paths are resolved from the repository root when running locally.
# Each `*_DIR` value below points to a directory on the host. Docker Compose
# mounts it into the container at the standard path noted in the comment.
# Host directory that stores JSON settings. Mounted to /config in Docker.
ABOGEN_SETTINGS_DIR=./config ABOGEN_SETTINGS_DIR=./config
# Host directory for rendered audio/subtitle files. Mounted to /data/outputs
# in Docker.
ABOGEN_OUTPUT_DIR=./storage/output ABOGEN_OUTPUT_DIR=./storage/output
# Temporary working directory. When running in Docker, keep this inside the # Temporary working directory. When running in Docker, keep this inside the
# mounted /data volume so non-root users can write to it. For local (non-Docker) # mounted data volume (or another writable host path) so non-root users can
# usage, change this to a path that makes sense on your machine or comment it out # write to it. For local (non-Docker) usage, change this to a path that makes
# to fall back to the OS cache directory. # sense on your machine or comment it out to fall back to the OS cache
ABOGEN_TEMP_DIR=/data/cache # directory. Mounted to /data/cache in Docker.
ABOGEN_TEMP_DIR=./storage/tmp
# UID/GID used when running the Docker container. 1000:1000 matches most Linux hosts. # UID/GID used when running the Docker container. 1000:1000 matches most Linux hosts.
# Find your current values with: # Find your current values with:
+10 -7
View File
@@ -49,12 +49,12 @@ Browse to http://localhost:8808. Uploaded source files are stored in `/data/uplo
| `ABOGEN_PORT` | `8808` | HTTP port | | `ABOGEN_PORT` | `8808` | HTTP port |
| `ABOGEN_DEBUG` | `false` | Enable Flask debug mode | | `ABOGEN_DEBUG` | `false` | Enable Flask debug mode |
| `ABOGEN_UPLOAD_ROOT` | `/data/uploads` | Directory where uploaded files are stored | | `ABOGEN_UPLOAD_ROOT` | `/data/uploads` | Directory where uploaded files are stored |
| `ABOGEN_OUTPUT_ROOT` | `/data/outputs` | Directory for generated audio and subtitles | | `ABOGEN_OUTPUT_ROOT` | `/data/outputs` | Directory for generated audio and subtitles (legacy alias of `ABOGEN_OUTPUT_DIR`) |
| `ABOGEN_OUTPUT_DIR` | `/data/outputs` | Container path for rendered audio/subtitles |
| `ABOGEN_SETTINGS_DIR` | `/config` | Container path for JSON settings/configuration |
| `ABOGEN_TEMP_DIR` | `/data/cache` (Docker) or platform cache dir | Container path for temporary files |
| `ABOGEN_UID` | `1000` | UID that the container should run as (matches host user) | | `ABOGEN_UID` | `1000` | UID that the container should run as (matches host user) |
| `ABOGEN_GID` | `1000` | GID that the container should run as (matches host group) | | `ABOGEN_GID` | `1000` | GID that the container should run as (matches host group) |
| `ABOGEN_TEMP_DIR` | `/data/cache` (Docker) or platform cache dir | Override the cache/temp directory |
| `ABOGEN_OUTPUT_DIR` | Same as `ABOGEN_OUTPUT_ROOT` | Override the rendered output directory |
| `ABOGEN_SETTINGS_DIR` | Platform config dir (e.g. `~/.config/abogen`) | Override where JSON settings (profiles, config) are stored |
Set any of these with `-e VAR=value` when starting the container. Set any of these with `-e VAR=value` when starting the container.
@@ -67,9 +67,12 @@ id -g
Use those values to populate `ABOGEN_UID` / `ABOGEN_GID` in your `.env` file. Use those values to populate `ABOGEN_UID` / `ABOGEN_GID` in your `.env` file.
When running via Docker Compose, the container defaults to `/data/cache` for When running via Docker Compose, set `ABOGEN_SETTINGS_DIR`,
temporary files. Make sure the corresponding host directory is writable (the `ABOGEN_OUTPUT_DIR`, and `ABOGEN_TEMP_DIR` in your `.env` file to the host
compose volume at `${ABOGEN_DATA:-./data}` will automatically satisfy this). directories you want mounted into the container. Compose maps them to
`/config`, `/data/outputs`, and `/data/cache` respectively while exporting
those in-container paths to the application. Ensure each host directory exists
and is writable by the UID/GID you configure before starting the stack.
### Docker Compose (GPU by default) ### Docker Compose (GPU by default)
The repo includes `docker-compose.yaml`, which targets GPU hosts out of the box. Install the NVIDIA Container Toolkit and run: The repo includes `docker-compose.yaml`, which targets GPU hosts out of the box. Install the NVIDIA Container Toolkit and run:
+36 -2
View File
@@ -1,4 +1,5 @@
import json import json
import logging
import os import os
import platform import platform
import re import re
@@ -142,14 +143,47 @@ def get_user_config_path():
# Define cache path # Define cache path
@lru_cache(maxsize=1) @lru_cache(maxsize=1)
def get_user_cache_root(): def get_user_cache_root():
logger = logging.getLogger(__name__)
def _try_paths(*paths):
last_error = None
for candidate in paths:
if not candidate:
continue
try:
return ensure_directory(candidate)
except OSError as exc:
last_error = exc
logger.debug("Unable to use cache directory %s: %s", candidate, exc)
if last_error is not None:
raise last_error
override = os.environ.get("ABOGEN_TEMP_DIR") override = os.environ.get("ABOGEN_TEMP_DIR")
if override: if override:
try:
return ensure_directory(override) return ensure_directory(override)
except OSError as exc:
logger.warning("ABOGEN_TEMP_DIR=%s is not writable: %s", override, exc)
from platformdirs import user_cache_dir from platformdirs import user_cache_dir
cache_dir = user_cache_dir("abogen", appauthor=False, opinion=True, ensure_exists=True) default_cache = user_cache_dir("abogen", appauthor=False, opinion=True)
return ensure_directory(cache_dir)
data_root = os.environ.get("ABOGEN_DATA") or os.environ.get("ABOGEN_DATA_DIR")
fallback_paths = [
default_cache,
os.path.join(data_root, "cache") if data_root else None,
"/data/cache",
"/tmp/abogen-cache",
]
try:
return _try_paths(*fallback_paths)
except OSError:
# Final safety net attempt a tmp directory unique to this process.
tmp_candidate = os.path.join("/tmp", f"abogen-cache-{os.getpid()}")
logger.warning("Falling back to temp cache directory %s", tmp_candidate)
return ensure_directory(tmp_candidate)
def get_user_cache_path(folder=None): def get_user_cache_path(folder=None):
+7 -2
View File
@@ -12,12 +12,17 @@ services:
- "${ABOGEN_PORT:-8808}:8808" - "${ABOGEN_PORT:-8808}:8808"
volumes: volumes:
- ${ABOGEN_DATA:-./data}:/data - ${ABOGEN_DATA:-./data}:/data
- ${ABOGEN_SETTINGS_DIR:-./config}:/config
- ${ABOGEN_OUTPUT_DIR:-./storage/output}:/data/outputs
- ${ABOGEN_TEMP_DIR:-./storage/tmp}:/data/cache
environment: environment:
ABOGEN_HOST: 0.0.0.0 ABOGEN_HOST: 0.0.0.0
ABOGEN_PORT: 8808 ABOGEN_PORT: 8808
ABOGEN_SETTINGS_DIR: "/config"
ABOGEN_UPLOAD_ROOT: /data/uploads ABOGEN_UPLOAD_ROOT: /data/uploads
ABOGEN_OUTPUT_ROOT: /data/outputs ABOGEN_OUTPUT_DIR: "/data/outputs"
ABOGEN_TEMP_DIR: "${ABOGEN_TEMP_DIR:-/data/cache}" ABOGEN_OUTPUT_ROOT: "/data/outputs"
ABOGEN_TEMP_DIR: "/data/cache"
# --- GPU support ----------------------------------------------------- # --- GPU support -----------------------------------------------------
# These settings assume the NVIDIA Container Toolkit is installed. # These settings assume the NVIDIA Container Toolkit is installed.
# Leave them in place for GPU acceleration; comment out the entire block # Leave them in place for GPU acceleration; comment out the entire block