Fix: Backend-Bugs, fehlende Galerie, Watchtower statt Docker-Socket

- express.urlencoded() hinzugefuegt (Login war komplett kaputt)
- Oeffentliche Galerie zeigt jetzt alle Bilder (statt leere Galerie)
- loadGallery() Aufruf in main.js eingefuegt (fehlte komplett)
- main.min.js neu gebaut mit gulp (Galerie-Code fehlte in minified Version)
- Watchtower Container in docker-compose.yml (auto-updates alle 5 Min)
- Docker-Socket und docker-cli aus Photography-Container entfernt
- runs.json Muell-Datei geloescht
- Brain.md und Feature-Request.md aktualisiert

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Kroonk
2026-04-12 17:22:49 +02:00
parent 15e74f42c2
commit a4f3cf738c
8 changed files with 139 additions and 81 deletions

View File

@@ -11,6 +11,7 @@ const app = express();
const JWT_SECRET = process.env.JWT_SECRET || 'mischkomposition-super-secret-key-change-me';
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(cookieParser());
// Middleware to verify JWT cookie
@@ -63,37 +64,38 @@ app.get('/api/auth/me', (req, res) => {
// ==================== IMAGE PROXY ====================
// We must override the nginx `/images/fulls/` JSON behavior here:
// Bilder-Listing: Oeffentlich = alle Bilder, eingeloggt = zugewiesene Bilder
app.get('/images/fulls/', (req, res) => {
if (!req.user) return res.json([]); // Not logged in -> empty gallery
const fullsDir = path.join(__dirname, '../public/images/fulls');
fs.readdir(fullsDir, (err, files) => {
if (err) return res.json([]);
let imageFiles = files.filter(f => f.match(/\.(jpg|jpeg|png|gif|webp)$/i));
const imageFiles = files.filter(f => f.match(/\.(jpg|jpeg|png|gif|webp)$/i));
if (req.user.role === 'admin') {
// Admin sees all
const result = imageFiles.map(name => {
const stats = fs.statSync(path.join(fullsDir, name));
return { name, type: 'file', mtime: stats.mtime.toUTCString(), size: stats.size };
});
return res.json(result);
} else {
// Normal user sees only assigned
db.all('SELECT image_name FROM user_images WHERE user_id = ?', [req.user.id], (err, rows) => {
if (err) return res.json([]);
const assignedNames = rows.map(r => r.image_name);
const assignedFiles = imageFiles.filter(name => assignedNames.includes(name));
const result = assignedFiles.map(name => {
function buildResult(names) {
return names.map(name => {
try {
const stats = fs.statSync(path.join(fullsDir, name));
return { name, type: 'file', mtime: stats.mtime.toUTCString(), size: stats.size };
});
return res.json(result);
} catch (e) {
return { name, type: 'file' };
}
});
}
// Nicht eingeloggt oder Admin: alle Bilder anzeigen
if (!req.user || req.user.role === 'admin') {
return res.json(buildResult(imageFiles));
}
// Normaler User: nur zugewiesene Bilder
db.all('SELECT image_name FROM user_images WHERE user_id = ?', [req.user.id], (err, rows) => {
if (err) return res.json([]);
const assignedNames = rows.map(r => r.image_name);
const assignedFiles = imageFiles.filter(name => assignedNames.includes(name));
return res.json(buildResult(assignedFiles));
});
});
});
@@ -150,19 +152,18 @@ app.post('/api/admin/assign', requireAdmin, (req, res) => {
});
app.post('/api/admin/update', requireAdmin, (req, res) => {
console.log("Triggering Docker Compose Update...");
// Wir fuehren den Docker compose pull/down/up aus.
// ACHTUNG: Der Server stuertzt danach ohnehin im Container ab (da er neu gestartet wird).
const cmd = "docker compose pull && docker compose down && docker compose up -d";
// Return early to ensure client gets success BEFORE container dies
res.json({ success: true, message: 'Update gestartet. Container wird neu gestartet...' });
console.log("Triggering Docker Update...");
// Neues Image pullen und Container neu starten (ohne docker-compose)
const image = 'ghcr.io/kroonk/photography:latest';
const cmd = `docker pull ${image} && docker stop photography-website && docker rm photography-website`;
res.json({ success: true, message: 'Update gestartet. Container wird neu gestartet... Seite laedt in 30 Sekunden neu.' });
setTimeout(() => {
exec(cmd, { cwd: '/app' }, (err, stdout, stderr) => {
exec(cmd, (err, stdout, stderr) => {
if (err) console.error("Update failed:", err);
else console.log("Update success:", stdout);
else console.log("Update triggered:", stdout);
});
}, 1000);
});