GithubHelp home page GithubHelp logo

stonith404 / pingvin-share Goto Github PK

View Code? Open in Web Editor NEW
1.9K 12.0 149.0 12.91 MB

A self-hosted file sharing platform that combines lightness and beauty, perfect for seamless and efficient file sharing.

License: BSD 2-Clause "Simplified" License

TypeScript 99.76% Dockerfile 0.19% JavaScript 0.05%
nextjs file-sharing self-hosted nestjs

pingvin-share's Introduction


Pingvin Share


Read this in another language: Spanish, English, Simplified Chinese, 日本語


Pingvin Share is self-hosted file sharing platform and an alternative for WeTransfer.

✨ Features

  • Share files using a link
  • Unlimited file size (restricted only by disk space)
  • Set an expiration date for shares
  • Secure shares with visitor limits and passwords
  • Email recipients
  • Integration with ClamAV for security scans

🐧 Get to know Pingvin Share

⌨️ Setup

Note: Pingvin Share is in its early stages and may contain bugs.

Installation with Docker (recommended)

  1. Download the docker-compose.yml file
  2. Run docker-compose up -d

The website is now listening on http://localhost:3000, have fun with Pingvin Share 🐧!

Stand-alone Installation

Required tools:

  • Node.js >= 16
  • Git
  • pm2 for running Pingvin Share in the background
git clone https://github.com/stonith404/pingvin-share
cd pingvin-share

# Checkout the latest version
git fetch --tags && git checkout $(git describe --tags `git rev-list --tags --max-count=1`)

# Start the backend
cd backend
npm install
npm run build
pm2 start --name="pingvin-share-backend" npm -- run prod

# Start the frontend
cd ../frontend
npm install
npm run build
API_URL=http://localhost:8080 # Set the URL of the backend, default: http://localhost:8080
pm2 start --name="pingvin-share-frontend" .next/standalone/server.js

Uploading Large Files: By default, Pingvin Share uses a built-in reverse proxy to reduce the installation steps. However, this reverse proxy is not optimized for uploading large files. If you wish to upload larger files, you can either use the Docker installation or set up your own reverse proxy. An example configuration for Caddy can be found in ./Caddyfile.

The website is now listening on http://localhost:3000, have fun with Pingvin Share 🐧!

Integrations

ClamAV (Docker only)

ClamAV is used to scan shares for malicious files and remove them if found.

  1. Add the ClamAV container to the Docker Compose stack (see docker-compose.yml) and start the container.
  2. Docker will wait for ClamAV to start before starting Pingvin Share. This may take a minute or two.
  3. The Pingvin Share logs should now log "ClamAV is active"

Please note that ClamAV needs a lot of ressources.

OAuth 2 Login

View the OAuth 2 guide for more information.

Additional resources

Upgrade to a new version

As Pingvin Share is in early stage, see the release notes for breaking changes before upgrading.

Docker

docker compose pull
docker compose up -d

Stand-alone

  1. Stop the running app

    pm2 stop pingvin-share-backend pingvin-share-frontend
  2. Repeat the steps from the installation guide except the git clone step.

    cd pingvin-share
    
    # Checkout the latest version
    git fetch --tags && git checkout $(git describe --tags `git rev-list --tags --max-count=1`)
    
    # Start the backend
    cd backend
    npm install
    npm run build
    pm2 restart pingvin-share-backend
    
    # Start the frontend
    cd ../frontend
    npm install
    npm run build
    API_URL=http://localhost:8080 # Set the URL of the backend, default: http://localhost:8080
    pm2 restart pingvin-share-frontend

Configuration

You can customize Pingvin Share like changing your domain by going to the configuration page in your admin dashboard /admin/config.

Environment variables

For installation specific configuration, you can use environment variables. The following variables are available:

Backend
Variable Default Value Description
PORT 8080 The port on which the backend listens.
DATABASE_URL file:../data/pingvin-share.db?connection_limit=1 The URL of the SQLite database.
DATA_DIRECTORY ./data The directory where data is stored.
CLAMAV_HOST 127.0.0.1 The IP address of the ClamAV server.
CLAMAV_PORT 3310 The port number of the ClamAV server.
Frontend
Variable Default Value Description
PORT 3000 The port on which the frontend listens.
API_URL http://localhost:8080 The URL of the backend for the frontend.

🖤 Contribute

Translations

You can help to translate Pingvin Share into your language. On Crowdin you can easily translate Pingvin Share online.

Is your language not on Crowdin? Feel free to Request it.

Any issues while translating? Feel free to participate in the Localization discussion.

Project

You're very welcome to contribute to Pingvin Share! Please follow the contribution guide to get started.

pingvin-share's People

Contributors

adriadam10 avatar dmytroonopa avatar fusengum avatar imgbotapp avatar ivanli-cn avatar konradfuchs avatar maurxce avatar mochman avatar neyxo avatar nosolohacking avatar pierrbt avatar rooyca avatar sevenflanks avatar stautonico avatar stonith404 avatar zz5840 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pingvin-share's Issues

Enable https on node.js frontend

Hi,
I love the project the team has started. I would love to see if possible if you can include docker environment variable to allow use of:

  • https
  • reference to location of key and cert files

This will allow application to run on https://somedomainname or https://someIPaddress instead of using a reverse proxy in front of application.

I tried to look for node.js file for frontend but was not able to locate it. I believe https can be activated in that file and possibly variables added that can point to cert and key files as an environment variable that can be passed by docker environment variables.

Appreciate your feedback.

Great work.

Thank you,

The link does not open through some email clients

👟 Reproduction steps

When I click on the link through the windows mail application, it sends me to an invalid link because the mail client considers the dot at the end of the link. However when I open the same email on the Gmail site directly it works.

Hey!
[USERNAME] shared some files with you. View or dowload the files with this link: https://exemple.com/share/UtNxQ6M.
Shared securely with Pingvin Share 🐧

I suggest just removing the dot at the end of the link, this will fix the issue on all affected email clients.

👍 Expected behavior

The link should work on all email clients

👎 Actual Behavior

This does not work on all clients because of the dot

🌐 Browser

Mail App Windows

🐛 Bug Report: Large file upload and login behind Reverse Proxy (nginx) not possible

👟 Reproduction steps

Pingvin is running fine with nginx + ssl with smaller files. I then tried to extend my max file size to 3Gb and uploaded a .rar with 2.2 GB.

👍 Expected behavior

Uploading large files with SSL and reverse proxy without error and creating a share you can download.

👎 Actual Behavior

  • Upload error (no specific error)
  • no share created
  • db entry has been created

This only happens with nginx and domain https://pingvin.domain.com

I have no issues in these cases:

  • uploading smaller files (just tried below 100Mb)
  • uploading large files via ip: http://10.0.0.1:3000

🌐 Browser

Firefox

🧑‍💻 Nginx Config

{
  "id": 18,
  "created_on": "2021-10-08T10:31:05.000Z",
  "modified_on": "2022-12-16T09:45:13.000Z",
  "owner_user_id": 1,
  "domain_names": [
    "pingvin.domain.com"
  ],
  "forward_host": "10.0.0.1",
  "forward_port": 3000,
  "access_list_id": 0,
  "certificate_id": 20,
  "ssl_forced": true,
  "caching_enabled": false,
  "block_exploits": true,
  "advanced_config": "",
  "meta": {
    "letsencrypt_agree": false,
    "dns_challenge": false
  },
  "allow_websocket_upgrade": false,
  "http2_support": true,
  "forward_scheme": "http",
  "enabled": 1,
  "locations": [],
  "hsts_enabled": true,
  "hsts_subdomains": false
}

Visiting Webseite with HTTP and not HTTPS

I write on the Environment of my docker container a https://URL but if you visit the website only on http the links are all http and not catching from the APP_URL= environment, a better checking for that can be cool.
after making a Force on HTTPS all is working.

Feature Request : Admin functionality

Hello,

Splitting my requests as asked in my initial one

I'd like to be able to have full control of the accounts created.
So, for example, the first account ever created would be the admin, account creation would be disabled, and I would be able to create account for people I know (That's how Jellyfin works for example).

Thanks !

Registration possible even if ALLOW_REGISTRATION=false is set

Hi,

even with

ALLOW_REGISTRATION=false

in the .env file, the "Get Started" button on the homepage redirects to /auth/signUp and multiple users can register.

Also I asked myself how to add a user, if registrations are not possible. Is there a cli program, that allows to add a user ?

Also, even when not showing the Homepage the /auth/signUp link is reachable and users can register.

Probably a wrong ENV variable --> process.env.NEXT_PUBLIC_DISABLE_REGISTRATION in signUp.tsx, should be !ALLOW_REGISTRATION

Apart from that, great work... ;)

🐛 Bug Report: Download with {"message":"Unauthorized"}

👟 Reproduction steps

Share a file.
Access the link
I click in "Download"

👍 Expected behavior

I should download a file.

👎 Actual Behavior

When I click in download a file a receive the {"message":"Unauthorized"}

🌐 Browser

Firefox & Chrome

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:

const expirationDate = moment()
.add(
share.expiration.split("-")[0],
share.expiration.split("-")[1] as moment.unitOfTime.DurationConstructor
)
.toDate();

Pretty much the only thing that would need to change would be:

<Select
label="Expiration"
{...form.getInputProps("expiration")}
data={[
{
value: "10-minutes",
label: "10 Minutes",
},
{ value: "1-hour", label: "1 Hour" },
{ value: "1-day", label: "1 Day" },
{ value: "1-week".toString(), label: "1 Week" },
{ value: "1-month", label: "1 Month" },
]}
/>

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?

"Reverse" shares (URL for file upload)

A feature that I would really like to see is the ability to generate a URL which allows for a one time file upload. This could be used in cases where you want someone to send you a file, but it is large so hard to send over discord/email.

It would work as such:

  1. The authenticated user generates a URL that leads to a file upload. (can have expiration, use count, etc.)
  2. The user sends the link to someone
  3. The other person can upload a file (ability to limit to specific size/mime type/file count, etc)
  4. The authenticated user can view all the files uploaded to that specific URL via the shares dashboard, or possibly another dashboard.

This feature should be limited to authenticated users only.

This missing feature is the only thing stopping me from deploying this on my own server, and I would love to see it.

If this is something that you would like implemented into the program, I don't mind doing it myself and opening a PR.

🐛 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

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: Chunked uploads

Amazing work so far and thanks for promptly fixing the bug I submitted. Compared to the old Mozilla Send project, you seem to have enhanced most of the core functionality.

The fork that I had been using (https://github.com/timvisee/send) seems to find a way around the CloudFlare tunnels 100MB upload limit. Given how popular it is as a reverse proxy, it would be great if you do the same in this project.

Direct port access on Pingvin I can already do unlimited uploads but through the CF reverse proxy I cannot. I recall something about chunked uploads to get around this.

🐛 Bug report: Database resets after upgrade

👟 Reproduction steps

I don't know if anyone else has this problem and if anyone can help me find the problem. I have installed Pingvin on my Synology. The Docker containers are automatically updated via Watchtower. Every time Watchtower Pingvin I lose all my settings in Pingvin.
App url and accounts are all gone then.
And I have to set up everything again

👍 Expected behavior

I don't know if it's my synology or the settings. All other containers are updated normally and do not lose their settings

👎 Actual Behavior

BF39E363-C82E-4C0F-9359-5B7DFCD24068

🌐 Browser

Firefox, Safari

Direct link to file

A awesome feature that you get a direkt link to the file, so you can post it on discord, steam, forums or what ever.

🚀 Feature: Add 2 Factor Authentication

🔖 Feature description

Given that files are being shared publicly, security is paramount. It would be great if you added 2FA as an option. Ideally, this would be configured at a user level. You could even have a setting to define the default authentication behavior for newly registered users. (e.g. 2FA or non-2FA).

🎤 Pitch

It is all about added security and protection. Having it as an option would keep the flexibility of not using for those who do not want to with the option to enable it for those users who do.

🐛 Bug Report: Login with mobile Firefox not possible (nginx + ssl)

👟 Reproduction steps

👍 Expected behavior

Get passed login and open upload page

👎 Actual Behavior

  • Login does not work
  • no error
  • stays on login form

Only happens with domain AND (!) an my mobile Firefox (iOS).
Safari ist fine! Also mobile Firefox via IP.

🌐 Browser

Mobile Firefox iOS

🧑‍💻 Nginx Config

{
  "id": 18,
  "created_on": "2021-10-08T10:31:05.000Z",
  "modified_on": "2022-12-16T09:45:13.000Z",
  "owner_user_id": 1,
  "domain_names": [
    "pingvin.domain.com"
  ],
  "forward_host": "10.0.0.1",
  "forward_port": 3000,
  "access_list_id": 0,
  "certificate_id": 20,
  "ssl_forced": true,
  "caching_enabled": false,
  "block_exploits": true,
  "advanced_config": "",
  "meta": {
    "letsencrypt_agree": false,
    "dns_challenge": false
  },
  "allow_websocket_upgrade": false,
  "http2_support": true,
  "forward_scheme": "http",
  "enabled": 1,
  "locations": [],
  "hsts_enabled": true,
  "hsts_subdomains": false
}

Upload for large files (>500MB) takes very long time

Hello,
I find your project very cool, wanted to test immediately because I needed exactly such a thing. I installed it with a docker-compose on my VPS, behind a reverse proxy (caddy).

Additional configuration after installation built in very nicely, ;) I liked it.

I have uploaded a couple of small data, with which it copes very well, but as for large data (>500) upload takes very long. I had to cancel the test because it took so long. Unfortunately, I could not find in the logs why this is so slow.

For comparison:
File: APP duration
800MB ----> pingvin------> infinite
800MB----->seafile------->59s

Tip:
It would be really cool to see the upload display in percent or time, then you know when how long you still have to wait.
Otherwise, really cool project, the Config is simple and clear.

🚀 Feature: File previews for videos, images, PDFs

🔖 Feature description

If the file(s) being shared are videos (e.g. mp4), allow the user to stream/preview the file. WeTransfer does this seamlessly for example.

🎤 Pitch

Perhaps there are multiple files shared and you only need one specific video. Without downloading them all, you can quickly preview/scrub/find the one you want before downloading. Or perhaps you simply want to do a remote playback without downloading anything, like streaming a video on Youtube.

🚀 Feature: Better configuration UI

🔖 Feature description

A configuration page that is very well structured by categories like security, email etc.
At the end the page should look and feel like a settings page not like a .env UI.

🎤 Pitch

The current configuration page should do the job but when we want to add more configuration options like custom branding, the configuration page gets really confusing.

🚀 Feature: Delete share once `Maximal views` are reached

🔖 Feature description

Not sure if it's a bug or a feature request but I just noticed that shares do not get deleted if the Maximal views are reached.
Since nobody can access the share after the Maximal views are reached anyways it would be great if the share and it's files then get removed or at least make it an option.

🎤 Pitch

Shares with Maximal views reached can't be accessed no more, IMO there is no point in keeping the share and it's files.

Expiration date of "Never"

It would be nice if there was an expiration date of "never" so that the share can be used at any time and manually deleted when no longer needed. If this is a feature you'd approve of, I wouldn't mind forking and creating a PR to implement it.

SQLite database is locked

Getting error see bellow:

Error: SQLite database error
database is locked
0: migration_core::state::ApplyMigrations
at migration-engine/core/src/state.rs:186
ready - started server on 0.0.0.0:3000, url: http://localhost:3000

[email protected] prod
prisma migrate deploy && prisma db seed && node dist/src/main
Prisma schema loaded from prisma/schema.prisma
Datasource "db": SQLite database "pingvin-share.db" at "file:../data/pingvin-share.db"
6 migrations found in prisma/migrations
Error: SQLite database error
database is locked
0: migration_core::state::ApplyMigrations
at migration-engine/core/src/state.rs:186

Default login email/password?

Hi,

I have the docker container running using docker-compose.yml

I'm able to access the login page, what is the default login email and password to use?

Feature: Allow unauthenticated uploads

There should be an option that allows to upload files without authentication.
This option can be enabled/disabled with an environment variable e.g ALLOW_ANONYMOUS_SHARES

Jobs don't get executed

I'm unclear if this should be done and my config is incorrect or this needs to be a feature request. Once an item expires or has reached the maximum views, can an option be created to clean up and wipe them from my drive? It will eventually have a lot of junk files otherwise. Thank you and love the work so far.

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 Request : Different quotas for anonymous and signed in users

Hello,

I'd like it if it was possible to put different settings when you're logged in and for when you're not logged in.
For example :

Logged in :

  • 5GB max size
  • Can change the expiration date

Logged off :

  • 5mb max size
  • Cannot change expiration date

Thanks !

Edit : Changed title/issue and made my requests into separate issues for easier tracking

Initial text of the issue Very good project I like it so far. I've installed it on UnRAID and it works perfectly, if anyone needs help with that I'll be happy to help. I've got a few requests if possible :

My domain is shared between my and my friends so we can share files with each others
I'd ideally want to manage things this way :

  • Manual account creation by the admin only (first account ever created for example? I don't know if the accounts have an ID or something)
  • Accounts can be created with usernames or email (so we don't need to share emails)
  • Share expiration/max size when not logged in is set and cannot be changed

I hope I'm not asking for too much
Thanks a lot for the work already done, I'll be following this project closely.

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 :)

🐛 Bug Report: Upload times out after 5 minutes

👟 Reproduction steps

When I upload a large file (minimum 8 GB recommended)

👍 Expected behavior

It should complete the upload

👎 Actual Behavior

After uploading like 6.5 GB it shows "An unknown error occurred" and the upload stops.
Also the temp file will remain in /uploads/_temp until I manually delete it.
Untitled

🌐 Browser

Chrome

🚀 Feature: virus scan for uploaded files from external sources

🔖 Feature description

hi, first I want to say, that pingvin-shares is an amazing software! Thank you very much! I like the requested feature for generating upload links for external but known people. but for this feature, i think it is also necessary to check the files for viruses or other malware in some way. Have there already been requests in this regard? best wishes Torsten

🎤 Pitch

Virus and malware scan for incoming files.

Copy to clipboard button not working

Hey the button, copy to clipboard are not working.
i got the notification "Your link was copied to the keyboard."
but if i paste it anywahre my clipboard is empty.

NVIDIA_Share_29-10-2022_23-20-33

NVIDIA_Share_29-10-2022_23-24-28

ok after changing my webserver to force HTTPS it is working.

Feature Request : Usernames instead of e-mails

Hello,

Splitting my requests as asked in my initial one

I'd like to be able for my users to only use usernames to create accounts/login, I don't really need to know their emails

Thanks !

Support CJK-character file names

Step to reproduce:

  1. Upload 測試.txt (lit. Test.txt) which contains CJK characters.
  2. Pingvin converts the filename to something like %E6%B8%AC%E8%A9%A6.txt

Expected behaviour:
Pingvin should never modify the filename, except the filename is illegal on server's filesystem.

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.

Reduce docker image size

Currently the docker image is around 500mb. This should be reduced with better multi stage building.

🚀 Feature: Add "Test Email" button to configuration screen

🔖 Feature description

I appreciate how you have added a custom username and password to the email configuration. It is helpful! The setup went smoothly, but I am missing a "Send test email" button. Clicking this would send an email and confirm that the entered email configuration is working and valid.

🎤 Pitch

Troubleshooting email issues is frustrating. While I can force sending an email by creating and deleting a share, it requires more work than needed. A simple button and associated message box would be really helpful. You click the button and PV tries to send an email and at a minimum it would say "Email sent successfully" or "email failed."

A more advanced approach could provide more status details in the message box based on the response for the email server. I could envision "Message Sent", "Invalid user id", "Invalid password" or stuff like that.

Unable to run setup script

In short: The setup script doesn't work on my setup.

Detail: So I followed the instructions and got my appwrite running on a reverse proxy (maybe that's the issue, if I need to connect to it via a local network, let me know) so for the hostname field I'm giving my public A record, but running into some 404 errors when running the pingvin-share setup script.

Here's the console output with UN/PW redacted:

anthony@DESKTOP-H8EKECL:~/pingvin$ docker-compose exec pingvin-share node scripts/setup.js

Welcome to the Pingvin Share Appwrite setup 👋
Please follow the questions and be sure that you ENTER THE CORRECT informations. Because the error handling isn't good.

Appwrite host (http://localhost/v1): https://appwrite.thenextweb.co.za
Authenticate...
Please enter your Appwrite credentials
Email: <Email>
Password: <Password>
Error: Request failed with status code 404
    at createError (/opt/app/scripts/setup.js:1581:15)
    at settle (/opt/app/scripts/setup.js:1861:12)
    at IncomingMessage.handleStreamEnd (/opt/app/scripts/setup.js:777:11)
    at IncomingMessage.emit (node:events:539:35)
    at endReadableNT (node:internal/streams/readable:1345:12)
    at processTicksAndRejections (node:internal/process/task_queues:83:21) {
  config: {
    transitional: {
      silentJSONParsing: true,
      forcedJSONParsing: true,
      clarifyTimeoutError: false
    },
    adapter: [Function: httpAdapter],
    transformRequest: [ [Function: transformRequest] ],
    transformResponse: [ [Function: transformResponse] ],
    timeout: 0,
    xsrfCookieName: 'XSRF-TOKEN',
    xsrfHeaderName: 'X-XSRF-TOKEN',
    maxContentLength: -1,
    maxBodyLength: -1,
    validateStatus: [Function: validateStatus],
    headers: {
      Accept: 'application/json, text/plain, */*',
      'Content-Type': 'application/json',
      cookie: 'a_session_console=undefined',
      'User-Agent': 'axios/0.26.1',
      'Content-Length': 66
    },
    baseURL: 'https://appwrite.thenextweb.co.za',
    method: 'post',
    url: '/account/sessions',
    data: '{"email":"<email>","password":"<password>"}'
  },
  request: <ref *1> ClientRequest {
    _events: [Object: null prototype] {
      abort: [Function (anonymous)],
      aborted: [Function (anonymous)],
      connect: [Function (anonymous)],
      error: [Function (anonymous)],
      socket: [Function (anonymous)],
      timeout: [Function (anonymous)],
      prefinish: [Function: requestOnPrefinish]
    },
    _eventsCount: 7,
    _maxListeners: undefined,
    outputData: [],
    outputSize: 0,
    writable: true,
    destroyed: false,
    _last: true,
    chunkedEncoding: false,
    shouldKeepAlive: false,
    maxRequestsOnConnectionReached: false,
    _defaultKeepAlive: true,
    useChunkedEncodingByDefault: true,
    sendDate: false,
    _removedConnection: false,
    _removedContLen: false,
    _removedTE: false,
    _contentLength: null,
    _hasBody: true,
    _trailer: '',
    finished: true,
    _headerSent: true,
    _closed: false,
    socket: TLSSocket {
      _tlsOptions: [Object],
      _secureEstablished: true,
      _securePending: false,
      _newSessionPending: false,
      _controlReleased: true,
      secureConnecting: false,
      _SNICallback: null,
      servername: 'appwrite.thenextweb.co.za',
      alpnProtocol: false,
      authorized: true,
      authorizationError: null,
      encrypted: true,
      _events: [Object: null prototype],
      _eventsCount: 10,
      connecting: false,
      _hadError: false,
      _parent: null,
      _host: 'appwrite.thenextweb.co.za',
      _readableState: [ReadableState],
      _maxListeners: undefined,
      _writableState: [WritableState],
      allowHalfOpen: false,
      _sockname: null,
      _pendingData: null,
      _pendingEncoding: '',
      server: undefined,
      _server: null,
      ssl: [TLSWrap],
      _requestCert: true,
      _rejectUnauthorized: true,
      parser: null,
      _httpMessage: [Circular *1],
      [Symbol(res)]: [TLSWrap],
      [Symbol(verified)]: true,
      [Symbol(pendingSession)]: null,
      [Symbol(async_id_symbol)]: 9,
      [Symbol(kHandle)]: [TLSWrap],
      [Symbol(lastWriteQueueSize)]: 0,
      [Symbol(timeout)]: null,
      [Symbol(kBuffer)]: null,
      [Symbol(kBufferCb)]: null,
      [Symbol(kBufferGen)]: null,
      [Symbol(kCapture)]: false,
      [Symbol(kSetNoDelay)]: false,
      [Symbol(kSetKeepAlive)]: true,
      [Symbol(kSetKeepAliveInitialDelay)]: 60,
      [Symbol(kBytesRead)]: 0,
      [Symbol(kBytesWritten)]: 0,
      [Symbol(connect-options)]: [Object],
      [Symbol(RequestTimeout)]: undefined
    },
    _header: 'POST /account/sessions HTTP/1.1\r\n' +
      'Accept: application/json, text/plain, */*\r\n' +
      'Content-Type: application/json\r\n' +
      'cookie: a_session_console=undefined\r\n' +
      'User-Agent: axios/0.26.1\r\n' +
      'Content-Length: 66\r\n' +
      'Host: appwrite.thenextweb.co.za\r\n' +
      'Connection: close\r\n' +
      '\r\n',
    _keepAliveTimeout: 0,
    _onPendingData: [Function: nop],
    agent: Agent {
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      defaultPort: 443,
      protocol: 'https:',
      options: [Object: null prototype],
      requests: [Object: null prototype] {},
      sockets: [Object: null prototype],
      freeSockets: [Object: null prototype] {},
      keepAliveMsecs: 1000,
      keepAlive: false,
      maxSockets: Infinity,
      maxFreeSockets: 256,
      scheduling: 'lifo',
      maxTotalSockets: Infinity,
      totalSocketCount: 1,
      maxCachedSessions: 100,
      _sessionCache: [Object],
      [Symbol(kCapture)]: false
    },
    socketPath: undefined,
    method: 'POST',
    maxHeaderSize: undefined,
    insecureHTTPParser: undefined,
    path: '/account/sessions',
    _ended: true,
    res: IncomingMessage {
      _readableState: [ReadableState],
      _events: [Object: null prototype],
      _eventsCount: 4,
      _maxListeners: undefined,
      socket: [TLSSocket],
      httpVersionMajor: 1,
      httpVersionMinor: 1,
      httpVersion: '1.1',
      complete: true,
      rawHeaders: [Array],
      rawTrailers: [],
      aborted: false,
      upgrade: false,
      url: '',
      method: null,
      statusCode: 404,
      statusMessage: 'Not Found',
      client: [TLSSocket],
      _consuming: true,
      _dumped: false,
      req: [Circular *1],
      responseUrl: 'https://appwrite.thenextweb.co.za/account/sessions',
      redirects: [],
      [Symbol(kCapture)]: false,
      [Symbol(kHeaders)]: [Object],
      [Symbol(kHeadersCount)]: 18,
      [Symbol(kTrailers)]: null,
      [Symbol(kTrailersCount)]: 0,
      [Symbol(RequestTimeout)]: undefined
    },
    aborted: false,
    timeoutCb: null,
    upgradeOrConnect: false,
    parser: null,
    maxHeadersCount: null,
    reusedSocket: false,
    host: 'appwrite.thenextweb.co.za',
    protocol: 'https:',
    _redirectable: Writable {
      _writableState: [WritableState],
      _events: [Object: null prototype],
      _eventsCount: 3,
      _maxListeners: undefined,
      _options: [Object],
      _ended: true,
      _ending: true,
      _redirectCount: 0,
      _redirects: [],
      _requestBodyLength: 66,
      _requestBodyBuffers: [],
      _onNativeResponse: [Function (anonymous)],
      _currentRequest: [Circular *1],
      _currentUrl: 'https://appwrite.thenextweb.co.za/account/sessions',
      [Symbol(kCapture)]: false
    },
    [Symbol(kCapture)]: false,
    [Symbol(kNeedDrain)]: false,
    [Symbol(corked)]: 0,
    [Symbol(kOutHeaders)]: [Object: null prototype] {
      accept: [Array],
      'content-type': [Array],
      cookie: [Array],
      'user-agent': [Array],
      'content-length': [Array],
      host: [Array]
    }
  },
  response: {
    status: 404,
    statusText: 'Not Found',
    headers: {
      server: 'nginx/1.23.1',
      date: 'Sat, 23 Jul 2022 02:12:21 GMT',
      'content-type': 'application/json; charset=UTF-8',
      'transfer-encoding': 'chunked',
      connection: 'close',
      'cache-control': 'no-cache, no-store, must-revalidate',
      expires: '0',
      pragma: 'no-cache',
      'x-debug-speed': '0.00039100646972656'
    },
    config: {
      transitional: [Object],
      adapter: [Function: httpAdapter],
      transformRequest: [Array],
      transformResponse: [Array],
      timeout: 0,
      xsrfCookieName: 'XSRF-TOKEN',
      xsrfHeaderName: 'X-XSRF-TOKEN',
      maxContentLength: -1,
      maxBodyLength: -1,
      validateStatus: [Function: validateStatus],
      headers: [Object],
      baseURL: 'https://appwrite.thenextweb.co.za',
      method: 'post',
      url: '/account/sessions',
      data: '{"email":"<email>","password":"<password>"}'
    },
    request: <ref *1> ClientRequest {
      _events: [Object: null prototype],
      _eventsCount: 7,
      _maxListeners: undefined,
      outputData: [],
      outputSize: 0,
      writable: true,
      destroyed: false,
      _last: true,
      chunkedEncoding: false,
      shouldKeepAlive: false,
      maxRequestsOnConnectionReached: false,
      _defaultKeepAlive: true,
      useChunkedEncodingByDefault: true,
      sendDate: false,
      _removedConnection: false,
      _removedContLen: false,
      _removedTE: false,
      _contentLength: null,
      _hasBody: true,
      _trailer: '',
      finished: true,
      _headerSent: true,
      _closed: false,
      socket: [TLSSocket],
      _header: 'POST /account/sessions HTTP/1.1\r\n' +
        'Accept: application/json, text/plain, */*\r\n' +
        'Content-Type: application/json\r\n' +
        'cookie: a_session_console=undefined\r\n' +
        'User-Agent: axios/0.26.1\r\n' +
        'Content-Length: 66\r\n' +
        'Host: appwrite.thenextweb.co.za\r\n' +
        'Connection: close\r\n' +
        '\r\n',
      _keepAliveTimeout: 0,
      _onPendingData: [Function: nop],
      agent: [Agent],
      socketPath: undefined,
      method: 'POST',
      maxHeaderSize: undefined,
      insecureHTTPParser: undefined,
      path: '/account/sessions',
      _ended: true,
      res: [IncomingMessage],
      aborted: false,
      timeoutCb: null,
      upgradeOrConnect: false,
      parser: null,
      maxHeadersCount: null,
      reusedSocket: false,
      host: 'appwrite.thenextweb.co.za',
      protocol: 'https:',
      _redirectable: [Writable],
      [Symbol(kCapture)]: false,
      [Symbol(kNeedDrain)]: false,
      [Symbol(corked)]: 0,
      [Symbol(kOutHeaders)]: [Object: null prototype]
    },
    data: {
      message: 'Not Found',
      code: 404,
      type: 'general_route_not_found',
      version: '0.15.2'
    }
  },
  isAxiosError: true,
  toJSON: [Function: toJSON]
}


 ❌ Error: Request failed with status code 404

Sorry, an error occured while the setup. The full logs can be found above.

Feature: Add email recipients

This feature should allow a user to enter email addresses while creating a share. On creation the entered email recipients should receive an email with the share link

Signup page accessible when it is Disabled

I have disabled signup page, but left the home page enabled.

The 'Get started' button leads to Signup page, but signup is disabled.

I would suggest that IF Home page is true, AND Signup if false, THEN Get Started button should lead to Sign in page or it should not be displayed at all.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.