<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
    <channel>
            <title>Ying</title>
            <link>https://blog.luvying.com</link>
                <description> ⎛⎝喵~⎠⎞</description>
        <generator>Halo 1.5.1</generator>
        <lastBuildDate>Wed, 19 Feb 2025 09:39:26 CST</lastBuildDate>
                <item>
                    <title>
                        <![CDATA[docker安装gitlab]]>
                    </title>
                    <link>https://blog.luvying.com/archives/docker-gitlab</link>
                    <description>
                            <![CDATA[<blockquote><p>gitlab官方文档：<a href="https://docs.gitlab.com/ee/install/docker.html" target="_blank">https://docs.gitlab.com/ee/install/docker.html</a><br />官方提供了docker或docker compose的安装方式，这里采用docker</p></blockquote><h3 id="docker%E5%AE%89%E8%A3%85%2B%E8%BF%90%E8%A1%8C" tabindex="-1">docker安装+运行</h3><pre><code class="language-sh">sudo docker run --detach \  --publish 443:443 --publish 7000:80 --publish 23:22 \  --name gitlab \  --restart always \  --volume /data/gitlab/config:/etc/gitlab \  --volume /data/gitlab/logs:/var/log/gitlab \  --volume /data/gitlab/data:/var/opt/gitlab \  gitlab/gitlab-ce:latest</code></pre><blockquote><p>可以添加<code>--hostname example.com</code>指定你的域名，这里我删掉了<br />这里<code>--publish 7000:80</code>我把对外访问端口改成了7000，如果80端口开放了可以用80</p></blockquote><p>下载镜像+运行需要点时间，还是比较占系统资源的</p><p>访问<code>IP:7000</code>或者域名即可</p><h3 id="%E9%85%8D%E7%BD%AE%E5%AF%86%E7%A0%81" tabindex="-1">配置密码</h3><p>进入容器内部<br /><code>sudo docker exec -it gitlab /bin/bash</code><br />进入gitlab的rails控制台<br /><code>gitlab-rails console</code><br />依次执行下列命令，修改root账号的密码</p><pre><code class="language-sh">user=User.find_by_username &#39;root&#39;user.password=&quot;12345678&quot;   #修改密码user.save!</code></pre><p>返回网页登录</p><h3 id="%E9%85%8D%E7%BD%AE%E4%B8%AD%E6%96%87" tabindex="-1">配置中文</h3><p>依次按下图顺序修改默认语言，将会影响新用户的默认语言，但不会影响当前用户（即root用户）<br /><img src="https://blog.luvying.com/upload/2024/04/image.png" alt="image" /><br />依次按下图修改当前用户语言<br /><img src="https://blog.luvying.com/upload/2024/04/image-1713492585506.png" alt="image-1713492585506" /><br />刷新一下，搞定！</p>]]>
                    </description>
                    <pubDate>Fri, 19 Apr 2024 10:14:59 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[树莓派docker安装transmission作为下载机]]>
                    </title>
                    <link>https://blog.luvying.com/archives/raspberry-docker-transmission</link>
                    <description>
                            <![CDATA[<blockquote><p>transmission是一个BitTorrent客户端软件，树莓派安装后就能用它进行挂机下载了<br />transmission dockerhub 仓库：<a href="https://hub.docker.com/r/linuxserver/transmission" target="_blank">https://hub.docker.com/r/linuxserver/transmission</a></p></blockquote><h3 id="%E5%87%86%E5%A4%87" tabindex="-1">准备</h3><p>1.树莓派（我是3B，系统是buster）<br />2.已安装docker</p><h3 id="%E6%8C%82%E8%BD%BD%E7%A7%BB%E5%8A%A8%E7%A1%AC%E7%9B%98" tabindex="-1">挂载移动硬盘</h3><p>树莓派接上移动硬盘，查询是否成功识别<br />注意硬盘需要<code>ext4</code>格式才能被linux<strong>直接</strong>读写<br />如果用硬盘盒+硬盘，供电一定要足，需要买那种外置供电的硬盘盒，否则树莓派带不动会时不时断开</p><pre><code class="language-bash">sudo fdisk -l</code></pre><p>挂载硬盘，这里我将其挂载到了<code>/data/hdd</code></p><pre><code class="language-bash">sudo mount /dev/sda1 /data/hdd</code></pre><p>为使系统重启后自动挂载，使用<code>blkid</code>命令查询硬盘PARTUUID</p><p>然后编辑<code>sudo nano /etc/fstab</code>追加</p><p><code>PARTUUID=0004b6aa-01  /data/hdd       ext4    defaults          0       0</code></p><p><code>PARTUUID</code>和<code>/data/hdd</code>根据实际情况修改</p><p>配置立即生效：<code>sudo mount -a</code></p><p>查看挂载：<code>df -h</code></p><h3 id="%E5%AE%89%E8%A3%85transmission" tabindex="-1">安装transmission</h3><p>docker执行命令</p><pre><code class="language-bash">sudo docker run -itd \  --name=transmission \  -e PUID=0 \  -e PGID=0 \  -e TZ=Asia/Shanghai \  -p 9091:9091 \  -p 51413:51413 \  -p 51413:51413/udp \  -v /data/transmission/data:/config \  -v /data/hdd/transmission/downloads:/downloads \  -v /data/transmission/watch/folder:/watch \  --restart unless-stopped \  --privileged \  linuxserver/transmission:4.0.2</code></pre><p>相关说明：<br />1.我把transmission相关文件都放在了<code>/data/transmission</code>中，<code>-v</code>映射到容器中相应位置，而下载的文件则保存在本地<code>/data/hdd/transmission/downloads</code>中，根据自己实际情况修改</p><p>2.<code>PUID</code>和<code>PGID</code>似乎是为了防止<code>-v</code>映射出现权限问题而设置的，终端输入<code>id</code>并填入自己用户的值，虽然我自己尝试了并没啥用，还是会出现权限问题=。=官方说明如下：</p><blockquote><p>When using volumes ( flags) permissions issues can arise between the host OS and the container, we avoid this issue by allowing you to specify the user and group .<code>-v PUID PGID</code><br />Ensure any volume directories on the host are owned by the same user you specify and any permissions issues will vanish like magic.<br />…</p></blockquote><p>3.在启动的时候页面一直无法访问，查了日志发现不断的出现<code>s6-svscan: warning: unable to iopause: Operation not permitted</code>等权限问题，transmission一直在不断重启，查了资料，各种改权限，还是没啥用，最后发现docker启动参数加一个<code>--privileged</code>，予以容器特权就可以了。。。Emmm。。。</p><p>4.镜像为什么没用<code>linuxserver/transmission:latest</code>呢？似乎我的树莓派系统是buster，不兼容，降低了个版本才能运行</p><p>然后<code>树莓派ip:9091</code>就能访问了~可以挂机让树莓派下载了</p><h3 id="docker-samba%E9%85%8D%E7%BD%AE%E5%8F%82%E8%80%83" tabindex="-1">Docker Samba配置参考</h3><blockquote><p><a href="https://hub.docker.com/r/dperson/samba" target="_blank">dockerhub samba 地址</a></p></blockquote><pre><code class="language-bash">sudo docker run -it --name samba -p 139:139 -p 445:445 \-v /data/hdd:/mount \-d dperson/samba:armhf \-p \-s &quot;share;/mount/;yes;no;yes;all;none&quot;</code></pre>]]>
                    </description>
                    <pubDate>Wed, 10 May 2023 09:06:46 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[frp+docker内网穿透安装配置]]>
                    </title>
                    <link>https://blog.luvying.com/archives/frp-docker</link>
                    <description>
                            <![CDATA[<blockquote><p>frp是一个优秀的内网穿透服务，曾试过用ngrok做内网穿透，但用docker还比较麻烦，还需要自己编译ngrok客户端进行分发才能使用，折腾了一阵子就没搞了。frp早闻大名，趁有空尝试下，还是比较方便的，只需要写好配置文件，启动就完事了<br /><a href="https://gofrp.org/docs/" target="_blank">frp官方文档</a><br /><a href="https://github.com/fatedier/frp" target="_blank">frp github</a><br /><a href="https://hub.docker.com/r/snowdreamtech/frps" target="_blank">docker-frps</a><br /><a href="https://hub.docker.com/r/snowdreamtech/frpc" target="_blank">docker-frpc</a></p></blockquote><h3 id="%E5%87%86%E5%A4%87" tabindex="-1">准备</h3><p>1.云服务器或具有公网IP的服务器，用于安装frp服务端（frps）<br />2.需要内网穿透的服务器，如树莓派，将安装frp客户端（frpc）<br />3.上述1和2的服务器均安装好docker</p><h3 id="frp%E6%9C%8D%E5%8A%A1%E7%AB%AF(frps)" tabindex="-1">frp服务端(frps)</h3><p>创建frp服务端配置文件<code>/data/frp/frps.ini</code>，根据自己实际情况修改路径</p><pre><code class="language-bash">mkdir /data/frp/frps.ini</code></pre><pre><code class="language-bash">cd /data/frp/nano frps.ini</code></pre><h4 id="frps.ini" tabindex="-1">frps.ini</h4><pre><code class="language-bash">[common]# 服务器开放给客户端的frp端口bind_port = 7000# http端口vhost_http_port = 8080# https端口vhost_https_port = 8081dashboard_addr = 0.0.0.0# 控制面板端口,用户名,密码dashboard_port = 7500dashboard_user = admindashboard_pwd = yourpassword# 自己用于frp服务的域名subdomain_host = frp.yourdomain.com# frps服务token,拥有此token的客户端才允许连接token = yourfrptoken</code></pre><blockquote><p>仅<code>bind_port </code>为必须设置，其余设置可根据需要进行取舍<br />设置token可防止任何用户连接自己的frp服务端，相应地，客户端的配置文件也需要设置相同的token才能连接，如自己的frp服务开放给任何用户，可不设置<br /><code>subdomain_host</code>设置frp服务的域名，使客户端可从<code>*.frp.yourdomain.com</code>访问服务，若客户端无子域名要求，可不设置</p></blockquote><p>拉取frp服务端镜像</p><pre><code class="language-bash">docker pull snowdreamtech/frps</code></pre><p>运行docker</p><pre><code class="language-bash">docker run --restart=always --network host -d -v /data/frp/frps.ini:/etc/frp/frps.ini --name frps snowdreamtech/frps</code></pre><p>搞定，去<code>服务器IP:7500</code>，输入账号密码，就可以看到dashboard页面了<br /><img src="https://i-blog.csdnimg.cn/blog_migrate/9077d1ce6e8d26f1c1a1871dce72bafd.png" alt="在这里插入图片描述" /></p><h3 id="frp%E5%AE%A2%E6%88%B7%E7%AB%AF(frpc)" tabindex="-1">frp客户端(frpc)</h3><p>客户端就比较灵活了，可以去<a href="https://github.com/fatedier/frp/releases" target="_blank">frp的release</a>下载编译好的文件，也可以跑在docker中，重点还是配置文件的内容</p><h4 id="frpc.ini" tabindex="-1">frpc.ini</h4><pre><code class="language-bash">[common]# frps服务器地址，可用域名，即服务端的frp.yourdomain.comserver_addr = 666.666.666.666# 上面frps.ini配置的端口server_port = 7000# frps服务tokentoken = yourfrptoken[tcp]type = tcplocal_ip = 127.0.0.1local_port = 8000remote_port = 9876[web]type = httplocal_port = 8000custom_domains = yourdomain</code></pre><p>相关说明：</p><ul><li><p>以上演示了一个TCP类型和HTTP类型的代理，<code>[xxx]</code>中可随意填写，仅代表该代理的<code>name</code>，名称不可重复</p></li><li><p>云服务器IP假设为<code>666.666.666.666</code></p></li><li><p>TCP代理一般用于监听22端口来进行SSH，在上面的例子中，内网的8000端口跑了个服务，因此可用<code>666.666.666.666:9876</code>或则<code>域名:9876</code>来访问到内网8000端口的服务。如果改成<code>local_port = 22</code>，就可以<code>ssh -oPort=9876 test@x.x.x.x</code>SSH内网服务器了</p></li><li><p>HTTP代理的例子中，需要指定域名，可通过<code>域名:8080</code>来访问内网8000端口的服务，但<strong>不可</strong>通过<code>666.666.666.666:8080</code>来访问，为什么是<code>8080</code>呢？因为在上面的<code>frps.ini</code>中配置了<code>vhost_http_port = 8080</code>。如果服务端<code>frps.ini</code>设置了<code>subdomain_host</code>，该例中<code>custom_domains = yourdomain</code>可改为<code>subdomain=myweb</code>，此时就可通过子域名，<code>myweb.frp.yourdomian.com:8080</code>来访问服务，注意，子域名只能向下一级，不可<code>subdomain=sub.myweb</code>，会报错</p></li></ul><h4 id="%E8%BF%90%E8%A1%8C%E5%AE%A2%E6%88%B7%E7%AB%AF" tabindex="-1">运行客户端</h4><p>写好配置文件后，可根据实际，运行编译版程序，或者运行docker版程序</p><h5 id="%E7%BC%96%E8%AF%91%E7%89%88" tabindex="-1">编译版</h5><p>从github下载对应平台编译好的文件，解压好，修改<code>frpc.ini</code>，运行即可，注意windows版要打开cmd运行</p><h5 id="docker" tabindex="-1">docker</h5><p>拉取客户端镜像</p><pre><code class="language-bash">docker pull snowdreamtech/frpc</code></pre><p>创建<code>/data/frp/frpc.ini</code>，写好配置文件，运行即可</p><pre><code class="language-bash">docker run --restart=always --network host -itd -v /data/frp/frpc.ini:/etc/frp/frpc.ini --name frpc snowdreamtech/frpc</code></pre><h3 id="%E5%85%B6%E4%BB%96%E9%85%8D%E7%BD%AE" tabindex="-1">其他配置</h3><h4 id="%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%9A%84%E7%AE%A1%E7%90%86%E9%A1%B5%E9%9D%A2" tabindex="-1">客户端的管理页面</h4><p>除了上面的服务端(frps)有dashboard，客户端(frpc)也有自己的管理页面，方便客户端随时更新配置文件，不用每次都要进服务器才能修改<br />因此仅需要在客户端<code>frpc.ini</code>添加下面内容即可</p><pre><code class="language-bash"># frpc.ini[common]admin_addr = 127.0.0.1admin_port = 7400admin_user = adminadmin_pwd = admin#打开浏览器通过 http://127.0.0.1:7400 访问 Admin UI#如果想要在外网环境访问 Admin UI，可以将 7400 端口通过 frp 映射出去即可，但需要重视安全风险#用tcp的方式，外网可用frp.yourdomain.com:7400访问[admin_ui]type = tcplocal_port = 7400remote_port = 7400#也可用http的方式，外网可用frp-admin.frp.yourdomain.com:8080访问(注意和tcp方式端口区别)[admin_ui_http]type = httplocal_port = 7400subdomain = frp-admin</code></pre><p>官方文档写的就是用tcp的方式访问，当然用http也是可以的，二选一即可<br />重启，就可以访问客户端的管理页面了<br /><img src="https://i-blog.csdnimg.cn/blog_migrate/12f607a3eab0a56d98332dd928e27a0a.png" alt="在这里插入图片描述" /></p><h4 id="%E5%8E%BB%E6%8E%89%E7%AB%AF%E5%8F%A3%E5%8F%B7%E8%AE%BF%E9%97%AE" tabindex="-1">去掉端口号访问</h4><p>每次访问内网服务都要加端口号<code>*.frp.yourdomian.com:8080</code>还是挺烦的，要去掉端口号，只需要在<strong>服务端</strong>的nginx加一个配置项，即匹配监听自己frp子域名的80端口，转发到frp的8080端口，然后就可以愉快地不带端口访问内网服务了~（前提是域名备案了哈，云服务器没有备案是用不了80端口的）</p><pre><code class="language-bash">server {     listen  80;     server_name  *.frp.yourdomain.cn frp.yourdomain.cn;     location / {             proxy_redirect off;             proxy_set_header Host $http_host;             proxy_set_header X-Real-IP $remote_addr;             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;             proxy_pass http://127.0.0.1:8080;     }}</code></pre><p>如果服务端使用的是云服务器，有的云服务器填<code>proxy_pass http://127.0.0.1:8080;</code>会不生效，这个时候去要查一下云服务的内网地址填上就可以了</p>]]>
                    </description>
                    <pubDate>Fri, 16 Dec 2022 21:24:40 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[Docker+HomeAssistant+HACS+设备接入教程]]>
                    </title>
                    <link>https://blog.luvying.com/archives/dockerhomeassistanthacs</link>
                    <description>
                            <![CDATA[<blockquote><p>homeassistant久仰大名，据说可以一统各大物联网平台的设备，家里各平台的设备都有一点，控制起来很不方便，于是乎我也来尝尝~<br />homeassistant官网 <a href="https://www.home-assistant.io/" target="_blank">https://www.home-assistant.io/</a><br />HACS <a href="https://github.com/hacs/integration" target="_blank">https://github.com/hacs/integration</a></p></blockquote><h3 id="%E5%87%86%E5%A4%87" tabindex="-1">准备</h3><p>1.Linux系统（Window）其实也类似<br />2.安装好docker</p><h3 id="docker%E5%AE%89%E8%A3%85homeassistant" tabindex="-1">docker安装homeassistant</h3><p>官方有几个版本可供选择，安装方式可以：直接刷HA的系统，也可以用Docker安装，还可以直接安装在物理机上，具体区别如下：<br /><img src="https://i-blog.csdnimg.cn/blog_migrate/dcfbd81e473c531a6bdbabd892bfe2fd.png" alt="在这里插入图片描述" /><br />我采用的是Docker进行安装，也就是<code>Container</code>，从上图也可以看到，直接刷系统功能是最全的，而用Docker容器的方式最方便，但是就没法用<code>Supervisor</code>，被阉割掉了一些系统管理、监控等功能，等有空再试试吧（咕咕咕~）</p><p><a href="https://www.home-assistant.io/installation/raspberrypi" target="_blank">HA官方安装教程</a>中提供的镜像估计是docker私服，镜像地址是<code>ghcr.io/home-assistant/home-assistant:stable</code>，所以下载速度比较慢（不，是很慢=。=）<br />然而在<a href="https://hub.docker.com/r/homeassistant/home-assistant" target="_blank">dockerhub也能找到HA官方上传的镜像</a>，所以可以从docker官方直接拉取镜像，docker换成国内源之后就快了</p><blockquote><p>docker要换成国内源可以编辑<code>/etc/docker/daemon.json</code>来更换，如果没有这个文件就创建一个，然后添加想要的源，我的是这样的，供参考：<br />{<br />“registry-mirrors” : [<br />“<a href="https://registry.docker-cn.com" target="_blank">https://registry.docker-cn.com</a>”,<br />“<a href="https://docker.mirrors.ustc.edu.cn" target="_blank">https://docker.mirrors.ustc.edu.cn</a>”,<br />“<a href="http://hub-mirror.c.163.com" target="_blank">http://hub-mirror.c.163.com</a>”,<br />“<a href="https://cr.console.aliyun.com/" target="_blank">https://cr.console.aliyun.com/</a>”<br />]<br />}<br />然后重启docker服务即可<code>systemctl restart docker.service</code></p></blockquote><p>拉取最新镜像</p><pre><code class="language-bash">docker pull homeassistant/home-assistant</code></pre><p>如果需要稳定版本</p><pre><code class="language-bash">docker pull homeassistant/home-assistant:stable</code></pre><p>启动命令</p><pre><code class="language-bash">docker run -d \  --name homeassistant \  --privileged \  --restart=unless-stopped \  -e TZ=Asia/Shanghai \  -v /data/homeassistant:/config \  --network=host \  homeassistant/home-assistant</code></pre><p><code>-v /data/homeassistant:/config</code>这一项需要根据自己实际情况修改，即把自己物理机某文件夹挂载到容器内，我是建了个文件夹<code>/data/homeassistant</code>来存放HA的文件</p><blockquote><p>如果pull稳定版本，记得最后面是<code>homeassistant/home-assistant:stable</code><br />镜像官方有多个编译版本，会自动适配，我在树莓派（ARM）和云服务器（x86）都部署了，命令是相同的，不需要区分CPU架构</p></blockquote><p>启动完成后，根据提示配置就可以了~<br /><img src="https://i-blog.csdnimg.cn/blog_migrate/a4b4487988fa43473385929ff7ef0dc3.png" alt="在这里插入图片描述" /><br />成功启动~！<br /><img src="https://i-blog.csdnimg.cn/blog_migrate/7cc147eff6aa41e21291053f30a520ef.png" alt="在这里插入图片描述" /></p><h3 id="%E5%AE%89%E8%A3%85hacs" tabindex="-1">安装HACS</h3><blockquote><p>HACS(Home Assistant Community Store)是HA的第三方应用商店，有很多dalao们写的各种插件，可以连接各大物联网平台（某米某猫等）的设备，是一个必装的集成<br />前面我也说了，我的HA相关文件都放到了<code>/data/homeassistant</code>下，所以下面的命令要根据自己实际情况进行调整</p></blockquote><pre><code class="language-bash">mkdir /data/homeassistantmkdir /data/homeassistant/wwwmkdir /data/homeassistant/custom_componentsmkdir /data/homeassistant/custom_components/hacs</code></pre><p>说明一下，上面创建的几个文件夹都是为安装HACS而准备的，<code>/www</code>是存放未来HACS安装的各种首页磁贴啥的（官方叫Lovelace ），<code>/custom_components/hacs</code>是存放等会要安装的HACS文件<br />接下来就是下载HACS相关文件进行安装了</p><blockquote><p>一般来说，直接从HACS的github下载最新的releases即可<a href="https://github.com/hacs/integration/releases/" target="_blank">https://github.com/hacs/integration/releases/</a>，但需要注意的是，HACS对HA的版本有要求，如果你安装的是低版本的HA，是没法装高版本的HACS的，我云服务器装的是2021.12.8 stable版的HA，没法用最新的HACS，所以尝试了几个版本发现1.22.0可用，而树莓派安装的是最新的HA，就安装最新的HACS。所以如果安装失败，可以适当降低版本</p></blockquote><pre><code class="language-bash">cd hacswget https://download.fastgit.org/hacs/integration/releases/download/1.22.0/hacs.zipunzip hacs.zip</code></pre><p>我用CentOS和Raspbian都自带了unzip解压，木有的话自行安装unzip或者其他解压程序哈，不赘述</p><p>解压完毕，需要重启HA<br />这个时候就可以在【配置】–&gt; 【设备与服务】–&gt;右下角【添加集成】中搜索到HACS了<br /><img src="https://i-blog.csdnimg.cn/blog_migrate/82ce757de99d218ed2e6a96e7cb10519.png" alt="在这里插入图片描述" /><br />添加后，根据提示一路配置下去<br /><img src="https://i-blog.csdnimg.cn/blog_migrate/647324628f2c7d1894c56324265efb9c.png" alt="在这里插入图片描述" /><br />需要绑定到自己的github账号，建议提前登录好自己的github后，再点击上面的链接（注意自己当前网络环境能否登上~）<br /><img src="https://i-blog.csdnimg.cn/blog_migrate/0859daa0fbd86aafb5619a0c4750edb5.png" alt="在这里插入图片描述" /><br />输入一串密钥后，就可以绑定自己的github账号到HACS<br /><img src="https://i-blog.csdnimg.cn/blog_migrate/f0a936e8e61a978a44ce349e11457263.png" alt="在这里插入图片描述" /><br />绑定完成后HA会有提示，如果还是一直在转圈那就多试几次，提前登录好账号的话基本上可以一次搞定<br /><img src="https://i-blog.csdnimg.cn/blog_migrate/aa009d3aa970ed6672ee948b88f26b74.png" alt="在这里插入图片描述" /><br />然后左边的菜单栏就有HACS了！如果没有的话重启HA也会有了<br /><img src="https://i-blog.csdnimg.cn/blog_migrate/46df4d708651ef2c26558d78d28bb187.png" alt="在这里插入图片描述" /></p><h3 id="homeassistant%E6%8E%A5%E5%85%A5%E8%AE%BE%E5%A4%87" tabindex="-1">homeassistant接入设备</h3><blockquote><p>有了HACS，就可以很方便接入设备了~以接入某米的设备为例</p></blockquote><p>在HACS搜索，出现了很多插件，MIoT这个就适配了不少设备，就用它来吧<br /><img src="https://i-blog.csdnimg.cn/blog_migrate/a44f8b1298de8af0f6aa5522ccb8ad93.png" alt="在这里插入图片描述" /><br />添加插件后，就可以输入自己的账号用户密码，然后就能添加自己账号下的设备到HA了<br /><img src="https://i-blog.csdnimg.cn/blog_migrate/6c46ab97e7ee5fbed38355d8af96b62d.png" alt="在这里插入图片描述" /><br />简单地添加到首页看看<br /><img src="https://i-blog.csdnimg.cn/blog_migrate/d883706ad0e7b3cb92e25a83470e6eb3.png" alt="在这里插入图片描述" /><br />good~这样的话就可以用HA，把各大平台的设备都添加进来统一管理啦！</p><h3 id="homeassistant-app" tabindex="-1">homeassistant App</h3><p>HA官方提供了APP，iOS和Android都有，可自行下载~</p><pre><code class="language-">https://www.github.com/home-assistant/iOShttps://github.com/home-assistant/android</code></pre><p>温馨提示：<br />App需要填入自己的HA地址，所以如果服务跑在家里的话，需要内网穿透或者公网才能在外面使用噢~<br />如果HA内网穿透，<code>configuration.yaml</code>需要加上下面内容，同时内网穿透服务器(如ngrok、frp等)的nginx需要开启<code>websocket</code>支持，否则会出现外网无法访问、能访问但是无法登录等问题。<br />HA配置文件<code>configuration.yaml</code></p><pre><code class="language-">http:  use_x_forwarded_for: True  trusted_proxies:    - 127.0.0.1/24    - ::1/128</code></pre><p>nginx配置参考(用frp内网穿透)</p><pre><code class="language-">server {     listen  80;     server_name  *.frp.yourdomain.cn frp.yourdomain.cn;     location / {             proxy_redirect off;             proxy_set_header Host $http_host;             proxy_set_header X-Real-IP $remote_addr;             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;             # 下面两行提供websocket支持,homeassistant需要             proxy_set_header Upgrade $http_upgrade;             proxy_set_header Connection &quot;upgrade&quot;;             proxy_pass http://127.0.0.1:8080;     }}</code></pre>]]>
                    </description>
                    <pubDate>Tue, 23 Aug 2022 00:04:58 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[来领网易云会员礼品卡咯~]]>
                    </title>
                    <link>https://blog.luvying.com/archives/netease-music-gift</link>
                    <description>
                            <![CDATA[<blockquote><p>才发现网易云每个月送的的会员礼品卡都浪费了=。=<br />目前我的等级每个月有5张7天的黑胶VIP礼品卡可以送，有需要的小伙伴自取吧，先到先得哈~</p></blockquote><table><thead><tr><th>月份</th><th>链接</th></tr></thead><tbody><tr><td>2023.3</td><td><a href="https://music.163.com/prime/m/gift-receive?p=SmTtaU5JDdigW9jUzmfDM8Da_NCVtDuWi2aXxv6ZO8PSNqSeMyf68Nx6_TVY0LPTrN_nlGCaIPADDi9PFMr7QlFSOegPV2IrVCH2ATKWkK4&amp;d=n4yOxSYZj3noeC8hyM1q2w" target="_blank">here~</a></td></tr><tr><td>2023.2</td><td><a href="https://music.163.com/prime/m/gift-receive?p=DWOri9E_nwckXoy195gPsC4aKvUAmaB1rRd12YV933_WJYnOISTgAqees6TLcOAKt20xNdOak2AapkRJxB4Z_-7SHyD7I9mTc7kI9e2796M&amp;d=H-9ZkvFR0ptlOuqidk7c9A" target="_blank">here~</a></td></tr><tr><td>2023.1</td><td><a href="https://music.163.com/prime/m/gift-receive?p=XdI8slsP3I1vKEHEGAexUak5QTdVd2SVGNNhzG5MXCrI1X2LhiOjPW_tOl_ee9eVOmS-KtvxG0mOujm_h8rVBcGwvvL1S2yxc0cfc_r2Tdg&amp;d=4x3HYJ-chBEwXd_bC2pJhQ" target="_blank">here~</a></td></tr><tr><td>2022.12</td><td><a href="https://music.163.com/prime/m/gift-receive?p=XGoKjcgqUlcCXW1ecVB4YIlwp7nXz1uMk9YQdZvZkmXGF8jEfiUP8djE78v1bO7n1ZRuEZSe_58-5FX6Y5d2jL-8hX29FsFIhyTBxcTgdsw&amp;d=KTBFK9GrT4JLCw04AgvRMA" target="_blank">here~</a></td></tr><tr><td>2022.11</td><td><a href="https://music.163.com/prime/m/gift-receive?p=epml759pip2cQiHAlcp6h_zsXZT-RUDIFyLq89ge8WJbv01bxdiIij-W0fdkumVodeb0BCtkOsCBe-a6eZw07MzG5rTAZ07igHGxlXE18-U&amp;d=0F1PIysjvdr1sXxY7StwHA" target="_blank">here~</a></td></tr><tr><td>2022.10</td><td><a href="https://music.163.com/prime/m/gift-receive?p=lsWow-bPSCKWP9o9E-Ju2Lcc83_KBIli69ZsQGJmJY4iEQHRtdkDopFP-W494IWVTXvkFXKY3UqGB7t_68_gW9-kDglT9MhrmRqobGKcfy8&amp;d=aTDhDvvuc1VA2XPz5Mfkog" target="_blank">here~</a></td></tr><tr><td>2022.9</td><td><a href="https://music.163.com/prime/m/gift-receive?p=UnEPNlsTrzjqPynv1c5EL32eVhfmWLYqcRfT3ba590K2g09IzDmC1muLanYV5N6h4e8tWWwZcBdl8EYFdaQ9pZAvACDU4rPdzBnBt9BG-1o&amp;d=vDgoqRQ_h0XQVuDq-Fyipg" target="_blank">here~</a></td></tr><tr><td>2022.8</td><td><a href="https://music.163.com/prime/m/gift-receive?p=jgSVm7xpA9-jNF_rYQgdF3ibU2XJyr81GxPzuaDVIWVFOFGjofT4pgAmdyHdjxuhpYtOPEN0rN40nglobG4FzQZcwk-XPSN4-KK02ZQjRxg&amp;d=ZUuDCPhmpbUH0znREaOxSA" target="_blank">here~</a></td></tr><tr><td>2022.7</td><td><a href="https://music.163.com/prime/m/gift-receive?p=h8h2SAV11Pmog91jEMfjKKq-hf4HVDm5Yn8oVBlDjfE5stAhCEHQO4La4L5wQ6RLRHGRtYXCpG7KkfUjQG1E-1XpOTYP1w9awtOD63CFtUM&amp;d=KiG6qIIagcVg83IQukGqJQ" target="_blank">here~</a></td></tr><tr><td>2022.6</td><td><a href="https://music.163.com/prime/m/gift-receive?p=ngNhoLWVvTG5EpVMruiQQePUD82EZxho7DrGOB9b1EQsybM2cuZHYl2cpq1n_psOlQ2debOVVDbkjw5YGV9hRQH6rjdeGKNgGDjbNGxW1Pk&amp;d=CQvhfNInhBZ0vIndRNMmlg" target="_blank">here~</a></td></tr></tbody></table><p><a href="https://blog.imzy.ink" target="_blank">Zsedczy</a>童鞋表示也想和小伙伴们分享他的会员，下面是他的礼品卡，感谢~😊</p><table><thead><tr><th><a href="https://blog.imzy.ink" target="_blank">Zsedczy</a>の礼品卡</th><th>链接</th></tr></thead><tbody><tr><td>2022.10👉</td><td><a href="https://music.163.com/prime/m/gift-receive?p=g62ob7tmf79z0JcIFlt_ZjHCb6G4dEjQbPxbImjYDRgoWKVhAznmDdOKvNb8R5g7jCfVmelQNbtQR9Fn-sj4eM_ZaRBVQIELh__7xE7ddLY&amp;d=CysCwYp7J7v_R8aREdoRMg" target="_blank">here~</a></td></tr><tr><td>2022.9👉</td><td><a href="https://music.163.com/prime/m/gift-receive?p=uA1FU5jg0b19FWWIrx8MLsSDH5CztnB9m1n-2KLbrxULy1o3DoqF8ZP_7SBSSzj1ren9pjLbFFPebc6mZYbIi8aaerj0TWJGAWyp69-PUq8&amp;d=s796BvHeINt51cDn_4wXyg" target="_blank">here~</a></td></tr><tr><td>2022.8👉</td><td><a href="https://music.163.com/prime/m/gift-receive?p=uUdC57sM0v67tzBmQNnqBLSWixB26u8G4iaRCYkxc4paFB1-83xoJtqtupEAqq0YxBjnyPc29TYwF66u3w9ofn71uLQXI22NNZ6lod-MAo0&amp;d=k3hCZFhY5jY7xVuf5V1lZg" target="_blank">here~</a></td></tr><tr><td>2022.7👉</td><td><a href="https://music.163.com/prime/m/gift-receive?p=OxTV4hGoX7DexNNwYFR8FPgmbaECtF8c6lpdWG3bsaV8ejb75bW4bxEDzKksjaYiqztI3tpTeQ-6X7R21R1NWGDPT7O-z-R6g-X4n-hwDng&amp;d=qpNyTD582M3GJ9rPlkib9g" target="_blank">here~</a></td></tr><tr><td>2022.6👉</td><td><a href="https://music.163.com/prime/m/gift-receive?p=Xq61bbLuXaY3a7fIjOhL7xGRfHKQgFOM4IF92LHcVX8FBGLYnRN_HEDmqLJAbuzd0akQZVfOeitTIWbOYEGBtBF8FhFatKFh932yyENtRFU&amp;d=J-CJCqYzMRPxD_-xspfuzg" target="_blank">here~</a></td></tr></tbody></table>]]>
                    </description>
                    <pubDate>Fri, 17 Jun 2022 11:55:06 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[Vue + SpringBoot 前后端分离项目用Maven自动打包合并为单体项目]]>
                    </title>
                    <link>https://blog.luvying.com/archives/vue-maven-demo</link>
                    <description>
                            <![CDATA[<blockquote><p>前端打包模块详细文档 <a href="https://github.com/eirslett/frontend-maven-plugin" target="_blank">https://github.com/eirslett/frontend-maven-plugin</a><br />本项目地址 <a href="https://gitee.com/luvying/vue-maven-demo" target="_blank">https://gitee.com/luvying/vue-maven-demo</a></p></blockquote><h3 id="%E5%89%8D%E8%A8%80" tabindex="-1">前言</h3><p>对于一些小项目，觉得没必要通过前后端分离进行部署，太浪费服务器资源了，但是用jQuery、bootstrap等又不能做到像前端框架那样能够模块化开发，因此就想着能不能用前后端分离的方式开发项目，开发完毕后把前端合并到后端去成为一个单体应用。通过查找，有人说前端开发完把编译好的文件copy到后端static目录中…太麻烦了…后来找到有个maven插件<code>frontend-maven-plugin</code>可以实现这个需求，于是参考了多篇博文，踩了些坑，做了这个demo，以后有这个需求来这个demo中copy代码就阔以了=。=</p><h3 id="%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84" tabindex="-1">项目结构</h3><pre><code class="language-">vue-maven-demo├──springboot-api└── vue-web</code></pre><p><img src="https://i-blog.csdnimg.cn/blog_migrate/ee53334024a50377d53c36510bf3d68e.png" alt="在这里插入图片描述" /></p><h3 id="pom%E9%85%8D%E7%BD%AE" tabindex="-1">pom配置</h3><p>重点在于pom的配置</p><h4 id="vue-maven-demo.pom" tabindex="-1">vue-maven-demo.pom</h4><p>父模块的配置</p><pre><code class="language-xml">&lt;groupId&gt;com.luvying&lt;/groupId&gt;    &lt;artifactId&gt;vue-maven-demo&lt;/artifactId&gt;    &lt;packaging&gt;pom&lt;/packaging&gt;    &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;    &lt;modules&gt;        &lt;module&gt;springboot-api&lt;/module&gt;        &lt;module&gt;vue-web&lt;/module&gt;    &lt;/modules&gt;    &lt;properties&gt;        &lt;spring.boot.version&gt;2.6.1&lt;/spring.boot.version&gt;    &lt;/properties&gt;    &lt;dependencyManagement&gt;        &lt;dependencies&gt;            &lt;dependency&gt;                &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;                &lt;artifactId&gt;spring-boot-starter-parent&lt;/artifactId&gt;                &lt;version&gt;${spring.boot.version}&lt;/version&gt;                &lt;scope&gt;import&lt;/scope&gt;                &lt;type&gt;pom&lt;/type&gt;            &lt;/dependency&gt;        &lt;/dependencies&gt;    &lt;/dependencyManagement&gt;</code></pre><h4 id="springboot-api" tabindex="-1">springboot-api</h4><p>子模块：后端模块的配置</p><pre><code class="language-xml">    &lt;parent&gt;        &lt;artifactId&gt;vue-maven-demo&lt;/artifactId&gt;        &lt;groupId&gt;com.luvying&lt;/groupId&gt;        &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;    &lt;/parent&gt;    &lt;artifactId&gt;springboot-api&lt;/artifactId&gt;    &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;    &lt;name&gt;springboot-api&lt;/name&gt;    &lt;description&gt;Demo project for Spring Boot&lt;/description&gt;    &lt;properties&gt;        &lt;!-- 前端项目编译后的dist目录路径 --&gt;        &lt;frontend-project-dist-dir&gt;${project.parent.basedir}/vue-web/dist&lt;/frontend-project-dist-dir&gt;        &lt;java.version&gt;1.8&lt;/java.version&gt;        &lt;maven-clean-plugin&gt;3.1.0&lt;/maven-clean-plugin&gt;        &lt;maven.resource.version&gt;3.1.0&lt;/maven.resource.version&gt;    &lt;/properties&gt;    &lt;dependencies&gt;        &lt;!-- 需要依赖前端模块,否则无法打包进后端系统,前端模块将会打一个空的jar包 --&gt;        &lt;dependency&gt;            &lt;groupId&gt;com.luvying&lt;/groupId&gt;            &lt;artifactId&gt;vue-web&lt;/artifactId&gt;            &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;        &lt;/dependency&gt;        &lt;dependency&gt;            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;            &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;        &lt;/dependency&gt;        &lt;dependency&gt;            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;            &lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt;            &lt;scope&gt;test&lt;/scope&gt;        &lt;/dependency&gt;    &lt;/dependencies&gt;    &lt;build&gt;        &lt;plugins&gt;            &lt;plugin&gt;                &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;                &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;                &lt;version&gt;${spring.boot.version}&lt;/version&gt;                &lt;!--解决打包后，执行java -jar 命令，找不到主清单属性--&gt;                &lt;executions&gt;                    &lt;execution&gt;                        &lt;phase&gt;package&lt;/phase&gt;                        &lt;goals&gt;                            &lt;goal&gt;repackage&lt;/goal&gt;                        &lt;/goals&gt;                    &lt;/execution&gt;                &lt;/executions&gt;            &lt;/plugin&gt;            &lt;plugin&gt;                &lt;!-- 插件maven-clean-plugin，用于在编译前，清除之前编译的文件、文件夹等，避免残留之前的内容 --&gt;                &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;                &lt;artifactId&gt;maven-clean-plugin&lt;/artifactId&gt;                &lt;version&gt;${maven-clean-plugin}&lt;/version&gt;                &lt;configuration&gt;                    &lt;filesets&gt;                        &lt;fileset&gt;                            &lt;!-- 前端资源目录，即：存放前端包目录--&gt;                            &lt;directory&gt;src/main/resources/static&lt;/directory&gt;                        &lt;/fileset&gt;                        &lt;fileset&gt;                            &lt;!-- Vue项目打包自动生成的dist目录 --&gt;                            &lt;directory&gt;${frontend-project-dist-dir}&lt;/directory&gt;                        &lt;/fileset&gt;                    &lt;/filesets&gt;                &lt;/configuration&gt;            &lt;/plugin&gt;            &lt;!--资源插件，主要为了从前端项目里复制打包好的文件到springboot项目--&gt;            &lt;plugin&gt;                &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;                &lt;artifactId&gt;maven-resources-plugin&lt;/artifactId&gt;                &lt;version&gt;${maven.resource.version}&lt;/version&gt;                &lt;executions&gt;                    &lt;execution&gt;                        &lt;id&gt;copy static&lt;/id&gt;                        &lt;phase&gt;generate-resources&lt;/phase&gt;                        &lt;goals&gt;                            &lt;goal&gt;copy-resources&lt;/goal&gt;                        &lt;/goals&gt;                        &lt;configuration&gt;                            &lt;!-- 复制前端打包文件到这里 --&gt;                            &lt;outputDirectory&gt;src/main/resources/static&lt;/outputDirectory&gt;                            &lt;overwrite&gt;true&lt;/overwrite&gt;                            &lt;resources&gt;                                &lt;resource&gt;                                    &lt;!-- 从前端打包的目录dist进行指定文件、文件夹内容的复制--&gt;                                    &lt;directory&gt;${frontend-project-dist-dir}&lt;/directory&gt;                                    &lt;includes&gt;                                        &lt;!-- 具体根据实际前端代码、及目录结构进行配置--&gt;                                        &lt;include&gt;css/&lt;/include&gt;                                        &lt;include&gt;fonts/&lt;/include&gt;                                        &lt;include&gt;img/&lt;/include&gt;                                        &lt;include&gt;js/&lt;/include&gt;                                        &lt;include&gt;favicon.ico&lt;/include&gt;                                        &lt;include&gt;index.html&lt;/include&gt;                                    &lt;/includes&gt;                                &lt;/resource&gt;                            &lt;/resources&gt;                        &lt;/configuration&gt;                    &lt;/execution&gt;                &lt;/executions&gt;            &lt;/plugin&gt;        &lt;/plugins&gt;    &lt;/build&gt;</code></pre><h4 id="vue-web" tabindex="-1">vue-web</h4><p>子模块：前端模块的配置</p><pre><code class="language-xml">    &lt;parent&gt;        &lt;artifactId&gt;vue-maven-demo&lt;/artifactId&gt;        &lt;groupId&gt;com.luvying&lt;/groupId&gt;        &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;    &lt;/parent&gt;    &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;    &lt;artifactId&gt;vue-web&lt;/artifactId&gt;    &lt;properties&gt;        &lt;!--前端打包--&gt;        &lt;maven-frontend-plugin.version&gt;1.12.0&lt;/maven-frontend-plugin.version&gt;        &lt;maven-frontend-plugin.nodeVersion&gt;v16.13.1&lt;/maven-frontend-plugin.nodeVersion&gt;&lt;!--        &lt;maven-frontend-plugin.nodeVersion&gt;v9.9.0&lt;/maven-frontend-plugin.nodeVersion&gt;--&gt;&lt;!--        &lt;maven-frontend-plugin.npmVersion&gt;6.9.0&lt;/maven-frontend-plugin.npmVersion&gt;--&gt;        &lt;maven-frontend-plugin.npmVersion&gt;8.1.2&lt;/maven-frontend-plugin.npmVersion&gt;        &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;        &lt;project.reporting.outputEncoding&gt;UTF-8&lt;/project.reporting.outputEncoding&gt;    &lt;/properties&gt;    &lt;build&gt;        &lt;plugins&gt;            &lt;plugin&gt;                &lt;groupId&gt;com.github.eirslett&lt;/groupId&gt;                &lt;artifactId&gt;frontend-maven-plugin&lt;/artifactId&gt;                &lt;version&gt;${maven-frontend-plugin.version}&lt;/version&gt;                &lt;executions&gt;                    &lt;execution&gt;                        &lt;id&gt;install node and npm&lt;/id&gt;                        &lt;goals&gt;                            &lt;goal&gt;install-node-and-npm&lt;/goal&gt;                        &lt;/goals&gt;                    &lt;/execution&gt;                    &lt;!-- Install all project dependencies --&gt;                    &lt;execution&gt;                        &lt;id&gt;npm install&lt;/id&gt;                        &lt;goals&gt;                            &lt;goal&gt;npm&lt;/goal&gt;                        &lt;/goals&gt;                        &lt;phase&gt;generate-resources&lt;/phase&gt;                        &lt;configuration&gt;                            &lt;arguments&gt;install&lt;/arguments&gt;                        &lt;/configuration&gt;                    &lt;/execution&gt;                    &lt;!-- Build and minify static files --&gt;                    &lt;execution&gt;                        &lt;id&gt;npm run build&lt;/id&gt;                        &lt;goals&gt;                            &lt;goal&gt;npm&lt;/goal&gt;                        &lt;/goals&gt;                        &lt;configuration&gt;                            &lt;arguments&gt;run build&lt;/arguments&gt;                        &lt;/configuration&gt;                    &lt;/execution&gt;                &lt;/executions&gt;                &lt;configuration&gt;                    &lt;nodeVersion&gt;${maven-frontend-plugin.nodeVersion}&lt;/nodeVersion&gt;                    &lt;npmVersion&gt;${maven-frontend-plugin.npmVersion}&lt;/npmVersion&gt;                    &lt;!-- 若不方便访问官网，可手动设置镜像地址--&gt;                    &lt;nodeDownloadRoot&gt;https://npm.taobao.org/mirrors/node/&lt;/nodeDownloadRoot&gt;                    &lt;npmDownloadRoot&gt;https://registry.npm.taobao.org/npm/-/&lt;/npmDownloadRoot&gt;                &lt;/configuration&gt;            &lt;/plugin&gt;        &lt;/plugins&gt;    &lt;/build&gt;</code></pre><h3 id="%E7%9B%B8%E5%85%B3%E8%AF%B4%E6%98%8E" tabindex="-1">相关说明</h3><p>把前端代码打包进后端，主要是几个流程（结合上面的pom看更清晰）：</p><ol><li><code>frontend-maven-plugin</code>下载node和npm到本地，然后将前端代码进行编译，编译完成后文件在<code>vue-web/dist</code>中（所以本地可以不需要有node环境也能够编译）</li><li><code>maven-clean-plugin</code>把后端项目中<code>src/main/resources/static</code>清空</li><li><code>maven-resources-plugin</code>去前端项目拿到<code>vue-web/dist</code>将它复制到后端项目<code>src/main/resources/static</code>中</li><li>接下来的流程就和maven正常打包一样了</li></ol><p>自己的项目目录有变化的话，修改pom中相应的目录路径即可<br />打包时，在父模块<code>vue-maven-demo</code>执行<code>maven install</code>，生成的jar包会在<code>springboot-api\target</code>下而不是<code>vue-web\target</code>下，因为<code>vue-web</code>是为了编译前端文件而打了个空包而已</p><h3 id="%E5%89%8D%E7%AB%AF%E9%A1%B9%E7%9B%AE" tabindex="-1">前端项目</h3><p>本文以vue为例（其他前端项目类似），用vue-cli生成了一个vue项目，简单写了获取后端数据、前端路由的例子，经测试，前端打包进后端后功能正常<br /><img src="https://i-blog.csdnimg.cn/blog_migrate/450f1e27a11b9a29514f1b33f9a9db33.png" alt="在这里插入图片描述" /><br />前端项目结构如下<br /><img src="https://i-blog.csdnimg.cn/blog_migrate/3855c5b5cec5e4b4f49b254475cc3ac9.png" alt="在这里插入图片描述" /><br />详细见源码</p><h4 id="%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91%E4%B8%8E%E9%83%A8%E7%BD%B2%E9%97%AE%E9%A2%98" tabindex="-1">前端开发与部署问题</h4><p>前端在开发完成后要编译成静态文件合并到后端中去前后端为一整个系统，而前后端在开发时又是两个分开的系统，为了防止axios打包后无法访问后端，就需要配置开发时axios发送到后端的端口<br />如下图<code>vue.confie.js</code>配置前端8000端口，axios访问后端api为8080端口，而打包后前端合并到了后端，那么此时整个系统就是8080端口了<br /><img src="https://i-blog.csdnimg.cn/blog_migrate/e6fe0694c29c50347c30787fb46986f3.png" alt="在这里插入图片描述" /></p><blockquote><p>原来以为前端路由在打包后会出现异常，经过尝试后前端路由正常，也不用写啥了=。=</p></blockquote><blockquote><p>为了实现这个功能参考过一些文章，东凑凑西凑凑，有需要自取哈<br /><a href="https://www.cnblogs.com/LUA123/p/11189069.html" target="_blank">https://www.cnblogs.com/LUA123/p/11189069.html</a><br /><a href="https://github.com/Mysakura/boot-vue-parent" target="_blank">https://github.com/Mysakura/boot-vue-parent</a><br /><a href="https://juejin.cn/post/6978764604142780446" target="_blank">https://juejin.cn/post/6978764604142780446</a><br /><a href="https://juejin.cn/post/6977316219615445022" target="_blank">https://juejin.cn/post/6977316219615445022</a></p></blockquote>]]>
                    </description>
                    <pubDate>Thu, 26 May 2022 10:43:03 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[压缩包方式安装Node.js]]>
                    </title>
                    <link>https://blog.luvying.com/archives/zip-install-node</link>
                    <description>
                            <![CDATA[<blockquote><p>用安装包安装Node.js会不知道它会把各种包什么的装在哪，而用压缩包安装则可以比较好地控制相关文件的位置，不会一股脑地放在C盘，第一次尝试这种方式安装，于是记录一下</p></blockquote><h3 id="%E4%B8%8B%E8%BD%BDnode" tabindex="-1">下载Node</h3><p>官网下载：<a href="https://nodejs.org/zh-cn/download/" target="_blank">https://nodejs.org/zh-cn/download/</a><br />选择<code>Windows Binary(.zip)</code>，根据自己系统选择32还是64位的<br /><img src="https://i-blog.csdnimg.cn/blog_migrate/02b5772e586ee70144cfe894869ac7bd.png" alt="在这里插入图片描述" /><br />下载完成后解压到自己的某个目录</p><h3 id="%E8%AE%BE%E7%BD%AE%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F" tabindex="-1">设置环境变量</h3><p>我解压在了<code>D:\Dev\</code>下，于是乎<br />添加环境变量：</p><pre><code class="language-">NODE_PATH  -----&gt;  D:\Dev\node-v16.14.0-win-x64</code></pre><p>添加Path：</p><pre><code class="language-">%NODE_PATH%%NODE_PATH%\node_modules</code></pre><p>完成后打开CMD，输出版本号则环境变量配置完成</p><pre><code class="language-shell">npm -v</code></pre><h3 id="%E5%85%B6%E4%BB%96%E9%85%8D%E7%BD%AE" tabindex="-1">其他配置</h3><h4 id="%E4%BF%AE%E6%94%B9%E7%BC%93%E5%AD%98%E3%80%81%E5%8C%85%E8%B7%AF%E5%BE%84" tabindex="-1">修改缓存、包路径</h4><p>可以用这个命令查看当前配置</p><pre><code class="language-shell">npm config ls -l</code></pre><p>重点查看<code>cache</code>和<code>prefix</code>这两项如果是C盘的路径，那么就需要修改，否则以后的缓存、下载的包都会往C盘上丢<br />可以通过以下命令修改</p><pre><code class="language-shell"># 设置缓存目录npm config set cache &quot;xxxx&quot;# 设置全局包目录,如果查询配置发现此路径为安装目录,那么就不需要改此项npm config set prefix &quot;xxxx&quot;</code></pre><h4 id="%E4%BF%AE%E6%94%B9%E4%B8%8B%E8%BD%BD%E4%BB%93%E5%BA%93%E9%95%9C%E5%83%8F" tabindex="-1">修改下载仓库镜像</h4><p>修改下载仓库为淘宝镜像</p><pre><code class="language-shell">npm config set registry http://registry.npm.taobao.org/</code></pre><p>安装cnpm，以后安装各种包可以用cnpm代替npm，加快速度</p><pre><code class="language-shell">npm install -g cnpm --registry=https://registry.npm.taobao.org</code></pre>]]>
                    </description>
                    <pubDate>Tue, 22 Mar 2022 20:57:24 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[用Linux Deploy让安卓手机成为Linux服务器]]>
                    </title>
                    <link>https://blog.luvying.com/archives/linux-deploy</link>
                    <description>
                            <![CDATA[<blockquote><ul><li>安卓是基于Linux的，那么是不是可以把安卓手机当服务器用呢？那么我的树莓派是不是可以丢了呢~</li><li>一开始想找直接将Linux系统刷到手机上，不过难度太大了而且据说很难适配，那这条路走不通了</li><li>那么能不能直接从安卓调用底层的Linux呢？通过查找，也不行…</li><li>后来发现了Termux、Linux Deploy、Aid Learning</li><li>经过尝试，Aid Learning感觉好像是用Termux魔改的，增加了很多东西，各方面都挺完善的，但是也因此比较臃肿，手机跑也挺吃力的</li><li>Termux没用尝试过，但是好像说没有Linux Deploy自由度那么大，而Linux Deploy需要root才行，而且据说可以安装Docker，所以最终选了它(emm感觉被忽悠了…docker还是跑不了啊摔…不过除此之外基本上就和树莓派差不多了，而性能甚至更强)</li></ul></blockquote><h3 id="%E5%87%86%E5%A4%87" tabindex="-1">准备</h3><ol><li>手机解锁bootloader（啊华为都关闭解锁通道了，还得花我8块大洋去解锁）</li><li>手机已root（又失去25大洋…）</li><li>下载安装Linux Deploy <a href="https://github.com/meefik/linuxdeploy/releases" target="_blank">https://github.com/meefik/linuxdeploy/releases</a>(我使用的版本是2.6.0-259)</li><li>下载安装Busy Box <a href="https://github.com/meefik/busybox/releases" target="_blank">https://github.com/meefik/busybox/releases</a> (其实这个我觉得没用，因为BusyBox我是安装失败了的，但是linux系统照样跑，但是很多教程都说需要安装，那么就先放上来好了)(安装失败可以在手机上尝试手动创建/system/xbin文件夹)</li></ol><h3 id="%E9%85%8D%E7%BD%AElinux-deploy%E3%80%81%E5%AE%89%E8%A3%85linux%E7%B3%BB%E7%BB%9F" tabindex="-1">配置Linux Deploy、安装Linux系统</h3><p>打开linux deploy，左上角设置，最重要的就是下面两个要勾上，其他的设置可采用默认的<br /><img src="https://i-blog.csdnimg.cn/blog_migrate/f6b8217135bd385b117e5e04d3b92bb4.jpeg" alt="在这里插入图片描述" /><br />然后点右下角配置要安装的linux系统<br /><img src="https://i-blog.csdnimg.cn/blog_migrate/011a2f62575254a547a88916d30044f4.jpeg" alt="在这里插入图片描述" /><br />我这里以Debian为例，现在的手机一般都是arm64的，架构不要选错，不然会出现无法启动、无法ssh等各种奇怪的问题，如果安装出现问题，可以尝试选择其他arm架构进行安装，Debian默认源速度还行，就没有换国内源了<br /><img src="https://i-blog.csdnimg.cn/blog_migrate/6ab34977bc4251623ca99f5f65d5f446.jpeg" alt="在这里插入图片描述" /></p><blockquote><p>安装路径有一定要注意下，默认是<code>${EXTERNAL_STORAGE}/linux.img</code>，也就是外部储存，<code>${ENV_DIR}</code>则代表本机储存，有点坑在这里，因为所谓“内部”和“外部”并不是绝对的，和手机设置的默认储存位置有关，如果手机设置默认储存为本机的话，那么<code>${EXTERNAL_STORAGE}</code>其实代表的是安卓系统文件管理器能看到的目录的地址，<code>${ENV_DIR}</code>代表的是安卓文件系统的内部地址，也就是root之后才能看到的那部分的目录（有点绕啊…）<br />总之我想表达的是，最好使用绝对路径防止路径混乱，而绝对路径是从root之后的根目录算起的</p></blockquote><p>其他的配置根据自己实际情况配置即可，我给他他5G，本地化记得选，防止中文乱码，没选的话也可以进Debian进行配置<br /><img src="https://i-blog.csdnimg.cn/blog_migrate/9f1a2ef28bc436d3fb298e81dfe54eb7.jpeg" alt="在这里插入图片描述" /><br />如果需要挂载sd卡可以勾上挂载，ssh则是必选的<br /><img src="https://i-blog.csdnimg.cn/blog_migrate/24078e33b7ff54bad965c826002406c2.jpeg" alt="在这里插入图片描述" /><br />挂载的路径要根据自己系统实际情况来填，可以用任意可root的文件管理器找到sd卡的实际路径，再复制进去，因为每种手机的路径不一定一样的<br /><img src="https://i-blog.csdnimg.cn/blog_migrate/3673de9adb46f84be5e964f471060456.jpeg" alt="在这里插入图片描述" /><br />其他没提到的如VNC，根据自己需要选即可，并非必须选项</p><blockquote><p>我的建议是，安装的linux系统单纯作为一个运行的容器来用，最好不要储存数据，因为镜像安装后是一个<code>***.img</code>的整体文件。然后把数据文件（如自己的java程序、python脚本等）放在sd卡中并挂载到linux容器中，这样的话，不管以后安装了多少个镜像，都不会影响到数据，比如说有两个镜像，Debian和CentOS，不管启动哪个镜像，都是使用同一个sd卡，不需要重复复制数据文件进linux系统中。</p></blockquote><p>配置完毕后，回退一步，点右上角三个点的地方，安装，等待十几分钟左右，出现<code>&lt;&lt;&lt; deploy</code>代表安装成功，点击一下停止按钮，然后再点击启动<br /><img src="https://i-blog.csdnimg.cn/blog_migrate/26e26c853af4b65e5b7601e22d23e029.jpeg" alt="在这里插入图片描述" /><br />启动成功，注意看界面有没有出现<code>fail</code>的，要留意下，我一开始安装CentOS的时候Starting extra/ssh一直都失败=。=<br />然后就可以用putty、xshell等ssh工具进行连接了。<br />至此linux系统安装成功</p><h3 id="%E5%85%B6%E4%BB%96%E8%AF%B4%E6%98%8E" tabindex="-1">其他说明</h3><ol><li><p>如果想安装CentOS，架构记得选<code>aarch64</code>，现在手机一般都是64位了，一些老的机子可能会是<code>armhfp</code>，我一开始安装CentOS的时候就选了<code>armhfp</code>，结果安装完毕后一堆fail，而且也无法ssh，后来换了<code>aarch64</code>就成功了。<br />默认源是<br /><code>http://mirror.centos.org/altarch/</code><br />可以更换为国内清华源，快很多<br /><code>http://chinanet.mirrors.ustc.edu.cn/centos-altarch/</code></p></li><li><p>如果配置的时候忘记选了本地化，会导致中文无法正常显示，可以根据下面的方式来配置<br />终端输入<br /><code>dpkg-reconfigure locales</code><br />会出现一个表，按空格选中带zh_CN的，然后按TAB选ok，然后需要选一个作为默认，用UTF-8的就好了。因为我没有GUI，所以也没必要再装字体，这样设置中文就不会乱码了<br /><img src="https://i-blog.csdnimg.cn/blog_migrate/75d0b22a67d901b7c502668677bb6448.png" alt="在这里插入图片描述" /><br />3.如果需要安装JDK，可参考树莓派安装JDK的方式，根据自己需要选择32或者64位版本<br /><a href="https://blog.csdn.net/weixin_43909881/article/details/113743082" target="_blank">https://blog.csdn.net/weixin_43909881/article/details/113743082</a><br />现在手机一般都是64位了，如果选错了32位的话java是运行不了的<br />4.如果需要在启动容器时运行程序，而不是每次都要ssh登录手动运行，那么就需要开启初始化，初始化设置中可以设置运行的路径，默认是会运行<code>/etc/rc.local</code><br /><img src="https://i-blog.csdnimg.cn/blog_migrate/fb65a1feeffcc30ac1ea75b43dd86dca.jpeg" alt="在这里插入图片描述" /><br />因此我们需要编辑<code>/etc/rc.local</code>，若没有此文件则需要创建并给权限<code>chmod +777 /etc/rc.local</code><br />先编辑好要运行的脚本，如<code>runxxx.sh</code><br />然后将下面的内容追加到<code>/etc/rc.local</code><br /><code>/bin/bash /xxx/runxxx.sh </code><br />这样每次启动容器后都会自动运行<code>runxxx.sh</code>中的脚本</p></li></ol><h3 id="%E4%B8%80%E4%BA%9B%E9%97%AE%E9%A2%98" tabindex="-1">一些问题</h3><h4 id="%E5%85%B3%E4%BA%8Edocker" tabindex="-1">关于Docker</h4><p>结论：暂无没有解决办法<br />我花了大量时间在折腾Docker，没有Docker还是不太方便<br />尝试了在CentOS用yum安装，也尝试了Debian用apt-get安装，还有通过官方脚本安装，都无法启动docker<br />其中的原因是linux deploy安装的系统是运行在chroot下的，不支持一些命令，最重要的是无法使用<code>systemctl</code></p><pre><code class="language-shell">[root@localhost ~]# systemctl start dockerRunning in chroot, ignoring request.</code></pre><p>用<code>service</code>也不行（行啊你又把球踢到了systemctl去了…）</p><pre><code class="language-shell">[root@localhost ~]# service docker startRedirecting to /bin/systemctl start docker.serviceRunning in chroot, ignoring request.</code></pre><p>找了N多博客，来来去去都是那几篇而且还写得不明不白的=。=<br />后来找到了这个<br /><a href="https://www.cnblogs.com/sw-code/p/14998645.html" target="_blank">https://www.cnblogs.com/sw-code/p/14998645.html</a><br /><a href="https://github.com/smaknsk/servicectl" target="_blank">https://github.com/smaknsk/servicectl</a><br />有个大佬搞了个名为servicectl的来代替systemctl，试了下…<br />docker居然报错说docker不是用systemd来启动的，罢工…<br />没辙了…乖乖直接在linux上部署环境算了…不知道后面有没有办法可以解决</p><h4 id="%E5%85%B3%E4%BA%8E%E6%96%AD%E7%BD%91" tabindex="-1">关于断网</h4><p>结论：暂无没有解决办法<br />容器运行了一段时间（半天或者一天）后，会发现无法通过ssh访问了，然后点亮手机屏幕后又可以访问了，可能是因为手机的能耗策略，把网络关闭了，但是明明把所有能设置的都设置过了，如设置wifi永不断开，linux deploy设置手动管理等，还是无法解决此问题<br />看到过比较简单粗暴的做法就是，屏幕常亮，然后把屏幕颜色设置为黑色并调到亮度最低…（这…本强迫症表示不能忍…）<br />想试试写个脚本定时检测网络状况，断了就手动连上，然而本菜鸡还找不到相关命令，也不知道容器有没有权限去控制手机的wifi=。=<br />于是乎这个问题也只能暂时搁置了…</p><h5 id="%E6%B5%8B%E8%AF%95" tabindex="-1">测试</h5><p>可尝试使用此命令，将会关闭安卓应用层，同时手机会表现为像一块砖，手机未锁屏则界面卡死，手机锁屏则手机怎么按按钮都没有任何反应，但是其实此时我们安装的linux系统是可用的，随时可以用SSH登录<br /><code>unchroot /system/bin/stop</code><br />如果想重新开启安卓，可执行下面的命令<br /><code>unchroot /system/bin/start</code><br />或者长按手机电源键，但是这个时候其实是整个系统重启了，包括我们的Linux Deploy</p><p>因为等于没有屏幕了，所以可以用下面的命令查看电池信息<br /><code>cat /sys/class/power_supply/Battery/capacity</code><br /><code>/power_supply</code>后面的文件夹名不一定是<code>/Battery</code>，根据自己手机实际情况修改<br /><code>cat /sys/class/power_supply/Battery/status</code>可以查看手机是否为充电状态，<code>/Battery</code>中有很多关于电池的参数可以查看</p><p>同样，网络收发数据也能在这里找到，<code>/wlan0</code>根据自己实际情况修改<br />接收数据 <code>cat /sys/class/net/wlan0/statistics/rx_bytes</code><br />发送数据 <code>cat /sys/class/net/wlan0/statistics/tx_bytes</code></p>]]>
                    </description>
                    <pubDate>Mon, 08 Nov 2021 11:04:10 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[jenkins + docker自动化部署maven项目]]>
                    </title>
                    <link>https://blog.luvying.com/archives/jenkins-docker-maven</link>
                    <description>
                            <![CDATA[<blockquote><p>jenkins相关文档 <a href="https://www.jenkins.io/zh/doc/">https://www.jenkins.io/zh/doc/</a></p></blockquote><h3 id="1-相关说明">1 相关说明</h3><p>jenkins安装方式有多种，可以直接安装在服务器上，也可以使用docker拉取jenkins镜像，本文是直接安装到服务器上的方式<br /><a href="/archives/linux-maven">linux安装jenkins及相关配置可参考这里</a><br />一般来说，jenkins自动部署有下面的方式</p><div class="mermaid">graph TBA(代码上传到git)  --&gt; B(jenkins从git拉取代码) B --&gt; C(jenkins在本地编译代码并构建docker镜像)C --&gt; D(将docker镜像上传到docker仓库)D --&gt; E(jenkins远程登陆生产环境的服务器)E --&gt; F(从docker仓库拉取构建的镜像并运行)</div><p>对于我们大部分人来说，实际上很多工作都是在同一台服务器上完成，所以可以简化为下面的这种方式（唔...其实是我还没去摸索远程登陆这个问题=。=）</p><div class="mermaid">graph TBA(代码上传到git)  --&gt; B(jenkins从git拉取代码) B --&gt; C(jenkins在本地编译代码并构建docker镜像)C --&gt; D(remove旧的镜像并运行新镜像)</div><p>嗯看  起  来简单了好多~<br />所以本文将以这种方式进行配置</p><h3 id="2-准备">2 准备</h3><p>1.一台服务器<br />2.已安装配置好docker<br />3.已安装好jenkis并完成初始化<br />4.服务器上已配置好jdk、maven、git环境</p><h3 id="3-配置jdkgitmaven">3 配置jdk、git、maven</h3><h3 id="31-jdk">3.1 JDK</h3><p>直接点击在全局工具配置就可以进行配置了<br /><code>JAVA_HOME</code>是本机JDK地址<br /><img src="https://img-blog.csdnimg.cn/20210627180043910.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwOTg4MQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" /></p><h4 id="32-git">3.2 GIT</h4><p>然后配置git，因为jenkins初始化的时候已经安装git插件，而且我的CentOS自带了git，所以默认就可以，根据自己实际情况配置即可<br /><img src="https://img-blog.csdnimg.cn/20210627180102163.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwOTg4MQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" /></p><h4 id="33-maven">3.3 MAVEN</h4><p>最后是配置maven，同样是根据自己实际maven路径进行配置<br /><img src="https://img-blog.csdnimg.cn/20210627180120883.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwOTg4MQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" /></p><h3 id="4-配置凭据">4 配置凭据</h3><blockquote><p>一般我们的个人项目是私人仓库，所以需要配置凭据让jenkins能够访问到自己的gti仓库</p></blockquote><p>注意，是用左边的那个进行配置，而不是右边的<br /><img src="https://img-blog.csdnimg.cn/588a491f849445ec92273e8d5a610704.png" alt="在这里插入图片描述" /><br />有两种方式，第一种直接用git的账号密码来获取代码<br /><img src="https://img-blog.csdnimg.cn/20210627230922115.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwOTg4MQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" /><br />第二种用SSH私钥和账号获取代码<br />这种方式的安全性比较高，推荐这种方式，但是就比较麻烦<br />在服务器上生成公私钥对，当然也可以用其他软件生成</p><pre><code class="language-shell">ssh-keygen -t rsa</code></pre><p>然后会要输入保存地址，我这里保存在<code>/root/id_rsa</code>，需要保存在其他地方自行更改<br />然后要输入密码，可以为空<br /><img src="https://img-blog.csdnimg.cn/20210627231555470.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwOTg4MQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" /><br />生成完毕后，会产生两个文件<code>id_rsa</code>和<code>id_rsa.pub</code>，带<code>.pub</code>的是公钥，把这个文件的内容复制到git上，我用的是gitee，github也一样<br />因为我只需要jenkins能够拉取代码就够了，所以在仓库上添加公钥，而不是git账户上添加全局的公钥，以保证安全</p><p><img src="https://img-blog.csdnimg.cn/20210627232149511.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwOTg4MQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" /><br />然后在jenkins中输入用户名和私钥，注意类型需要选择SSH的那个<br /><img src="https://img-blog.csdnimg.cn/20210627232547425.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwOTg4MQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" /></p><h3 id="5-构建项目">5 构建项目</h3><p>完成上面步骤后，就可以开始构建项目了</p><p>首先到gitee或者github上复制代码的地址下来，因为我们用的是SSH私钥来拉取代码，所以复制地址的时候记得选择<code>SSH</code><br /><img src="https://img-blog.csdnimg.cn/20210627234944231.png" alt="在这里插入图片描述" /><br />然后新建一个自由风格的项目，进入配置界面<br />输入刚刚的地址，以及选择上一步添加的SSH凭据，jenkins将使用这个凭据去拉取代码<br /><img src="https://img-blog.csdnimg.cn/20210627234836988.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwOTg4MQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" /></p><blockquote><p>如果凭据用的是git的用户名和密码，那么代码URL则选择HTTPS的</p></blockquote><p>构建添加前面配置好了的Maven，并clean和install，<code>-Dmaven.test.skip=true</code>跳过测试<br /><img src="https://img-blog.csdnimg.cn/965773a4630f43a9ad53426639f9b2d1.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP55m96I-c6I-c6I-c6I-c6I-c6I-c6I-c6I-c6I-c6I-c6I-c6I-c,size_13,color_FFFFFF,t_70,g_se,x_16" alt="在这里插入图片描述" /><br />配置完毕后就可以构建看看效果了</p><h3 id="6-加入一点点docker">6 加入一点点docker</h3><p>上面介绍的是最简单的构建maven项目的方式，算是一个hello world了。然而很多时候不仅仅是让jenkins拉一下代码并编译，我们希望能够在jenkins中点一下构建，就能够将git上最新的代码重新部署完毕，所以在maven构建完毕后，执行shell命令来部署我们的代码。</p><h4 id="61-编写dockerfile">6.1 编写Dockerfile</h4><blockquote><p>如果没有使用docker，而直接部署到自己机子上，那么可以跳过这步</p></blockquote><p>java项目的dockerfile可参考下列配置，<code>xxxxxxxxxx-0.0.1-SNAPSHOT.jar</code>的名称根据自己的项目打包后的名字进行修改</p><pre><code class="language-shell">FROM java:8RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \    &amp;&amp; echo 'Asia/Shanghai' &gt; /etc/timezoneCOPY xxxxxxxxxx-0.0.1-SNAPSHOT.jar app.jarENTRYPOINT [&quot;java&quot;,&quot;-jar&quot;,&quot;-Xms256m&quot;,&quot;-Xmx256m&quot;,&quot;/app.jar&quot;]EXPOSE 8080</code></pre><p>一般我喜欢将Dockerfile放在根目录<br /><img src="https://img-blog.csdnimg.cn/c91871a8ae854a64a31e902d6560fe20.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP55m96I-c6I-c6I-c6I-c6I-c6I-c6I-c6I-c6I-c6I-c6I-c6I-c,size_9,color_FFFFFF,t_70,g_se,x_16" alt="在这里插入图片描述" /></p><h4 id="62-jenkins配置shell命令">6.2 jenkins配置shell命令</h4><p>在Maven的后面添加一个执行shell的构建步骤<br /><img src="https://img-blog.csdnimg.cn/6eab16f6ce2843d3a25c1dd0c6dc893c.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP55m96I-c6I-c6I-c6I-c6I-c6I-c6I-c6I-c6I-c6I-c6I-c6I-c,size_4,color_FFFFFF,t_70,g_se,x_16" alt="在这里插入图片描述" /><br />然后在里面写相关shell命令，在maven打包完成后，就会执行这些shell命令<br />我的思路是：<br />1.复制maven打包好的jar包到jenkin的工作目录<br />2.cd到jenkin工作目录，移除正在运行的docker容器和镜像<br />3.构建新的docker镜像并运行<br />4.删除jar包<br />可参考我下面的命令，需要根据自己maven和jenkins实际目录进行修改</p><blockquote><p>因为jenkins拉取代码的时候会将代码保存在他的工作目录中，而dockerfile也会在此目录，且dockerfile的<code>COPY</code>命令是从当前目录来找jar包，所以要把jar包复制过来</p></blockquote><pre><code class="language-shell">cp /usr/local/apache-maven-3.6.3/repository/com/xxxxxxxxxx/0.0.1-SNAPSHOT/xxxxxxxxxx-0.0.1-SNAPSHOT.jar /var/lib/jenkins/workspace/xxxxxxxxxx/xxxxxxxxxx-0.0.1-SNAPSHOT.jar &amp;&amp;cd /var/lib/jenkins/workspace/xxxxxxxxxx/ &amp;&amp;docker rm -f myapp &amp;&amp;docker rmi myapp &amp;&amp;docker build -t myapp . &amp;&amp;docker run -itd --name myapp -m 600m -p 8000:8080 myapp &amp;&amp;rm /var/lib/jenkins/workspace/xxxxxxxxxx/xxxxxxxxxx-0.0.1-SNAPSHOT.jar</code></pre><p><img src="https://img-blog.csdnimg.cn/d75d973c7d5b40c29a76a410b3f91108.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP55m96I-c6I-c6I-c6I-c6I-c6I-c6I-c6I-c6I-c6I-c6I-c6I-c,size_18,color_FFFFFF,t_70,g_se,x_16" alt="在这里插入图片描述" /><br />不出意外的话，就可以成功部署啦~<br />如果不使用docker的话，也可以在shell命令中写自己的部署命令</p><h3 id="后记">后记</h3><p>讲一个小坑，一开始构建的时候，maven在编译到一半的时候总是莫名其妙地退出导致构建失败，找了很久原因，最后发现是系统内存不足...嗯1核2G的云服务器还是有点吃力，况且我的docker中还跑了几个容器，把占内存的容器停了后，终于构建成功了~<br />jenkins还是很强大的，而且有很多丰富的插件，摸索了一段时间才终于成功部署TAT...鉴于本人能力暂时介绍到这里，可能会有一些理解错误的地方，希望dalao们能够给我批评指正~</p>]]>
                    </description>
                    <pubDate>Sat, 11 Sep 2021 18:24:54 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[linux安装maven及配置仓库、镜像]]>
                    </title>
                    <link>https://blog.luvying.com/archives/linux-maven</link>
                    <description>
                            <![CDATA[<blockquote><p>我的系统是CentOS7，其他linux系统类似<br />此处以为maven3.6.3版本为例，若需要安装其他版本记得改下版本号</p></blockquote><h3 id="1下载安装包并解压">1.下载安装包并解压</h3><pre><code class="language-shell">cd /usr/localwget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gztar -zxvf apache-maven-3.6.3-bin.tar.gz</code></pre><h3 id="2配置环境变量">2.配置环境变量</h3><pre><code class="language-shell">nano /etc/profile</code></pre><p>然后在末尾加入</p><pre><code class="language-shell">export MAVEN_HOME=/usr/local/apache-maven-3.6.3export PATH=$MAVEN_HOME/bin:$PATH </code></pre><p>保存退出，然后刷新profile文件</p><pre><code class="language-shell">source /etc/profilemvn -v</code></pre><p>打印出maven 版本号就可以了<br /><img src="https://img-blog.csdnimg.cn/20210627155541136.png" alt="在这里插入图片描述" /></p><h3 id="3配置maven">3.配置maven</h3><p>maven安装成功，接下来要对maven进行配置</p><h4 id="31配置本地仓库地址">3.1配置本地仓库地址</h4><p>创建存放包的文件夹，maven下载的包将会保存在这里<br />记得给仓库文件夹权限，防止jar包保存不了</p><pre><code class="language-shell">cd /usr/local/apache-maven-3.6.3mkdir repositorychmod 777 repository</code></pre><p>修改配置文件</p><pre><code>nano conf/settings.xml </code></pre><p><code>Ctrl + W</code>查找<code>localRepository</code>发现已经是注释掉了的<br /><img src="https://img-blog.csdnimg.cn/20210627160208246.png" alt="在这里插入图片描述" /><br />不管他，我们在后面加上</p><pre><code class="language-xml">&lt;localRepository&gt;/usr/local/apache-maven-3.6.3/repository&lt;/localRepository&gt;</code></pre><p>如图，若需要将仓库放其他地方，记得修改路径<br /><img src="https://img-blog.csdnimg.cn/20210627160254861.png" alt="在这里插入图片描述" /></p><h4 id="32配置阿里镜像仓库">3.2配置阿里镜像仓库</h4><p>国内对maven中央仓库访问比较慢，所以需要配置国内的镜像，我这里使用的是阿里的镜像</p><blockquote><p>阿里maven镜像官网地址：<a href="https://maven.aliyun.com/mvn/guide">https://maven.aliyun.com/mvn/guide</a></p></blockquote><p>还是在刚刚的<code>settings.xml</code>文件中，查找<code>mirror</code>标签，然后加入</p><pre><code class="language-xml">&lt;mirror&gt;  &lt;id&gt;aliyunmaven&lt;/id&gt;  &lt;mirrorOf&gt;*&lt;/mirrorOf&gt;  &lt;name&gt;aliyun maven&lt;/name&gt;  &lt;url&gt;https://maven.aliyun.com/repository/public&lt;/url&gt;&lt;/mirror&gt;</code></pre><p>如下图<br /><img src="https://img-blog.csdnimg.cn/20210627161145289.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwOTg4MQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" /><br />保存，配置完毕</p>]]>
                    </description>
                    <pubDate>Thu, 08 Jul 2021 10:43:06 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[linux安装JDK8]]>
                    </title>
                    <link>https://blog.luvying.com/archives/linux-jdk8</link>
                    <description>
                            <![CDATA[<h3 id="下载安装包并解压">下载安装包并解压</h3><blockquote><p>jdk8u201是oracle最后一个java的免费版本，故安装此版本<br />官网地址：<a href="https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html">https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html</a><br /><a href="https://pan.baidu.com/s/1SbF79AbmXc0N_6BGChsPFA">JDK+JRE 8u201全版本</a> 度盘提取码:4oi8<br />其他开发工具也可以到我的博客中找：<a href="https://blog.luvying.com/archives/development-softwares-tools">https://blog.luvying.com/archives/development-softwares-tools</a></p></blockquote><p>因为系统是64位的，所以下载64位版的JDK<code>jdk-8u201-linux-x64.tar.gz</code></p><p>1.将刚下载的java压缩包放到<code>/usr/lib/jvm</code>下，然后解压</p><pre><code class="language-shell">mkdir /usr/lib/jvmcd /usr/lib/jvmtar -xzvf jdk-8u201-linux-x64.tar.gz</code></pre><h3 id="配置环境变量">配置环境变量</h3><pre><code class="language-shell">nano /etc/profile</code></pre><pre><code class="language-shell">export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_201export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexport PATH=$PATH:$JAVA_HOME/binexport JRE_HOME=$JAVA_HOME/jre</code></pre><p>保存，终端输入</p><pre><code class="language-shell">source /etc/profilejava -version</code></pre><p>打印java版本即可</p>]]>
                    </description>
                    <pubDate>Thu, 08 Jul 2021 10:42:36 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[用docker快速搭建chevereto图床]]>
                    </title>
                    <link>https://blog.luvying.com/archives/docker-chevereto</link>
                    <description>
                            <![CDATA[<blockquote><p>chevereto是一款好用强大的图床，很多小伙伴都有搭建，于是乎，也想搭建一个来玩玩</p></blockquote><h3 id="准备">准备</h3><p>chevereto图床是用php写的，这就意味着要LNMP环境，想想就觉得好烦啊<br />想着有现成的docker镜像就好了，于是乎去<a href="https://hub.docker.com/">dockerhub</a>找找，果不其然，真有</p><p><img src="https://img-blog.csdnimg.cn/2021032116203415.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwOTg4MQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" /><br />经过尝试对比，我最终选择了<code>linuxserver/chevereto</code>这个镜像，主要是简单方便，而<code>nmtan/chevereto</code>这个镜像貌似是官方的(?)，讲的也很详细，不过感觉没有前者方便，就没用上<br />而且前者下面有个tag，arm和arm64，这就意味着在我的树莓派上也可以使用这个镜像的arm版本的</p><blockquote><p>更多详细配置可以去看 linuxserver/chevereto 镜像的说明，地址：<a href="https://hub.docker.com/r/linuxserver/chevereto">https://hub.docker.com/r/linuxserver/chevereto</a></p></blockquote><h3 id="拉取镜像并运行">拉取镜像并运行</h3><h4 id="mysql">MySql</h4><p>chevereto需要用到mysql，如果有数据库了就不需要这一步了<br />还是比较习惯用mysql 5.7版本的，mysql 8容易踩坑啊=。=</p><pre><code class="language-shell">docker pull mysql:5.7</code></pre><p>运行mysql</p><pre><code class="language-shell">docker run -itd --name mysql -p 3306:3306 -v /data/mysql/config:/etc/mysql/conf.d -v /data/mysql/data:/var/lib/mysql -m 500m -e MYSQL_ROOT_PASSWORD=root mysql</code></pre><p>两个<code>-v</code>挂载数据库配置和数据的文件夹，<code>-m</code>限制500m内存使用，<code>-e MYSQL_ROOT_PASSWORD=root</code>配置数据库密码<br />然后用Navicat等工具连接数据库，创建一个名为<code>chevereto</code>的数据库(当然其他名字也可以=。=)<br /><img src="https://img-blog.csdnimg.cn/20210321163523833.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwOTg4MQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" /><br />ok~！</p><h4 id="chevereto">chevereto</h4><p>接下来是chevereto了，首先拉取镜像</p><pre><code class="language-shell">docker pull linuxserver/chevereto</code></pre><p>运行</p><pre><code class="language-shell">docker run -d \  --name=chevereto \  -e PUID=1000 \  -e PGID=1000 \  -e TZ=Asia/Shanghai \  -p 80:80 \  -p 443:443 \  -v /data/chevereto/config:/config \  -v /data/chevereto/data:/data \  -m 150m\  --restart unless-stopped \  linuxserver/chevereto</code></pre><p>然后就可以成功启动了~ 是不是超简单！</p><blockquote><p>稍微解释下，<code>-e PUID=1000</code>和<code>-e PGID=1000</code>指定用户和用户组ID，镜像官方的解释是，在用<code>-v</code>挂载卷的时候，主机操作系统和容器之间可能会出现权限问题，如果出现权限问题，可以指定这两个参数(不过一般情况下这俩不指定也能启动)，<code>-e TZ</code>指定时区，两个<code>-v</code>挂载了配置文件和数据的目录</p></blockquote><p>进入网页，配置数据库<br /><img src="https://img-blog.csdnimg.cn/20210321165000430.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwOTg4MQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" /><br />数据库表会自动创建，然后配置用户信息<br /><img src="https://img-blog.csdnimg.cn/20210321165041343.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwOTg4MQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" /><br />好嘞，搞定~</p><blockquote><p>chevereto图床还是挺好用的，不过免费版少了一些功能，我觉得影响比较大的就是外部储存了，所有文件都只能储存在本机，跑在云服务器上的话，直接访问对带宽压力还是很挺大的，加多一层CDN可能就会好些，不过若访问用户量大，这费用还是有些吃不消的=。=</p></blockquote>]]>
                    </description>
                    <pubDate>Mon, 14 Jun 2021 11:38:47 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[ESP32-CAM搭建Arduino及简单使用]]>
                    </title>
                    <link>https://blog.luvying.com/archives/esp32-cam-arduino</link>
                    <description>
                            <![CDATA[<h3 id="准备">准备</h3><p>需要一个ESP32-CAM模块，我买的是这种，下面带了个下载模块的，接上USB就能用了，很方便，如果没有买下面那个那就得自行用USB-TTL了<br /><img src="https://img-blog.csdnimg.cn/20210321010254842.png" alt="在这里插入图片描述" /></p><h3 id="配置环境">配置环境</h3><blockquote><p>有了硬件，下面就是软件的事情了，Arduino IDE本身没有ESP32或ESP8266的开发板，所以需要自己去安装</p></blockquote><h4 id="方法一-用arduino-ide进行安装">方法一 用Arduino IDE进行安装</h4><p>打开Arduino IDE，找到文件 → 首选项，然后把下面两个链接加上去</p><pre><code>http://wechat.doit.am/package_esp8266com_index.jsonhttps://dl.espressif.com/dl/package_esp32_index.json</code></pre><p>如图所示<br /><img src="https://img-blog.csdnimg.cn/20210320231241908.png" alt="在这里插入图片描述" /><br />然后找到：工具 → 开发板 → 开发板管理器，搜索esp32，这个时候就出现了esp32的板子了<br /><img src="https://img-blog.csdnimg.cn/20210320231030507.png" alt="在这里插入图片描述" /><br />安装速度比较慢，等待安装完毕即可</p><h4 id="方法二-从github下载并安装">方法二 从github下载并安装</h4><p>先到乐鑫的github仓库将所有文件打包下载<br /><a href="https://github.com/espressif/arduino-esp32">https://github.com/espressif/arduino-esp32</a></p><p>到自己的Arduino安装目录下，找到hardware文件夹，建立文件夹espressif，然后在里面再建立一个esp32文件夹<br /><img src="https://img-blog.csdnimg.cn/20210320231607691.png" alt="在这里插入图片描述" /><br />然后把刚刚github下载的文件解压到<code>Arduino安装目录/hardware/espressif/esp32/</code>下<br />确保自己电脑上有python环境，运行<code>get.exe</code>即可<br /><img src="https://img-blog.csdnimg.cn/20210320231850108.png" alt="在这里插入图片描述" /><br />很慢，耐心等待</p><h3 id="程序">程序</h3><blockquote><p>到这里我们就有了ESP32的开发环境了，开始烧写代码</p></blockquote><p>在 工具 → 开发板 可以看到有ESP32的相关板子了，用ESP32 Dev Module或者 ESP32 Wrover Module都可以<br /><img src="https://img-blog.csdnimg.cn/20210320232545742.png" alt="在这里插入图片描述" /><br />然后打开ESP32-CAM的例程<br /><img src="https://img-blog.csdnimg.cn/20210320232436206.png" alt="在这里插入图片描述" /><br />打开后，找到前面一堆<code>#define</code>，把默认的摄像头模块注释掉，解开<code>#define CAMERA_MODEL_AI_THINKER</code>的注释</p><pre><code class="language-c">//#define CAMERA_MODEL_M5STACK_WIDE // Has PSRAM//#define CAMERA_MODEL_M5STACK_ESP32CAM // No PSRAM#define CAMERA_MODEL_AI_THINKER // Has PSRAM//#define CAMERA_MODEL_TTGO_T_JOURNAL // No PSRAM</code></pre><p>然后找到ssid和password输入自己的Wifi名称和密码，就可以尝试编译上传了</p><pre><code class="language-c">const char* ssid = &quot;xxxx&quot;;const char* password = &quot;xxxx&quot;;</code></pre><p>如果上传过程中IDE出现这个报错<br /><img src="https://img-blog.csdnimg.cn/20210320233529305.png" alt="在这里插入图片描述" /></p><p>可以在IDE中把<code>Partition Scheme</code>换成<code>Huge APP</code>，就能够成功编译上传了<br /><img src="https://img-blog.csdnimg.cn/2021032023313556.png" alt="在这里插入图片描述" /><br />烧写成功后，打开串口监视器，波特率设置为115200，重启板子，可以看到板子的ip，浏览器输入ip就能够看到摄像头的图像了<br /><img src="https://img-blog.csdnimg.cn/20210321152931554.png" alt="在这里插入图片描述" /></p><blockquote><p>ESP32-CAM的初步使用就完成了~</p></blockquote><h3 id="小改进">小改进</h3><p>例程是让ESP32去连接Wifi来使用，如果希望ESP32以热点(AP)的形式来连接也是可以的<br />ESP32有三种工作模式：<br />1.连接现有Wifi，即STA模式<br />2.作为热点发射信号，即AP模式<br />3.STA、AP模式共存</p><blockquote><p>更多有关wifi的配置可以参考<a href="https://blog.csdn.net/qq_44629109/article/details/111989323">这里</a>，ESP32和ESP8266的配置方式基本相同</p></blockquote><p>我选择的是第三种模式，在有wifi的时候连接wifi，没有wifi的时候也可以连接热点来使用<br />首先在前面设置连接wifi账号密码下加了个AP的名称和密码</p><pre><code class="language-c">const char* ssid = &quot;xxxx&quot;;const char* password = &quot;xxxx&quot;;const char* AP_ssid = &quot;ESP32_AP&quot;;const char* AP_password = &quot;12345678&quot;;</code></pre><p>然后修改例程代码，然后注释掉原来的<br />连接wifi尝试了六次，还是连不上就放弃了，这个时候就只能用AP进行访问</p><pre><code class="language-c">  WiFi.mode(WIFI_AP_STA);  WiFi.softAP(AP_ssid, AP_password);  Serial.print(&quot;AP IP = &quot; + WiFi.softAPIP());   WiFi.begin(ssid, password);  int i = 0;  while (WiFi.status() != WL_CONNECTED) {      delay(500);      Serial.print(&quot;.&quot;);      if(i == 6){        Serial.println(&quot;\nWiFi connect failed,break...&quot;);        break;      }      i++;  }//    WiFi.begin(ssid, password);//    while (WiFi.status() != WL_CONNECTED) {//      delay(500);//      Serial.print(&quot;.&quot;);//    }//    Serial.println(&quot;&quot;);//    Serial.println(&quot;WiFi connected&quot;);</code></pre><p>AP模式下，客户端连上ESP32后，默认的地址是<code>192.168.4.1</code>，浏览器输入这个地址就能够访问了</p><p>要注意下，ESP32芯片右上角有个天线接口，旁边有个小贴片电阻，如果要使用外接天线，要把那个贴片电阻朝着天线接口焊才能使用外接天线</p>]]>
                    </description>
                    <pubDate>Mon, 12 Apr 2021 22:39:30 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[多级nginx的配置及docker启动]]>
                    </title>
                    <link>https://blog.luvying.com/archives/docker-multi-nginx</link>
                    <description>
                            <![CDATA[<blockquote><p>因为自己的服务器跑了博客、api接口等服务，如：<br />博客：blog.luvying.com<br />api接口：api.luvying.com<br />而像api接口时不时会进行修改，又不希望因为修改api接口而导致博客一时访问不了，于是就有了试试能不能开多个nginx来配置多级nginx的想法</p></blockquote><h3 id="思路">思路</h3><p>大概的思路就是这样，首先开启一个root-nginx，作为服务器的一个大网关，来将请求转发给各个子nginx，然后开启子nginx来将请求转发到各个服务中，这样调试api接口的时候就不会影响到我博客的运行了</p><div class="mermaid">graph LRF(request) --&gt; A(root-nginx:80 443)A(root-nginx:80 443) --&gt; B(blog-nginx:8001) --&gt; G(blog-service)A(root-nginx:80 443) --&gt; C(api-nginx:8002) --&gt; H(api-service1) C(api-nginx:8002) --&gt; K(api-service2) A(root-nginx:80 443)--&gt; D(C-nginx:8003) --&gt; I(C-service)A(root-nginx:80 443) --&gt; E(D-nginx:8004) --&gt; J(D-service)</div><h3 id="实现">实现</h3><h4 id="首先是root-nginx">首先是root-nginx</h4><p>配置转发到各个子nginx<br />我这里展示配置了两个子nginx，blog-nginx和api-nginx，同时配置了SSL证书，如不需要直接listen 80，删去ssl相关配置即可<br />子nginx的server用自己云服务器内网IP就好了，没必要用外网的兜一大圈回来=。=</p><pre><code>upstream blog-nginx{    server 111.111.111.111:8001;  #云服务器内网IP}upstream api-nginx{    server 111.111.111.111:8002;  #云服务器内网IP}server {    #listen 80;    listen 443 ssl;    server_name blog.luvying.com;    # 注意文件位置，是从/etc/nginx/下开始算起的    ssl_certificate conf.d/blog.luvying.com.pem;    ssl_certificate_key conf.d/blog.luvying.com.key;    ssl_session_timeout 5m;    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;    #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;    ssl_prefer_server_ciphers on;    client_max_body_size 1024m;    location / {        proxy_set_header HOST $host;        proxy_set_header X-Forwarded-Proto $scheme;        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        proxy_pass http://blog-nginx;    }}server {    listen 80;    #填写绑定证书的域名    server_name blog.luvying.com;    #把http的域名请求转成https    return 301 https://$host$request_uri; }server {    #listen 80;    listen 443 ssl;    server_name api.luvying.com;    # 注意文件位置，是从/etc/nginx/下开始算起的    ssl_certificate conf.d/api.luvying.com.pem;    ssl_certificate_key conf.d/api.luvying.com.key;    ssl_session_timeout 5m;    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;    ssl_prefer_server_ciphers on;    client_max_body_size 1024m;        location / {        proxy_set_header HOST $host;        proxy_set_header X-Forwarded-Proto $scheme;        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        proxy_set_header referer $http_referer;        proxy_pass http://api-nginx;    }}server {    listen 80;    #填写绑定证书的域名    server_name api.luvying.com;    #把http的域名请求转成https    return 301 https://$host$request_uri;}</code></pre><h4 id="blog-nginx">blog-nginx</h4><p>子nginx就没必要再配置多一次SSL证书了，毕竟也是之间用IP进行转发</p><blockquote><p>可能有人会疑问，为什么这几个配置文件都配置了listen 80，端口不会冲突么？因为我是用docker来启动nginx的，可以进行端口映射，在启动各个nginx的时候将映射到8001、8002...上，如果在一台机器上要同时启动多个nginx的话，就得把子nginx监听端口换成8001、8002...等等，才不会端口冲突</p></blockquote><pre><code>upstream blog{    server 111.111.111.111:8090;  #云服务器内网IP}server {    listen 80;    server_name 111.111.111.111;  #云服务器内网IP        client_max_body_size 1024m;    location / {        proxy_set_header HOST $host;        proxy_set_header X-Forwarded-Proto $scheme;        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        proxy_pass http://blog;    }}</code></pre><h4 id="api-nginx">api-nginx</h4><p>第二个子nginx也同理，直接转发到对应服务即可<br />这里展示了api-nginx将请求转到两个api服务的配置，根据实际情况修改即可</p><pre><code>upstream api1{    server 111.111.111.111:9001;  #云服务器内网IP}upstream api2{    server 111.111.111.111:9002;  #云服务器内网IP}server {    listen 80;    server_name 111.111.111.111;  #云服务器内网IP        client_max_body_size 1024m;    location /api1 {        proxy_set_header HOST $host;        proxy_set_header X-Forwarded-Proto $scheme;        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        proxy_pass http://api1;    }    location /api2 {        proxy_set_header HOST $host;        proxy_set_header X-Forwarded-Proto $scheme;        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        proxy_pass http://api2;    }}</code></pre><p>至此两级的nginx就配置完毕了，如果有需要配置更多级的nginx参照配置继续转发到下一级的nginx即可</p><h3 id="docker启动配置">docker启动配置</h3><p>如果使用了docker，可以参考以下启动命令<br />root-nginx:<br />因为我的配置文件和证书文件放在了系统<code>/data/nginx/conf.d/</code>下，所以多加上了两个<code>-v</code>来映射，根据自己实际情况自行修改即可</p><pre><code>docker run -itd --name root-nginx -p 80:80 -p 443:443 -v /data/nginx/conf.d/root-nginx.conf:/etc/nginx/conf.d/nginx.conf -v /data/nginx/conf.d/cert:/etc/nginx/conf.d -m 50m --restart=always nginx</code></pre><p>blog-nginx:<br />同理，nginx配置文件路径根据自己实际情况自行修改<br />我加上了<code>-m 51m</code>限制nginx内存使用在51m，其实仅仅是为了能够在看<code>docker stats</code>的时候能够通过内存限制知道是哪个容器而已=。=<br />外部端口8001映射到容器内80端口</p><pre><code>docker run -itd --name blog-nginx -p 8001:80 -v /data/nginx/conf.d/blog-nginx.conf:/etc/nginx/conf.d/nginx.conf -m 51m --restart=always nginx</code></pre><p>api-nginx:</p><pre><code>docker run -itd --name api-nginx -p 8002:80 -v /data/nginx/conf.d/api-nginx.conf:/etc/nginx/conf.d/nginx.conf -m 52m --restart=always nginx</code></pre><h3 id="后记">后记</h3><p>当然，对于不需要频繁修改配置的服务，比如博客，完全可以在<code>root-nginx</code>中直接进行转发，不需要再启动多一个<code>blog-nginx</code>(不过启动多一个nginx也就多用十几M的内存而已=。=)<br />如果需要其他子域名，也还是不可避免地要在<code>root-nginx</code>中添加相应的配置并重启，随着子域名的增加，要启动的子nginx也会增多，那么也可以对子nginx进行分组，比如分为两组：</p><ul><li>稳定不需要频繁改配置的</li><li>暂时不稳定需要经常修改配置的</li></ul><p>然后在<code>root-nginx</code>配置中的<code>server_name</code>将他们合并，如：<code>server_name blog.luvying.com A.luvying.com B.luvying.com;</code>，然后需要经常修改配置的几个域名也放在一块，这样就只需要启动三个nginx了：<br /><code>root-nginx</code>、<code>stable-nginx</code>和<code>unstable-nginx</code></p><p>这是本菜鸡为了解决因为要经尝修改配置而重启nginx且不希望影响其他服务的处理办法，如果有dalao有更好的方法，欢迎和我交流~</p>]]>
                    </description>
                    <pubDate>Sun, 21 Mar 2021 17:18:39 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[nginx设置密码限制路径访问]]>
                    </title>
                    <link>https://blog.luvying.com/archives/nginx-auth-basic</link>
                    <description>
                            <![CDATA[<blockquote><p>很多时候我们希望nginx代理的时候可以限制某些路径只能够我们自己访问，而不是全部开放给别人，所以就可以通过nginx自带的auth_basic来设置<br />除了auth_basic，nginx还支持其他第三方的认证插件，本文仅使用auth_basic</p></blockquote><h3 id="生成密码文件">生成密码文件</h3><p>首先需要生成密码文件，网上有不少教程是使用htpasswd，但因为我使用的是centOS，自带了openssl，所以用openssl来生成密码文件，htpasswd类似</p><pre><code>cd /xx/nginx/conf.decho -n &quot;username:&quot; &gt;&gt; passwdopenssl passwd 123456 &gt;&gt; passwd</code></pre><p>生成完毕后，就可以配置nginx了</p><h3 id="配置nginx">配置nginx</h3><p>我希望路径带private的全部需要密码访问，不管是<code>http://www.xxx.com/a/b/private/c.html</code>还是<code>http://www.xxx.com/private</code>通通拦住，所以<code>location</code>直接配置为<code>private</code>，有其他匹配要求的可以参考nginx正则表达式的匹配规则</p><pre><code class="language-shell">server {    listen 80;    server_name www.xxx.com;    client_max_body_size 1024m;    location ~ private {        #autoindex on;        #autoindex_exact_size off;        #autoindex_localtime on;        auth_basic &quot;Please input password&quot;;    # 引号内容为输入密码的提示，可自行修改        auth_basic_user_file conf.d/passwd;    # 这里的路径是刚刚生成的密码文件的位置        proxy_pass http://xxx.xxx.xx:8080;    }    location / {        proxy_set_header HOST $host;        proxy_set_header X-Forwarded-Proto $scheme;        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        proxy_pass http://xxx.xxx.xx:8080;    }</code></pre><p>可以看到，这三个被我注释掉了，如果需要让nginx代理的是文件，那么可以打开这三个，用浏览器访问的时候将呈现出一个目录的形式</p><pre><code>        #autoindex on;        #autoindex_exact_size off;        #autoindex_localtime on;</code></pre><p>本例是让nginx代理转发到另一个服务，所以就全部注释掉了，如果输入密码正确才允许访问带<code>private</code>路径的资源<br />下面的<code>location /</code>代表全部放过，所以这个配置就实现了，只有路径带<code>private</code>需要密码访问，其余放过</p><h3 id="效果">效果</h3><p><img src="https://img-blog.csdnimg.cn/20210211163323943.png" alt="在这里插入图片描述" /><br />其中要注意的是，密码输入正确之后，浏览器之后的请求都会带上认证信息一段时间，也就是说验证成功后带<code>private</code>的路径都可以直接访问，不需要每次都输入密码（失效时间暂不清楚=。=经测试大概一天左右才需要重新输入密码）</p><blockquote><p>一开始不知道，测试的时候老是以为怎么这auth_basic配置了无效？重启了很多次nginx还是可以直接访问限制的路径，后来才发现，只要passwd文件没改动，浏览器就会一直帮我带上认证信息=。=所以测试的时候可以使用多个浏览器，或者修改passwd文件来进行=。=</p></blockquote>]]>
                    </description>
                    <pubDate>Mon, 15 Mar 2021 22:26:24 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[【树莓派】部署JAVA环境(ARM32位的JDK8)]]>
                    </title>
                    <link>https://blog.luvying.com/archives/raspberry-arm32-jdk8</link>
                    <description>
                            <![CDATA[<h3 id="准备">准备</h3><p>1.首先需要一块树莓派，我使用的是树莓派3B+，其他版本类似<br />2.我的树莓派安装的是Raspbian buster lite 版的，目前官方提供的只有32位的，若安装其他64位系统请选择64位的JDK</p><h3 id="下载arm版的jdk8">下载ARM版的JDK8</h3><p>我把ARM版的JDK8放到了蓝奏云，根据自己系统的位数来选择相应版本</p><pre><code>https://luvying.lanzous.com/b01tykbxe密码:3djf</code></pre><p>我的系统是32位的，所以下载了<code>jdk-8u201-linux-arm32-vfp-hflt.tar.gz</code></p><h3 id="解压安装">解压、安装</h3><p>1.将刚下载的java压缩包放到<code>/usr/lib/jvm</code>下，然后解压</p><pre><code class="language-shell">tar -xzvf jdk-8u201-linux-arm32-vfp-hflt.tar.gz </code></pre><p>2.配置环境变量</p><pre><code class="language-shell">nano /etc/profile</code></pre><blockquote><p>也可以<code>nano ~/.bashrc</code>，但是修改<code>~/.bashrc</code>则仅作用于当前用户，而修改<code>/etc/profile</code>则作用于全局，对所有用户都生效</p></blockquote><pre><code class="language-shell">export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_201export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/libexport PATH=${JAVA_HOME}/bin:$PATHexport JRE_HOME=${JAVA_HOME}/jre# 或者export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_201export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexport PATH=$PATH:$JAVA_HOME/binexport JRE_HOME=$JAVA_HOME/jre</code></pre><p>保存，终端输入</p><pre><code class="language-shell">source /etc/profilejava -version</code></pre><p>打印java版本即可</p>]]>
                    </description>
                    <pubDate>Thu, 11 Mar 2021 22:15:47 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[python同步系统时间]]>
                    </title>
                    <link>https://blog.luvying.com/archives/python-time-sync</link>
                    <description>
                            <![CDATA[<blockquote><p>公司的电脑比较老旧，主板上的电池也没电了，每天都得手动调时间，自动同步也因为日期每天都被重置了而无法同步ntp服务器，想拆开换电池发现机箱也打开不了，emmm...=。=<br />无奈之下，自己做一个同步时间的脚本吧，然后用bat运行，加入开机启动项每天开机自动同步下时间就可以了</p></blockquote><h3 id="updatetimepy">updateTime.py</h3><p>因为不清楚NTP服务器的相关协议，网上找到的NTP服务器地址也不会使用，只好用比较笨的办法，找到一个能够提供当前时间的网站，爬下来，提取出时间的信息，再修改系统的时间<br />我用的是这个网站提供的时间<a href="http://time.tianqi.com/">http://time.tianqi.com/</a>，python代码如下：</p><pre><code class="language-python">import osimport urllib.request import re### ====================处理编码问题====================#import sys#import io#sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030') ### ====================处理编码问题====================url = &quot;http://time.tianqi.com/&quot;opener = urllib.request.build_opener()opener.addheaders = [('User-agent', 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6')]def getInformation(url):       wp = opener.open( url )     ch = wp.read().decode('utf-8')    return chdef getMonth(str):return {        &quot;Jan&quot;:1,        &quot;Feb&quot;:2,        &quot;Mar&quot;:3,        &quot;Apr&quot;:4,        &quot;May&quot;:5,        &quot;Jun&quot;:6,        &quot;Jul&quot;:7,        &quot;Aug&quot;:8,        &quot;Sep&quot;:9,        &quot;Oct&quot;:10,        &quot;Nov&quot;:11,        &quot;Dec&quot;:12,}.get(str,&quot;error&quot;)def setTime():    ch = get_getInformation( url );    timeStr = re.search(r'&lt;p id=&quot;times&quot;&gt;.*&lt;/p&gt;', ch).group()    timeStr = re.search(r'&gt;.*&lt;', timeStr).group()    numPattern = re.compile(r'\d+')   # 查找数字    StrPattern = re.compile(r'\S+')   # 查找字符串    result = numPattern.findall(timeStr)    print(timeStr)    hour = result[2]    minute = result[3]    second = result[4]    year = result[1]    month = getMonth(StrPattern.findall(timeStr)[2])    date = result[0]    os.system(&quot;date %d-%d-%d&quot; % ( int(year) , int(month) , int(date)) )    os.system(&quot;time %d:%d:%d.0&quot; % ( int(hour) , int(minute) ,int(second)) )    if __name__ == '__main__':    print(&quot;--------------------begin update time--------------------&quot;)    setTime()    print(&quot;--------------------update time success--------------------&quot;)</code></pre><h3 id="updatetimebat">updateTime.bat</h3><p>创建updateTime.bat，运行就可以直接更新时间</p><pre><code>@echo offpython updateTime.py# pause</code></pre><h3 id="设置为开机启动项">设置为开机启动项</h3><p>不同系统有不同的设置方式，这里就不详细展开了，把updateTime.bat加到开机启动项就可以了</p>]]>
                    </description>
                    <pubDate>Fri, 26 Feb 2021 11:38:51 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[一款酷酷的Linux系统实时监测工具：Netdata的安装与使用]]>
                    </title>
                    <link>https://blog.luvying.com/archives/linux-monitor-netdata</link>
                    <description>
                            <![CDATA[<blockquote><ul><li>有时候在网上看到别人的博客有自己的服务器监控，手痒痒，找了并尝试下，发现这款监控工具：Netdata，比较小巧且占用资源不多，因此记录下</li><li>本文尝试了两种方式，直接安装到系统上并直接运行以及拉取镜像在docker中运行</li></ul></blockquote><h3 id="准备">准备</h3><p>1.linux服务器或虚拟机，我使用的是CentOS 7<br />2.如果想部署再docker中则需要事先安装好docker</p><h3 id="方式一直接安装到系统上">方式一：直接安装到系统上</h3><p>首先安装Netdata需要的基本环境</p><pre><code class="language-shell">yum install zlib-devel gcc make git autoconf autogen automake pkgconfig</code></pre><p>然后下载netdata并解压、运行</p><pre><code class="language-shell">cd /usr/local/src/wget http://firehol.org/download/netdata/releases/v1.0.0/netdata-1.0.0.tar.gztar -xf netdata-1.0.0.tar.gzcd netdata-1.0.0./netdata-installer.sh  </code></pre><p>访问<code>http://IP:19999</code>就可以了，是不是很简单~</p><pre><code class="language-shell">#Netdata启动和关闭的命令（CentOS）#启动Netdata/usr/sbin/netdata#关闭Netdatakillall netdata</code></pre><h3 id="方式二docker中安装netdata">方式二：Docker中安装Netdata</h3><p>首先要拉取镜像</p><pre><code class="language-shell">docker pull titpetric/netdata</code></pre><blockquote><p>可能会下载到一半停住不动了，Ctrl + C终止再重新执行多几次就可以了</p></blockquote><p>成功拉取后就可以直接运行了</p><pre><code class="language-shell">docker run -d --cap-add SYS_PTRACE -v /proc:/host/proc:ro  -v /sys:/host/sys:ro  -p 19999:19999 --name netdata -m 100m titpetric/netdata</code></pre><p>使用<code>docker stats</code>查看容器的CPU和内存占用情况，可以看到刚启动的时候CPU占用非常高，几乎100%了，但是过一会启动完成后，基本上保持在2%到4%之间（1核2G的云服务器），而且内存占用比较小，不到50m，因此我上面<code>docker run</code>也加上了限制100m内存的使用<br /><img src="https://img-blog.csdnimg.cn/20210119222032620.png" alt="在这里插入图片描述" /></p><h3 id="后记">后记</h3><p>通过Top命令以及对比云服务器的监控，Netdata其实对系统负担也并不大，内存占用也比较小，最重要的是对网络带宽的使用也不高，算是很良心了<br /><img src="https://img-blog.csdnimg.cn/20210119222556733.png" alt="在这里插入图片描述" /><br />页面也很精美，展示的信息非常的多，不过美中不足的是它没有相关认证模块，也就是说只要我的服务启动了任何人都能够访问，我无法控制未认证（未登录）用户能够看到的内容，即给其他人展示我想展示的信息，我自己可以看到所有的监控信息，如果官方能加上这个登陆认证那就太好了</p>]]>
                    </description>
                    <pubDate>Tue, 19 Jan 2021 22:40:37 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[记一次个人博客被刷恶意评论的分析与解决]]>
                    </title>
                    <link>https://blog.luvying.com/archives/halo-evil-comments</link>
                    <description>
                            <![CDATA[<h3 id="前言">前言</h3><p>近期我的博客出现了恶意刷评论的情况，打开halo后台，最过分的时候刷了近两百页的评论，连带着每一个评论发送的一千多封邮件...</p><p><img src="https://img-blog.csdnimg.cn/20201111220851930.png" alt="在这里插入图片描述" /></p><p>几页评论还好，几百页要删评论还是很痛苦的...所以只能进数据库删除了<br />首先暂时关闭了评论接口，但是总不能一直关闭评论啊，更不能让恶意评论那么猖狂时不时给我来一下，而且还得去数据库删，太费劲了，那就想想办法</p><h3 id="分析">分析</h3><p>数据库的评论表记录了评论人的相关信息，比如名字，邮箱地址，网址， ip等信息，但是并没有什么用，像名字，邮箱地址，网址，既然是刷恶意评论，那么肯定填的是垃圾信息，邮箱给我填了halo官方邮箱，评论内容全都填写了halo再github上的某issues(和halo有多大仇啊这...)，然后看看ip吧，数据库group by看看，嗯果然没啥用，全都是代理ip，并看不出攻击者的任何信息，其他字段就更别说了，没用</p><p>下面是数据库查到的恶意评论ip(部分)</p><pre><code>77.247.181.16223.129.64.21131.220.0.202185.121.69.1651.83.129.8431.220.40.239176.10.99.20031.220.40.23751.178.48.24851.38.64.136104.244.76.1323.129.64.191199.195.250.77178.20.55.1651.210.243.17351.210.242.130185.220.102.248185.220.102.247185.220.101.202185.220.101.8185.220.101.205185.220.102.250185.220.100.252185.220.102.251185.220.100.255</code></pre><p>后来发现了一个比较特别的字段，user agent，一般是浏览器请求的时候带过来的，但是攻击者的UA很奇怪</p><p><img src="https://img-blog.csdnimg.cn/20201111220945177.png" alt="在这里插入图片描述" /></p><p>嗯？<code>bilibili security browser</code>???什么鬼？？？b站啥时候有浏览器了？百度下，只是查到的是bilibili安全挑战赛的内容=。=</p><p>一般正常的UA都是<code>Mozilla</code>开头的UA，比如<code>Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36</code></p><p>虽然不清楚攻击者为啥要填这个，但起码也是区分攻击者的一个方式，暂且这么干吧</p><h3 id="尝试解决">尝试解决</h3><h4 id="method1">method1</h4><p>既然能够通过UA区分攻击者身份，那么我就可以根据UA判断攻击者并拒绝访问就可以了，因为我用了Nginx，那么是不是可以在nginx中进行判断呢？<br />查了下，找到一篇<a href="https://www.cnblogs.com/hh2737/p/6784864.html">文章</a>，依样画葫芦，在server层加上</p><p><img src="https://img-blog.csdnimg.cn/2020111122185943.png" alt="在这里插入图片描述" /></p><p>匹配UA为<code>bilibili security browser</code>的用户，直接给他403拒绝掉</p><p>暂且这么办，毕竟硬编码不太好，万一攻击者发现了改了UA就不行了，后面再看看有没用更好方式</p><h4 id="method2">method2</h4><p>同时，在CDN中我也加入了访问评论接口访问频率的限制，超过一定阈值，也就是一个时间段内评论次数过多也直接拒绝访问，双管齐下</p><p><img src="https://img-blog.csdnimg.cn/20201114170221976.png" alt="在这里插入图片描述" /></p><h3 id="method3">method3</h3><p>halo允许后台设置评论经过审核后才能够显示，那么就开启评论审核，起码不至于恶意评论直接就刷到了前台，影响正常用户的观感</p><h3 id="后记">后记</h3><p>维护自己的小站时不时还是会遭到各种奇奇怪怪的攻击，对于网络安全还是得多加学习才行，这次的恶意刷评论的情况，我也不清楚是否有效，得尝试一段时间看看，时不时来这么一下还是挺影响心情的，最后也希望各位大佬们对小站高抬贵手哈哈</p>]]>
                    </description>
                    <pubDate>Sat, 14 Nov 2020 17:12:25 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[给首页加上图片随鼠标移动的“视差”效果]]>
                    </title>
                    <link>https://blog.luvying.com/archives/js-parallax-style</link>
                    <description>
                            <![CDATA[<blockquote><p><del>咕咕咕太久了得水一篇才行了...</del><br />之前就很想给封面做这个随着鼠标移动的“视差”效果，一直没空弄，今天心血来潮就尝试下~<br />代码之前不知道在哪里扒过来的=。= 然后一直存着，今天拿过来改了改，感觉效果还是不错滴~</p></blockquote><div style="display:none">### 效果效果如下~ 看起来不错吧~<div class="my-bg" style="height: 50vh;background-image:url(https://yingserver.cn/open/acgimg/acgurl.php);background-size: cover;"></div></div><h3 id="代码示例">代码示例</h3><p><strong>HTML代码</strong></p><pre><code class="language-html">&lt;div class=&quot;my-bg&quot; style=&quot;height: 50vh;background-image:url(https://yingserver.cn/open/acgimg/acgurl.php);background-size: cover;&quot;&gt;&lt;/div&gt;</code></pre><p><strong>js代码</strong><br />还是比较简单易懂的，主要就是不停地监听鼠标位置并且修改backgroundPosition来实现的</p><pre><code class="language-js">// background根据自己实际情况选取var background = document.getElementsByClassName(&quot;my-bg&quot;)[0];var range = 40;var calcValue = function calcValue(a, b) {return (a / b * range - range / 2).toFixed(1);};var timeout = void 0;document.addEventListener('mousemove',function(_ref) {var x = _ref.x,y = _ref.y;if (timeout) {window.cancelAnimationFrame(timeout);}timeout = window.requestAnimationFrame(function() {var yValue = calcValue(y, window.innerHeight);var xValue = calcValue(x, window.innerWidth);console.log(xValue, yValue);                // xValue和yValue可以根据实际情况调,我这里y-50了background.style.backgroundPosition = xValue * .45 + &quot;px &quot; + (-yValue * .45 - 50) + &quot;px&quot;;})},false);</code></pre><h3 id="改进求助">改进(求助)</h3><p>1.发现没有，当鼠标挪到div边缘的时候，另一边的图片已经过界出现重复的图了，想解决的话，目前只想到两个办法：一是缩放图片，放大一点点，但是background-size我设置了cover，也不想改成别的，似乎没法改；二是不知道能不能把图片边缘模糊化，如<code>box-shadow:0 0 50px 30px #ffffff inset;</code>但是效果不太好...本菜鸡表示很难受...<br />2.可能是pajx的原因，第一次进入首页的时候是没问题的，但是浏览了其他页面，再跳转回首页的时候，又失效了...<br />有知道的大佬希望能够指教指教~</p><script>var background = document.getElementsByClassName("my-bg")[0];var range = 40;var calcValue = function calcValue(a, b) {return (a / b * range - range / 2).toFixed(1);};var timeout = void 0;document.addEventListener('mousemove',function(_ref) {var x = _ref.x,y = _ref.y;if (timeout) {window.cancelAnimationFrame(timeout);}timeout = window.requestAnimationFrame(function() {var yValue = calcValue(y, window.innerHeight);var xValue = calcValue(x, window.innerWidth);console.log(xValue, yValue);background.style.backgroundPosition = xValue * .45 + "px " + (-yValue * .45 - 50) + "px";})},false);</script>]]>
                    </description>
                    <pubDate>Thu, 17 Sep 2020 09:58:20 CST</pubDate>
                </item>
    </channel>
</rss>