Coolify Setup: Application Deployment with Self-Hosted PaaS
Coolify installation, Docker and Git integration, application deployment, database management, SSL certificates, environment variables, and self-hosted PaaS alternative to Heroku/Netlify.
Uptime Kuma installation with Docker, HTTP/TCP/DNS/ping monitoring, notification integrations (Telegram, Discord, email), status page creation, and alert configuration.
Uptime Kuma is a self-hosted uptime monitoring tool that tracks the operational status of your services and websites. With a beautiful web interface, various monitor types, and rich notification integrations, it offers a great alternative to Uptime Robot.
Uptime Kuma's standout features:
docker run -d \
--name uptime-kuma \
--restart=always \
-p 3001:3001 \
-v uptime-kuma:/app/data \
louislam/uptime-kuma:latest
After installation:
http://SERVER_IP:3001
# docker-compose.yml
version: '3.8'
services:
uptime-kuma:
image: louislam/uptime-kuma:latest
container_name: uptime-kuma
restart: unless-stopped
ports:
- "3001:3001"
volumes:
- uptime-kuma:/app/data
security_opt:
- no-new-privileges:true
volumes:
uptime-kuma:
docker compose up -d
# /etc/nginx/sites-available/uptime.example.com
server {
listen 80;
server_name uptime.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name uptime.example.com;
ssl_certificate /etc/letsencrypt/live/uptime.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/uptime.example.com/privkey.pem;
location / {
proxy_pass http://localhost:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
}
sudo ln -s /etc/nginx/sites-available/uptime.example.com /etc/nginx/sites-enabled/
sudo certbot --nginx -d uptime.example.com
sudo nginx -t && sudo systemctl reload nginx
Create an admin account on first login:
For monitoring websites and API endpoints:
Monitor Type: HTTP(S)
Friendly Name: Homepage
URL: https://example.com
Heartbeat Interval: 60 seconds
Retries: 3
Accepted Status Codes: 200-299
Advanced HTTP settings:
# Keyword monitoring (search for specific text on page)
Monitor Type: HTTP(S) - Keyword
Keyword: "Welcome"
# JSON Query monitoring (API response check)
Monitor Type: HTTP(S) - JSON Query
JSON Path: $.status
Expected Value: ok
# Endpoint requiring Basic Auth
Authentication: Basic Auth
Username: api_user
Password: api_password
Monitor Type: TCP Port
Friendly Name: MySQL Database
Hostname: db.example.com
Port: 3306
Heartbeat Interval: 120 seconds
Monitor Type: DNS
Friendly Name: DNS Check
Hostname: example.com
Resolver Server: 8.8.8.8
DNS Resolve Type: A
Expected Value: 1.2.3.4
Monitor Type: Ping
Friendly Name: Server Ping
Hostname: 192.168.1.1
Heartbeat Interval: 60 seconds
# Monitor Docker container status
Monitor Type: Docker Container
Container Name / ID: nginx
Docker Host: /var/run/docker.sock
Monitor Type: HTTP(S)
URL: https://example.com
# In SSL tab:
Enable SSL Certificate Expiry Notification: ON
Notify Before (days): 30
# 1. Create a bot from BotFather
# Set bot name and username with /newbot command
# Get Bot Token: 1234567890:ABCdefGHIjklMNOpqrSTUvwxYZ
# 2. Get Chat ID
# Send a message to the bot, then:
curl https://api.telegram.org/bot<TOKEN>/getUpdates
# Note the "chat":{"id":123456789} value
Telegram settings in Uptime Kuma:
Notification Type: Telegram
Bot Token: 1234567890:ABCdefGHIjklMNOpqrSTUvwxYZ
Chat ID: 123456789
Message Thread ID: (optional, for group topics)
# Create Webhook in Discord:
# Server Settings → Integrations → Webhooks → New Webhook
# Copy Webhook URL
Notification Type: Discord
Discord Webhook URL: https://discord.com/api/webhooks/...
Username: Uptime Kuma
Prefix: [ALERT]
Notification Type: Slack
Slack Webhook URL: https://hooks.slack.com/services/...
Channel: #alerts
Username: Uptime Kuma
Icon Emoji: :warning:
Notification Type: Email (SMTP)
From Email: alerts@example.com
To Email: admin@example.com
SMTP Host: smtp.gmail.com
SMTP Port: 587
SMTP Username: alerts@example.com
SMTP Password: app-password
Security: STARTTLS
# Send notifications to any service with custom webhook
Notification Type: Webhook
Post URL: https://api.example.com/alerts
Content Type: application/json
# Example payload:
{
"monitor": "{{monitorName}}",
"status": "{{status}}",
"message": "{{msg}}",
"time": "{{time}}"
}
status.example.com# Status Page settings:
Title: Service Status
Description: Real-time status of all our services
Theme: Auto (Light/Dark)
Custom CSS: (custom styles)
Footer Text: © 2024 Company Name
# Domain binding:
Custom Domain: status.example.com
# DNS: CNAME status.example.com → uptime.example.com
# Create incident on status page:
# Status Pages → Edit → Incidents → Create Incident
Title: Planned Maintenance
Content: Maintenance will be performed between 02:00-04:00.
Style: info / warning / danger
To avoid false alarms during planned maintenance:
Maintenance → Add Maintenance
Title: Weekly Maintenance
Strategy: Recurring
Start Time: Sunday 02:00
End Time: Sunday 04:00
Timezone: UTC
Affected Monitors: All monitors
# Update with Docker
docker stop uptime-kuma
docker rm uptime-kuma
docker pull louislam/uptime-kuma:latest
# Restart (data preserved in volume)
docker run -d \
--name uptime-kuma \
--restart=always \
-p 3001:3001 \
-v uptime-kuma:/app/data \
louislam/uptime-kuma:latest
# Backup Uptime Kuma data
docker exec uptime-kuma tar -czf /tmp/backup.tar.gz /app/data
docker cp uptime-kuma:/tmp/backup.tar.gz ./uptime-kuma-backup-$(date +%Y%m%d).tar.gz
# Restore
docker cp ./uptime-kuma-backup.tar.gz uptime-kuma:/tmp/
docker exec uptime-kuma tar -xzf /tmp/backup.tar.gz -C /
You can monitor all services running on your REXE servers with Uptime Kuma. With Telegram notifications, you'll be instantly informed of any service outages.
Open port 3001 in the firewall: 'ufw allow 3001/tcp'. Check that the container is running with 'docker ps | grep uptime-kuma'. If using Nginx reverse proxy, check the proxy_pass settings and SSL certificate.
Verify the bot token is correct. Run 'curl https://api.telegram.org/bot<TOKEN>/getUpdates' to verify the Chat ID. You must have sent at least one message to the bot. If using a group, add the bot to the group and make it an admin. Use the 'Test' button in Notification settings to send a test notification.
Check the Accepted Status Codes setting (default: 200-299). If your site returns 301/302 redirects, add those too. If there's an SSL certificate error, enable the 'Ignore TLS/SSL error' option. Increase the timeout. Verify that the site is accessible from the server where Uptime Kuma is running.
Enter your domain name in the 'Custom Domain' field in status page settings (e.g., status.example.com). Create a CNAME record in DNS: status.example.com → uptime.example.com. If using Nginx reverse proxy, add a new server block. Get an SSL certificate with Let's Encrypt.
Increase the heartbeat interval (120-300 seconds instead of 60). Disable unnecessary monitors. Allocate more resources to the Uptime Kuma container. The SQLite database can slow down as it grows; regularly clean up old records. Use the 'Settings → Database → Shrink Database' option.
When creating or editing an HTTP(S) monitor, go to the 'SSL' tab. Enable the 'Enable SSL Certificate Expiry Notification' option. Set how many days in advance you want to be notified (e.g., 30 days). Make sure your notification channel (Telegram, email, etc.) is configured.
Coolify installation, Docker and Git integration, application deployment, database management, SSL certificates, environment variables, and self-hosted PaaS alternative to Heroku/Netlify.
Nextcloud installation with Docker, Apache/Nginx configuration, database setup, SSL certificate, file synchronization, app store, and performance optimization.
Portainer CE installation, Docker and Kubernetes management, stack deployment, volume/network management, user authorization, webhook and GitOps integration.