feat: initial live.f12.rocks SFTP → gmic/rembg → web pipeline

Event pep stack with SFTPGo inbox, sequential worker, FastAPI gallery/remix, and Traefik-ready compose.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Frank Schwenk
2026-07-16 21:32:10 +02:00
commit 90192cd284
31 changed files with 7739 additions and 0 deletions
+44
View File
@@ -0,0 +1,44 @@
#!/bin/sh
# Builds a SFTPGo "loaddata" JSON (the format the dumpdata/loaddata REST
# API uses) with exactly one user, then starts sftpgo with
# --loaddata-from that file. Runs on every container start — mode 0
# (the default) adds new objects and updates existing ones, so re-running
# this is safe and picks up a changed SFTP_PASSWORD on restart.
#
# The user's home_dir is /srv/sftpgo/data/inbox, which — via the
# ./data:/srv/sftpgo/data bind mount in compose.yml — is the same
# directory as the worker's DATA_DIR/inbox. Whatever lands here over SFTP
# is exactly what the worker watches.
#
# Uses `jq` to build the JSON so SFTP_USER/SFTP_PASSWORD are always
# correctly escaped (arbitrary passwords, including quotes/backslashes,
# are safe). jq ships in the official drakkan/sftpgo image; if a future
# image drops it, this script needs an alternative (e.g. python/perl,
# both otherwise present at the time of writing).
set -eu
OUTPUT="/var/lib/sftpgo/loaddata.json"
: "${SFTP_USER:?SFTP_USER must be set}"
: "${SFTP_PASSWORD:?SFTP_PASSWORD must be set}"
jq -n \
--arg user "$SFTP_USER" \
--arg pass "$SFTP_PASSWORD" \
'{
users: [
{
status: 1,
username: $user,
password: $pass,
home_dir: "/srv/sftpgo/data/inbox",
permissions: {
"/": ["list", "download", "upload", "overwrite", "create_dirs"]
},
filesystem: { provider: 0 }
}
],
version: 15
}' > "$OUTPUT"
exec sftpgo serve --loaddata-from "$OUTPUT"