{"id":42598986,"url":"https://github.com/nspcc-dev/send-fs-neo-org","last_synced_at":"2026-01-29T00:16:18.469Z","repository":{"id":178293096,"uuid":"317243600","full_name":"nspcc-dev/send-fs-neo-org","owner":"nspcc-dev","description":"Send.NeoFS is a simple example of integration with NeoFS network via HTTP protocol","archived":false,"fork":false,"pushed_at":"2025-06-27T16:49:03.000Z","size":1321,"stargazers_count":2,"open_issues_count":1,"forks_count":1,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-11-30T07:20:38.339Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://send.fs.neo.org/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nspcc-dev.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"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}},"created_at":"2020-11-30T14:10:01.000Z","updated_at":"2025-08-26T02:16:12.000Z","dependencies_parsed_at":"2025-04-03T15:31:17.357Z","dependency_job_id":"963eda31-61fb-4f2b-b533-f861a3345758","html_url":"https://github.com/nspcc-dev/send-fs-neo-org","commit_stats":null,"previous_names":["nspcc-dev/send-fs-neo-org"],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/nspcc-dev/send-fs-neo-org","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nspcc-dev%2Fsend-fs-neo-org","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nspcc-dev%2Fsend-fs-neo-org/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nspcc-dev%2Fsend-fs-neo-org/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nspcc-dev%2Fsend-fs-neo-org/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nspcc-dev","download_url":"https://codeload.github.com/nspcc-dev/send-fs-neo-org/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nspcc-dev%2Fsend-fs-neo-org/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28857412,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-28T22:56:21.783Z","status":"ssl_error","status_checked_at":"2026-01-28T22:56:00.861Z","response_time":57,"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":[],"created_at":"2026-01-29T00:16:17.216Z","updated_at":"2026-01-29T00:16:18.462Z","avatar_url":"https://github.com/nspcc-dev.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n\u003cimg src=\"./.github/logo.svg\" width=\"500px\" alt=\"NeoFS\"\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://fs.neo.org\"\u003eNeoFS\u003c/a\u003e is a decentralized distributed object storage integrated with the \u003ca href=\"https://neo.org\"\u003eNeo Blockchain\u003c/a\u003e.\n\u003c/p\u003e\n\n---\n![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/nspcc-dev/send-fs-neo-org?sort=semver)\n![License](https://img.shields.io/github/license/nspcc-dev/send-fs-neo-org.svg?style=popout)\n\n![Demo](./.github/demo.png)\n\n# Overview\n\nSend.NeoFS is a simple example of integration with NeoFS network via HTTP protocol. It allows to store your files in decentralized network for the selected period of time and share them via generated link. Send.NeoFS should be used for NeoFS public test only.\n\n# Requirements\n\n- docker\n- make\n- node (`18+`)\n\n# Make instructions\n\n* Compile the build using `make` (will be generated in `send.fs.neo.org` dir)\n* Start app using `make start PORT=3000` (PORT=3000 by default)\n* Clean up cache directories using `make clean`\n* Get release directory with tar.gz using `make release`\n\nSet variables in the `.env` file before executing the commands:\n- `VITE_NEOFS` - Path to SendFS\n\n# Send.NeoFS local up\n\n - Start [neofs-dev-env](https://github.com/nspcc-dev/neofs-dev-env)\n - Update `.env`\n - Execute `npm install`\n - Run local `npm run build`\n\n# Deployment to production\n\nTwo containers are used, one to store website data and another to store\nuploaded content. Then nginx is set up to use both for a single website.\n\n - Create container: `neofs-cli --rpc-endpoint st1.storage.fs.neo.org:8080 --config CONFIG_PATH container create --policy 'REP 2 IN X CBF 1 SELECT 4 FROM F AS X FILTER \"Deployed\" EQ \"NSPCC\" AS F' --basic-acl public-read --await`\n\nCONFIG_PATH – path to wallet config, wallet config example:\n```\nwallet: test.json\naddress: NWuFifWC3F5R9hY3xHyy9UvAAKxGgZfp4W\npassword: \u003csecret\u003e\n```\n - Update `/bin/upload.py` script with actual `cid`\n - Run `make`\n - Untar archive to separate dir\n - Copy `/bin/upload.py` to dir\n - Run `upload.py` to put send.fs to the NeoFS container\n - Create data container: `neofs-cli container create -r st1.storage.fs.neo.org:8080 --config CONFIG_PATH --basic-acl 0X0fbfbfff --policy 'REP 2 IN X CBF 2 SELECT 2 FROM F AS X FILTER Deployed EQ NSPCC AS F' --await`\n - Create EACL for it: `neofs-cli acl extended create --cid DATA_CID -r 'deny put others' -r 'deny delete others' --out eacl.json`\n - Set EACL for data container: `neofs-cli container set-eacl -r st1.storage.fs.neo.org:8080 --cid DATA_CID --table eacl.json --config CONFIG_PATH --await`\n - Update nginx.config to use new container in the production server\n\n# Nginx config example on the production server\n\n```Nginx\nproxy_cache_path /srv/neofs_cache/ levels=1:2 keys_zone=neofs_cache:50m max_size=16g inactive=60m use_temp_path=off;\n\nserver {\n\tset $cid 7CpJVtBdNvPjjdYwV7q9CghGVPagVLTs71BPQuGQLKSQ;\n\tset $data_cid 754iyTDY8xUtZJZfheSYLUn7jvCkxr79RcbjMt81QykC;\n\tset $neofs_rest_gateway https://rest.fs.neo.org;\n\tset $rpc rpc.morph.fs.neo.org:40341;\n\tclient_max_body_size 100m;\n\tproxy_connect_timeout 5m;\n\tproxy_send_timeout    5m;\n\tproxy_read_timeout    5m;\n\tsend_timeout          5m;\n\tdefault_type application/octet-stream;\n\n\tlocation ~ \"^\\/chain\" {\n\t\trewrite ^/chain/(.*) /$1 break;\n\t\tproxy_pass https://rpc;\n\t\tproxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_429 non_idempotent;\n\t}\n\n\tlocation /gate/objects/ {\n\t\trewrite ^/gate/(.*) /v1/objects/$data_cid break;\n\t\tproxy_pass $neofs_rest_gateway;\n\t\tproxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_429;\n\t\tproxy_pass_request_headers on;\n\t}\n\n\tlocation /gate/upload/ {\n\t\trewrite ^/gate/(.*) /v1/upload/$data_cid break;\n\t\tproxy_pass $neofs_rest_gateway;\n\t\tproxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_429;\n\t\tproxy_pass_request_headers on;\n\t\tproxy_set_header X-Attribute-email $http_x_attribute_email;\n\t\tproxy_set_header X-Attribute-NEOFS-Expiration-Epoch $http_x_attribute_neofs_expiration_epoch;\n\t}\n\n\tlocation ~ \"^\\/gate\\/get(/.*)?\\/?$\" {\n\t\trewrite ^/gate/get/(.*) /v1/objects/$data_cid/by_id/$1 break;\n\t\tproxy_pass $neofs_rest_gateway;\n\t\tproxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_429;\n\n\t\tproxy_intercept_errors on;\n\t\tproxy_cache_valid 404 0;\n\t\tproxy_cache_valid 200 15m;\n\t\tproxy_buffering on;\n\t\tproxy_cache neofs_cache;\n\t\tproxy_cache_methods GET;\n\t}\n\n\tlocation /signup_google/ {\n\t\tproxy_pass http://localhost:8084/login?service=google;\n\t\tproxy_intercept_errors on;\n\t\tproxy_buffering on;\n\t\tproxy_set_header Host              $http_host;\n\t\tproxy_set_header X-Real-IP         $remote_addr;\n\t\tproxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;\n\t\tproxy_set_header X-Forwarded-Proto $scheme;\n\t}\n\n\tlocation /signup_github/ {\n\t\tproxy_pass http://localhost:8084/login?service=github;\n\t\tproxy_intercept_errors on;\n\t\tproxy_buffering on;\n\t\tproxy_set_header Host              $http_host;\n\t\tproxy_set_header X-Real-IP         $remote_addr;\n\t\tproxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;\n\t\tproxy_set_header X-Forwarded-Proto $scheme;\n\t}\n\n\tlocation ~ \"^\\/callback\" {\n\t\trewrite ^/callback\\?(.*) /$1 break;\n\t\tproxy_pass http://localhost:8084;\n\t}\n\n\tlocation /load {\n\t\trewrite '^(/.*)$' /v1/objects/$cid/by_attribute/FileName/index.html break;\n\t\tproxy_pass $neofs_rest_gateway;\n\t\tproxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_429;\n\t\tinclude /etc/nginx/mime.types;\n\t}\n\n\tlocation /toc {\n\t\trewrite '^(/.*)$' /v1/objects/$cid/by_attribute/FileName/index.html break;\n\t\tproxy_pass $neofs_rest_gateway;\n\t\tproxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_429;\n\t\tinclude /etc/nginx/mime.types;\n\t}\n\n\tlocation / {\n\t\tproxy_pass https://$neofs_rest_gateway;\n\t}\n}\n```\n\n# License\n\n- [GNU General Public License v3.0](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnspcc-dev%2Fsend-fs-neo-org","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnspcc-dev%2Fsend-fs-neo-org","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnspcc-dev%2Fsend-fs-neo-org/lists"}