Pingvin Share
Overview
Pingvin Share is an open-source, self-hosted file sharing platform and a privacy-friendly alternative to public file transfer services. You upload files, generate secure share links with optional passwords, expiration dates and view limits, and let recipients download without creating an account. Reverse shares let you invite others to upload files directly to you.
The SecureAnyCloud image delivers Pingvin Share fully installed and configured on Ubuntu 24.04, as a Next.js frontend and a NestJS backend on Node.js behind an nginx reverse proxy. A complete file sharing platform is running within minutes of launch. The image repackages the upstream open-source release (version 1.13.0) with SecureAnyCloud's provisioning and support.
What you get:
- Pingvin Share 1.13.0, built from source on Node.js 22 LTS
- nginx as a reverse proxy on port 80, forwarding
/api/*to the backend and everything else to the frontend, tuned for large uploads - All persistent data (the
pingvin-share.dbSQLite database and every uploaded share file) on a dedicated, independently resizable Azure data disk mounted at/data/pingvin - A per-VM administrator account created on first boot, with a random password written to a root-only file, so no default or shared login ships in the image
pingvin-share-backend.service,pingvin-share-frontend.serviceandnginx.serviceas systemd units, enabled and active- 24/7 SecureAnyCloud support
Pingvin Share is licensed under the BSD 2-Clause License. All product and company names are trademarks or registered trademarks of their respective holders.
Prerequisites
You need an active Azure subscription, an SSH key pair, and a VNet plus subnet in the target region.
Standard_D2s_v3 (2 vCPU / 8 GiB RAM) is a good starting point. Scale up for heavier upload activity or more users.
Configure the network security group (NSG) to allow inbound 22/tcp from your management network and 80/tcp (HTTP) from your users. Add 443/tcp if you enable HTTPS. The backend API on 8080 and the frontend on 3333 are private to the VM and never exposed by the NSG.
Step 1 - Deploy from the Azure Marketplace
Sign in to the Azure Portal, choose Create a resource, search the Marketplace for Pingvin Share by SecureAnyCloud, and select Create.
On the Basics tab, pick your subscription, resource group, region and size. Under Administrator account, choose SSH public key and paste your key. Under Inbound port rules, allow SSH (22) and HTTP (80).
Select Review + create, then Create.
Step 2 - Deploy from the Azure CLI
# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:pingvin-share-ubuntu-24-04:default:latest
az vm create \
--resource-group <your-rg> \
--name pingvin-share \
--image sac1647283583153:pingvin-share-ubuntu-24-04:default:latest \
--size Standard_D2s_v3 \
--admin-username azureuser \
--generate-ssh-keys \
--public-ip-sku StandardOpen HTTP so you can reach the web UI:
az vm open-port --resource-group <your-rg> --name pingvin-share --port 80 --priority 900Step 3 - Connect to your VM
Connect over SSH as the azureuser administrator:
ssh azureuser@<vm-public-ip>Step 4 - Confirm the services are running
The three services that back Pingvin Share should all report active. The unauthenticated /api/health health endpoint answers through nginx on port 80. Check both:
systemctl is-active pingvin-share-backend pingvin-share-frontend nginx curl -s http://127.0.0.1/api/health; echoExpect three lines of active, then OK. The frontend listens only on the loopback address 127.0.0.1:3333 and the backend on :8080. nginx on port 80 is the only exposed application port, so the app servers are never reachable directly from the network.
Step 5 - Retrieve your administrator password
On the first boot of every VM, a one-shot service (pingvin-share-firstboot.service) starts the backend. The backend creates the database, generates a fresh application secret unique to that VM, and registers an administrator account with a random password. No shared or default password ships in the image.
Read the credentials file as root:
sudo cat /root/pingvin-share-credentials.txtThe file (mode 0600, root only) contains the sign-in URL, the administrator username (admin) and the generated password.
You can verify the sign-in round trip from the VM's own shell. The command below reads the per-VM password and posts a real sign-in. A wrong password is rejected with HTTP 401, and the correct password answers HTTP 200:
PASS=$(sudo grep '^pingvin.admin.pass=' /root/pingvin-share-credentials.txt | cut -d= -f2-)
echo -n 'health -> HTTP '; curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1/api/health
echo -n 'bad pass -> HTTP '; curl -s -o /dev/null -w '%{http_code}\n' -X POST -H 'Content-Type: application/json' -d '{"username":"admin","password":"wrong"}' http://127.0.0.1/api/auth/signIn
echo -n 'admin -> HTTP '; curl -s -o /dev/null -w '%{http_code}\n' -X POST -H 'Content-Type: application/json' -d "{\"username\":\"admin\",\"password\":\"$PASS\"}" http://127.0.0.1/api/auth/signInExpect health -> HTTP 200, bad pass -> HTTP 401 and admin -> HTTP 200. The last result confirms that the password in the file signs in.
Step 6 - Sign in and create a share
Browse to http://<vm-public-ip>/, choose Sign in, and enter admin with the password from the credentials file.
To create a share, open Upload and drag your files into the drop zone. Optionally set a password, an expiration date and a visitor limit. Then generate a secure link to send to recipients.
Step 7 - Manage your shares and administer the platform
Open My shares to see every share you have created, copy or revoke its link, and track downloads. Reverse shares let you generate an upload link, so external parties can send files to you without an account.
As the administrator, you also get an Administration area. From User management, you can create additional users, grant or revoke admin rights, and remove accounts. The configuration section controls registration, SMTP email, OAuth providers and storage back ends.
Step 8 - Confirm the version, the stack and the data disk
Check the Node.js version, the health endpoint and the data disk mount:
node --version curl -s http://127.0.0.1/api/health; echo findmnt -no SOURCE,TARGET,FSTYPE /data/pingvinExpect Node.js v22, OK from the health endpoint, and /data/pingvin mounted from the dedicated data disk (/dev/sdc, ext4). The SQLite database and all uploaded files live on that disk. It is independently resizable and survives instance replacement. Resize it from the Azure portal if you need more room.
First-boot service and security model
A one-shot pingvin-share-firstboot.service runs after the network is up. It does the following:
- Starts the backend, which creates the SQLite database and seeds a fresh per-VM application secret.
- Registers an administrator with a random password through the application's own sign-up endpoint.
- Resolves the instance address from the Azure instance metadata service.
- Writes the credentials file at mode
0600(root only). - Drops a sentinel so it runs exactly once.
The image ships with an empty database and no usable login. The per-VM administrator is created on first boot. Verify the service state and the file permissions:
systemctl is-active pingvin-share-firstboot.service
sudo stat -c '%a %U:%G %n' /root/pingvin-share-credentials.txtExpect active, then 600 root:root /root/pingvin-share-credentials.txt.
Enabling HTTPS with your own domain
The image serves the web UI over plain HTTP on port 80. For a browser-trusted certificate, point a DNS record at the VM and open port 443 in the NSG. Then install a certificate from your CA, for example Let's Encrypt:
sudo apt-get update && sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.example.comCertbot updates the nginx site to serve your domain certificate. Pingvin Share is served behind the proxy on loopback, so no application configuration change is needed. Your file sharing platform is then reachable over HTTPS at your domain.
Backup and maintenance
Pingvin Share stores everything, including the pingvin-share.db database and every uploaded file, under /data/pingvin on the dedicated data disk, so a backup is a single directory. For a full point-in-time copy, snapshot the data disk and the OS disk from the Azure portal. Alternatively, archive the directory tree:
sudo tar -C /data -czf /var/backups/pingvin-$(date +%F).tar.gz pingvinKeep the OS current with sudo apt-get update && sudo apt-get upgrade. The image ships with unattended security updates enabled. Review the Pingvin Share documentation before moving between releases, and always back up before an upgrade.
Support
This image is backed by 24/7 SecureAnyCloud support. Support covers deployment and initial configuration, retrieving the first-boot administrator password, reverse proxy and TLS termination, SMTP email and OAuth provider configuration, S3-compatible storage back ends, SQLite database administration and backups, performance tuning, and storage administration.
Email sales@secureanycloud.com or use the live chat in the support portal. Critical issues receive a one-hour average response.
Deploy on Azure
Launch Pingvin Share on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.
View this image
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com
Overview
Pingvin Share is a self-hosted file sharing platform and a privacy-friendly alternative to public file transfer services. You upload files and generate secure share links with optional passwords, expiration dates and view limits, so recipients can download them without an account. Reverse shares let you invite others to upload files to you.
This image delivers Pingvin Share ready to run in your own VPC, with a per-instance administrator account created on first boot.
What you get:
- Pingvin Share built from source as two components: a Next.js frontend and a NestJS backend, both running on Node.js 22
- An SQLite database managed by Prisma
- An nginx reverse proxy on port 80 that routes
/apirequests to the backend and everything else to the frontend, mirroring the upstream reverse-proxy design - Both application components managed as systemd services that start automatically on boot
- No users and an empty database in the image. On the first boot of every instance, a one-shot service creates the database, generates a fresh application secret unique to that instance, and registers an administrator account with a random password
- Two instances launched from the same Amazon Machine Image never share an administrator password or application secret
- Administrator credentials written to
/root/pingvin-share-credentials.txtwith mode 0600, so only the root user can read them - The SQLite database and all uploaded share files under
/data/pingvin, on a dedicated EBS volume separate from the operating system disk, so the data tier can be resized independently
Prerequisites
Before you deploy this image, you need:
- An Amazon Web Services account where you can launch EC2 instances
- IAM permissions to launch instances, create security groups, and subscribe to AWS Marketplace products
- An EC2 key pair in the target Region for SSH access to the instance
- A VPC and subnet in the target Region, with a security group allowing inbound port 22 from your management network and inbound ports 80 and 443 from the networks your users will reach Pingvin Share on
- The AWS CLI (version 2) installed locally if you plan to deploy from the command line
Launch the Instance from the AWS Marketplace
Sign in to the AWS Management Console, open the EC2 service, and select Launch instance. Under Application and OS Images, choose AWS Marketplace AMIs and search for Pingvin Share. Select the SecureAnyCloud listing, choose Select, then choose Continue on the subscription summary.
Pick an instance type of m5.large or larger. Choose your EC2 key pair under Key pair (login). Under Network settings, select your VPC and subnet. Create or select a security group that allows inbound port 22 from your management network and inbound ports 80 and 443 from the networks your users use. Leave the root volume at the default size or larger.
Select Launch instance. First-boot initialization takes well under a minute after the instance state becomes Running and the status checks pass.
Launch the Instance from the AWS CLI
The following command launches an instance from the SecureAnyCloud Pingvin Share Marketplace AMI into an existing subnet and security group. Replace <ami-id> with the AMI ID shown on the Marketplace listing and <key-name> with your EC2 key pair name. Replace <subnet-id> with your subnet ID and <security-group-id> with a security group that opens ports 22, 80 and 443 as described above.
aws ec2 run-instances \
--image-id <ami-id> \
--instance-type m5.large \
--key-name <key-name> \
--subnet-id <subnet-id> \
--security-group-ids <security-group-id> \
--block-device-mappings '[{"DeviceName":"/dev/sda1","Ebs":{"VolumeSize":20,"VolumeType":"gp3"}}]' \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=pingvin-share-01}]'On success, the command prints a JSON document. Note the instance ID. Once the instance is running, retrieve its public address with aws ec2 describe-instances --instance-ids <instance-id> --query "Reservations[].Instances[].PublicIpAddress" --output text.
Connect and Retrieve the Administrator Credentials
Connect over SSH with the key pair you selected and the public IP address of your instance. The SSH login user depends on the operating system of the AMI variant you launched.
- Pingvin Share 1.13.0 on Ubuntu 24.04: the login user is
ubuntu
Connect as the Ubuntu user:
ssh -i <key-name>.pem ubuntu@<instance-public-ip>The administrator account is generated on first boot and written to a root-only file. Retrieve it with sudo:
sudo cat /root/pingvin-share-credentials.txtThe file contains the instance URL, the administrator username (admin), the administrator email and the generated administrator password. These credentials are unique to this instance.
Verify the Service
Pingvin Share exposes an open health endpoint that returns OK when the backend is ready. Confirm from the instance itself that the platform is up:
curl -fsS http://127.0.0.1/api/health && echoConfirm that the two application services and the reverse proxy are running:
systemctl is-active pingvin-share-backend.service pingvin-share-frontend.service nginx.serviceRead the installed version from the application package metadata:
node -e "console.log(require('/opt/pingvin/app/backend/package.json').version)"First Login
Open http://<instance-public-ip>/ in a browser. The Pingvin Share sign-in page appears.
Sign in as the admin user with the password from /root/pingvin-share-credentials.txt. Change the administrator password from My account as soon as you sign in, and store the new password in your own secrets manager.
Create and Share Files
After you sign in, you land on the Upload view. Drag files into the drop zone, or click it to pick files. As soon as a file is staged, the Share button is enabled.
Click Share to open the share-creation dialog. Pingvin Share generates a short, random link ID, or you can supply your own. Set an expiration, or make the share permanent. Open Security options to add a password or a maximum number of views. Confirm with Share, and Pingvin Share returns the ready-to-send link.
Anyone you give the link to sees the recipient download page. There they can preview, copy or download individual files, or download everything as a single zip. They never need an account.
To collect files from other people, create a reverse share from the link menu in the header. Pingvin Share gives you a link that lets the recipient upload files to you, with the same expiration and view-limit controls.
Administration
Open the user menu in the top-right corner and choose Administration. From here you manage users, manage shares and configure the platform. The Administration landing page also shows the running version.
Open Configuration to manage the application settings. The General tab sets the application name and the public URL. The other tabs cover:
- Email and SMTP for outbound notifications
- Share defaults, such as the maximum share size and the default link length
- Social Login (GitHub, Google, Microsoft, Discord and generic OpenID Connect)
- LDAP
- S3 storage back ends
- Legal pages
- Cache (optional Redis)
Settings are stored in the database and are fully editable from this panel.
Set the public application URL
Set App URL under Configuration > General to the address (or domain) your users reach the instance on, then select Save. Generated share links and emails then use your real address rather than the launch IP.
Configure Outbound Email (Optional)
Email is used for password resets, share-recipient notifications and admin invites.
Under Configuration > SMTP, enable SMTP and enter your provider's host, port, username, password and the sender address. Then select Save. Under Configuration > Email, you can enable share-recipient notifications and customize the message templates.
Enable HTTPS (Recommended)
Terminate TLS in front of Pingvin Share. The image installs nginx, so you can obtain a certificate with Certbot once a DNS name points at the instance and inbound port 443 is open.
Install Certbot and the nginx plugin:
sudo apt-get update && sudo apt-get install -y certbot python3-certbot-nginxRequest and install a certificate for your domain, and follow the interactive prompts:
sudo certbot --nginx -d your-domain.example.comCertbot edits the nginx site to serve HTTPS and sets up automatic renewal. After you enable HTTPS, set App URL to the https:// address and enable Secure cookies under Configuration > General.
Backup and Maintenance
All persistent state lives under /data/pingvin on the dedicated data volume. That includes the SQLite database data/pingvin-share.db and the uploaded files under data/uploads/shares. To protect your shares and configuration, back up that directory or snapshot the EBS data volume.
Inspect the data layout. The command prints sizes only, not file contents:
sudo du -sh /data/pingvin/data 2>/dev/null;
sudo ls /data/pingvin/dataManage the two application services and nginx with systemctl:
systemctl status pingvin-share-backend.service --no-pager | head -5After a configuration change made outside the admin panel, restart the services:
sudo systemctl restart pingvin-share-backend.service pingvin-share-frontend.serviceSupport
This image is published by SecureAnyCloud with 24/7 technical support by email and chat. Support covers Pingvin Share deployment, upgrades, reverse proxy and TLS termination, SMTP and OAuth configuration, S3 storage back ends, and database administration.
Pingvin Share is open-source software licensed under the BSD 2-Clause License. All product and company names are trademarks or registered trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them.
Deploy on AWS
Launch Pingvin Share on AWS with 24/7 support from SecureAnyCloud.
View on Marketplace
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com