{ // One worker, one durable object, one container. The name is fixed at // "forge" in worker.js, so exactly one container serves the bucket. "name": "git-forge", "main": "worker.js", "compatibility_date": "2026-08-01", "observability": { "enabled": true }, "containers": [ { "class_name": "Forge", "image": "./Containerfile", // 1/4 vCPU, 1 GiB, 4 GB disk. Disk is the ceiling on the datadir, // and git gc needs room to repack on top of it. "instance_type": "basic", "max_instances": 1 } ], "durable_objects": { "bindings": [{ "name": "FORGE", "class_name": "Forge" }] }, "migrations": [{ "tag": "v1", "new_sqlite_classes": ["Forge"] }], "r2_buckets": [{ "binding": "BUCKET", "bucket_name": "git-forge" }], // No vars: an environment value pins what the admin page could otherwise // change. GIT_FORGE_BASE_URL is the exception, for a custom domain fronting // a hostname requests do not arrive on. // Outbound mail: worker.js answers Mailgun's api shape and decides what // sends. Nothing is sent until forge.json names the intercepted host; // delete this line to rule mail out. "send_email": [{ "name": "SEND_EMAIL" }] }