app.py: - Remove 'raw' field from export dict entries (only comment/blank kinds need raw; export entries are always reconstructed from path/rest/enabled when writing back) - Remove extra blank line shares.js: - Remove unused pathJson variable in SMB row (was only needed for the quota button, which was removed) docker-compose.yml: - Deleted entirely: was missing templates/ and static/ mounts so the Flask app couldn't serve pages; SYS_ADMIN cap_add was only needed for quotas; deployment is systemd, not Docker README.md: - Remove quota package from apt install command - Remove quota setup section (feature removed) - Remove docker-compose from Dev section CLAUDE.md / PLANNING.md: - Remove docker-compose.yml references and quotas.js from file tree .gitignore: - Remove redundant micronas.env entry (already covered by *.env) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2.5 KiB
2.5 KiB
CLAUDE.md
Project context for Claude Code. See PLANNING.md for the full roadmap.
What this is
A lightweight web GUI to manage file shares on a single home server (Proxmox LXC/VM) — a minimal NAS control panel. Manages SMB shares, NFS exports, quotas, and system users by editing host config files and reloading daemons. Home/LAN use only.
File layout
app.py— Flask backend: all API routes, auth, business logic.templates/index.html— main SPA shell (Jinja2); no inline JS or CSS.templates/login.html— login form.static/css/app.css— custom dark theme (GitHub-palette CSS variables).static/js/utils.js— shared helpers:esc(),showToast(),apiFetch().static/js/dashboard.js— dashboard data loading.static/js/shares.js— SMB/NFS CRUD (create, edit, delete, toggle).static/js/quotas.js— quota modal logic.static/js/users.js— user CRUD + password modal.static/js/main.js— page init and 30 s auto-refresh.micronas.service— systemd unit (gunicorn, reads/etc/micronas.env).
How it runs
Directly on the LXC/VM as a systemd service, Flask behind gunicorn.
Not in Docker for production — the app manipulates host services
(smbd, nfsd, /etc/exports, exportfs, setquota).
Auth uses Flask sessions with a secret key derived from MICRONAS_PASS.
Credentials come from /etc/micronas.env (MICRONAS_USER, MICRONAS_PASS).
Conventions & constraints
- Keep it simple. No database, no auth framework, dependency-light.
Config files (
/etc/samba/smb.conf,/etc/exports) are the source of truth. - Security basics are non-negotiable even for home use:
- Never use
subprocess.run(..., shell=True)with user input. Use argument lists. - Validate all input: names
^[A-Za-z0-9_-]+$; paths must resolve under/srv. - All routes require a valid session (
require_authdecorator).
- Never use
- Config edits are safe:
_parse_smb_conf()/_write_smb_conf()and_parse_exports()/_write_exports()parse into blocks and rewrite the whole file — never blindly append for edit/delete/toggle operations. - LAN-only. Do not add internet-facing features.
Out of scope
Backups (Proxmox Backup Server), multi-user roles, databases, internet exposure, multi-host management.
Working agreement
- Work in the phases defined in
PLANNING.md; pause after each phase for the user to test. - Explain changes briefly. Don't add heavy dependencies without asking.