Easy Digital Downloads
Overview
Easy Digital Downloads is an open source ecommerce platform for selling digital products such as ebooks, software, plugins, themes, music, photography, design assets and documents. It provides a shopping cart and checkout, secure file delivery with access control, discount codes, customer records and purchase histories, and sales and earnings reporting. It runs on WordPress, so you keep the familiar admin, the theme ecosystem and the REST API alongside the commerce features.
This SecureAnyCloud image installs WordPress 7.0.4 and Easy Digital Downloads 3.7.0 on a LAMP stack drawn entirely from Ubuntu 24.04 noble universe, with no third-party APT repositories. Easy Digital Downloads is already activated, so the Checkout, Receipt, Order History, Confirmation and Products pages exist the moment the instance boots.
What you get:
- Easy Digital Downloads 3.7.0, activated, at
/var/www/html/wordpress/wp-content/plugins/easy-digital-downloads - WordPress 7.0.4 from the official wordpress.org release at
/var/www/html/wordpress, with WordPress's automatic updates left on so it keeps receiving security releases - WordPress and Easy Digital Downloads both verified at build time against the checksums wordpress.org publishes
- Apache 2.4.58 with mod_rewrite enabled, virtual host at
/etc/apache2/sites-available/easy-digital-downloads.conf - MySQL 8.0.46 with an
edddatabase and anedduseraccount, both given a unique password on first boot - PHP 8.3.6 with the curl, gd, mbstring, xml, zip, intl, bcmath and mysqli extensions (images are processed with PHP's GD library)
- WP-CLI 2.12.0 at
/usr/local/bin/wp easy-digital-downloads-firstboot.service, which generates every credential uniquely for each instance- Apache and MySQL enabled and starting automatically on boot
- 24/7 SecureAnyCloud support
Key facts:
- Platform: Ubuntu 24.04 LTS, Azure Gen2
- Default SSH user: azureuser
- Store administrator: SecureAnyCloud
- Web root: /var/www/html/wordpress
- Credentials file: /stage/scripts/easy-digital-downloads-credentials.log (mode 0600, root only)
- HTTP port: 80
Prerequisites
Before you deploy, make sure you have:
- An active Azure subscription
- An active Azure Marketplace subscription for this offer
- An SSH key pair for the
azureuseraccount - A virtual network and subnet in your target region
- A network security group allowing inbound TCP 22 and TCP 80
Recommended VM size: Standard_B2s (2 vCPU, 4 GB RAM) is sufficient for a small to medium catalog. Move to a D2s_v3 or larger for high-traffic stores or large download libraries.
Deploy the virtual machine
Option A: Azure Portal
- Choose Create a resource and search the Marketplace for this SecureAnyCloud offer
- Select the plan and choose Create
- Pick your subscription, resource group and region
- Set the VM size to Standard_B2s
- Set the authentication type to SSH public key and the username to azureuser
- On the Networking tab, allow inbound SSH (22) and HTTP (80)
- Select Review + create, then Create
Option B: Azure CLI
az vm image terms accept --urn sac1647283583153:easy-digital-downloads-ubuntu-24-04:default:latest
az vm create \
--resource-group my-resource-group \
--name my-edd-vm \
--image sac1647283583153:easy-digital-downloads-ubuntu-24-04:default:latest \
--size Standard_B2s \
--admin-username azureuser \
--generate-ssh-keys \
--public-ip-sku Standard \
--location eastusConnect via SSH
From your own workstation, look up the instance's public IP address and connect to it:
az vm show --resource-group my-resource-group --name my-edd-vm \
--show-details --query publicIps --output tsv ssh azureuser@<vm-ip>Verify the stack
Confirm that both services are running and listening:
sudo systemctl is-active apache2 mysql
sudo ss -tln | grep -E ':80 |:3306 'Check the version of each component:
apache2 -v | head -1 php -v | head -1 mysql --versionConfirm WordPress and Easy Digital Downloads are installed and the plugin is active:
sudo -u www-data wp core version --path=/var/www/html/wordpress sudo -u www-data wp plugin list --path=/var/www/html/wordpress --fields=name,status,versionThe image ships WordPress 7.0.4. WordPress's own automatic updates are left at their defaults, so WordPress installs new releases by itself. On an instance that has been running for a while, wp core version may report a newer release.
Easy Digital Downloads, other plugins and themes are updated when you choose (see Security Recommendations).
Retrieve your store credentials
Every credential on this instance is generated on first boot and written to a file that only root can read. Nothing is shared between instances, and nothing is baked into the image.
sudo cat /stage/scripts/easy-digital-downloads-credentials.logThe file contains these keys:
- EDD_URL: the public storefront address
- EDD_ADMIN_URL: the WordPress admin sign-in address
- EDD_DOWNLOADS_URL: a direct link to your digital products list
- WP_ADMIN_USER: the store administrator username (SecureAnyCloud)
- WP_ADMIN_PASSWORD: the store administrator password, unique to this instance
- WP_DB_NAME, WP_DB_USER, WP_DB_PASSWORD: the WordPress database and its account
- MYSQL_ROOT_PASSWORD: the MySQL root password, unique to this instance
Confirm that the first-boot service completed and that the file is protected:
sudo systemctl is-active easy-digital-downloads-firstboot.service
sudo ls -l /stage/scripts/easy-digital-downloads-credentials.log
sudo ls -l /var/lib/sac/data/easy-digital-downloads-firstboot.doneSign in to your store
Browse to http://<vm-ip>/wp-admin/ and sign in as SecureAnyCloud with the WP_ADMIN_PASSWORD from Step 4.
You land on the WordPress dashboard. Easy Digital Downloads adds the Downloads and Store Reports entries to the left menu.
The image derives its site address from the host you browse it on. The storefront therefore works on the public IP straight away, and it keeps working unchanged if you later point a domain name at the instance.
Review your digital products
Choose Downloads in the left menu. This is your product catalog. A newly deployed store is empty. Every product you add appears here with its price, categories, net sales and net revenue.
Easy Digital Downloads creates its store pages when it activates, which happens on first boot. Confirm that they exist:
sudo -u www-data wp post list --post_type=page --path=/var/www/html/wordpress --fields=post_title,post_name --format=tableCreate your first digital product
In the admin, choose Downloads, then Add Download. Give the product a name and set a price in the Download Prices panel. Attach the file the customer receives in the Download Files panel, and publish the product when you are ready to sell.
You can also create a product from the command line, which is useful for bulk imports and automation:
sudo -u www-data wp post create --post_type=download \
--post_title='Starter Icon Pack' --post_status=publish \
--path=/var/www/html/wordpress sudo -u www-data wp post list --post_type=download --path=/var/www/html/wordpress --fields=ID,post_title,post_statusFiles attached to a product are delivered through Easy Digital Downloads rather than served directly, so a customer cannot share a working download URL with someone who has not paid.
Configure payments and store settings
Choose Downloads, then Settings. Set your store country, your currency and the payment gateways you want to accept.
The core plugin supports Stripe and PayPal. Test mode lets you place an order end to end before you take real money.
Choose Downloads, then Reports, to track sales, earnings, average order value, refunds, taxes and file downloads over any date range.
View the public storefront
Browse to http://<vm-ip>/ to see the storefront your customers will use.
Confirm that both the storefront and the sign-in page answer:
curl -sf -o /dev/null -w 'storefront: HTTP %{http_code}\n' http://127.0.0.1/
curl -sf -o /dev/null -w 'sign in: HTTP %{http_code}\n' http://127.0.0.1/wp-login.phpServer components
The image contains these components:
- Easy Digital Downloads 3.7.0: /var/www/html/wordpress/wp-content/plugins/easy-digital-downloads
- WordPress 7.0.4 (updates itself): /var/www/html/wordpress
- Apache HTTP Server 2.4.58: /etc/apache2
- MySQL 8.0.46: /var/lib/mysql
- PHP 8.3.6: /etc/php/8.3
- WP-CLI 2.12.0: /usr/local/bin/wp
Filesystem layout
The VM has these mount points:
- / (29 GB): root filesystem, including the web root and the MySQL data directory
- /boot (881 MB): operating system kernel files
- /boot/efi (105 MB): UEFI boot partition (Gen2 Hyper-V)
- /mnt (7.8 GB): Azure temporary resource disk, cleared on deallocation
Key directories:
- /var/www/html/wordpress: WordPress and Easy Digital Downloads
- /var/www/html/wordpress/wp-content/uploads: media library and product files
- /var/www/html/wordpress/wp-config.php: database credentials and site configuration
- /etc/apache2/sites-available/easy-digital-downloads.conf: Apache virtual host
- /var/log/apache2/edd-access.log, edd-error.log: Apache logs for the store
- /var/lib/mysql: MySQL data directory
Scripts and log files
These files drive and record first boot:
- /usr/local/sbin/easy-digital-downloads-firstboot.sh: generates every per-instance credential on first boot
- /etc/systemd/system/easy-digital-downloads-firstboot.service: the systemd unit that runs it once
- /stage/scripts/easy-digital-downloads-credentials.log: the generated credentials, mode 0600, root only
- /var/lib/sac/data/easy-digital-downloads-firstboot.done: sentinel proving first boot completed
- /var/log/easy-digital-downloads-firstboot.log: first-boot log
On startup
The first time the instance boots, easy-digital-downloads-firstboot.service runs once and does the following:
- Generates a MySQL root password, a WordPress database password and a store administrator password, each unique to this instance
- Creates the
edddatabase and theedduseraccount - Writes
wp-config.phpwith those credentials - Installs WordPress and creates the SecureAnyCloud administrator
- Activates Easy Digital Downloads, which creates the store pages
- Writes the credentials file with mode 0600 owned by root
- Writes its sentinel file so it never runs again
The image ships with no database and no configuration file. There is no default password to change and no credential shared between customers.
Manage the services
sudo systemctl status apache2 --no-pager sudo systemctl restart apache2
sudo systemctl restart mysqlTo follow the store's web logs, run:
sudo tail -n 20 /var/log/apache2/edd-error.logBackups
Back up both the database and the uploaded product files. The database holds your products, orders and customers. The uploads directory holds the files your customers download.
sudo mysqldump -uroot -p"$(sudo grep '^MYSQL_ROOT_PASSWORD=' /stage/scripts/easy-digital-downloads-credentials.log | cut -d= -f2-)" edd > /var/backups/edd-$(date +%F).sql
sudo tar czf /var/backups/edd-uploads-$(date +%F).tar.gz -C /var/www/html/wordpress/wp-content uploadsTroubleshooting
The storefront does not load. Check that Apache is running and listening, then read the error log:
sudo systemctl is-active apache2
sudo tail -n 20 /var/log/apache2/edd-error.logYou cannot sign in. Re-read the password from the credentials file, which is authoritative for this instance. If the password was changed and lost, reset it with WP-CLI:
sudo -u www-data wp user update sac --user_pass='<new-password>' --path=/var/www/html/wordpressThe credentials file contains only a comment. First boot has not finished yet. Wait a few moments, then check the service:
sudo systemctl status easy-digital-downloads-firstboot.service --no-pager sudo tail -n 20 /var/log/easy-digital-downloads-firstboot.logProduct pages return 404. The pretty permalink rules live in /var/www/html/wordpress/.htaccess, which first boot writes. If it has been removed, open Settings, then Permalinks, in the admin and select Save Changes.
You can also regenerate it from the command line. A plain wp rewrite flush --hard cannot write .htaccess, because WP-CLI cannot detect Apache's rewrite module:
sudo -u www-data wp eval 'add_filter("got_rewrite", "__return_true"); flush_rewrite_rules(true);' --path=/var/www/html/wordpressDatabase connection errors. Confirm MySQL is running and that WordPress can reach it:
sudo systemctl is-active mysql
sudo -u www-data wp db check --path=/var/www/html/wordpressSecurity Recommendations
- Enable HTTPS before you take payments. Point a domain at the instance, then install a certificate. The site address follows the host you browse it on, so no reconfiguration is needed after the certificate is issued: bash sudo apt-get install -y certbot python3-certbot-apache sudo certbot --apache -d <your-domain>
- Restrict the network security group so port 22 is reachable only from your management network. Ports 80 and 443 stay open to your customers.
- Keep Easy Digital Downloads and your theme updated from the admin, or with
wp plugin update --allandwp theme update --all. WordPress core installs its own updates through WordPress's automatic updates. Leave them on so security releases arrive without delay. - Apply operating system updates regularly, for example
sudo apt-get update && sudo apt-get upgrade. - Store the credentials file contents in your own secret manager, then keep the file readable only by root.
- Turn on two-factor authentication for administrator accounts with a WordPress plugin before the store goes live.
Licensing
Easy Digital Downloads and WordPress are both licensed under the GNU General Public License version 2 or later. Both are free to use commercially.
SecureAnyCloud provides the packaged image and commercial support separately from the upstream projects.
Support
For assistance, contact SecureAnyCloud support:
- Email: sales@secureanycloud.com
- Response time: 24/7 with a guaranteed 24-hour response SLA
- Website: https://secureanycloud.com
Deploy on Azure
Launch Easy Digital Downloads 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
Easy Digital Downloads is an open source, self-hosted ecommerce platform for selling digital products. It is a WordPress plugin, so customers browse a storefront, add downloadable products to a cart, check out and receive secure download links. You manage products, pricing, orders, customers, discounts and reports from the WordPress admin.
This SecureAnyCloud image delivers a full WordPress site with the plugin installed and activated, on a LAMP stack: WordPress 7.0 with Easy Digital Downloads 3.6.9 on PHP 8.3 under Apache, with a MySQL database.
What you get:
- Two dedicated, independently resizable EBS data volumes: the MySQL data directory at
/var/lib/mysqland the WordPress webroot at/var/www, so the database and the site files stay off the operating system disk - A WordPress administrator account created on the first boot of every instance
- The administrator password, the database password and the database root password, all generated fresh on each instance, so two instances launched from the same Amazon Machine Image never share a credential
- No default login in the image, because the build-time database is destroyed before the image is captured
- Credentials written to
/stage/scripts/easy-digital-downloads-credentials.logwith mode 0600, readable only by the root user - A site address derived from the request host on every request, so the storefront answers correctly on the instance's public IP, its private IP or any custom domain you later point at it, with no reconfiguration and no redirect to a stale address
Prerequisites
Before you deploy this image, make sure you have:
- 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 port 80 for the storefront and WordPress admin
- 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 Easy Digital Downloads. Select the SecureAnyCloud listing and choose Select, then 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, then create or select a security group that opens port 22 from your management network and port 80 for the storefront and admin.
Leave the root volume at the default size or larger. The database and web volumes are attached automatically.
Select Launch instance. First-boot initialization takes a short time after the instance state becomes Running and the status checks pass. During that time the database is created, WordPress is installed, Easy Digital Downloads is activated and the per-instance administrator is provisioned.
Launch the instance from the AWS CLI
The following command launches an instance from the SecureAnyCloud Easy Digital Downloads Marketplace AMI into an existing subnet and security group.
Replace the AMI ID with the one shown on the Marketplace listing, and the key name with your EC2 key pair name. Replace the subnet ID with your subnet ID, and the security group ID with a security group that opens ports 22 and 80 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> \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=easy-digital-downloads}]'When the instance reaches the Running state and its status checks pass, note its public IP address or DNS name from the EC2 console or with aws ec2 describe-instances.
Connect to your instance
Connect over SSH with your key pair and the login user for your operating system variant. For the Ubuntu 24.04 variant, the SSH login user is ubuntu.
ssh -i <key-name>.pem ubuntu@<instance-public-ip>Retrieve the administrator password
The WordPress administrator password is unique to your instance and was generated on first boot. Read it as root:
sudo cat /stage/scripts/easy-digital-downloads-credentials.logThe file lists the storefront URL, the WordPress admin URL, the administrator login name (SecureAnyCloud) and the generated password. It also lists the database name, the database user and the generated database passwords. Keep this file somewhere safe.
Confirm Easy Digital Downloads is running
Over SSH, confirm that the web server and the database are active, that the expected ports are listening, and that WordPress and the plugin are the expected versions:
for s in apache2 mysql; do echo "$s: $(systemctl is-active $s)"; done
sudo ss -tln | grep -E ':80|:3306'
sudo -u www-data wp core version --path=/var/www/html/wordpress sudo -u www-data wp plugin get easy-digital-downloads --field=version --path=/var/www/html/wordpressYou should see both services active, ports 80 and 3306 listening, WordPress version 7.0.2 and Easy Digital Downloads version 3.6.9.
Then confirm that the storefront, the WordPress login and the store pages answer with HTTP 200:
curl -s -o /dev/null -w 'home: %{http_code}\n' http://127.0.0.1/
curl -s -o /dev/null -w 'login: %{http_code}\n' http://127.0.0.1/wp-login.php
curl -s -o /dev/null -w 'products: %{http_code}\n' http://127.0.0.1/products/
curl -s -o /dev/null -w 'checkout: %{http_code}\n' http://127.0.0.1/checkout/Sign in to the WordPress admin
Apache serves the storefront and the WordPress admin on port 80. In a browser, open the admin sign-in page:
http://<instance-public-ip>/wp-admin/Sign in with the administrator login name SecureAnyCloud and the password from the credentials file. From the admin you manage downloadable products, orders, customers, discounts and reports.
Create your first digital product
In the WordPress admin, open Downloads and choose Add Download. Give the product a name and description and set its price. Under Download Files, upload the file customers receive after purchase. Publish the product and it appears in your storefront.
Easy Digital Downloads delivers each purchased file through a signed, expiring link, so paid files cannot be shared by URL.
Configure payment gateways, tax, email receipts and discount codes under Downloads -> Settings. Read sales and earnings figures under Downloads -> Reports.
Try the storefront and checkout
Customers browse the storefront at the site root and on the Products page, add products to their cart and check out. The storefront is an ordinary WordPress site, so you can style it with any WordPress theme and extend it with the Easy Digital Downloads add-on catalog.
At checkout, the customer reviews the cart and enters their details. They then complete the purchase and receive their downloads.
Check the database and web volumes
The MySQL database lives on a dedicated EBS volume mounted at /var/lib/mysql. The WordPress code and uploaded product files live on a second dedicated EBS volume mounted at /var/www. Both are kept off the operating system disk and are independently resizable.
Confirm the layout:
findmnt /var/lib/mysql
findmnt /var/www df -h /var/lib/mysql /var/wwwTo grow either tier, resize the EBS volume in the AWS console, then grow the filesystem on the instance. The fstab entries reference the filesystem UUID, so the layout persists across reboots and instance replacement.
Add a custom domain and enable HTTPS
The site derives its address from the request host. Point a DNS name at the instance and the storefront answers on it immediately, with no WordPress reconfiguration.
To serve the site over HTTPS, install a certificate with Certbot for Apache once your domain resolves to the instance:
sudo apt-get update
sudo apt-get install -y certbot python3-certbot-apache
sudo certbot --apache -d your-domain.exampleCertbot obtains and installs the certificate and configures Apache to redirect HTTP to HTTPS. Renewals run automatically.
Back up and maintain
Back up the MySQL database regularly. A logical dump of the WordPress database is the simplest approach and can be scheduled with cron:
sudo mysqldump --single-transaction edd > /var/backups/edd-$(date +%F).sqlAlso back up /var/www/html/wordpress/wp-content/uploads, which holds the delivered digital product files. For a full point-in-time copy, take EBS snapshots of the /var/lib/mysql and /var/www volumes.
Keep the operating system patched with sudo apt-get update && sudo apt-get upgrade. Update WordPress core and the Easy Digital Downloads plugin from the WordPress admin.
Support
SecureAnyCloud supports this image. Contact SecureAnyCloud support for help with deployment, product and pricing setup, payment gateways, secure file delivery, discount codes, customer and order management, database tuning, TLS and custom domains, or scaling. Include the instance ID and Region when you raise a ticket.
Deploy on AWS
Launch Easy Digital Downloads on AWS with 24/7 support from SecureAnyCloud.
View on Marketplace
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com