diff --git a/apps/api/Dockerfile b/apps/api/Dockerfile index a48acd7..9e9e51a 100644 --- a/apps/api/Dockerfile +++ b/apps/api/Dockerfile @@ -35,8 +35,8 @@ ENV PATH=/home/appuser/.local/bin:$PATH # Copy application code COPY --chown=appuser:appgroup . . -# Create directories for repo storage -RUN mkdir -p /data/repos && chown -R appuser:appgroup /data/repos +# Create directories for repo and instance storage +RUN mkdir -p /data/repos /data/instances && chown -R appuser:appgroup /data # Copy wait-for-db script COPY wait-for-db.sh /usr/local/bin/wait-for-db.sh diff --git a/apps/api/src/config.py b/apps/api/src/config.py index 0b91a50..6c68615 100644 --- a/apps/api/src/config.py +++ b/apps/api/src/config.py @@ -49,6 +49,9 @@ class Settings(BaseSettings): # Repository storage repo_base_path: str = "/data/repos" + + # Tool instance storage + instance_base_path: str = "/data/instances" model_config = SettingsConfigDict(env_file=".env", extra="ignore", populate_by_name=True) diff --git a/apps/api/src/services/docker.py b/apps/api/src/services/docker.py index 993a9b4..9bde1ed 100644 --- a/apps/api/src/services/docker.py +++ b/apps/api/src/services/docker.py @@ -23,16 +23,19 @@ def render_compose_template(template: str, variables: dict[str, Any]) -> str: return result -def ensure_instance_directory(instance_id: str, base_path: str = "data/instances") -> str: +def ensure_instance_directory(instance_id: str, base_path: str | None = None) -> str: """Create and return the instance directory path. Args: instance_id: Unique instance identifier - base_path: Base directory for all instances + base_path: Base directory for all instances (defaults to Settings.instance_base_path) Returns: Absolute path to instance directory """ + if base_path is None: + from src.config import Settings + base_path = Settings().instance_base_path instance_dir = Path(base_path) / instance_id instance_dir.mkdir(parents=True, exist_ok=True) return str(instance_dir.absolute()) diff --git a/docker-compose.traefik.yml b/docker-compose.traefik.yml index 9348009..00fa1c0 100644 --- a/docker-compose.traefik.yml +++ b/docker-compose.traefik.yml @@ -80,6 +80,7 @@ services: SESSION_SECRET: ${SESSION_SECRET:-change-me-in-production} SESSION_TTL_HOURS: ${SESSION_TTL_HOURS:-24} REPO_BASE_PATH: /data/repos + INSTANCE_BASE_PATH: /data/instances API_DOMAIN: ${API_DOMAIN} WEB_DOMAIN: ${WEB_DOMAIN} AUTHENTIK_DOMAIN: ${AUTHENTIK_DOMAIN} @@ -92,6 +93,7 @@ services: AUTHENTIK_TOKEN_URL: ${AUTHENTIK_TOKEN_URL:-} volumes: - repo_data:/data/repos + - instance_data:/data/instances - avatar_uploads:/app/uploads depends_on: postgres: @@ -114,6 +116,7 @@ volumes: postgres_data: redis_data: repo_data: + instance_data: avatar_uploads: networks: diff --git a/docker-compose.yml b/docker-compose.yml index 6bf265e..561171c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -53,10 +53,12 @@ services: POSTGRES_HOST: postgres POSTGRES_PORT: 5432 REDIS_URL: redis://redis:6379/0 - JWT_SECRET: ${JWT_SECRET:-change-me-in-production} + SESSION_SECRET: ${SESSION_SECRET:-change-me-in-production} REPO_BASE_PATH: /data/repos + INSTANCE_BASE_PATH: /data/instances volumes: - repo_data:/data/repos + - instance_data:/data/instances ports: - "8000:8000" depends_on: @@ -90,6 +92,7 @@ volumes: postgres_data: redis_data: repo_data: + instance_data: networks: backend: