{
  "manifest_version": "1.0.0",
  "template": {
    "id": "2d40e0a0-85ab-40e8-81da-45d19c90759a",
    "slug": "public-bucket-urls",
    "name": "Public Bucket URLs",
    "description": "Get public bucket URLs and serve files with free egress",
    "url": "https://railway.com/deploy/public-bucket-urls",
    "upstream": {
      "repo_url": "https://github.com/timomeh/s3-public-presigner"
    }
  },
  "status": "unvalidated",
  "validated_at": null,
  "success_rate_30d": null,
  "services": [
    {
      "name": "s3-public-presigner",
      "source": {
        "repo": "https://github.com/timomeh/s3-public-presigner"
      },
      "needs_volume": false,
      "http": true
    }
  ],
  "required_inputs": [
    {
      "key": "S3_BUCKET",
      "service": "s3-public-presigner",
      "description": "S3-compatible name of your bucket",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_REGION",
      "service": "s3-public-presigner",
      "description": "Region of the bucket",
      "secret": false,
      "strategy": "default",
      "default": "auto"
    },
    {
      "key": "S3_ENDPOINT",
      "service": "s3-public-presigner",
      "description": "S3-compatible endpoint where the bucket is hosted",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ACCESS_KEY_ID",
      "service": "s3-public-presigner",
      "description": "The bucket's Access Key ID",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "USE_NICE_NOT_FOUND",
      "service": "s3-public-presigner",
      "description": "Set this to 1 to return nice \"File not found\" messages when a file doesn't exist. Increases latency slightly.",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "S3_SECRET_ACCESS_KEY",
      "service": "s3-public-presigner",
      "description": "The bucket's Secret Access Key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PRESIGNED_URL_EXPIRATION_SECONDS",
      "service": "s3-public-presigner",
      "description": "How long the presigned redirected URLs should be valid for, in seconds. Defaults to 1 hour. Can be up to 90 days. You only need to change this if you share the presigned URL. You usually do not need to share the presigned URL with users.",
      "secret": false,
      "strategy": "default",
      "default": "3600"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "public-bucket-urls"
      }
    },
    "cli": "railway deploy --template public-bucket-urls",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "2d40e0a0-85ab-40e8-81da-45d19c90759a",
            "serializedConfig": {
              "buckets": {
                "a85485ac-a081-4e26-a8bf-7d18283e9f15": {
                  "name": "public files"
                }
              },
              "services": {
                "58e21ccc-02e5-4060-a7d8-d7d1c683805e": {
                  "icon": null,
                  "name": "s3-public-presigner",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "/_ah/up",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "repo": "https://github.com/timomeh/s3-public-presigner",
                    "rootDirectory": null
                  },
                  "variables": {
                    "S3_BUCKET": {
                      "isOptional": false,
                      "description": "S3-compatible name of your bucket",
                      "defaultValue": "${{public files.BUCKET}}"
                    },
                    "S3_REGION": {
                      "isOptional": false,
                      "description": "Region of the bucket",
                      "defaultValue": "auto"
                    },
                    "S3_ENDPOINT": {
                      "isOptional": false,
                      "description": "S3-compatible endpoint where the bucket is hosted",
                      "defaultValue": "https://${{public files.BUCKET}}.storage.railway.app"
                    },
                    "S3_ACCESS_KEY_ID": {
                      "isOptional": false,
                      "description": "The bucket's Access Key ID",
                      "defaultValue": "${{public files.ACCESS_KEY_ID}}"
                    },
                    "USE_NICE_NOT_FOUND": {
                      "isOptional": true,
                      "description": "Set this to 1 to return nice \"File not found\" messages when a file doesn't exist. Increases latency slightly.",
                      "defaultValue": "0"
                    },
                    "S3_SECRET_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "The bucket's Secret Access Key",
                      "defaultValue": "${{public files.SECRET_ACCESS_KEY}}"
                    },
                    "PRESIGNED_URL_EXPIRATION_SECONDS": {
                      "isOptional": true,
                      "description": "How long the presigned redirected URLs should be valid for, in seconds. Defaults to 1 hour. Can be up to 90 days. You only need to change this if you share the presigned URL. You usually do not need to share the presigned URL with users.",
                      "defaultValue": "3600"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>": {}
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {
    "healthcheck": {
      "service": "s3-public-presigner",
      "method": "GET",
      "path": "/_ah/up",
      "expect_status": 200
    }
  },
  "resources": {
    "expected_services": 1,
    "needs_volume": false
  },
  "generated_at": "2026-09-04T05:44:27.711Z",
  "generator_version": "0.1.0"
}
