Files
ismysiteup.online/DOMAIN_MONITORING_SETUP.md
T
2026-01-24 12:16:10 +02:00

237 lines
6.9 KiB
Markdown

# Domain Expiration Monitoring Setup
This feature allows you to monitor domain expiration dates and receive alerts when domains are expiring soon.
## Features Implemented
### 1. Database Migration
- **Table:** `domains`
- **Columns:**
- `id` - Primary key
- `site_id` - Foreign key to sites table
- `domain` - Domain name (e.g., example.com)
- `expires_at` - Domain expiration date
- `last_checked_at` - Last WHOIS check timestamp
- `is_active` - Enable/disable monitoring
- `created_at`, `updated_at` - Timestamps
### 2. Models & Relationships
- **Domain Model** (`app/Models/Domain.php`)
- Belongs to Site
- Helper methods:
- `isExpiringSoon()` - Check if expiring within 30 days
- `isExpired()` - Check if already expired
- `daysUntilExpiration()` - Get days remaining
- **Site Model** updated with `domains()` relationship
### 3. Background Job
- **Job:** `CheckDomainExpiry` (`app/Jobs/CheckDomainExpiry.php`)
- Performs WHOIS lookup via API
- Updates domain expiration date
- Creates notifications for expiring domains (within 30 days)
- Logs errors for monitoring
### 4. Artisan Command
- **Command:** `monitor:domains`
- Dispatches `CheckDomainExpiry` job for all active domains
- Shows progress bar
- Run manually: `php artisan monitor:domains`
### 5. Scheduled Task
- **Schedule:** Daily at midnight (configurable in `routes/console.php`)
- Automatically runs `monitor:domains` command
- Logs output to `storage/logs/domain-monitoring.log`
### 6. Web Interface
#### Routes
- `GET /domains` - List all domains
- `GET /domains/create` - Add new domain form
- `POST /domains` - Store new domain
- `GET /domains/{domain}` - View domain details
- `GET /domains/{domain}/edit` - Edit domain form
- `PUT /domains/{domain}` - Update domain
- `DELETE /domains/{domain}` - Delete domain
- `POST /domains/{domain}/check` - Manually trigger WHOIS check
#### Views
- `resources/views/domains/index.blade.php` - Domain list with status badges
- `resources/views/domains/create.blade.php` - Add new domain
- `resources/views/domains/edit.blade.php` - Edit domain
- `resources/views/domains/show.blade.php` - Domain details and expiration info
## Setup Instructions
### 1. Configure WHOIS API
The system uses **WHOIS XML API** (https://www.whoisxmlapi.com/) by default. You can use alternatives like:
- WhoisFreaks (https://whoisfreaks.com/)
- Domainr (https://domainr.com/)
**Add to `.env` file:**
```env
WHOIS_API_KEY=your_api_key_here
```
**Get a free API key:**
1. Visit https://www.whoisxmlapi.com/
2. Sign up for a free account
3. Get your API key from the dashboard
4. Free tier includes 500 requests/month
### 2. Run the Migration
If not already run:
```bash
./vendor/bin/sail artisan migrate
```
### 3. Start the Queue Worker
The domain checking jobs run in the background queue:
```bash
./vendor/bin/sail artisan queue:work
```
Or if you're already running the queue worker, it will automatically pick up these jobs.
### 4. Set Up Scheduled Tasks
Make sure your Laravel scheduler is running. In production, add this to your crontab:
```
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
```
In development with Sail, the scheduler should run automatically if you started with `composer dev`.
### 5. Test the System
1. **Add a domain:**
- Navigate to `/domains`
- Click "Add Domain"
- Select a site and enter a domain name
- Save
2. **Manual check:**
- View the domain details
- Click "Check Expiry Now"
- The job will queue and process in the background
3. **Test the command:**
```bash
./vendor/bin/sail artisan monitor:domains
```
## Usage
### Adding Domains
1. Go to "Domain Monitoring" in your application
2. Click "Add Domain"
3. Select the associated site
4. Enter the domain name (without http://)
5. Save - the system will automatically check expiration
### Monitoring
- **Automatic:** Runs daily via scheduled task
- **Manual:** Click "Check Now" on any domain
- **Command:** Run `php artisan monitor:domains` anytime
### Notifications
When a domain is expiring within 30 days or has expired:
- A notification is created in the system
- Shows in your alerts/notifications section
- Contains domain name, expiration date, and days remaining
### Status Badges
- **Active** (Green) - Domain valid, not expiring soon
- **Expiring Soon** (Yellow) - Expires within 30 days
- **Expired** (Red) - Domain has expired
- **Unknown** (Gray) - Not yet checked
## Alternative WHOIS APIs
If you want to use a different WHOIS provider, modify `app/Jobs/CheckDomainExpiry.php`:
### WhoisFreaks Example:
```php
$response = Http::timeout(30)
->get('https://api.whoisfreaks.com/v1.0/whois', [
'apiKey' => config('services.whois.api_key'),
'whois' => $this->domain->domain,
]);
// Parse response differently based on provider's format
```
### Free WHOIS API:
You can also use a free WHOIS lookup service, but be aware of rate limits and reliability.
## Troubleshooting
### Jobs not processing
- Check queue worker is running: `ps aux | grep queue`
- Check failed jobs: `./vendor/bin/sail artisan queue:failed`
- Restart queue: `./vendor/bin/sail artisan queue:restart`
### WHOIS API errors
- Verify API key is set in `.env`
- Check API quota/limits
- Review logs: `storage/logs/laravel.log`
### Schedule not running
- Development: Ensure scheduler is part of your dev command
- Production: Verify cron job is set up
- Test manually: `./vendor/bin/sail artisan schedule:run`
## File Structure
```
app/
├── Console/Commands/
│ └── MonitorDomains.php # Artisan command
├── Http/Controllers/
│ └── DomainController.php # Web controller
├── Jobs/
│ └── CheckDomainExpiry.php # Background job
└── Models/
├── Domain.php # Domain model
└── Site.php # Updated with domains relationship
config/
└── services.php # WHOIS API config
database/migrations/
└── 2026_01_18_120803_create_domains_table.php
resources/views/domains/
├── index.blade.php # List view
├── create.blade.php # Create form
├── edit.blade.php # Edit form
└── show.blade.php # Detail view
routes/
├── console.php # Scheduled tasks
└── web.php # Web routes
```
## API Response Format
The job expects WHOIS API responses with expiry date in these formats:
- `WhoisRecord.registryData.expiresDate`
- `WhoisRecord.expiresDate`
- `expiresDate`
Dates can be in any format parseable by Carbon (ISO 8601, RFC 2822, etc.)
## Future Enhancements
Consider adding:
- Email notifications for expiring domains
- Slack/Discord webhooks
- Configurable warning thresholds (7, 14, 30, 60 days)
- Domain auto-renewal reminders
- Historical tracking of expiration checks
- Bulk import from CSV
- Integration with domain registrars