{
  "manifest_version": "1.0.0",
  "template": {
    "id": "0f3b08d4-7f5a-49d7-ad4a-460eab3bc444",
    "slug": "vast-green-1",
    "name": "Garage S3 + WebUI",
    "description": "Self-hosted S3 storage with a web management dashboard",
    "url": "https://railway.com/deploy/vast-green-1",
    "upstream": {
      "repo_url": "https://github.com/matheusac19/railway_garage_template"
    }
  },
  "status": "unvalidated",
  "validated_at": null,
  "success_rate_30d": null,
  "services": [
    {
      "name": "Garage S3",
      "source": {
        "repo": "https://github.com/matheusac19/railway_garage_template"
      },
      "needs_volume": true,
      "volume_mount_path": "/garage-volume",
      "http": true
    },
    {
      "name": "WebUI",
      "source": {
        "repo": "https://github.com/matheusac19/railway_garage_ui_template"
      },
      "needs_volume": false,
      "http": true
    }
  ],
  "required_inputs": [
    {
      "key": "PORT",
      "service": "Garage S3",
      "description": "Inject the number 3900 into the script and perform the Healthcheck on 3900.",
      "secret": false,
      "strategy": "default",
      "default": "3900"
    },
    {
      "key": "GARAGE_BUCKET",
      "service": "Garage S3",
      "description": "Name of the S3 bucket that will be automatically created on the first server startup. You can create others later, but this will be your primary bucket. (Ex: storage-app, images-site).",
      "secret": false,
      "strategy": "default",
      "default": "my-bucket"
    },
    {
      "key": "GARAGE_KEY_NAME",
      "service": "Garage S3",
      "description": "A user-friendly name for the access key that will be automatically generated. The system will create the credentials by linking this key to the primary bucket with read and write permissions.",
      "secret": true,
      "strategy": "default",
      "default": "my-admin-key"
    },
    {
      "key": "GARAGE_ACCESS_KEY",
      "service": "Garage S3",
      "description": "(Recommended) Create your S3 Access Key ID. It MUST start with 'GK' (Ex: GKmyproject123). If left blank, a secure key will be generated in the logs of the first deployment.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "GARAGE_SECRET_KEY",
      "service": "Garage S3",
      "description": "(Recommended) Create your S3 Secret Key. It must be EXACTLY 64 hexadecimal characters (letters a-f, numbers 0-9). If left blank, one will be automatically generated in the logs.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "GARAGE_ADMIN_TOKEN",
      "service": "Garage S3",
      "description": "The administration API key (port 3902) used by the WebUI. Any random string will do (recommended: 'openssl rand -hex 32'). If blank, it will be generated in the logs. It must be IDENTICAL to the WebUI's API_ADMIN_KEY.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "PORT",
      "service": "WebUI",
      "description": "Provide a value for PORT.",
      "secret": false,
      "strategy": "default",
      "default": "3909"
    },
    {
      "key": "API_BASE_URL",
      "service": "WebUI",
      "description": "Garage Admin API URL (private network)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "API_ADMIN_KEY",
      "service": "WebUI",
      "description": "Admin token from the Garage service",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "AUTH_USER_PASS",
      "service": "WebUI",
      "description": "Bcrypt-hashed login for the UI — format: user:$2b$... — leave blank to disable auth",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "S3_ENDPOINT_URL",
      "service": "WebUI",
      "description": "Garage S3 endpoint (private network)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "vast-green-1"
      }
    },
    "cli": "railway deploy --template vast-green-1",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "0f3b08d4-7f5a-49d7-ad4a-460eab3bc444",
            "serializedConfig": {
              "services": {
                "1c1535df-aec3-48dc-b10e-815e22f87fe9": {
                  "icon": "https://garagehq.deuxfleurs.fr/images/garage-logo.svg",
                  "name": "Garage S3",
                  "deploy": {
                    "startCommand": "sh /start.sh"
                  },
                  "source": {
                    "repo": "matheusac19/railway_garage_template",
                    "branch": null,
                    "rootDirectory": null
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Inject the number 3900 into the script and perform the Healthcheck on 3900.",
                      "defaultValue": "3900"
                    },
                    "GARAGE_BUCKET": {
                      "isOptional": false,
                      "description": "Name of the S3 bucket that will be automatically created on the first server startup. You can create others later, but this will be your primary bucket. (Ex: storage-app, images-site).",
                      "defaultValue": "my-bucket"
                    },
                    "GARAGE_KEY_NAME": {
                      "isOptional": false,
                      "description": "A user-friendly name for the access key that will be automatically generated. The system will create the credentials by linking this key to the primary bucket with read and write permissions.",
                      "defaultValue": "my-admin-key"
                    },
                    "GARAGE_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "(Recommended) Create your S3 Access Key ID. It MUST start with 'GK' (Ex: GKmyproject123). If left blank, a secure key will be generated in the logs of the first deployment.",
                      "defaultValue": "{{GARAGE_ACCESS_KEY}}"
                    },
                    "GARAGE_SECRET_KEY": {
                      "isOptional": false,
                      "description": "(Recommended) Create your S3 Secret Key. It must be EXACTLY 64 hexadecimal characters (letters a-f, numbers 0-9). If left blank, one will be automatically generated in the logs.",
                      "defaultValue": "{{GARAGE_SECRET_KEY}}"
                    },
                    "GARAGE_ADMIN_TOKEN": {
                      "isOptional": false,
                      "description": "The administration API key (port 3902) used by the WebUI. Any random string will do (recommended: 'openssl rand -hex 32'). If blank, it will be generated in the logs. It must be IDENTICAL to the WebUI's API_ADMIN_KEY.",
                      "defaultValue": "{{GARAGE_ADMIN_TOKEN}}"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:3900": {
                        "port": 3900
                      }
                    }
                  },
                  "volumeMounts": {
                    "1c1535df-aec3-48dc-b10e-815e22f87fe9": {
                      "mountPath": "/garage-volume"
                    }
                  }
                },
                "ad9ac99d-5642-419c-997f-65af5d7da3aa": {
                  "icon": "https://i.ibb.co/VcjN1mGM/Whats-App-Image-2026-06-15-at-14-46-30-removebg-preview.png",
                  "name": "WebUI",
                  "source": {
                    "repo": "matheusac19/railway_garage_ui_template",
                    "branch": null,
                    "rootDirectory": ""
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "",
                      "defaultValue": "3909"
                    },
                    "API_BASE_URL": {
                      "isOptional": false,
                      "description": "Garage Admin API URL (private network)",
                      "defaultValue": "http://${{\"Garage S3\".RAILWAY_PRIVATE_DOMAIN}}:3902"
                    },
                    "API_ADMIN_KEY": {
                      "isOptional": false,
                      "description": "Admin token from the Garage service",
                      "defaultValue": "${{\"Garage S3\".GARAGE_ADMIN_TOKEN}}"
                    },
                    "AUTH_USER_PASS": {
                      "isOptional": false,
                      "description": "Bcrypt-hashed login for the UI — format: user:$2b$... — leave blank to disable auth",
                      "defaultValue": "{{AUTH_USER_PASS}}"
                    },
                    "S3_ENDPOINT_URL": {
                      "isOptional": false,
                      "description": "Garage S3 endpoint (private network)",
                      "defaultValue": "http://${{\"Garage S3\".RAILWAY_PRIVATE_DOMAIN}}:3900"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:3909": {
                        "port": 3909
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {},
  "resources": {
    "expected_services": 2,
    "needs_volume": true
  },
  "generated_at": "2026-09-21T22:14:44.200Z",
  "generator_version": "0.1.0"
}
