Thumbnails failed immediately on any clip past ~2 min. The one-pass select
expression joined frames with a flat a+b+c+... chain, which overflows ffmpeg's
recursive expression parser past ~120 terms ("Error while parsing expression").
Join the same terms as a balanced tree (depth O(log N)) instead — identical
selection, still one decode pass, exact per-tile frames preserved.
- generate_thumbnails management command: runs synchronously and streams each
phase to stdout, so jobs are watchable without tailing app logs
- surface ffmpeg's stderr instead of swallowing it in CalledProcessError
- fly: min_machines_running = 1. Background thumbnail jobs outlive the HTTP
request that triggers them, so scale-to-zero let the proxy autostop the VM
mid-job and leave projects stuck "running"
- timeline: replace the two split playhead bars (pinned lanes vs scrolling
tracks) with one full-height overlay, positioned in JS to track horizontal
scroll and sit above the translucent header
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
32 lines
1 KiB
TOML
32 lines
1 KiB
TOML
# Fly.io — one machine, scale to zero, SQLite on a volume, video on R2.
|
|
# `app` is set by `fly launch`. After launch, set secrets (see DEPLOY.md) and:
|
|
# fly deploy
|
|
app = "lumet"
|
|
primary_region = "iad"
|
|
|
|
[build]
|
|
dockerfile = "Dockerfile"
|
|
|
|
[env]
|
|
DJANGO_DEBUG = "0"
|
|
DJANGO_ALLOWED_HOSTS = ".fly.dev"
|
|
DJANGO_DB_PATH = "/data/db.sqlite3"
|
|
# also set DJANGO_CSRF_TRUSTED="https://<your-app>.fly.dev" (secret or env) for admin
|
|
|
|
[http_service]
|
|
internal_port = 8000
|
|
force_https = true
|
|
auto_stop_machines = "stop" # extra machines can still scale to zero
|
|
auto_start_machines = true # wake on the next request
|
|
min_machines_running = 1 # keep one VM always up: background thumbnail
|
|
# jobs outlive any HTTP request, so scale-to-zero
|
|
# would let the proxy reap the VM mid-job.
|
|
|
|
[[vm]]
|
|
size = "shared-cpu-1x"
|
|
memory = "512mb"
|
|
|
|
# SQLite + uploads scratch live here (survives machine stop/start)
|
|
[[mounts]]
|
|
source = "data"
|
|
destination = "/data"
|