Server Setup
You can install Foodomaa on a managed hosting panel or on a plain Linux server. The manual route gives you more control; the panel route is faster if you do not want to manage PHP and MySQL yourself. Either way, the application needs a public HTTPS document root, a database and a scheduler.
Baseline stack
| Component | Recommended | Notes |
|---|---|---|
| OS | Ubuntu 24.04 LTS or Debian 12 | Use a current LTS release with security updates |
| Web server | Nginx or LiteSpeed | Apache works; Nginx is the common production choice |
| PHP | 8.2 or newer | Match the version required by your package |
| Database | MySQL 8.0+ or MariaDB 10.4+ | Dedicated database and user |
| Cache | Redis (optional) | Useful for sessions, cache and queues at scale |
| SSL | Let's Encrypt or Cloudflare | Active before the installer runs |
Example: Ubuntu with Nginx
The package names below are examples. Adjust the PHP version to the one supported by your build.
sudo apt update
sudo apt install nginx mysql-server php8.2-fpm php8.2-mysql php8.2-mbstring \
php8.2-xml php8.2-curl php8.2-zip php8.2-gd php8.2-intl php8.2-bcmath \
unzip git certbot python3-certbot-nginx
Create the database and a user that has privileges only on that database:
sudo mysql
CREATE DATABASE foodomaa CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'foodomaa'@'localhost' IDENTIFIED BY 'use-a-long-random-password';
GRANT ALL PRIVILEGES ON foodomaa.* TO 'foodomaa'@'localhost';
FLUSH PRIVILEGES;
Nginx virtual host
Point the document root at the public directory, never at the application root. A minimal server block:
server {
listen 80;
server_name foodomaa.example.com;
root /var/www/foodomaa/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
location ~ /\.(?!well-known).* { deny all; }
}
Run sudo nginx -t before reloading. Enable SSL with Certbot or terminate TLS at Cloudflare, then force HTTPS.
PHP settings
memory_limit = 256M
upload_max_filesize = 20M
post_max_size = 24M
max_execution_time = 120
date.timezone = UTC
Reload PHP-FPM after changes. If uploads fail at 2 MB, the limit is usually PHP, Nginx (client_max_body_size) or Cloudflare, not the application.
Permissions and scheduler
Give the web user write access only to the directories that need it:
sudo chown -R www-data:www-data /var/www/foodomaa
sudo find /var/www/foodomaa -type d -exec chmod 755 {} +
sudo find /var/www/foodomaa -type f -exec chmod 644 {} +
sudo chmod -R 775 /var/www/foodomaa/storage /var/www/foodomaa/bootstrap/cache
Add the scheduler for the web user. Confirm it runs every minute:
* * * * * cd /var/www/foodomaa && php artisan schedule:run >> /dev/null 2>&1
OPcache and queue
Enable OPcache in production and set opcache.validate_timestamps=0 only if you reset OPcache after every deploy. If your build uses queues, run a worker under systemd or Supervisor and restart it after each release.
public, select the supported PHP version, create the database in the panel and add the cron entry. The rest of this guide still applies.