Files
diary-family/README.md
2026-01-05 21:33:18 +08:00

12 KiB
Raw Blame History

家庭日报系统

一个轻量化的家庭日报系统用于自动汇总昨日信息阅读、收获生成今日计划注重生活化、个性化和低门槛使用。支持上传文件或视频作为附加内容并可生成PDF报告定时发送至邮箱。

主要功能

  1. 昨日记录

    • 阅读记录(支持书籍/文章/视频类型)
    • 感悟记录
    • 支持文件/视频上传
    • 日期自动设置为当日,无需手动填写
  2. 家庭事项管理

    • 事项添加、编辑、删除
    • 按类型(采购/家务)、状态筛选
    • 优先级管理
    • 截止日期设置
  3. 今日计划生成

    • 基于昨日状态和待处理事项自动生成
    • 支持手动调整
    • 完成状态标记
    • 优先级管理
  4. 报告生成

    • 自动整合昨日记录和今日计划
    • 可视化统计图表
    • 支持PDF格式导出
    • 支持历史报告查看
  5. 邮件发送

    • 支持手动发送PDF报告
    • 支持定时发送
    • 可配置SMTP服务器、端口、用户名、密码等
  6. 系统配置

    • 邮件配置
    • 发送时间设置
    • 收件人邮箱设置

技术栈

  • Python 3.9+:核心开发语言
  • Django 5.1.4Web框架
  • SQLite:轻量化数据库
  • Bootstrap 5:前端样式
  • Chart.js:数据可视化
  • WeasyPrintPDF生成
  • Celery:定时任务
  • Redis消息队列用于Celery
  • django-celery-beat:定时任务管理
  • loguru:日志记录

项目结构

diary-family/
├── diary_family/           # Django项目目录
├── core/                   # 核心应用
│   ├── migrations/         # 数据库迁移
│   ├── models.py           # 数据模型
│   ├── views.py            # 视图函数
│   ├── forms.py            # 表单定义
│   ├── templates/          # 模板文件
│   ├── static/             # 静态文件
│   ├── tasks.py            # Celery任务
│   └── apps.py             # 应用配置
├── media/                  # 媒体文件存储
├── logs/                   # 日志目录
├── reports/                # PDF报告存储
├── manage.py               # Django管理脚本
└── requirements.txt        # 依赖文件

本地开发

安装依赖

pip install -r requirements.txt

数据库迁移

python manage.py migrate

启动开发服务器

python manage.py runserver

访问系统

部署到Ubuntu服务器

1. 准备工作

1.1 安装必要软件

sudo apt update
sudo apt install -y python3-pip python3-venv git nginx supervisor redis-server

1.2 创建项目目录

# 注意:将 username 替换为您的实际用户名
sudo mkdir -p /var/www/diary-family
sudo chown username:username /var/www/diary-family
cd /var/www/diary-family

1.3 克隆代码

git clone http://14.103.237.41:16001/xiaji/diary-family.git .

2. 配置虚拟环境

# 创建虚拟环境
python3 -m venv venv

# 激活虚拟环境
source venv/bin/activate

# 安装依赖
pip install -r requirements.txt

3. 配置数据库

# 激活虚拟环境(如果未激活)
source venv/bin/activate

# 执行数据库迁移
python manage.py migrate

# 创建超级用户
python manage.py createsuperuser

# 收集静态文件重要确保admin页面有CSS样式
python manage.py collectstatic --noinput

4. 配置Gunicorn

4.1 安装Gunicorn

source venv/bin/activate
pip install gunicorn

4.2 创建Gunicorn配置文件

nano /var/www/diary-family/gunicorn_config.py

内容如下:

# Gunicorn配置文件

# 使用Unix套接字连接替代TCP套接字
bind = "unix:/var/www/diary-family/gunicorn.sock"

# 工作进程数量
workers = 3

# 设置Django设置模块
django_settings_module = "diary_family.settings"

# 工作进程类型
worker_class = "sync"

# 超时时间
timeout = 30

# 日志级别
loglevel = "info"

# 访问日志
accesslog = "/var/log/diary-family/access.log"

# 错误日志
errorlog = "/var/log/diary-family/error.log"

5. 配置Supervisor

5.1 创建Supervisor配置文件

sudo nano /etc/supervisor/conf.d/diary-family.conf

内容如下:

[program:diary-family]
directory=/var/www/diary-family
command=/var/www/diary-family/venv/bin/gunicorn --config /var/www/diary-family/gunicorn_config.py diary_family.wsgi:application
autostart=true
autorestart=true
startretries=3
user=username
redirect_stderr=true
stdout_logfile=/var/log/diary-family.log
stderr_logfile=/var/log/diary-family.err.log

注意:将 user=username 中的 username 替换为您的实际用户名确保该用户名不会与nginx默认用户www-data冲突。

5.2 配置Celery Worker

sudo nano /etc/supervisor/conf.d/diary-family-celery.conf

内容如下:

[program:diary-family-celery]
directory=/var/www/diary-family
command=/var/www/diary-family/venv/bin/celery -A diary_family worker --loglevel=info
autostart=true
autorestart=true
startretries=3
user=username
redirect_stderr=true
stdout_logfile=/var/log/diary-family-celery.log
stderr_logfile=/var/log/diary-family-celery.err.log

5.3 配置Celery Beat

sudo nano /etc/supervisor/conf.d/diary-family-celery-beat.conf

内容如下:

[program:diary-family-celery-beat]
directory=/var/www/diary-family
command=/var/www/diary-family/venv/bin/celery -A diary_family beat --loglevel=info
autostart=true
autorestart=true
startretries=3
user=username
redirect_stderr=true
stdout_logfile=/var/log/diary-family-celery-beat.log
stderr_logfile=/var/log/diary-family-celery-beat.err.log

5.4 重载Supervisor

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start all

6. 配置Nginx

6.1 创建Nginx配置文件

sudo nano /etc/nginx/sites-available/diary-family

内容如下:

server {
    listen 80;
    server_name your_domain_or_ip;

    location = /favicon.ico {
        access_log off;
        log_not_found off;
    }

    location /static/ {
        alias /var/www/diary-family/staticfiles/;
    }

    location /media/ {
        alias /var/www/diary-family/media/;
    }

    location /reports/ {
        alias /var/www/diary-family/reports/;
    }

    location / {
        proxy_pass http://unix:/var/www/diary-family/gunicorn.sock;
        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;
    }
}

注意:将 your_domain_or_ip 替换为您的域名或IP地址。

6.2 启用Nginx配置

sudo ln -s /etc/nginx/sites-available/diary-family /etc/nginx/sites-enabled/

# 检查配置语法
sudo nginx -t

# 重启Nginx
sudo systemctl restart nginx

7. 配置文件权限

# 创建必要的目录
sudo mkdir -p /var/www/diary-family/media /var/www/diary-family/logs /var/www/diary-family/reports /var/log/diary-family

# 设置目录权限
sudo chown -R username:username /var/www/diary-family/media /var/www/diary-family/logs /var/www/diary-family/reports

# 设置日志目录权限
sudo chown -R username:www-data /var/log/diary-family

8. 配置防火墙

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

代码更新

常规代码更新流程

当需要更新代码时,可以使用以下命令:

cd /var/www/diary-family

# 1. 拉取远程最新代码(只获取,不合并)
git fetch origin

# 2. 硬重置本地分支到远程分支的最新版本(会覆盖所有本地未提交修改)
# 注意:将 main 替换为你的分支名(如 master、dev 等)
git reset --hard origin/main

# 激活虚拟环境
source venv/bin/activate

# 3. 安装新依赖(如果有)
pip install -r requirements.txt

# 4. 收集静态文件(如果有静态文件更新)
python manage.py collectstatic --noinput

# 5. 重启服务
sudo supervisorctl restart all
sudo systemctl restart nginx

模型更新部署流程

当开发机的models.py文件有更新时部署机需要执行以下完整流程

步骤一:拉取最新代码

cd /var/www/diary-family

# 拉取远程最新代码
git fetch origin

# 硬重置本地分支到远程分支的最新版本
git reset --hard origin/main

# 激活虚拟环境
source venv/bin/activate

# 安装新依赖(如果有)
pip install -r requirements.txt

步骤二:数据库备份(关键步骤!)

# 备份当前数据库,以防迁移失败
cp /var/www/diary-family/db.sqlite3 /var/www/diary-family/db.sqlite3.backup.$(date +%Y%m%d_%H%M%S)

步骤三:检查并生成迁移文件

# 检查模型定义是否有语法错误
python manage.py check

# 生成迁移文件根据models.py的变化自动生成
python manage.py makemigrations

步骤四:查看并执行迁移

# 查看生成的迁移文件内容,确保迁移逻辑正确
# 注意:将 000x_xxx.py 替换为实际生成的迁移文件名
cat core/migrations/000x_xxx.py

# 执行数据库迁移(将模型变更应用到数据库)
python manage.py migrate

步骤五:收集静态文件

# 收集静态文件(如果有静态文件更新)
python manage.py collectstatic --noinput

步骤六:重启服务

# 重启服务,使新代码生效
sudo supervisorctl restart all
sudo systemctl restart nginx

完整一键执行脚本

cd /var/www/diary-family
git fetch origin
git reset --hard origin/main
source venv/bin/activate
pip install -r requirements.txt
cp db.sqlite3 db.sqlite3.backup.$(date +%Y%m%d_%H%M%S)
python manage.py check
python manage.py makemigrations
python manage.py migrate
python manage.py collectstatic --noinput
sudo supervisorctl restart all
sudo systemctl restart nginx

迁移失败处理

如果migrate命令失败,可使用备份恢复数据库:

# 恢复数据库
cp /var/www/diary-family/db.sqlite3.backup.$(date +%Y%m%d_%H%M%S) /var/www/diary-family/db.sqlite3

# 重启服务
sudo supervisorctl restart all
sudo systemctl restart nginx

代码更新注意事项

  1. 模型更新必须执行迁移当开发机修改了models.py文件后部署机必须执行makemigrationsmigrate命令,否则会出现数据库结构不匹配的错误。

  2. 迁移文件检查:生成迁移文件后,务必查看迁移文件内容,确保迁移逻辑正确,避免意外修改数据库结构。

  3. 数据库备份不可省略:在执行migrate命令前,必须备份数据库文件,以防迁移失败导致数据丢失。

  4. 依赖更新如果requirements.txt文件有更新必须执行pip install -r requirements.txt命令安装新依赖。

  5. 静态文件更新如果修改了静态文件CSS、JS、图片等必须执行collectstatic命令收集静态文件。

  6. 服务重启:代码更新后,必须重启相关服务,否则新代码不会生效。

  7. 迁移失败处理:如果migrate命令失败,可使用备份恢复数据库。

系统访问

  1. 访问系统:在浏览器中打开 http://your_domain_or_ip
  2. 管理员登录:访问 http://your_domain_or_ip/admin/,使用创建的超级用户登录
  3. 配置邮件在系统配置页面设置SMTP服务器、端口、用户名、密码、发送时间和收件人邮箱

注意事项

  1. WeasyPrint依赖如果PDF生成功能无法使用需要安装WeasyPrint的系统依赖

    sudo apt install -y libgobject-2.0-0 libcairo2-dev libpango1.0-dev libjpeg-dev libgif-dev librsvg2-dev
    
  2. Redis服务确保Redis服务正常运行否则Celery任务无法执行

  3. Nginx用户冲突确保部署时使用的用户名不会与nginx默认用户www-data冲突

  4. 文件权限:确保媒体文件、日志文件和报告文件目录有正确的读写权限

  5. 定期备份建议定期备份数据库文件db.sqlite3

技术支持

如有问题,请联系系统管理员。


© 2024 家庭日报系统 - 专注于家庭生活的轻量级日报系统