{"id":19960939,"url":"https://github.com/parse-community/parse-server-s3-adapter","last_synced_at":"2026-03-14T03:23:17.412Z","repository":{"id":6061435,"uuid":"54613217","full_name":"parse-community/parse-server-s3-adapter","owner":"parse-community","description":"AWS S3 file storage adapter for Parse Server","archived":false,"fork":false,"pushed_at":"2026-02-10T02:00:00.000Z","size":2707,"stargazers_count":81,"open_issues_count":20,"forks_count":87,"subscribers_count":11,"default_branch":"master","last_synced_at":"2026-02-10T06:55:24.972Z","etag":null,"topics":["aws","parse-server","s3-bucket"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/parse-community.png","metadata":{"funding":{"github":"parse-community","patreon":null,"open_collective":"parse-server","ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null},"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2016-03-24T03:55:30.000Z","updated_at":"2026-02-10T01:58:47.000Z","dependencies_parsed_at":"2026-02-10T04:00:50.280Z","dependency_job_id":null,"html_url":"https://github.com/parse-community/parse-server-s3-adapter","commit_stats":{"total_commits":174,"total_committers":35,"mean_commits":"4.9714285714285715","dds":0.7241379310344828,"last_synced_commit":"0e0d721b60f15765069414230f237bda56af315e"},"previous_names":["parse-server-modules/parse-server-s3-adapter"],"tags_count":25,"template":false,"template_full_name":null,"purl":"pkg:github/parse-community/parse-server-s3-adapter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/parse-community%2Fparse-server-s3-adapter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/parse-community%2Fparse-server-s3-adapter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/parse-community%2Fparse-server-s3-adapter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/parse-community%2Fparse-server-s3-adapter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/parse-community","download_url":"https://codeload.github.com/parse-community/parse-server-s3-adapter/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/parse-community%2Fparse-server-s3-adapter/sbom","scorecard":{"id":720887,"data":{"date":"2025-08-11","repo":{"name":"github.com/parse-community/parse-server-s3-adapter","commit":"e6348358ef1d74ca632775ac2d27199e317e6700"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":6.3,"checks":[{"name":"Maintained","score":10,"reason":"30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":10,"reason":"all changesets reviewed","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Warn: no topLevel permission defined: .github/workflows/release-automated.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":5,"reason":"dependency not pinned by hash detected -- score normalized to 5","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/parse-community/parse-server-s3-adapter/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/parse-community/parse-server-s3-adapter/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:54: update your workflow using https://app.stepsecurity.io/secureworkflow/parse-community/parse-server-s3-adapter/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:56: update your workflow using https://app.stepsecurity.io/secureworkflow/parse-community/parse-server-s3-adapter/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:67: update your workflow using https://app.stepsecurity.io/secureworkflow/parse-community/parse-server-s3-adapter/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-automated.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/parse-community/parse-server-s3-adapter/release-automated.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-automated.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/parse-community/parse-server-s3-adapter/release-automated.yml/master?enable=pin","Warn: npmCommand not pinned by hash: .github/workflows/ci.yml:62","Info:   0 out of   6 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   3 out of   4 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: github.com/parse-community/.github/SECURITY.md:1","Info: Found linked content: github.com/parse-community/.github/SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: github.com/parse-community/.github/SECURITY.md:1","Info: Found text in security policy: github.com/parse-community/.github/SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/release-automated.yml:6"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":2,"reason":"8 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-xwcq-pm8m-c4vf","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-rhx6-c78j-4q9w","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-22T11:19:57.251Z","repository_id":6061435,"created_at":"2025-08-22T11:19:57.252Z","updated_at":"2025-08-22T11:19:57.252Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29664825,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-20T19:49:36.704Z","status":"ssl_error","status_checked_at":"2026-02-20T19:44:05.372Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aws","parse-server","s3-bucket"],"created_at":"2024-11-13T02:05:49.849Z","updated_at":"2026-02-20T21:15:08.098Z","avatar_url":"https://github.com/parse-community.png","language":"JavaScript","funding_links":["https://github.com/sponsors/parse-community","https://opencollective.com/parse-server"],"categories":["JavaScript"],"sub_categories":[],"readme":"# Parse Server S3 File Adapter \u003c!-- omit in toc --\u003e\n\n[![Build Status](https://github.com/parse-community/parse-server-s3-adapter/actions/workflows/ci.yml/badge.svg)](https://github.com/parse-community/parse-server-s3-adapter/actions/workflows/ci.yml)\n[![Snyk Badge](https://snyk.io/test/github/parse-community/parse-server-s3-adapter/badge.svg)](https://snyk.io/test/github/parse-community/parse-server-s3-adapter)\n[![Coverage](https://img.shields.io/codecov/c/github/parse-community/parse-server-s3-adapter/master.svg)](https://codecov.io/github/parse-community/parse-server-s3-adapter?branch=master)\n[![auto-release](https://img.shields.io/badge/%F0%9F%9A%80-auto--release-9e34eb.svg)](https://github.com/parse-community/parse-server-s3-adapter/releases)\n\n[![Parse Server](https://img.shields.io/badge/Parse_Server-8,_9-169CEE.svg?style=flat\u0026logo=data:image/svg%2bxml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJ1dWlkLTg2MzQ2MDY1LTNjNjQtNDBlYy1hNmQ0LWUyNzZmM2E0Y2U5MiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMTExMy42NiAxMDk5LjQyIj48ZyBpZD0idXVpZC04MWRmNWUyZC04YWQyLTQwMmEtYTNlZS1hYjE2YTQ5NjhhNjciPjxwYXRoIGQ9Ik00ODUuMDMsNzg1LjE0Yy04MC4zMSwwLTE2MC42MS0uMDktMjQwLjkyLjA3LTE5LjY5LjA0LTM4Ljk2LDIuODUtNTYuODksMTEuODYtMzAuNjEsMTUuMzktNDYuMjQsNDAuODYtNTAuNTEsNzQuMTctMS43OCwxMy44Ny0xLjA3LDI3LjUzLDIuNCw0MS4wNyw5Ljg4LDM4LjYxLDQwLjk3LDYzLDgwLjc3LDYzLjYxLDE0LjQ4LjIyLDI4LjYtMS4xMyw0Mi4xOC02LjU3LDIyLjIxLTguODksMzcuNjgtMjQuNjksNDcuNTUtNDYuMjIsNS43LTEyLjQ0LDguNzgtMjUuNiwxMC4wMy0zOS4yMS43LTcuNjUsMS4zNC04LjM5LDkuMDctOC40LDM5LjExLS4wNiw3OC4yMi0uMDYsMTE3LjMzLDAsNy44MS4wMSw4LjcuNzcsOC4yNSw4LjYxLTEuNSwyNS45LTYuMjYsNTEuMTktMTQuOTUsNzUuNjgtOS44OSwyNy44OC0yNC41Miw1Mi45Ni00NC44OCw3NC40OS0xMi4wNiwxMi43NS0yNS44NiwyMy41LTQxLDMyLjM2LTI3LjYxLDE2LjE3LTU3LjU2LDI1LjU0LTg5LjIxLDI5LjYzLTE2LjAzLDIuMDctMzIuMTMsMy41Ni00OC4zMiwyLjk5LTUxLjA1LTEuODEtOTguMTktMTUuMzItMTM4LjkyLTQ3LjM1LTI5LjE4LTIyLjk0LTUwLjIzLTUxLjkxLTYzLjE2LTg2LjczQzQuNDksOTQwLjAzLjIsOTE0LjAyLDAsODg3LjEyYy0uMi0yNy4zOSwzLjIzLTU0LjA2LDEyLjA0LTgwLjAxLDE2LjE1LTQ3LjU1LDQ2LjA0LTg0LjIyLDg4LjM3LTExMC44NSwzMy41LTIxLjA4LDcwLjM1LTMyLjQxLDEwOS41MS0zNi43NiwxOC45My0yLjEsMzcuOTEtMi43OCw1Ni45NS0yLjc4LDE0Ni4wMS4wNiwyOTIuMDItLjE0LDQzOC4wMy4xNCw0MC43OC4wOCw3OS44OC03LjIsMTE3LjEzLTIzLjY0LDUxLjQ0LTIyLjcsOTEuNi01OC4yNSwxMTkuNzUtMTA3LjA4LDE5LjE3LTMzLjI3LDI5Ljk3LTY5LjE0LDMzLjU2LTEwNy4zNSw0LjI0LTQ1LjEyLS42My04OS4xNy0xNi44LTEzMS40Ni0yOS4xNS03Ni4xOS04My4xMS0xMjUuOTUtMTYxLjc0LTE0OC41NS0zMC42OC04LjgxLTYyLjExLTExLjExLTkzLjc0LTkuMDMtNTAuMzEsMy4zMS05Ni41MiwxOC45LTEzNy4wOCw0OS40MS0yNi45OCwyMC4zLTQ4Ljg5LDQ1LjI3LTY1LjkxLDc0LjQ3LTIzLjY0LDQwLjU2LTM2LjIsODQuNTgtNDEuMzYsMTMxLTIuMDUsMTguNDItMi45OSwzNi44NS0yLjkzLDU1LjM4LjEzLDM4LjA3LjA0LDc2LjEzLjA0LDExNC4yLDAsMi4zNS4xLDQuNy0uMDgsNy4wNC0uMzYsNC44Ny0xLjIzLDUuNjktNi4yMiw2LjA4LTEuODIuMTQtMy42NS4wNy01LjQ3LjA3LTM3LjU1LDAtNzUuMDksMC0xMTIuNjQsMC0xLjU2LDAtMy4xMy4wNS00LjY5LS4wNC01Ljk2LS4zMi02Ljc1LTEuMDgtNy4xMS02LjgyLS4wNi0xLjA0LS4wNC0yLjA5LS4wNC0zLjEzLjAyLTQ1LjYzLS44NC05MS4yOC4yOC0xMzYuODgsMS44MS03My44NSwxNi43My0xNDQuODQsNTAuNTQtMjExLjE0LDIxLjE3LTQxLjUxLDQ4LjY0LTc4LjQsODMuMi0xMDkuNzEsNDEuMzktMzcuNDksODguOTYtNjQuMjcsMTQyLjM5LTgwLjcxLDMwLjU1LTkuNCw2MS43NC0xNS4zNSw5My41My0xNy42NSw4MC4yMS01Ljc5LDE1Ny4wNSw2Ljg1LDIyOC42LDQ0Ljg3LDYzLjExLDMzLjU0LDExMi4wMSw4MS44OCwxNDYuNTUsMTQ0LjU1LDI0LjczLDQ0Ljg3LDM5LjE3LDkyLjk2LDQ1LjU3LDE0My43MSwzLjcxLDI5LjM4LDQuMjIsNTguODcsMi4yOSw4OC4yMS00LjU0LDY5LjI2LTI1LjQxLDEzMy4zOS02NC41LDE5MS4xMS0zNS41MSw1Mi40Mi04MS43Miw5Mi44OC0xMzcuNjgsMTIyLjM4LTQ1LjQ5LDIzLjk4LTkzLjg4LDM4LjY1LTE0NC43NSw0NS4zNC0xOS4zOCwyLjU1LTM4Ljg3LDMuNzQtNTguNDYsMy43LTc0LjA1LS4xNi0xNDguMS0uMDYtMjIyLjE0LS4wNloiIHN0eWxlPSJmaWxsOiNlMGUwZTA7Ii8+PC9nPjwvc3ZnPg==)](https://github.com/parse-community/parse-server/releases)\n[![Node Version](https://img.shields.io/badge/nodejs-20,_22,_24-green.svg?logo=node.js\u0026style=flat)](https://nodejs.org)\n\n[![npm latest version](https://img.shields.io/npm/v/@parse/s3-files-adapter.svg)](https://www.npmjs.com/package/@parse/s3-files-adapter)\n\n---\n\nThe official AWS S3 file storage adapter for Parse Server. See [Parse Server S3 File Adapter Configuration](https://docs.parseplatform.org/parse-server/guide/#configuring-s3adapter) for more details. \n\n---\n\n- [Getting Started](#getting-started)\n  - [Installation](#installation)\n  - [Compatibility](#compatibility)\n    - [Parse Server](#parse-server)\n    - [Node.js](#nodejs)\n  - [AWS Credentials](#aws-credentials)\n  - [Deprecated Configuration](#deprecated-configuration)\n- [Usage with Parse Server](#usage-with-parse-server)\n  - [Parameters](#parameters)\n  - [Using a Config File](#using-a-config-file)\n  - [Using Environment Variables](#using-environment-variables)\n  - [Passing as an Instance](#passing-as-an-instance)\n  - [Adding Metadata and Tags](#adding-metadata-and-tags)\n- [Compatibility with other Storage Providers](#compatibility-with-other-storage-providers)\n  - [Digital Ocean Spaces](#digital-ocean-spaces)\n- [Migration Guide from 3.x to 4.x](#migration-guide-from-3x-to-4x)\n  - [AWS IAM Permissions](#aws-iam-permissions)\n  - [Passing S3 Credentials](#passing-s3-credentials)\n\n\n# Getting Started\n\n## Installation\n\n`npm install --save @parse/s3-files-adapter`\n\n## Compatibility\n\n### Parse Server\n\nParse Server S3 Adapter is compatible with the following versions of Parse Server.\n\n| Parse Server Version | End-of-Life   | Compatible |\n|----------------------|---------------|------------|\n| \u003c=5                  | December 2023 | ❌ No       |\n| 6                    | December 2024 | ❌ No       |\n| \u003c7.3.0               | December 2025 | ❌ No       |\n| \u003e=7.3.0              | December 2025 | ✅ Yes      |\n\n### Node.js\n\nParse Server S3 Adapter is continuously tested with the most recent releases of Node.js to ensure compatibility. We follow the [Node.js Long Term Support plan](https://github.com/nodejs/Release) and only test against versions that are officially supported and have not reached their end-of-life date.\n\n| Node.js Version | End-of-Life | Compatible |\n|-----------------|-------------|------------|\n| 20              | April 2026  | ✅ Yes      |\n| 22              | April 2027  | ✅ Yes      |\n| 24              | April 2028  | ✅ Yes      |\n\n## AWS Credentials\n\n⚠️ The ability to explicitly pass credentials to this adapter is deprecated and will be removed in a future release.\n\nYou may already be compatible with this change.  If you have not explicitly set an `accessKey` and `secretKey` and you have configured the environment variables `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`, then you're all set and this will continue to work as is.\n\nIf you explicitly configured the environment variables `S3_ACCESS_KEY`\n`S3_SECRET_KEY`\n\n*OR*\n\nIf you explicitly configured the `accessKey` and `secretKey` in your adapter configuration, then you'll need to...\n\nFor non AWS hosts:\n\n*  Run `aws configure` in a terminal which will step you through configuring credentials for the AWS SDK and CLI\n\nFor an AWS host:\n\n*  Ensure that the role that your host is running as has permissions for your s3 bucket\n\n*Then*\n\n*  remove the `accessKey` and `secretKey` from your configuration\n\nIf for some reason you really need to be able to set the key and secret explicitly, you can still do it using `s3overrides` as described below and setting `accessKeyId` and `secretAccessKey` in the `s3Overrides` object.\n\n## Deprecated Configuration\n\nAlthough it is not recommended, AWS credentials can be explicitly configured through an options\nobject, constructor string arguments or environment variables ([see below](#using-a-config-file)).\nThis option is provided for backward compatibility and will be removed in the forthcoming version 2.0 of this adapter.\n\nThe preferred method is to use the default AWS credentials pattern.  If no AWS credentials are explicitly configured, the AWS SDK will look for credentials in the standard locations used by all AWS SDKs and the AWS CLI. More info can be found in [the docs](http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html#config-settings-and-precedence).  For more information on AWS best practices, see [IAM Best Practices User Guide](http://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html).\n\n# Usage with Parse Server\n\n## Parameters\n\n*(This list is still incomplete and in the works, in the meantime find more descriptions in the chapters below.)*\n\n| Parameter             | Optional | Default value | Environment variable     | Description                                                                                                                                                                                                                                                                                                                                                                     |\n|-----------------------|----------|---------------|--------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `fileAcl`             | yes      | `undefined`   | S3_FILE_ACL              | Sets the [Canned ACL](https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl) of the file when storing it in the S3 bucket. Setting this parameter overrides the file ACL that would otherwise depend on the `directAccess` parameter. Setting the value `'none'` causes any ACL parameter to be removed that would otherwise be set.                     |\n| `presignedUrl`        | yes      | `false`       | S3_PRESIGNED_URL         | If `true` a [presigned URL](https://docs.aws.amazon.com/AmazonS3/latest/dev/ShareObjectPreSignedURL.html) is returned when requesting the URL of file. The URL is only valid for a specified duration, see parameter `presignedUrlExpires`.                                                                                                                                     |\n| `presignedUrlExpires` | yes      | `undefined`   | S3_PRESIGNED_URL_EXPIRES | Sets the duration in seconds after which the [presigned URL](https://docs.aws.amazon.com/AmazonS3/latest/dev/ShareObjectPreSignedURL.html) of the file expires. If no value is set, the AWS S3 SDK default [Expires](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getSignedUrl-property) value applies. This parameter requires `presignedUrl` to be `true`. |\n\n## Using a Config File\n\n```\n{\n  \"appId\": 'my_app_id',\n  \"masterKey\": 'my_master_key',\n  // other options\n  \"filesAdapter\": {\n    \"module\": \"@parse/s3-files-adapter\",\n    \"options\": {\n      \"bucket\": \"my_bucket\",\n      // optional:\n      \"region\": 'us-east-1', // default value\n      \"bucketPrefix\": '', // default value\n      \"directAccess\": false, // default value\n      \"fileAcl\": null, // default value\n      \"baseUrl\": null, // string, function or async function\n      \"baseUrlDirect\": false, // default value\n      \"signatureVersion\": 'v4', // default value\n      \"globalCacheControl\": null, // default value. Or 'public, max-age=86400' for 24 hrs Cache-Control\n      \"presignedUrl\": false, // Optional. If true a presigned URL is returned when requesting the URL of file. The URL is only valid for a specified duration, see parameter `presignedUrlExpires`. Default is false.\n      \"presignedUrlExpires\": null, // Optional. Sets the duration in seconds after which the presigned URL of the file expires. Defaults to the AWS S3 SDK default Expires value.\n      \"ServerSideEncryption\": 'AES256|aws:kms', //AES256 or aws:kms, or if you do not pass this, encryption won't be done\n      \"validateFilename\": null, // Default to parse-server FilesAdapter::validateFilename.\n      \"generateKey\": null // Will default to Parse.FilesController.preserveFileName\n    }\n  }\n}\n```\n***Note*** By default Parse.FilesController.preserveFileName will prefix all filenames with a random hex code.   You will want to disable that if you enable it here or wish to use S3 \"directories\".\n\n## Using Environment Variables\n\nSet your environment variables:\n\n```\nS3_BUCKET=bucketName\n```\n\nthe following optional configuration can be set by environment variable too:\n\n```\nS3_SIGNATURE_VERSION=v4\n```\n\nAnd update your config / options\n\n```\n{\n  \"appId\": 'my_app_id',\n  \"masterKey\": 'my_master_key',\n  // other options\n  \"filesAdapter\": \"@parse/s3-files-adapter\"\n}\n```\n\n\n## Passing as an Instance\n```\nvar S3Adapter = require('@parse/s3-files-adapter');\n\nvar s3Adapter = new S3Adapter(\n  'accessKey',\n  'secretKey',\n  'bucket',\n  {\n    region: 'us-east-1'\n    bucketPrefix: '',\n    directAccess: false,\n    baseUrl: 'http://images.example.com',\n    signatureVersion: 'v4',\n    globalCacheControl: 'public, max-age=86400',  // 24 hrs Cache-Control.\n    presignedUrl: false,\n    presignedUrlExpires: 900,\n    validateFilename: (filename) =\u003e {\n      if (filename.length \u003e 1024) {\n          return 'Filename too long.';\n        }\n        return null; // Return null on success\n    },\n    generateKey: (filename) =\u003e {\n      return `${Date.now()}_${filename}`; // unique prefix for every filename\n    }\n  }\n);\n\nvar api = new ParseServer({\n  appId: 'my_app',\n  masterKey: 'master_key',\n  filesAdapter: s3adapter\n})\n```\n**Note:** there are a few ways you can pass arguments:\n\n```\nS3Adapter(\"bucket\")\nS3Adapter(\"bucket\", options)\nS3Adapter(\"key\", \"secret\", \"bucket\") -- Deprecated, see notice above\nS3Adapter(\"key\", \"secret\", \"bucket\", options) -- Deprecated, see notice above\nS3Adapter(options) // where options must contain bucket.\nS3Adapter(options, s3overrides)\n```\nIf you use the last form, `s3overrides` are the parameters passed to [AWS.S3](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#constructor-property).\n\nIn this form if you set `s3overrides.params`, you must set at least `s3overrides.params.Bucket`\n\nor with an options hash\n\n```\nvar S3Adapter = require('@parse/s3-files-adapter');\n\nvar s3Options = {\n  \"bucket\": \"my_bucket\",\n  // optional:\n  \"region\": 'us-east-1', // default value\n  \"bucketPrefix\": '', // default value\n  \"directAccess\": false, // default value\n  \"baseUrl\": null // string, function or async function\n  \"signatureVersion\": 'v4', // default value\n  \"globalCacheControl\": null, // default value. Or 'public, max-age=86400' for 24 hrs Cache-Control\n  \"presignedUrl\": false, // default value\n  \"presignedUrlExpires\": 900, // default value (900 seconds)\n  \"validateFilename\": () =\u003e null, // Anything goes!\n  \"generateKey\": (filename) =\u003e filename,  // Ensure Parse.FilesController.preserveFileName is true!\n}\n\nvar s3Adapter = new S3Adapter(s3Options);\n\nvar api = new ParseServer({\n  appId: 'my_app',\n  masterKey: 'master_key',\n  filesAdapter: s3Adapter\n})\n```\n\n## Adding Metadata and Tags\n\nUse the optional options argument to add [Metadata](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/add-object-metadata.html) and/or [Tags](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/add-object-tags.html) to S3 objects\n\n```\n\n\nconst S3Adapter = require('@parse/s3-files-adapter');\n\nconst s3Options = {}; // Add correct options\nconst s3Adapter = new S3Adapter(s3Options);\n\nconst filename = 'Fictional_Characters.txt';\nconst data = 'That\\'s All Folks!';\nconst contentType = 'text/plain';\nconst tags = {\n  createdBy: 'Elmer Fudd',\n  owner: 'Popeye'\n};\nconst metadata = {\n  source: 'Mickey Mouse'\n};\nconst options = { tags, metadata };\ns3Adapter.createFile(filename, data, contentType, options);\n\n```\n\n**Note:** This adapter will **automatically** add the \"x-amz-meta-\" prefix to the beginning of metadata tags as stated in [S3 Documentation](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/add-object-metadata.html).\n\n\n# Compatibility with other Storage Providers\n\n## Digital Ocean Spaces\n\n```js\nvar S3Adapter = require(\"@parse/s3-files-adapter\");\nvar AWS = require(\"aws-sdk\");\n\n//Configure Digital Ocean Spaces EndPoint\nvar s3Options = {\n  bucket: process.env.SPACES_BUCKET_NAME,\n  baseUrl: process.env.SPACES_BASE_URL,\n  region: process.env.SPACES_REGION,\n  directAccess: true,\n  globalCacheControl: \"public, max-age=31536000\",\n  presignedUrl: false,\n  presignedUrlExpires: 900,\n  bucketPrefix: process.env.SPACES_BUCKET_PREFIX,\n  s3overrides: {\n    accessKeyId: process.env.SPACES_ACCESS_KEY,\n    secretAccessKey: process.env.SPACES_SECRET_KEY,\n    endpoint: process.env.SPACES_ENDPOINT\n  }\n};\n\nvar s3Adapter = new S3Adapter(s3Options);\n\nvar api = new ParseServer({\n  databaseURI: process.env.DATABASE_URI || \"mongodb://localhost:27017/dev\",\n  cloud: process.env.CLOUD_CODE_MAIN || __dirname + \"/cloud/main.js\",\n  appId: process.env.APP_ID || \"myAppId\",\n  masterKey: process.env.MASTER_KEY || \"\",\n  serverURL: process.env.SERVER_URL || \"http://localhost:1337/parse\",\n  logLevel: process.env.LOG_LEVEL || \"info\",\n  allowClientClassCreation: false,\n  filesAdapter: s3Adapter\n});\n```\n\n\n# Migration Guide from 3.x to 4.x\n\nDue to the deprecation of the AWS SDK v2, Parse Server S3 Adapter 4.x adopts the AWS SDK v3. When upgrading from Parse Server S3 Adapter 3.x to 4.x, consider the following changes:\n\n## AWS IAM Permissions\n\nIn version 4.x, when uploading a file, the adapter will automatically create the specified S3 bucket, if it doesn't exist yet. To find out whether the bucket already exists, it will send a `HEAD` request to AWS S3 to list the existing bucket. This request requires the AWS IAM permission `s3:ListBucket` on the bucket resource, for example:\n\n```json\n{\n  \"Effect\": \"Allow\",\n  \"Action\": [\n    \"s3:ListBucket\"\n  ],\n  \"Resource\": \"arn:aws:s3:::\u003cBUCKET_NAME\u003e\"\n}\n```\n\u003e [!NOTE]\n\u003e The specified resource needs to be the bucket ARN itself, no `/*` at the end, because it's a bucket-level permission, not object-level.\n\n## Passing S3 Credentials\n\nIn version 4.x the S3 credentials are passed differently:\n\n*Parse Server S3 Adapter 3.x:*\n\n```js\nconst options = {\n  bucket: '\u003cAWS_S3_BUCKET\u003e',\n  s3overrides: {\n    accessKeyId: '\u003cAWS_ACCESS_KEY\u003e',\n    secretAccessKey: '\u003cAWS_SECRET_KEY\u003e'\n  }\n};\n```\n\n*Parse Server S3 Adapter 4.x:*\n\n```js\nconst options = {\n  bucket: '\u003cAWS_S3_BUCKET\u003e',\n  s3overrides: {\n    credentials: {\n      accessKeyId: '\u003cAWS_ACCESS_KEY\u003e',\n      secretAccessKey: '\u003cAWS_SECRET_KEY\u003e'\n    }\n  }\n};\n```\n\nAlternatively, the credentials can be set on the root object:\n\n```js\nconst options = {\n  bucket: '\u003cAWS_S3_BUCKET\u003e',\n  credentials: {\n    accessKeyId: '\u003cAWS_ACCESS_KEY\u003e',\n    secretAccessKey: '\u003cAWS_SECRET_KEY\u003e'\n  }\n};\n```\n\n\u003e [!NOTE]\n\u003e It is best practice to not store credentials as environment variables, as they can be easily retrieved on a compromised machine. For Parse Server running in an AWS environment, use more secure alternatives like AWS Secrets Manager, or AWS Credential Identity Provider to access shared credentials:\n\u003e\n\u003e ```js\n\u003e import { fromIni } from 'aws-sdk/credential-providers';\n\u003e\n\u003e const options = {\n\u003e   bucket: '\u003cAWS_S3_BUCKET\u003e',\n\u003e   s3overrides: {\n\u003e     credentials: fromIni({ profile: '\u003cAWS_CLIENT_PROFILE\u003e' })\n\u003e   }\n\u003e };\n\u003e ```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fparse-community%2Fparse-server-s3-adapter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fparse-community%2Fparse-server-s3-adapter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fparse-community%2Fparse-server-s3-adapter/lists"}