{"id":13623020,"url":"https://github.com/axeloz/filesharing","last_synced_at":"2025-04-15T10:32:19.529Z","repository":{"id":22927203,"uuid":"97724743","full_name":"axeloz/filesharing","owner":"axeloz","description":"Self-hosted files sharing application, easy to setup, easy to use","archived":false,"fork":false,"pushed_at":"2024-04-02T20:03:15.000Z","size":9933,"stargazers_count":163,"open_issues_count":6,"forks_count":30,"subscribers_count":7,"default_branch":"main","last_synced_at":"2024-04-02T21:25:10.221Z","etag":null,"topics":["file-sharing","file-upload","laravel","php","uploader"],"latest_commit_sha":null,"homepage":"https://filesharing.box.webinno.fr","language":"PHP","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/axeloz.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","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},"funding":{"github":"axeloz"}},"created_at":"2017-07-19T14:17:15.000Z","updated_at":"2024-04-02T21:25:11.527Z","dependencies_parsed_at":"2024-03-17T19:49:33.172Z","dependency_job_id":null,"html_url":"https://github.com/axeloz/filesharing","commit_stats":null,"previous_names":[],"tags_count":22,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/axeloz%2Ffilesharing","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/axeloz%2Ffilesharing/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/axeloz%2Ffilesharing/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/axeloz%2Ffilesharing/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/axeloz","download_url":"https://codeload.github.com/axeloz/filesharing/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249051762,"owners_count":21204884,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["file-sharing","file-upload","laravel","php","uploader"],"created_at":"2024-08-01T21:01:27.085Z","updated_at":"2025-04-15T10:32:18.462Z","avatar_url":"https://github.com/axeloz.png","language":"PHP","readme":"# Files Sharing\n\n\u003e  \n\u003e FILES SHARING VERSION 2 JUST RELEASED\n\u003e  \n\n\n## Description\n\nThis PHP application based on Laravel 10.9 allows to share files like Wetransfer. You may install it **on your own server**. It **does not require** any database system, it works with JSON files into the storage folder. It is **multilingual** and comes with english, french, german and korean translations for now. You're welcome to help translating the app.\n\nThis application provides two links per bundle :\n- a bundle preview link : you can send this link to your recipients who will see the bundle content. For example: http://yourdomain/bundle/dda2d646b6746b96ea9b?auth=965242. The recipient can see all the files of the bundle and download the bundle as a ZIP archive.\n- a bundle download link : you can send this link yo your recipients who will download all the files of the bundle at once (without any preview). For example: http://yourdomain/bundle/dda2d646b6746b96ea9b/download?auth=965242.\n\nEach of these links comes with an authorization code. This code is the same for the preview and the download links.\n\nThe application also comes with a Laravel Artisan command as a background task who will physically remove expired bundle files of the storage disk. This command is configured to run every five minutes among the Laravel scheduled commands.\n\n## Features\n\n- **uploader access permission**: IP based or login/password\n- **bundle's settings**: title, description, expiration date, number max of downloads, password...\n- upload one or more files via drag and drop or via browsing your filesystem\n- ability to keep adding files to the bundle days later\n- sharing link with bundle content preview\n- download rate limiter\n- ability to download the entire bundle as ZIP archive (password protected when applicable)\n- direct download link (doesn't preview the bundle content)\n- garbage collector which removes the expired bundles as a background task\n- multilingual (EN, FR, DE and KR)\n- easy installation, **no database required**\n- secured by tokens, authentication codes and non-publicly-accessible files\n\n## Demo\n\n### Online Demo\n\nYou may visit my [Online Demo](https://filesharing.webinno.fr/)\n\n### Video Demo\n\nA video demo is available [on Youtube](https://youtu.be/hO4tRaZa4N4)\n\n### Screenshot\n\n![demo image](https://github.com/axeloz/filesharing/blob/main/public/images/capture.png \"Demo Image\")\n\n## Requirements\n\nBasically, nothing more than Laravel itself:\n- PHP \u003e= 8.1\n- Ctype PHP Extension\n- OpenSSL PHP Extension\n- PDO PHP Extension\n- Mbstring PHP Extension\n- Tokenizer PHP Extension\n- XML PHP Extension\n\nPlus:\n- JSON PHP Extension (included after PHP 5.2+)\n- ZipArchive PHP Extension (included after PHP 5.3+)\n- SQLite\n\nThe application also uses:\n- http://www.dropzonejs.com/\n- https://alpinejs.dev/\n- https://tailwindcss.com/\n- https://momentjs.com/\n- https://axios-http.com/\n- https://lodash.com/\n\n## Installation\n\n### Docker\n\nYou may now install FileSharing via Docker. \nSee [https://hub.docker.com/r/axeloz/filesharing](https://hub.docker.com/r/axeloz/filesharing)\n\n```\ndocker run -d \\\n-p 8080:80 \\\n-v \u003clocal_path\u003e:/app/storage/content \\\n--name filesharing \\\n-e APP_NAME=\"FileSharing\" \\\n-e APP_URL=\"\u003cyour_url\u003e\" \\\n-e ASSET_URL=\"\u003cyour_asset_url\u003e\" \\\n-e UPLOAD_MAX_FILESIZE=\"1G\" \\\n-e APP_TIMEZONE=\"Europe/Paris\" \\\n-e UPLOAD_PREVENT_DUPLICATES=true \\\n-e HASH_MAX_FILESIZE=\"1G\" \\\n-e UPLOAD_MAX_FILES=100 \\\n-e LIMIT_DOWNLOAD_RATE=\"100K\" \\\naxeloz/filesharing:latest\n```\n- use the `-v` option to bind your local storage to the docker instance (persisting data)\n- adapt the `-p` option to listen to the port you need\n- you may pass env variables with the `-e` option\n- you can use a reverse proxy for SSL termination (example: nginx)\n\nSimple config for Nginx:\n\n```\nserver {\n\tserver_name filesharing.box.webinno.fr;\n\tcharset utf-8;\n\n\tlocation / {\n\t\tproxy_set_header Host $host;\n\t\tproxy_set_header X-Real-IP $remote_addr;\n\t\tproxy_set_header   X-Forwarded-Proto $scheme;\n\t\tproxy_set_header   X-Scheme $scheme;\n\t\tproxy_pass http://localhost:8080;\n\t}\n\n\tlisten [::]:443 ssl http2;\n\tlisten 443 ssl http2;\n\tssl_certificate [...]\n\tssl_certificate_key [...]\n}\n```\n\nYou can also use in docker compose with the following template:\n\n```yaml\nversion: '3'\nservices:\n  app:\n    image: axeloz/filesharing:latest\n    environment:\n      UPLOAD_MAX_FILESIZE: \"1G\"\n      UPLOAD_MAX_FILES: \"100\"\n      UPLOAD_LIMIT_IPS: \"127.0.0.1\"\n      UPLOAD_PREVENT_DUPLICATES: true\n      HASH_MAX_FILESIZE: \"1G\"\n      LIMIT_DOWNLOAD_RATE: \"1M\"\n    volumes:\n      - files_v:/app/storage/content\n    ports:\n      - 8080:80\n\nvolumes:\n  files_v:\n    driver: local\n```\n\n\n### Standalone\n\n- configure your domain name. For example: files.yourdomain.com\n- clone the repo or download the sources into the webroot folder\n- configure your webserver to point your domain name to the `./public` folder\n- run `composer install`\n- run `yarn --production` (or `npm install --production`)\n- run `yarn build` (or `npm run build`)\n- make sure that the PHP process has write permission on the `./storage` folder\n- generate the Laravel KEY: `php artisan key:generate`\n- run `cp .env.example .env` and edit `.env` to fit your needs\n- (optional) you may create your first user `php artisan fs:user:create`\n- start the Laravel scheduler (it will delete expired bundles of the storage). For example `* * * * * /usr/bin/php /path-to-your-project/artisan schedule:run \u003e\u003e /dev/null 2\u003e\u00261`\n- (optional) to purge bundles manually, run `php artisan fs:bundle:purge`\n\n\nUse your browser to navigate to your domain name (example: files.yourdomain.com) and **that's it**.\n\n## Configuration\n\nIn order to configure your application, copy the .env.example file into .env. Then edit the .env file.\n\n| Configuration | Description |\n| ------------- | ----------- |\n| `APP_NAME`    | the title of the application |\n| `APP_ENV`     | change this to `production` when in production (`local` otherwise) |\n| `APP_DEBUG` | change this to `false` when in production (`true` otherwise) |\n| `APP_TIMEZONE` | change this to your current timezone |\n| `APP_LOCALE` | change this to \"fr\", \"en\", \"de\" or \"kr\" |\n| `UPLOAD_PREVENT_DUPLICATES` | Should the app block duplicate files (true / false) |\n| `HASH_MAX_FILESIZE`| max size for hashing file to check for duplicate files. If files are bigger than limit, they will not be hashed. Find the best value for better cpu / memory consumption |\n| `UPLOAD_MAX_FILES` | (*optional*) maximal number of files per bundle |\n| `UPLOAD_MAX_FILESIZE` | (*optional*) change this to the value you want (K, M, G, T, ...). Attention : you must configure your PHP settings too (`post_max_size`, `upload_max_filesize` and `memory_limit`). When missing, using PHP lowest configuration |\n| `UPLOAD_LIMIT_IPS` | (*optional*) a comma separated list of IPs from which you may upload files. Different formats are supported : Full IP address (192.168.10.2), Wildcard format (192.168.10.*), CIDR Format (192.168.10/24 or 1.2.3.4/255.255.255.0) or Start-end IP (192.168.10.0-192.168.10.10). When missing, filtering is disabled. |\n| `LIMIT_DOWNLOAD_RATE` | (*optional*) if set, limit the download rate. For instance, you may set `LIMIT_DOWNLOAD_RATE=100K` to limit download rate to 100Ko/s |\n\n\n## Authentication\n\nYou may provide a list of IPs to limit access to the upload feature.  \nOr you can create users with login/password credentials.   \nYou can also **mix the two methods**.\n\n\u003e  \n\u003e Warning: if your leave the `UPLOAD_LIMIT_IPS` empty and you don't create users, the upload will be publicly accessible\n\u003e  \n\n## Known issues\n\nIf you are using Nginx, you might be required to do additional setup in order to increase the upload max size. Check the Nginx's documentation for `client_max_body_size`.\n\n## Development\n\nIf your want to modify the sources, you can use the Laravel Mix features:\n- configure your domain name. For example: files.yourdomain.com\n- clone the repo or download the sources into the webroot folder\n- configure your webserver to point your domain name to the public/ folder\n- run a `composer install`\n- run a `yarn install`\n- run a `yarn dev` in order to recompile the assets when changed\n\n## Roadmap / Ideas / Improvements\n\nThere are many ideas to come. You are welcome to **participate**.\n- add PHP unit testing\n- more testing on heavy files\n- background process for creating Zips asynchronously after completion of the bundle\n- invitation to external users to upload file into existing bundle \n- customizable / white labeling (logo, name, terms of service, footer ...)\n\n## Licence\n\nGPLv3\n\n| Permissions     | Conditions                    | Limitations |\n| --------------- | ----------------------------- | ----------- |\n| Commercial use  | Disclose source               | Liability   |\n| Distribution    | License and copyright notice  | Warranty    |\n| Modification    | Same license                  |             |\n| Patent use      |  State changes                |             |\n| Private use     |                               |             |\n\nhttps://choosealicense.com/licenses/gpl-3.0/\n\n## Welcome on board\n\nIf you are willing to **participate** or if you just want to talk with me : axel@mabox.eu\n\n\nPowered by\n\u003cp\u003e\u003cimg src=\"https://laravel.com/assets/img/components/logo-laravel.svg\"\u003e\u003c/p\u003e\n","funding_links":["https://github.com/sponsors/axeloz"],"categories":["PHP","Software","File Sharing and Synchronization"],"sub_categories":["File Transfer - Single-click \u0026 Drag-n-drop Upload","E-commerce"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faxeloz%2Ffilesharing","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faxeloz%2Ffilesharing","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faxeloz%2Ffilesharing/lists"}