Heroku是一个支持多种编程语言的PaaS云服务平台,提供丰厚的计算、数据库免费额度。近期突发奇想用Heroku搭建了一个字幕下载应用,支持YouTube与B站字幕在线下载,后期研究好后可以开放API出来。
本文记录了Heroku部署使用中遇到的问题,迫于免费应用 30 分钟休眠机制,初次打开可能会较慢,后续字幕下载应用将迁移到独立主机上。
功能预览
- 将按钮拖拽到标签栏,播放视频的时候点击即可完成字幕下载
- 支持 YouTube bilibili 字幕预览、srt 与 txt 格式字幕下载,啰嗦的教程视频可以只看字幕学习
- 西瓜视频、B站搬运能手,后期将支持 YouTube 在内的多个视频网站视频下载(占坑)
- 提供 YouTube 关键字搜集展示,了解视频是如何推广、SEO 的
Heroku 简介
Heroku 是最早做 Serverless 服务的云计算厂商之一,Heroku 灵活性极高,最早支持 Ruby 语言,后面支持了主流的 Java Python Node.js 等语言,是免费托管后端应用的首选。除了免费计算服务额度,Hexoku 还提供了一定的免费数据存储额度,通过大量的插件和扩展,支持如数据库、电子邮件和其他很多服务。包括 PostgreSQL、Redis、Kafka 等资源。
总之来说,Hexoku 的免费范围内支持在有限的资源环境中运行完整的云应用程序,你只需要将代码提交到 Git 仓库,剩下的一且都可以交付出去。
优点 | 缺点 |
---|---|
免费额度丰富够用,不限时长 | 30秒不使用会暂时休眠 |
资源齐全,包含数据库、中间件 | 只有美国节点,大陆访问略慢 |
Heroku 部署的坑
尽管 Heroku 已经非常优秀,但是由于英语水平有限,官网又很慢,初次使用难免还是有一些晦涩的问题。
如何创建应用
下载 Hexoku CLI 并登陆后,执行一个命令即可创建一个 App
> heroku create |
在目录下编写代码,启动一个 Web 服务器:
// index.js |
创建一个 Procfile
文件,相当于项目的启动脚本:
web: node index.js |
提交改动,完成部署:
git add -A |
访问测试
curl https://boiling-shore-56596.herokuapp.com/ |
大功告成,就是这么简单。
端口监听问题
端口监听环节 Heroku 的原理是将应用的端口映射到 url 上,这个映射关系应该由 Heroku 容器来自动实现,即:
- 你应该监听哪个端口,是 Hexoku 通过环境变量分给你的
- 每次启动应用分配的端口不同,通过 PORT 获取
- 只有监听了指定的端口,应用才能启用,否则会超时关闭应用
在 Node.js 中,可以使用 process.env.PORT
获取端口信息。
资源问题
创建好 PostgreSQL 后,如何获得连接字符串,如何设置环境变量在应用中使用?
资源、配置均被注入到环境变量中,可执行 heroku config
查看:
heroku config |
可见 Heroku 的部分资源是托管在 AWS 上啊。
heroku 避免睡眠/休眠
设置一个定时任务,每几分钟访问一次就避免休眠了:
crontab -e |
以上任务每 15 分钟通过 curl 访问一次应用,避免 heroku 30 分钟休眠。
heroku 几个错误问题
自动断开
检查端口是否绑定监听上,如果 web 应用没有监听上 heroku 指定的端口,过一会儿就会被 kill。
打开很慢
一方面是因为主机在美国,收基础计算服务商网络影响,DNS 与网络状况都一般;另一方面是免费版长时间(30 分钟)不活跃的应用将被休眠,直到下次访问冷启动会很慢。
可以写一个定时脚本,定时去访问一下只要产生流量即可,避免 30 分钟休眠。
npm ERR! Cannot read property ‘match’ of undefined
原因是 Node.js 应用上 Heroku 只识别一个依赖配置文件,请删除 package-lock.json
和 yarn.lock
其中一个重新提交再试,或者两个都删除。
error: failed to push some refs to ‘https://git.heroku.c
原因是依赖没有装上,Heroku build 的时候报错,最后导致提交不上去,请优先处理 Heroku build 错误而不是一昧的怪罪到 Git 上。
heroku 应用文件丢失
Heroku 不提供磁盘存储服务,尤其是免费应用 30 分钟没有活动就休眠,请不要使用文件、SQLite 等文件相关的记录器,这个不保证能持久使用。