Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
225 commits
Select commit Hold shift + click to select a range
e0ceb68
fix: Resolve TypeScript compilation errors
Serph91P Jan 24, 2026
6e14dcd
fix(security): address critical security vulnerabilities
Serph91P Jan 24, 2026
3aee2e1
feat: Add comprehensive testing infrastructure and backup engine impr…
Serph91P Jan 24, 2026
a6bdd0a
fix: Correct imports in test_database.py and test_scheduler.py
Serph91P Jan 24, 2026
f7886fd
fix: CI workflow fixes
Serph91P Jan 24, 2026
c3ad6d4
fix: exclude test files from production TypeScript build
Serph91P Jan 24, 2026
7278666
fix: nginx proxy to localhost for single-container deployment
Serph91P Jan 24, 2026
0775fec
fix: resolve all linting issues
Serph91P Jan 25, 2026
17e63a2
fix: format all Python code with black and isort
Serph91P Jan 25, 2026
727fcde
fix: update test fixtures to properly mock database
Serph91P Jan 25, 2026
2a67711
fix(tests): Fix 45 failing tests to match actual implementation
Serph91P Jan 25, 2026
5c88e8e
fix(frontend): Add ESLint flat config for ESLint 9.x
Serph91P Jan 25, 2026
34c824f
fix(ci): Use vitest test:coverage script instead of --watchAll flag
Serph91P Jan 25, 2026
2497184
fix(frontend): improve ESLint config ignore patterns for CI
Serph91P Jan 25, 2026
fac4543
chore(deps): update frontend dependencies to latest versions
Serph91P Jan 26, 2026
af10e75
Translate frontend from German to English
Serph91P Jan 26, 2026
b8e6038
Simplify configuration - remove unnecessary environment variables
Serph91P Jan 26, 2026
b4f414a
Fix: remove unused settings import in main.py
Serph91P Jan 26, 2026
1a3959c
Fix: format backup_engine.py with black
Serph91P Jan 26, 2026
e3eb708
Fix: refactor websocket test to avoid this-alias lint error
Serph91P Jan 26, 2026
e2a7e44
Fix: use docker compose v2 syntax in CI workflow
Serph91P Jan 26, 2026
d27d633
Fix: simplify docker-compose to use single container with multi-stage…
Serph91P Jan 26, 2026
6bca3cb
Fix: docker-compose uses image from GHCR, CI builds from Dockerfile
Serph91P Jan 26, 2026
49c601c
Fix: update header comments in .env.example for clarity
Serph91P Jan 26, 2026
26f236b
Fix: remove nginx default site that overrides our config
Serph91P Jan 26, 2026
84815c6
Fix: update TailwindCSS 4.x syntax - use @import and @theme for custo…
Serph91P Jan 26, 2026
51ca39c
Fix: auto-detect Docker socket GID in entrypoint script
Serph91P Jan 26, 2026
10bae42
Fix storage API route prefix
Serph91P Jan 27, 2026
9f62548
Improve remote storage test diagnostics
Serph91P Jan 27, 2026
ea15a5a
Run release after successful tests
Serph91P Jan 27, 2026
ae38941
feat: Add complete authentication system and backup encryption
Serph91P Jan 27, 2026
f6f4fed
fix: Linting and test fixes for CI pipeline
Serph91P Jan 27, 2026
4e1ee99
ci: Fix release workflow to trigger reliably on push
Serph91P Jan 27, 2026
bd4de72
fix: Ensure password truncation to 72 bytes in hash and verify functions
Serph91P Jan 27, 2026
4624f88
fix: Refactor password hashing and verification for consistency with …
Serph91P Jan 27, 2026
5de74f0
fix: Update password hashing and verification to handle byte truncati…
Serph91P Jan 27, 2026
aa74c46
fix: Replace passlib with bcrypt for password hashing
Serph91P Jan 27, 2026
a1a1eae
style: Fix import formatting in auth.py
Serph91P Jan 27, 2026
23102b5
feat: Add encryption setup to setup wizard
Serph91P Jan 27, 2026
de46bc5
fix: Improve encryption UI
Serph91P Jan 27, 2026
0426db1
chore(deps): Bump eslint-plugin-react-refresh
dependabot[bot] Feb 2, 2026
3b7c9c3
chore(deps): Bump date-fns from 3.6.0 to 4.1.0 in /frontend
dependabot[bot] Feb 2, 2026
d2f6873
Merge pull request #16 from Serph91P/dependabot/npm_and_yarn/frontend…
Serph91P Feb 2, 2026
60ab6b5
Merge branch 'develop' into dependabot/npm_and_yarn/frontend/npm-mino…
Serph91P Feb 2, 2026
2f6a5bb
Merge pull request #15 from Serph91P/dependabot/npm_and_yarn/frontend…
Serph91P Feb 2, 2026
26cb80c
Add schedule editor to Targets page and improve logging
Serph91P Feb 2, 2026
5c19000
Add editable Komodo settings in frontend
Serph91P Feb 2, 2026
7ebd7e8
Remove ARM64 build from CI workflow
Serph91P Feb 2, 2026
cac4f87
Fix linting errors in backend and frontend
Serph91P Feb 2, 2026
1019ce8
Fix TypeScript type error: use undefined instead of null for schedule…
Serph91P Feb 2, 2026
2d457c8
Add link from Schedules page to Targets page for schedule configuration
Serph91P Feb 2, 2026
dce585b
feat: Add Setup-Wizard for backup targets and redesign schedules
Serph91P Feb 4, 2026
e7de3b7
fix: Update Dashboard to use new ScheduleEntity interface
Serph91P Feb 4, 2026
383adfd
feat: Add retention policy per target support
Serph91P Feb 4, 2026
6fb29cd
docs: Update FEATURES_TODO - Retention Policy pro Target complete
Serph91P Feb 4, 2026
09fb24b
fix: Add database migration for encrypted columns in backups table
Serph91P Feb 4, 2026
0d04ec5
style: Format database.py with ruff
Serph91P Feb 4, 2026
67eac31
docs: Add mandatory pre-commit linting checklist to copilot instructions
Serph91P Feb 4, 2026
7b0d5b2
fix: Fix flake8 line-too-long and unused import errors
Serph91P Feb 4, 2026
06a7f85
fix: Fix isort import ordering in targets.py
Serph91P Feb 4, 2026
e227034
fix: Add schedule = None to mock targets in scheduler tests
Serph91P Feb 5, 2026
a06f3d5
fix: Add database migrations for schedule_id, retention_policy_id, ke…
Serph91P Feb 5, 2026
08adbca
fix: Update frontend tests for new ScheduleEntity model
Serph91P Feb 5, 2026
8f81a27
feat: Implement stack backup support
Serph91P Feb 5, 2026
7b4c752
refactor(ui): restructure to backup-focused interface with unified Ba…
Serph91P Feb 5, 2026
51b2d2f
fix: run container as root to access Docker volumes
Serph91P Feb 5, 2026
d1a7351
fix: remove unused HttpResponse import in Backups.test.tsx
Serph91P Feb 5, 2026
91396db
fix: run backend as root for Docker socket access
Serph91P Feb 5, 2026
3008593
docs: update FEATURES_TODO.md - mark Stack-Backup and UI restructurin…
Serph91P Feb 5, 2026
29a448b
feat: Add automatic stack dependency detection
Serph91P Feb 5, 2026
c7ba067
feat: selective volume backup, path filtering, backups page redesign …
Serph91P Feb 6, 2026
d65b853
fix: linting issues - remove trailing blank line and shorten long line
Serph91P Feb 6, 2026
cc53dc1
fix: apply black formatting to backups.py
Serph91P Feb 6, 2026
adee32c
fix: update Backups.test.tsx for new page design
Serph91P Feb 6, 2026
de6ba3b
fix: add migration for selected_volumes, include_paths, exclude_paths…
Serph91P Feb 8, 2026
89e1e95
refactor: remove Targets page and improve encrypted backup UX
Serph91P Feb 8, 2026
bc91195
fix: add cascade delete to Backup relationship in BackupTarget model
Serph91P Feb 10, 2026
99acef5
fix: enhance delete_target endpoint to remove associated backup files
Serph91P Feb 10, 2026
fa8dd23
feat(wizard): add searchable, sorted target selection lists
Serph91P Feb 10, 2026
e3b3076
chore(deps): update frontend dependencies
Serph91P Feb 10, 2026
01cb6c5
feat(wizard): improve schedule selection UX
Serph91P Feb 10, 2026
bf34d22
feat(wizard): improve retention policy selection UX
Serph91P Feb 10, 2026
9543dcd
feat: enable browsing encrypted backup contents with private key
Serph91P Feb 10, 2026
1400b71
feat: add backup target editing and remote storage browser
Serph91P Feb 10, 2026
0d55c80
feat: add edit functionality for backup targets with dialog
Serph91P Feb 11, 2026
768aace
feat: implement BackupEditDialog component for editing backup configu…
Serph91P Feb 11, 2026
8dee243
feat: implement UX design plan Phase 1 & 2
Serph91P Feb 22, 2026
20d93c7
Merge pull request #24 from Serph91P/feature/ux-improvements-phase1-2
Serph91P Feb 22, 2026
cdede86
feat: Phase 3 - Consistency & Polish (9 UX improvements)
Serph91P Feb 22, 2026
1c19dd0
Merge pull request #25 from Serph91P/feature/ux-improvements-phase3
Serph91P Feb 22, 2026
1c1c10b
feat: implement Phase 4 UX improvements
Serph91P Feb 22, 2026
1718659
Merge pull request #26 from Serph91P/feature/ux-improvements-phase4
Serph91P Feb 22, 2026
3d4bebb
feat(ux): Phase 5 — UX polish batch (15 items)
Serph91P Feb 22, 2026
206cacb
Merge pull request #27 from Serph91P/feature/ux-improvements-phase5
Serph91P Feb 22, 2026
0e84d2d
feat(ux): Phase 6 — Final polish & stack improvements (8 items)
Serph91P Feb 22, 2026
6d315de
Merge pull request #28 from Serph91P/feature/ux-improvements-phase6
Serph91P Feb 22, 2026
5b8e1ea
feat(ux): Phase 7 - Components, Volumes & Global improvements
Serph91P Feb 22, 2026
aace7a5
Merge pull request #29 from Serph91P/feature/ux-improvements-phase7
Serph91P Feb 22, 2026
9d939a8
feat(ux): Phase 8 - Notification Center, Drawer & Reorder
Serph91P Feb 22, 2026
395b038
feat(security): OWASP security hardening
Serph91P Feb 24, 2026
2726e10
Delete plan/refactor-security-hardening-1.md
Serph91P Feb 24, 2026
e34f5cc
Merge pull request #30 from Serph91P/feature/ux-improvements-phase8
Serph91P Feb 24, 2026
a5bb720
fix: harden backup endpoints against path traversal, symlink bypass, …
Serph91P Feb 24, 2026
469a01d
fix: add SSRF validation and encrypt Komodo API key at rest
Serph91P Feb 24, 2026
4244b84
fix: add session invalidation on password change and login timing fix
Serph91P Feb 24, 2026
4366499
fix: add hook command timeout and use realpath in tar extraction
Serph91P Feb 24, 2026
bf47b0c
fix: pass DEK via stdin to openssl instead of command-line argument
Serph91P Feb 24, 2026
b742669
feat: add security config settings for hook timeout, SSH keys, and do…
Serph91P Feb 24, 2026
eed5ed3
fix: validate SSH key paths against allowed directory allowlist
Serph91P Feb 24, 2026
e453c61
fix: add Field constraints to retention policy request models
Serph91P Feb 24, 2026
f5d9498
fix: move confirm_data_loss from query param to request body
Serph91P Feb 24, 2026
b9a0396
fix: add authentication token to WebSocket connection
Serph91P Feb 24, 2026
991ba90
fix: harden nginx security headers and CSP policy
Serph91P Feb 24, 2026
63f5995
fix: add connection and operation timeouts to all storage backends
Serph91P Feb 24, 2026
902d8b0
fix: enforce key file permissions and conditionally disable API docs
Serph91P Feb 24, 2026
4ea5bab
chore: add plan/ directory to .gitignore
Serph91P Feb 24, 2026
6b84016
Merge pull request #31 from Serph91P/feature/security-hardening
Serph91P Feb 24, 2026
01b9978
chore: configure Dependabot to target develop branch
Serph91P Feb 24, 2026
96c9cb8
feat(security): apply security hardening phase 2
Serph91P Feb 24, 2026
681e260
Merge pull request #32 from Serph91P/feature/security-hardening-2
Serph91P Feb 24, 2026
5ff6176
fix: improve logging format and error handling in backup API
Serph91P Feb 24, 2026
48eedae
fix: enhance error logging for key regeneration failure
Serph91P Feb 24, 2026
eeba01d
fix: mask sensitive information in system info response
Serph91P Feb 24, 2026
106fa9f
feat(docs): enhance deployment instructions with Traefik and Caddy ex…
Serph91P Feb 24, 2026
62473e2
chore: remove obsolete Copilot setup workflow
Serph91P Feb 24, 2026
018ca98
feat: implement graceful shutdown for backup engine
Serph91P Feb 24, 2026
cec104d
fix: set COOKIE_SECURE to False and add logging and shutdown settings
Serph91P Feb 24, 2026
8c6e1d2
feat: enhance logging configuration and add structured JSON logging f…
Serph91P Feb 24, 2026
eb619f1
feat: update rate limiter configuration to improve readability
Serph91P Feb 24, 2026
bae2102
feat: enhance backup API by adding request parameter handling and rat…
Serph91P Feb 24, 2026
64376bd
feat: add request parameter to container start/stop endpoints and enf…
Serph91P Feb 24, 2026
a633788
fix: update error message in path traversal test to reflect allowed d…
Serph91P Feb 24, 2026
cb8c2f8
refactor: improve Docker socket group setup in entrypoint script
Serph91P Feb 24, 2026
9013f50
fix: add missing start_interval configuration to healthcheck in docke…
Serph91P Feb 24, 2026
a465153
feat: add comprehensive security scanning workflow including SAST, DA…
Serph91P Feb 24, 2026
40e7221
fix: remove unnecessary '|| true' from test and lint commands for acc…
Serph91P Feb 24, 2026
ce0a392
refactor: optimize auto-detection logic and improve performance with …
Serph91P Feb 24, 2026
64e7765
refactor: simplify state management in StepRetention component by usi…
Serph91P Feb 24, 2026
a39a9a0
refactor: streamline schedule selection logic by using useRef for aut…
Serph91P Feb 24, 2026
8ebb4d8
refactor: replace useState with useRef for auto-selection state manag…
Serph91P Feb 24, 2026
77dc107
refactor: optimize backup retrieval logic with useCallback for improv…
Serph91P Feb 24, 2026
c638613
refactor: update dashboard test assertions for improved clarity and a…
Serph91P Feb 24, 2026
3c4567c
fix: handle optional event parameter in WebSocket disconnect logic
Serph91P Feb 24, 2026
6ccdf36
fix: ensure onclose event handler receives CloseEvent in MockWebSocket
Serph91P Feb 24, 2026
5f713e9
Merge pull request #33 from Serph91P/feature/security-hardening-2
Serph91P Feb 24, 2026
c594224
fix: re-add /ws to PUBLIC_PATHS for WebSocket connectivity
Serph91P Feb 24, 2026
d2c9071
fix(komodo): add API secret support for proper authentication
Serph91P Feb 24, 2026
200fa43
fix(encryption): fix backup decryption failure after security hardening
Serph91P Feb 24, 2026
eb6b1f5
fix: resolve 4 bugs from bugfixing round
Serph91P Feb 24, 2026
c56ce40
Merge pull request #34 from Serph91P/fix/komodo-api-secret
Serph91P Feb 24, 2026
94748cf
Merge pull request #35 from Serph91P/fix/backup-decryption
Serph91P Feb 24, 2026
305b841
Merge pull request #36 from Serph91P/fix/bugfixing-round
Serph91P Feb 24, 2026
2e7d91a
fix: WebSocket auth reads session cookie directly
Serph91P Feb 24, 2026
a660365
Merge pull request #37 from Serph91P/fix/websocket-auth
Serph91P Feb 24, 2026
595eab4
security: comprehensive hardening across backend, nginx, and infra
Serph91P Feb 24, 2026
9564a5c
docs: complete .env.example and docker-compose.yml with all env vars
Serph91P Feb 24, 2026
c452809
feat: add TRUSTED_PROXIES for correct client IP behind reverse proxy
Serph91P Feb 24, 2026
45abfae
Merge pull request #38 from Serph91P/security/hardening
Serph91P Feb 24, 2026
5ae3eca
fix: sanitize target names in filesystem paths and improve error mess…
Serph91P Feb 26, 2026
dfc3078
Merge pull request #39 from Serph91P/fix/backup-path-sanitization
Serph91P Feb 26, 2026
7eed3df
feat: auto-sync backups to remote storage & run tar as root for permi…
Serph91P Feb 27, 2026
738efb0
Merge pull request #40 from Serph91P/feature/auto-sync-and-root-tar
Serph91P Feb 27, 2026
f9a847a
feat: auto-sync backups to remote storage & run tar as root for permi…
Serph91P Feb 27, 2026
58cdbb6
Merge branch 'develop' into feature/auto-sync-and-root-tar
Serph91P Feb 28, 2026
8c6a701
Merge pull request #41 from Serph91P/feature/auto-sync-and-root-tar
Serph91P Feb 28, 2026
bd46e5a
feat: add Delete All Backups button per target
Serph91P Feb 28, 2026
674242d
Merge pull request #42 from Serph91P/feature/bulk-delete-backups
Serph91P Feb 28, 2026
45d0734
fix: sudo availability check fails due to sudoers glob mismatch
Serph91P Feb 28, 2026
c1c8ee7
Merge pull request #43 from Serph91P/fix/sudo-availability-check
Serph91P Feb 28, 2026
7b91ea1
fix: implement WebDAV PROPFIND XML parsing for list_files
Serph91P Feb 28, 2026
69d4522
Merge pull request #44 from Serph91P/fix/webdav-list-files
Serph91P Feb 28, 2026
cf5259e
feat: backup queue, sync fix, Komodo rewrite, Run All
Serph91P Feb 28, 2026
bc4615c
fix: sudoers rule needs wildcard for tar_worker arguments
Serph91P Feb 28, 2026
f00434c
Merge pull request #45 from Serph91P/feature/queue-komodo-sync-fixes
Serph91P Feb 28, 2026
ed0a67c
fix: storage browser date/size, tar_worker host paths, sequential tri…
Serph91P Feb 28, 2026
0208f9a
Merge pull request #46 from Serph91P/feature/queue-komodo-sync-fixes
Serph91P Mar 1, 2026
d6da752
chore(deps): update frontend dependencies
Serph91P Mar 2, 2026
f2c079e
feat: backup sync tracking, remote delete on local delete, upload sta…
Serph91P Mar 2, 2026
19b2c91
feat: remote browse fallback for backups not available locally
Serph91P Mar 2, 2026
5db06c1
Merge pull request #51 from Serph91P/chore/update-frontend-deps
Serph91P Mar 2, 2026
a5cba9d
Merge pull request #52 from Serph91P/feature/backup-sync-tracking
Serph91P Mar 2, 2026
741e2dd
Merge pull request #53 from Serph91P/feature/backup-remote-browse
Serph91P Mar 2, 2026
0c9e9b3
feat: sync encryption key to remote storage & selective delete scope
Serph91P Mar 2, 2026
5931927
Merge pull request #54 from Serph91P/feature/encryption-key-sync-and-…
Serph91P Mar 2, 2026
759c8ff
fix: remote sync retry, streaming uploads, and datetime comparison bugs
Serph91P Mar 3, 2026
df087e3
Merge pull request #55 from Serph91P/fix/remote-sync-retry-and-dateti…
Serph91P Mar 3, 2026
7b80511
Fix/remote sync retry and datetime bugs (#56)
Serph91P Mar 3, 2026
557388f
Fix/remote sync retry and datetime bugs (#57)
Serph91P Mar 3, 2026
d3a7854
Fix/remote sync retry and datetime bugs (#58)
Serph91P Mar 3, 2026
2b4361b
feat: add backup job logging (#59)
Serph91P Mar 3, 2026
7e4e0fc
feat: add Restore Wizard with destination selection and encryption su…
Serph91P Mar 3, 2026
6f7020f
feat: add delete_local_after_sync column to backup_targets table (#61)
Serph91P Mar 3, 2026
915f99b
feat: add delete_local_after_sync column to backup_targets table (#62)
Serph91P Mar 3, 2026
33f1fa6
fix: add missing delete_local_after_sync to TargetResponse builder (#63)
Serph91P Mar 3, 2026
b4b0e7b
fix: WebDAV download AttributeError on UPLOAD_CHUNK_SIZE (#64)
Serph91P Mar 3, 2026
7fabd8b
fix: validate .key file content before age decryption and fix test wa…
Serph91P Mar 3, 2026
b308de0
fix: prevent .key sidecar loss during remote sync and harden key file…
Serph91P Mar 4, 2026
18ad84d
fix: add ORM cascade delete for BackupLog and BackupStorageSync (#67)
Serph91P Mar 4, 2026
0eae4ab
Fix/backup delete cascade (#68)
Serph91P Mar 4, 2026
fcce703
fix: widen StorageBrowser panel from max-w-xl to max-w-3xl (#69)
Serph91P Mar 4, 2026
986ad46
feat: fix delete_local_after_sync support and improve remote browse U…
Serph91P Mar 4, 2026
64999cc
fix: derive tar mode from original filename when browsing encrypted b…
Serph91P Mar 10, 2026
705d560
chore(deps): Bump docker/build-push-action from 6 to 7 (#74)
dependabot[bot] Mar 10, 2026
5db8f0b
chore(deps): Bump docker/login-action from 3 to 4 (#73)
dependabot[bot] Mar 10, 2026
78280b3
chore(deps): Bump docker/metadata-action from 5 to 6 (#72)
dependabot[bot] Mar 10, 2026
9ecd3ec
chore(deps): Bump the npm-minor group in /frontend with 2 updates (#75)
dependabot[bot] Mar 10, 2026
2afd08b
Fix/hadolint warnings (#79)
Serph91P Mar 10, 2026
5c88dc9
chore: update all dependencies to latest versions
Serph91P Mar 10, 2026
599bb73
chore(deps): Bump actions/setup-node from 4 to 6 (#81)
dependabot[bot] Mar 13, 2026
cc96665
chore(deps): Bump github/codeql-action from 3 to 4 (#80)
dependabot[bot] Mar 13, 2026
5a24762
chore(deps): Bump aquasecurity/trivy-action from 0.28.0 to 0.35.0 (#82)
dependabot[bot] Mar 13, 2026
d4a0cce
ci: unify versioning with conventional commits auto-bump (#88)
Serph91P Mar 15, 2026
93647d2
chore(deps): Bump the npm-minor group across 1 directory with 16 upda…
dependabot[bot] Apr 13, 2026
1b1b553
chore(deps): Bump actions/github-script from 7 to 8 (#92)
dependabot[bot] Apr 13, 2026
dccf897
chore(deps): Bump actions/upload-artifact from 4 to 7 (#91)
dependabot[bot] Apr 13, 2026
bce5447
chore(deps): Bump docker/setup-buildx-action from 3 to 4 (#90)
dependabot[bot] Apr 13, 2026
3d59154
chore(deps): Bump @eslint/js from 9.39.3 to 10.0.1 in /frontend (#84)
dependabot[bot] Apr 13, 2026
74d7b28
chore(deps): Bump @vitejs/plugin-react from 5.1.4 to 6.0.0 in /fronte…
dependabot[bot] Apr 13, 2026
9eaf7f4
fix: derive tar mode from original filename when browsing encrypted b…
Serph91P Apr 13, 2026
115c7fc
chore(deps): Bump vite from 7.3.1 to 8.0.0 in /frontend (#85)
dependabot[bot] Apr 13, 2026
cdfdb5c
fix: resolve merge conflicts and pin apt-get package versions in Dock…
Copilot Apr 13, 2026
502ea7d
fix(docker): merge main into develop, pin apt-get package versions
Copilot Apr 13, 2026
258713b
merge: incorporate main branch changes into develop
Copilot Apr 13, 2026
cbb4929
fix(docker): add trailing newline to Dockerfile
Copilot Apr 13, 2026
457f3b0
fix(docker): remove stale apt-get version pins that broke CI builds
Copilot Apr 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 74 additions & 1 deletion .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,4 +103,77 @@ When implementing new features, consider:
2. Resource usage and performance implications
3. User experience and workflow efficiency
4. Error scenarios and recovery procedures
5. Documentation and help text requirements
5. Documentation and help text requirements

## Commit Message Convention

This project uses **Conventional Commits** for automatic versioning and changelog generation.
Every commit message MUST follow this format:

```
<type>(<scope>): <description>

[optional body]

[optional footer(s)]
```

### Types

| Type | Purpose | Version Impact |
|------|---------|----------------|
| `feat` | New feature or capability | **Minor** bump (0.X.0) |
| `fix` | Bug fix | **Patch** bump (0.0.X) |
| `docs` | Documentation only | Patch bump |
| `style` | Formatting, whitespace, no code change | Patch bump |
| `refactor` | Code restructuring, no behavior change | Patch bump |
| `perf` | Performance improvement | Patch bump |
| `test` | Adding or updating tests | Patch bump |
| `chore` | Build, tooling, dependencies | Patch bump |
| `ci` | CI/CD pipeline changes | Patch bump |

### Breaking Changes → Major Bump

A breaking change triggers a **Major** version bump (X.0.0). Mark it with either:

- An `!` after the type/scope: `feat!: remove legacy API`
- A `BREAKING CHANGE:` footer in the commit body

### Scopes

- `api` – Backend API routes/endpoints
- `ui` – Frontend components/pages
- `auth` – Authentication/security
- `db` – Database/models/migrations
- `docker` – Docker/deployment
- `backup` – Backup engine/operations
- `storage` – Remote storage (S3, FTP, WebDAV)
- `scheduler` – APScheduler/task scheduling
- `ws` – WebSocket connections

### Rules

- Type and description are **required**
- Scope is optional but encouraged
- Description must be lowercase, imperative mood ("add" not "added" or "adds")
- No period at the end of the description
- Body and footer are optional
- Use `!` or `BREAKING CHANGE:` only for genuinely incompatible changes

### Examples

```
feat(backup): add incremental backup support
fix(ui): correct progress bar not updating
refactor(storage): simplify S3 upload handler
docs: update README with Docker Compose examples
feat!: redesign backup scheduling API
chore(deps): update FastAPI to 0.115
ci: add ARM64 Docker build
perf(db): add index on backup.created_at
```

## Language

- Commit messages in **English**
- Code comments in **English**
119 changes: 92 additions & 27 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:
steps:
- name: Wait for Tests workflow
id: check
uses: actions/github-script@v7
uses: actions/github-script@v8
with:
script: |
// Wait up to 10 minutes for Tests workflow to complete
Expand Down Expand Up @@ -91,33 +91,98 @@ jobs:
- name: Determine version
id: version
run: |
# Get commit count for consistent versioning across branches
COMMIT_COUNT=$(git rev-list --count HEAD)

REF="${{ github.event_name == 'workflow_run' && format('refs/heads/{0}', github.event.workflow_run.head_branch) || github.ref }}"
BRANCH="${{ github.event_name == 'workflow_run' && github.event.workflow_run.head_branch || github.ref_name }}"

if [[ "$REF" == refs/tags/vdev.* ]]; then
# Dev tag (e.g., vdev.0.0.103 -> dev.0.0.103)
VERSION=${GITHUB_REF#refs/tags/v}
IS_PRERELEASE=true
BUILD_ENV=development
elif [[ "$REF" == refs/tags/v* ]]; then
# Stable tag (e.g., v1.2.3 -> 1.2.3)
if [[ "$REF" == refs/tags/v* ]]; then
# Manual tag push - use the tag version directly
VERSION=${GITHUB_REF#refs/tags/v}
IS_PRERELEASE=false
BUILD_ENV=production
elif [[ "$REF" == refs/heads/main ]]; then
# Main branch - stable release with same count as dev
VERSION="0.0.${COMMIT_COUNT}"
IS_PRERELEASE=false
BUILD_ENV=production
if [[ "$VERSION" == *-dev* ]] || [[ "$VERSION" == dev.* ]]; then
IS_PRERELEASE=true
BUILD_ENV=development
else
IS_PRERELEASE=false
BUILD_ENV=production
fi
else
# Develop branch - prerelease with dev prefix
VERSION="dev.0.0.${COMMIT_COUNT}"
IS_PRERELEASE=true
BUILD_ENV=development
# Auto-version: find highest version across ALL tags (dev + stable)
HIGHEST_TAG=""
HIGHEST_MAJOR=0
HIGHEST_MINOR=0
HIGHEST_PATCH=0

for tag in $(git tag -l 'v*'); do
ver="$tag"
ver="${ver#v}"
ver="${ver#dev.}"
ver="${ver%%-dev*}"

M=$(echo "$ver" | cut -d. -f1)
m=$(echo "$ver" | cut -d. -f2)
P=$(echo "$ver" | cut -d. -f3)

[[ "$M" =~ ^[0-9]+$ ]] || continue
[[ "$m" =~ ^[0-9]+$ ]] || continue
[[ "$P" =~ ^[0-9]+$ ]] || continue

if (( M > HIGHEST_MAJOR )) || \
(( M == HIGHEST_MAJOR && m > HIGHEST_MINOR )) || \
(( M == HIGHEST_MAJOR && m == HIGHEST_MINOR && P > HIGHEST_PATCH )); then
HIGHEST_MAJOR=$M
HIGHEST_MINOR=$m
HIGHEST_PATCH=$P
HIGHEST_TAG="$tag"
fi
done

echo "Highest existing version: ${HIGHEST_MAJOR}.${HIGHEST_MINOR}.${HIGHEST_PATCH} (tag: ${HIGHEST_TAG:-none})"

# Analyze commits since last tag for conventional commit bump type
BUMP="patch"
if [ -n "$HIGHEST_TAG" ]; then
COMMITS=$(git log "${HIGHEST_TAG}..HEAD" --pretty=format:"%s%n%b" 2>/dev/null || echo "")
else
COMMITS=$(git log --pretty=format:"%s%n%b" 2>/dev/null || echo "")
fi

if echo "$COMMITS" | grep -qiE '(^[a-z]+!:|BREAKING CHANGE)'; then
BUMP="major"
elif echo "$COMMITS" | grep -qiE '^feat(\(|:)'; then
BUMP="minor"
fi

echo "Bump type: $BUMP"

case "$BUMP" in
major)
NEXT_MAJOR=$((HIGHEST_MAJOR + 1))
NEXT_MINOR=0
NEXT_PATCH=0
;;
minor)
NEXT_MAJOR=$HIGHEST_MAJOR
NEXT_MINOR=$((HIGHEST_MINOR + 1))
NEXT_PATCH=0
;;
patch)
NEXT_MAJOR=$HIGHEST_MAJOR
NEXT_MINOR=$HIGHEST_MINOR
NEXT_PATCH=$((HIGHEST_PATCH + 1))
;;
esac

VERSION="${NEXT_MAJOR}.${NEXT_MINOR}.${NEXT_PATCH}"

if [[ "$REF" == refs/heads/main ]]; then
IS_PRERELEASE=false
BUILD_ENV=production
else
VERSION="${VERSION}-dev"
IS_PRERELEASE=true
BUILD_ENV=development
fi
fi

echo "version=${VERSION}" >> $GITHUB_OUTPUT
echo "is_prerelease=${IS_PRERELEASE}" >> $GITHUB_OUTPUT
echo "build_env=${BUILD_ENV}" >> $GITHUB_OUTPUT
Expand Down Expand Up @@ -158,7 +223,7 @@ jobs:
ref: ${{ github.event.workflow_run.head_sha || github.sha }}

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
uses: docker/setup-buildx-action@v4

- name: Log in to GitHub Container Registry
uses: docker/login-action@v4
Expand Down Expand Up @@ -203,11 +268,11 @@ jobs:
CURRENT_VERSION="${{ needs.prepare.outputs.version }}"
BRANCH="${{ github.ref_name }}"

# Find the last tag based on branch
# Find the last tag for changelog comparison
if [[ "$BRANCH" == "develop" ]]; then
LAST_TAG=$(git tag -l 'vdev.*' --sort=-version:refname | head -n1 || echo "")
LAST_TAG=$(git tag -l --sort=-creatordate | grep -E '(^vdev\.|.*-dev$)' | head -n1 || echo "")
else
LAST_TAG=$(git tag -l 'v*' --sort=-version:refname | grep -v '^vdev\.' | head -n1 || echo "")
LAST_TAG=$(git tag -l 'v*' --sort=-version:refname | grep -vE '(^vdev\.|.*-dev$)' | head -n1 || echo "")
fi

echo "Branch: $BRANCH"
Expand Down Expand Up @@ -304,7 +369,7 @@ jobs:
with:
tag_name: ${{ startsWith(github.ref, 'refs/tags/') && github.ref_name || format('v{0}', needs.prepare.outputs.version) }}
target_commitish: ${{ github.sha }}
name: ${{ needs.prepare.outputs.branch_name == 'develop' && format('Development Build {0}', needs.prepare.outputs.version) || format('Release {0}', needs.prepare.outputs.version) }}
name: ${{ needs.prepare.outputs.is_prerelease == 'true' && format('Development Build {0}', needs.prepare.outputs.version) || format('Release {0}', needs.prepare.outputs.version) }}
body_path: release_notes.md
draft: false
prerelease: ${{ needs.prepare.outputs.is_prerelease }}
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/security-scan.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ jobs:

- name: Upload Bandit results
if: always()
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: bandit-results
path: bandit-results.json
Expand Down Expand Up @@ -88,7 +88,7 @@ jobs:

- name: Upload results
if: always()
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: pip-audit-results
path: pip-audit-results.json
Expand Down Expand Up @@ -128,7 +128,7 @@ jobs:

- name: Upload results
if: always()
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: npm-audit-results
path: frontend/npm-audit-results.json
Expand Down
14 changes: 7 additions & 7 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ jobs:
token: ${{ secrets.CODECOV_TOKEN }}

- name: Archive coverage report
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: backend-coverage-report
path: backend/htmlcov/
Expand All @@ -64,7 +64,7 @@ jobs:
- uses: actions/checkout@v6

- name: Set up Node.js 24
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version: '24'
cache: 'npm'
Expand All @@ -87,7 +87,7 @@ jobs:
token: ${{ secrets.CODECOV_TOKEN }}

- name: Archive coverage report
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: frontend-coverage-report
path: frontend/coverage/
Expand All @@ -104,7 +104,7 @@ jobs:
python-version: '3.14'

- name: Set up Node.js 24
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version: '24'
cache: 'npm'
Expand Down Expand Up @@ -149,7 +149,7 @@ jobs:
- uses: actions/checkout@v6

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
uses: docker/setup-buildx-action@v4

- name: Build Docker image
run: |
Expand Down Expand Up @@ -214,7 +214,7 @@ jobs:
python-version: '3.14'

- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@0.28.0
uses: aquasecurity/trivy-action@0.35.0
with:
scan-type: 'fs'
scan-ref: '.'
Expand All @@ -223,7 +223,7 @@ jobs:
continue-on-error: true

- name: Upload Trivy scan results
uses: github/codeql-action/upload-sarif@v3
uses: github/codeql-action/upload-sarif@v4
if: always()
with:
sarif_file: 'trivy-results.sarif'
Expand Down
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ env/

# IDE
.idea/
.vscode/
.vscode/*
!.vscode/settings.json
*.swp
*.swo
*~
Expand Down
11 changes: 11 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"chat.tools.terminal.autoApprove": {
"npx tsc": true,
"npx eslint": true
},
"github.copilot.chat.commitMessageGeneration.instructions": [
{
"text": "Use Conventional Commits format: <type>(<scope>): <description>. Types: feat (minor bump), fix (patch bump), docs, style, refactor, perf, test, chore, ci. Use ! after type for breaking changes (major bump). Scopes: api, ui, auth, db, docker, backup, storage, scheduler, ws. Description must be lowercase, imperative mood, no period at end. English only."
}
]
}
21 changes: 11 additions & 10 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ WORKDIR /app

# Install build dependencies for Python packages
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential=12.12 \
libffi-dev=3.4.8-2 \
build-essential \
libffi-dev \
&& rm -rf /var/lib/apt/lists/*

# Copy requirements first for caching
Expand Down Expand Up @@ -76,14 +76,14 @@ WORKDIR /app

# Install only runtime dependencies (no build tools)
RUN apt-get update && apt-get install -y --no-install-recommends \
nginx=1.26.3-3+deb13u2 \
supervisor=4.2.5-3 \
curl=8.14.1-2+deb13u2 \
rsync=3.4.1+ds1-5+deb13u1 \
openssh-client=1:10.0p1-7 \
tini=0.19.0-3+b5 \
openssl=3.5.4-1~deb13u2 \
sudo=1.9.16p2-3 \
nginx \
supervisor \
curl \
rsync \
openssh-client \
tini \
openssl \
sudo \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get clean \
&& rm -f /etc/nginx/sites-enabled/default
Expand Down Expand Up @@ -163,3 +163,4 @@ VOLUME ["/app/data", "/backups"]

# Entrypoint handles docker group setup and starts supervisord
ENTRYPOINT ["/entrypoint.sh"]

Loading
Loading