A self-hosted file sharing platform.

Overview


Pingvin Share

Pingvin Share is a self-hosted file sharing platform made for the Appwrite Hackathon.

πŸŽͺ Showcase

Demo: https://pingvin-share.dev.eliasschneider.com

✨ Features

  • Create a simple share with a link
  • Secure your share with a visitor limit and a password
  • Share your files with specific emails and send an invitation email
  • Dark mode

⌨️ Setup

At the moment, the setup is a bit time-consuming. I will improve the setup in the future.

1. Appwrite

Pingvin Share uses Appwrite as backend. You have to install and setup Appwrite first

  1. Install Appwrite
  2. Create an Account on your Appwrite instance
  3. Change the _APP_STORAGE_LIMIT variable in the .env file of Appwrite to your prefered max size limit per share

2. Frontend

First of all you have to start the Docker container.

  1. Clone the docker-compose.yml file and the .env.example file from this repository
  2. Rename the .env.example file to .env
  3. Start the container with docker-compose up -d

The container is now running. Now you have to setup the Appwrite structure, but no worries there is a simple setup script.

To run the script run docker-compose exec pingvin-share node scripts/setup.js.

You're almost done, now you have to change your environment variables that they fit to your setup.

  1. Go to your Appwrite console, visit "API Keys" and copy the "Functions API Key" secret to your clipboard.
  2. Paste the key to the APPWRITE_FUNCTION_API_KEY variable in the .env file
  3. Change PUBLIC_APPWRITE_HOST in the .env file to the host where your Appwrite instance runs
  4. Change the rest of the environment variables in the .env that they fit to your preferences
  5. To save the environment variables run docker-compose up -d
  6. Well done! Get a coffee and enjoy Pingvin Share πŸŽ‰

βš™οΈ Additional configurations

SMTP

  1. Enable PUBLIC_MAIL_SHARE_ENABLE in the .env file.
  2. Visit your Appwrite console, click on functions and select the Create Share function.
  3. At the settings tab change the empty variables to your SMTP setup.

πŸ’β€β™‚οΈ Known issues / Limitations

Pingvin Share is currently in beta and there are issues and limitations that should be fixed in the future.

  • DownloadAll generates the zip file on the client side. This takes alot of time. Because of that I temporarily limited this function to maximal 150 MB.
  • If a user knows the share id, he can list and download the files directly from the Appwrite API even if the share is secured by a password or a visitor limit.

πŸ–€ Contribute

You're very welcome to contribute to Pingvin Share! Contact me, create an issue or directly create a pull request.

Comments
  • SMTP

    SMTP

    For Pingvin Share, the email notification only seems to work with GMail's SMTP service. Would it be possible to get compatibility with SendGrid. Currently you request the smtp host, smtp email, smtp password, and smtp port. For SendGrid to work, there also needs to be a spot for the smtp username, which can be different than the smtp email.

    invalid 
    opened by gabeanelson 35
  • Customizable Mail Notification

    Customizable Mail Notification

    Hey,

    really love pingvin and the feature to send mail notifications for shares.
    Any chance we could define that notification message ourselves in a text box or something?

    feature waiting-for-release 
    opened by mztiq 10
  • Customer System

    Customer System

    Forgive the incorrect location for this. I saw your contributing section, but I don't have enough time at the moment to work on this, but I have thought about creating something similar for a few years without much success getting started.

    I think a key element for a system like this is to offer the ability to create a "my account" section for those that are downloading uploads. The use case is most folks (in my estimation, at least my own mileage) use systems like this to transfer files to customers (think creative content creators). I have a buddy who works for Viacom (BET, MTV, Comedy Central, etc.) as an imaging director for their TV/Radio commercials. He uses WeTransfer (paid version) so he can get information from the download(er) such as IP address, time/date of download, etc. to verify the product was collected. Further, he uses it when other customers (smaller promoters) attempt to say they didn't get a download and dispute the CC charge.

    Having a system that allows for a list of files that have been assigned to a user account so they can log in and see their past "content" would be an amazing feature, potentially even a paid feature.

    I don't know if this is possible with the structure you are creating or if even is an acceptable 'request'. Would love to help with the project in the future (as time and my wife permits).

    Cheers!

    feature 
    opened by dmkjr 9
  • Add .editorconfig for consistancy between contributors

    Add .editorconfig for consistancy between contributors

    I was working on issue #28 and I realized that my editor kept auto-formatting the code in a way that was different from the rest of the code. I think it would be a good idea to add a .editorconfig file so that contributors' IDEs and formatting stay consistent.

    editorconfig reference: https://editorconfig.org/

    opened by stautonico 8
  • 2 factor authentication

    2 factor authentication

    Hello, Is a 2 factor authentication for the admin planned ? so that the admin account is better protected ? with an authentication app. like google authenticator or Authy I would be happy if this could be implemented. Keep up the good work :)

    feature 
    opened by Ju17091 8
  • More granular expiration input.

    More granular expiration input.

    I wrote issue #8 and realized after I opened PR #11 that it would make much more sense to have even more granular expiration selection.

    Something like this: image

    Based on the source code, it shouldn't be too hard to implement. Maybe I can replace PR #11 with a feature like this?

    These lines could essentially stay exactly the same: https://github.com/stonith404/pingvin-share/blob/cde22f85ee785363bb0149347a2187c9166f4cb6/backend/src/share/share.service.ts#L38-L43

    Pretty much the only thing that would need to change would be: https://github.com/stonith404/pingvin-share/blob/b30269344db456a83b846247725fa9ea242e3d94/frontend/src/components/share/CreateUploadModalBody.tsx#L102-L115

    and a little bit of frontend logic.

    It could even be a little more advanced, giving a preview of the exact time the share would expire:

    image

    What do you think?

    opened by stautonico 8
  • πŸ› Bug Report: Pingvin Share breaks after upgrading to 0.5.1

    πŸ› Bug Report: Pingvin Share breaks after upgrading to 0.5.1

    πŸ‘Ÿ Reproduction steps

    Upgraded from 0.5.0 to 0.5.1 it quit working

    πŸ‘ Expected behavior

    It to work. Is 0.5.1 broke? Tried to downgrade docker to 0.5.0 and didn’t work either. Scratches head

    πŸ‘Ž Actual Behavior

    Doesn’t work; just 502

    🌐 Browser

    Safari

    bug 
    opened by blaine07 7
  • Improved docker image (size & speed)

    Improved docker image (size & speed)

    Resolves #30

    • Switched from node:slim to node:alpine
    • Better multi-stage build for caching (makes docker build faster in a lot of cases)
    • Corrected/improved builds (standalone, output-file-tracing, removing node modules)
    opened by Neyxo 7
  • New Feature: Granular Control of Expiration Date + 12/24 Hour Modes

    New Feature: Granular Control of Expiration Date + 12/24 Hour Modes

    New Features

    • Adds granular control of expiration date, being able to set a specific duration for when the share will expire (resolves #12) image
    • Adds the ability to disable the expiration date of a share (resolves #8)
    • Configurable 12/24 hour selection using the frontend's .env file

    What changed

    • Added some missing dependencies to package.json (it wouldn't run without)
    • Updated rx.js Without updating rx,js, an error was thrown when trying to access the database. (TypeError: (0 , rxjs_1.lastValueFrom) is not a function)
    • Replaced expiration dropdown with a numerical input and a dropdown for "unit selection" (minutes, hours, days, etc.)
    • Added the "Never" expiration checkbox option to the "create share" modal (disables numerical input when checked)
    • Added small tooltip under expiration selection previewing when the share would expire
    • Updated text (in the completed upload modal and shares page) to match the "never" expiration (text like "this share never "expires")
    • Updated backend to not automatically remove "never expires" shares
    • Fixed some various linting errors (mostly related to unused imports)
    • Added a new environment variable in the frontend to toggle between 12-hour and 24-hour date/time previews (used in several places)

    How was this implemented

    The customizable expiration date changes required no changes to the backend, only the frontend needed some changes.

    The "never" expiration date was implemented by using unix timestamp 0. Some manual exceptions were added to the backend to support the timestamp of 0. For example, backend/src/auth/jobs/jobs.service.ts line 20 (AND: [{expiration: {lt: new Date()}}, {expiration: {not: moment(0).toDate()}}]) now has a hardcoded exception to shares that have a expiration date of 0. There are several other changes very similar to this scattered around the backend.

    The 12/24 hour modes was implemented by simply importing next's runtime config options and checking the TWELVE_HOUR_TIME option, then printing the appropriate time format.

    Known Issues

    There is one known issue: entering an expiration date that is too long. Some values (999999 Years for example) break the date parsing in the backend. A quick fix to temporarily resolve this issue is to limit the expiration input to a smaller value (currently set to 99999, but should be adjusted in the near future.) A better fix is to handle this specific error in the backend and return an appropriate response, then showing a proper error message in the frontend instead of just displaying "Internal server error." This issue does not significantly affect application performance.

    opened by stautonico 7
  • This share can't be found. Please check your link.

    This share can't be found. Please check your link.

    1. upload a file
    2. generate link
    3. open link
    4. get error " This share can't be found. Please check your link."

    url - https://pingvin.MYDOMAIN.nl/share/SHARECODE

    opened by Sloth-on-meth 7
  • πŸš€ Feature: Persistent Login

    πŸš€ Feature: Persistent Login

    πŸ”– Feature description

    A user shouldn't have to log in every time they visit the page.

    There could be an option to "keep me logged in" when initially logging in that would create a cookie or JWT that would store the session.

    🎀 Pitch

    This would make uploading/downloading files easier for registered users, since they won't have to log in every time they access the page.

    feature waiting-for-release 
    opened by mochman 6
  • Feature: enforce expiration/limit for guest uploads

    Feature: enforce expiration/limit for guest uploads

    It would be great if admin could set default and separate limits for uploads from unregistered users, ie:

    • expiration time
    • file size limit
    • anonymous uploads per hour/day/week/month

    This would make it far more abuse resistant.

    opened by lockheed 4
  • πŸš€ Feature: Forgotten Password

    πŸš€ Feature: Forgotten Password

    πŸ”– Feature description

    You already have integrated mail functionality, it would be awesome to have the ability to reset a password in case the original is lost/forgotten. Sadly, I had this problem today.

    🎀 Pitch

    Most sites offer this, and it seems like it would be a good idea.

    Question to think about: How would this impact 2FA? Does resetting 2FA upon a forgotten password (probably the simplest approach) reduce the security of 2FA too much?

    feature 
    opened by jl-678 2
  • πŸš€ Feature: Add files from networkshare to pingvin-share

    πŸš€ Feature: Add files from networkshare to pingvin-share

    πŸ”– Feature description

    This feature would allow the admin to directly add files from his/her existing hard drives to Pingvin without uploading them to the instance.

    🎀 Pitch

    I make mod packs for games, and share photos, and family videos. This would allow me to attach network storage and grab a file on the drive without uploading it directly to Pingvin. I currently employ a Ceph cluster so having 3 copies of a single file on one my nodes is already enough. Adding a new VM and then uploading the file to it would mean I have 6 copies.

    I also am no developer so I couldn't tell you how to do this or the complexity of it I just think it would be a neat feature.

    feature 
    opened by Firebirdss80 1
  • πŸš€ Feature: Make

    πŸš€ Feature: Make "Password Protection" for shares mandatory

    πŸ”– Feature description

    It would be great to have the option (i.e. in Administration settings) to make the "Password Protection" field for shares mandatory.

    🎀 Pitch

    This way it would be possible to force your users to set Passwords for every share they create.

    feature 
    opened by mztiq 3
  • πŸš€ Feature: On share page, next to download button - copy direct link button

    πŸš€ Feature: On share page, next to download button - copy direct link button

    πŸ”– Feature description

    On share page, next to the download button/icon - it would be really nice to have a - copy direct link to file button/icon. You should be able to wget/curl the file in question for anywhere.

    🎀 Pitch

    It would be very useful to get a direct link to the file you want to download. That's useful when you open the link on a browser, but want to download the file on a remote computer via curl/wget etc.

    feature 
    opened by infestdead 8
  • πŸ› Bug Report: Upload returns 413 with cloudlfare tunnel

    πŸ› Bug Report: Upload returns 413 with cloudlfare tunnel

    πŸ‘Ÿ Reproduction steps

    When I try to upload larger file it will just stop after few seconds. I've set the maximum upload 10GB. I've tried to send 2.4GB file, ISO and I get the errors 403 and 413 in console. Using chrome to upload.

    πŸ‘ Expected behavior

    Upload normally.

    πŸ‘Ž Actual Behavior

    image image

    🌐 Browser

    Chrome

    bug 
    opened by vedranius 13
Releases(v0.5.1)
Owner
Elias Schneider
Elias Schneider
Self-hosted environment variable management platform

envplat - environment platform This project is under development. Please contact me for any information or collaboration. Self-hosted environment vari

Environment Platform 4 Apr 25, 2022
An open-source and self-hosted assessment platform for recruitment

This is a Next.js project bootstrapped with create-next-app. Getting Started First, run the development server: npm run dev # or yarn dev Open http://

Kaen 2 Oct 4, 2022
A fancy self-hosted monitoring tool

Uptime Kuma It is a self-hosted monitoring tool like "Uptime Robot". Features Monitoring uptime for HTTP(s) / TCP / Ping. Fancy, Reactive, Fast UI/UX.

Louis Lam 27.4k Jan 3, 2023
A self-hosted solution for backing up and viewing backed up mobile photos

Photostore Photostore is a self-hosted, client-server solution for backing up, viewing and downloading photos. How it works The Photostore API (writte

null 38 Oct 25, 2022
A self-hosted, customizable and ad-free Google Search experience

Giggle A self-hosted, customizable and ad-free Google Search experience. What does it do? Giggle lets you run Google searches against allow- and block

Dan Lovelace 213 Dec 15, 2022
CDK constructs for self-hosted GitHub Actions runners

GitHub Self-Hosted Runners CDK Constructs Use this CDK construct to create ephemeral self-hosted GitHub runners on-demand inside your AWS account. Eas

CloudSnorkel 134 Dec 20, 2022
⛺️ Tipi is a homeserver for everyone! One command setup, one click installs for your favorites self-hosted apps. ✨

⛺️ Tipi β€” A personal homeserver for everyone ⚠️ Tipi is still at an early stage of development and issues are to be expected. Feel free to open an iss

Nicolas Meienberger 4.9k Jan 4, 2023
An ultra-lightweight self-hosted CI solution with a dashboard and containerized runners

An extremely simple containerized CI server. Ecosystem The Candor ecosystem is straightforward, and entirely containerized. Docker runs on the host ma

Paul Huebner 8 Nov 20, 2022
A self-hosted solution for creating/managing forms and applications.

Centox - Self-hosted form website It is a self-hosted solution for creating/managing forms and applications. Users can login using their Discord Accou

Simon Maribo 11 Dec 26, 2022
Self-hosted TOTP authenticator PWA with FIDO2 (WebAuthn)

pasu Self-hosted TOTP authenticator PWA with FIDO2 (WebAuthn) Features 2FA secrets stored in your own server instead of your own device Codes are gene

γ‚½η‘ η’ƒ(soruly) 11 Nov 2, 2022
A self-hosted eBooks Library for your family or yourself.

What is BookStairs? BookStairs is an open-source personal EPUB library which was highly inspired by talebook, calibre-web and BookBrowser. It's design

BookStairs 5 Dec 29, 2022
SCAchat - A self-hosted chatting application

SCAchat is a self-hosted chatting application similar to AOL Instant Messenger. The chatting application is privacy-respecting and does not store any messages or user-data. Once a session has ended, all messages are gone.

Chadano 4 Jul 18, 2022
A self-hosted Thumbnail generator/finder which creates thumbnails based on folder names and google search results.

Thumba A self hosted Thumbnail generator/finder which creates thumbnails based on folder names and google search results. Description This project use

Norbert TakΓ‘cs 20 Dec 15, 2022
An open source, self-hosted, and entirely free solution to social media management.

An open source, self-hosted, and entirely free solution to social media management. Status ?? In Development ?? Shoutify is currently early in the dev

TechSquidTV 202 Dec 22, 2022
Self-hosted Slack bot to run your code snippets

slack-code-runner Self-hosted Slack bot to run your code snippets Prerequisites Docker Usage Create a new Slack app and add it to your workspace. You

Myeonghyeon Kim 5 Sep 14, 2022
A self-hosted streamable alternative

What is Clippy? Clippy is a self-hosted streamable alternative Usage docker-compose (recommended) version: '3' services: clippy: image: samfry13

Samuel Fry 2 Sep 17, 2022
Self-hosted open source social media marketing

OpenSMM Description OpenSMM(Open Social Media Marketing) is a self-hosted social media marketing platform built to assist small businesses manage thei

Vaughn 22 Dec 23, 2022
Decentralized video-sharing social media platform, built using Lens protocol. 🌿

Lenstube Decentralized video-sharing social media platform. lenstube.xyz About Lenstube is a decentralized video-sharing social media platform, built

Lenstube 2.4k Jan 1, 2023
API for P2P file sharing web application, Zed

zed-sharing-node Backend for file sharing app built with the MERN Stack Report Bug Β· Request Feature About The Project ??‍??️ This is the API for Zed,

Quavo 9 Nov 29, 2022