Apps / Docker Images
PrestaShop in Docker.
A store engine, pinned.
PrestaShop is an open source ecommerce platform for building and running an online store: a product catalog, cart and checkout, orders, customers, shipping, taxes, and a large module and theme ecosystem.
docker pull ghcr.io/remarkablecloud/prestashop Current build
8.2.8-r1
Updated Sep 11, 2026
Base
PrestaShop 8 official, digest-pinned
What's inside
Headless install wrapper, MariaDB pairing, healthcheck
Upstream license
PrestaShop: OSL-3.0
Free to pull and run anywhere. Digest-pinned, updated deliberately; each build is recorded in the changelog.
The image
What our image adds.
PrestaShop is an open source ecommerce platform for building and running an online store: a product catalog, cart and checkout, orders, customers, shipping, taxes, and a large module and theme ecosystem.
Digest-pinned, stable version
Built from `prestashop/prestashop@sha256:fb50922a7a8dafdd5b824b35ab7b58fd9c4fb7cd189a3699b9527e2dfb8e8033` (PrestaShop 8.2.8, PHP 8.1, Apache, Debian 12). We pin the stable 8.2 line: the current `latest` (9.1) has a broken headless installer upstream, so this
Headless install
With the database and domain variables set, PrestaShop installs on first start with no web installer step, so the store is ready to use immediately.
No default credentials
Upstream installs an `admin` / `prestashop_demo` account at `/admin`. Our image generates a strong admin password and a randomized admin-folder name on first run, keeps both in the data volume, and prints the login and admin URL path once to the container log.
Proxy-aware
Behind a TLS-terminating reverse proxy, `X-Forwarded-Proto: https` is mapped to HTTPS and SSL is enabled, so the storefront serves cleanly without the redirect loops PrestaShop is prone to behind a proxy.
Healthcheck
A static `/rc-health.txt`, served directly by Apache and independent of PrestaShop routing or the shop domain, backs the container `HEALTHCHECK` so the platform routes traffic only once the store is serving. The current published tag is `ghcr.io/remarkableclou
Rather skip the compose file? Deploy PrestaShop with one click on your own VPS: TLS, domain and database already wired.
Deploy PrestaShop in one clickThe guide
Run it in production.
Architecture at a glance
- PrestaShop (Apache and PHP) serves plain HTTP on port
80. TLS is terminated upstream by a reverse proxy (Traefik on the RemarkableCloud App Platform). SetPS_DOMAINto the public hostname so shop URLs match the request. - MariaDB is a separate database container and holds products, orders, customers, and configuration.
- A data volume at
/var/www/htmlholds the PrestaShop application, uploaded product images, and installed modules and themes.
Docker Compose walkthrough
The standalone stack (PrestaShop and MariaDB) is defined in the image’s docker-compose.yml:
name: prestashop
services:
db:
image: mariadb:11
restart: unless-stopped
environment:
MARIADB_DATABASE: prestashop
MARIADB_USER: prestashop
MARIADB_PASSWORD: ${DB_PASSWORD:-change-me-db}
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:-change-me-root}
volumes: [db-data:/var/lib/mysql]
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 10s
timeout: 5s
retries: 12
prestashop:
image: ${PRESTASHOP_IMAGE:-ghcr.io/remarkablecloud/prestashop:8.2.8-r1}
restart: unless-stopped
depends_on:
db:
condition: service_healthy
ports: ["${HTTP_PORT:-8094}:80"]
environment:
DB_SERVER: db
DB_PORT: "3306"
DB_NAME: prestashop
DB_USER: prestashop
DB_PASSWD: ${DB_PASSWORD:-change-me-db}
PS_DOMAIN: ${PS_DOMAIN:-localhost:8094}
ADMIN_MAIL: ${ADMIN_MAIL:-admin@example.com}
volumes:
- ps-data:/var/www/html
volumes:
db-data:
ps-data:
Step by step:
- The app waits for the database.
depends_onwithcondition: service_healthyavoids a first-boot race against MariaDB. - Install is headless.
DB_*andPS_DOMAINlet PrestaShop install on first start without the web wizard. - The admin password and folder are generated. Leave
ADMIN_PASSWDempty and the image creates a strong password and a randomized admin folder on first run and logs both once. - Only the web port is exposed.
${HTTP_PORT:-8094}:80is for local use; in production the proxy connects to port80on the internal network. - State lives in volumes.
ps-data(/var/www/html) anddb-datapersist across restarts and upgrades.
To start it locally:
DB_PASSWORD=$(openssl rand -hex 16) docker compose up -d
Then browse to http://localhost:8094 and read the admin login and admin URL path from docker compose logs prestashop. For production, set PS_DOMAIN to your public hostname and put the container behind a TLS-terminating reverse proxy.
Environment variable reference
These are wired automatically by the App Platform backend from the managed MariaDB; they are listed here for standalone and self-hosted runs.
| Variable | Required | Value / default | Purpose |
|---|---|---|---|
DB_SERVER | yes | <db_host> | MariaDB host. |
DB_PORT | no | 3306 | MariaDB port. |
DB_NAME | yes | <db_name> | Database name. |
DB_USER | yes | <db_user> | Database user. |
DB_PASSWD | yes | <db_password> | Database password. |
PS_DOMAIN | yes | <hostname> | Public shop domain, used for URL generation. |
ADMIN_MAIL | no | admin@example.com | Admin email created at install. |
ADMIN_PASSWD | no | (generated) | Admin password. Leave empty to auto-generate on first run (printed once); set it to pin your own. |
PS_INSTALL_AUTO=1 and PS_ENABLE_SSL=1 are baked into the image. Only the first run reads the install variables; afterwards changes happen inside PrestaShop.
Hardening notes
- No default credentials. Both the admin password and the admin-folder name are generated on first run, never left at the upstream defaults.
- Digest-pinned base. Each build is auditable and reproducible.
- Healthcheck gates traffic.
/rc-health.txtmust return success before the platform routes requests. - Keep MariaDB private. Do not publish its port to the host or the internet.
- After first login, note the admin URL path from the log, set up payments and shipping, keep PrestaShop and its modules updated, and remove the demo products if not needed.
Backups
Capture the database and the data volume together:
- The MariaDB database:
docker compose exec db mariadb-dump -u root -p"$DB_ROOT_PASSWORD" prestashop > prestashop-db.sql - The data volume at
/var/www/html(application, product images, modules, themes):docker run --rm -v prestashop_ps-data:/data -v "$PWD":/backup alpine \ tar czf /backup/prestashop-data.tgz -C /data .
On the RemarkableCloud App Platform, database and volume backups follow the platform’s backup schedule.
Upgrades
- PrestaShop upgrades in-app. PrestaShop populates its whole application into the data volume on first run and manages core upgrades through its own 1-click upgrade module. Use that to move between PrestaShop versions.
- Image
-rtags bump the base. A new image tag updates the base OS and PHP; it does not replace the PrestaShop application already in your volume. Back up first, then apply base updates by pulling the new tag and recreating the container. - Read the changelog. Every build is listed in
CHANGELOG.mdwith the base image digest and any behavior changes.
Or skip the ops
Host PrestaShop on your own private VPS.
One click installs this exact image on a VPS that is yours alone, domain and TLS wizard included. The same server runs as many apps as fit, with no per-app charge.
FAQ
Questions we get.
Do I need a database?
Yes. PrestaShop stores products, orders, and settings in MariaDB (or MySQL). The standalone compose file includes MariaDB.
Where do the admin login and admin URL come from?
On first run the image generates the admin password and a randomized admin-folder name and prints both once to the container log. Set `ADMIN_PASSWD` to pin the password.
Why PrestaShop 8.2 and not 9.x?
The current upstream `latest` (9.1) has a broken headless installer, so this image pins the stable 8.2 line that installs cleanly. A 9.x image will follow once the upstream installer is fixed.
How does HTTPS work if the container only serves HTTP on port 80?
TLS is terminated at the reverse proxy (Traefik on the App Platform), which sets `X-Forwarded-Proto: https`; the image maps that to HTTPS so PrestaShop generates https URLs and does not redirect-loop. Set `PS_DOMAIN` to the public hostname.
Can I use MySQL instead of MariaDB?
Yes. PrestaShop connects with the MySQL driver, which works with both MySQL 8 and MariaDB; point `DB_SERVER` at your server.
Your server runs. You sleep.
Fully managed hosting from people who have been doing this since 2001.