feat: Add container restart functionality from web UI
- Added restart button to settings page - Created /api/restart endpoint (file-flag based) - Implemented watch-restart.sh daemon - Added systemd service for restart watcher - Updated README with restart setup instructions - Container automatically restarts when settings changed Settings flow: 1. User edits settings in web UI 2. Click 'Save Settings' to persist to .env 3. Click 'Restart Bot' to apply changes 4. Watcher detects flag and restarts container 5. New settings loaded automatically
This commit is contained in:
@@ -29,6 +29,7 @@ export default function SettingsPage() {
|
||||
const [settings, setSettings] = useState<TradingSettings | null>(null)
|
||||
const [loading, setLoading] = useState(true)
|
||||
const [saving, setSaving] = useState(false)
|
||||
const [restarting, setRestarting] = useState(false)
|
||||
const [message, setMessage] = useState<{ type: 'success' | 'error', text: string } | null>(null)
|
||||
|
||||
useEffect(() => {
|
||||
@@ -58,7 +59,7 @@ export default function SettingsPage() {
|
||||
})
|
||||
|
||||
if (response.ok) {
|
||||
setMessage({ type: 'success', text: 'Settings saved! Restart the bot to apply changes.' })
|
||||
setMessage({ type: 'success', text: 'Settings saved! Click "Restart Bot" to apply changes.' })
|
||||
} else {
|
||||
setMessage({ type: 'error', text: 'Failed to save settings' })
|
||||
}
|
||||
@@ -68,6 +69,25 @@ export default function SettingsPage() {
|
||||
setSaving(false)
|
||||
}
|
||||
|
||||
const restartBot = async () => {
|
||||
setRestarting(true)
|
||||
setMessage(null)
|
||||
try {
|
||||
const response = await fetch('/api/restart', {
|
||||
method: 'POST',
|
||||
})
|
||||
|
||||
if (response.ok) {
|
||||
setMessage({ type: 'success', text: 'Bot is restarting... Settings will be applied in ~10 seconds.' })
|
||||
} else {
|
||||
setMessage({ type: 'error', text: 'Failed to restart bot. Please restart manually with: docker restart trading-bot' })
|
||||
}
|
||||
} catch (error) {
|
||||
setMessage({ type: 'error', text: 'Failed to restart bot. Please restart manually with: docker restart trading-bot' })
|
||||
}
|
||||
setRestarting(false)
|
||||
}
|
||||
|
||||
const updateSetting = (key: keyof TradingSettings, value: any) => {
|
||||
if (!settings) return
|
||||
setSettings({ ...settings, [key]: value })
|
||||
@@ -301,7 +321,7 @@ export default function SettingsPage() {
|
||||
</Section>
|
||||
</div>
|
||||
|
||||
{/* Save Button */}
|
||||
{/* Action Buttons */}
|
||||
<div className="mt-8 flex gap-4">
|
||||
<button
|
||||
onClick={saveSettings}
|
||||
@@ -310,16 +330,23 @@ export default function SettingsPage() {
|
||||
>
|
||||
{saving ? '💾 Saving...' : '💾 Save Settings'}
|
||||
</button>
|
||||
<button
|
||||
onClick={restartBot}
|
||||
disabled={restarting}
|
||||
className="flex-1 bg-gradient-to-r from-green-500 to-emerald-500 text-white font-bold py-4 px-6 rounded-lg hover:from-green-600 hover:to-emerald-600 transition-all disabled:opacity-50 disabled:cursor-not-allowed"
|
||||
>
|
||||
{restarting ? '🔄 Restarting...' : '🔄 Restart Bot'}
|
||||
</button>
|
||||
<button
|
||||
onClick={loadSettings}
|
||||
className="bg-slate-700 text-white font-bold py-4 px-6 rounded-lg hover:bg-slate-600 transition-all"
|
||||
>
|
||||
🔄 Reset
|
||||
↺ Reset
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div className="mt-4 text-center text-slate-500 text-sm">
|
||||
⚠️ Changes require bot restart to take effect
|
||||
<div className="mt-4 text-center text-slate-400 text-sm">
|
||||
💡 Save settings first, then click Restart Bot to apply changes
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user