Category: 技术折腾

服务器、网络、硬件与自建工具的实践记录。

  • 树莓派4运行安卓系统:详细安装教程

    树莓派4运行安卓系统:详细安装教程

    在DIY技术和自制项目领域,树莓派(Raspberry Pi)一直是一个标志性的存在。从学生到工程师,从爱好者到专业开发者,树莓派以其小巧的体积和强大的性能赢得了广泛的赞誉。而树莓派4作为最新一代的产品,其性能更是得到了大幅度的提升。然而,一个常见的问题是,尽管Linux系统在树莓派上运行得很好,但许多人还是对在这个小小的板子上运行安卓系统充满好奇。因此,本教程将引导你详细了解如何在树莓派4上安装安卓系统,开启一段全新的探索之旅。

    开篇故事

    三年前,小李是一位电子爱好者,对于树莓派的热情从未减退。一次偶然的机会,他在一个技术论坛上看到有人成功在树莓派上运行安卓系统。这让他眼前一亮,因为这意味着他可以利用树莓派4的强大硬件,制作一个便宜且自定义程度极高的安卓平板电脑。经过反复的尝试和学习,小李终于掌握了整个安装过程,而现在,这份经验将通过本教程分享给每一个对此感兴趣的朋友。

    准备工作

    在开始安装前,你需要做好准备。以下是必须的物品清单:

    • 树莓派4主板:任意版本均可。
    • Micro SD卡:建议容量不小于16GB,速度等级Class 10以上。
    • 电源适配器:建议使用5V/3A USB-C电源适配器确保稳定供电。
    • HDMI显示器及线缆:用于连接树莓派进行显示输出。
    • USB键盘和鼠标:进行操作输入。
    • 安卓系统镜像:推荐使用LineageOS或其他适配的安卓版本。

    下载安卓系统镜像

    1. 选择系统版本:访问LineageOS官网或其他信誉良好的第三方网站,选择适配树莓派4的安卓版本。
    2. 下载镜像:根据指示下载系统镜像文件到你的电脑上。

    将安卓系统写入SD卡

    1. 准备写入工具:下载并安装镜像写入工具,如Etcher。
    2. 写入镜像:使用Etcher选择下载好的安卓镜像文件,并选择你的SD卡作为目标,点击“Flash”开始写入。

    安装过程

    一旦SD卡准备好,就可以开始安装过程了。

    启动树莓派

    1. 插入SD卡:将写有安卓系统的SD卡插入树莓派。
    2. 连接外设:连接HDMI显示器、键盘和鼠标。
    3. 连接电源:插入电源适配器,树莓派将自动开机并从SD卡引导。

    安装向导

    1. 屏幕操作:树莓派将显示安卓系统的安装向导界面。
    2. 设置过程:遵循

    屏幕上的指示,完成语言、网络、日期和时间等设置。

    配置安卓系统

    安装完毕后,你可以进一步配置系统以满足个人需要。

    个性化设置

    1. 登录账户:如果需要,可以登录Google账号,获取Play商店等服务。
    2. 安装应用:通过Play商店或APK文件安装所需应用程序。
    3. 优化体验:在设置中调整显示效果、声音选项和电源管理等。

    结语

    经过上述步骤,树莓派4上的安卓系统应该已经成功安装并可以正常使用了。这个过程不仅为技术爱好者提供了一个新的玩耍平台,也为软件开发者提供了一个低成本的测试环境。树莓派4运行安卓系统,你的想象是它的极限。

  • WordPress REST API严重漏洞入侵检测报告

    WordPress REST API严重漏洞入侵检测报告

    在当今数字化的世界里,随着虚拟货币的兴起和网络技术的不断发展,网站安全问题变得愈加严峻。恶意黑客们总是在寻找各种漏洞,试图入侵网站并获得不正当利益。最近,我们的安全团队发现了一个令人震惊的入侵事件,涉及到全球最流行的网站建设平台之一,WordPress。这次事件的背后是一个严重的漏洞,黑客们不仅仅获取了用户信息,还发布了虚假广告,给无辜用户带来了极大的困扰。

    WordPress REST API:一个潜在的漏洞源泉

    要理解这次入侵事件,首先需要了解WordPress REST API。这个API是WordPress提供的一种方式,允许开发者通过HTTP请求来访问和与WordPress站点交互。它的设计初衷是为了方便开发者创建和管理内容,但正是这个强大的工具,也成为了黑客们潜在的攻击目标。

    漏洞详情:黑客的手段

    1. 获取用户信息漏洞

    黑客们利用WordPress REST API的一个漏洞,成功获取了用户的个人信息。这包括用户名、电子邮件地址等敏感信息。这个问题的严重性不言而喻,用户隐私受到了极大的威胁。

    2. 检查写作角色漏洞

    另一个漏洞使黑客们能够检查用户的写作权限。这意味着黑客可以确定哪些用户具有写作和编辑博客的权限,从而有可能滥用这些权限发布虚假信息或破坏网站内容的完整性。

    3. 请求新的直接消息漏洞

    黑客们还能够通过WordPress REST API请求新的直接消息(Dmsg)。虽然这可能看起来不太危险,但它仍然涉及到对用户私密信息的访问,可能导致不良后果。

    黑客的行动:入侵事件回顾

    通过分析服务器日志,我们可以追踪黑客们的一系列行动。这些恶意行为令人震惊,涉及到了多种攻击手段:

    1. 发布虚假广告

    黑客们成功地利用漏洞在网站上发布了大量虚假广告。这不仅会误导用户,还可能对网站的声誉造成严重损害。

    2. 访问不存在的页面

    黑客们还尝试访问不存在的页面,可能是为了寻找其他漏洞或获取进一步的访问权限。

    3. 访问OAuth链接

    一些IP地址成功访问了OAuth链接,这可能是黑客们试图获取OAuth认证链接,以便继续其攻击。

    4. 尝试获取JWT令牌

    另一组IP地址尝试通过获取JWT令牌来扩大其访问权限,但遭到了403错误的阻拦。

    5. 访问最新公告

    多个IP地址成功访问了网站的最新公告,这表明黑客们可能在寻找关键信息或寻找潜在的攻击目标。

    6. 尝试插入帖子

    某些IP地址尝试插入新的帖子,但被服务器阻止,这表明他们试图改变网站内容。

    7. 访问验证码

    黑客们还成功地访问了验证码生成页面,这可能与进一步的攻击计划有关。

    8. 访问写作页面

    一些IP地址访问了写作和编辑页面,这可能意味着黑客们试图直接编辑网站内容。

    9. 检查用户写作角色

    多个IP地址检查了用户的写作角色,可能是为了确定哪些用户具有写作权限。

    10. 获取用户信息

    某个IP地址成功获取了用户信息,这可能会对用户的隐私造成严重威胁。

    11. 获取新的直接消息

    最后,某个IP地址还成功获取了新的直接消息,这可能会导致用户私密信息的泄露。

    解决方案:加强安全措施

    面对这次恶意入侵事件,我们必须采取紧急措施来保护网站和用户的安全。以下是一些建议:

    1. 禁用WordPress REST API

    由于REST API的漏洞是黑客们入侵的主要途径之一,我们建议立即禁用WordPress REST API,以阻止未经授权的访问。

    2. 及时修补漏洞

    WordPress社区通常会定期发布安全更新,修复已知的漏洞。请确保及时更新您的WordPress网站,以保持安全性。

    3. 强化访问控制

    采取额外的安全措施,如增强访问控制、使用强密码和多因素身份验证,以减少潜在的入侵风险。

    4. 定期审查日志

    定期审查服务器日志,以便及时发现异常活动并采取相应措施。

    5. 安全培训

    对您的网站管理员和用户进行安全培训,以提高他们的安全意识和应对能力。

    恶意入侵事件是一个不断演化的威胁,但只要采取适当的安全措施,我们就可以减少风险并保护我们的网站和用户的安全。

    此次事件再次提醒我们,安全永远是第一位的。我们必须时刻保持警惕,不断学习和适应新的威胁,以确保我们的网站和数据安全无虞。

  • DNSPod支持的IPv6 DDNS项目:NAS DDNS IPv6完整教程与配置指南

    DNSPod支持的IPv6 DDNS项目:NAS DDNS IPv6完整教程与配置指南

    在数字化时代,我们的家庭和企业网络不仅需要更快的速度,还需要更可靠的连接。IPv6是解决IPv4地址耗尽问题的未来之路,而动态域名系统(DDNS)则为我们提供了灵活性,确保我们的域名一直指向正确的IP地址。在这个背景下,配置IPv6 DDNS在网络附加存储(NAS)上变得越来越重要。本文将详细介绍如何使用DNSPod服务在NAS上配置IPv6 DDNS,确保您的网络始终稳定可用。

    一、故事开篇:网络不稳定的困扰

    想象一下,您正在办公室远程办公,或者在家里享受高清视频流。突然,网络连接中断了。您尝试重新连接,但问题依然存在。这个情况可能会持续很长时间,让您感到沮丧。网络不稳定可能是因为您的IPv6地址发生了变化,但您的域名解析仍然指向旧地址。

    这种问题可能会导致数据传输中断,影响工作效率,甚至破坏娱乐体验。然而,通过配置IPv6 DDNS,您可以轻松解决这个问题,确保您的域名随着IPv6地址的变化而同步更新。

    二、所需工具与环境

    在开始配置IPv6 DDNS之前,您需要准备以下工具和环境:

    • NAS设备:确保您的NAS设备具备Internet访问能力。
    • DNSPod账户:用于域名解析,如果没有账户,可以在DNSPod官网注册一个。
    • ddns-go项目:这是一个开源DDNS客户端,支持DNSPod,可以从ddns-go GitHub页面下载并安装适合您NAS操作系统的版本。
    • IPv6连接:确保您的网络环境支持IPv6。

    三、安装与配置ddns-go

    1. 下载与安装

    首先,从ddns-go的GitHub页面下载适用于您NAS操作系统的版本。确保您选择了最新的稳定版本,并按照说明进行安装。

    2. 配置DNS服务商

    启动ddns-go后,进入Web界面,在DNS服务商选项中选择DNSPod,并输入您的API密钥和域名信息。这将确保ddns-go可以与DNSPod服务进行通信,以更新IPv6地址。

    3. 启用IPv6支持

    在ddns-go的设置中,确保启用了IPv6支持。这是确保IPv6地址可以正确解析的关键步骤。如果您使用Docker运行ddns-go,请使用--net=host模式以确保正确的网络访问。

    4. 设置解析间隔

    根据您的需求,设置域名解析的同步间隔。默认情况下,ddns-go每隔5分钟同步一次,但您可以根据需要进行调整。

    四、启动与验证

    1. 启动服务

    保存配置并启动ddns-go服务。一旦服务启动,它将定期检查IPv6地址的变化并更新DNSPod中的域名解析记录。

    2. 验证解析

    为了确保一切正常,您可以通过访问您的域名来验证IPv6地址是否已经正确解析。您还可以使用在线工具,例如IPv6测试工具,来检查您的IPv6连接和解析是否生效。

    五、故障排除与优化

    尽管配置IPv6 DDNS相对简单,但仍然可能会遇到一些问题。以下是一些常见的故障排除和优化建议:

    • 确保NAS的防火墙设置允许ddns-go的通信。防火墙阻止了服务与DNSPod之间的通信可能导致同步失败。
    • 如果您使用Docker,请确保容器的网络设置正确。使用--net=host模式可以确保容器可以正常访问网络。
    • 检查DNSPod的API密钥权限,确保您的账户具有足够的权限来进行域名解析。

    六、结论

    通过本教程,您应该能够成功在NAS上配置DNSPod支持的IPv6 DDNS。这一设置将确保您的域名始终指向正确的IPv6地址,从而提高网络访问的灵活性和可靠性。不再担心IPv6地址变化导致的网络中断,您可以更加放心地享受互联网的便利。

    如果您在配置过程中遇到任何问题,可以查看ddns-go的文档或联系支持以获取帮助。现在,赶快开始配置IPv6 DDNS,让您的网络更加稳定和可靠!

  • 2023年自建NAS主机教程与推荐配置

    2023年自建NAS主机教程与推荐配置

    随着数据存储需求的不断增长,越来越多的人开始考虑自建NAS(网络附加存储)主机。本文将为您提供一份2023年自建NAS主机的推荐配置,以及详细的购买和组装教程。

    一、自建NAS主机推荐配置

    1.1 购买清单

    以下是一份自建NAS主机的推荐配置购买清单:

    部件 型号 价格 备注
    CPU QNCT 6C12T TDP45W(8代魔改U) 350元
    主板 华硕Z170I PRO GAMING 400元 有缺点
    内存 杂牌DDR4 2133 8GX2 160元 能用就行
    电源 航嘉 HK450-91PP Flex 350W 55元 标350具体谁知道呢
    机箱 蜗牛星际A款带PCIE版 0元 原升级剩下的,与主板有BUG
    U盘 闪迪酷豆32G 15元
    固态硬盘 金士通1T 220元 跟风买的200入手
    机械硬盘 日立3TX4(亡命盘) 600元 150元X4块
    总计 1800元

    1.2 配置优缺点

    优点

    • 体积小。

    缺点

    • 主板和机箱之间有bug。
    • 电源散热风扇声音很大。
    • 硬盘温度非常高。
    • 金士通的1Tnvme硬盘性能不行。
    • 不推荐购买亡命盘。

    二、组装教程

    2.1 主板安装

    1. 选择主板:完全没有必要用华硕Z170I PRO GAMING,用h110-z390之间芯片组的主板都可以,建议华硕、华擎等能拆卸bios芯片的主板。
    2. 安装CPU:将CPU对准主板上的插槽,轻轻放入,锁紧。
    3. 安装散热器:根据CPU的散热需求选择合适的散热器,安装在CPU上方。

    2.2 内存安装

    1. 选择内存插槽:找到主板上的内存插槽。
    2. 安装内存条:将内存条对准插槽,轻轻按下,直到听到“咔哒”声。

    2.3 硬盘安装

    1. 选择硬盘位置:在机箱内选择合适的硬盘位置。
    2. 安装固态硬盘和机械硬盘:将硬盘固定在机箱内,连接数据线和电源线。

    2.4 电源安装

    1. 选择电源位置:在机箱内选择合适的电源位置。
    2. 连接电源线:将电源线连接到主板、硬盘等相应接口。

    2.5 调试与优化

    1. 散热问题解决:金士通使用起来温度非常高,可以在机箱的下方开口子,架起来机箱后放置风扇直吹。
    2. 系统安装:选择合适的NAS操作系统进行安装。
    3. 性能测试:运行性能测试,确保所有硬件正常工作。

    三、总结

    自建NAS主机不仅能满足个人或小型企业的数据存储需求,还能根据自身需求进行定制。通过本文的推荐配置和教程,您可以轻松组装一台性能优越、价格合理的NAS主机。

    请注意,以上配置和教程是基于当前市场情况和个人需求,具体配置可能会有所不同。在购买和组装时,请根据自己的需求和预算进行选择,并咨询专业人士的意见。

  • Ubuntu 22.04网络配置指南:一步步教你如何轻松设置静态IP、网关和DNS

    Ubuntu 22.04网络配置指南:一步步教你如何轻松设置静态IP、网关和DNS

    Ubuntu 22.04是一款备受欢迎的Linux发行版,拥有强大的功能和广泛的应用领域。然而,在安装完成后,许多用户可能会遇到网络配置的问题,特别是需要设置静态IP、网关和DNS的情况。本教程将详细介绍如何在Ubuntu 22.04上进行这些网络配置,无论你是新手还是专家,都能轻松掌握。

    步骤1:确认系统版本

    在开始配置之前,首先需要确认你的系统版本是否为Ubuntu 22.04。你可以使用以下命令来检查:

    lsb_release -a

    确保输出中包含”Ubuntu 22.04″的信息,以确保你正在配置正确的系统版本。

    步骤2:编辑网络配置文件

    接下来,我们将编辑网络配置文件以设置静态IP、网关和DNS。首先,进入/etc/netplan/目录:

    cd /etc/netplan/

    然后,使用vim编辑器或其他文本编辑器打开名为01-network-manager-all.yaml的配置文件:

    vim 01-network-manager-all.yaml

    在打开的配置文件中,你将看到如下内容:

    # Let NetworkManager manage all devices on this system
    network:
      ethernets:
        ens32: ## network card name
          dhcp4: true
      version: 2

    我们需要修改其中的内容以设置静态IP、网关和DNS。按照下面的示例进行修改:

    # Let NetworkManager manage all devices on this system
    network:
      ethernets:
        ens32: ## network card name
          dhcp4: false
          addresses:
            - 192.168.3.88/24 ## set static IP
          routes:
            - to: default
              via: 192.168.3.1 ## gateway
          nameservers:
            addresses: [8.8.8.8, 8.8.4.4, 192.168.3.1]
      version: 2

    在上述示例中,我们禁用了DHCP,并设置了静态IP地址为192.168.3.88,子网掩码为/24,网关为192.168.3.1,DNS服务器地址为8.8.8.8、8.8.4.4和192.168.3.1。确保你根据你的网络环境进行相应的修改。

    完成后,保存文件并退出编辑器。

    步骤3:开启和检查网络服务(可选)

    如果你需要开启或检查网络服务,可以使用以下命令:

    sudo systemctl start systemd-networkd
    sudo systemctl status systemd-networkd

    这些命令可以确保网络服务正在运行并处于正常状态。

    步骤4:应用配置并重启网络

    使用以下命令来应用新的网络配置并重启网络服务:

    sudo netplan apply

    这将立即应用你刚刚编辑的网络配置。

    步骤5:验证配置

    最后,我们需要验证配置是否生效并测试网络连接是否正常。使用以下命令查看设定的IP是否已生效:

    ifconfig | head -n 3

    同时,也可以通过ping命令来测试网络连接是否正常。例如,测试连接到百度:

    ping -c 3 www.baidu.com

    如果ping命令返回正常的结果,说明你的网络配置已成功生效。

    总结

    通过本教程,你已经学会了如何在Ubuntu 22.04上配置静态IP、网关和DNS。需要注意的是,网络配置文件的格式需要严格遵循YAML格式,尤其是缩进部分,稍有不慎就会导致配置无效。你可以直接复制本教程中的示例配置,然后根据你的网络环境进行必要的修改。

    现在,你可以轻松地管理你的网络配置,确保你的Ubuntu 22.04系统能够顺畅连接互联网。

  • Ubuntu 22.04 中文输入法安装教程

    Ubuntu 22.04 中文输入法安装教程

    亲爱的Ubuntu爱好者们,你们是否曾经在使用Ubuntu时,想要用中文和朋友聊天,却发现自己只能用英文打字?别担心,今天我将为你带来一篇详细的Ubuntu 22.04中文输入法安装教程。跟着我一起走,让你的Ubuntu也能流利说中文!

    1. 前言:为什么要安装中文输入法?

    想象一下,你正在使用Ubuntu工作,突然想到一个搞笑的段子想分享给朋友,但是你的Ubuntu只能输入英文。这时候,你可能会想:“哎呀,如果我能在Ubuntu上输入中文就好了!”别担心,这篇教程就是为了解决这个问题。

    2. 准备工作:检查系统版本

    首先,你需要确认你的Ubuntu版本是22.04。可以通过以下命令查看:

    lsb_release -a

    如果版本正确,那么我们可以继续进行下一步。

    3. 安装FCITX5输入法框架

    Ubuntu 22.04推荐使用FCITX5输入法框架。打开终端,输入以下命令:

    sudo apt update
    sudo apt install fcitx5 fcitx5-config-qt

    等待安装完成后,重启电脑。

    4. 安装中文输入法

    我们推荐使用搜狗输入法。打开终端,输入以下命令:

    sudo apt install fcitx5-sogoupinyin

    安装完成后,你可以通过系统设置中的“区域与语言”来添加搜狗拼音输入法。

    5. 配置输入法

    打开“区域与语言”设置,点击“管理已安装的语言”,然后选择“键盘输入法系统”为“fcitx”。

    6. 享受中文输入的乐趣

    现在,你可以愉快地用中文输入法在Ubuntu上聊天、写文章了。不管是和朋友分享段子,还是写一篇深入浅出的技术博客,都不再是问题。

    7. 结语

    安装中文输入法可能看起来很复杂,但只要跟着这篇教程一步一步来,你会发现其实很简单。现在,你可以告别只能用英文沟通的日子,用中文在Ubuntu上畅所欲言了!

    祝你使用愉快!


    注意:以上教程适用于Ubuntu 22.04版本,其他版本可能会有所不同。

    温馨提示:如果在安装过程中遇到问题,不要慌张,可以尝试重新启动电脑,或者在网上搜索解决方案。

    幽默时刻:你知道Ubuntu的吉祥物是什么吗?是一只非常可爱的企鹅!它可能不会说中文,但跟着这篇教程,你的电脑可以!


    希望这篇教程能帮助你顺利安装Ubuntu 22.04的中文输入法。如果你有任何问题或建议,欢迎留言交流。让我们一起让Ubuntu说中文!

  • Docker部署Jellyfin的教程

    Docker部署Jellyfin的教程

    Docker是一个强大的容器化平台,允许用户轻松部署各种应用程序。而Jellyfin则是一款免费的开源媒体服务器,它可以帮助你整合和管理所有的媒体内容,包括电影、电视节目、音乐等。通过Docker部署Jellyfin,你可以在任何支持Docker的系统上快速搭建一个强大的媒体服务器。下面,我们将一起进行这个有趣的Docker部署Jellyfin的教程。

    一、故事开篇:打造私人媒体世界

    假设你是一位电影和音乐爱好者,拥有大量的电影、电视剧和音乐收藏。你希望能够在家中随时随地享受高品质的媒体内容,而不想受限于各种平台和服务。这时,Jellyfin媒体服务器就派上了用场。它可以将你的所有媒体整合在一起,提供一个完美的媒体中心,让你随心所欲地观看和听取你喜欢的内容。

    但是,要在普通的计算机上搭建Jellyfin服务器可能会有一些繁琐的配置工作。这时,Docker出场了。Docker是一个轻量级的容器化平台,可以将应用程序和它们的依赖项打包成容器,使其可以在不同的系统上运行,而无需担心环境配置的问题。

    通过Docker,你可以轻松地部署Jellyfin,创建你自己的私人媒体世界。现在,让我们一起来探索如何实现这一目标。

    二、准备工作

    1. 安装Docker

    首先,你需要在你的系统上安装Docker。如果你还没有安装Docker,可以参考Docker官方文档进行安装。确保你的系统满足Docker的最低要求,并且Docker服务已经成功启动。

    2. 创建Jellyfin目录

    在部署Jellyfin之前,我们需要创建一些目录来存储Jellyfin的配置和数据文件。在终端中执行以下命令来创建这些目录:

    mkdir -p /path/to/your/jellyfin/config
    mkdir -p /path/to/your/jellyfin/cache

    请将/path/to/your/jellyfin/config和/path/to/your/jellyfin/cache替换为你希望存储配置和缓存文件的实际路径。

    三、部署Jellyfin

    1. 拉取Jellyfin镜像

    首先,我们需要从Docker Hub上拉取Jellyfin的Docker镜像。在终端中执行以下命令:

    docker pull jellyfin/jellyfin

    这将下载最新版本的Jellyfin镜像到你的系统中。

    2. 运行Jellyfin容器

    现在,我们将使用Docker运行Jellyfin容器。在终端中执行以下命令:

    docker run -d \
      --name jellyfin \
      -e PUID=1000 \
      -e PGID=1000 \
      -e TZ=Asia/Shanghai \
      -p 8096:8096 \
      -v /path/to/your/jellyfin/config:/config \
      -v /path/to/your/jellyfin/cache:/cache \
      --restart unless-stopped \
      jellyfin/jellyfin

    让我们来解释一下上述命令的各个部分:

    • --name jellyfin:给容器指定一个名称,这里我们将其命名为jellyfin。
    • -e PUID=1000和-e PGID=1000:这两个参数用于设置容器中Jellyfin进程的用户ID和组ID。通常情况下,这两个值可以设置为1000,但你也可以根据需要进行修改。
    • -e TZ=Asia/Shanghai:设置容器的时区,确保时间显示正确。
    • -p 8096:8096:将主机的端口8096映射到容器的端口8096,这是Jellyfin的Web界面端口。
    • -v /path/to/your/jellyfin/config:/config和-v /path/to/your/jellyfin/cache:/cache:这两个参数用于将主机上的目录映射到容器内部,分别用于存储Jellyfin的配置文件和缓存数据。
    • --restart unless-stopped:设置容器在意外退出时自动重启,确保Jellyfin服务始终可用。

    请确保将/path/to/your/jellyfin/config和/path/to/your/jellyfin/cache替换为你在准备工作中创建的目录路径。

    四、访问Jellyfin

    现在,你已经成功部署了Jellyfin容器,可以通过浏览器访问Jellyfin的Web界面。打开浏览器,输入以下地址:

    http://localhost:8096

    初次访问时,Jellyfin将引导你进行初始设置,包括选择语言、媒体库设置等。按照引导完成设置后,你将能够开始添加媒体库和享受你的媒体内容了。

    五、享受你的媒体世界!

    恭喜你,现在你已经成功部署了Jellyfin媒体服务器!你可以开始将电影、电视节目、音乐等媒体内容添加到Jellyfin中,然后在任何支持浏览器的设备上随时随地享受你的私人媒体世界。

    不仅如此,Jellyfin还支持多个用户和设备的管理,你可以为家庭成员创建独立的帐户,让每个人都能享受到个性化的媒体体验。

    六、总结

    通过这个有趣的Docker部署Jellyfin的教程,你已经学会了如何在任何支持Docker的系统上轻松搭建一个强大的媒体服务器。Docker的容器化技术使得部署变得更加简单,而Jellyfin则为你提供了一个完美的媒体中心,让你随心所欲地管理和享受你的媒体内容。

    如果你在部署过程中遇到任何问题,可以随时查阅Jellyfin官方文档或在社区论坛中寻求帮助。现在,尽情享受你的媒体世界吧!

  • 盘点10大群晖(NAS)必装docker应用

    盘点10大群晖(NAS)必装docker应用

    在数字化时代,数据管理和媒体娱乐已经成为我们生活中的不可或缺的一部分。群晖(Synology)NAS是一款强大的网络存储设备,不仅提供了高效的文件管理解决方案,还支持通过Docker容器部署各种实用应用,让我们的生活更加便捷高效。在这篇文章中,我们将介绍10款必装的Docker应用,它们涵盖了私人云存储、媒体服务器、智能家居控制等多个领域,让您充分发挥群晖NAS的潜力。

    开篇故事:数字化时代的挑战

    让我们想象一下,您的电脑、手机和平板上存储了大量珍贵的照片、视频、文档和音乐。您希望这些数据既能够安全地存储在一个地方,又能够随时随地访问和分享。但随着数据不断增长,云存储服务的月费用也在不断累积,而且对数据隐私的担忧也日益增加。此外,您可能还有智能家居设备,希望能够将它们集中控制,实现更便捷的智能生活。这就是数字化时代的挑战之一,而群晖NAS正是为了解决这些挑战而诞生的。

    1. Portainer – Docker容器管理

    首先,让我们介绍Portainer,这是一款开源的Docker容器管理工具。不要被“Docker容器”这个名词吓到,它实际上是一个非常强大的工具,可以帮助您轻松管理和监控各种应用。Portainer提供直观的图形界面,即使您没有深厚的技术知识,也能轻松上手。您可以轻松创建、启动、停止和删除Docker容器,而无需使用复杂的命令行操作。这对于想要尝试各种应用的用户来说非常方便。

    2. Nextcloud – 私人云存储

    接下来,我们来看一看Nextcloud,这是一款让您可以在自己的私人服务器上建立云存储的应用。为什么选择Nextcloud而不是传统的云存储服务?原因之一是数据隐私和安全性。您的数据将完全受到您控制,不会存储在第三方云服务商的服务器上。此外,Nextcloud还提供了文件同步、日历、联系人管理等功能,让您可以轻松地将个人和工作生活整合在一个平台上。无论是家庭用户还是小型企业,Nextcloud都是一个强大的选择。

    3. Plex – 媒体服务器

    媒体娱乐是我们生活中不可或缺的一部分,而Plex是一个流行的媒体服务器解决方案,可以帮助您管理和播放音乐、电影和照片。通过将Plex部署在群晖NAS上,您可以将所有媒体文件集中存储,并通过各种设备(如智能电视、手机、平板)进行访问。Plex还提供了强大的媒体库管理功能,包括自动识别和整理媒体文件的能力,让您的媒体库井然有序。

    4. Home Assistant – 智能家居控制

    随着智能家居设备的普及,如何实现集中控制成为一个重要问题。Home Assistant就是为此而生的应用。它是一款智能家居自动化平台,支持与各种智能设备连接,实现智能家居的集中控制。无论您有智能灯具、智能插座、智能摄像头还是智能门锁,Home Assistant都可以将它们整合在一起,通过一个简单的界面进行控制和自动化。例如,您可以设置在离开家时自动关闭所有灯光和电器,或者根据天气预报自动调整室内温度。

    5. GitLab – 代码托管和协作

    如果您是开发人员或团队,那么GitLab将是一个理想的选择。GitLab是一个完整的代码托管、协作开发和持续集成解决方案。通过将GitLab部署在群晖NAS上,您可以轻松地托管和管理项目代码,进行团队协作,并实现持续集成和自动化部署。这将大大提高开发效率和代码质量。

    6. Jellyfin – 开源媒体服务器

    与Plex类似,Jellyfin也是一个媒体服务器软件,但它是完全开源的,无需订阅费用。Jellyfin提供了丰富的媒体管理功能,可以让您整理和播放音乐、电影和电视节目。它还支持多用户账户,每个用户可以有自

    己的媒体库和观看历史记录。如果您喜欢开源软件并希望构建自己的媒体中心,Jellyfin是一个不错的选择。

    7. Pi-hole – 广告拦截

    烦恼于网页上的烦人广告吗?Pi-hole可以帮助您解决这个问题。Pi-hole是一款网络广告拦截工具,可以在整个网络范围内拦截广告,从而提供更纯净的浏览体验。通过将Pi-hole部署在群晖NAS上,您可以让所有设备都受益于广告拦截,无需在每个设备上单独安装广告拦截插件。这不仅提高了浏览速度,还提升了网络安全性。

    8. Bitwarden – 密码管理

    在数字化时代,密码管理变得越来越重要。Bitwarden是一款开源的密码管理工具,可以帮助您安全地存储和同步密码。通过将Bitwarden部署在群晖NAS上,您可以随时访问您的密码,而无需依赖云服务。Bitwarden还提供了强密码生成和自动填充功能,让您的在线安全更可靠。

    9. MariaDB – 数据库管理

    如果您的应用需要使用数据库,那么MariaDB是一个强大的选择。MariaDB是一款流行的开源数据库管理系统,适用于各种应用的数据库需求。通过将MariaDB部署在群晖NAS上,您可以轻松地创建、管理和备份数据库,确保数据的安全性和可靠性。无论是个人项目还是小型企业应用,MariaDB都可以满足您的数据库需求。

    10. Node-RED – 物联网自动化

    最后,让我们来介绍Node-RED,这是一个用于物联网项目的开源自动化工具。Node-RED提供了直观的编程界面,让您可以轻松连接各种物联网设备,实现自动化控制。例如,您可以创建一个流程,让温度传感器监测到室内温度过高时,自动打开空调或发送警报。这对于喜欢自己动手DIY的用户来说,是一个强大的工具。

    总结

    群晖NAS不仅是一个出色的网络存储设备,还可以通过Docker应用轻松扩展其功能。以上介绍的10款必装Docker应用涵盖了文件管理、媒体娱乐、智能家居控制等多个领域,让您可以充分发挥群晖NAS的潜力。无论是建立私人云存储、搭建媒体中心,还是实现智能家居控制,这些应用都将帮助您让生活和工作更加便捷高效。不妨考虑安装其中一些应用,体验数字化时代的便利与乐趣。

  • 分享一个之前写的微信根据关键词发布朋友圈的auto.js

    分享一个之前写的微信根据关键词发布朋友圈的auto.js

    想象一下,你每天都要发布微信朋友圈,分享生活中的点滴,但是这个过程变得越来越耗时,每天都需要花费大量的时间来完成。你可能想要寻找一种更高效的方式来自动发布朋友圈,以便有更多的时间去做其他事情。这时,Auto.js就派上了用场。Auto.js是一个强大的Android自动化工具,可以帮助你编写脚本来执行各种自动化任务,包括自动发布微信朋友圈。

    准备工作

    在开始编写自动发布朋友圈的脚本之前,你需要做一些准备工作。

    安装Auto.js

    首先,你需要在你的Android设备上安装Auto.js应用。你可以在Google Play商店中搜索并安装它。安装完成后,打开应用并授予它所需的权限。

    创建控制文件

    为了更好地控制脚本的行为,我们可以创建一个控制文件,用于存储一些配置信息。在脚本中,我们会读取这个控制文件以获取一些参数。你可以使用文件管理器在设备上创建一个名为”控制.txt”的文本文件,并将其放置在”/sdcard/”目录下。在这个文件中,你可以存储一些关键词,用于判断是否需要发布朋友圈。

    编写Auto.js脚本

    现在,让我们开始编写Auto.js脚本来自动发布微信朋友圈。

    var window = floaty.window(
        <vertical>
            <button id="start">启动</button>
            <button id="stop">停止</button>
        </vertical>
    );
    
    var dw = device.width;
    var dh = device.height;
    window.setPosition(dw / 4 * 3, dw / 4 * 3);
    
    if (!files.isFile("/sdcard/控制.txt")) {
        files.create("/sdcard/控制.txt");
    }
    
    var content = files.read("/sdcard/控制.txt");
    var 关键词数组 = content.split("\r\n");
    
    window.start.click(function () {
        threads.start(mainLoop);
    });
    
    window.stop.click(function () {
        threads.start(function () {
            exit();
        });
    });
    
    function mainLoop() {
        while (1) {
            sleep(2000);
            try {
                handleExit();
                handleMessage();
                handleChat();
            } catch (e) {
                toastLog(e.message);
            }
        }
    }
    
    // 处理退出微信
    function handleExit() {
        if (text("退出").visibleToUser().exists()) {
            text("退出").findOnce().click();
            sleep(2000);
            back();
            text("微信").visibleToUser().waitFor();
            let a = text("微信").findOnce().bounds();
            sleep(1000);
            click(a.centerX(), a.centerY());
            sleep(1000);
        }
    }
    
    // 处理消息
    function handleMessage() {
        if (idContains("g1").visibleToUser().exists()) {
            idContains("g1").findOnce().parent().click();
        }
    }
    
    // 处理聊天界面
    function handleChat() {
        var chatElements = idContains("kmv").visibleToUser().find();
        toastLog("控件数量:" + chatElements.size());
        if (chatElements) {
            let chatBounds = chatElements[0].bounds();
            toastLog(chatBounds.centerX(), chatBounds.centerY());
            click(chatBounds.centerX(), chatBounds.centerY());
            // 检测是否在聊天界面
            descContains("切换到按住说话").findOne(4000);
            if (descContains("切换到按住说话").exists()) {
                handleText();
            } else {
                back();
            }
        }
    }
    
    // 处理文本消息
    function handleText() {
        // 检查聊天内容的数组
        try {
            className("androidx.recyclerview.widget.RecyclerView").visibleToUser().waitFor();
            var chatRecyclerView = className("androidx.recyclerview.widget.RecyclerView").find();
            var 控件数量 = chatRecyclerView[0].childCount();
            var 子控件 = chatRecyclerView[0].child(控件数量 - 1).childCount();
            toastLog(当前文本 = chatRecyclerView[0].child(控件数量 - 1).child(子控件 - 1).child(1).child(0).child(0).text());
            if (当前文本 == "" || 当前文本 == null) {
                toastLog("啥也没有");
                back();
                return;
            }
        } catch (e) {
            back();
            toastLog("没有文字");
            return;
        }
        sleep(1000);
        back();
        sleep(1000);
        for (i = 0; i < 关键词数组.length; i++) {
            if (当前文本.includes(关键词数组[i])) {
                handleDiscover();
                break;
            }
        }
    }
    
    // 处理朋友圈发布
    function handleDiscover() {
        //点击发现
        text("发现").visibleToUser().waitFor();
        let discoverBounds = text("发现").findOnce().bounds();
        click(discoverBounds.centerX(), discoverBounds.centerY());
        sleep(1000);
        //下拉
        swipe(502.6, 63, 531, 138, 500);
        text("朋友圈").visibleToUser().waitFor();
        let momentsBounds = text("朋友圈").findOnce().bounds();
        click(momentsBounds.centerX(), momentsBounds.centerY());
        //长按相机按钮发送文本
        idContains("by3").visibleToUser().waitFor();
        sleep(2000);
        if (id
    
    Contains("by3").exists()) {
            toastLog("123");
        }
        let cameraBounds = idContains("by3").findOnce().bounds();
        press(cameraBounds.centerX(), cameraBounds.centerY(), 2000);
        sleep(1000);
        //第一次启动相机发送文本可能要点我知道了 这一块第二次之后没有的话可以注释掉
        text("我知道了").visibleToUser().findOne(3333);
        if (text("我知道了").exists()) {
            toastLog("我知道了");
            let knowBounds = text("我知道了").findOnce().bounds();
            click(knowBounds.centerX(), knowBounds.centerY());
        }
        sleep(1000);
        //发朋友圈
        textContains("发表").visibleToUser().waitFor();
        if (textContains("发表").exists()) {
            toastLog("发表:" + 当前文本);
            setText(当前文本);
            sleep(2000);
            click("发表");
            sleep(2000);
            back();
            sleep(1000);
            idContains("f2s").visibleToUser().waitFor();
            sleep(2000);
            let postBounds = idContains("f2s").findOnce().bounds();
            click(postBounds.centerX(), postBounds.centerY());
            sleep(1000);
        }
    }
    
    setInterval(() => { }, 1000);

    使用Auto.js发布朋友圈

    现在,你已经编写了自动发布朋友圈的Auto.js脚本。接下来,让我们看看如何使用它。

    1. 打开Auto.js应用,并启用辅助功能。
    2. 运行你编写的脚本。你可以点击窗口中的“启动”按钮来启动脚本。
    3. 脚本会自动监视微信的操作,并在符合条件时自动发布朋友圈。

    请注意,这个脚本是根据一些特定的条件来自动发布朋友圈的,你可以根据自己的需求来修改脚本中的关键词数组和条件。

    总结

    通过使用Auto.js,你可以编写自动发布微信朋友圈的脚本,以节省时间和精力。这个教程介绍了如何准备工作,编写脚本,以及如何使用它来自动发布朋友圈。希望这个教程对你有所帮助,让你更轻松地管理自己的微信朋友圈。

  • Docker 新手必读:一步步教你在 Linux 服务器上部署 VoceChat 的完全指南

    Docker 新手必读:一步步教你在 Linux 服务器上部署 VoceChat 的完全指南

    VoceChat 是一个流行的聊天服务。本教程将引导您使用 Docker 和 Nginx 在 Linux 服务器上部署 VoceChat。

    步骤 1:安装 Docker

    确保您的系统已经安装了 Docker。如果没有,您可以按照以下命令进行安装:

    curl -fsSL https://get.docker.com -o get-docker.sh
    sudo sh get-docker.sh

    步骤 2:运行 VoceChat 容器

    使用以下命令运行 VoceChat 容器,将数据目录设置为 /www/wwwroot/chat:

    # 创建数据目录
    mkdir -p /www/wwwroot/chat
    
    # 运行 VoceChat 容器
    docker run -d --restart=always \
      -p 3009:3000 \
      --name vocechat-server \
      -v /www/wwwroot/chat:/home/vocechat-server/data \
      privoce/vocechat-server:latest \
      --network.frontend_url "https://chat.aigc.tax"

    步骤 3:配置 Nginx 反向代理

    1. 在 Nginx 配置文件目录(通常位于 /etc/nginx/conf.d)创建一个新的配置文件,例如 chat.aigc.tax.conf。

    2. 添加以下内容:

    #PROXY-START/
    
    location ^~ / {
        proxy_pass http://127.0.0.1:3009;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_http_version 1.1;
    
        add_header X-Cache $upstream_cache_status;
    
        # Set Nginx Cache
        set $static_fileNRcfc5pK 0;
        if ( $uri ~* "\.(gif|png|jpg|css|js|woff|woff2)$" )
        {
            set $static_fileNRcfc5pK 1;
            expires 1m;
        }
        if ( $static_fileNRcfc5pK = 0 )
        {
            add_header Cache-Control no-cache;
        }
    }
    
    #PROXY-END/
    1. 检查配置文件的语法,并重新加载 Nginx:
    sudo nginx -t
    sudo nginx -s reload

    步骤 4:测试部署

    通过浏览器访问 http://chat.aigc.tax。如果能够进入初始化页面,即表示部署成功。

    结束语

    恭喜您成功部署了 VoceChat!现在,您可以享受 VoceChat 带来的便捷聊天体验。

    如果您有任何问题或需要进一步的帮助,欢迎随时联系。