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:
@@ -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);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user