• 2
  • 1
  • 版权所有:黑龙江维德科技有限公司      地址:黑龙江省哈尔滨市道里区河松小区112栋1-2层

    黑ICP备18001778号    网站建设:中企动力 哈尔滨

    >
    >
    >
    打造小而美的Web应用部署方案

    COOPERATION CASE /合作案例

      作为开发者,拥有一套自己运营的系统是很一件意义的事情。你可以通过运营,让应用持久稳定地给用户带来价值。

      然而,运营本身包含着很多琐碎的事。对我而言,其中一个琐碎的事情是,每次要发布应用,都需要远程登录到服务器,手工执行一些命令。

      有什么方法可以简化这种操作吗?答案当然是Yes。业界早就有各种持续集成(CI)/自动部署方案,比如大名鼎鼎的 Jenkins 或者 TeamCity 。可是对我而言,他们都太复杂。我只是运行着一个日访问量不到一万的小小网站,不需要那么重的东西。

      在一番探索之后,我终于搞定了一套小而美的自动化部署方案。下面和大家分享一下实现过程,希望可以抛砖引玉。

      背景

      我的这个网站后台采用Express框架实现,运行在nodejs上,前端采用的React+Redux技术栈。由于主要的数据存储在iCloud中,省去了自己搭数据库服务。

      服务器端主要安装了以下软件:

      Node, 用来跑Express应用;

      PM2,高性能的Node服务器;

      nginx,高性能的Web服务器,用来作为网关,将80/443端口的请求转发到 Node,同时,它可以处理静态资源的请求,比如HTML/JS/CSS之类的,减轻Node/pm2的负担;

      certbot,神器,自动申请并维护 Let’s Encrypt 的HTTPS证书。(光这个每年就可以节约100美刀以上!) 具体的安装可以参考 这篇文章。

      自动部署系统的初步实现

      简单而言,自动部署方案有以下几个部分。

      使用 Google Drive 作为中转。Google Drive 是高效的云存储服务,周边产品众多。免费的15G空间足够应付一般的需求。同时,可以对服务器上的重要数据进行备份。

      在个人开发机器上,使用 Google 出品的Back and Sync 应用云存储映射为本地一个目录。我使用的是Mac版的Back and Sync。要发布新版本时,直接将它拷贝到这个目录即可自动上传到云端。

      在Linux 服务器上,使用 rclone 拉取云端的更新到服务器发布目录。

    [{"atlasImg":{"id":19,"tenantId":null,"version":null,"appId":null,"viewType":null,"sourceApp":null,"useViewType":false,"authData":null,"jsAuthority":null,"atlasId":8,"title":"","des":"","coverFlag":true,"imgUrl":"/repository/image/m98wlmOMQd6sFxD0nRYzNg.jpg_{2i}xaf.jpg?k=1552295730000","thumbUrl":"/repository/image/m98wlmOMQd6sFxD0nRYzNg.jpg_{2i}xa.jpg?k=1552295730000","linkUrl":"","openType":true,"showOrder":1,"imgId":292,"thumbId":292},"bigWidth":600,"bigHeight":450,"smallWidth":135,"smallHeight":135,"srcImgUrl":"/repository/image/m98wlmOMQd6sFxD0nRYzNg.jpg?k=1552295730000","srcThumbImgUrl":"/repository/image/m98wlmOMQd6sFxD0nRYzNg.jpg?k=1552295730000"}]
    /atlas/3/
    ""
    "点击查看原图"
    e_box-000 e_MinorLink-001 e_link-001 true false true false 图册详情 70 true yyyy/MM/dd true e_box-000 true {"type":"","content":"","target":""} true e_AtlasArticleBox-001 e_articles-001 e_box-000 false 60 false e_AssistName-001 false e_link-001 e_icon-000 e_icon-000 false false e_ListImgTitle-001 input e_MinorLink-001 c_intro_relatedlist-15211002092345426 70 3 false false e_box-000 4x3 true false true _blank 1s_pAnGs003 e_image-000 24 1s_pAnGs001 true true true e_box-000 false e_box-000 225x225 atlas_detail-15211002090863730 e_PreBtn-001 225 24 e_MajorLink-001 TitleAll 1s_sbxGs002 图册详情 false 1s_sbxGs001 e_NextBtn-001 1s_sharesGs001 c_news_relatedlist-15211002093951313 c_companyplace_relatedlist-15211002095468334 e_HtmlEditor-001 24 e_btn-000 false e_box-000 e_box-000 false {"type":"","content":{"id":"","text":""},"target":"_blank"} true e_ContentMajorStyleBox-001 false e_box-000 e_box-000 e_MinorLink-001 e_AtlasRelationImg-001 true e_AtlasBox-001 true false true false true false true e_box-000 false false e_AssistInfo-001 100 true e_box-000 false false e_AssistInfo-001 e_box-000 e_image-001 e_box-000 e_box-000 false 4x3 true e_num-002 e_box-000 e_pagebox-000 true 3 0 0 4x3 e_ArticleHline-001 true e_box-000 site:atlas/atlas_detail-02 More e_ImgSummary-001 c_product_relaedlist-15211002093017341 true e_box-000 e_PageNum-001 false e_name-001 e_name-001 e_name-001 e_num-001 e_name-001 c_message_relatedlist-15211002095829880 true 1s_kwdsGs001 0 e_box-000 e_box-000 e_IconSwitchBtn-002 e_IconSwitchBtn-002 e_IconSwitchBtn-001 60 e_IconSwitchBtn-001 e_box-000 e_ImgHead-001 e_link-001 true e_head-000 atlas_detail-01 true 0 6 false false e_ImgHead-001 e_box-000 true top false c_atlas_detail-01001 atlasId;currentPage;atlasCateId 225 turnPage true _blank {"type":"","content":"","target":""} 4 true e_AssistName-001 3 e_AssistName-001 e_AssistName-001 e_AssistName-001 false e_num-002fsaggasf true e_PageNum-002 c_atlas_relatedlist-15211002094278200 e_box-000 e_image-000 true true c_file_relatedlist-15211002096356027 e_box-000 60 true 24 false 100 70 false true 1 1s_styleName0005 c_problem_relatedlist-15211002094836540 1s_styleName0002 HH:mm:ss 1s_styleName0003
    /repository/image/m98wlmOMQd6sFxD0nRYzNg.jpg_{2i}xaf.jpg?k=1552295730000 /repository/image/m98wlmOMQd6sFxD0nRYzNg.jpg_{2i}xa.jpg?k=1552295730000 /repository/image/m98wlmOMQd6sFxD0nRYzNg.jpg?k=1552295730000
    /repository/image/m98wlmOMQd6sFxD0nRYzNg.jpg_{2i}xaf.jpg?k=1552295730000
    /atlas/8.html
    /repository/image/6vucNb-DStqPycFqpwTWGA.jpg_{2i}xaf.jpg?k=1552295730000
    /atlas/7.html