Raspberry Pi时间流逝,带有Swift,Vapor,Docker和Nginx的Ubuntu 16.04服务器

为了使这个基本任务复杂化并学到一些有趣的东西,可以使用Docker并在容器中运行我们的服务器。

有很多关于Docker的教程(我建议您查阅https://www.digitalocean.com教程),因此我将只关注与我的项目相关的部分。

我遵循了本教程:https://bygri.github.io/2018/05/14/developing-deploying-vapor-docker.html

因为服务器代码非常简单,所以我没有使用单独的开发/生产设置和docker-compose。

要启动蒸气项目:

 蒸发新的上传图像 

我从模板中剥离了所有不必要的代码(删除了数据库依赖项),并将route.swift减少为:

  进口蒸气 
  结构图片:内容{ 
  var image:文件 
  } 
  公共 功能路由( _路由器:路由器) 抛出 { 
  router.post(“ image”){ 
  req-> Future   
  返回 尝试 req.content.decode(Image.self).map(to:HTTPStatus.self){fileImage in 
   imageFolder =“ / app / Public” 
   fileName = fileImage.image.filename 
   url = URL(fileURLWithPath:imageFolder).appendingPathComponent(fileName) 
   { 
尝试 fileImage.image.data.write(to:url)
} {
  返回 .badRequest 
}
  返回 .ok 
}
  } 
  } 

/ app / Public是Vapor CLI创建的uploadingimages文件夹内的文件夹。

在uploadingimages内部创建DockerFile(基于bygri教程):

  #建立影像 
来自swift:4.2作为构建者
运行apt-get -qq更新&& apt-get -q -y安装\
tzdata
&& rm -r / var / lib / apt / lists / *
WORKDIR / app
复制。 。
运行mkdir -p / build / lib && cp -R /usr/lib/swift/linux/*.so / build / lib
运行swift build -c release && mv`swift build -c release --show-bin-path` / build / bin
  #生产图片 
来自ubuntu:16.04
运行apt-get -qq更新&& apt-get安装-y \
libicu55 libxml2 libbsd0 libcurl3 libatomic1 \
tzdata
&& rm -r / var / lib / apt / lists / *
WORKDIR / app
复制--from = builder / build / bin / Run。
复制--from = builder / build / lib / * / usr / lib /
展览8080
ENTRYPOINT ./运行服务-e产品-b 0.0.0.0

将新创建的泊坞窗推送到私有泊坞窗注册表:

  docker build -t uploadimages:1.0.1。 
docker登录mydockerregistry.private
泊坞窗标签uploadimages:1.0.1 mydockerregistry.private / uploadimages
码头工人推mydockerregistry.private / uploadimages

在Ubuntu计算机上,从注册表中提取图像:

  docker pull mydockerregistry.private / uploadimages:latest 

别忘了拉最新图片(uploadimages:latest)!

创建要在其中存储上载图像的文件夹(即uploadfolder),并在该文件夹内创建文件夹Public

在上载文件夹中,使用拉取的图像启动docker容器:

  docker run -v“ $(pwd)/ Public”:/ app / Public --name uploadimages -p 8082:8080 -d mydockerregistry.private / uploadimages:latest 

我使用了以下标志:

  -v“ $(pwd)/ Public”:/ app / Public 

这会将我们启动该容器的文件夹(通过docker run命令)安装到容器的/ app / Public文件夹,该文件夹可在router.swift内部访问

  --name uploadimages 

最好使用有意义的名称来命名容器,因为您可能有很多正在运行的容器。

  -p 8082:8080 

我将机器8082端口映射到容器的8080,并将传入的流量从端口443或80传递到我的Nginx服务器配置中的端口8082。

在服务器块的/ etc / nginx / sites-enabled / default内部,重定向流量:

 位置 / { 
  proxy_pass http:// localhost:8082; 
 重写〜/ uploader(。*)$ $ 1 break; 
  } 

为了从本地计算机进行测试,我使用curl运行POST请求:

  curl -X POST -F'image=@/Users/me/image.jpg'https://superserv.er/image 

我使用python脚本和cron作业,使用Raspberry Pi标准相机(noIR版本)每分钟捕获一次间隔拍摄图像:

  * * * * *屏幕-S timelapse -d -m / usr / bin / python /home/pi/timelapse/timelapse.py >> / home / pi / timelapse / timelapse.log 2 >> / home / pi / timelapse /timelapse.err 

此cron作业需要屏幕(sudo apt-get安装屏幕)

timelapse.py脚本:

 汇入要求 
 从进口睡眠 
 进口picamera 
 导入日期时间 
 导入时间 
 使用picamera.PiCamera()作为相机: 
  camera.start_preview() 
 睡眠(5) 
  ts = time.time() 
 文件名= datetime.datetime.fromtimestamp(ts).strftime('/ home / pi / time-lapse /%Y-%m-%d-%H-%M-%S.jpg') 
  camera.capture(文件名) 
 使用open(filename,'rb')as f: 
  r = request.post('https://uploadserver.com/image',files = {'image':f}) 
  camera.stop_preview() 

而已!

请在推特上关注我https://twitter.com/boramaapps

检查https://borama.co以获取我的IOS和Android应用程序!