原创

树莓派5上部署博客系统

温馨提示:
本文最后更新于 2024年11月20日,已超过 150 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

上一个教程已经说了树莓派怎么安装操作系统,现在说一下怎么部署开源博客系统OneBlog。OneBlog 一个简洁美观、功能强大并且自适应的Java博客。使用springboot开发,前端使用Bootstrap。支持移动端自适应,配有完备的前台和后台管理功能。部署到服务器设计到的环境有JDK、MySQL、Redis、Nginx,下面我们开始部署,这里我构建了一个一键部署脚本。

1.部署

1.1.JDK

#!/bin/bash
echo "开始安装JDK"

cp /opt/dblog/jdk/jdk-8u361-linux-aarch64.tar.gz /opt  && echo "复制完成"
cd /opt && echo "进入到目录成功 /opt"
echo "解压中" && tar -zxvf jdk-8u361-linux-aarch64.tar.gz && echo "解压完成"
mv jdk1.8.0_361 jdk && echo "改名完成"
rm -rf jdk-8u361-linux-aarch64.tar.gz && echo "删除安装包成功"

echo "配置环境变量"
ln -sv /opt/jdk/bin/java /usr/sbin/java

echo "JDK安装完成"

1.2.MySQL

#!/bin/bash

echo "开始安装MySQL"
cp /opt/dblog/mysql/mysql-8.0.32-linux-glibc2.17-aarch64.tar.gz /opt
cd /opt

echo "解压MySQL"
tar -zxvf mysql-8.0.32-linux-glibc2.17-aarch64.tar.gz
rm -rf mysql-8.0.32-linux-glibc2.17-aarch64.tar.gz
mv mysql-8.0.32-linux-glibc2.17-aarch64 mysql

echo "安装MySQL依赖"
if [ ! -f /usr/lib/aarch64-linux-gnu/libaio.so.1 ]; then
    echo "install libaio.so.1"
	dpkg -i /opt/dblog/mysql/libaio1t64_0.3.113-6build1_arm64.deb
	ln -s /usr/lib/aarch64-linux-gnu/libaio.so.1t64 /usr/lib/aarch64-linux-gnu/libaio.so.1
fi
if [ ! -f /usr/lib/aarch64-linux-gnu/libncurses.so.5 ]; then
    echo "install libncurses.so.5"
	ln -s /usr/lib/aarch64-linux-gnu/libncurses.so.6 /usr/lib/aarch64-linux-gnu/libncurses.so.5
fi
if [ ! -f /usr/lib/aarch64-linux-gnu/libtinfo.so.5 ]; then
    echo "install b/aarch64-linux-gnu/libtinfo.slibtinfo.so.5"
	dpkg -i /opt/dblog/mysql/libtinfo6_6.4+20240113-1ubuntu2_arm64.deb
	ln -s /usr/lib/aarch64-linux-gnu/libtinfo.so.6 /usr/lib/aarch64-linux-gnu/libtinfo.so.5
fi

echo "创建mysql用户"
# 创建一个用户组:mysql
groupadd mysql
# 创建一个系统用户:mysql,指定用户组为mysql
useradd -r -g mysql mysql
# 创建数据目录
mkdir -p /opt/mysql/data
chmod -R 750 /opt/mysql/data
# 赋予数据目录权限
chown -R mysql:mysql /opt/mysql/data
# 复制配置文件
cp /opt/dblog/mysql/my.cnf /etc/

echo "开始初始化MySQL"
cd /opt/mysql/bin
# 初始化MySQL
./mysqld --defaults-file=/etc/my.cnf --basedir=/opt/mysql/ --datadir=/opt/mysql/data --user=mysql --initialize-insecure

echo "启动MySQL"
sed -i 's/usr\/local\/mysql/opt\/mysql/g' /opt/mysql/support-files/mysql.server
cp /opt/dblog/mysql/mysql.service /usr/lib/systemd/system/
systemctl daemon-reload
chmod -R 777 /opt/mysql/data
systemctl start mysql

echo "配置环境变量"
ln -sv /opt/mysql/bin/mysql /usr/sbin/mysql
ln -sv /opt/mysql/bin/mysqladmin /usr/sbin/mysqladmin
ln -sv /opt/mysql/bin/mysqldump /usr/sbin/mysqldump

echo "登录MySQL"
mysql -u root --skip-password -e  "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password11';"

echo "导入数据"
mysql -uroot -p'password11'  -e "create database dblog charset utf8mb4 collate utf8mb4_general_ci;
use dblog;
source /opt/dblog/mysql/dblog.sql;"

echo "设置开机自启"
sudo systemctl enable mysql

echo "MySQL安装完成"

1.3.Redis

#!/bin/bash

echo "开始安装Redis"

cd /opt/dblog/redis/
dpkg -i *.deb

sed -i 's/# requirepass foobared/requirepass password11/g' /etc/redis/redis.conf
sed -i 's/daemonize no/daemonize yes/g' /etc/redis/redis.conf

echo "Redis安装完成"

1.4.Nginx

这里Nginx是用来作为一个文件服务器

#!/bin/bash

echo "开始安装Nginx"

cd /opt/dblog/nginx/
dpkg -i *.deb

cp default /etc/nginx/sites-enabled/

echo "Nginx安装完成"

default文件内容

server {
	listen 8890 default_server;
	listen [::]:8890 default_server;

	root /var/www/html;

	index index.html index.htm index.nginx-debian.html;

	server_name _;

	location ~* ^/blogFiles/ {
            root /opt/;
            try_files $uri $uri/ =404;
        }
}<br/>

1.4.Web服务

博客的前台

#!/bin/bash
echo "开始启动博客Web服务"
cd /opt/dblog/web
nohup java -Dfile.encoding=utf-8 -Xms1G -Xmx2G -jar blog-web.jar > /dev/null 2>&1 &
echo "博客Web服务已启动"

方便程序的管理,将博客前台程序做成了service服务

[Unit]
Description=blog web server
After=mysql.service

[Service]
Type=forking
ExecStart=/bin/bash /opt/dblog/web/startWeb.sh
PrivateTmp=true

[Install]
WantedBy=multi-user.target

1.5.后台管理服务

博客的后台管理

#!/bin/bash
echo "开始启动博客后台管理服务"
cd /opt/dblog/admin
nohup java -Dfile.encoding=utf-8 -Xms1G -Xmx2G -jar blog-admin.jar > /dev/null 2>&1 &
echo "博客后台管理服务已启动"

方便程序的管理,将博客后台管理程序做成了service服务

[Unit]
Description=blog admin server
After=mysql.service

[Service]
Type=forking
ExecStart=/bin/bash /opt/dblog/admin/startAdmin.sh
PrivateTmp=true

[Install]
WantedBy=multi-user.target

1.6.维护

替换下载文件的IP

UPDATE biz_file SET full_file_path = REPLACE(full_file_path, '47.108.99.40', '43.33.113.4');
UPDATE biz_article SET cover_image = REPLACE(cover_image, '47.108.99.40', '43.33.113.4');
UPDATE biz_article SET content = REPLACE(content, '47.108.99.40', '43.33.113.4');
UPDATE sys_config SET config_value = REPLACE(config_value, '47.108.99.40', '43.33.113.4');

1.7.https配置

nginx

<font color="#000000">server {
	# SSL configuration
	listen 8890 ssl default_server;
	listen [::]:8890 ssl default_server;

	# SSL certificate and key
	ssl_certificate /etc/nginx/ssl/fullchain.crt;
	ssl_certificate_key /etc/nginx/ssl/private.pem;

	# Read up on ssl_ciphers to ensure a secure configuration.
	ssl_protocols TLSv1.2 TLSv1.3;
	ssl_ciphers HIGH:!aNULL:!MD5;

	root /var/www/html;

	# Add index.php to the list if you are using PHP
	index index.html index.htm index.nginx-debian.html;

	server_name _;

	location ~* ^/blogFiles/ {
		root /opt/;
		try_files $uri $uri/ =404;
	}
}</font><br/>

application.yml

<font color="#000000"># 自定义配置
custom:
    # https配置
    ssl:
        # 是否开启证书验证
        enabled: false
        # 证书密码
        keyStorePassword: 8059al</font>

SslConfig.java

<font color="#000000">/**
 * https配置
 */
@Configuration
public class SslConfig {

    @Value("${custom.ssl.enabled}")
    private boolean sslEnabled;

    @Value("${custom.ssl.keyStorePassword}")
    private String keyStorePassword;

    /**
     * 配置嵌入式Tomcat服务器以启用HTTPS
     * @return
     */
    @Bean
    public WebServerFactoryCustomizer&lt;TomcatServletWebServerFactory&gt; sslCustomizer() {
        return factory -&gt; {
            if (sslEnabled) {
                try {
                    // 获取证书文件路径
                    String certDir = ApplicationUtil.getJarPath() + "/certs/";
                    File certDirectory = new File(certDir);
                    File[] certFiles = certDirectory.listFiles((dir, name) -&gt; Arrays.asList("jks", "p12", "pfx").contains(name.toLowerCase().substring(name.lastIndexOf(".") + 1)));

                    if (certFiles == null || certFiles.length == 0) {
                        throw new RuntimeException("在" + certDir + "目录中没有找到有效的证书文件");
                    }

                    File keyStoreFile = certFiles[0];
                    String keyStoreType = keyStoreFile.getName().endsWith(".jks") ? "JKS" : "PKCS12";

                    // 加载密钥库
                    KeyStore keyStore = KeyStore.getInstance(keyStoreType);
                    try (FileInputStream fis = new FileInputStream(keyStoreFile)) {
                        keyStore.load(fis, keyStorePassword.toCharArray());
                    } catch (CertificateException e) {
                        throw new ZhydException("证书加载失败,请检查证书" + keyStoreFile.getAbsolutePath() + "是否有效", e);
                    } catch (IOException e) {
                        throw new ZhydException("证书不存在,请检查" + certDir + "目录中是否有证书文件。支持的证书格式有.p12和.jks", e);
                    } catch (NoSuchAlgorithmException e) {
                        throw new ZhydException("算法不可用", e);
                    }

                    // 初始化 KeyManagerFactory 和 TrustManagerFactory
                    KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
                    keyManagerFactory.init(keyStore, keyStorePassword.toCharArray());

                    TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
                    trustManagerFactory.init(keyStore);

                    // 创建 SSLContext
                    SSLContext sslContext = SSLContext.getInstance("TLS");
                    sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);

                    // 配置 Tomcat 连接器
                    factory.addConnectorCustomizers(connector -&gt; {
                        connector.setSecure(true);
                        connector.setScheme("https");
                        connector.setProperty("SSLEnabled", "true");
                        connector.setProperty("clientAuth", "false");
                        connector.setProperty("sslProtocol", "TLS");
                        connector.setProperty("keystoreFile", keyStoreFile.getAbsolutePath());
                        connector.setProperty("keystorePass", keyStorePassword);
                        connector.setProperty("keystoreType", keyStoreType);
                        connector.setAttribute("SSLContext", sslContext);
                    });

                } catch (UnrecoverableKeyException e) {
                    throw new ZhydException("密钥库密码" + keyStorePassword + "不正确", e);
                } catch (KeyStoreException e) {
                    throw new ZhydException("操作密钥库时发生错误", e);
                } catch (NoSuchAlgorithmException e) {
                    throw new ZhydException("请求的算法不可用", e);
                } catch (KeyManagementException e) {
                    throw new ZhydException("管理密钥或信任材料时发生错误", e);
                }
            }
        };
    }
}</font>

2.内网穿透

通过花生壳做的内网穿透,然后就可以通过互联网进行访问,花生壳安装步骤如下

2.1.安装花生壳

在花生壳官网,选择Raspberry Pi 64位的安装包

安装

# 切换到root账号
sudo -s
# 安装花生壳
dpkg -i phddns_5.1.0_rapi_aarch64.deb
# 花生壳功能
phddns start(启动)| status(状态)| stop(停止)|restart(重启)| reset(重置)|enable(开机自启动)|disable(关闭开机自启动)|version(版本)
# 日志路径
/var/log/phddns/
# 卸载
dpkg -r phddns

2.2.花生壳配置

绑定设备,执行以下命令获取SN码

phddns status

在设备列表根据SN码添加设备

添加内网穿透的映射


正文到此结束