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应用程序!