Author SHA1 Message Date
imagesbyolofsson 5a5b2b42d2 Merge pull request 'Portfoliosynk: 13 bilder som fastnat sedan 29/9 kommer med; en trasig bild stoppar inte de andra' (#3) from portfoliosynk-fix-2026-11-06 into main
Reviewed-on: #3
2026-11-06 04:22:38 +00:00
Linus OlofssonandClaude Opus 5.5 24a59c6e93 Portfolio sync: a photo that fails no longer stops the others; sharp accepts pixel-shift and 15000 px squares
Seen on the first run on Cleura 2026-11-06: 13 photos tagged since 2026-09-29 were never synced. portfolio-sync.mjs
sets exit code 1 when one photo fails (DSC00342_PSMS16-square.jpg: "Input image exceeds pixel limit", sharp's default
268 MP) and set -e then stopped before commit/push - on Nurem as well. Now the photos that worked are committed and
built, the run still ends with exit 1 so systemd shows it, and sharp's limit is 1 000 MP (JPEGs shrink while decoding;
the container gets 3 GB).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 05:18:14 +01:00
imagesbyolofsson 8c9afb65c3 Merge pull request 'En domän: portfolion utan nedladdning, Om mig/Kontakt/Posters från portalen, portfoliosynk på Cleura' (#2) from ett-domannamn-2026-11-06 into main
Reviewed-on: #2
2026-11-06 04:07:25 +00:00
2 changed files with 12 additions and 3 deletions
+9 -2
View File
@@ -54,10 +54,13 @@ git -C "$DIR" checkout -q -B main origin/main
git -C "$DIR" reset -q --hard origin/main git -C "$DIR" reset -q --hard origin/main
echo "[sync] scripts/portfolio-sync.mjs" echo "[sync] scripts/portfolio-sync.mjs"
docker run --rm --memory 2g --cpus 2 --network bridge \ # portfolio-sync.mjs exits 1 when a single photo fails but still writes the others; those are committed below, and the
# run ends with exit 1 so systemd shows that something needs a look (journalctl -u portfolio-sync).
SYNC_RC=0
docker run --rm --memory 3g --cpus 2 --network bridge \
-e IMMICH_URL -e IMMICH_API_KEY -e PORTFOLIO_TAG_ID \ -e IMMICH_URL -e IMMICH_API_KEY -e PORTFOLIO_TAG_ID \
-v "$DIR":/app --mount type=tmpfs,destination=/app/.git -w /app "$NODE" \ -v "$DIR":/app --mount type=tmpfs,destination=/app/.git -w /app "$NODE" \
sh -c 'npm install --no-audit --no-fund --loglevel=error >/dev/null && node scripts/portfolio-sync.mjs' sh -c 'npm install --no-audit --no-fund --loglevel=error >/dev/null && node scripts/portfolio-sync.mjs' || SYNC_RC=$?
if git -C "$DIR" status --porcelain -- src/assets/images/portfolio | grep -q .; then if git -C "$DIR" status --porcelain -- src/assets/images/portfolio | grep -q .; then
git -C "$DIR" add -A src/assets/images/portfolio git -C "$DIR" add -A src/assets/images/portfolio
@@ -69,3 +72,7 @@ if git -C "$DIR" status --porcelain -- src/assets/images/portfolio | grep -q .;
else else
echo "[sync] no changes" echo "[sync] no changes"
fi fi
if [ "$SYNC_RC" != 0 ]; then
echo "[sync] WARNING: portfolio-sync.mjs exited $SYNC_RC - some photos failed (see the lines with '!' above)"
exit "$SYNC_RC"
fi
+3 -1
View File
@@ -77,7 +77,9 @@ function destName(asset) {
async function downloadAndResize(asset, destPath) { async function downloadAndResize(asset, destPath) {
const res = await api("GET", `/assets/${asset.id}/original`); const res = await api("GET", `/assets/${asset.id}/original`);
const buf = Buffer.from(await res.arrayBuffer()); const buf = Buffer.from(await res.arrayBuffer());
await sharp(buf) // Pixel shift and the 15000 px Instagram squares can exceed sharp's default limit (268 MP). JPEGs are shrunk while
// they are decoded, so memory stays low; the sync container still has a memory cap.
await sharp(buf, { limitInputPixels: 1_000_000_000 })
.rotate() // respektera EXIF-orientering .rotate() // respektera EXIF-orientering
.resize(MAX_DIM, MAX_DIM, { fit: "inside", withoutEnlargement: true }) .resize(MAX_DIM, MAX_DIM, { fit: "inside", withoutEnlargement: true })
.withMetadata() // BEVARA EXIF (kritiskt för portfolions datum/kamera) .withMetadata() // BEVARA EXIF (kritiskt för portfolions datum/kamera)