2026年8月

前几天io实验室的老师找我说让我研究一下这个设备,然后想要把之前张烟的系统部署到上面。
今天拿到设备了。
这边附图:
1

2

3

背面很整洁,没有usb口。借了一个拓展坞,然后升级完系统之后装了一个todesk就可以远程工作了。其实还有更有b格的连接方式,但是因为我不稳定使用,只是部署个系统,所以就用了最习惯的方式。
内置的系统是定制的ubuntu。arm64架构
因为这次可以联网,所以一些中间件打算直接上docker

第一步先是装docker

本来想安装v2rayN,然后科学上网之后再安装,但是实际操作之后,发现节点无法使用。
本来是直接安装的deb包,但是 hysteria 节点用不了,vless 跑不通。现在打算下zip版试一下。要是不行就用阿里云的源。

用zip版可以。

最后因为是桌面ubuntu,懒得折腾 就装了docker-desktop
好吧,犯不了懒,这个gui界面实际上还是得装docker依赖才能运行,不是独立的另外一套。
好像下载的只有amd64的版本,没有arm64的版本
原来是有的。但是官网找不到。直接改了下 amd64的下载链接,从他们仓库直接下载了

https://desktop.docker.com/linux/main/arm64/235549/docker-desktop-arm64.deb

第二步把源码找出来,一共是三个部分,一个统一的后端,一个react前端和一个unity后端。
后端是go,需要先安装下go。主要就是把go安装放到bin目录

sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.x.linux-arm64.tar.gz
echo 'export PATH="/usr/local/go/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
go version

前端react前端需要装一下nodejs
这个直接看官网,有很详细的bash脚本

需要的中间件就是 mysql,redis,etcd,ngnix
mysql和ngnix需要配置data路径
redis和etcd啥都不用配,暴露端口就行

### MySQL

docker run -d \
    --name mysql \
    -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=your_password \
    -v /data/mysql:/var/lib/mysql \
    --restart unless-stopped \
    mysql:8.0

- -p 3306:3306:映射 MySQL 端口
- MYSQL_ROOT_PASSWORD:root 用户密码
- -v /data/mysql:/var/lib/mysql:配置 MySQL 数据目录
- --restart unless-stopped:Docker 重启后自动启动

### Redis

docker run -d \
    --name redis \
    -p 6379:6379 \
    --restart unless-stopped \
    redis:7

- -p 6379:6379:映射 Redis 端口

### Etcd

docker run -d \
    --name etcd \
    -p 2379:2379 \
    -p 2380:2380 \
    quay.io/coreos/etcd:v3.5.15 \
    /usr/local/bin/etcd \
    --name=etcd0 \
    --listen-client-urls=http://0.0.0.0:2379 \
    --advertise-client-urls=http://127.0.0.1:2379 \
    --listen-peer-urls=http://0.0.0.0:2380 \
    --initial-advertise-peer-urls=http://127.0.0.1:2380 \
    --initial-cluster=etcd0=http://127.0.0.1:2380

- 2379:Etcd 客户端访问端口
- 2380:Etcd 节点通信端口
- 不配置数据目录,数据随容器生命周期保存

### Nginx

docker run -d \
    --name nginx \
    -p 7654:80 \
    -v /opt/zyproject/data/nginx:/usr/share/nginx/html:ro \
    --restart unless-stopped \
    nginx:1.27

- -p 80:80:映射 Web 服务端口
- -v /data/nginx:/usr/share/nginx/html:ro:配置 Nginx 网站数据目录
- :ro:容器只读挂载;需要容器写入时可以去掉 :ro

在尝试运行react前端的时候遇到了权限问题。npm dev
sh: 1: next: Permission denied

前面加sudo就识别不出指令
sudo: npm:找不到命令

docker那边是网络连不上
Unable to find image 'hello-world:latest' locally
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded

Run 'docker run --help' for more information

直接跑也是没有权限
permission denied while trying to connect to the docker API at unix:///var/run/docker.sock

不加代理就是
Unable to find image 'hello-world:latest' locally
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp 108.160.170.44:443: connect: connection refused

Run 'docker run --help' for more information

然后在docker desktop里面就是显示docker engine stoped难绷

感觉没有很简单,唉。

docker desktop先不管。
正常run 镜像出现的问题,我v2rayN开了tun模式之后解决了。

最后发现还是太慢了。于是配置了Docker 镜像源

编辑:

sudo vim /etc/docker/daemon.json

写入:

{
  "registry-mirrors": [
    "https://docker.1ms.run"
  ]
}
这是毫秒镜像

然后重启 Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker
sudo docker run hello-world

https://github.com/dongyubin/DockerHub
这个github仓库记录了还能用的docker镜像

对于mysql需要导入数据
可以启动docker的加一个数据的挂载
如果备份文件是 .sql,可以挂载到容器的 /backup 目录。

docker run -d \
    --name mysql \
    -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=admin123 \
    -v /opt/zyproject/data/mysql:/var/lib/mysql \
    -v /opt/zyproject/data/mysql-backup:/backup:ro \
    --restart unless-stopped \
    mysql:8.0

备份文件就放到mysql-backup文件夹里面,backup是容器内备份目录

或者是导入已有 MySQL 容器

docker exec -it mysql sh -c \
  'mysql -uroot -p"$MYSQL_ROOT_PASSWORD" your_database < /backup/backup.sql'

也可以直接 docker 进入bash界面然后:

mysql -u root -p your_database < /backup/backup.sql

如果备份文件中已经包含 CREATE DATABASE 和 USE,可以直接执行:

docker exec -it mysql sh -c \
  'mysql -uroot -p"$MYSQL_ROOT_PASSWORD" < /backup/backup.sql'
只有全新初始化、/var/lib/mysql 为空时,挂载到 /docker-entrypoint-initdb.d 的 SQL 文件才会自动执行;已有数据库需要手动导入。

对于 unity 的前端来说应该还需要改一下前端js里面拉取数据的地址,有点麻烦,明天看吧。
今天先把后端搭建起来,然后把react前端搭建起来

react前端的问题是next没有执行权限。因为前端其实是nextjs搭建的。
然后node_modules是直接外面复制过来的,所以会有权限问题

用的deepseek网页版好快的回复

给 node_modules/.bin/next 添加执行权限:

chmod +x node_modules/.bin/next

然后重新运行:

npm run dev

go mod tidy 也很慢,最后改了下镜像

go env -w GOPROXY=https://goproxy.cn,direct

好感慨。又是一年暑假。做的事情都是去年的延伸,但是今年的心气却是没有了,也没有了想要熬夜完成项目的想法,更多的是比较摆烂。实习也没找到hhh。
更多的还是感慨时间过的好快。好怀念去年。

go 后端运行发现

admin@cube-f89a:/opt/zyproject/zhangjiakou-tobacco-factory$ go run main.go
# github.com/bytedance/sonic/internal/rt
/home/admin/go/pkg/mod/github.com/bytedance/[email protected]/internal/rt/stubs.go:33:22: undefined: GoMapIterator
/home/admin/go/pkg/mod/github.com/bytedance/[email protected]/internal/rt/stubs.go:36:54: undefined: GoMapIterator

项目的是1.23 服务器上的是1.26
查了一下是项目的go版本和服务器上的不兼容。
具体是因为 github.com/bytedance/sonic v1.13.3 和服务器上的 Go 版本不兼容导致的编译错误。

在项目本地依赖里面,sonic/internal/rt 里定义 GoMapIterator 的文件有这些 build tag:

map_legacy.go !go1.24
map_nosiwss_go124.go go1.24 && !go1.25
map_siwss_go124.go go1.24 && !go1.25

也就是说 sonic v1.13.3 只覆盖到 Go 1.24,如果 Go版本在 1.25 或更新版本,这些文件都会被排除,结果 stubs.go 里还在引用 GoMapIterator,于是报:

undefined: GoMapIterator

最后使用

GOTOOLCHAIN=go1.23.6 go run main.go

用1.23.6的环境来运行

之后出现了

panic: open log/nms/nms.log_2026-08-06 11-10-04: permission denied

goroutine 1 [running]:
vis/pkg/logger.SetLogger({0x4000787f70?, 0x5?})
    /opt/zyproject/zhangjiakou-tobacco-factory/pkg/logger/logger.go:99 +0xfa8
main.main()
    /opt/zyproject/zhangjiakou-tobacco-factory/main.go:21 +0xc0
exit status 2

这个是因为程序没有权限在 log/nms/ 目录下创建日志文件。要给文件夹及其所有子文件夹和文件设置权限.

给文件夹及所有子内容添加写权限

sudo chmod -R 755 /opt/zyproject/zhangjiakou-tobacco-factory/log/

对于微服务也是

GOTOOLCHAIN=go1.23.6 go run ./microservices/visible/visible.go
GOTOOLCHAIN=go1.23.6 go run ./microservices/forecast/forecast.go

跑完报错 没有找到 vis (数据库名)
应该是原来的数据库备份sql文件里没有创建数据库这一步,难绷

docker进入一下bash

docker exec -it <容器名或ID> /bin/bash

进一下mysql命令行

mysql -u root -p

创建一下数据库

CREATE DATABASE vis CHARACTER SET utf8mb4;

下面就开始部署unity前端。其实就是把静态文件放到nginx的目录里面

# 将 source_folder 内的所有内容复制到目标目录
cp -r /path/to/source_folder/* /opt/zyproject/data/nginx/

# 如果需要包含隐藏文件(以 . 开头的文件)
cp -r /path/to/source_folder/. /opt/zyproject/data/nginx/

unity 的前端可以部署,部署完之后也有内容,数据应该是之前的缓存。
做的还挺顺利就打算把unity的一块搞了

感觉现在agent出来之后确实不一样。像是之前要是配置什么忘记了还得找下路径,现在直接让agent找了。唉

试运行部署成功

最后就是安装tmux然后常驻后台就行
tmux有一个问题,就是无法重启之后自动恢复。
有一个tpm插件可以保存快照,下次系统重启了,再启动一次tmux就可以了
但是我想要的效果是重启之后可以自动的恢复。tmux还需要手动做一步

后面还是用pm2来管理。主要是它是支持的重启之后自动恢复,另外一方面就是对于nextjs来说要是想要用system来做,大概只能打包之后放nginx?但是这个项目应该算是后端架构,我不知道怎么搞。最好还是直接pm2来启npm run dev。包括go也是不是很想打包,最后直接用pm2来管理最方便了。

安装pm2的时候根据脚本的指引有一个注销的操作。我点注销之后,应该是把todesk的进程杀掉了。难绷。现在实验室貌似没有人,没有办法帮我开机。我是远程todesk操作来着。现在只能等明天去弄了。

心里有点慌张,主要是怕会坏掉。采购价应该挺贵的。
最后还是去实验室了一下。
明天再把这些命令挂到pm2上面应该就可以完工了。

安装pm2

npm install pm2 -g

之后就是用pm2启动命令,然后保存列表

# 1. 启动应用
pm2 start "go run main.go" --name "my-go-app" --interpreter none
# 2. 保存当前进程列表
pm2 save
# 3. 设置开机自启
pm2 startup

--interpreter none 告诉 PM2 不要用 Node.js 来解释,直接执行原始命令
--name "my-go-app" 给进程起个名字,方便管理

ok完工。感觉是把半天的工作量分了三天来做,hhh。