Installing on your own server

Requirements, install, cron and going live, if you host it yourself.

This chapter is only for customers who chose to host the store themselves. If we host it for you, none of this applies — your store is already installed, updated and backed up.

You own the source code, so you can run it anywhere that meets the requirements below. Nothing phones home, and there is no licence check.

What your server needs

ComponentRequirementWhy
Operating systemUbuntu 22.04 or 24.04What the platform is built and tested against
Database MySQL 8 The schema uses utf8mb4_0900_ai_ci
PHP8.3 with FPM
PHP extensions mysql, curl, mbstring, intl, xml, gd, imagick, zip, bcmath Images, invoices, imports, money maths
Web serverCaddy, or nginxCaddy issues HTTPS certificates by itself
CronAvailableQueued work, campaigns, cart recovery
Memory2 GB minimumImage processing is the hungry part
Disk20 GB and upProduct images grow faster than you expect

MariaDB will not work. It is a drop-in replacement for most things, but not for this schema's collation — migrations fail on the very first run. Many hosts advertise "MySQL" and provide MariaDB, so check before you pay:

mysql -e "SELECT VERSION();"

If the answer contains MariaDB, that server cannot run the store.

Installing what you need

sudo apt update
sudo apt install -y mysql-server-8.0 \
  php8.3-fpm php8.3-mysql php8.3-curl php8.3-mbstring php8.3-intl \
  php8.3-xml php8.3-gd php8.3-imagick php8.3-zip php8.3-bcmath \
  imagemagick unzip cron

Then Caddy, which is not in Ubuntu's archive:

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' \
  | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' \
  | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update && sudo apt install -y caddy

Creating the database

sudo mysql
CREATE DATABASE gosell CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
CREATE USER 'gosell'@'localhost' IDENTIFIED BY 'a-long-random-password';
GRANT ALL PRIVILEGES ON gosell.* TO 'gosell'@'localhost';
FLUSH PRIVILEGES;
EXIT;

The collation on the first line is not optional — it is the one MariaDB lacks.

Putting the files in place

  1. Upload and extract the source we handed over, e.g. to /var/www/gosell.
  2. The web server's document root must be the public directory, not the project root.
sudo chown -R www-data:www-data /var/www/gosell
sudo chmod -R 755 /var/www/gosell
sudo chmod -R 775 /var/www/gosell/storage

Only public/ may be reachable from the web. If the document root is the project folder, your .env — database password included — is downloadable. This is the most damaging mistake on this page.

Configuration

Copy .env.example to .env and fill it in:

KeyWhat to put
APP_KEYA random 32-byte key, generated below. Never share it.
DB_HOST127.0.0.1 for a database on the same box
DB_PORT3306
DB_NAMEgosell
DB_USER / DB_PASSWORDWhat you created above
API_KEYA random string, if you use the API
FILE_SYSTEMlocal to start with
php -r "echo 'base64:' . base64_encode(random_bytes(32)) . PHP_EOL;"

Creating the tables

cd /var/www/gosell
php command migrate

If this fails on the first table, you are on MariaDB. If it fails on a missing extension, install it and run again — migrations are safe to re-run.

Web server

A minimal Caddyfile — Caddy obtains and renews HTTPS by itself:

yourstore.com {
    root * /var/www/gosell/public
    encode gzip
    php_fastcgi unix//run/php/php8.3-fpm.sock
    file_server
}
sudo systemctl reload caddy

Point your domain's A record at the server's IP first, or the certificate cannot be issued.

Cron — one line

* * * * * cd /var/www/gosell && php command schedule:run >> storage/logs/schedule.log 2>&1

That single entry runs everything on its own schedule: queued jobs, journeys, campaigns, cart scanning and session recovery.

Without cron, the store looks fine and silently does nothing in the background. No order emails, no cart recovery, no campaigns, no journeys — and no error to tell you. Add it during install, then confirm storage/logs/schedule.log is growing.

Creating your admin account

Nothing to run on the command line. Open https://yourstore.com/admin/ in a browser and you are taken straight to a one-time onboarding form — give it a name, a username and a password, and you are signed in.

That page closes itself permanently the moment the first account exists. From then on /admin/ is an ordinary login, and further staff are added from inside the admin. So there is no window where anyone can wander in and claim your store, as long as you do this step yourself rather than leaving a fresh install exposed overnight.

There is a command-line equivalent if you are scripting an install, or if you ever lock yourself out:

php command make:admin yourname 'a-strong-password' 'Your Name'

Then finish setting up

From here it is the same as any store — work through First steps.

Before you take a real order

  • .env is not reachable over the web — try https://yourstore.com/.env and confirm you get an error, not a file.
  • HTTPS works and does not warn.
  • storage/logs/schedule.log is growing.
  • A test order completes and its confirmation email arrives.
  • A backup has run and you have restored it once somewhere else.

Still stuck? Message us on WhatsApp — we would rather answer than have you guess.