0%

ubuntu18.04 默认的 samba 版本号为4.7,这个版本不支持 timemachine,于是准备在docker上搭建,虽然目前还没开起 timemachine 的功能,但是后续有空也许会弄上。

用的人最多的镜像是dperson/samba,然而官方的例子太少了,只给了常用情况,但我还有一些需求没有满足, 比如使用单独文件存放密码什么的,于是踩了一波坑。

下面这个是我的完整的 docker 命令

1
2
3
4
5
6
7
8
9
docker run -itd --name samba --restart=always --net=host \
-v /etc/localtime:/etc/localtime \
-v /home/lomot/docker-service/samba/smbpasswd:/etc/samba/smbpasswd \
-v /nas/samba/smb-share:/share \
-v /nas/samba/smb-lomot:/lomot \
dperson/samba -p \
-i "/etc/samba/smbpasswd" \
-s "share;/share;no;no;no;lomot,share" \
-s "lomot;/lomot;no;no;no;lomot"

奇怪的”-p, -v”

我一开始是在官方的例子上修改,官方的例子是这样的:

1
2
3
4
5
6
7
sudo docker run -it -p 139:139 -p 445:445 -d dperson/samba -p \
-u "example1;badpass" \
-u "example2;badpass" \
-s "public;/share" \
-s "users;/srv;no;no;no;example1,example2" \
-s "example1 private share;/example1;no;no;no;example1" \
-s "example2 private share;/example2;no;no;no;example2"

我想要把自己的目录映射到容器内,于是就粗暴地加上了两行

1
2
-v /nas/samba/smb-share:/share \
-v /nas/samba/smb-lomot:/lomot \

结果提示-v命令没找到,当时我还以为docker更新去掉了-v挂载镜像,仔细看了一波后才发现原来在dperson/samba -p之后的内容全部是私有命令,根本就不是docker的命令,(命令的格式写的和docker一样真的很容易误解啊,后来我在容器内翻了一下,发现这些报错来自一个作者写的脚本samba.sh)。

密码相关

官方例子里面的密码是放在命令里面的,就像这样-u "example1;badpass",但是这样总让人觉得不安全,查找文档关于密码是这样解释的

1
2
-i "<path>" Import smbpassword
required arg: "<path>" - full file path in container

没太看懂。
后来在一个issue里面找到了用法

先生成一个 smbpasswd,默认目录在/etc/samba/smbpasswd,当然也可以手动把它放到别的地方

1
pdbedit -b smbpasswd -a <username>

然后把它挂载到镜像里面去

1
-v /etc/samba/smbpasswd:/etc/samba/smbpasswd

指定密码文件 smbpassword

1
-i "/etc/samba/private/smbpasswd"

权限相关

这个地方官方文档讲的很清楚,我的配置是下面两行这样

1
2
-s "share;/share;no;no;no;lomot,share"
-s "lomot;/lomot;no;no;no;lomot"

顺便把文档里面的解释复制过来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>-s "<name;>[;browse;readonly;guest;users;admins;writelist;comment]"
Configure a share
required arg: "<name>;</name></name;></path>"
<name> is how it's called for clients
<path> path to share
NOTE: for the default values, just leave blank
[browsable] default:'yes' or 'no'
[readonly] default:'yes' or 'no'
[guest] allowed default:'yes' or 'no'
NOTE: for user lists below, usernames are separated by ','
[users] allowed default:'all' or list of allowed users
[admins] allowed default:'none' or list of admin users
[writelist] list of users that can write to a RO share
[comment] description of share

端口

官方例子是这样-p 139:139 -p 445:445指定端口的,但是我后来发现samba还占用了137,138端口,
没想太多就直接用了host模式--net=host

查看samba版本

进入容器之后发现找不到 samba 可执行文件的位置
最后通过包管理器看到了 samba 版本

1
2
3
4
5
6
7
8
9
10
11
bash-5.0# apk info samba
WARNING: Ignoring APKINDEX.00740ba1.tar.gz: No such file or directory
WARNING: Ignoring APKINDEX.d8b2a6f4.tar.gz: No such file or directory
samba-4.10.8-r0 description:
Tools to access a server's filespace and printers via SMB

samba-4.10.8-r0 webpage:
https://www.samba.org/

samba-4.10.8-r0 installed size:
12288

按照水果的 官方文档 操作发现不能下载mojave镜像,我记得我曾经在使用high sierra时是可以下载的。

会出现Update not found的错误
image.png


于是去网上查了一下,发现可以使用 macOS Patcher Tool 下载最新镜像并创建U盘启动盘。
image.png
下载完成后的操作就比较简单了。

官方文档里面的创建启动盘命令是这样的:

1
sudo /Applications/Install\ macOS\ Mojave.app/Contents/Resources/createinstallmedia --volume /Volumes/MyVolume

这里直接把下载下来的包解包,执行包内的createinstallmedia命令即可。也就是把/Applications/Install\ macOS\ Mojave.app修改为你自己的目录即可,。

1
sudo /Users/lomot/Downloads/Install\ macOS\ Mojave.app/Contents/Resources/createinstallmedia --volume /Volumes/MyVolume

image.png

引用
如何创建可引导的 macOS 安装器
macOS Mojave Patcher Tool for Unsupported Macs

自从Docker用顺手之后,什么东西都可以直接使用Docker快速部署了,Solo blog官方文档的docker说明是这样的:

1
2
3
4
5
6
7
docker run --detach --name solo --volume ~/solo_h2/:/opt/solo/h2/ --publish 8080:8080 \
--env RUNTIME_DB="H2" \
--env JDBC_USERNAME="root" \
--env JDBC_PASSWORD="123456" \
--env JDBC_DRIVER="org.h2.Driver" \
--env JDBC_URL="jdbc:h2:/opt/solo/h2/db;MODE=MYSQL" \
b3log/solo --listen_port=8080 --server_scheme=http --server_host=localhost --server_port=

其中

--listen_port:进程监听端口
--server_scheme:最终访问协议,如果反代服务启用了 HTTPS 这里也需要改为 https
--server_host:最终访问域名或公网 IP,不要带端口
--server_port:最终访问端口,使用浏览器默认的 80 或者 443 的话值留空即可

根据项目文档的说明我改了一下,就是下面这样的

我的docker配置

1
2
3
4
5
6
7
8
9
10
11
docker run --detach --name solo --publish 8008:8080 \
--volume /var/www/solo/h2/:/opt/solo/h2/ \
--volume /var/www/solo/markdowns/:/opt/solo/markdowns/ \
--volume /var/www/solo/plugins/:/opt/solo/plugins/ \
--volume /var/www/solo/skins/:/opt/solo/skins/ \
--env RUNTIME_DB="H2" \
--env JDBC_USERNAME="root" \
--env JDBC_PASSWORD="123456" \
--env JDBC_DRIVER="org.h2.Driver" \
--env JDBC_URL="jdbc:h2:/opt/solo/h2/db;MODE=MYSQL" \
b3log/solo --listen_port=8080 --server_scheme=http --server_host=blog.lomot.top --server_port=80

其中要注意的地方是这个选项--volume /var/www/solo/markdowns/:/opt/solo/markdowns/,把markdown文件放入这个文件夹,重启solo后端就能自动导入从其他地方导出的博客。 从 Hexo / Jekyll / Markdown 导入。还有pluginsskins这两个文件夹是可选的,如果只使用自带的插件和皮肤就不需要映射。

nginx 反代配置

服务器上有多个网站的情况下可以用nginx反向代理

1
2
3
4
5
6
7
8
9
10
server {
listen 80;
server_name blog.lomot.top;
root /var/www/blog.lomot.cn;
include /etc/nginx/default.d/*.conf;
location / {
index index.html;
proxy_pass http://localhost:8008;
}
}

Solo Blog项目地址为 https://github.com/b3log/solo

部分常用指令

生成新密钥:

--full-gen-key```
1
2
编辑模式
```gpg --edit-key lomot

高级编辑模式

--expert --edit-key lomot```
1
2
显示keygrip
```gpg --list-keys --with-keygrip

设置gpg根目录

GNUPGHOME
1
2
3
4

## 导入导出相关命令
导入公钥
```gpg --import /Volumes/LOMOT-KEY/gpg/dist/pub.txt

导入子密钥

--importlink
1
2
导出所有密钥
```gpg -a --export-secret-keys lomot > ~/Downloads/key/keys.key

导出所有子密钥

-a --export-secret-subkeys lomot > ~/Downloads/key/subkeys.key```
1
2
导出公钥
```gpg -a --export lomot > ~/Downloads/key/gpg.pub

删除

删除公钥

--delete-key UID```
1
2
删除密钥
```gpg --delete-secret-key

编辑模式

help :帮助
addkey :添加子密钥
revkey :吊销密钥
delkey :删除子密钥
passwd : 修改保护私钥的密码
clean : 清除过期或无效的
expire : 设置过期
revoke : 回收

参考: https://emacsist.github.io/2019/01/01/gnupg2%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/

1. minecraft-bedrock Dockerfile 🤩3  ⭐️40  🖖4

a bedrock minecraft PE Server on docker (MCPE) 300k pulls🎉!


2. mqtt_wifi_led Lua 🤩1  ⭐️1  🖖0  🏠http://blog.lomot.top/articles/2018/09/02/1560596950934.html

💡remote control the led with nodemcu by mqtt protocol on esp8266. (使用nodemcu控制led灯的项目,带自动重连)


3. bs-lomot JavaScript 🤩1  ⭐️0  🖖0

lomot blog by bootstrap


4. UESTC-NetworkAutoConnect Shell 🤩1  ⭐️0  🖖1

电子科大沙河校区网络自动连接

Valine 诞生于2017年8月7日,是一款基于Leancloud的快速、简洁且高效的无后端评论系统。

这里是valine主页

  1. 申请Leancloud账号,获取appId和appKey

  2. 在ghost主题中添加下面的片段即可

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <head>
    ...
    <script src="//cdn1.lncld.net/static/js/3.0.4/av-min.js"></script>
    <script src='//unpkg.com/valine/dist/Valine.min.js'></script>
    ...
    </head>
    <body>
    ...
    <div id="vcomments"></div>
    <script>
    new Valine({
    el: '#vcomments',
    appId: '<API_ID>',
    appKey: '<API_Key>'
    })
    </script>
    </body>

详细的使用方法可以参照官网 https://valine.js.org/quickstart.html

写了一个docker版的bedrock minecraft PE 服务器

测试支持ubuntu14.04,debain9,centos7及其以上版本,centos6升级内核版本后支持,其实只要docker版本够了任意发行版都支持,下面是我从我的github里面复制过来的服务器搭建文档,可以参考一下

项目长期更新中:文档地址 https://github.com/LomotHo/minecraft-bedrock

如果发现本文中所使用的服务器版本过旧,请访问 https://github.com/LomotHo/minecraft-bedrock/blob/master/readme_zh.md


当前服务器核心版本: 1.12.0.28 镜像版本: lomot/minecraft-bedrock:1.12.0.28-r2, lomot/minecraft-bedrock:1.12.0.28-debian-r2

快速开启服务器

1. 先在服务器上安装docker

1
2
3
4
curl -sSL https://get.daocloud.io/docker | sh
# 此脚本适用于Ubuntu,Debian,Centos等大部分Linux
systemctl start docker
# 安装完成后记得打开docker

2. 创建服务器数据目录

数据目录用于存放地图资料,配置文件,包括permissions.json, server.properties, whitelist.json, worlds, 如果数据目录里面没有旧的数据,后面则会自动创建。 目录可以自定,这里以/opt/mcpe-data为例

1
mkdir -p /opt/mcpe-data

3. 部署服务器

把命令里面的/opt/mcpe-data换成你自己的目录

1
2
3
docker run -itd --restart=always --name=mcpe --net=host \
-v /opt/mcpe-data:/data \
lomot/minecraft-bedrock:1.12.0.28-r2

如果发现目录写错了或者要换目录,可以先执行下面的命令关闭并删除刚刚开启的容器,然后再重新开启服务器

1
2
docker stop mcpe
docker rm mcpe

如果要更换服务器端口,直接把上面命令里面的19132:19132/udp的第一个19132换成你自己的端口就行了,不需要改server.properties里面的端口配置。

如果要更换服务器端口,修改 server.properties 里面的 server-port 并执行 docker restart mcpe 重启服务器即可。

服务器升级

1. 备份一下数据

就是将/opt/mcpe-data这个文件夹备份一下

1
cp -r /opt/mcpe-data /opt/mcpe-data.bak

2. 退出并删除容器

1
2
docker stop mcpe
docker rm mcpe

3. 开启新版的容器

1
2
3
docker run -itd --restart=always --name=mcpe --net=host \
-v /opt/mcpe-data:/data \
lomot/minecraft-bedrock:1.12.0.28-r2

记得把命令里面的/opt/mcpe-data换成你自己的目录

服务器管理

进入、退出游戏控制台

1
docker attach mcpe

ctrl + p + q退出控制台
不要用ctrl+c或者ctrl+d,不然容器会退出。

手动 关闭/开启/重启/删除 服务器

1
docker stop/start/restart/rm mcpe

删除服务器后/opt/mcpe-data里面的数据不会丢失

进阶选项

进入容器

1
docker exec -it mcpe /bin/bash

执行上面的命令可以进入服务器容器,并且开启一个shell,这个时候就可以编辑文件了

在shell中输入exit可以退出

向容器复制文件

此命令可以用于添加行为包,资源包,或者添加插件(如果有的话)

1
docker cp /path/to/xxx mcpe:/mcpe/server
1
2
3
4
5
6
7
8
9
10
11

### 关于行为包,资源包,插件

由于插件涉及到的文件比较多, 我为此做了一个新的镜像, 这个镜像需要你自己管理服务器文件夹, 可以去minecraft官网下载服务端文件: [Minecraft服务端下载]

用法:

```bash
docker run -itd --restart=always --name=mcpe --net=host \
-v /opt/mcpe-data:/mcpe \
lomot/minecraft-bedrock:base

注意: 服务端数据文件夹/opt/mcpe-data需要包括完整的服务器文件才能运行, 第一次配置建议从官方网站下载并解压

关于网络性能和端口配置

由于桥接模式会损失一定的性能,因此本文档的案例默认使用host网络连接模式 --net=host,当然也可以使用桥接模式,把--net=host替换为-p 12345:19132/udp即可

1
2
3
docker run -itd --restart=always --name=mcpe -p 12345:19132/udp \
-v /opt/mcpe-data:/data \
lomot/minecraft-bedrock:1.12.0.28-r2

使用桥接模式时如果要更换服务器端口,直接把上面命令里面的 12345:19132/udp 的第一个端口号12345换成自己的端口就行了,server.properties里面的端口配置需要为19132

安全地退出容器

直接使用docker stop mcpe相当于强行退出游戏服务器,有可能损坏数据(但由于mc的数据是区块储存的,一般不会出现这个问题)。

进入游戏控制台:docker attach mcpe,然后执行stop可以安全地退出容器。

如何查看报错日志

执行docker logs mcpe,可以查看容器的日志,如果服务器开启失败可以用这个命令查看报错日志。

删除无用的镜像

输入 docker image ls查看镜像列表如下

1
2
3
4
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
lomot/minecraft-bedrock base 4c0a6be845fd 2 weeks ago 97.4MB
lomot/minecraft-bedrock 1.11.4.2-debian-r1 8cd07241f9b3 2 weeks ago 191MB
lomot/minecraft-bedrock 1.10.0.7-r2 05c48844d328 4 weeks ago 216MB

例如要删除旧的镜像lomot/minecraft-bedrock:1.10.0.7-r2,执行docker image rm lomot/minecraft-bedrock:1.10.0.7-r2 即可

主机重启自动启动minecraft服务

将docker设为开机自启即可:

1
systemctl enable docker

部分报错/问题处理

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

这个是docker服务没打开,执行systemctl start docker即可

1
2
# 使开启docker开机自启
systemctl enable docker

日志时间不正确 时区错误

日志时间错误一般是容器内时区错误,在命令中加上-v /etc/localtime:/etc/localtime即可,具体如下

1
2
3
4
docker run -itd --restart=always --name=mcpe --net=host \
-v /opt/mcpe-data:/data \
-v /etc/localtime:/etc/localtime \
lomot/minecraft-bedrock:1.12.0.28-r2

问题反馈QQ群

667224193

服务器二进制文件

https://minecraft.net/en-us/download/server/bedrock/

Docker 地址

https://hub.docker.com/r/lomot/minecraft-bedrock

github 项目地址

https://github.com/LomotHo/minecraft-bedrock

http2.png

本来以为会很麻烦,但是后来却发现意外地很简单,直接把

1
2
3
server {
listen 443 ssl;
}

改成

1
2
3
server {
listen 443 ssl http2;
}

就行了,但是前提是你的nginx和openssl版本足够高来支持,

查看nginx版本

1
2
nginx -v
nginx version: nginx/1.12.2

查看openssl版本

1
2
openssl version
OpenSSL 1.0.2k-fips 26 Jan 2017

如果版本不够高就需要手动编译安装或者升级服务器系统,这里不做赘述,(其实我也没有这样干,因为我的版本都是够的),发一个别人的教程

https://zhuanlan.zhihu.com/p/29609078


本项目基于nodemcu项目,做了一个能够使用手机远程控制并调节亮度的led灯

代码在这里:项目主页,求star

特性

使用mqtt协议,支持wifi,mqtt断线重连,使用pwm控制led亮度

使用方法

  1. 设置src/config.lua中的参数:

wifiLedPin –输出针脚
config.wifi.ssid –wifi的ssid
config.wifi.pwd –wifi密码
config.mqtt.* –mqtt相关设置项,需要有mqtt服务器,如果没有可以暂时使用我的 iot.lomot.cn:1883(不保证稳定性),或者去使用其他公共平台。(注意:其中clientId需要保持唯一)

  1. 将src文件夹中的文件全部写入

之后可以通过mqtt控制
如以下命令将灯亮度调节到10, 最亮为100

1
mosquitto_pub -h mqttserver.com -t /dorm/wifiLed -m "10"

支持芯片

esp8266 esp8285

固件

firmware文件夹中有可用固件
支持dht, file, gpio, http, mqtt, net, node, pwm, sjson, tmr, uart, wifi 模块

相关问题

  • 如何刷写固件

使用工具nodemcu-pyflasher

  • 关于mqtt服务器搭建以及mqtt协议的知识

这里有篇文章介绍的比较好

  • 手机控制

可以使用手机的mqtt客户端来控制,比如 MQTT dash

后续计划

支持homekit

编译

(编译可以在另一台ubuntu18.04上进行)
安装编译环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sudo apt install -y \
build-essential \
libevent-dev \
libssl-dev \
libgcrypt-dev \
libkrb5-dev \
libpam0g-dev \
libwrap0-dev \
libdb-dev \
libtdb-dev \
avahi-daemon \
libavahi-client-dev \
libacl1-dev \
libldap2-dev \
libcrack2-dev \
libdbus-1-dev \
libdbus-glib-1-dev \
libglib2.0-dev

安装checkinstall,

1
sudo apt install --yes checkinstall

如果checkinstall安装失败就去下载deb包安装
checkinstall for ubuntu18.04

1
sudo dpkg -i checkinstall_1.6.2-4ubuntu2_amd64.deb

设置变量

1
2
NETATALK_VERSION='3.1.11'
MAINTAINER='YOUR NAME \<yourname@email.com\>'

下载源码

1
2
3
wget http://prdownloads.sourceforge.net/netatalk/netatalk-${NETATALK_VERSION}.tar.gz -P /tmp
tar -xzf /tmp/netatalk-${NETATALK_VERSION}.tar.gz -C /tmp
cd /tmp/netatalk-${NETATALK_VERSION}

编译

1
2
3
4
5
6
7
8
./configure \
--with-init-style=debian-systemd \
--without-libevent \
--with-cracklib \
--enable-krbV-uam \
--with-pam-confdir=/etc/pam.d \
--with-dbus-daemon=/usr/bin/dbus-daemon \
--with-dbus-sysconf-dir=/etc/dbus-1/system.d
1
make
1
2
3
4
5
sudo checkinstall -D \
--pkgname='netatalk' \
--pkgversion="${NETATALK_VERSION}" \
--maintainer="${MAINTAINER}" \
make install

编译完成后会生成netatalk的deb包

安装

安装依赖

1
2
3
4
5
6
7
8
9
10
11
sudo apt install -y \
avahi-daemon \
cracklib-runtime \
db-util \
db5.3-util \
libtdb1 \
libavahi-client3 \
libcrack2 \
libcups2 \
libpam-cracklib \
libdbus-glib-1-2

安装编译好的包

1
2
sudo dpkg -i netatalk_3.1.11-1_amd64.deb
sudo ldconfig

编辑配置文件 /usr/local/etc/afp.conf,(我一开始以为是/etc/afp.conf,后来发现一直运行不起来)

1
2
3
4
5
6
7
8
9
10
[Global]
mimic model = TimeCapsule6,106
log level = default:warn
log file = /var/log/afpd.log
spotlight = no
[TimeMachine]
path = /data/timemachine(timemachine储存路径)
valid users = username(用户名)
time machine = yes
vol size limit = 2000000

打开netatalk服务并设置开机自启动

1
2
3
4

sudo systemctl daemon-reload
sudo systemctl enable netatalk
sudo systemctl start netatalk

到此已经安装完成


查看服务状态

1
2
3
4
5
systemctl status avahi-daemon
systemctl status netatalk

/usr/local/sbin/netatalk -V
/usr/local/sbin/afpd -V

脚本部分引用
davecoutts的gist