手动部署
本文说明如何不用 Docker、也不用宝塔,直接从源码构建并手动部署 Epusdt。
前置条件
- 与当前源码仓库
src/go.mod兼容的 Go 工具链(本次审阅时为 Go 1.25.0) - Git
- 一台 Linux 服务器
- 生产环境建议准备 Nginx 或其他反向代理
- 一个已解析到服务器的公网域名
- 有效的 TronGrid API Key
当前源码支持的数据库方案:
- SQLite:默认、最简单
- MySQL:可选
- PostgreSQL:可选
WARNING
当前源码 不依赖 Redis,也不以“手工导入 SQL”作为标准安装步骤。应用启动时会自动完成表迁移。
上游仓库里仍能看到一些较旧的 README / wiki 教程,里面会提到 Redis 和手工导入 SQL。当前这套文档以最新源码和 .env.example 为准,优先按这里执行。
一、克隆源码
bash
git clone https://github.com/GMwalletApp/epusdt.git
cd epusdt/src二、编译二进制
bash
go build -o ../epusdt .编译后文件位于:
text
epusdt/epusdtTIP
如果你不想自己编译,也可以使用官方发布的预编译二进制。
三、创建 .env
在项目根目录执行:
bash
cd ..
cp src/.env.example .env然后编辑 .env:
dotenv
app_name=epusdt
app_uri=https://pay.example.com
log_level=info
http_access_log=false
sql_debug=false
http_listen=:8000
static_path=/static
runtime_root_path=runtime
log_save_path=logs
log_max_size=32
log_max_age=7
max_backups=3
# supported values: postgres,mysql,sqlite
db_type=sqlite
# sqlite primary database config
# 留空时使用当前源码默认值:runtime/store.sqlite
sqlite_database_filename=
sqlite_table_prefix=
# postgres config
postgres_host=127.0.0.1
postgres_port=5432
postgres_user=epusdt
postgres_passwd=change-this-db-password
postgres_database=epusdt
postgres_table_prefix=
postgres_max_idle_conns=10
postgres_max_open_conns=100
postgres_max_life_time=6
# mysql config
mysql_host=127.0.0.1
mysql_port=3306
mysql_user=epusdt
mysql_passwd=change-this-db-password
mysql_database=epusdt
mysql_table_prefix=
mysql_max_idle_conns=10
mysql_max_open_conns=100
mysql_max_life_time=6
# sqlite runtime store config
runtime_sqlite_filename=epusdt-runtime.db
# background scheduler config
queue_concurrency=10
queue_poll_interval_ms=1000
callback_retry_base_seconds=5
tg_bot_token=
tg_proxy=
tg_manage=
api_auth_token=replace-with-a-long-random-secret
order_expiration_time=10
order_notice_max_retry=0
forced_usdt_rate=
api_rate_url=
tron_grid_api_key=replace-with-your-trongrid-api-key至少重点确认这些字段:
app_uri:最终公网 HTTPS 地址api_auth_token:商户 API 请求签名密钥tron_grid_api_key:TRON / TRC20 监听必需db_type:数据库类型
四、运行时和数据库说明
静态资源
建议把 epusdt、.env、static/ 放在同一级目录。默认情况下,应用会从 ./static 提供静态资源。
SQLite
如果使用 db_type=sqlite:
- 不需要单独安装数据库服务
- 一般不需要手工导入表结构
- 应用启动时会自动建表/迁移
- 如果
sqlite_database_filename留空,主数据库默认落在runtime/store.sqlite runtime_sqlite_filename默认会放在解析后的运行时目录下,文件名为epusdt-runtime.db- 运行用户必须有写入数据文件和 runtime 目录的权限
MySQL / PostgreSQL
如果使用 db_type=mysql 或 db_type=postgres:
- 填写对应数据库连接字段
- 确保数据库服务可达
- 即使主数据库不是 SQLite,运行时锁仍通过
runtime_sqlite_filename使用独立 SQLite 文件
路径规则
runtime_root_path、log_save_path 和 SQLite 文件路径都可以写相对路径或绝对路径。
当前源码的解析规则是:
runtime_root_path:相对路径基于.env所在目录log_save_path:相对路径基于runtime_root_pathsqlite_database_filename:如果是相对路径,基于.env所在目录runtime_sqlite_filename:如果是相对路径,基于runtime_root_path- 绝对路径:必须确保运行用户可写
五、前台测试启动
在项目根目录执行:
bash
chmod +x epusdt
./epusdt http start可先访问:
http://127.0.0.1:8000/http://127.0.0.1:8000/pay/checkout-counter/<trade_id>(在你已经创建真实订单时)
确认能正常启动后,按 Ctrl+C 停止,再配置 systemd。
六、配置 systemd
创建 /etc/systemd/system/epusdt.service:
ini
[Unit]
Description=Epusdt USDT Payment Middleware
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/epusdt
ExecStart=/opt/epusdt/epusdt http start
Restart=always
RestartSec=5
Environment=TZ=UTC
[Install]
WantedBy=multi-user.targetWARNING
WorkingDirectory 中应包含 .env、epusdt 和 static/,除非你已明确改成自定义路径。
启用并启动:
bash
sudo systemctl daemon-reload
sudo systemctl enable epusdt
sudo systemctl start epusdt排查常用命令:
bash
sudo systemctl status epusdt
sudo journalctl -u epusdt -f七、配置 Nginx 反向代理
生产环境建议通过 HTTPS 域名访问,并反代到本地端口。
示例配置:
nginx
server {
listen 80;
server_name pay.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name pay.example.com;
ssl_certificate /etc/letsencrypt/live/pay.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/pay.example.com/privkey.pem;
location / {
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;
}
}重载 Nginx:
bash
sudo nginx -t
sudo systemctl reload nginx注意:
app_uri必须和最终公网地址一致- 最稳妥的是根路径部署
- 如果你硬要挂子目录,需要由反向代理正确改写路径,因为应用本身注册的是
/、/pay/...、/payments/...
八、更新服务
源码部署的更新流程:
bash
cd /opt/epusdt
sudo systemctl stop epusdt
git pull
cd src && go build -o ../epusdt . && cd ..
sudo systemctl start epusdt如果你用的是发布版二进制,替换文件后重启服务即可。
常见问题
服务启动失败
请检查:
- 工作目录里是否存在
.env ExecStart是否包含http startstatic/是否在应用预期位置- runtime 和日志路径是否可写
Nginx 返回 502 Bad Gateway
请检查:
- Epusdt 是否成功监听配置端口
- Nginx 反代端口是否与
http_listen一致 journalctl中是否有启动报错
支付一直不确认
请检查:
tron_grid_api_key是否已配置- 钱包地址是否已正确添加
- 服务器是否能访问外部 TRON / HTTP API
- 测试流程是否符合当前支持的 TRON / TRC20 支付路径
回调重试和预期不一致
当前回调重试行为由配置决定,重点看:
order_notice_max_retrycallback_retry_base_seconds- 商户回调接口是否返回 HTTP
200且响应体严格为ok
