DuetG Blog

Keep It Simple, Stupid

标签: docker

  • 小米盒子3c刷CoreELEC运行Home Assistant Container

    小米盒子3c刷CoreELEC运行Home Assistant Container

    这是一个穷人乐,如果你像我一样手头上正好有一个小米盒子3c,一条公对公USB数据线,再加上拆机棒、镊子等工具,可以照着下面折腾一下。但如果你只是为了有一个好用的Home Assistant,建议花300左右购入一个Orange Pi 3 LTS自行制作Home Assistant Supervised,或者700多块直接买一个Home Assistant Green,就不要瞎折腾了,更不要为这个专门去收个二手盒子。因为Home Assistant Container只是一个基本的Home Assistant(仅比Home Assistant Core强些),不能安装加载项(Add-ons),更不能安装社区商店(Home Assistant Community Store,可用性以及可玩性都不高。

    Update:今天才知道Home Assistant所有版本都可以安装HACS,被官网那张图骗了好几年……

    如果我上面说的还算清楚,并且你已经看到这里了,那就一起来穷人乐吧。

    刷机包的相关信息和教程在国内是被作者发到了恩山论坛上,时间是22年5月份。文件和源代码托管在全球最大同性交友网站GitHub上,还请自行前去下载。如果没有游戏需求,还请下载9.2-mibox3-1.4,在这个版本仅有CoreELEC。论坛上作者的教程写的还算详尽,请直接参考论坛上的帖子来刷机,这里我主要讲刷机过程中和刷机后的一些问题。至于刷机软件Amlogic USB Burning Tool,作者本人说用的是v2.0.8,其他的版本我也试了几个,结果都不行,但v2.0.8一次成功,所以建议搜索下载这个版本安装。

    如果你没有公对公USB数据线,也可以找两根不要的数据线剪断重接。线准备好了之后,就可以用拆机棒拆机了。这里有篇小米盒子3s的拆机文章,在外壳上和3c基本上是一样的,可以参考一下。经验是要从后往前拆,一旦后面的卡口撬开了,剩下的用拆机片沿着接缝就能划开。不过一开始是比较紧的,不是很好拆。

    拆机完成后就是刷机了,这里我再具体说明一下需要短接的两个测试点是在屏蔽罩的一角和螺丝中间的两个铜测试点,而不是另一边并列三个测试点其中的两个。

    找作者在帖子中所说的步骤准备固件,刷机软件,并把设备与电脑连线等等。软件请务必确保在右侧仅选中“擦除flash”以及下拉菜单里选择“擦除所有”。用左手拿镊子保持短接,右手把电源打开,听到电脑响起硬件插入的响声后立刻取消短接,然后静等烧录完毕。如果中间有问题烧录中止了,请全部断开然后从头重新操作一遍。

    烧录完成后给盒子断电,拔掉数据线。接上HDMI显示器以及键盘或鼠标,插上电源重新开机,就可以看到CoreELEC的启动画面了。

    CoreELEC本身就是一个基于Kodi的极小化Linux系统,所以进去之后修改中文什么的在网上搜一下就可以找得到教程。如果首次登录的时候设置Wi-Fi出错跳过了这个步骤,可以到设置菜单最下面的CoreELEC菜单里重新录入Wi-Fi密码,蓝牙遥控器也需要在这个菜单下重新连接。遥控器进入配对模式是需要按住Home键和菜单键两个不松手,稍等片刻就进入配对模式。如果没有切换成中文就去连接遥控器,会在蓝牙上看到一个名称都是方块的设备,这个就是遥控器没错了。

    如果语言列表里没有中文,需要到插件菜单里下载中文,但在切换中文前请务必把皮肤的字体改为基于Arial,否则整个UI也会变成方块。

    在插件中找到CoreELEC的官方源,在服务程序里找到Docker安装好,并在设置里开启ssh。然后通过ssh进入CoreELEC的命令行,使用以下命令来安装并启动Home Assistant Container。默认用户名是root,默认密码是coreelec。

    docker run --restart always -d --name homeassistant -v ~/homeassistant/config:/config -e TZ=Asia/Shanghai --net=host ghcr.io/home-assistant/home-assistant:stable

    待镜像下载完毕容器跑起来之后,使用你的盒子的IP,端口8123,就可以访问Home Assistant。

    最后说一下遥控器。刚刷好的CoreELEC,把遥控器的连牙蓝上了之后,遥控器的电源键会一键关闭盒子上的系统(并不会彻底关闭电源,也不能开机)。但这种设定很容易带来误操作的麻烦。在网上搜了搜,找到了重新定义keymap的解决方案,一个CoreELEC官方论坛上的帖子。根据官方开发人员的回复,在电脑资源管理器的地址栏输入

     \\你的小米盒子ip\Userdata\keymaps

    可能会需要你输入用户名和密码,由于之前没有修改过密码,所以用户名是root,密码是coreelec。

    打开文件夹后把帖子里的keymaps.xml下载并上传到这个文件夹里,重启以下系统,之后遥控器的电源键就只能触发电源菜单而不会直接关机了。

  • 使用WebP Server Go优化网站图片

    使用WebP Server Go优化网站图片

    之前介绍了使用WebP Cloud Services的公共服务做代理让Gravatar的头像能在大陆正常访问的方法。

    设置好之后就决定想尝试一下他们的图片服务。但是官方制作的Wordpress插件着实用起来不顺手:只能将正文里本地图片的地址替换成代理地址,但特色图片却不能替换。要知道像2023这种官方主题,如果文章里不怎么插入图片的话,特色图片反而是页面加载数据量的大头。自行修改插件失败之后,我决定寻找替代的方案。

    按照官方插件作者的Blog我找到了WebP Cloud Services后端使用的开源程序WebP Server Go。开源代码和付费服务其实是一个作者。研究了一下GitHub上的README.md以及官网的文档,用Docker很快就部署完成了。简单修改了一下Nginx的配置文件,Blog页面的加载速度果然快了不少。特色图片用的大分辨率的图果然影响了不少速度啊。

    简单说一下部署流程和注意事项,默认你要加速的也是Wordpress,并且服务器里已经装好了Docker。

    首先建立一个工作目录,并且在里面创建一个 docker-compose.yml

    version: '3'
    
    services:
      webp:
        image: webpsh/webp-server-go
        # image: ghcr.io/webp-sh/webp_server_go
        restart: always
        environment:
          - MALLOC_ARENA_MAX=1
        volumes:
          - ./path/to/pics:/opt/pics  #./path/to/pics 改成你的Wordpress目录
          - ./exhaust:/opt/exhaust
          - ./metadata:/opt/metadata
        ports:
          -  127.0.0.1:3333:3333
        deploy:
          resources:
            limits:
              memory: 400M
        memswap_limit: 400M

    假设你的图片和网站路径有着这样的对应模式:

    图片路径

    /var/www/duetg.com/path/demo.jpg

    网站路径

    https://duetg.com/path/demo.jpg

    那么docker-compose.yml里的 ./path/to/pics 就应该改成 /var/www/duetg.com

    exhaust 和 metadata 会自动在工作文件夹中生成,exhaust 文件夹中包含已经转换完毕的图片缓存,以备下次请求的时候直接使用。这两个文件夹也可以自行定义位置。

    Docker Compose文件写好保存退出后,就可以拉取镜像创建容器了

    docker compose up -d

    接下来我们修改Nginx配置文件。原理很简单,在 server 块里新建一个 location,运用反向代理把和图片相关的请求直接转到Docker容器映射的3333端口就好。location 有两种写法,一种是直接指定到Wordpress的图片附件文件夹

    location ^~ /wp-content/uploads/ {
        proxy_pass http://127.0.0.1:3333;
    }

    还有一种是在整个目录里用正则表达式过滤和图片相关的文件扩展名

    location ~* \.(?:jpg|jpeg|gif|png)$ {
        proxy_pass http://127.0.0.1:3333;
    }

    如果你还使用了Cloudflare之类的CDN加速,你需要让CDN服务器知道这些图片不缓存,所以还要在 location 块里再加上下面这行

    location ~* \.(?:jpg|jpeg|gif|png)$ {
        add_header Cache-Control 'private';
        proxy_pass http://127.0.0.1:3333;
    }

    由于WebP Server Go会自动拒绝原本已经是WebP图片的转换请求,导致返回是空值,如果你的网站已经有一部分WebP图片了,建议还是用按扩展名过滤的方法来向服务请求图片转换更好。

    使用自托管的WebP转换服务和使用云服务相比,优点除了有免费且不限量外,其实更重要还在于网页里的图片引用地址不会被更改,这点也是我所看中的。