{"record":{"id":"3e83569603ae4c0b","repo":"phacility/phabricator","slug":"no-s-specified","errorCode":null,"errorMessage":"No '%s' specified!","messagePattern":"No '(.+?)' specified!","errorType":"exception","errorClass":"PhabricatorFileStorageConfigurationException","httpStatus":null,"severity":"error","filePath":"src/applications/files/engine/PhabricatorS3FileStorageEngine.php","lineNumber":144,"sourceCode":"      ->setParametersForDeleteObject($handle)\n      ->resolve();\n\n    $profiler->endServiceCall($call_id, array());\n  }\n\n\n/* -(  Internals  )---------------------------------------------------------- */\n\n\n  /**\n   * Retrieve the S3 bucket name.\n   *\n   * @task internal\n   */\n  private function getBucketName() {\n    $bucket = PhabricatorEnv::getEnvConfig('storage.s3.bucket');\n    if (!$bucket) {\n      throw new PhabricatorFileStorageConfigurationException(\n        pht(\n          \"No '%s' specified!\",\n          'storage.s3.bucket'));\n    }\n    return $bucket;\n  }\n\n  /**\n   * Create a new S3 API object.\n   *\n   * @task internal\n   */\n  private function newS3API() {\n    $access_key = PhabricatorEnv::getEnvConfig('amazon-s3.access-key');\n    $secret_key = PhabricatorEnv::getEnvConfig('amazon-s3.secret-key');\n    $region = PhabricatorEnv::getEnvConfig('amazon-s3.region');\n    $endpoint = PhabricatorEnv::getEnvConfig('amazon-s3.endpoint');\n","sourceCodeStart":126,"sourceCodeEnd":162,"githubUrl":"https://github.com/phacility/phabricator/blob/5720a38cfe95b00ca4be5016dd0d2f3195f4fa04/src/applications/files/engine/PhabricatorS3FileStorageEngine.php#L126-L162","documentation":"PhabricatorS3FileStorageEngine::getBucketName() reads storage.s3.bucket from environment configuration and throws PhabricatorFileStorageConfigurationException when it is empty. The S3 engine was selected without its one required setting, so no S3 operation (write or read) can proceed.","triggerScenarios":"Configuring uploads to use the S3 storage engine while storage.s3.bucket is unset or set to an empty string; environment-specific config missing in one deployment tier.","commonSituations":"Copy-pasted configuration that omitted the bucket line; staging config promoted to production without the bucket; typo in the config key name leaving the real value unset.","solutions":["Set the bucket: ./bin/config set storage.s3.bucket <bucket-name>","Verify the bucket name is correct and reachable (credentials, region, endpoint) with a test upload afterwards","If S3 was selected unintentionally, switch the storage engine selection back to local-disk or MySQL storage"],"exampleFix":"# before: S3 engine selected, no bucket configured\n\n# after\n./bin/config set storage.s3.bucket my-phabricator-files","handlingStrategy":"validation","validationCode":"if (!strlen((string)PhabricatorEnv::getEnvConfig('storage.s3.bucket'))) {\n  // S3 engine unusable: block selection until the bucket is configured\n}","typeGuard":null,"tryCatchPattern":"catch PhabricatorFileStorageConfigurationException at engine selection/startup and fail with a clear setup message naming storage.s3.bucket.","preventionTips":["Encode required-per-engine settings as a config checklist applied by deployment tooling","Test one upload immediately after switching storage engines"],"tags":["configuration","s3","storage","missing-config"],"backgroundTag":"missing-storage-config","analyzedSha":"5720a38cfe95b00ca4be5016dd0d2f3195f4fa04","analyzedAt":"2026-08-21T05:07:25.672Z","schemaVersion":2},"datasetVersion":"2026-08-21T11:28:35.574Z"}