331 lines
8.6 KiB
Markdown
Executable File
331 lines
8.6 KiB
Markdown
Executable File
---
|
|
title: Chat - Personal Notification HQ
|
|
description: "Ding! You've got... pretty much everything"
|
|
navigation:
|
|
icon: i-lucide-message-circle
|
|
---
|
|
|
|
> *"Ding! You've got... pretty much everything"* - Gotify
|
|
|
|
## What's This All About?
|
|
|
|
Gotify is your self-hosted push notification server! Think of it as your personal notification center that's NOT controlled by Google or Apple. Get alerts from your scripts, servers, and automation tools - all in one place, all under your control!
|
|
|
|
## The Notification Ninja
|
|
|
|
### :icon{name="lucide:bell"} Gotify Server
|
|
|
|
**Container**: `chat_app`
|
|
**Image**: `gotify/server:latest`
|
|
**Home**: https://chat.pivoine.art
|
|
|
|
Gotify is the Swiss Army knife of push notifications:
|
|
- :icon{name="lucide:phone"} **Mobile Apps**: iOS and Android clients available
|
|
- :icon{name="lucide:globe"} **Web Interface**: Check notifications in your browser
|
|
- :icon{name="lucide:plug"} **REST API**: Send notifications from anything
|
|
- :icon{name="lucide:lock"} **App Tokens**: Separate tokens for different applications
|
|
- :icon{name="lucide:bar-chart"} **Priority Levels**: From "meh" to "WAKE UP NOW!"
|
|
- :icon{name="lucide:palette"} **Markdown Support**: Rich formatted messages
|
|
- :icon{name="lucide:package"} **Simple**: Written in Go, single binary, no fuss
|
|
|
|
## How It Works
|
|
|
|
```
|
|
Your Script/Server
|
|
↓
|
|
HTTP POST Request
|
|
↓
|
|
Gotify Server
|
|
↓
|
|
Push to Mobile Apps + Web Interface
|
|
```
|
|
|
|
## Configuration Breakdown
|
|
|
|
### Data Persistence
|
|
Everything lives in a Docker volume:
|
|
```
|
|
Volume: gotify_data
|
|
Path: /app/data
|
|
```
|
|
|
|
This stores:
|
|
- :icon{name="lucide:database"} SQLite database (users, apps, messages)
|
|
- :icon{name="lucide:image"} Application images
|
|
- :icon{name="lucide:cog"} Server configuration
|
|
|
|
### No Exposed Port
|
|
All access goes through Traefik at https://chat.pivoine.art - clean and secure!
|
|
|
|
## First Time Setup :icon{name="lucide:rocket"}
|
|
|
|
1. **Start the stack**:
|
|
```bash
|
|
docker compose up -d
|
|
```
|
|
|
|
2. **Access the web UI**:
|
|
```
|
|
URL: https://chat.pivoine.art
|
|
Default Username: admin
|
|
Default Password: admin
|
|
```
|
|
|
|
3. **IMMEDIATELY change the password**:
|
|
- Click on your username
|
|
- Go to Settings
|
|
- Change that password right now! :icon{name="lucide:lock"}
|
|
|
|
4. **Create an application**:
|
|
- Apps → New Application
|
|
- Name it (e.g., "Server Alerts")
|
|
- Copy the token (you'll need this!)
|
|
|
|
## Sending Your First Notification
|
|
|
|
### Using curl
|
|
```bash
|
|
curl -X POST "https://chat.pivoine.art/message" \
|
|
-H "X-Gotify-Key: YOUR_APP_TOKEN" \
|
|
-F "title=Hello World" \
|
|
-F "message=Your first notification!" \
|
|
-F "priority=5"
|
|
```
|
|
|
|
### Using Python
|
|
```python
|
|
import requests
|
|
|
|
def send_notification(title, message, priority=5):
|
|
url = "https://chat.pivoine.art/message"
|
|
headers = {"X-Gotify-Key": "YOUR_APP_TOKEN"}
|
|
data = {
|
|
"title": title,
|
|
"message": message,
|
|
"priority": priority
|
|
}
|
|
requests.post(url, headers=headers, data=data)
|
|
|
|
send_notification("Deploy Complete", "Your app is live! :icon{name="lucide:rocket"}")
|
|
```
|
|
|
|
### Using Bash Script
|
|
```bash
|
|
#!/bin/bash
|
|
GOTIFY_URL="https://chat.pivoine.art/message"
|
|
GOTIFY_TOKEN="YOUR_APP_TOKEN"
|
|
|
|
notify() {
|
|
curl -X POST "$GOTIFY_URL" \
|
|
-H "X-Gotify-Key: $GOTIFY_TOKEN" \
|
|
-F "title=$1" \
|
|
-F "message=$2" \
|
|
-F "priority=${3:-5}"
|
|
}
|
|
|
|
# Usage
|
|
notify "Backup Complete" "All files backed up successfully" 8
|
|
```
|
|
|
|
## Priority Levels :icon{name="lucide:target"}
|
|
|
|
| Priority | Use Case | Example |
|
|
|----------|----------|---------|
|
|
| 0 | Very low | Background info |
|
|
| 2 | Low | FYI messages |
|
|
| 5 | Normal | Standard notifications |
|
|
| 8 | High | Important updates |
|
|
| 10 | Emergency | WAKE UP! SERVER IS ON FIRE! :icon{name="lucide:flame"} |
|
|
|
|
## Real-World Use Cases
|
|
|
|
### Server Monitoring
|
|
```bash
|
|
# Disk space alert
|
|
if [ $(df -h / | tail -1 | awk '{print $5}' | sed 's/%//') -gt 80 ]; then
|
|
notify "Disk Space Alert" "Root partition is 80% full!" 9
|
|
fi
|
|
```
|
|
|
|
### Backup Notifications
|
|
```bash
|
|
# At end of backup script
|
|
if backup_successful; then
|
|
notify "Backup Complete" "Database backup finished successfully" 5
|
|
else
|
|
notify "Backup Failed" "Database backup encountered errors!" 10
|
|
fi
|
|
```
|
|
|
|
### CI/CD Pipeline
|
|
```yaml
|
|
# .gitlab-ci.yml
|
|
deploy:
|
|
script:
|
|
- deploy.sh
|
|
after_script:
|
|
- |
|
|
curl -X POST "$GOTIFY_URL/message" \
|
|
-H "X-Gotify-Key: $GOTIFY_TOKEN" \
|
|
-F "title=Deploy $CI_COMMIT_REF_NAME" \
|
|
-F "message=Pipeline $CI_PIPELINE_ID completed"
|
|
```
|
|
|
|
### Docker Container Alerts
|
|
```bash
|
|
# Check if container is running
|
|
if ! docker ps | grep -q my_important_container; then
|
|
notify "Container Down" "my_important_container is not running!" 10
|
|
fi
|
|
```
|
|
|
|
### Website Uptime Monitoring
|
|
```bash
|
|
# Simple uptime check
|
|
if ! curl -f https://mysite.com &> /dev/null; then
|
|
notify "Site Down" "mysite.com is not responding!" 10
|
|
fi
|
|
```
|
|
|
|
## Mobile Apps :icon{name="lucide:phone"}
|
|
|
|
### Android
|
|
Download from:
|
|
- F-Droid (recommended)
|
|
- Google Play Store
|
|
- GitHub Releases
|
|
|
|
### iOS
|
|
- Available on App Store
|
|
- Or build from source (TestFlight)
|
|
|
|
**Setup**:
|
|
1. Install app
|
|
2. Add server: `https://chat.pivoine.art`
|
|
3. Enter your client token
|
|
4. Receive notifications!
|
|
|
|
## Web Interface Features
|
|
|
|
- :icon{name="lucide:phone"} Desktop notifications (browser permission needed)
|
|
- :icon{name="lucide:search"} Search through message history
|
|
- :icon{name="lucide:trash"} Delete individual or all messages
|
|
- :icon{name="lucide:users"} Manage applications and clients
|
|
- :icon{name="lucide:cog"} Configure server settings
|
|
- :icon{name="lucide:bar-chart"} View message statistics
|
|
|
|
## Security Best Practices :icon{name="lucide:lock"}
|
|
|
|
1. **Change Default Credentials**: First thing, every time
|
|
2. **Use App Tokens**: Different token for each application/script
|
|
3. **Revoke Unused Tokens**: Clean up old integrations
|
|
4. **HTTPS Only**: Already configured via Traefik ✅
|
|
5. **Client Tokens**: Create separate tokens for each device
|
|
6. **Rate Limiting**: Gotify has built-in protection
|
|
|
|
## Advanced: Markdown Messages
|
|
|
|
Gotify supports Markdown formatting:
|
|
|
|
```bash
|
|
curl -X POST "https://chat.pivoine.art/message" \
|
|
-H "X-Gotify-Key: YOUR_TOKEN" \
|
|
-F "title=Deployment Report" \
|
|
-F "message=## Deploy Status
|
|
|
|
- :icon{name="lucide:check"} Database migration
|
|
- :icon{name="lucide:check"} Frontend build
|
|
- :icon{name="lucide:check"} Backend restart
|
|
- :icon{name="lucide:alert-triangle"} Cache warmup (slower than expected)
|
|
|
|
**Next**: Monitor performance metrics" \
|
|
-F "priority=5"
|
|
```
|
|
|
|
## Maintenance Tasks
|
|
|
|
### View Logs
|
|
```bash
|
|
docker logs chat_app -f
|
|
```
|
|
|
|
### Backup Database
|
|
```bash
|
|
docker exec chat_app cp /app/data/gotify.db /app/data/gotify-backup.db
|
|
docker cp chat_app:/app/data/gotify-backup.db ./backup/
|
|
```
|
|
|
|
### Check Storage
|
|
```bash
|
|
docker exec chat_app du -sh /app/data
|
|
```
|
|
|
|
### Clean Old Messages
|
|
Use the web UI to delete old messages, or configure auto-deletion in settings
|
|
|
|
## Troubleshooting
|
|
|
|
**Q: Not receiving notifications on mobile?**
|
|
A: Check if app has notification permissions and server URL is correct
|
|
|
|
**Q: "Unauthorized" error when sending?**
|
|
A: Verify your app token is correct and not a client token
|
|
|
|
**Q: Web UI won't load?**
|
|
A: Check Traefik is running and DNS points to your server
|
|
|
|
**Q: Messages not persisting?**
|
|
A: Ensure volume is properly mounted and has write permissions
|
|
|
|
## Integration Examples
|
|
|
|
### Home Assistant
|
|
```yaml
|
|
notify:
|
|
- platform: rest
|
|
name: gotify
|
|
resource: https://chat.pivoine.art/message
|
|
method: POST
|
|
headers:
|
|
X-Gotify-Key: YOUR_TOKEN
|
|
message_param_name: message
|
|
title_param_name: title
|
|
```
|
|
|
|
### Prometheus Alertmanager
|
|
```yaml
|
|
receivers:
|
|
- name: 'gotify'
|
|
webhook_configs:
|
|
- url: 'https://chat.pivoine.art/message?token=YOUR_TOKEN'
|
|
```
|
|
|
|
### Node-RED
|
|
Use HTTP request node:
|
|
- Method: POST
|
|
- URL: `https://chat.pivoine.art/message`
|
|
- Headers: `X-Gotify-Key: YOUR_TOKEN`
|
|
- Body: JSON with title, message, priority
|
|
|
|
## Why Gotify Rocks :icon{name="lucide:music"}
|
|
|
|
- :icon{name="lucide:sparkles"} Self-hosted (your data, your server)
|
|
- :icon{name="lucide:smile"} Completely free and open source
|
|
- :icon{name="lucide:rocket"} Super lightweight (Go binary + SQLite)
|
|
- :icon{name="lucide:phone"} Native mobile apps
|
|
- :icon{name="lucide:plug"} Dead simple API
|
|
- :icon{name="lucide:palette"} Clean, modern interface
|
|
- :icon{name="lucide:lock"} No third-party dependencies
|
|
- :icon{name="lucide:dumbbell"} Active development
|
|
|
|
## Resources
|
|
|
|
- [Gotify Documentation](https://gotify.net/docs/)
|
|
- [API Documentation](https://gotify.net/api-docs)
|
|
- [GitHub Repository](https://github.com/gotify/server)
|
|
- [Mobile Apps](https://gotify.net/docs/index)
|
|
|
|
---
|
|
|
|
*"The only notifications worth getting are the ones you control."* - Someone who's tired of their phone buzzing :icon{name="lucide:phone-off"}:icon{name="lucide:sparkles"}
|