-
Notifications
You must be signed in to change notification settings - Fork 15
Installation
There are two supported installation paths: Docker (recommended for quick evaluation) and manual (for production with WAMP/XAMPP/LAMP).
The fastest way to get FreeITSM running β no PHP, MySQL, or web server setup required.
git clone https://github.com/edmozley/freeitsm.git
cd freeitsm
docker compose up -dThen open http://localhost:8080/setup/ to verify the installation and create your admin account.
Requires Docker Desktop (Windows/Mac) or Docker Engine (Linux).
-
Web server: Apache (WAMP, XAMPP, LAMP) works out of the box. nginx is supported but needs a config file β the security rules Apache picks up from
.htaccessdo not exist on nginx until you install it. See Running on nginx before going live - PHP: 7.4 or higher (tested up to 8.4). PHP 8.3 or 8.4 recommended β 7.4 and 8.0 still run, but have reached end of life upstream and no longer receive security updates
- Database: MySQL 8.0 or higher (included with WAMP/XAMPP)
-
Extensions: PHP
pdo,pdo_mysql,curl,openssl,mbstring -
Optional extensions:
imapβ only needed for basic IMAP/SMTP mailboxes. Note that PHP 8.4 no longer bundlesimap; on 8.4 you must install it from PECL, or that mailbox type will silently collect no mail. The setup page reports whether it's present -
Database credentials file: A
db_config.phpfile stored outside your web root (e.g.C:\wamp64\db_config.php) β the path is configured inconfig.php(see step 2 below)
β οΈ Note for early adopters: If you downloaded FreeITSM before 18 February 2026, the project required Microsoft SQL Server Express and ODBC drivers. FreeITSM now runs on MySQL with no extra drivers needed. Existing SQL Server installs will need a data migration, plus an update todb_config.phpfor MySQL.
-
Clone the repository
git clone https://github.com/edmozley/freeitsm.git cd freeitsm -
Configure database credentials Copy
db_config.sample.phpto a secure location outside your web root:C:\wamp64\db_config.php (recommended on Windows)Edit the copied file with your MySQL credentials:
define('DB_SERVER', 'localhost'); define('DB_NAME', 'freeitsm'); define('DB_USERNAME', 'your_username'); define('DB_PASSWORD', 'your_password');
Update
config.phpline 10 if you chose a different location. -
Create the database Create a database named
freeitsmin MySQL. Rundatabase/freeitsm.sqlto create all tables, or use the Setup page's DB Verify to auto-create them. -
Set up encryption key (for sensitive settings)
mkdir C:\wamp64\encryption_keys # Generate a random 256-bit key (64 hex characters) php -r "echo bin2hex(random_bytes(32));" > C:\wamp64\encryption_keys\sdtickets.key
The key file defaults to
C:\wamp64\encryption_keys\sdtickets.key(Windows) or/var/www/encryption_keys/freeitsm.key(Linux). To keep it elsewhere β e.g. your web root isn't/var/wwwβ set its path inconfig.php(define('ENCRYPTION_KEY_PATH', '/your/path/...')) or via theENCRYPTION_KEY_PATHenvironment variable (used by the Docker image). -
Configure web server
- Point your web server to the application root
- Ensure PHP extensions are enabled:
pdo_mysql,curl,openssl,mbstring - Restart your web server
-
Verify setup Navigate to
http://your-server/setup/to run the verification checks (config files, database connection, PHP extensions, security settings). Delete the/setupfolder once your system is in production. -
First login Navigate to
http://your-server/login.php. A default admin account is created by the SQL script:- Username:
admin - Password:
freeitsm
Change this password immediately after first login via the account menu.
- Username:
-
Import demo data (optional) Navigate to System β Demo Data to populate modules with realistic sample data. Import Core first (creates analysts, departments, teams, end users), then choose which modules to populate.
- Includes tickets, assets, knowledge articles, changes, calendar events, morning checks, contracts, service status, software licences, forms, tasks, process flowcharts, and CMDB objects
- Demo analysts use password
demo1234 - Designed for fresh installations only β each module can be imported once
| File | Location | Purpose | Commit to Git? |
|---|---|---|---|
config.php |
Web root | Main config (references external DB config) | β Yes |
db_config.php |
Outside web root | Database credentials | β No |
db_config.sample.php |
Web root | Template for db_config.php | β Yes |
sdtickets.key |
Outside web root | AES-256-GCM encryption key | β No |
| Component | Technology |
|---|---|
| Backend | PHP 7.4β8.4 |
| Database | MySQL 8.0+ (PDO MySQL) |
| Frontend | Vanilla JavaScript, HTML5, CSS3 (no frameworks) |
| Rich Text Editor | TinyMCE 6+ |
| Email integration | Microsoft Graph API + Gmail API (OAuth 2.0) |
| Encryption | AES-256-GCM (sensitive data at rest) |
| Web server | Apache (WAMP/XAMPP/LAMP), or nginx with its config file |
FreeITSM β an open-source IT Service Management platform Β· github.com/edmozley/freeitsm Β· MIT licence
- Installation
- β° Scheduled tasks (cron jobs)
- Architecture
- AI Providers
- Internationalisation (i18n)
- Timezones & Time Handling
- Theming & Dark Mode
- β¨οΈ Command palette (βK)
- π Searching inside tickets
- π Attached documents
- MobileβFriendly
-
Security
- Layer 1 β which modules you can enter
- β³ π§© Module Access Control
- β³ π οΈ Module Access β Developer Guide
- Layer 2 β what you can administer
- β³ π Roles & Permissions
- β³ π οΈ Roles β Developer Guide
- β³ π€ Why capabilities are constants
- Layer 3 β the System module
- β³ π Admin Access Control
- Hardening
- β³ π Security review response 2026-08
- β³ π‘οΈ Security hardening 2026-08
- β³ π οΈ Security hardening 2026-08 β Developer Guide
- β³ π‘οΈ Round three β plain English
- β³ π οΈ Round three β Developer Guide
- Single Sign-On (SSO)
- ποΈ LDAP & Active Directory
- Browser Extension
- API Reference
-
π REST API β how it works
- β³ π« REST API: Tickets
- β³ π» REST API: Assets
- β³ π΄ REST API: Problems
- β³ π REST API: Changes
- β³ π REST API: Knowledge
- β³ β REST API: Tasks
- β³ ποΈ REST API: CMDB
- β³ π REST API: Contracts
- β³ ποΈ REST API: Calendar
- β³ πΏ REST API: Software
- β³ π¦ REST API: Service Status
- β³ βοΈ REST API: Morning Checks
- β³ π REST API: Forms
- β³ βοΈ REST API: Workflow
- β³ πΊοΈ REST API: Network Mapper
- β³ π§ Using the API docs page
- β³ π OpenAPI specification
- β³ β OpenAPI: kept correct
- β³ π οΈ Maintaining the catalogue
- Watchtower
-
Tickets
- β³ Mailbox Authentication
- β³ π€ Email send log
- β³ Basic IMAP mailboxes
- β³ Email rendering & images
- β³ SLA Management
- β³ WhatsApp channel
- β³ π¬ Web chat channel
- β³ π£ Slack channel
- β³ π Linking tickets
- β³ ποΈ Canned responses
- β³ βοΈ Limiting replies to particular senders
- β³ βοΈ Email signatures
- β³ π The public web address
- β³ π Raising a ticket for someone else
- β³ π Merging tickets
- β³ β Splitting tickets
- β³ β Selecting several tickets
- β³ π οΈ Snoozing tickets β Developer Guide
- β³ π₯ Collision detection
- β³ β±οΈ Time tracking
- Problem Management
- Tasks
- Assets
- Knowledge
- Change Management
- Calendar
- Morning Checks
- Reporting
- Software
- Forms
- Contracts
- Service Status
- π Notifications
- π¨ War Room
- Self-Service Portal
- LMS
- Process Mapper
- CMDB
- Network Mapper
- Workflows
- Issue trackers (Jira, Azure DevOps)
- System
-
Overview
- β³ π Progress tracker
- β³ Concepts & vocabulary
- β³ Email routing & mailboxes
- β³ Settings: global vs per-company
- β³ Users & self-service
- β³ Staff cross-company access
- β³ Worked examples
- β³ Pitfalls & gotchas
- β³ Scope: what it's for
- β³ π οΈ Developer Guide (make a module multi-company)
- β³ ποΈ Case study: CMDB (a linked graph)
- β³ π§ͺ Test harness (prove it's isolated)