From a6807a681c8d87467821d9b0f1de696a73138d61 Mon Sep 17 00:00:00 2001 From: diced Date: Sat, 15 Feb 2025 16:44:40 -0800 Subject: [PATCH] feat: new readme --- README.md | 269 +++++++++++++++++++++++++++++++++++---- SECURITY.md | 15 +++ package.json | 2 +- public/zipline_small.png | Bin 0 -> 28216 bytes 4 files changed, 261 insertions(+), 25 deletions(-) create mode 100644 SECURITY.md create mode 100644 public/zipline_small.png diff --git a/README.md b/README.md index c79edb34..90b81ba2 100755 --- a/README.md +++ b/README.md @@ -1,37 +1,212 @@ -# Zipline 4 +
+ -> [!WARNING] -> This is a work in progress, the database is not final and is subject to change without a migration. +The next generation ShareX / File upload server -Roadmap for v4: https://diced.notion.site/Zipline-v4-Roadmap-058aceb8a35140e7af4c726560aa3db1?pvs=4 +![Stars](https://img.shields.io/github/stars/diced/zipline?logo=github&style=flat) +![Version](https://img.shields.io/github/package-json/v/diced/zipline?logo=git&logoColor=white&style=flat) +![GitHub last commit (branch)](https://img.shields.io/github/last-commit/diced/zipline/trunk?logo=git&logoColor=white&style=flat) +[![Discord](https://img.shields.io/discord/729771078196527176?color=%23777ed3&label=discord&logo=discord&logoColor=white&style=flat)](https://discord.gg/EAhCRfGxCF) -## Running Zipline v4 +![Build](https://img.shields.io/github/actions/workflow/status/diced/zipline/build.yml?logo=github&style=flat&branch=trunk) -Running v4 as of the latest commit is as simple as spinning up a docker container with a few of the required environment variables. +[v4.zipline.diced.sh](https://v4.zipline.diced.sh) | [v3.zipline.diced.sh](https://v3.zipline.diced.sh) -It is recommended to follow the guide available at [v4.zipline.diced.sh/docs/get-started/docker](https://v4.zipline.diced.sh/docs/get-started/docker). + -There is also a guide on how to run Zipline v4 without docker [here](https://v4.zipline.diced.sh/docs/get-started/source). +
+ +## Features + +- Setup Quickly: [Get Started with Docker](https://zipline.diced.sh/docs/get-started/docker) +- Configure +- Upload any file +- Folders +- Tags +- URL shortening +- Embeds +- Discord Webhooks +- HTTP Webhooks +- OAuth2 +- 2FA +- Passkeys +- Password Protection +- Image Compression +- Video Thumbnails +- API +- PWA +- Partial Uploads +- Invites +- Quotas +- Custom Themes +- ... and more! + +# Usage + +Visit [the docs](https://zipline.diced.sh/docs/get-started/docker) for a more in-depth guide on how to get started. + +## Install and Run with Docker + +This is the recommended way to run Zipline: + +```yml +services: + postgresql: + image: postgres:16 + restart: unless-stopped + env_file: + - .env + environment: + POSTGRES_USER: ${POSTGRESQL_USER:-zipline} + POSTGRES_PASSWORD: ${POSTGRESQL_PASSWORD:?POSTGRESSQL_PASSWORD is required} + POSTGRES_DB: ${POSTGRESQL_DB:-zipline} + volumes: + - pgdata:/var/lib/postgresql/data + healthcheck: + test: ['CMD', 'pg_isready', '-U', 'zipline'] + interval: 10s + timeout: 5s + retries: 5 + + zipline: + image: ghcr.io/diced/zipline + ports: + - '3000:3000' + env_file: + - .env + environment: + - DATABASE_URL=postgres://${POSTGRESQL_USER:-zipline}:${POSTGRESQL_PASSWORD}@postgresql:5432/${POSTGRESQL_DB:-zipline} + depends_on: + - postgresql + volumes: + - './uploads:/zipline/uploads' + - './public:/zipline/public' + - './themes:/zipline/themes' + +volumes: + pgdata: +``` + +### Volumes + +- `./uploads` - The folder where all the user uploads are stored (the default is `./uploads`) +- `./public` - The folder where all the public assets are stored (must mount to `/zipline/public`) +- `./themes` - The folder where all the custom themes are stored (must mount to `/zipline/themes`) + +### Generating Secrets + +```bash +echo "POSTGRESQL_PASSWORD=$(openssl rand -base64 42 | tr -dc A-Za-z0-9 | cut -c -32 | tr -d '\n')" > .env +echo "CORE_SECRET=$(openssl rand -base64 42 | tr -dc A-Za-z0-9 | cut -c -32 | tr -d '\n')" >> .env +``` + +Without the `CORE_SECRET` environment variable, Zipline will not start. + +### Changing where uploads are stored + +By default, Zipline will default to the `./uploads` folder, which is also reflected in the `docker-compose.yml` above. If you want to change this, you can set the `DATASOURCE_LOCAL_DIRECTORY` environment variable to a different path. + +```bash +DATASOURCE_LOCAL_DIRECTORY=/path/to/your/local/files +# or relative to the working directory +DATASOURCE_LOCAL_DIRECTORY=./relative/path/to/files +``` + +> [!NOTE] +> Remember to change volume mappings in the docker-compose.yml file if you change this. + +### Changing the port and hostname + +By default, Zipline binds to `0.0.0.0:3000`, which is also reflected in the `docker-compose.yml` above. If you want to change this, you can set the `CORE_PORT` and `CORE_HOSTNAME` environment variables to a different port and hostname. + +```bash +CORE_PORT=80 +CORE_HOSTNAME=localhost +``` + +> [!NOTE] +> If you change the port, you will need to update the `ports` section in the `docker-compose.yml` file. + +### Using S3 + +If you want to use S3 instead of the local filesystem, you can set the following environment variables: + +```bash +DATASOURCE_TYPE=s3 + +DATASOURCE_S3_ACCESS_KEY_ID=access_key_id +DATASOURCE_S3_SECRET_ACCESS_KEY=secret +DATASOURCE_S3_BUCKET=zipline +DATASOURCE_S3_REGION=us-west-2 +``` + +For more information, like other providers, see the [docs](https://zipline.diced.sh/docs/config/datasource#s3-datasource). + +### Starting Zipline + +Simply run the following command to start the server: + +```bash +docker compose up -d +``` + +You should be able to access the website at `http://localhost:3000` or the port you specified. + +## Manual Install + +See [docs](https://zipline.diced.sh/docs/get-started/source) for more information. + +# Migrating from v3 + +Zipline v4 was a complete rewrite, and as such, there is no upgrade path from v3 to v4. You will need to export your data from v3 and import it into v4. This process is made easier by the fact that v4 has a built-in importer to import data from v3. + +See [migration](https://zipline.diced.sh/docs/migrate) for more information. # Contributing -Here are some simple instructions to get Zipline v4 running and ready to develop on. +Contributions of any kind are welcome, whether they are bug reports, pull requests, or feature requests. -## Prerequisites +## Bug Reports + +Create an issue on GitHub and use the template, please include the following (if one of them is not applicable to the issue then it's not needed): + +- The steps to reproduce the bug +- Logs of Zipline +- The version of Zipline, and whether or not you are using Docker (include the image digest/tag if possible) +- Your OS & Browser including server OS +- What you were expecting to see +- How it can be fixed (if you know) + +## Feature Requests + +Create a discussion on GitHub, and please include the following: + +- Brief explanation of your feature in the title (very brief) +- How it would work (be detailed) + +## Pull Requests + +Create a pull request on GitHub. If your PR does not pass the action checks, then please fix the errors. If your PR was submitted before a release, and I have pushed a new release, please make sure to update your PR to reflect any changes, usually this is handled by GitHub. + +### Development + +Here's how to setup Zipline for development + +#### Prerequisites - nodejs (lts -> 20.x, 22.x) -- pnpm (9.x) +- pnpm (10.x) - a postgresql server -## Setup +#### Setup You should probably use a `.env` file to manage your environment variables, here is an example .env file with every available environment variable: -````bash +```bash DEBUG=zipline # required -CORE_SECRET="a secret" +CORE_SECRET="a secret that is 32 characters long" # required DATABASE_URL="postgresql://postgres:postgres@localhost:5432/zipline?schema=public" @@ -42,23 +217,23 @@ CORE_HOSTNAME=0.0.0.0 # one of these is required DATASOURCE_TYPE="local" -DATASOURCE_TYPE="s3" +# DATASOURCE_TYPE="s3" # if DATASOURCE_TYPE=local DATASOURCE_LOCAL_DIRECTORY="/path/to/your/local/files" # if DATASOURCE_TYPE=s3 -DATASOURCE_S3_ACCESS_KEY_ID="your-access-key-id" -DATASOURCE_S3_SECRET_ACCESS_KEY="your-secret-access-key" -DATASOURCE_S3_REGION="your-region" -DATASOURCE_S3_BUCKET="your-bucket" -DATASOURCE_S3_ENDPOINT="your-endpoint" # if using a custom endpoint other than aws s3 +# DATASOURCE_S3_ACCESS_KEY_ID="your-access-key-id" +# DATASOURCE_S3_SECRET_ACCESS_KEY="your-secret-access-key" +# DATASOURCE_S3_REGION="your-region" +# DATASOURCE_S3_BUCKET="your-bucket" +# DATASOURCE_S3_ENDPOINT="your-endpoint" +# ^ if using a custom endpoint other than aws s3 # optional but both are required if using ssl -SSL_KEY="/path/to/your/ssl/key" -SSL_CERT="/path/to/your/ssl/cert" - -```` +# SSL_KEY="/path/to/your/ssl/key" +# SSL_CERT="/path/to/your/ssl/cert" +``` Install dependencies: @@ -83,3 +258,49 @@ And to run the production version of Zipline: ```bash pnpm start ``` + +#### Making changes to the database schema + +Zipline uses [prisma](https://www.prisma.io/) as its ORM, and as such, you will need to use the prisma CLI to facilitate any changes to the database schema. + +Once you have made a change to `prisma.schema`, you can run the script `db:migrate` to generate a migration file. This script doesn't apply the migration, as Zipline handles applying migrations itself on startup. + +```bash +pnpm db:migrate +``` + +If you wish to push changes to the database without generating a migration file, you can run the script `db:prototype`. This is only recommended for testing purposes, and should not be used in production. + +```bash +pnpm db:prototype +``` + +#### Linting and Formatting + +Zipline will fail to build unless the code is properly formatted and linted. To format the code, you can run the following command: + +```bash +pnpm validate +``` + +#### Testing `zipline-ctl` + +To build the ctl, you can run the following command: + +```bash +pnpm build:server +``` + +then run any command you want + +```bash +pnpm ctl help +``` + +# Documentation + +Documentation is located at [zipline.diced.sh](https://zipline.diced.sh) and the source is located at [github.com/diced/zipline-docs](https://github.com/diced/zipline-docs). + +# Security + +Security issues are taken seriously, and should be reported via [GitHub Advisories](https://github.com/diced/zipline/security/advisories). For more information see the [security policy](SECURITY.md). diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..de3c69dd --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,15 @@ +# Security Policy + +## Supported Versions + +| Version | Supported | +| ------- | ------------------ | +| 4.x.x | :white_check_mark: | +| < 3 | :x: | +| < 2 | :x: | + +## Reporting a Vulnerability + +Report a Vulnerability [here](https://github.com/diced/zipline/security/advisories) (click Report a Vulnerability). Please include exact details with how to reproduce the vulnerability, and if possible, a proof of concept that demonstrates the vulnerability. + +<- Go [back](README.md#SECURITY) diff --git a/package.json b/package.json index 94fe3e91..590b2825 100755 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "zipline", "private": true, "license": "MIT", - "version": "4.0.0-dev+1", + "version": "4.0.0", "scripts": { "build": "pnpm run --stream \"/^build:.*/\"", "build:prisma": "prisma generate --no-hints", diff --git a/public/zipline_small.png b/public/zipline_small.png new file mode 100644 index 0000000000000000000000000000000000000000..ede3d46d6f8cde057d562bf0d4f27d8708c435bf GIT binary patch literal 28216 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 literal 0 HcmV?d00001