使用Azure App Service免费版部署Next Terminal

*** 特别提醒,此部署仅限图个乐,由于Azure App Service使用的文件系统是CIFS,默认的sqlite的工作模式并不兼容,而更改sqlite日志模式为wal以后由于免费版app service存在资源回收导致的不定时重启的情况,数据库有低概率存在被损坏的可能,如在生产环境建议找台稳定点的机器部署 ***

船新的折(bai)腾(piao)系列,果然免费的最贵,费时间调试麻烦死了。

众所周知,Azure的国际版对每个订阅有白给的10个App Service F1应用计划的额度,这个订阅不管是Azure for Student (也就是学生100刀)、Pay as you go (即用即付),或者VSE订阅都是有效的,更有甚者,如果你有远古时期的Microsoft Imagine 订阅(现在的Azure for Student Starter,订阅OFFER ID ms-azr-0144p),这些东西也是可以直接用的。

既然MS在Azure给了为数不多的所谓免费资源,能物尽其用那当然是最吼的。这段时间发现App Service支持Docker Compose部署资源了,索性折腾了一下尝试在这上面部署了一个next-terminal。

虽然F1实例的资源限制比较感人(每个F1应用计划1G存储,1G内存,每月5G流量按每天165MB累加计算,每天60分钟CPU,折合下来就是全天均值CPU利用率不超过5%左右),对于不需要通过堡垒机/跳板机传输大数据、文件的一般console运维场景,这个资源完全够用了。

废话不多说,开始操作。

部署

首先访问这里(https://portal.azure.com/#create/Microsoft.WebSite),选择你的订阅和资源组,然后输入应用名称(这个名称也是你后面访问next-terminal的域名,格式是 <appname>.azurewebsites.net )

区域的话根据需要选择,下面是一张快速检索表,如果是需要从国内访问,建议选择新加坡或者日本以获得最佳体验,次选香港,因为Azure到国内三大运营商目前只有东京和新加坡的互联,香港和其他地区都得绕这两个地方。

区域名称选项
新加坡Southeast Asia
日本东京Japan East
日本大阪Japan West
香港East Asia
美国US West X = 美国西海岸
US East X = 美国东海岸

然后点击下一步,这里按照下图所示,会需要上传一个docker-compose.yml文件

这个文件的内容如下:

version: '3'
services:
  guacd:
    image: dushixiang/guacd:latest
    environment:
      WEBSITES_ENABLE_APP_SERVICE_STORAGE: TRUE
    volumes:
      - ${WEBAPP_STORAGE_HOME}/ntdata:/usr/local/next-terminal/data
    restart:
          always
  next-terminal:
    image: dushixiang/next-terminal:latest
    environment:
      DB: sqlite
      GUACD_HOSTNAME: guacd
      GUACD_PORT: 4822
      SERVER_ADDR: 0.0.0.0:80
      WEBSITES_ENABLE_APP_SERVICE_STORAGE: TRUE
    ports:
      - "80:80"
    volumes:
      - ${WEBAPP_STORAGE_HOME}/ntdata:/usr/local/next-terminal/data
    restart:
      always

这里做的事情:

  • 将Next-Terminal在docker内部暴露在80端口
  • 将 /home/ntdata 挂载到容器内部(以便于你持久化数据),写成 ${WEBAPP_STORAGE_HOME}/ntdata 是因为Azure的要求必须这样的格式,否则会无法启动。你可以自行修改挂载的目录

然后直接快进到“审阅+创建”就好,毕竟免费的App Service很多事情都没什么可以配置的。

在创建完毕以后,我们需要

  • 修改配置,允许挂载磁盘空间
  • 修改next-terminal所使用的sqlite文件对应的journal mode为wal,否则next terminal会因为数据库被锁导致初始化失败,进而服务不可用。(这个问题是因为App Service内挂载的这1G的文件空间是通过CIFS挂载的)

首先点击实例详情页左侧的”配置“,在”Application Setting”下看是否存在”WEBSITES_ENABLE_APP_SERVICE_STORAGE“这个选项,如果有的话,点击,然后修改Value为 TRUE,完了直接点击OK。如果没有的话,点击“New Application Setting”,然后Name输入 WEBSITES_ENABLE_APP_SERVICE_STORAGE ,Value输入 TRUE (注意都不要有空格)。修改/新增完毕以后,点击上方的”Save“保存。

然后转到这个新建的App Service实例详情页,点击左侧的 “开发工具”下的“SSH”,然后转到SSH。如果一直卡在红色的SSH CONN的话,也可以选择点击下面的“高级工具”进入以后点击新页面上方的Bash选项进行操作。

切换到 /home/ntdata/ 目录(请注意这个目录是前面Docker-compose.yml里面定义的挂载的文件夹,如果你有修改的话,需要进到对应的目录),然后运行下面的命令

rm /home/ntdata/sqlite/next-terminal.db
[ ! -d /home/ntdata/sqlite ] && mkdir /home/ntdata/sqlite -p
sqlite3 /home/ntdata/sqlite/next-terminal.db 'PRAGMA journal_mode=wal;'

在回显 ‘wal’ 之后,返回App Service详情页面,点击左侧“概述”,然后点击“重启”,等待一段时间(大概5-6分钟)之后,next-terminal应该就启动了。

这时候你就可以通过下面显示的地址访问到next-terminal了,默认的管理员账号密码都是 admin

其他注意事项

  • 如果需要数据备份的话,直接将 /home/ntdata 下的内容打包备份即可。
  • 正如前文所述,F1实例是有资源限制的,你可以在左侧的“配额”一栏看到使用情况。这个东西本身比较轻量所以一般情况下个人日常使用应该问题不大。
  • 免费的App Service在一段时间不活动以后就会进入休眠状态,下一次打开的时候可能会花上数分钟才能启动,一种方法是使用CF或者AWS的Serverless function,每10分钟curl一次你的访问地址,只要间歇性有访问流量,就可以大概率维持app的存活状态
  • 这个东西只限于图个乐,不建议用于生产环境,个人折腾折腾学习还是可以的。
  • 如果部署存在问题,你可以点击左侧“部署”选项下的“部署中心”,点击“Log”查看错误日志。
  • 使用这个方法你也可以类似的部署其他可以使用Docker-compose部署的容器服务,如果是Web服务,你需要确认docker-compose.yml内至少有一个expose 80或者8080端口的容器接收明文HTTP请求。

参考资料

  • Multi-container Linux Web App (链接)
  • Create a multi-container (preview) app using a Docker Compose configuration(链接

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注