mirror of
https://github.com/projectsend/projectsend.git
synced 2026-09-22 19:43:24 +00:00
72749a9070
Updating had a numbered list inside INSTALL.md and a code block in the dashboard, and between them they were missing the step that decides whether an update works at all. Rehearsed both paths end to end against a real 2.0.0 install before writing any of this down. On Docker the whole update is `docker compose pull && docker compose up -d`: the entrypoint waits for the database, migrates, ensures the roles, and starts the workers, and it does not start nginx until that finishes — so a failed migration is a container that stays down rather than a half-updated site taking traffic. The generated APP_KEY on the storage volume is left alone. Verified: 69 migrations to 73, key unchanged, data intact, healthcheck healthy. The manual path is where the gap was. Replace the files, run the four documented commands, and the site still serves the old version: with `opcache.validate_timestamps=0` — what every production guide recommends, and what our own image ships — PHP never re-reads a file it has already compiled. The database is on the new version, every visitor is on the old code, and `php artisan` cheerfully reports the new version the whole time you are trying to work out why. Reproduced exactly that, then watched a php-fpm reload fix it. UPDATE.md is now the whole procedure for both, INSTALL.md keeps the short sequence with the reload added, and the in-app instructions gained the same line — in the code block, which is not translated, so no locale is left saying something different. Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
126 lines
5.7 KiB
Markdown
126 lines
5.7 KiB
Markdown
<p align="center">
|
|
<img src="public/favicon.svg" alt="" width="84">
|
|
</p>
|
|
|
|
<h1 align="center">ProjectSend</h1>
|
|
|
|
<p align="center">
|
|
<strong>Share files with your clients, from your own server.</strong>
|
|
</p>
|
|
|
|
<p align="center">
|
|
<a href="LICENSE"><img alt="License: GPL v2 or later" src="https://img.shields.io/badge/license-GPLv2%2B-3b5bdb"></a>
|
|
<img alt="PHP 8.4+" src="https://img.shields.io/badge/PHP-8.4%2B-777bb4">
|
|
<img alt="Self-hosted" src="https://img.shields.io/badge/self--hosted-Docker%20or%20zip-0b7285">
|
|
</p>
|
|
|
|
---
|
|
|
|
ProjectSend is a self-hosted application for getting files to the people you work with. You upload
|
|
what you want to send, choose exactly who can see it, and each client signs in to their own private
|
|
page to download it.
|
|
|
|
No public link passed around by email, no third-party service holding your clients' documents, no
|
|
per-seat pricing. It runs on your server, and the files stay there.
|
|
|
|
## What it does
|
|
|
|
**For the people you send to**
|
|
- A private area per client, showing only what has been shared with them
|
|
- Sign in with an email address, with optional two-factor authentication
|
|
- Search, filter and sort their files; download one, several as a zip, or a whole folder
|
|
- Optional comments on a file, so questions live next to the thing they are about
|
|
- Email notifications when something new arrives, in their own language
|
|
|
|
**For you**
|
|
- Resumable uploads that survive a dropped connection, so large files actually arrive
|
|
- Organise with folders, categories and client groups
|
|
- Share with one client, a whole group, or publicly — and set an expiry date or a download limit
|
|
- Thumbnails and previews for images and documents
|
|
- Storage quotas per client, and custom fields for the details you need to keep on them
|
|
- A full activity log and download history: who got what, and when
|
|
|
|
**For the installation**
|
|
- Roles and permissions for your own team, so an uploader is not an administrator
|
|
- Sign-in the way you already work: LDAP, social sign-in, or plain email and password
|
|
- Themes for the client-facing pages and for outgoing email
|
|
- 16 languages
|
|
- A REST API with scoped tokens and generated OpenAPI docs
|
|
- Privacy controls, including GDPR-grade account erasure with a grace period
|
|
- Local disk or S3-compatible storage
|
|
|
|
## Screenshots
|
|
|
|
<p align="center">
|
|
<img src=".github/screenshots/dashboard.png" alt="The dashboard: counters for files, clients and groups, the clients using the most storage against their quotas, a month of uploads and downloads as a line chart, and recent activity" width="900">
|
|
</p>
|
|
<p align="center"><em>The dashboard — what is in the installation, and what has been happening in it.</em></p>
|
|
|
|
<p align="center">
|
|
<img src=".github/screenshots/files.png" alt="The file library, showing folders and files with thumbnails, sharing status and download counts" width="900">
|
|
</p>
|
|
<p align="center"><em>Your library — folders, categories, and who each file is shared with.</em></p>
|
|
|
|
<p align="center">
|
|
<img src=".github/screenshots/portal.png" alt="A client's own page, listing the files shared with them with download buttons" width="900">
|
|
</p>
|
|
<p align="center"><em>What your client sees — only their files, nothing else.</em></p>
|
|
|
|
## Getting started
|
|
|
|
**With Docker** — the quickest path, and the one we recommend.
|
|
|
|
```sh
|
|
git clone https://github.com/projectsend/projectsend.git
|
|
cd projectsend
|
|
cp .env.example .env # set PROJECTSEND_EDITION=community
|
|
docker compose up -d
|
|
```
|
|
|
|
The app is at `http://localhost:8090`, and the first thing it shows you is a setup screen that
|
|
creates your administrator account.
|
|
|
|
Before you put real files in it, read **[DOCKER.md](DOCKER.md)** — where your database and uploads
|
|
actually live, how to move them onto paths you chose, and how to back them up so an upgrade can't
|
|
take them with it.
|
|
|
|
**Without Docker** — for servers where it isn't an option, install from a release zip.
|
|
**[INSTALL.md](INSTALL.md)** covers requirements, `.env`, nginx, the background worker and cron,
|
|
updating and troubleshooting. You do not need Composer or npm on the server; the zip ships ready to
|
|
run.
|
|
|
|
**Already running it?** **[UPDATE.md](UPDATE.md)** is how you move to a new version — one command
|
|
on Docker, a short sequence on your own server, and what to check afterwards either way.
|
|
|
|
## Coming from ProjectSend Legacy?
|
|
|
|
The previous generation of ProjectSend lives on at
|
|
[projectsend/legacy](https://github.com/projectsend/legacy). This is a rebuild rather than an
|
|
upgrade, so moving across is an import rather than an update — install fresh, then bring your old
|
|
site into it with the
|
|
[migration tool](https://github.com/projectsend/v1-migration-tool): accounts, clients, groups,
|
|
categories, folders, files and history.
|
|
|
|
It never writes to your old install, and any run can be undone with a single command.
|
|
**[MIGRATING-FROM-V1.md](MIGRATING-FROM-V1.md)** explains what comes across, the two routes
|
|
(same machine, or a portable export from a server you can't reach), and the one change your clients
|
|
will notice: they sign in with their email address now, using the same password.
|
|
|
|
## Contributing
|
|
|
|
Bug reports, translations and pull requests are all welcome — see
|
|
**[CONTRIBUTING.md](CONTRIBUTING.md)** for how to set up a development copy, what the checks are,
|
|
and the contributor agreement.
|
|
|
|
Found a security issue? Please report it privately through GitHub's security advisories rather than
|
|
opening a public issue.
|
|
|
|
## License
|
|
|
|
Free software under the **GNU General Public License v2, or (at your option) any later version** —
|
|
see [LICENSE](LICENSE). Use it, study it, change it, share it.
|
|
|
|
Commercial licenses are available for organizations that cannot work under copyleft terms;
|
|
[LICENSING.md](LICENSING.md) explains both options. Contributions require signing a CLA, for reasons
|
|
set out in [CONTRIBUTING.md](CONTRIBUTING.md).
|