diff --git a/Dockerfile b/Dockerfile index 6f37ff6..c8279c2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,76 +3,78 @@ FROM --platform=$BUILDPLATFORM node:20-alpine AS frontend-builder WORKDIR /app/frontend -# Copy package files and install dependencies COPY frontend/package*.json ./ RUN npm ci -# Copy frontend source and build COPY frontend/ ./ RUN npm run build + # Stage 2: Python backend with built frontend FROM --platform=$TARGETPLATFORM python:3.11-slim WORKDIR /app -# Install system dependencies +# System dependencies RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc \ - gosu \ - && rm -rf /var/lib/apt/lists/* + gcc \ + gosu \ + passwd \ + && rm -rf /var/lib/apt/lists/* -# Copy and install Python dependencies +# Python dependencies COPY server/requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt -# Copy server code +# App code COPY server/ ./ -# Copy built frontend from stage 1 +# Frontend dist -> static folder COPY --from=frontend-builder /app/frontend/dist ./static -# Create data directories for SQLite database and user config +# Data dirs RUN mkdir -p /app/data /config /media -# Environment variables -ENV FLASK_APP=app.py -ENV FLASK_ENV=production -ENV PYTHONUNBUFFERED=1 -ENV PUID= -ENV PGID= -ENV GUNICORN_WORKERS=1 -ENV GUNICORN_THREADS=2 -ENV GUNICORN_TIMEOUT=120 +# Default env — but PUID/PGID now OPTIONAL +ENV FLASK_APP=app.py \ + FLASK_ENV=production \ + PYTHONUNBUFFERED=1 \ + PORT=5000 \ + GUNICORN_WORKERS=1 \ + GUNICORN_THREADS=2 \ + GUNICORN_TIMEOUT=120 -# Expose port EXPOSE 5000 -# Entrypoint to handle optional PUID/PGID and low-memory defaults + +# ENTRYPOINT — now *does NOT require* PUID/PGID +# Safely strips quotes; only uses them if they exist and are valid numbers RUN printf '%s\n' \ '#!/bin/sh' \ 'set -e' \ '' \ - 'echo \"Sublogue - Docker image starting\"' \ - 'echo \"Sublogue - Initializing container\"' \ - 'if [ -n \"$PUID\" ] && [ -n \"$PGID\" ]; then' \ - ' echo \"Sublogue - Running with PUID=$PUID PGID=$PGID\"' \ - ' if ! getent group \"$PGID\" >/dev/null 2>&1; then' \ - ' groupadd -g \"$PGID\" appgroup' \ - ' fi' \ - ' if ! id -u \"$PUID\" >/dev/null 2>&1; then' \ - ' useradd -u \"$PUID\" -g \"$PGID\" -m appuser' \ - ' fi' \ - ' chown -R \"$PUID\":\"$PGID\" /config /app/data /media 2>/dev/null || true' \ - ' exec gosu \"$PUID\":\"$PGID\" \"$@\"' \ - 'fi' \ - 'echo \"Sublogue - Running as root (PUID/PGID not set)\"' \ + 'echo "Sublogue - Docker image starting"' \ + 'echo "Sublogue - Initializing container"' \ '' \ - 'exec \"$@\"' \ + '# Clean quotes if Komodo/Portainer injects them' \ + 'PUID_CLEAN=$(echo "$PUID" | tr -d "\"")' \ + 'PGID_CLEAN=$(echo "$PGID" | tr -d "\"")' \ + '' \ + '# Only run UID/GID logic if BOTH are valid integers' \ + 'if [ -n "$PUID_CLEAN" ] && [ -n "$PGID_CLEAN" ] && [ "$PUID_CLEAN" -eq "$PUID_CLEAN" ] 2>/dev/null && [ "$PGID_CLEAN" -eq "$PGID_CLEAN" ] 2>/dev/null; then' \ + ' echo "Sublogue - Running with PUID=$PUID_CLEAN PGID=$PGID_CLEAN"' \ + ' getent group "$PGID_CLEAN" >/dev/null 2>&1 || groupadd -g "$PGID_CLEAN" appgroup' \ + ' id -u "$PUID_CLEAN" >/dev/null 2>&1 || useradd -u "$PUID_CLEAN" -g "$PGID_CLEAN" -m appuser' \ + ' chown -R "$PUID_CLEAN:$PGID_CLEAN" /config /app/data /media || true' \ + ' exec gosu "$PUID_CLEAN:$PGID_CLEAN" "$@"' \ + 'else' \ + ' echo "Sublogue - Running as root (no valid PUID/PGID provided)"' \ + 'fi' \ + '' \ + 'exec "$@"' \ > /usr/local/bin/entrypoint.sh \ && chmod +x /usr/local/bin/entrypoint.sh ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] -# Run with Gunicorn (tuned for low-memory hosts by default) -CMD ["sh", "-c", "gunicorn --bind 0.0.0.0:5000 --workers ${GUNICORN_WORKERS} --threads ${GUNICORN_THREADS} --timeout ${GUNICORN_TIMEOUT} app:app"] +CMD ["sh", "-c", "echo \"Sublogue - Starting web server on port ${PORT}\"; gunicorn --bind 0.0.0.0:${PORT} --workers ${GUNICORN_WORKERS} --threads ${GUNICORN_THREADS} --timeout ${GUNICORN_TIMEOUT} app:app"] diff --git a/frontend/src/assets/sublogue_v2.png b/frontend/src/assets/sublogue_v2.png new file mode 100644 index 0000000..4790c12 Binary files /dev/null and b/frontend/src/assets/sublogue_v2.png differ diff --git a/frontend/src/components/AppSidebar.svelte b/frontend/src/components/AppSidebar.svelte index 952c0d2..521f17a 100644 --- a/frontend/src/components/AppSidebar.svelte +++ b/frontend/src/components/AppSidebar.svelte @@ -15,7 +15,7 @@ History, } from "lucide-svelte"; import ThemeSelector from "./ThemeSelector.svelte"; - import sublogueLogo from "../assets/logo.png"; + import sublogueLogo from "../assets/sublogue_v2.png"; export let currentView = "scanner"; export let onNavigate; @@ -36,21 +36,26 @@