-
{name},您好!
-
系统已于 {send_time} 成功为您完成自动打卡。
-
您无需进行任何操作,此邮件仅作通知。
+
+
+
+
🎉
+
您好,
+
+
+ 打卡时间:{send_time}
+
+
+ 打卡状态:成功 ✓
+
+
+ 您无需进行任何操作,系统已自动为您完成打卡。此邮件仅作通知。
+
+
+
-
"""
FAILURE_HTML_TEMPLATE = """
-
+
+
打卡失败通知
-
通知:自动打卡失败!
-
-
{name},您好!
-
系统于 {send_time} 尝试为您自动打卡时失败。
-
失败原因: 服务器返回 "需要登录",这通常意味着您的 Token 已失效。
-
请您立即刷新您的 Token,以确保后续打卡能够成功。
+
+
+
+
⚠️
+
您好,
+
+
+ 失败时间:{send_time}
+
+
+ 失败原因:Token 已失效(需要登录)
+
+
+
📋 需要您执行以下操作:
+
+ - 登录接龙自动打卡系统
+ - 刷新您的 Authorization Token
+ - 确认 Token 更新成功
+
+
+
+ Token 失效是正常现象,通常在一段时间后会自动过期。刷新 Token 后,系统将恢复自动打卡功能。
+
+
+
-
"""
@@ -94,29 +357,31 @@ FAILURE_HTML_TEMPLATE = """
def get_email_settings():
"""
- 从 config.ini 读取邮件配置
+ 从环境变量读取邮件配置
+
+ 如果 SMTP_SERVER、SMTP_PORT 或 SMTP_SENDER_EMAIL 有任一为空,则禁用邮件功能
Returns:
- dict: 邮件配置,如果配置文件不存在则返回 None
+ dict: 邮件配置,如果配置不完整则返回 None
"""
- if not settings.EMAIL_CONFIG_FILE.exists():
- logger.warning("找不到 config.ini,无法发送邮件")
+ # 检查必要的邮件配置是否存在
+ if not settings.SMTP_SERVER or not settings.SMTP_SENDER_EMAIL:
+ logger.debug("邮件配置未完成(SMTP_SERVER 或 SMTP_SENDER_EMAIL 为空),邮件发送功能已禁用")
return None
- try:
- config_parser = configparser.ConfigParser()
- config_parser.read(settings.EMAIL_CONFIG_FILE, encoding='utf-8')
-
- if 'Email' not in config_parser:
- logger.warning("config.ini 中缺少 [Email] 配置段")
- return None
-
- return config_parser['Email']
-
- except Exception as e:
- logger.error(f"读取邮件配置失败: {e}")
+ if not settings.SMTP_PORT:
+ logger.debug("邮件配置未完成(SMTP_PORT 为空),邮件发送功能已禁用")
return None
+ # 返回配置字典
+ return {
+ 'smtpserver': settings.SMTP_SERVER,
+ 'smtpport': settings.SMTP_PORT,
+ 'senderemail': settings.SMTP_SENDER_EMAIL,
+ 'senderpassword': settings.SMTP_SENDER_PASSWORD,
+ 'use_ssl': settings.SMTP_USE_SSL
+ }
+
def _send_email(to_email: str, subject: str, html_content: str, email_settings: dict) -> bool:
"""
@@ -138,9 +403,16 @@ def _send_email(to_email: str, subject: str, html_content: str, email_settings:
msg["Subject"] = subject
msg.attach(MIMEText(html_content, 'html', 'utf-8'))
- with smtplib.SMTP_SSL(email_settings['smtpserver'], int(email_settings['smtpport'])) as server:
- server.login(email_settings['senderemail'], email_settings['senderpassword'])
- server.sendmail(msg["From"], msg["To"], msg.as_string())
+ # 根据配置选择使用 SSL 或普通 SMTP
+ if email_settings.get('use_ssl', True):
+ with smtplib.SMTP_SSL(email_settings['smtpserver'], int(email_settings['smtpport'])) as server:
+ server.login(email_settings['senderemail'], email_settings['senderpassword'])
+ server.sendmail(msg["From"], msg["To"], msg.as_string())
+ else:
+ with smtplib.SMTP(email_settings['smtpserver'], int(email_settings['smtpport'])) as server:
+ server.starttls()
+ server.login(email_settings['senderemail'], email_settings['senderpassword'])
+ server.sendmail(msg["From"], msg["To"], msg.as_string())
logger.info(f"已成功向 {to_email} 发送邮件,主题: {subject}")
return True
diff --git a/deployment/checkin-app.service.example b/checkin-app.service.example
similarity index 51%
rename from deployment/checkin-app.service.example
rename to checkin-app.service.example
index 2631a77..1191257 100644
--- a/deployment/checkin-app.service.example
+++ b/checkin-app.service.example
@@ -22,53 +22,32 @@
# ==============================================================================
[Unit]
-# Service description
Description=CheckIn App V2 - Backend API Service
-Documentation=https://github.com/your-repo/checkin-app
-
-# Start after network and database are available
+Documentation=https://github.com/Cccc-owo/CheckInApp
After=network.target
Wants=network-online.target
[Service]
-# Service type
-Type=simple
+Type=forking
-# User and Group
-# IMPORTANT: Replace 'www-data' with your actual user
-# Create a dedicated user: sudo useradd -r -s /bin/false checkin
-User=www-data
-Group=www-data
+# CHANGE THIS: Replace with your actual installation path
+# Example: /home/username/CheckInApp
+WorkingDirectory=/path/to/CheckInApp
-# Working directory
-# IMPORTANT: Replace with your actual installation path
-WorkingDirectory=/opt/checkin-app
+# PID file written by manage.sh
+PIDFile=/path/to/CheckInApp/backend.pid
-# Environment variables
-Environment="PATH=/opt/checkin-app/venv/bin:/usr/local/bin:/usr/bin:/bin"
-Environment="PYTHONPATH=/opt/checkin-app"
+# Start backend using manage.sh script
+ExecStart=/path/to/CheckInApp/manage.sh start backend
-# Load environment variables from .env file (optional)
-EnvironmentFile=-/opt/checkin-app/.env
-
-# Command to start the service
-# Using uvicorn directly for production
-ExecStart=/opt/checkin-app/venv/bin/python /opt/checkin-app/run_daemon.py
-
-# Alternative: Using uvicorn directly with more control
-# ExecStart=/opt/checkin-app/venv/bin/uvicorn backend.main:app \
-# --host 0.0.0.0 \
-# --port 8000 \
-# --workers 4 \
-# --log-level info \
-# --access-log \
-# --proxy-headers
+# Stop backend using manage.sh script
+ExecStop=/path/to/CheckInApp/manage.sh stop backend
# Restart policy
Restart=always
RestartSec=10
-# Kill signal
+# Kill settings
KillSignal=SIGTERM
KillMode=mixed
@@ -76,18 +55,10 @@ KillMode=mixed
TimeoutStartSec=60
TimeoutStopSec=30
-# Resource limits (optional)
+# Resource limits
LimitNOFILE=65535
-# LimitNPROC=4096
-# MemoryLimit=2G
-# CPUQuota=200%
-# Security settings (optional but recommended)
-# Restrict access to the filesystem
-# ReadWritePaths=/opt/checkin-app/data /opt/checkin-app/logs /opt/checkin-app/sessions
-# ReadOnlyPaths=/opt/checkin-app
-
-# Prevent privilege escalation
+# Security settings
NoNewPrivileges=true
# Logging
@@ -96,5 +67,4 @@ StandardError=journal
SyslogIdentifier=checkin-app
[Install]
-# Start on boot
WantedBy=multi-user.target
diff --git a/deployment/DEPLOYMENT.md b/deployment/DEPLOYMENT.md
deleted file mode 100644
index 26c5561..0000000
--- a/deployment/DEPLOYMENT.md
+++ /dev/null
@@ -1,474 +0,0 @@
-# CheckIn App V2 - Deployment Guide
-
-This guide explains how to deploy CheckIn App V2 to a production server using Nginx and systemd.
-
-## Table of Contents
-
-1. [Prerequisites](#prerequisites)
-2. [Server Setup](#server-setup)
-3. [Application Setup](#application-setup)
-4. [Nginx Configuration](#nginx-configuration)
-5. [Systemd Service Setup](#systemd-service-setup)
-6. [SSL/TLS Certificate](#ssltls-certificate)
-7. [Monitoring and Logs](#monitoring-and-logs)
-8. [Troubleshooting](#troubleshooting)
-
----
-
-## Prerequisites
-
-- **Operating System**: Ubuntu 20.04+ or similar Linux distribution
-- **Python**: 3.9 or higher
-- **Node.js**: 16+ (for building frontend)
-- **Nginx**: 1.18 or higher
-- **Domain name** (optional but recommended for SSL)
-
-### Install Required Packages
-
-```bash
-# Update system
-sudo apt update && sudo apt upgrade -y
-
-# Install Python and tools
-sudo apt install -y python3 python3-pip python3-venv
-
-# Install Node.js (using NodeSource)
-curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
-sudo apt install -y nodejs
-
-# Install Nginx
-sudo apt install -y nginx
-
-# Install other dependencies
-sudo apt install -y git curl wget
-```
-
----
-
-## Server Setup
-
-### 1. Create Application User
-
-```bash
-# Create a dedicated user for the application
-sudo useradd -r -m -s /bin/bash checkin
-sudo usermod -aG www-data checkin
-```
-
-### 2. Create Application Directory
-
-```bash
-# Create directory structure
-sudo mkdir -p /opt/checkin-app
-sudo chown -R checkin:www-data /opt/checkin-app
-
-# Create required subdirectories
-sudo -u checkin mkdir -p /opt/checkin-app/{data,logs,sessions}
-```
-
----
-
-## Application Setup
-
-### 1. Clone Repository
-
-```bash
-# Switch to application user
-sudo su - checkin
-
-# Clone the repository
-cd /opt/checkin-app
-git clone https://github.com/your-repo/checkin-app.git .
-
-# Or upload your files using scp/rsync
-```
-
-### 2. Setup Backend
-
-```bash
-# Create virtual environment
-python3 -m venv venv
-
-# Activate virtual environment
-source venv/bin/activate
-
-# Install Python dependencies
-pip install -r backend/requirements.txt
-
-# Create .env file
-cp .env.example .env
-
-# Edit .env and configure your settings
-nano .env
-```
-
-**Important Environment Variables:**
-
-```env
-# Database
-DATABASE_URL=sqlite:///./data/checkin.db
-
-# Security
-SECRET_KEY=your-secret-key-here-change-this
-ALLOWED_ORIGINS=https://your-domain.com
-
-# QQ Login (if applicable)
-QQ_APPID=your-qq-appid
-QQ_APPSECRET=your-qq-appsecret
-
-# Email notifications (optional)
-SMTP_HOST=smtp.gmail.com
-SMTP_PORT=587
-SMTP_USER=your-email@gmail.com
-SMTP_PASSWORD=your-app-password
-ADMIN_EMAIL=admin@your-domain.com
-```
-
-### 3. Initialize Database
-
-```bash
-# Run database migrations if needed
-# Example:
-# alembic upgrade head
-
-# Or run initialization script
-python backend/scripts/create_admin.py
-```
-
-### 4. Build Frontend
-
-```bash
-# Install frontend dependencies
-cd frontend
-npm install
-
-# Build for production
-npm run build
-
-# Verify build output
-ls -lh dist/
-```
-
-### 5. Set Permissions
-
-```bash
-# Exit from checkin user
-exit
-
-# Set proper permissions
-sudo chown -R checkin:www-data /opt/checkin-app
-sudo chmod -R 755 /opt/checkin-app
-sudo chmod -R 775 /opt/checkin-app/{data,logs,sessions}
-```
-
----
-
-## Nginx Configuration
-
-### 1. Copy Configuration
-
-```bash
-# Copy example configuration
-sudo cp /opt/checkin-app/deployment/nginx.conf.example /etc/nginx/sites-available/checkin-app
-
-# Edit configuration
-sudo nano /etc/nginx/sites-available/checkin-app
-```
-
-### 2. Update Configuration
-
-Replace the following placeholders:
-
-- `your-domain.com` → Your actual domain name
-- `/opt/checkin-app` → Your installation path (if different)
-
-### 3. Enable Site
-
-```bash
-# Create symbolic link
-sudo ln -s /etc/nginx/sites-available/checkin-app /etc/nginx/sites-enabled/
-
-# Remove default site (optional)
-sudo rm /etc/nginx/sites-enabled/default
-
-# Test Nginx configuration
-sudo nginx -t
-
-# Reload Nginx
-sudo systemctl reload nginx
-```
-
----
-
-## Systemd Service Setup
-
-### 1. Copy Service File
-
-```bash
-# Copy example service file
-sudo cp /opt/checkin-app/deployment/checkin-app.service.example /etc/systemd/system/checkin-app.service
-
-# Edit service file
-sudo nano /etc/systemd/system/checkin-app.service
-```
-
-### 2. Update Service File
-
-Replace placeholders:
-
-- `User=www-data` → `User=checkin` (if using dedicated user)
-- `WorkingDirectory=/opt/checkin-app` → Your installation path
-- Adjust paths in `ExecStart` if needed
-
-### 3. Enable and Start Service
-
-```bash
-# Reload systemd
-sudo systemctl daemon-reload
-
-# Enable service (start on boot)
-sudo systemctl enable checkin-app.service
-
-# Start service
-sudo systemctl start checkin-app.service
-
-# Check status
-sudo systemctl status checkin-app.service
-
-# View logs
-sudo journalctl -u checkin-app -f
-```
-
----
-
-## SSL/TLS Certificate
-
-### Using Let's Encrypt (Recommended)
-
-```bash
-# Install Certbot
-sudo apt install -y certbot python3-certbot-nginx
-
-# Obtain certificate
-sudo certbot --nginx -d your-domain.com -d www.your-domain.com
-
-# Follow the prompts to configure SSL
-
-# Test auto-renewal
-sudo certbot renew --dry-run
-```
-
-The Certbot will automatically update your Nginx configuration with SSL settings.
-
-### Manual Certificate Setup
-
-If you have your own SSL certificate:
-
-```bash
-# Copy certificate files
-sudo mkdir -p /etc/nginx/ssl
-sudo cp your-cert.crt /etc/nginx/ssl/
-sudo cp your-key.key /etc/nginx/ssl/
-
-# Set permissions
-sudo chmod 600 /etc/nginx/ssl/your-key.key
-
-# Update Nginx configuration with certificate paths
-```
-
----
-
-## Monitoring and Logs
-
-### Service Logs
-
-```bash
-# View service logs
-sudo journalctl -u checkin-app -f
-
-# View last 100 lines
-sudo journalctl -u checkin-app -n 100
-
-# View logs since yesterday
-sudo journalctl -u checkin-app --since yesterday
-```
-
-### Application Logs
-
-```bash
-# Backend logs
-tail -f /opt/checkin-app/logs/backend.log
-
-# Nginx access logs
-sudo tail -f /var/log/nginx/checkin-app-access.log
-
-# Nginx error logs
-sudo tail -f /var/log/nginx/checkin-app-error.log
-```
-
-### Service Status
-
-```bash
-# Check service status
-sudo systemctl status checkin-app
-
-# Check if port is listening
-sudo netstat -tlnp | grep :8000
-
-# Check process
-ps aux | grep python
-```
-
----
-
-## Troubleshooting
-
-### Service Won't Start
-
-```bash
-# Check service logs
-sudo journalctl -u checkin-app -xe
-
-# Check if port is already in use
-sudo lsof -i :8000
-
-# Verify permissions
-ls -la /opt/checkin-app/
-
-# Test manual start
-sudo -u checkin /opt/checkin-app/venv/bin/python /opt/checkin-app/run_daemon.py
-```
-
-### Nginx Errors
-
-```bash
-# Test Nginx configuration
-sudo nginx -t
-
-# Check error logs
-sudo tail -f /var/log/nginx/error.log
-
-# Verify backend is running
-curl http://localhost:8000/health
-```
-
-### Database Issues
-
-```bash
-# Check database file permissions
-ls -la /opt/checkin-app/data/
-
-# Check if database is locked
-fuser /opt/checkin-app/data/checkin.db
-
-# Backup database
-cp /opt/checkin-app/data/checkin.db /opt/checkin-app/data/checkin.db.backup
-```
-
-### Frontend Not Loading
-
-```bash
-# Verify build exists
-ls -la /opt/checkin-app/frontend/dist/
-
-# Check Nginx configuration for root path
-grep -n "root" /etc/nginx/sites-available/checkin-app
-
-# Clear browser cache or test with curl
-curl -I https://your-domain.com/
-```
-
----
-
-## Updating the Application
-
-### Update Backend
-
-```bash
-# Switch to application user
-sudo su - checkin
-cd /opt/checkin-app
-
-# Pull latest changes
-git pull
-
-# Activate virtual environment
-source venv/bin/activate
-
-# Update dependencies
-pip install -r backend/requirements.txt
-
-# Run migrations if needed
-# alembic upgrade head
-
-# Exit and restart service
-exit
-sudo systemctl restart checkin-app
-```
-
-### Update Frontend
-
-```bash
-sudo su - checkin
-cd /opt/checkin-app/frontend
-
-# Pull latest changes
-git pull
-
-# Install dependencies
-npm install
-
-# Build
-npm run build
-
-# Exit
-exit
-
-# No need to restart - Nginx serves static files
-```
-
----
-
-## Security Recommendations
-
-1. **Firewall**: Use `ufw` to restrict access
- ```bash
- sudo ufw allow 22/tcp # SSH
- sudo ufw allow 80/tcp # HTTP
- sudo ufw allow 443/tcp # HTTPS
- sudo ufw enable
- ```
-
-2. **Regular Updates**: Keep system and packages updated
- ```bash
- sudo apt update && sudo apt upgrade
- ```
-
-3. **Backup**: Regular backups of database and configuration
- ```bash
- # Create backup script
- sudo nano /opt/checkin-app/backup.sh
- ```
-
-4. **Monitoring**: Consider using monitoring tools like Prometheus, Grafana, or Uptime Kuma
-
-5. **Rate Limiting**: Configure Nginx rate limiting for API endpoints
-
----
-
-## Additional Resources
-
-- [Nginx Documentation](https://nginx.org/en/docs/)
-- [Systemd Documentation](https://www.freedesktop.org/software/systemd/man/)
-- [Let's Encrypt](https://letsencrypt.org/)
-- [FastAPI Deployment](https://fastapi.tiangolo.com/deployment/)
-
----
-
-## Support
-
-For issues or questions, please:
-- Check the logs first
-- Review this guide carefully
-- Open an issue on GitHub
-- Contact system administrator
diff --git a/deployment/README.md b/deployment/README.md
deleted file mode 100644
index 0360f3c..0000000
--- a/deployment/README.md
+++ /dev/null
@@ -1,307 +0,0 @@
-# Deployment Files
-
-This directory contains configuration files and scripts for deploying CheckIn App V2 to a production server.
-
-## Files
-
-- **`nginx.conf.example`** - Nginx reverse proxy configuration
-- **`checkin-app.service.example`** - Systemd service file
-- **`deploy.sh`** - Automated deployment script
-- **`DEPLOYMENT.md`** - Comprehensive deployment guide
-
-## Quick Start
-
-### Option 1: Automated Deployment (Recommended)
-
-```bash
-# Make script executable
-chmod +x deployment/deploy.sh
-
-# Run installation
-sudo deployment/deploy.sh install
-```
-
-### Option 2: Manual Deployment
-
-Follow the step-by-step guide in [DEPLOYMENT.md](./DEPLOYMENT.md).
-
-## Deployment Script Usage
-
-The `deploy.sh` script provides three main commands:
-
-### 1. Install (First-time deployment)
-
-```bash
-sudo deployment/deploy.sh install
-```
-
-This will:
-- Check system dependencies
-- Create application user
-- Setup virtual environment
-- Install Python dependencies
-- Build frontend
-- Configure systemd service
-- Configure Nginx
-- Start all services
-
-### 2. Update (Update existing installation)
-
-```bash
-sudo deployment/deploy.sh update
-```
-
-This will:
-- Backup database
-- Pull latest changes (if using git)
-- Update Python dependencies
-- Rebuild frontend
-- Restart services
-
-### 3. Rollback (Revert to previous version)
-
-```bash
-sudo deployment/deploy.sh rollback
-```
-
-This will:
-- Stop services
-- Restore database from latest backup
-- Restart services
-
-## Configuration Files
-
-### Nginx Configuration
-
-Edit `/etc/nginx/sites-available/checkin-app` and update:
-
-- `server_name` - Your domain name
-- `ssl_certificate` and `ssl_certificate_key` - SSL certificate paths
-- `root` - Frontend build directory path (usually `/opt/checkin-app/frontend/dist`)
-
-### Systemd Service
-
-Edit `/etc/systemd/system/checkin-app.service` and update:
-
-- `User` and `Group` - Application user (default: `checkin`)
-- `WorkingDirectory` - Application directory (default: `/opt/checkin-app`)
-- `ExecStart` - Path to Python executable and run script
-
-### Environment Variables
-
-Create and configure `.env` file in the application root:
-
-```bash
-sudo nano /opt/checkin-app/.env
-```
-
-Required variables:
-```env
-# Database
-DATABASE_URL=sqlite:///./data/checkin.db
-
-# Security
-SECRET_KEY=your-secret-key-here
-ALLOWED_ORIGINS=https://your-domain.com
-
-# QQ Login
-QQ_APPID=your-appid
-QQ_APPSECRET=your-appsecret
-```
-
-## SSL Certificate Setup
-
-### Using Let's Encrypt (Recommended)
-
-```bash
-# Install Certbot
-sudo apt install certbot python3-certbot-nginx
-
-# Obtain certificate
-sudo certbot --nginx -d your-domain.com
-
-# Auto-renewal is configured automatically
-```
-
-### Manual Certificate
-
-If you have your own SSL certificate:
-
-1. Copy certificate files to `/etc/nginx/ssl/`
-2. Update Nginx configuration with correct paths
-3. Reload Nginx: `sudo systemctl reload nginx`
-
-## Service Management
-
-### Start Service
-
-```bash
-sudo systemctl start checkin-app
-```
-
-### Stop Service
-
-```bash
-sudo systemctl stop checkin-app
-```
-
-### Restart Service
-
-```bash
-sudo systemctl restart checkin-app
-```
-
-### Check Status
-
-```bash
-sudo systemctl status checkin-app
-```
-
-### View Logs
-
-```bash
-# Application logs
-sudo journalctl -u checkin-app -f
-
-# Nginx access logs
-sudo tail -f /var/log/nginx/checkin-app-access.log
-
-# Nginx error logs
-sudo tail -f /var/log/nginx/checkin-app-error.log
-```
-
-## Directory Structure
-
-After deployment, the application structure should look like:
-
-```
-/opt/checkin-app/
-├── backend/ # Backend Python code
-│ ├── api/
-│ ├── models/
-│ ├── services/
-│ └── ...
-├── frontend/ # Frontend source code
-│ ├── src/
-│ ├── dist/ # Built static files (served by Nginx)
-│ └── ...
-├── venv/ # Python virtual environment
-├── data/ # SQLite database
-├── logs/ # Application logs
-├── sessions/ # Session data
-├── deployment/ # Deployment files (this directory)
-├── .env # Environment variables
-└── run_daemon.py # Application entry point
-```
-
-## Troubleshooting
-
-### Service won't start
-
-```bash
-# Check logs
-sudo journalctl -u checkin-app -xe
-
-# Verify configuration
-sudo -u checkin /opt/checkin-app/venv/bin/python /opt/checkin-app/run_daemon.py
-```
-
-### Nginx configuration errors
-
-```bash
-# Test configuration
-sudo nginx -t
-
-# Check error logs
-sudo tail -f /var/log/nginx/error.log
-```
-
-### Database locked
-
-```bash
-# Check what's using the database
-sudo fuser /opt/checkin-app/data/checkin.db
-
-# Kill the process if needed
-sudo fuser -k /opt/checkin-app/data/checkin.db
-```
-
-### Permission issues
-
-```bash
-# Fix ownership
-sudo chown -R checkin:www-data /opt/checkin-app
-
-# Fix permissions
-sudo chmod -R 755 /opt/checkin-app
-sudo chmod -R 775 /opt/checkin-app/{data,logs,sessions}
-```
-
-## Security Best Practices
-
-1. **Keep system updated**
- ```bash
- sudo apt update && sudo apt upgrade
- ```
-
-2. **Use firewall**
- ```bash
- sudo ufw allow 22/tcp # SSH
- sudo ufw allow 80/tcp # HTTP
- sudo ufw allow 443/tcp # HTTPS
- sudo ufw enable
- ```
-
-3. **Regular backups**
- ```bash
- # Backup database
- sudo -u checkin cp /opt/checkin-app/data/checkin.db /backup/checkin-$(date +%Y%m%d).db
- ```
-
-4. **Monitor logs**
- ```bash
- # Setup log rotation
- sudo nano /etc/logrotate.d/checkin-app
- ```
-
-5. **Use strong passwords** and **secure SECRET_KEY**
-
-## Performance Tuning
-
-### Nginx
-
-- Enable gzip compression (already configured)
-- Configure caching headers (already configured)
-- Adjust worker processes based on CPU cores
-
-### Backend
-
-- Increase uvicorn workers in service file:
- ```
- ExecStart=/opt/checkin-app/venv/bin/uvicorn backend.main:app --workers 4
- ```
-
-- Consider using Gunicorn with uvicorn workers for production
-
-### Database
-
-- For high traffic, consider switching to PostgreSQL
-- Regular VACUUM for SQLite
-
-## Monitoring
-
-Consider setting up monitoring tools:
-
-- **Uptime monitoring**: Uptime Kuma, UptimeRobot
-- **Log aggregation**: Loki, ELK Stack
-- **Metrics**: Prometheus + Grafana
-- **Error tracking**: Sentry
-
-## Support
-
-For detailed deployment instructions, see [DEPLOYMENT.md](./DEPLOYMENT.md).
-
-For issues or questions:
-- Check application logs
-- Review troubleshooting section
-- Open an issue on GitHub
diff --git a/deployment/deploy.sh b/deployment/deploy.sh
deleted file mode 100644
index c6696cb..0000000
--- a/deployment/deploy.sh
+++ /dev/null
@@ -1,358 +0,0 @@
-#!/bin/bash
-# ==============================================================================
-# CheckIn App V2 - Quick Deployment Script
-# ==============================================================================
-#
-# This script automates the deployment process for CheckIn App V2
-#
-# Usage:
-# sudo ./deploy.sh [install|update|rollback]
-#
-# ==============================================================================
-
-set -e
-
-# Colors
-RED='\033[0;31m'
-GREEN='\033[0;32m'
-YELLOW='\033[1;33m'
-NC='\033[0m' # No Color
-
-# Configuration
-APP_NAME="checkin-app"
-APP_USER="checkin"
-APP_DIR="/opt/checkin-app"
-SERVICE_NAME="checkin-app.service"
-NGINX_CONFIG="checkin-app"
-
-# Functions
-log_info() {
- echo -e "${GREEN}[INFO]${NC} $1"
-}
-
-log_warn() {
- echo -e "${YELLOW}[WARN]${NC} $1"
-}
-
-log_error() {
- echo -e "${RED}[ERROR]${NC} $1"
-}
-
-check_root() {
- if [ "$EUID" -ne 0 ]; then
- log_error "This script must be run as root (use sudo)"
- exit 1
- fi
-}
-
-check_dependencies() {
- log_info "Checking dependencies..."
-
- local missing_deps=()
-
- # Check Python
- if ! command -v python3 &> /dev/null; then
- missing_deps+=("python3")
- fi
-
- # Check Node.js
- if ! command -v node &> /dev/null; then
- missing_deps+=("nodejs")
- fi
-
- # Check Nginx
- if ! command -v nginx &> /dev/null; then
- missing_deps+=("nginx")
- fi
-
- if [ ${#missing_deps[@]} -ne 0 ]; then
- log_error "Missing dependencies: ${missing_deps[*]}"
- log_info "Please install them first:"
- log_info " sudo apt install -y python3 python3-pip python3-venv nodejs nginx"
- exit 1
- fi
-
- log_info "All dependencies are installed"
-}
-
-create_user() {
- if id "$APP_USER" &>/dev/null; then
- log_info "User $APP_USER already exists"
- else
- log_info "Creating user $APP_USER..."
- useradd -r -m -s /bin/bash "$APP_USER"
- usermod -aG www-data "$APP_USER"
- log_info "User $APP_USER created"
- fi
-}
-
-create_directories() {
- log_info "Creating application directories..."
-
- mkdir -p "$APP_DIR"
- chown -R "$APP_USER:www-data" "$APP_DIR"
-
- sudo -u "$APP_USER" mkdir -p "$APP_DIR"/{data,logs,sessions}
-
- log_info "Directories created"
-}
-
-setup_backend() {
- log_info "Setting up backend..."
-
- cd "$APP_DIR"
-
- # Create virtual environment
- if [ ! -d "venv" ]; then
- log_info "Creating virtual environment..."
- sudo -u "$APP_USER" python3 -m venv venv
- fi
-
- # Install dependencies
- log_info "Installing Python dependencies..."
- sudo -u "$APP_USER" bash -c "source venv/bin/activate && pip install --upgrade pip && pip install -r backend/requirements.txt"
-
- # Create .env if not exists
- if [ ! -f ".env" ]; then
- log_warn ".env file not found, please create one from .env.example"
- if [ -f ".env.example" ]; then
- sudo -u "$APP_USER" cp .env.example .env
- log_info "Created .env from .env.example - please configure it"
- fi
- fi
-
- log_info "Backend setup complete"
-}
-
-build_frontend() {
- log_info "Building frontend..."
-
- cd "$APP_DIR/frontend"
-
- # Install dependencies
- if [ ! -d "node_modules" ]; then
- log_info "Installing Node.js dependencies..."
- sudo -u "$APP_USER" npm install
- fi
-
- # Build
- log_info "Building frontend for production..."
- sudo -u "$APP_USER" npm run build
-
- if [ -d "dist" ]; then
- log_info "Frontend built successfully"
- else
- log_error "Frontend build failed - dist directory not found"
- exit 1
- fi
-}
-
-setup_systemd() {
- log_info "Setting up systemd service..."
-
- if [ -f "$APP_DIR/deployment/checkin-app.service.example" ]; then
- # Copy service file
- cp "$APP_DIR/deployment/checkin-app.service.example" "/etc/systemd/system/$SERVICE_NAME"
-
- # Reload systemd
- systemctl daemon-reload
-
- # Enable service
- systemctl enable "$SERVICE_NAME"
-
- log_info "Systemd service configured"
- else
- log_error "Service file not found: $APP_DIR/deployment/checkin-app.service.example"
- exit 1
- fi
-}
-
-setup_nginx() {
- log_info "Setting up Nginx configuration..."
-
- if [ -f "$APP_DIR/deployment/nginx.conf.example" ]; then
- # Copy Nginx config
- cp "$APP_DIR/deployment/nginx.conf.example" "/etc/nginx/sites-available/$NGINX_CONFIG"
-
- # Create symlink
- if [ ! -L "/etc/nginx/sites-enabled/$NGINX_CONFIG" ]; then
- ln -s "/etc/nginx/sites-available/$NGINX_CONFIG" "/etc/nginx/sites-enabled/$NGINX_CONFIG"
- fi
-
- # Test Nginx config
- if nginx -t; then
- log_info "Nginx configuration is valid"
- else
- log_error "Nginx configuration test failed"
- exit 1
- fi
-
- log_warn "Please edit /etc/nginx/sites-available/$NGINX_CONFIG and configure your domain"
- else
- log_error "Nginx config file not found: $APP_DIR/deployment/nginx.conf.example"
- exit 1
- fi
-}
-
-start_services() {
- log_info "Starting services..."
-
- # Start application
- systemctl start "$SERVICE_NAME"
-
- # Reload Nginx
- systemctl reload nginx
-
- # Check status
- sleep 2
- if systemctl is-active --quiet "$SERVICE_NAME"; then
- log_info "Application service started successfully"
- else
- log_error "Application service failed to start"
- systemctl status "$SERVICE_NAME"
- exit 1
- fi
-
- log_info "All services started"
-}
-
-install() {
- log_info "Starting installation..."
-
- check_root
- check_dependencies
- create_user
- create_directories
- setup_backend
- build_frontend
- setup_systemd
- setup_nginx
-
- # Set permissions
- chown -R "$APP_USER:www-data" "$APP_DIR"
- chmod -R 755 "$APP_DIR"
- chmod -R 775 "$APP_DIR"/{data,logs,sessions}
-
- start_services
-
- echo ""
- log_info "================================================"
- log_info "Installation complete!"
- log_info "================================================"
- echo ""
- log_info "Next steps:"
- log_info "1. Configure .env file: sudo nano $APP_DIR/.env"
- log_info "2. Configure Nginx: sudo nano /etc/nginx/sites-available/$NGINX_CONFIG"
- log_info "3. Set up SSL certificate: sudo certbot --nginx -d your-domain.com"
- log_info "4. Restart services: sudo systemctl restart $SERVICE_NAME nginx"
- echo ""
- log_info "Useful commands:"
- log_info " Status: sudo systemctl status $SERVICE_NAME"
- log_info " Logs: sudo journalctl -u $SERVICE_NAME -f"
- log_info " Restart: sudo systemctl restart $SERVICE_NAME"
- echo ""
-}
-
-update() {
- log_info "Updating application..."
-
- check_root
-
- cd "$APP_DIR"
-
- # Backup database
- if [ -f "data/checkin.db" ]; then
- log_info "Backing up database..."
- sudo -u "$APP_USER" cp data/checkin.db "data/checkin.db.backup.$(date +%Y%m%d_%H%M%S)"
- fi
-
- # Pull latest changes (if using git)
- if [ -d ".git" ]; then
- log_info "Pulling latest changes..."
- sudo -u "$APP_USER" git pull
- fi
-
- # Update backend
- log_info "Updating backend dependencies..."
- sudo -u "$APP_USER" bash -c "source venv/bin/activate && pip install -r backend/requirements.txt"
-
- # Rebuild frontend
- build_frontend
-
- # Restart service
- log_info "Restarting service..."
- systemctl restart "$SERVICE_NAME"
-
- # Check status
- sleep 2
- if systemctl is-active --quiet "$SERVICE_NAME"; then
- log_info "Update completed successfully"
- else
- log_error "Service failed to start after update"
- systemctl status "$SERVICE_NAME"
- exit 1
- fi
-}
-
-rollback() {
- log_info "Rolling back to previous version..."
-
- check_root
-
- cd "$APP_DIR"
-
- # Find latest backup
- LATEST_BACKUP=$(ls -t data/checkin.db.backup.* 2>/dev/null | head -n 1)
-
- if [ -z "$LATEST_BACKUP" ]; then
- log_error "No database backup found"
- exit 1
- fi
-
- log_info "Found backup: $LATEST_BACKUP"
-
- # Stop service
- systemctl stop "$SERVICE_NAME"
-
- # Restore database
- log_info "Restoring database..."
- sudo -u "$APP_USER" cp "$LATEST_BACKUP" data/checkin.db
-
- # Rollback git (if using git)
- if [ -d ".git" ]; then
- log_warn "Please manually rollback git to the desired commit"
- log_info "Example: git reset --hard
"
- fi
-
- # Start service
- systemctl start "$SERVICE_NAME"
-
- log_info "Rollback completed"
-}
-
-# Main
-case "${1:-}" in
- install)
- install
- ;;
- update)
- update
- ;;
- rollback)
- rollback
- ;;
- *)
- echo "CheckIn App V2 - Deployment Script"
- echo ""
- echo "Usage: $0 {install|update|rollback}"
- echo ""
- echo "Commands:"
- echo " install - Full installation (first time)"
- echo " update - Update existing installation"
- echo " rollback - Rollback to previous version"
- echo ""
- exit 1
- ;;
-esac
-
-exit 0
diff --git a/deployment/nginx.conf.example b/deployment/nginx.conf.example
deleted file mode 100644
index 4060883..0000000
--- a/deployment/nginx.conf.example
+++ /dev/null
@@ -1,216 +0,0 @@
-# ==============================================================================
-# CheckIn App V2 - Nginx Configuration Example
-# ==============================================================================
-#
-# Usage:
-# 1. Copy this file: sudo cp nginx.conf.example /etc/nginx/sites-available/checkin-app
-# 2. Edit the file and replace placeholders with your actual values
-# 3. Create symlink: sudo ln -s /etc/nginx/sites-available/checkin-app /etc/nginx/sites-enabled/
-# 4. Test config: sudo nginx -t
-# 5. Reload Nginx: sudo systemctl reload nginx
-#
-# ==============================================================================
-
-# Upstream backend API server
-upstream checkin_backend {
- # Backend FastAPI server running on port 8000
- server 127.0.0.1:8000;
-
- # Optional: Add more backend servers for load balancing
- # server 127.0.0.1:8001;
- # server 127.0.0.1:8002;
-
- # Keep alive connections
- keepalive 32;
-}
-
-# HTTP Server - Redirect to HTTPS (optional)
-server {
- listen 80;
- listen [::]:80;
- server_name your-domain.com www.your-domain.com;
-
- # Redirect all HTTP traffic to HTTPS
- return 301 https://$server_name$request_uri;
-}
-
-# HTTPS Server
-server {
- # SSL Configuration
- listen 443 ssl http2;
- listen [::]:443 ssl http2;
- server_name your-domain.com www.your-domain.com;
-
- # SSL Certificate (Let's Encrypt recommended)
- ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
- ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
-
- # SSL Configuration (Modern)
- ssl_protocols TLSv1.2 TLSv1.3;
- ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
- ssl_prefer_server_ciphers off;
- ssl_session_cache shared:SSL:10m;
- ssl_session_timeout 10m;
-
- # Security Headers
- add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
- add_header X-Frame-Options "SAMEORIGIN" always;
- add_header X-Content-Type-Options "nosniff" always;
- add_header X-XSS-Protection "1; mode=block" always;
-
- # Root directory for frontend static files
- root /opt/checkin-app/frontend/dist;
- index index.html;
-
- # Access and Error Logs
- access_log /var/log/nginx/checkin-app-access.log;
- error_log /var/log/nginx/checkin-app-error.log;
-
- # Gzip Compression
- gzip on;
- gzip_vary on;
- gzip_min_length 1024;
- gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml+rss application/json application/javascript;
-
- # Client body size (for file uploads)
- client_max_body_size 10M;
-
- # ==========================================
- # API Proxy Configuration
- # ==========================================
- location /api/ {
- # Proxy to backend
- proxy_pass http://checkin_backend;
-
- # Proxy headers
- 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;
-
- # WebSocket support (if needed)
- proxy_http_version 1.1;
- proxy_set_header Upgrade $http_upgrade;
- proxy_set_header Connection "upgrade";
-
- # Timeouts
- proxy_connect_timeout 60s;
- proxy_send_timeout 60s;
- proxy_read_timeout 60s;
-
- # Buffering
- proxy_buffering off;
- proxy_request_buffering off;
- }
-
- # API Documentation
- location /docs {
- proxy_pass http://checkin_backend;
- 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;
- }
-
- location /redoc {
- proxy_pass http://checkin_backend;
- 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;
- }
-
- location /openapi.json {
- proxy_pass http://checkin_backend;
- 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;
- }
-
- # ==========================================
- # Frontend Static Files
- # ==========================================
-
- # Cache static assets
- location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
- expires 1y;
- add_header Cache-Control "public, immutable";
- try_files $uri =404;
- }
-
- # Frontend routes (SPA)
- location / {
- try_files $uri $uri/ /index.html;
- add_header Cache-Control "no-cache, no-store, must-revalidate";
- }
-
- # Favicon
- location = /favicon.ico {
- log_not_found off;
- access_log off;
- }
-
- # Robots.txt
- location = /robots.txt {
- log_not_found off;
- access_log off;
- }
-
- # Health check endpoint
- location /health {
- proxy_pass http://checkin_backend;
- access_log off;
- }
-}
-
-# ==============================================================================
-# Alternative: HTTP-only configuration (for development/internal use)
-# ==============================================================================
-# Uncomment below if you don't need HTTPS
-
-# server {
-# listen 80;
-# listen [::]:80;
-# server_name your-domain.com;
-#
-# root /opt/checkin-app/frontend/dist;
-# index index.html;
-#
-# access_log /var/log/nginx/checkin-app-access.log;
-# error_log /var/log/nginx/checkin-app-error.log;
-#
-# gzip on;
-# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
-#
-# client_max_body_size 10M;
-#
-# # API Proxy
-# location /api/ {
-# proxy_pass http://127.0.0.1:8000;
-# 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_http_version 1.1;
-# proxy_buffering off;
-# }
-#
-# # API Documentation
-# location ~ ^/(docs|redoc|openapi.json) {
-# proxy_pass http://127.0.0.1:8000;
-# proxy_set_header Host $host;
-# proxy_set_header X-Real-IP $remote_addr;
-# }
-#
-# # Static files
-# location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
-# expires 1y;
-# add_header Cache-Control "public";
-# }
-#
-# # Frontend routes
-# location / {
-# try_files $uri $uri/ /index.html;
-# }
-# }
diff --git a/frontend/src/views/TaskRecordsView.vue b/frontend/src/views/TaskRecordsView.vue
index 9fc285e..01c54dd 100644
--- a/frontend/src/views/TaskRecordsView.vue
+++ b/frontend/src/views/TaskRecordsView.vue
@@ -23,7 +23,7 @@
- 接龙 ID: {{ currentTask.thread_id }}
+ 接龙 ID: {{ getThreadId(currentTask) }}
{{ currentTask.is_active ? '启用中' : '已禁用' }}
@@ -148,8 +148,8 @@
v-else
class="status-error"
>❌ 打卡失败
-
- {{ record.trigger_type === 'scheduler' ? '自动触发' : '手动触发' }}
+
+ {{ record.trigger_type === 'scheduled' ? '自动触发' : '手动触发' }}
@@ -239,6 +239,19 @@ const recordStats = computed(() => {
}
})
+// 从 payload_config 中提取 ThreadId
+const getThreadId = (task) => {
+ if (!task || !task.payload_config) return '未知'
+
+ try {
+ const payload = JSON.parse(task.payload_config)
+ return payload.ThreadId || '未知'
+ } catch (e) {
+ console.error('解析 payload_config 失败:', e)
+ return '未知'
+ }
+}
+
// 获取任务详情
const fetchTaskDetail = async () => {
try {
diff --git a/frontend/src/views/TasksView.vue b/frontend/src/views/TasksView.vue
index 424ab8d..2c8e5f5 100644
--- a/frontend/src/views/TasksView.vue
+++ b/frontend/src/views/TasksView.vue
@@ -110,7 +110,7 @@
- 接龙ID: {{ task.thread_id || '未知' }}
+ 接龙ID: {{ getThreadId(task) }}