Skip to content

A self-hosted PHP domain expiration monitoring tool that tracks domain expiry dates, RDAP/WHOIS data, and SSL certificate validity. Supports alerts, multi-user setup, and cron automation. Built for developers, hosting providers, and IT admins who want full control without third-party services.

License

Hosteroid/domain-monitor

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

85 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

🌐 Domain Monitor

A powerful, self-hosted domain expiration monitoring system with multi-channel notifications

PHP Version License PRs Welcome

A modern PHP MVC application for monitoring domain expiration dates and sending notifications through multiple channels (Email, Telegram, Discord, Slack). Never lose a domain again with automated monitoring and timely alerts.

✨ Features

Core Features

  • πŸ“‹ Domain Management - Add, edit, and monitor unlimited domains
  • πŸ” Smart WHOIS/RDAP Lookup - Automatically fetches expiration dates and registrar information
  • πŸ—‚οΈ TLD Registry System - Built-in support for 1,400+ TLDs with IANA integration
  • πŸ”” Multi-Channel Notifications - Email, Telegram, Discord, and Slack support
  • πŸ‘₯ Notification Groups - Organize channels and assign domains flexibly
  • ⚑ Real-time Dashboard - Overview of all domains and their status
  • πŸ“Š Notification Logs - Complete history of all sent notifications
  • πŸ€– Automated Monitoring - Cron-based checks with configurable intervals
  • 🎨 Modern UI - Clean, responsive design with intuitive interface

Advanced Features

  • πŸ” Secure by Default - Random passwords, database-backed sessions, prepared statements
  • πŸ”” User Notifications System - In-app notification center with real-time updates
  • πŸ“¬ Smart Notifications - Welcome messages, upgrade alerts, domain warnings
  • 🌐 Advanced Session Management - View all active sessions with geolocation and device tracking
  • 🚨 Remote Session Termination - Logout any device immediately from anywhere
  • πŸ“ˆ Bulk Operations - Import, refresh, and manage multiple domains at once
  • 🎯 Flexible Alerts - Customizable notification thresholds (60, 30, 21, 14, 7, 5, 3, 2, 1 days)
  • πŸ”„ Auto WHOIS Refresh - Keep domain data up-to-date automatically
  • πŸ“± Monitoring Controls - Enable/disable notifications per domain with alerts
  • 🌍 RDAP Support - Modern protocol for faster, structured domain data
  • 🏴 Geolocation Tracking - See location, ISP, and device info for all sessions

πŸ“‹ Requirements

  • PHP 8.1 or higher
  • MySQL 5.7+ or MariaDB 10.3+
  • Composer
  • Apache/Nginx with mod_rewrite enabled
  • Cron support for automated checks
  • SMTP server for email notifications (optional)

πŸ” Security

The application includes built-in authentication with secure practices:

  • πŸ”‘ Random Password Generation - Unique secure password created on installation
  • πŸ›‘οΈ Database-Backed Sessions - True session management with immediate remote logout
  • 🌍 Session Tracking - Monitor all active sessions with location and device info
  • 🚨 Remote Session Control - Terminate suspicious sessions from any device
  • πŸ’‰ SQL Injection Protection - All queries use prepared statements
  • πŸ”’ One-time Credentials - Admin password shown only once during setup
  • πŸͺ Secure Remember Me - Cryptographically secure 30-day tokens linked to sessions

⚠️ Important: Save your admin password during installation - it won't be shown again!

πŸš€ Quick Start

1. Clone the Repository

git clone https://github.com/Hosteroid/domain-monitor.git
cd domain-monitor

2. Install Dependencies

composer install

3. Configure Environment

Copy the example environment file:

# Linux/Mac
cp env.example.txt .env

# Windows
copy env.example.txt .env

Edit .env and configure your settings:

# Database
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=domain_monitor
DB_USERNAME=root
DB_PASSWORD=your_password

Note:

  • The encryption key (APP_ENCRYPTION_KEY) will be automatically generated during web installation
  • Application name, URL, timezone, email settings, and monitoring schedules are configured through the web interface in Settings (not .env)

4. Create Database

Create a MySQL database:

CREATE DATABASE domain_monitor CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

5. Run Web Installer

Option A: Apache/Nginx (Recommended)

Configure your web server (see step 7 below), then visit your domain in a browser:

http://your-domain.com

You'll be automatically redirected to the installer.

Option B: PHP Built-in Server

php -S localhost:8000 -t public

Then visit: http://localhost:8000

The web installer will:

  1. βœ… Create all database tables
  2. βœ… Generate encryption key and save to .env
  3. βœ… Let you set admin email and password
  4. βœ… Show credentials on completion (save them!)

⚠️ IMPORTANT: The installer will display your admin credentials only once. Save them to a secure password manager!

6. Import TLD Registry Data (Optional but Recommended)

After logging in, go to TLD Registry page and click "Import TLDs" to download RDAP and WHOIS server data for 1,400+ TLDs from IANA.

Alternatively, use the CLI:

php cron/import_tld_registry.php

7. Configure Web Server

Apache

Make sure .htaccess is enabled. Your virtual host should point to the public directory.

Example configuration:

<VirtualHost *:80>
    ServerName domainmonitor.local
    DocumentRoot "/path/to/domain-monitor/public"
    
    <Directory "/path/to/domain-monitor/public">
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

PHP Built-in Server (Development)

php -S localhost:8000 -t public

Then visit: http://localhost:8000

πŸ”§ Configuration

Application & Email Settings

All application and email settings are now managed through the Settings page in the web interface:

  1. Navigate to Settings β†’ Application tab

    • Set application name, URL, and timezone
  2. Navigate to Settings β†’ Email tab

    • Configure SMTP server (host, port, encryption)
    • Set authentication credentials
    • Configure from address and name

Example Email Settings:

  • SMTP Host: smtp.gmail.com
  • SMTP Port: 587
  • Encryption: TLS
  • Username: your-email@gmail.com
  • Password: your-app-password

Notification Channels

✈️ Telegram

  1. Create a bot using @BotFather
  2. Get your Chat ID using @userinfobot
  3. Add the channel in the notification group settings

πŸ’¬ Discord

  1. Go to Server Settings β†’ Integrations β†’ Webhooks
  2. Create a new webhook
  3. Copy the webhook URL
  4. Add it in the notification group settings

πŸ’Ό Slack

  1. Go to Slack App Settings
  2. Enable Incoming Webhooks
  3. Create a new webhook
  4. Copy the webhook URL
  5. Add it in the notification group settings

🌐 Webhook (Custom)

Send JSON payloads to any HTTP endpoint (e.g., n8n, Zapier, Make, your own API):

  1. Go to Notification Groups β†’ Edit β†’ Add Channel
  2. Choose "Webhook (Custom)"
  3. Paste your endpoint URL (HTTPS recommended)
  4. Click "Test Channel" to verify

Payload example sent on domain alerts:

{
  "event": "domain_expiration_alert",
  "message": "⚠️ WARNING: Domain 'example.com' expires in 7 days (January 30, 2026)!\n\nRegistrar: Example Registrar\nPlease renew soon.",
  "data": {
    "domain": "example.com",
    "domain_id": 123,
    "days_left": 7,
    "expiration_date": "2026-01-30",
    "registrar": "Example Registrar"
  },
  "sent_at": "2025-10-17T12:34:56Z"
}

Use this with n8n's "Webhook" trigger to start flows.

πŸ“… Setting Up Cron Jobs

The application requires a cron job to check domains periodically.

πŸ’‘ Pro Tip: The cron path is automatically detected! Go to Settings β†’ System to copy the exact command for your installation.

Linux/Mac

crontab -e

Add this line (or copy from Settings β†’ System):

0 9 * * * /usr/bin/php /your/actual/path/cron/check_domains.php

Windows

Use Task Scheduler:

  1. Open Task Scheduler
  2. Create Basic Task
  3. Set trigger (e.g., Daily at 9:00 AM)
  4. Action: Start a program
  5. Program: C:\php\php.exe
  6. Arguments: Copy from Settings β†’ System tab (auto-detected path)

πŸ§ͺ Testing Notifications

Before setting up the cron job, test your notification channels through the web interface:

  1. Go to Settings β†’ Email tab
  2. Enter a test email address
  3. Click "Send Test Email" to verify SMTP configuration
  4. For Telegram/Discord/Slack, send a test from the notification group settings

πŸ“– Usage Guide

Adding Domains

  1. Navigate to Domains β†’ Add Domain
  2. Enter the domain name (e.g., example.com)
  3. Optionally assign to a notification group
  4. Click Add Domain

The system will automatically fetch WHOIS information.

Creating Notification Groups

  1. Navigate to Notification Groups β†’ Create Group
  2. Enter a name and description
  3. Click Create Group
  4. Add notification channels (Email, Telegram, Discord, Slack)
  5. Assign domains to the group

Monitoring

The Dashboard shows:

  • Total domains and their status
  • Domains expiring soon
  • Recent notifications sent

Notification Schedule

By default, notifications are sent at these intervals before expiration:

  • 60 days (2 months)
  • 30 days (1 month)
  • 21 days (3 weeks)
  • 14 days (2 weeks)
  • 7 days (1 week)
  • 5 days
  • 3 days
  • 2 days
  • 1 day (tomorrow!)
  • When expired (immediate alert)

Configure Settings

All system settings are managed through the Settings page (/settings) in your browser:

Application Settings

  • Application Name: Customize the display name
  • Application URL: Base URL for links in emails
  • Timezone: Set your preferred timezone
  • User Registration: Enable/disable new user signups
  • Email Verification: Require email verification for new users

Email Settings

  • SMTP Configuration: Host, port, encryption
  • Authentication: Username and password
  • From Address: Email sender details

Monitoring Settings

  • Notification Schedule: Choose from presets or create custom

    • Minimal: 30, 7, 1 days
    • Standard: 60, 30, 21, 14, 7, 5, 3, 2, 1 days
    • Frequent: 90, 60, 45, 30, 21, 14, 10, 7, 5, 3, 2, 1 days
    • Business Focused: 60, 30, 14, 7, 3, 1 days
    • Custom: Enter your own comma-separated days
  • Check Interval: How often to check domains

    • Every 6 hours
    • Every 12 hours
    • Daily (24 hours)
    • Every 2 days
    • Weekly

System Settings

  • Auto-Detected Cron Path: Copy-paste ready cron commands with your actual installation path
  • Log File Locations: Find logs for troubleshooting

User Notifications

Stay informed with the in-app notification system:

Notification Center

  • Bell Icon: Top navigation shows unread count with animated indicator
  • Dropdown Preview: Quick view of 5 most recent unread notifications
  • Full Page: /notifications with complete history and management

Notification Types

  • πŸ“¬ Welcome - Sent when you create an account or system is installed
  • ⬆️ System Upgrade - Admins notified when system is updated (includes version & migration count)
  • πŸ”΄ Domain Expiring - Alerts based on your configured thresholds
  • ⚠️ Domain Expired - Critical alerts for expired domains
  • πŸ”„ Domain Updated - WHOIS data changes detected
  • πŸ” New Login - Security alerts for new device logins
  • ❌ WHOIS Failed - Lookup errors and issues

Notification Features

  • Filter by Status: Unread, Read, or All
  • Filter by Type: Domain, System, or Security notifications
  • Date Ranges: Today, This Week, This Month, All Time
  • Pagination: View 10, 25, 50, or 100 per page
  • Quick Actions: Mark as read, Delete, Mark all read, Clear all

Profile Management

Access your profile settings via the top-right user menu:

My Profile

  • Update full name and email
  • View account creation date
  • Check last login timestamp
  • Email verification status

Security

  • Change password securely
  • Password strength requirements
  • Security best practices

Active Sessions

  • View All Sessions: See every device where you're logged in
  • Session Details: Location (country, city), ISP, device type, browser
  • Country Flags: Visual indicators for each session location
  • Session Age: See when each session was created
  • Last Activity: Monitor recent activity per session
  • Remember Me Indicator: See which sessions have "remember me" enabled
  • Remote Logout: Terminate individual sessions or all other sessions
  • Instant Termination: Deleted sessions are logged out immediately

All settings are stored in the database and can be updated at any time through the web interface.

πŸ“ Project Structure

Domain Monitor/
β”œβ”€β”€ app/
β”‚   β”œβ”€β”€ Controllers/        # Application controllers
β”‚   β”œβ”€β”€ Models/            # Database models (User, Domain, SessionManager, etc.)
β”‚   β”œβ”€β”€ Services/          # Business logic & services
β”‚   β”‚   β”œβ”€β”€ Channels/      # Notification channel implementations
β”‚   β”‚   └── NotificationService.php  # Notification creation & management
β”‚   β”œβ”€β”€ Helpers/           # Helper classes for formatting & display logic
β”‚   β”‚   β”œβ”€β”€ LayoutHelper.php     # Global layout data (notifications, stats)
β”‚   β”‚   β”œβ”€β”€ DomainHelper.php     # Domain formatting & calculations
β”‚   β”‚   └── SessionHelper.php    # Session display formatting
β”‚   └── Views/             # HTML views (pure display, no business logic)
β”œβ”€β”€ core/                  # Core MVC framework
β”‚   β”œβ”€β”€ DatabaseSessionHandler.php  # Database session storage
β”‚   β”œβ”€β”€ SessionValidator.php        # Session validation middleware
β”‚   β”œβ”€β”€ Auth.php           # Authentication helpers
β”‚   └── ...
β”œβ”€β”€ cron/                  # Cron job scripts
β”œβ”€β”€ database/
β”‚   └── migrations/        # Database migrations
β”œβ”€β”€ public/                # Web root (index.php, assets)
β”œβ”€β”€ routes/                # Route definitions
β”œβ”€β”€ vendor/                # Composer dependencies
└── .env                   # Environment configuration

πŸ” Security Considerations

  1. Never commit .env - Contains sensitive credentials
  2. Secure your web server - Point only the public directory to the web
  3. Use strong database passwords
  4. Enable HTTPS in production
  5. Protect cron endpoints - Ensure cron scripts aren't web-accessible
  6. Regular updates - Keep dependencies updated

πŸ› Troubleshooting

WHOIS Lookup Fails

  • Some domain TLDs may not be supported
  • Check if the domain is valid and registered
  • Verify your server can make outbound connections

Notifications Not Sending

  1. Check logs: logs/cron.log
  2. Verify notification channel configuration in Settings β†’ Email
  3. Test email using the built-in test function in Settings
  4. Check SMTP/API credentials in Settings

Database Connection Error

  • Verify database credentials in .env
  • Ensure MySQL service is running
  • Check if database exists

Cron Job Not Running

  • Verify cron syntax and paths
  • Check server logs
  • Test manually: php cron/check_domains.php

πŸ› Bug Reports & Feature Requests

We welcome bug reports and feature requests! Please use GitHub Issues:

🐞 Report a Bug

Found a bug? Open an issue with:

  • Clear description of the issue
  • Steps to reproduce
  • Expected vs actual behavior
  • Environment details (PHP version, OS, etc.)

πŸ’‘ Request a Feature

Have an idea? Submit a feature request with:

  • Clear description of the feature
  • Use case and benefits
  • Any implementation ideas

🀝 Contributing

Contributions are welcome and appreciated! Here's how you can help:

How to Contribute

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/AmazingFeature)
  3. Make your changes
  4. Test thoroughly
  5. Commit your changes (git commit -m 'Add some AmazingFeature')
  6. Push to the branch (git push origin feature/AmazingFeature)
  7. Open a Pull Request

Development Guidelines

  • Follow PSR-12 coding standards
  • Write clear commit messages
  • Add comments for complex logic
  • Test your changes before submitting
  • Update documentation as needed

Areas for Contribution

  • πŸ› Bug fixes
  • ✨ New features
  • πŸ“ Documentation improvements
  • 🌍 Translations
  • 🎨 UI/UX enhancements
  • ⚑ Performance optimizations

πŸ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.

TL;DR: Free to use for personal and commercial projects. Attribution appreciated but not required.

πŸ“§ Support & Community

πŸ’Ό Created & Sponsored By

This project is proudly created and maintained by Hosteroid, a leading provider of premium hosting solutions.

Hosteroid

Services: Web Hosting β€’ VPS β€’ Dedicated Servers β€’ Domain Registration

🌐 Website: hosteroid.uk
πŸ“§ Contact: support@hosteroid.uk


πŸ™ Acknowledgments

  • Created by Hosteroid
  • WHOIS/RDAP data from IANA
  • Built with modern PHP and love ❀️

πŸ“Š Project Stats

GitHub stars GitHub forks GitHub issues GitHub pull requests


Made with ❀️ by Hosteroid

Report Bug β€’ Request Feature β€’ Visit Hosteroid

About

A self-hosted PHP domain expiration monitoring tool that tracks domain expiry dates, RDAP/WHOIS data, and SSL certificate validity. Supports alerts, multi-user setup, and cron automation. Built for developers, hosting providers, and IT admins who want full control without third-party services.

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Languages