厌倦了部署,我建立了自己的 Heroku
本文由Appliku.com推出,这是首个专为 Python 和 Django 打造的部署服务。
无需再管理服务器,
5 分钟即可部署您的 Django 应用。
TLDR:我厌倦了部署我的 Django 项目,转而使用 Heroku,并被他们的发票所困扰,于是构建了我自己的 SaaS 来将应用程序部署到现有的云中。
故事始于定制软件开发机构
6 年前,我创办了另一家代理机构,为需要自动化耗时任务的企业构建定制解决方案:
- 为大型服务公司进行半自动化任务分配,
- 大型电子商务企业,
- 生成施工文件
- 许多较小的项目。
这是一次有趣的旅程。
我爱我们建造的一切。省下的钱,省下的体力劳动(当然,最后一点不是每个人都满意)。
它持续了 5 年,我喜欢我们所做的大部分事情。
但每次都有一件事很烦人。
我时不时需要启动一个新项目并设置一个测试环境,然后再设置一个生产环境。
每次部署都很痛苦
在此期间,我尝试了不同的部署方法和工具:
- 使用 Fabfile,
- 添加 CI/CD – 首先是 Atlassian Bamboo,然后是 GitLab
- 使用了 Supervisord,然后是 Docker,
- 裸机服务器、Digital Ocean、Linode。
在某个时候,我想出了一些脚本,使用 docker-compose 和 GitLab CI 来开始对推送到存储库的新提交进行部署。
但对于每个新项目,都必须完成大量的手动工作,这很容易出现人为错误,并且需要一整天的时间来完成所有设置:
- .gitlab-ci.yml
- docker-compose.yml
- 设置 Nginx 并加密
- 数据库
- 还有很多小事
当有新的客户项目出现时,我很高兴,但我害怕一遍又一遍地重复这个过程。
我认为一定有更好的方法。
让我们尝试一下 Heroku
那时,我们提出了几个自己的副项目,其中我们使用了 Heroku。
这是一次非常愉快的经历。
每走一步我都惊叹不已。
我实际上没有花任何时间在 DevOps 上。
我把几个项目也搬到那里,很简单。由于只是一些兴趣爱好网站,所以这些项目都没有带来任何收入。
然后时间到了,我收到了银行发来的短信,说 Heroku 正在从我的卡上扣款。那一刻,所有的兴奋都消失了。
Heroku Invoice 来了
在两个月内,Heroku 的支出从每月 15 美元攀升至每月 80 美元。用于业余项目。
我立即禁用了这些网站。其中一个我移走了,因为这是我们唯一感兴趣的。
与此同时,我的个人财务状况也发生了剧烈变化,有好几个月我都身无分文。
回归正轨,寻找思路
当我解决了财务问题后,我就有时间思考下一步该做什么。
我们已经完成了定制软件开发。
做完那项业务之后剩下的显然是部署的痛苦和支付 Heroku 费用的痛苦。
我想回到我们的一些业余项目。
我有时间以正确的方式去做这件事并享受其中的乐趣。
我想要一些像 Heroku 一样令人愉快的东西,但我不想为此付出那么多钱。
灯泡
我很清楚:我需要构建自己的 Heroku。
当时在 IndieHackers 上,我偶然发现了适用于 Ruby 的 Hatchbox.io 并听说了适用于 PHP 的 Laravel Forge。
我将其视为针对 Python/Django 的类似工具的验证。
一个月后,我想出了它的名字:Appliku。
我从构建 Docker 的 bash 脚本开始,启动了 Django 来管理它们,并在此基础上迭代了 17 个月,直到今天(2020 年 8 月 16 日,星期日)。
我现在有什么?
- 在 AWS 和 DigitalOcean 上自动配置服务器
- 服务器设置(Docker、Nginx、Let's Encrypt)
- 从 GitHub Repo 上的源代码构建应用程序
- 几乎与 Heroku 一样好的界面
- Heroku Config Vars Sync 适用于那些试图逐步离开 Heroku 的人。
引擎盖下有什么?
Django应用程序是该产品的核心。
前端是基于 mdbootstrap.com Angular 包使用 Angular 构建的。
Celery 运行大量后台任务。
当用户请求创建新服务器时,Appliku 通过 API 与 Digital Ocean 或 AWS 通信以进行配置。
当服务器配置完成后,在 Paramiko 模块的帮助下,Appliku 通过 SSH 连接到服务器并运行安装脚本。
设置完成后,您可以部署您的应用程序。
应用程序创建包括命名您的应用程序、选择存储库和分支以及您想要部署到的服务器。
该应用程序的唯一要求是拥有一个 Procfile。
我想,既然我已经离开 Heroku 了,肯定也有人会这么做。而且我喜欢这种在代码中定义流程而不是在 UI 中指定流程的想法。
Procfile 是一个文本文件,您可以在其中指定应用程序运行时需要运行哪些进程。
web: python gunicorn wsgi:app
release: python manage.py migrate
celery: celery worker -Q default
“web”告诉我们这个过程应该接受HTTP连接。
“release” 是在每次发布时执行的操作。
其它过程没有特殊含义。
Appliku 会询问你使用什么编程语言来运行该应用。目前支持的语言包括 Python、PYPY、PHP 和 Node。
对于复杂的构建,我们允许您编写自己的 Dockerfile。
Heroku Sync 是一项功能,它每分钟从 Heroku API 中提取应用程序的配置变量,并更新 Appliku 中相关应用程序的配置变量并重建它。
对于那些为了节省开支而将部分 Heroku Dynos 迁移到 Digital Ocean 的用户来说,这已被证明非常有用。通常,这是通过占用大量内存的后台工作程序来完成的。
当您点击部署时。
Appliku 使您的服务器能够:
- 前往你的 GitHub 仓库
- 克隆代码
- 创建 docker-compose 文件(基于 Procfile 和您启用运行的进程)
- 构建图像
- 开始吧
此外,它还请求为 appname.applikuapp.com 域或您添加的任何其他自定义域提供 Let's Encrypt SSL 证书。
通过让您的服务器执行此操作,我们确保您的所有代码仅存储在您的服务器上。我们存储的唯一代码信息是 Procfile 的内容。
应用程序部署后,它运行时不需要与我们的应用程序进行太多交互。
如果您推送新的提交 - 我们将运行构建/部署过程。
我们每天运行 certbot 来检查是否有任何证书即将过期。
关于 Nginx 配置的几句话。
Nginx vhost 的设置方式是尊重应用程序的缓存标头。
proxy_cache_path /home/app/_cache/sitename.com levels=1:2 keys_zone=sitename.com:10m max_size=1g inactive=60m use_temp_path=off;
location / {
proxy_cache sitename.com;
proxy_cache_revalidate on;
proxy_cache_min_uses 1;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
proxy_cache_background_update on;
proxy_cache_lock on;
proxy_cache_bypass $cookie_nocache ;
add_header X-Cache-Status $upstream_cache_status;
proxy_pass http://127.0.0.1:8003;
proxy_read_timeout 600;
proxy_send_timeout 600;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
这样,您可以在应用程序端使用虚拟缓存(如 Django 中的虚拟缓存后端)来生成适当的缓存标头,并且实际缓存将在请求到达后端之前发生。
结束语。
我在妻子的帮助下独自完成了整个项目,妻子负责了大部分非工程任务。
这是一件很有趣的工作。我学到了很多关于 Docker、Nginx、Paramiko 和 Django 本身的知识。
我认为这个应用程序可以帮助我以外的很多人:
- 更快地实现他们的想法
- 避免实施 DevOps
- 解决初学者的烦恼“我构建了应用程序,如何发布它?”
商业模式很简单——您向 Appliku 支付固定的服务费,并直接向云提供商支付服务费。
Appliku 上有一个免费计划,AWS 为新用户提供 1 年的免费使用期。
如果您正在学习编码或寻找一种(大部分)免费且令人愉快的方式来运行您的应用程序 - 我真的希望在这 17 个月内我构建了一个可以为您提供这种服务的解决方案。
聚苯乙烯
我真的希望您听到我的旅程和我所建造的东西很有趣并且看起来不像是促销品。
这是一段非常有趣的旅程,充满了兴奋、沮丧(你好,AWS Docs!)以及让某人的工作更轻松的想法。
我在这里分享这一切是为了告诉大家,只要你相信它,并且每天出现(哪怕只有 30 分钟)并坚持不懈地努力,那么即使是大而复杂的事情也可以完成。
如果该应用程序能够帮助某人,或者文章本身能够激励某人站起来创造一些东西——我会非常高兴。
感谢您花时间阅读本文。
聚苯硫醚
差点忘了应用程序的链接:https://appliku.com/
文章来源:https://dev.to/kostjapalovic/tired-of-deployments-built-my-own-heroku-47ed