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
| Component | Requirement | Why |
|---|---|---|
| Operating system | Ubuntu 22.04 or 24.04 | What the platform is built and tested against |
| Database | MySQL 8 | The schema uses utf8mb4_0900_ai_ci |
| PHP | 8.3 with FPM | — |
| PHP extensions | mysql, curl, mbstring, intl,
xml, gd, imagick, zip,
bcmath |
Images, invoices, imports, money maths |
| Web server | Caddy, or nginx | Caddy issues HTTPS certificates by itself |
| Cron | Available | Queued work, campaigns, cart recovery |
| Memory | 2 GB minimum | Image processing is the hungry part |
| Disk | 20 GB and up | Product 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
- Upload and extract the source we handed over, e.g. to
/var/www/gosell. - 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:
| Key | What to put |
|---|---|
APP_KEY | A random 32-byte key, generated below. Never share it. |
DB_HOST | 127.0.0.1 for a database on the same box |
DB_PORT | 3306 |
DB_NAME | gosell |
DB_USER / DB_PASSWORD | What you created above |
API_KEY | A random string, if you use the API |
FILE_SYSTEM | local 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
.envis not reachable over the web — tryhttps://yourstore.com/.envand confirm you get an error, not a file.- HTTPS works and does not warn.
storage/logs/schedule.logis 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.