# Installation

> Set up Who's OOO on your server using Docker or deploy to fortrabbit

## Deploy on fortrabbit (recommended)

The easiest way to run Who's OOO in production is on [fortrabbit](https://www.fortrabbit.com) — a PHP hosting platform purpose-built for Symfony apps. No Docker required.

1. Create a fortrabbit App — use the [minimal stack configuration](https://www.fortrabbit.com/pricing?php=xs&database=xs&storage=xs&traffic=xs&backups=xs&jobs=xs&key-value-store=off) (€4.5/month) when selecting components in the app creation wizard
2. Install the [fortrabbit GitHub app](https://github.com/apps/fortrabbit) on your GitHub account
3. Connect your GitHub repository to the fortrabbit App — you can select an existing repo or create a new one during app setup
4. Map your deployment branch (e.g. `main`) to the fortrabbit environment
5. Configure your `.env` variables in the fortrabbit Dashboard
6. Deploy by pushing to your mapped branch — fortrabbit deploys automatically on each `git push`, or you can trigger deployments manually through the Dashboard

fortrabbit's [GitHub integration](https://www.fortrabbit.com/features/github-integration) handles deployment pipelines with Composer and Node.js, intelligent caching for fast successive deployments, and comprehensive settings for deployment strategy, include/exclude patterns, and source directory configuration. We run our own Who's OOO instance on fortrabbit.

## Docker Compose (self-hosted)

If you prefer to manage your own infrastructure, Who's OOO ships as a Docker Compose stack.

### Prerequisites

You only need three tools installed on your machine:

| Tool           | Version |
|----------------|---------|
| Docker         | 20+     |
| Docker Compose | 2+      |
| Git            | any     |

No host PHP, MySQL, Node, or Composer required — everything runs inside containers.

### Clone and Start

```bash
git clone https://github.com/igornast/who-is-out-of-office.git
cd who-is-out-of-office
just start
```

Four services will start:

| Service | Port | Description              |
|---------|------|--------------------------|
| nginx   | 80   | Web server               |
| php     | —    | PHP-FPM with Xdebug      |
| db      | 3306 | MySQL 8.4                |
| mailpit | 8025 | Local email catcher       |

On first boot the PHP container automatically installs Composer dependencies, waits for the database, runs migrations, and loads demo fixtures. Watch the container logs until you see "Starting PHP-FPM" — the app is then ready.

### Log In

Open [http://localhost/app](http://localhost/app) in your browser. You'll see the login page.

![Login page with email and password fields](/assets/images/docs/login.png)
*The login page at /app*

The fixtures create three accounts so you can test every role:

| Role    | Email              | Password |
|---------|--------------------|----------|
| Admin   | admin@whoisooo.app      | 123      |
| Manager | manager@whoisooo.app    | 123      |
| User    | user@whoisooo.app       | 123      |

### Dashboard Overview

After logging in you land on the dashboard. What you see depends on your role:

- **Admin** — full organization view: leave balance stats, all pending requests, who's out today, upcoming absences, birthdays, and work anniversaries.
- **Manager** — same sections, scoped to your direct reports.
- **User** — your personal leave balance, who's out today and this week, your upcoming absences, and organization-wide birthdays and work anniversaries.

The sidebar gives access to leave requests, the team calendar, your profile, and (for admins) organization settings.

![Admin dashboard showing stats cards, upcoming absences, birthdays, and work anniversaries](/assets/images/docs/dashboard.png)
*The admin dashboard with all sections visible*

### Local Email with Mailpit

The development environment includes [Mailpit](https://mailpit.axllent.org/), a local email catcher. Every email the app sends (invitations, leave request notifications) is captured here instead of being delivered.

Open [http://localhost:8025](http://localhost:8025) to view caught emails.

> **Tip:** No SMTP configuration needed for local development — Mailpit is pre-configured in the Docker setup.

