You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署到服务器的aiogram Bot无法读取.env环境变量求助

排查aiogram Bot部署到服务器后无法读取.env文件的问题

以下是针对该问题的具体排查步骤:

1. 确认.env文件路径与权限

  • 服务器上的.env必须与Bot主脚本处于同一目录,或者在load_dotenv()中指定绝对路径(比如load_dotenv('/home/your_user/bot/.env'))。因为systemd启动时的默认工作目录可能不是脚本所在目录,导致相对路径查找失败。
  • 确保运行Bot的用户拥有.env的读取权限:
    chmod 640 /path/to/your/.env
    chown your_user:your_group /path/to/your/.env
    

2. 检查systemd服务文件的工作目录配置

打开你的systemd服务文件(通常位于/etc/systemd/system/xxx.service),确认WorkingDirectory字段指向Bot脚本所在目录,示例配置:

[Service]
WorkingDirectory=/home/your_user/bot_project
ExecStart=/usr/bin/python3 /home/your_user/bot_project/main.py
User=your_user

若未设置WorkingDirectory,systemd会使用默认目录启动,导致load_dotenv()无法找到相对路径的.env。

3. 验证.env文件格式正确性

确保.env内的键值对无语法错误:

  • 不要给值加引号,正确写法:TOKEN_ID=12345:ABCXYZ,而非TOKEN_ID="12345:ABCXYZ"
  • 每行一个变量,避免键或值前后加多余空格(比如TOKEN_ID = 12345会被解析为键包含空格,导致os.getenv('TOKEN_ID')返回None)

4. 添加调试输出定位问题

在代码中加入调试代码,打印关键信息:

load_dotenv()
print(f"当前工作目录: {os.getcwd()}")
print(f".env文件是否存在: {os.path.exists('.env')}")
token = os.getenv('TOKEN_ID')
print(f"读取到的TOKEN_ID: {token}")

然后通过systemd日志查看输出:

journalctl -u your_bot_service.service -f

从日志可以明确是找不到.env文件,还是读取解析失败。

5. 保持python-dotenv版本一致

本地与服务器的python-dotenv版本差异可能导致解析行为不同,执行以下命令确认版本:

pip show python-dotenv

若版本不一致,将服务器版本调整为与本地相同:

pip install python-dotenv==x.x.x

6. 备选方案:直接在systemd服务中定义环境变量

如果以上方法都无效,可以绕过.env,直接在systemd服务文件中配置环境变量:

[Service]
Environment="TOKEN_ID=12345:ABCXYZ"
Environment="ADMIN_ID=321813597"

修改后重新加载systemd并重启服务:

sudo systemctl daemon-reload
sudo systemctl restart your_bot_service.service

内容的提问来源于stack exchange,提问作者Ирина Брунёва

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 23:32:15