Skip to content

Manual Installation

Alexander Elchlepp edited this page Oct 17, 2026 · 1 revision

Manual installation on Ubuntu 26.04 (Apache, MariaDB, PHP 8.5)

This guide installs fewohbee without Docker on Ubuntu 26.04 LTS, using Apache, PHP 8.5 (PHP-FPM) and MariaDB 11.8 from the Ubuntu repositories. MySQL 8.4 works as well.

For most installations the Docker setup is the better choice: it is easier to update and brings backups and scheduled tasks along.

Table of Contents


Install packages

sudo apt update
sudo apt install apache2 mariadb-server git unzip composer \
    php-fpm php-cli php-intl php-gd php-mysql php-zip php-xml php-mbstring php-curl

The php-* packages install the default PHP version of Ubuntu 26.04, PHP 8.5. Check it with php -v. fewohbee requires PHP 8.4 or higher.

Database

Open the MariaDB console. On Ubuntu, the database root user logs in via sudo without a password.

sudo mariadb

Create the database and a user for fewohbee. Use a password of letters and digits only, e.g. generated with openssl rand -hex 20, because it becomes part of a URL later.

CREATE DATABASE fewohbee CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'fewohbee'@'localhost' IDENTIFIED BY 'your-db-password';
GRANT ALL PRIVILEGES ON fewohbee.* TO 'fewohbee'@'localhost';
SELECT VERSION();
EXIT;

Note the version shown by SELECT VERSION(); (e.g. 11.8.6-MariaDB-…). It is needed for DB_SERVER_VERSION below.

PHP settings

The following settings match the official Docker image. They are stored in a separate file, so PHP updates do not overwrite them, and apply to both PHP-FPM and the command line (used by the scheduled tasks). Adjust the time zone to your location.

sudo tee /etc/php/8.5/mods-available/fewohbee.ini > /dev/null <<'EOF'
; priority=99
date.timezone = Europe/Berlin
upload_max_filesize = 10M
post_max_size = 12M
expose_php = Off
session.use_strict_mode = 1
session.cookie_httponly = 1
EOF
sudo phpenmod fewohbee
sudo systemctl restart php8.5-fpm

Install fewohbee

Download the application and hand it over to the web server user:

cd /var/www
sudo git clone https://github.com/developeregrem/fewohbee.git
sudo chown -R www-data:www-data fewohbee
cd fewohbee

Create the configuration from the template:

sudo -u www-data cp .env.dist .env
sudo -u www-data nano .env

Set at least these values. Leave APP_ENV=prod unchanged.

Variable Value
LOCALE de or en
APP_SECRET a random value, e.g. from openssl rand -hex 32
DATABASE_URL mysql://fewohbee:your-db-password@localhost:3306/fewohbee
DB_SERVER_VERSION the version from above in the form 11.8.6-MariaDB (for MySQL just the number, e.g. 8.4.8)
RELYING_PARTY_ID your domain, e.g. fewohbee.example.com (needed for passkey login)

All other settings (emails, passkeys, single sign-on, …) are described on the Configuration page.

Install the dependencies, create the database tables and initialize the application:

sudo -u www-data composer install --no-dev --optimize-autoloader
sudo -u www-data php bin/console doctrine:migrations:migrate --no-interaction
sudo -u www-data php bin/console asset-map:compile
sudo -u www-data php bin/console app:first-run

app:first-run guides you through creating the first admin user and your accommodation, and optionally loads sample data. Composer may warn that it cannot create a cache directory; this is harmless.

Create the directories for uploaded images and fonts, so they exist for backups from the start:

sudo -u www-data mkdir -p public/resources/images/export public/resources/images/room-categories var/storage/fonts

Apache

Enable PHP-FPM for Apache:

sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.5-fpm

Create the site configuration:

sudo nano /etc/apache2/sites-available/fewohbee.conf
<VirtualHost *:80>
    ServerName fewohbee.example.com

    DocumentRoot /var/www/fewohbee/public
    <Directory /var/www/fewohbee/public>
        AllowOverride None
        Require all granted
        FallbackResource /index.php
    </Directory>

    # Pass the Authorization header on to PHP-FPM. Required for API tokens,
    # calendar subscriptions and AI assistants.
    SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1

    ErrorLog ${APACHE_LOG_DIR}/fewohbee_error.log
    CustomLog ${APACHE_LOG_DIR}/fewohbee_access.log combined
</VirtualHost>

Replace fewohbee.example.com with your domain, then disable the default page and enable fewohbee:

sudo a2dissite 000-default
sudo a2ensite fewohbee
sudo systemctl reload apache2

The application is now reachable at http://fewohbee.example.com.

HTTPS

Use HTTPS for every installation that is used productively. Passkey login, single sign-on and AI assistants only work over HTTPS.

If the server is reachable from the internet on port 80 under its domain, Certbot obtains a free Let's Encrypt certificate and configures Apache:

sudo apt install certbot python3-certbot-apache
sudo certbot --apache -d fewohbee.example.com

Certbot creates the HTTPS site from the configuration above, redirects HTTP to HTTPS and renews the certificate automatically.

Scheduled tasks

Calendar synchronization and time-based automations only work if their commands run regularly. Open the crontab of the web server user:

sudo crontab -u www-data -e

and add:

# Calendar synchronization with booking portals (both directions)
*/15 * * * * cd /var/www/fewohbee && php bin/console calendar:import:sync --force
0 * * * * cd /var/www/fewohbee && php bin/console calendars:sync

# Time-based automations (reminders, follow-ups, scheduled emails)
*/15 * * * * cd /var/www/fewohbee && php bin/console workflow:process-scheduled

# Log retention
0 3 * * * cd /var/www/fewohbee && php bin/console app:purge-logs --days=90

# Optional: monthly statistics snapshots for year-over-year comparisons
5 0 1 * * cd /var/www/fewohbee && php bin/console stats:snapshot:month

The schedule matches the Docker setup (docker/app/crontab).

Updates

Create a backup before every update and read the release notes for version-specific steps.

cd /var/www/fewohbee
sudo -u www-data git pull
sudo -u www-data composer install --no-dev --optimize-autoloader
sudo -u www-data php bin/console doctrine:migrations:migrate --no-interaction
sudo -u www-data php bin/console asset-map:compile
sudo -u www-data php bin/console cache:clear
sudo systemctl reload php8.5-fpm

If a release introduces new variables, compare your .env with .env.dist and add them.

Backups

Back up the database, the configuration and the uploaded images and fonts:

sudo mariadb-dump --single-transaction fewohbee | gzip > fewohbee-db-$(date +%F).sql.gz
sudo tar -czf fewohbee-files-$(date +%F).tar.gz -C /var/www/fewohbee \
    .env public/resources/images/export public/resources/images/room-categories var/storage/fonts

Copy both files to another device; a backup on the same disk does not survive a disk failure. The file archive contains .env with all passwords, so store it securely.

To restore:

gunzip < fewohbee-db-YYYY-MM-DD.sql.gz | sudo mariadb fewohbee
sudo tar -xzf fewohbee-files-YYYY-MM-DD.tar.gz -C /var/www/fewohbee

Clone this wiki locally