The install archive is the whole shop: the engine, its modules, its theme and the PHP libraries. The server needs no Composer and no Node. The same steps are inside the archive, in INSTALL.md.
Check the archive
Next to it are its sha256 and signature — Ed25519 over the sha256, by the same key that signs updates:
sha256sum -c torgash-0.1.7-install.zip.sha256
Ubuntu 24.04, step by step
# PHP 8.5 (ondrej PPA), PostgreSQL 18 (PGDG), Caddy
sudo add-apt-repository ppa:ondrej/php -y
sudo apt install -y php8.5-fpm php8.5-cli php8.5-pgsql php8.5-mbstring php8.5-intl \
php8.5-gd php8.5-curl php8.5-zip php8.5-bcmath php8.5-xml php8.5-opcache unzip
sudo apt install -y postgresql-common && sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh -y
sudo apt install -y postgresql-18
sudo apt install -y caddy # repository: caddyserver.com/docs/install
# The files
sudo mkdir -p /var/www && cd /var/www
sudo unzip torgash-0.1.7-install.zip && sudo mv torgash-0.1.7 torgash
sudo chown -R www-data:www-data /var/www/torgash
# A database user that may create the shop's database
sudo -u postgres createuser --createdb --pwprompt torgash
Before it writes anything, the installer checks the server:
php artisan torgash:install --check --db-username=torgash --db-password=…
Install
In a browser. Point the domain at the public folder (a Caddy example is below) and open it — the wizard at /install does everything the command does. It first asks for the code in storage/app/install-key: whoever can read the server’s files is the owner. It installs one step per request, so a host’s time limit never cuts it in half.
From the console:
cd /var/www/torgash
sudo -u www-data php artisan torgash:install \
--url=https://shop.example.com --name="My shop" --locale=ru --currency=UAH \
--db-username=torgash --db-password='…' --db-database=torgash \
--modules=store --owner=you@example.com
Left out, every answer is asked. --modules is minimal, store (the default) or all, or module ids separated by commas. Without --owner-password a password is made up and shown once. If something fails, fix it and run the same command again: the installer goes on from where it stopped.
If you create the database yourself
The installer creates the database itself. If the user may not create databases, create it like this — with the ICU locale und and the system’s locale for LC_COLLATE / LC_CTYPE:
CREATE DATABASE torgash TEMPLATE template0 ENCODING 'UTF8'
LOCALE_PROVIDER icu ICU_LOCALE 'und' LC_COLLATE 'C.UTF-8' LC_CTYPE 'C.UTF-8';
On Windows use und instead of C.UTF-8. Never the C locale: under it PostgreSQL does not treat Cyrillic as letters and search half-works with no error anywhere. The installer checks Russian search before it starts.
The web server
/etc/caddy/Caddyfile:
shop.example.com {
root * /var/www/torgash/public
encode zstd gzip
php_fastcgi unix//run/php/php8.5-fpm.sock
file_server
}
After sudo systemctl reload caddy, Caddy gets the HTTPS certificate itself. Don’t let the web server replace PHP’s error pages: the shop draws its own, and a closed storefront answers 503 on purpose.
Background work
Letters, imports and nightly jobs need the scheduler — one cron line:
echo '* * * * * www-data cd /var/www/torgash && php artisan schedule:run >> /dev/null 2>&1' \
| sudo tee /etc/cron.d/torgash
Without a queue worker of its own the scheduler starts a short one every minute, so on a host with no long-running processes this is enough. A systemd service for the worker is in INSTALL.md; with it, set QUEUE_WORKER=external in .env. Admin → System shows whether both are alive.
Afterwards
- Updates — System → Updates, see the updates page.
- Mail, payments, delivery — in the admin.
- Backups — System → Backups; restoring is done from the console:
php artisan torgash:backup-restore. - A forgotten owner password:
php artisan torgash:admin you@example.com.