個人一人互聯網公司

譯自:broadcast.listennotes.com/the-boring-…前端

看做者如何輕鬆利用「Django+其餘技術」構建一個商業網站。react

簡介

Listen Note 是一個播客搜索引擎和數據庫。Listen Note背後的技術其實很是簡單無聊,沒有使用什麼人工智能、深度學習或區塊鏈(任何人說本身使用了人工智能技術,他使用的都不是真正的人工智能)。webpack

播客,也稱PodCast,是一種數字媒體,指一系列的音頻、影片、電子電臺或文字檔以列表形式經互聯網發佈,而後聽衆經由電子設備訂閱該列表如下載或流當中的電子文件,從而接收內容。git

讀完這篇文章後,你應該也能夠構建一個Listen Notes或者很輕鬆的作一些相似的事情。github

你不須要僱不少員工,還記得Instagram被FaceBook以10億美圓收購的事情嗎?當時Instagram才13個員工,並且並不是所有都是工程師。web

如今比以往任什麼時候候均可能經過一個小型團隊(甚至一我的)來構建一些有價值有意義的東西。數據庫

Listten Notes概覽

Listen Notes爲用戶提供了兩樣東西。後端

  • 1.一個網站,地址爲:listennotes.com,它提供了一個搜索引擎、一個播客數據庫,還提供了稍後再聽、播放列表、聽播客片斷(它容許你剪輯任何播客界面的一個片斷,而後收聽)以及播客監聽提醒(互聯網上的新播客中提到了你指定的關鍵字,它就會通知你)等功能
  • 2.爲開發者提供了播客搜索與目錄的API,經過API能夠了解用戶的使用狀況。

我在AWS上運行了ListenNotes的全部東西,總共用了20臺生產服務器(2019年5月5日爲止)api

從主機名就能夠猜出,每一個服務器是作什麼的瀏覽器

  • 1.production-web(生產網服務器):主要用於提供listennotes.com網絡流量服務。
  • 2.production-api(生產api服務器):主要用於提供API服務,目前我運行了兩個版本的API(v1api遺留版api與v2api新版api)
  • 3.production-db(生產數據庫):使用PostgreSQL構建主從數據庫
  • 4.production-es(Elasticsearch集羣):主要負責搜索
  • 5.production-worker(工做者):主要用於運行各類離線任務(爬取最新的播客),以保持播客數據庫始終是最新的,並提供一些其餘的小功能。
  • 6.production-lb(負載均衡器):使用了Redis與RabbitMQ這種簡單方式構建(這不是一個理想的方案,但我歷來不是一個完美的人)
  • 7.production-pangu(盤古)用於運行一些一次性腳本以及進行測試的機器(這裏的盤古就是盤古開天地的盤古,中國文化在國外仍是頗有吸引力的:))

後端

整個後端使用 Django/Python3 編寫,操做系統是Ubuntu。

使用uWSGI+Nginx來部署Django,Nginx也用來充當負載均衡器(這其實就是常見的Ubuntu+uWSGI+Nginx+Django的部署方案,不瞭解的,能夠搜索一下,能夠找到一大堆具體的操做)。

數據庫主要使用PostgreSQL,我對PostgreSQL有多年的開發與運營經驗,使用的比較好。

Redis用於不一樣目的,如用於緩存、統計等等

Elasticsearch負責整個網站的搜索,我使用Elasticsearch索引了網站中的播客與劇集,使用方式跟不少無聊的公司同樣,沒什麼可說的。

我使用Celery來調度離線任務,用Supervisord來對服務器上進程進行管理。

爲何不用Docker/Kubernetes/Serverless這些技術?

沒有必要,對於中小型公司而言,過分工程化是很差的。實際上,早在2014年,我就爲個人僱主作過一些Docker早期的工做,這對於一個規模達到十億美圓的中型創業公司是一件好事,但對我這種一我的的創業公司,可能就有些過了。

前端

網站的前端主要使用 React+Redux+WebPack+ES構建,這是如今的標準作法。

當部署到生產環境時,我將JS包導出到Amazon S3上,並經過CloudFront提供CDN服務

Amazon CloudFront 是由亞馬遜網絡服務系統提供基礎服務的一個內容分發網絡(CDN)。其在歐洲、亞洲、北美、澳洲、南美、美國多個主要大城市多地擁有本身的數據中心,共 107 個網絡邊際服務點提供服務。

在listennotes.com這個網站上,大多數網頁一半使用了Django模塊一半使用了React程序。服務器渲染部分提供了web頁面的樣板,而客戶端(瀏覽器端)部分基本上就是一個交互式web應用程序。

但有一些網頁是徹底同Django模板渲染呈現的,由於我懶得將事情作得太完美,並且這可能對SEO有一些好處。

音樂播放器

在listennotes網站上,我使用一個進過大量修改的開源音樂播放器react-media-player,這個播放器我使用在了多個地方,經過iframe簡單嵌入在須要的頁面就行了,很是簡單。

react-media-player開源地址:github.com/souporserio…

播客API

listennotes爲開發者提供了簡單可靠的播客API,構建API相似於構建網站,後端使用了Django/Python來構建,前端使用了ReactJS,效果以下。

對於API,咱們須要跟蹤記錄使用API的用戶在當前計費週期中使用了多少次請求,並在計費週期結束時收取相應的費用。

DevOps

機器配置與代碼部署

我使用Ansible進行服務器的部署,簡單來講就寫了一堆yaml文件來指定什麼類型的服務器須要聲明什麼配置文件以及什麼軟件,下面是這些Ansible yaml文件的目錄結構。

我還使用Ansible將代碼部署到生產環境彙總,基本上,我就在MacOS中運行一個部署腳本deploy.sh就能夠了。

Ansible:作Python運維必須知道的一個第三方庫,簡單而言,Ansible是一個簡便的IT自動化引擎,有興趣能夠自行搜索瞭解一下,其生態豐富,有不少文檔能夠參考。

deploy.sh接收3個參數,使用方式以下:

./deploy.sh production HEAD web
複製代碼
  • 1.Envireonment:用於區分你要部署的是生產環境仍是staging環境
  • 2.listennotes repo版本:HEAD是隻部署最新的版本,若是指定的是git commite中的SHA,那麼它就會部署一個特定的版本,這在我須要從一個錯誤部署中回滾到某個版本的代碼來講很是有用。
  • 3.Server kind服務器類型:有web、woker、api等不一樣服務器類型選擇,我不須要同時部署全部的服務器,有時我對JavaScript代碼進行了修改,我就只須要將其部署到web上,而不須要改動api與worker類型服務器

staging環境:一般一個web項目都須要一個staging環境,一來給客戶作演示,二來能夠做爲 production server的一個 「預演」,正式發佈新功能前能及早發現問題。

部署的大部分過程由Ansible yaml配置文件精心安排,Ansible會自動去執行完這個流程,固然,這很是簡單:

  • 1.在個人MacBook Pro上:若是要部署到web服務器上,就自動構建JavaScript包,並上傳到Amazon S3上
  • 2.在目標服務器上:通git,將對應的listennotes repo克隆到一個以時間戳命名的文件夾中,檢查特定的版本,並經過pip安裝新的Python依賴
  • 3.在目標服務器上:將軟鏈接(經過ln命令構建軟鏈接)指向新的時間戳文件夾,並經過supervisorctl重啓服務器

整個工做我沒有使用任何複雜的技術,只是利用了一些簡單且實際的技術來實現這樣的流程。

監控與報警

我使用DataDog服務進行監控與報警,它是一個SaaS服務,因此我並不須要作什麼複雜的事情就能夠獲得一個簡單儀表盤,並從中看都我服務器的各類指標。

我將DataDog連接到PagerDuty,若是出了什麼問題,PagerDuty會經過電話與短信的形式提醒我。

此外,我還使用Rollbar來關注Django代碼的情況,它會捕捉代碼意外產生的異常並經過email或Slack(Slack基於雲的專有即時消息傳遞平臺)來通知爲通知我。

Datadog 是雲服務應用程序的監控服務,經過基於SaaS的數據分析平臺提供對服務器,數據庫,工具和服務的監控。 PagerDuty 是一家美國雲計算公司爲IT部門提供SaaS事件的響應平臺。 Rollbar 能夠自動化錯誤監視和篩選,開發人員能夠在幾分鐘內修復重要的錯誤,而且能夠快速、輕鬆地構建軟件。 這些都是SaaS服務,都是要花錢的:(

我我的常用Slack,但公司只有我一我的,因此我不使用Slack與他人交流,而是經過Slack來監控有趣的應用程序級事件。

除了將DataDog和Rollbar與Slack集成,我還在Listen Notes後端代碼中使用了Slack傳入webhooks(網頁鉤子),當用戶註冊或執行一些操做時,Slack就能夠通知到我。

在2017年初推出ListeNote以來,只在2018年4月22日停電事故宕機了一次,那一次ListenNote網站關閉了4個小時,我損失了10個小時的生產數據,是一次重大的打擊。此外ListeNote就沒有出現過任何中斷。

發展

我在舊金山的WeWork共享空間工做。

爲何不在家裏?

我很是重視生產力,我願意在生產力上投資,我不認爲在家裏摸魚有助於軟件開發(或任何類型的知識/創造性工做)。我不多一天工做超過8小時,我珍惜每一分鐘。

所以,我須要一個漂亮且相對昂貴的私人辦公室,我不肯花更多時間來節省這些錢,而更願意花費一些錢利用更少的時間來賺錢。

我使用MacBook Pro進行開發工做,我在Vagrant+VirtualBox中運行了幾乎與線上相同的環境,我一樣使用Anserable yaml文件來部署Vagrant內部開發環境。

我將listennote的代碼都託管到Github的私有repo中,我在主分支上作全部的開發工做,我不多使用功能分支。

我使用PyCharm編寫並運行dev服務(Django runserver 和 webpack dev server),這很無聊...我沒有使用VS Code或Atom或其餘很酷的IDE。

保持冷靜,持續行動

正如你所見,咱們生活在能夠輕鬆創辦公司的美好時代,有那麼多現成的工具與服務,能夠節省咱們的時間和金錢,並提升咱們的生產力,如今比以往任什麼時候候都更能讓一個小團隊或一我的利用一些簡單且無聊的技術來構建一些對世界有用的東西。

隨着時間的推移,公司會越變越小,你不須要僱傭全職員工,你徹底能夠經過SaaS以及Upwork上找承包商來完成工做。

大多數時候,阻礙咱們行動的就是過分思考,你會想,若是這個...若是那個...,其實你一點都不重要,每一個人都在忙於本身的生活,沒人關注你建立的東西,除非你證實你值得被別人關注。即便你徹底搞砸了最初的產品發佈,也不多有人會注意到。

Think big, start small, act fast.

使用一下無聊的技術開始作一些簡單的事情是徹底能夠的,只要你能真正解決問題。

國內不少文章都將作個東西描繪的複雜難懂,細節不少,而國外不少文章一上來就會說,這是個簡單且無聊的東西,我更喜歡國外文章的氛圍,不是說,技術必定都很簡單,而是給人樹立信息,對本身能夠作的事情有信心是很好的事情。

若是個人文章對你有所幫助,請點一下「好看」,這對我這個小號而言很是重要,叩謝豪恩。

相關文章
相關標籤/搜索