Compare commits

...

4 Commits

Author SHA1 Message Date
Gitea Actions Bot cd3d6fc704 chore: bump frontend version to 1.0.87
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is failing
2025-07-23 10:03:33 +00:00
paul c536fe45ff fix: complete backup page translations and improve UI
Mirror to GitHub / mirror (push) Successful in 36s
Test and Lint / backend-test (push) Successful in 1m32s
continuous-integration/drone/push Build is passing
Test and Lint / frontend-test (push) Successful in 1m56s
Version and Release / version-bump (push) Successful in 40s
Version and Release / trigger-drone (push) Successful in 3s
- Fix '0 files' hardcoded string to use translation
- Fix 'local' destination type to show translated name
- Add missing field placeholders for rsync and S3 configurations
- Add missing backup.history.columns.* translations
- Add missing backup.history.filter.* translations
- Add missing backup.history.details.* translations
- Fix backup destination display to use proper translation key
- Replace TestTube icon with Wifi icon for connection testing
- Add all corresponding German translations
- Ensure Backup Health and Coverage titles use translations

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-23 11:58:31 +02:00
paul 42c8ef1c0e docs: add minimum system requirements section to README
Mirror to GitHub / mirror (push) Successful in 47s
Test and Lint / backend-test (push) Successful in 1m35s
continuous-integration/drone/push Build is passing
Test and Lint / frontend-test (push) Successful in 1m58s
- Add CPU, RAM, and storage requirements
- Include OS and software dependencies
- Add Docker requirements for containerized deployment
- Keep it concise and focused on minimum requirements only

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-23 11:18:27 +02:00
paul d07d742528 fix: use plugins/github-release for Drone CI/CD
Mirror to GitHub / mirror (push) Successful in 50s
Test and Lint / backend-test (push) Successful in 1m46s
continuous-integration/drone/push Build is passing
Test and Lint / frontend-test (push) Successful in 2m12s
- Replace manual curl approach with plugins/github-release
- Fixes shell parsing issues with multiline strings
- Properly passes GITHUB_TOKEN via api_key setting
- Uses YAML multiline string (|) for release notes
- Cleaner and more reliable approach

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-23 10:56:46 +02:00
8 changed files with 142 additions and 30 deletions
+40 -20
View File
@@ -110,29 +110,49 @@ steps:
# -------- NEW: Create GitHub Release -------- # -------- NEW: Create GitHub Release --------
- name: github-release - name: github-release
image: curlimages/curl:latest image: plugins/github-release
when: when:
event: tag event: tag
environment: settings:
GITHUB_TOKEN: api_key:
from_secret: GITHUB_TOKEN from_secret: GITHUB_TOKEN
commands: files: []
- > title: PicPeak ${DRONE_TAG}
echo '{ note: |
"tag_name": "'${DRONE_TAG}'", # PicPeak ${DRONE_TAG}
"target_commitish": "main",
"name": "PicPeak '${DRONE_TAG}'", ## 🐳 Docker Images
"body": "# PicPeak '${DRONE_TAG}'\n\n## 🐳 Docker Images\n\nThis release includes Docker images published to GitHub Container Registry:\n\n```bash\n# Backend\ndocker pull ghcr.io/the-luap/picpeak-backend:'${DRONE_TAG}'\ndocker pull ghcr.io/the-luap/picpeak-backend:latest\n\n# Frontend\ndocker pull ghcr.io/the-luap/picpeak-frontend:'${DRONE_TAG}'\ndocker pull ghcr.io/the-luap/picpeak-frontend:latest\n```\n\n## 📦 What'"'"'s New\n\nSee the [README](https://github.com/the-luap/picpeak#readme) for features and documentation.\n\n## 🚀 Quick Start\n\n```bash\n# Clone and deploy\ngit clone https://github.com/the-luap/picpeak.git\ncd picpeak\n\n# Use the tagged version\ndocker-compose -f docker-compose.prod.yml up -d\n```\n\n---\n\nFor detailed deployment instructions, see the [Deployment Guide](https://github.com/the-luap/picpeak/blob/main/DEPLOYMENT.md).",
"draft": false, This release includes Docker images published to GitHub Container Registry:
"prerelease": false
}' > /tmp/release.json ```bash
- > # Backend
curl -X POST docker pull ghcr.io/the-luap/picpeak-backend:${DRONE_TAG}
-H "Accept: application/vnd.github+json" docker pull ghcr.io/the-luap/picpeak-backend:latest
-H "Authorization: Bearer ${GITHUB_TOKEN}"
-H "X-GitHub-Api-Version: 2022-11-28" # Frontend
https://api.github.com/repos/the-luap/picpeak/releases docker pull ghcr.io/the-luap/picpeak-frontend:${DRONE_TAG}
-d @/tmp/release.json docker pull ghcr.io/the-luap/picpeak-frontend:latest
```
## 📦 What's New
See the [README](https://github.com/the-luap/picpeak#readme) for features and documentation.
## 🚀 Quick Start
```bash
# Clone and deploy
git clone https://github.com/the-luap/picpeak.git
cd picpeak
# Use the tagged version
docker-compose -f docker-compose.prod.yml up -d
```
---
For detailed deployment instructions, see the [Deployment Guide](https://github.com/the-luap/picpeak/blob/main/DEPLOYMENT.md).
trigger: trigger:
event: event:
+14
View File
@@ -94,6 +94,20 @@ Perfect for:
- **Email**: SMTP with customizable templates - **Email**: SMTP with customizable templates
- **Analytics**: Privacy-focused with Umami integration - **Analytics**: Privacy-focused with Umami integration
## 💻 System Requirements
### Minimum Requirements
- **CPU**: 2 CPU cores
- **RAM**: 2GB minimum
- **Storage**: 20GB minimum (plus photo storage needs)
- **OS**: Linux (Ubuntu 20.04+), macOS, or Windows with WSL2
- **Node.js**: v18.0.0 or higher
- **Database**: SQLite (included) or PostgreSQL 12+
### Docker Requirements (Recommended)
- **Docker**: v20.10.0+
- **Docker Compose**: v2.0.0+
## 🤝 Contributing ## 🤝 Contributing
We love contributions! PicPeak is built by photographers, for photographers. Whether you're fixing bugs, adding features, or improving documentation, your help is welcome. We love contributions! PicPeak is built by photographers, for photographers. Whether you're fixing bugs, adding features, or improving documentation, your help is welcome.
+2 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "picpeak-frontend", "name": "picpeak-frontend",
"version": "1.0.86", "version": "1.0.87",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "picpeak-frontend", "name": "picpeak-frontend",
"version": "1.0.86", "version": "1.0.87",
"dependencies": { "dependencies": {
"@tanstack/react-query": "^5.0.0", "@tanstack/react-query": "^5.0.0",
"@tiptap/extension-character-count": "^2.26.1", "@tiptap/extension-character-count": "^2.26.1",
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "picpeak-frontend", "name": "picpeak-frontend",
"private": true, "private": true,
"version": "1.0.86", "version": "1.0.87",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
@@ -12,7 +12,7 @@ import {
Info, Info,
Eye, Eye,
EyeOff, EyeOff,
TestTube, Wifi,
CheckCircle, CheckCircle,
XCircle, XCircle,
Loader2, Loader2,
@@ -386,7 +386,7 @@ export const BackupConfiguration = ({ config, onSave, isSaving }) => {
</> </>
) : ( ) : (
<> <>
<TestTube className="mr-2 h-4 w-4" /> <Wifi className="mr-2 h-4 w-4" />
{t('backup.actions.testConnection')} {t('backup.actions.testConnection')}
</> </>
)} )}
@@ -183,7 +183,7 @@ export const BackupDashboard = ({ status, config, onRunBackup, isBackupRunning }
label={t('backup.dashboard.stats.backupSize')} label={t('backup.dashboard.stats.backupSize')}
value={formatBytes(statistics.total_size || 0)} value={formatBytes(statistics.total_size || 0)}
color="green" color="green"
subtext={`${statistics.files_processed || 0} files`} subtext={`${statistics.files_processed || 0} ${t('backup.dashboard.stats.files')}`}
/> />
<StatCard <StatCard
@@ -294,7 +294,7 @@ export const BackupDashboard = ({ status, config, onRunBackup, isBackupRunning }
<div> <div>
<p className="font-medium text-gray-900"> <p className="font-medium text-gray-900">
{config?.backup_destination_type {config?.backup_destination_type
? config.backup_destination_type.toUpperCase() ? t(`backup.configuration.destinationTypes.${config.backup_destination_type}.name`)
: t('backup.dashboard.notConfigured.title')} : t('backup.dashboard.notConfigured.title')}
</p> </p>
<p className="text-sm text-gray-500"> <p className="text-sm text-gray-500">
+41 -2
View File
@@ -978,7 +978,7 @@
"storageDestination": "Speicherziel", "storageDestination": "Speicherziel",
"nextScheduledBackup": "Nächstes geplantes Backup", "nextScheduledBackup": "Nächstes geplantes Backup",
"backupType": "{{type}} Backup", "backupType": "{{type}} Backup",
"noBackupsYet": "Noch keine Backups" "noDestinationSet": "Kein Ziel festgelegt"
}, },
"configuration": { "configuration": {
"enableBackup": "Automatisierte Backups aktivieren", "enableBackup": "Automatisierte Backups aktivieren",
@@ -1000,24 +1000,34 @@
"fields": { "fields": {
"destinationPath": "Zielpfad", "destinationPath": "Zielpfad",
"destinationPathHelp": "Lokaler Verzeichnispfad für Backup-Speicherung", "destinationPathHelp": "Lokaler Verzeichnispfad für Backup-Speicherung",
"destinationPathPlaceholder": "/pfad/zum/backup/verzeichnis",
"rsyncHost": "Remote-Host", "rsyncHost": "Remote-Host",
"rsyncHostHelp": "SSH-Hostname oder IP-Adresse", "rsyncHostHelp": "SSH-Hostname oder IP-Adresse",
"rsyncHostPlaceholder": "backup.beispiel.de",
"rsyncUser": "SSH-Benutzer", "rsyncUser": "SSH-Benutzer",
"rsyncUserHelp": "Benutzername für SSH-Verbindung", "rsyncUserHelp": "Benutzername für SSH-Verbindung",
"rsyncUserPlaceholder": "backup-benutzer",
"rsyncPath": "Remote-Pfad", "rsyncPath": "Remote-Pfad",
"rsyncPathHelp": "Verzeichnispfad auf Remote-Server", "rsyncPathHelp": "Verzeichnispfad auf Remote-Server",
"rsyncPathPlaceholder": "/home/backup/foto-sharing",
"rsyncSshKey": "SSH Private Key", "rsyncSshKey": "SSH Private Key",
"rsyncSshKeyHelp": "SSH Private Key für Authentifizierung (optional)", "rsyncSshKeyHelp": "SSH Private Key für Authentifizierung (optional)",
"rsyncSshKeyPlaceholder": "-----BEGIN RSA PRIVATE KEY-----",
"s3Endpoint": "S3-Endpunkt", "s3Endpoint": "S3-Endpunkt",
"s3EndpointHelp": "S3 API-Endpunkt (z.B. s3.amazonaws.com)", "s3EndpointHelp": "S3 API-Endpunkt (z.B. s3.amazonaws.com)",
"s3EndpointPlaceholder": "https://s3.amazonaws.com",
"s3Bucket": "Bucket-Name", "s3Bucket": "Bucket-Name",
"s3BucketHelp": "S3-Bucket für Backup-Speicherung", "s3BucketHelp": "S3-Bucket für Backup-Speicherung",
"s3BucketPlaceholder": "mein-backup-bucket",
"s3AccessKey": "Zugriffsschlüssel-ID", "s3AccessKey": "Zugriffsschlüssel-ID",
"s3AccessKeyHelp": "AWS/S3 Zugriffsschlüssel-ID", "s3AccessKeyHelp": "AWS/S3 Zugriffsschlüssel-ID",
"s3AccessKeyPlaceholder": "AKIAIOSFODNN7EXAMPLE",
"s3SecretKey": "Geheimer Zugriffsschlüssel", "s3SecretKey": "Geheimer Zugriffsschlüssel",
"s3SecretKeyHelp": "AWS/S3 geheimer Zugriffsschlüssel", "s3SecretKeyHelp": "AWS/S3 geheimer Zugriffsschlüssel",
"s3SecretKeyPlaceholder": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
"s3Region": "Region", "s3Region": "Region",
"s3RegionHelp": "S3-Region (z.B. eu-central-1)" "s3RegionHelp": "S3-Region (z.B. eu-central-1)",
"s3RegionPlaceholder": "eu-central-1"
}, },
"schedule": { "schedule": {
"title": "Backup-Zeitplan", "title": "Backup-Zeitplan",
@@ -1098,6 +1108,14 @@
"duration": "Dauer", "duration": "Dauer",
"actions": "Aktionen" "actions": "Aktionen"
}, },
"columns": {
"status": "Status",
"dateTime": "Datum & Zeit",
"type": "Typ",
"size": "Größe",
"duration": "Dauer",
"actions": "Aktionen"
},
"details": "Details", "details": "Details",
"statistics": "Statistiken", "statistics": "Statistiken",
"errors": "Fehler", "errors": "Fehler",
@@ -1116,6 +1134,27 @@
"showing": "Zeige {{from}}-{{to}} von {{total}} Backups", "showing": "Zeige {{from}}-{{to}} von {{total}} Backups",
"previous": "Zurück", "previous": "Zurück",
"next": "Weiter" "next": "Weiter"
},
"filter": {
"allStatus": "Alle Status",
"completed": "Abgeschlossen",
"failed": "Fehlgeschlagen",
"running": "Läuft",
"partial": "Teilweise"
},
"noBackupsFound": "Keine Backups gefunden",
"backupsWillAppear": "Backups werden hier angezeigt, sobald sie erstellt wurden",
"messages": {
"deleteSuccess": "Backup erfolgreich gelöscht"
},
"details": {
"backupDetails": "Backup-Details",
"destination": "Ziel",
"started": "Gestartet",
"completed": "Abgeschlossen",
"contentBackedUp": "Gesicherter Inhalt",
"errorDetails": "Fehlerdetails",
"manifest": "Manifest"
} }
}, },
"restore": { "restore": {
+40 -1
View File
@@ -1056,24 +1056,34 @@
"fields": { "fields": {
"destinationPath": "Destination Path", "destinationPath": "Destination Path",
"destinationPathHelp": "Local directory path for storing backups", "destinationPathHelp": "Local directory path for storing backups",
"destinationPathPlaceholder": "/path/to/backup/directory",
"rsyncHost": "Remote Host", "rsyncHost": "Remote Host",
"rsyncHostHelp": "SSH hostname or IP address", "rsyncHostHelp": "SSH hostname or IP address",
"rsyncHostPlaceholder": "backup.example.com",
"rsyncUser": "SSH User", "rsyncUser": "SSH User",
"rsyncUserHelp": "Username for SSH connection", "rsyncUserHelp": "Username for SSH connection",
"rsyncUserPlaceholder": "backup-user",
"rsyncPath": "Remote Path", "rsyncPath": "Remote Path",
"rsyncPathHelp": "Directory path on remote server", "rsyncPathHelp": "Directory path on remote server",
"rsyncPathPlaceholder": "/home/backup/photo-sharing",
"rsyncSshKey": "SSH Private Key", "rsyncSshKey": "SSH Private Key",
"rsyncSshKeyHelp": "SSH private key for authentication (optional)", "rsyncSshKeyHelp": "SSH private key for authentication (optional)",
"rsyncSshKeyPlaceholder": "-----BEGIN RSA PRIVATE KEY-----",
"s3Endpoint": "S3 Endpoint", "s3Endpoint": "S3 Endpoint",
"s3EndpointHelp": "S3 API endpoint (e.g., s3.amazonaws.com)", "s3EndpointHelp": "S3 API endpoint (e.g., s3.amazonaws.com)",
"s3EndpointPlaceholder": "https://s3.amazonaws.com",
"s3Bucket": "Bucket Name", "s3Bucket": "Bucket Name",
"s3BucketHelp": "S3 bucket for storing backups", "s3BucketHelp": "S3 bucket for storing backups",
"s3BucketPlaceholder": "my-backup-bucket",
"s3AccessKey": "Access Key ID", "s3AccessKey": "Access Key ID",
"s3AccessKeyHelp": "AWS/S3 access key ID", "s3AccessKeyHelp": "AWS/S3 access key ID",
"s3AccessKeyPlaceholder": "AKIAIOSFODNN7EXAMPLE",
"s3SecretKey": "Secret Access Key", "s3SecretKey": "Secret Access Key",
"s3SecretKeyHelp": "AWS/S3 secret access key", "s3SecretKeyHelp": "AWS/S3 secret access key",
"s3SecretKeyPlaceholder": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
"s3Region": "Region", "s3Region": "Region",
"s3RegionHelp": "S3 region (e.g., us-east-1)" "s3RegionHelp": "S3 region (e.g., us-east-1)",
"s3RegionPlaceholder": "us-east-1"
}, },
"schedule": { "schedule": {
"title": "Backup Schedule", "title": "Backup Schedule",
@@ -1154,6 +1164,14 @@
"duration": "Duration", "duration": "Duration",
"actions": "Actions" "actions": "Actions"
}, },
"columns": {
"status": "Status",
"dateTime": "Date & Time",
"type": "Type",
"size": "Size",
"duration": "Duration",
"actions": "Actions"
},
"details": "Details", "details": "Details",
"statistics": "Statistics", "statistics": "Statistics",
"errors": "Errors", "errors": "Errors",
@@ -1172,6 +1190,27 @@
"showing": "Showing {{from}}-{{to}} of {{total}} backups", "showing": "Showing {{from}}-{{to}} of {{total}} backups",
"previous": "Previous", "previous": "Previous",
"next": "Next" "next": "Next"
},
"filter": {
"allStatus": "All Status",
"completed": "Completed",
"failed": "Failed",
"running": "Running",
"partial": "Partial"
},
"noBackupsFound": "No backups found",
"backupsWillAppear": "Backups will appear here once created",
"messages": {
"deleteSuccess": "Backup deleted successfully"
},
"details": {
"backupDetails": "Backup Details",
"destination": "Destination",
"started": "Started",
"completed": "Completed",
"contentBackedUp": "Content Backed Up",
"errorDetails": "Error Details",
"manifest": "Manifest"
} }
}, },
"restore": { "restore": {