树莓派4B 基于 ubuntu24 移植 Ruoyi

树莓派换源 & 安装配置docker (ubuntu24)

  1. 从树莓派官网下载工具"树莓派镜像烧录器"

  2. 从ubuntu官网下载Ubuntu 24.04.2 LTS: https://ubuntu.com/download/raspberry-pi

    硬件要求:最少4GB ram 和 16GB 磁盘

    下载完整后,得到:ubuntu-24.04.2-preinstalled-desktop-arm64+raspi.img.xz

    需要解压成:ubuntu-24.04.2-preinstalled-desktop-arm64+raspi.img

  3. 使用树莓派镜像烧录器烧录镜像

    CHOOSE DEVICE - 选择树莓派4 (根据实际型号来)

    操作系统 -> Use custom -> ubuntu-24.04.2-preinstalled-desktop-arm64+raspi.img

    选择SD卡 -> 实际的sd卡

    点击 NEXT

    然后可以编辑设置,实现预配置(用户名,wifi, 国家, 键盘, 时区, 开启ssh服务等)(这一步好像没啥用,启动系统后还要再设一遍)

    格式化并写入sd卡

  4. 将 SD 卡插入到树莓派,启动系统,配置语言、时区、用户、密码、时区等,安装系统

  5. ubuntu24 系统比较吃资源,后续可以选择更低版本的系统,跑个火狐浏览器就可以把cpu全占满。并且系统太大了,内存释放也比较慢。这样看来,还是debian比较好。

  6. 打开火狐浏览器,下载vnc server https://www.realvnc.com/en/connect/download/?lai_vid=gxl0mpADGIy9x&lai_sr=5-9&lai_sl=l 下载版本选择树莓派版本+arm64,下载完毕后,安装即可。安装完毕,如果要求登录,选择跳过,即可实现登录

  7. 安装基础的工具

    sudo apt update
    # 网络工具
    sudo apt install net-tools
    # ssh
    sudo apt install openssl-server
    # iftop
    sudo apt install iftop
    # vim
    sudo apt install vim
    # 自动补全(比较大,341MB,选择安装)
    sudo apt install auto-complete-el
    # 安装完毕后编辑 /etc/bash.bashrc
    # 将这一段解开注释
    # sudo hint
    if [ ! -e "$HOME/.sudo_as_admin_successful" ] && [ ! -e "$HOME/.hushlogin" ] ; then
        case " $(groups) " in *\ admin\ *|*\ sudo\ *)
        if [ -x /usr/bin/sudo ]; then
            cat <<-EOF
            To run a command as administrator (user "root"), use "sudo <command>".
            See "man sudo_root" for details.
    
            EOF
        fi
        esac
    fi
    
    
    sudo apt install python3-pip
    # 配置python3 pip 源 (跳过此步骤,ubuntu24 安装python依赖库改成了 sudo apt install python3-库名 的形式)
    # sudo su
    # cd ~
    # mkdir .pip
    # cd .pip
    # touch pip.conf
    # pip.conf 内容如下
    # [global]
    # index-url = https://pypi.tuna.tsinghua.edu.cn/simple
    # [install]
    # trusted-host=pypi.tuna.tsinghua.edu.cn
    
  8. apt 换源(这里的做法还是不太理想)

    cd /etc/apt/sources.list.d
    sudo touch mysource.sources
    sudo vim mysource.sources
    # 内容如下
    # 清华源
    Types: deb
    URIs: http://mirrors.tuna.tsinghua.edu.cn/ubuntu/
    Suites: noble noble-updates noble-security
    Components: main restricted universe multiverse
    Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
    
    # 阿里源
    Types: deb
    URIs: http://mirrors.aliyun.com/ubuntu/
    Suites: noble noble-updates noble-security
    Components: main restricted universe multiverse
    Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
    
  9. 安装配置docker

    sudo apt install docker.io
    # 查看 docker 版本
    docker -v
    # Docker version 27.5.1, build 27.5.1-0ubuntu3~24.04.2
    apt install docker-compose
    docker-compose version
    # docker-py version: 5.0.3
    # CPython version: 3.12.3
    # OpenSSL version: OpenSSL 3.0.13 30 Jan 2024
    
    # 更换Docker镜像源
    # 切换为 root 用户,否则会报错无权限
    sudo -i
    cat > /etc/docker/daemon.json <<EOF
    {
        "log-driver": "json-file",
        "log-opts": {
            "max-size": "20m",
            "max-file": "3"
        },
        "ipv6": true,
        "fixed-cidr-v6": "fd00:dead:beef:c0::/80",
        "experimental":true,
        "ip6tables":true,
        "registry-mirrors": [
          "https://registry.hub.docker.com",
          "http://hub-mirror.c.163.com",
          "https://mirror.baidubce.com",
          "https://docker.mirrors.sjtug.sjtu.edu.cn",
          "https://docker.nju.edu.cn",
          "https://docker.m.daocloud.io",
          "https://dockerhub.icu",
          "https://docker.anyhub.us.kg",
          "https://docker.1panel.live"
        ]
    }
    EOF
    
    # 重启一下daemon和docker服务
    sudo systemctl daemon-reload  #重启daemon进程
    sudo systemctl restart docker.service  #重启docker
    
    # 查看docker配置信息
    docker info
    
    # 尝试拉取镜像
    docker pull nginx:latest
    # docker pull docker.1panel.live/docker.io/openresty/openresty
    docker pull redis:latest
    # docker pull mysql:latest # 9.0 版本,太新了
    docker pull docker.xuanyuan.me/library/mysql:8.0
    
    # 开始准备用 node 编译下vue,后来发现vue不需要交叉编译,直接在windows上编译好了放到nginx就可以
    # docker pull node:latest # 24
    # docker pull node:16
    

    Java环境


# 方式一,直接安装
sudo apt install openjdk-8-jdk

# 方式二,使用java安装包自行安装 (arm64的java8安装包)
sudo mkdir -p /usr/local/java
sudo tar -zxvf jdk-8u281-linux-aarch64-serial.tar.gz -C /usr/local/java
# 编辑 /etc/profile, 添加如下配置
export JAVA_HOME=/usr/local/java/jdk1.8.0_281
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# 验证
source /etc/profile
java -version
# java version "1.8.0_281"
# Java(TM) SE Runtime Environment (build 1.8.0_281-b09)
# Java HotSpot(TM) 64-Bit Server VM (build 25.281-b09, mixed mode)

# 注意:如果想要用root执行java,需要用指令 su -i 切换root,不可以用 sudo su (只会切换用户,但不加载该用户的登录环境/etc/profile) (这里后续可以改进一下)

基础环境部署


mysql8.0 容器
# 创建目录
#/opt/mysql/8.0/
cd /opt
mkdir mysql
cd mysql
mkdir 8.0
cd 8.0
mkdir conf data log

# 配置my.conf
cd conf
touch my.conf

my.conf内容如下

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# Custom config should go here
!includedir /etc/mysql/conf.d/

default_authentication_plugin= mysql_native_password

创建 docker-compose.yml

cd /opt/mysql/8.0
touch docker-compose.yml

docker-compose.yml 内容如下

version: '3.8'  # 可以根据需要调整版本

services:
  mysql:
    container_name: mysql8
    image: docker.xuanyuan.me/library/mysql:8.0
    restart: always  # 可以选择使用 always 或 unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: root
    ports:
      - "3306:3306"
    volumes:
      - /opt/mysql/8.0/data:/var/lib/mysql:rw
      - /opt/mysql/8.0/log:/var/log/mysql:rw
      - /opt/mysql/8.0/conf/my.cnf:/etc/mysql/my.cnf:rw
      - /etc/localtime:/etc/localtime:ro

配置mysql

# 后台启动mysql8容器(调试的话可以去掉-d,另外,停止并删除容器使用 down)
docker-compose up -d
# 进入mysql8
docker exec -it mysql8 bash
# 访问mysql服务(默认密码:root)
mysql -uroot -p
# 配置允许远程访问(下面的密码填充自己的密码,比如 123456)
alter user 'root'@'%' identified with mysql_native_password by '密码';
FLUSH PRIVILEGES;
exit

# 退出容器
exit

此时,可以用外部工具访问mysql了

redis 容器

mkdir -p /opt/redis
cd /opt/redis
mkdir /data
touch docker-compose.yml

docker-compose.yml (这里没有 network_mode: "host" 会有报错:# WARNING Memory overcommit must be enabled!)

version: '3.8'  # 可以根据需要调整版本
services:
  redis:
    container_name: redis_container
    image: redis:latest
    restart: always  # 可以选择使用 always 或 unless-stopped
    network_mode: "host"  # 使用主机网络
    volumes:
      - /opt/redis/data:/data
      - /etc/localtime:/etc/localtime:ro

编译部署RuoYi


这里选择的是前后端分离版本,官网页面如下:

http://doc.ruoyi.vip/ruoyi-vue/document/hjbs.html#准备工作

环境推荐配置

JDK >= 1.8 (推荐1.8版本)
Mysql >= 5.7.0 (推荐5.7版本)
Redis >= 3.0
Maven >= 3.0
Node >= 12
  1. 拉取项目

    git clone https://gitee.com/y_project/RuoYi-Vue.git
    
  2. 使用idea打开项目(建议用新版本的idea,我用的2023.1, 之前用2021打开会有点问题, 当然,如果习惯eclipse的话, 官网推荐用eclipse打开)

    必要配置

    • 修改数据库连接,编辑resources目录下的application-druid.yml
    # 数据源配置
    spring:
        datasource:
            type: com.alibaba.druid.pool.DruidDataSource
            driverClassName: com.mysql.cj.jdbc.Driver
            druid:
                # 主库数据源
                master:
                    url: 数据库地址
                    username: 数据库账号
                    password: 数据库密码
    
    • 修改服务器配置,编辑resources目录下的application.yml
    # 开发环境配置
    server:
      # 服务器的HTTP端口,默认为80
      port: 端口
      servlet:
        # 应用的访问路径
        context-path: /应用路径
    

    修改 ruoyi-admin的配置文件中的数据库用户名和密码,修改文件路径:/home/ruoyi/uploadPath

    打包,打包后会在 RuoYi-Vue\ruoyi-admin\target 生成 ruoyi-admin.jar,这就是主程序包

树莓派环境,后端部署
  ```bash
  su -i
  mkdir -p /home/ruoyi
  cd /home/ruoyi
  mkdir uploadPath
  
  # 将 ruoyi-admin.jar 上传到 /home/ruoyi 目录(当然,这里自定义)
  touch ry.sh
  ```

官方给的启动脚本ry.sh有点问题(主要是windows异常行结束符 & 修改执行的sh为 bash)

我改了一下:ry.sh,主要是开头的 #!/bin/sh 改成了 #!/bin/bash

此外,如果报错:-bash: ./ry.sh: 无法执行:找不到需要的文件,大概率就是脚本在windows编辑过,需要在树莓派linux中使用vim打开,然后输入:set ff=unix ,之后保存退出再试就可以了。

#!/bin/bash
# ./ry.sh start 启动 stop 停止 restart 重启 status 状态
AppName=ruoyi-admin.jar

# JVM参数
JVM_OPTS="-Dname=$AppName  -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps  -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC"
APP_HOME=`pwd`
LOG_PATH=$APP_HOME/logs/$AppName.log

if [ "$1" = "" ];
then
    echo -e "\033[0;31m 未输入操作名 \033[0m  \033[0;34m {start|stop|restart|status} \033[0m"
    exit 1
fi

if [ "$AppName" = "" ];
then
    echo -e "\033[0;31m 未输入应用名 \033[0m"
    exit 1
fi

function start()
{
    PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'`

        if [ x"$PID" != x"" ]; then
            echo "$AppName is running..."
        else
                nohup java $JVM_OPTS -jar $AppName > /dev/null 2>&1 &
                echo "Start $AppName success..."
        fi
}

function stop()
{
    echo "Stop $AppName"

        PID=""
        query(){
                PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'`
        }

        query
        if [ x"$PID" != x"" ]; then
                kill -TERM $PID
                echo "$AppName (pid:$PID) exiting..."
                while [ x"$PID" != x"" ]
                do
                        sleep 1
                        query
                done
                echo "$AppName exited."
        else
                echo "$AppName already stopped."
        fi
}

function restart()
{
    stop
    sleep 2
    start
}

function status()
{
    PID=`ps -ef |grep java|grep $AppName|grep -v grep|wc -l`
    if [ $PID != 0 ];then
        echo "$AppName is running..."
    else
        echo "$AppName is not running..."
    fi
}

case $1 in
    start)
    start;;
    stop)
    stop;;
    restart)
    restart;;
    status)
    status;;
    *)

esac
# 启动后端程序
./ry.sh start
前端编译

前端是静态资源库,不需要考虑交叉编译的事情,所以目前方案就是windows打包,然后树莓派nginx部署

进入项目的RuoYi-Vue\ruoyi-ui目录

开发

# 克隆项目(此步骤省略,上面已经下载了)
# git clone https://gitee.com/y_project/RuoYi-Vue

# 进入项目目录
cd ruoyi-ui

# 安装依赖
npm install

# 建议不要直接使用 cnpm 安装依赖,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题
npm install --registry=https://registry.npmmirror.com

# 启动服务
npm run dev

# 浏览器访问 http://localhost:80

发布

# 构建测试环境
npm run build:stage

# 构建生产环境
npm run build:prod

# 生成目录
ruoyi-ui\dist

树莓派部署

# 这里可以直接在树莓派宿主机安装nginx, 现在使用容器nginx方案,也可以改成openresty容器的。

# 将构建完成的 dist 文件夹放到此目录下
mkdir -p /opt/nginx/html
mkdir -p /opt/nginx/conf
mkdir -p /opt/nginx/logs

touch /opt/nginx/conf/ruoyi.conf

ruoyi.conf

server {
    listen       80;
    server_name  localhost;
    charset utf-8;

    location / {
        root   /usr/share/nginx/html/dist;
        try_files $uri $uri/ /index.html;
        index  index.html index.htm;
    }

    location /prod-api/ {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://localhost:8080/;
    }

    # springdoc proxy
    location ~ ^/v3/api-docs/(.*) {
        proxy_pass http://localhost:8080/v3/api-docs/$1;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
 }

docker-compose.yml

version: '3.8'

services:
  nginx:
    image: nginx:latest
    container_name: nginx
    network_mode: "host"  # 使用主机网络
    volumes:
      - /opt/nginx/conf:/etc/nginx/conf.d  # 映射配置文件
      - /opt/nginx/logs:/var/log/nginx  # 映射日志文件
      - /opt/nginx/html:/usr/share/nginx/html  # 映射静态文件
      - /etc/localtime:/etc/localtime:ro
      - /home/ruoyi/uploadPath/:/home/ruoyi/uploadPath/ #ruoyi
    restart: always  # 设置容器自动重启
cd /opt/nginx/
docker-compose up -d

浏览器访问http://树莓派ip,即可访问若依界面。


后续实际运行发现,页面运行一段时间,就跳出来登不进去了,登录一直报错。在windows本地运行没问题,估计还是环境有点问题。仅当做一次探索和记录吧,后续会想办法优化。

参考文档


[1]. 无法拉取 Docker 镜像?树莓派4B 安装Docker并配置Docker镜像源分享

[2]. docker设置国内镜像源

[3]. 树莓派4B学习笔记四--基于Docker搭建Nginx,在Nginx服务器上部署Vue项目

[4]. 第四章:ubuntu 24.04配置清华源

[5]. Ubuntu24.04换源方法(新版源更换方式)

posted @ 2025-06-06 05:58  BrianSun  阅读(230)  评论(0)    收藏  举报