AdGuard Home 53 端口占用问题解决

之前写过一篇文章如何搭建自己的 AdGuard Home 去广告,过去很久了,现在在一台新的 Ubuntu 设备上再次安装 [[AdGuard Home]],再次记录一下如何解决 53 端口被占用的问题。

53 端口的服务

因为 AdGuard Home 要通过 53 端口提供 DNS 解析的功能,但是默认情况下 Ubuntu 的 systemd-resolved 会占用 53 端口来提供本地的 DNS 解析缓存服务。

使用 sudo lsof -i :53 或者 netstat 命令查看

4ZBQ

编辑配置文件

sudo vim /etc/systemd/resolved.conf

修改文件

[Resolve]
DNS=1.1.1.1
#FallbackDNS=
#Domains=
#LLMNR=no
#MulticastDNS=no
#DNSSEC=no
#DNSOverTLS=no
#Cache=yes
DNSStubListener=no
#ReadEtcHosts=yes

将其中的 DNS 和 DNSStubListener 字段做如上修改。

然后重启服务

sudo systemctl restart systemd-resolved.service

再次查看 53 端口,没有被占用,之后就可以启动 AdGuard Home 了。

/etc/resolv.conf 文件和 systemd-resolved 进程的关系

systemd-resolved 是 systemd 中提供的一个 DNS 解析器服务。它可以自动管理 /etc/resolv.conf 文件,并提供一些额外的功能,例如:

  • DNS 缓存: 缓存 DNS 查询结果,以提高解析速度。
  • DNSSEC 支持: 支持 DNSSEC 安全扩展,以提高 DNS 解析的安全性。
  • 多 DNS 服务器: 支持同时使用多个 DNS 服务器,以提高可靠性。

systemd-resolved 默认情况下是启用的。如果启用了 systemd-resolved,它会将 /etc/resolv.conf 文件配置为指向一个符号链接,该符号链接指向 systemd-resolved 管理的 stub-resolv.conf 文件。stub-resolv.conf 文件包含了 systemd-resolved 提供的 DNS 服务器信息。

如果您想要手动配置 /etc/resolv.conf 文件,需要先禁用 systemd-resolved 服务。您可以通过以下命令禁用 systemd-resolved 服务:

sudo systemctl disable systemd-resolved

禁用 systemd-resolved 服务后,/etc/resolv.conf 文件将不再被自动管理。您可以直接编辑 /etc/resolv.conf 文件,并重启网络服务使更改生效。


2024-01-20 adguard , adguard-home , dns , adblock , youtube , systemd

Hono 一个快速轻量的运行在边缘节点的 Web 框架

Hono 是一个运行在边缘节点的 JavaScript Edges Web 框架,可以在任何支持 JavaScript 运行的服务上,包括 Cloudflare Workers,Fastly Compute@Edge,Deno,Bun,Vercel,Netlify,Lagon,AWS Lambda,Lambda@Edge 和 Node.js。

Hono 的特点就是简单,轻量,快。

  • 快,RegExpRouter 快
  • 轻,hono/tiny 只有 14kB,零依赖
  • Multi-runtime,支持非常多的 JavaScript 运行时
  • 完整,自带中间件,可以自定义中间件
  • 验证,缓存,Cookie,CORS,ETag 等等

使用场景

  • 构建 Web API
  • 后端服务代理
  • CDN
  • Edge 应用
  • 基础服务
  • 全栈应用

下面是一些具体的使用 Hono 的产品

  • drivly 通过数据驱动的电商平台构建工具
  • repeat.dev 定时触发调用 webhook 的服务

使用

创建项目

pnpm create hono my-app

我创建了一个项目,接受上传图片,并生成一个随机的图片名称,然后上传到 Cloudflare R2。代码见GitHub

然后配套 uPic 直接上传到 R2,然后获取 R2 的直接链接。

Head

Content_Type: multipart/form-data
Authorization: Bearer my-secret-token

采用 form-data 上传,文件 key 是 file。

2PiP904C8H


2024-01-09 web , web-framework , edge , cloudflare , cloudfare-worker , deno , vercel

我买了一台打印机 TS3330

因为时不时需要有打印和复印的需求(日本政府总有一些奇怪的手续需要提供纸质的材料),之前看到有人出家用打印机就用 3000 JPY 买了一台,这是一台 Canon TS3330。下面记录一下我自己的初始化过程以及更换墨盒的过程,以备自己后续查看。

产品介绍

佳能打印机 A4 喷墨多功能 PIXUS TS3330 白色 Wi-Fi 兼容。

u8N9

墨盒

  • BC-345XL 黑
  • BC-346XL 彩色

说明书

canon ts3330 説明書

或者访问 https://ij.start.canon 访问,然后查询型号,查看交互式教程。

或者直接访问 TS3330 的手册。

以防万一,我也做了一个备份

安装墨盒

首先将打印机连接电源,然后按下电源键启动。等待启动完成,将打印机前部分的往下拉开。

UgxBqxXkrN

然后就能看到墨盒的位置

YYHTclROSX

左边是彩色的,右边是黑白的。

安装的时候有一定的倾角。

t4VWBYm5Q_

安装的时候需要有一个向上的按压操作。

vw0A83XezT

直至两边对齐

igvITLPQeI

连接 WiFi 通过网络打印

使用 macOS/Windows 完成初始化

访问 https://ij.start.canon 下载桌面版的应用,根据应用上的提示完成 WiFi 初始化。

使用 iPhone 手机初始化连接

  • 首先到应用市场中下载 Canon 打印
  • 然后长按打印机上手机样子的按钮,直到屏幕中出现闪烁的 WiFi 图标

xfEiARCT73

  • 等待出现 Canon 字样的 WiFi 热点,然后使用手机连接
  • 打开 Canon 打印,根据提示完成 WiFi 密码的输入,完成设置

使用

当完成 WiFi 连接之后,打印机在本地网络中就会存在一个 IP 地址,直接通过浏览器访问这个 IP 地址,可以对打印机进行一些管理。比如

  • 设置打印机名字
  • 查看墨水的剩余量
  • 清理
  • 升级固件
  • 设置语言

2023-12-30 printer , hardware , office

语言能力分级系统 CEFR

今天在浏览 LinkedIn 的时候,突然看到日本公司的 JD 中对语言的要求其中出现了一个关键字 CEFR C1 / B2 。好奇心使然,让我想了解一下这个我没有见到过的英语能力等级是什么。

在中文的语境中经常会看到 CET-4,CET-6,或者 TOEFL,ITLTS,甚至前不久还看到了 [[Duolingo]] 推出的英语能力测试,Duolingo 的英语能力测试因为能通过在线获取,所以在疫情期间还得到了很大的发展。

CEFR

CEFR 是 Common European Framework of Reference for Languages 的缩写,即欧洲语言共同参考框架。它是一个由欧洲委员会制定的语言能力分级系统,用于描述语言学习者在不同水平上的语言能力。

CEFR 将语言能力分为六个级别:A1、A2、B1、B2、C1 和 C2。C1 是第五个级别,属于高级水平。

CEFR C1 水平的语言学习者能够:

  • 理解复杂的长篇文章和讲话,即使它们涉及抽象或技术主题。
  • 在各种情况下流利地表达自己的观点,即使是复杂或有争议的问题。
  • 有效地使用语言在社会、学术和职业环境中。

CEFR C1 水平的语言学习者可以胜任以下任务:

  • 在一个使用英语的国家生活和工作。
  • 阅读和理解复杂的技术文档。
  • 在学术会议上发表演讲。
  • 与母语为英语的人进行流利的对话。

在我调查的过程中发现了一个网站 EF SET 这个网站也有对于 C1 的具体介绍,这个阶段,是能够熟练应用英文进行交流,对大部分的事物都可以给出具体准确的描述而不需要提前准备。

uScI

最后分享一下我进行的 15 分钟的测验,希望明年能上到 90% 以上吧。

u4ZR


2023-12-25 mercari , english-test , english-learning

React 学习笔记之了解 React

这一期的 21 天计划中,我将了解和学习 React 并使用 React 制作一个简单的网站列入了计划,和之前学习了解 [[Lavarvel]] 一样,我在笔记里面制作了一个短期的学习计划,并看了一些官网的教程和书籍的目录,制定了几大块的知识点。这是这个系列的第一篇文章。

React 是什么

[[React]] 是一个用来构建用户界面的 JavaScript 库,用于构建 UI 界面,起源于 Facebook 的内部项目,用来构建 Instagram 的网站,于 2013 年 5 月开源。React 拥有较好的性能,代码逻辑简单,现在已经有很多项目使用 React 来实现,并且占据了当前前端开发的市场,另外一大山脉 [[Vue]] 等有时间再看看吧。

学习 React 的目的

和之前 [[Laravel]] 一样,主要的目的是为了可以快速实现一些小的想法,之前有很多想法都停留在 Todo-List 里面,如果有一个顺手的工具,就可以快速实现。另外一个目的就是为了看懂现在的开源代码,以及一些感兴趣的项目。初步的目的只是为了能看懂,并且能在此基础上做一些小的改动吧。

为什么要学 React

  • 为了看懂一些开源代码
  • 用来快速实现一些小想法,验证想法

React 的优势是什么

  • 声明式设计,React 的状态和行为是通过声明的方式来定义的,React 负责将其渲染到 UI 上。
    • 声明式的设计提升了可读性,可维护性
  • 组件,复用代码,React 使用组件来构建 UI,而组件是独立,可重用的代码块,用于渲染 UI 元素
  • 高效,模拟 DOM,最大限度减少直接和 DOM 交互,提升了 UI 渲染速度
  • 灵活,可以于已知的库配合
  • JSX 扩展语法
  • 单向响应数据流,可维护,更容易理解

React 是如何工作的?

React 会在内存中创建 Virtual DOM,React 会首先将修改应用到内存的 Virtual DOM 中,然后再将修改反应到浏览器的 DOM 中。React 只会去渲染需要修改的内容。

React 基本概念

每一次学习新的东西,最开始就是要了解概念,React 中有一些非常核心的概念,这里先列举一下,之后还会展开。

  • JSX,JSX 是 JavaScript 的扩展集,可以让开发者在 JavaScript 中直接编辑 HTML 代码
  • 组件,React 程序的基本组成单位,独立,可复用,用于渲染 UI
    • 组件的生命周期,组件在其生命周期中不同阶段调用的函数
  • props,从父组件传递给子组件的数据,可以是任何类型的数据
  • 状态(State),组件的内部状态,控制组件的行为

理解基于组件的结构

下面的方法定义了一个最基本的组件,包括了一个叫 name 的状态。

function MyComponent() {
  const [name, setName] = useState("John Doe");

  return (
    <div>
      <h1>Hello, {name}</h1>
      <button onClick={() => setName("Jane")}>Click here to set name</button>
    </div>
  );
}

设置开发环境

Node.js

因为我使用 asdf ,所以直接安装 Node.js 即可。

asdf install nodejs 20.10.0

TypeScript

TypeScript 是一种向 JavaScript 代码添加类型定义的常用方法。TypeScript 天然支持 JSX——只需在项目中添加 @types/react@types/react-dom 即可获得完整的 React Web 支持。

安装 React

要使用 React,首先需要 npm 和 Node.js 环境。

通过 npm 安装, 使用 create-react-app 构建一个 React 开发环境,这个环境包括了常用的工具比如 [[Webpack]],ESLint 等。

npx create-react-app my-react-app

运行代码

npm start

JSX 语法

JSX 是一种 JavaScript 语法扩展,用于将 HTML、JavaScript 和 CSS 代码混合在一起。JSX 使 React 开发人员能够以更简洁的方式编写代码。

JSX 语法简化了 React 的开发,在编译时会自动转化为 JavaScript 代码,并编译成输出 HTML。

可以来看一个简单的例子

const MyComponent = () => {
  return (
    <div>
      <h1>Hello, world!</h1>
      <button onClick={() => console.log("Hello, world!")}>Click me</button>
    </div>
  );
};

6 条 JSX 原则

  • 永远只 return 一个根元素
return (
  <div>
    <h1>Hello World!</h1>
    <p>This is my first React component.</p>
  </div>
)
  • 使用 className 而不是 class
<div className="my-class">This element has a CSS class.</div>
  • 使用花括号(Curly Braces) 来使用 JavaScript
<div>{myVariable}</div>
  • 使用 camelCase
<button onClick={handleClick} className="btn">Click me!</button>
  • 永远要记得关闭
<div></div>
  • 空元素,使用 Self-Closing 标签关闭
<img src="my-image.jpg" alt="My Image"/>


2023-12-15 react , javascript , typescript

面向编程的 AI 搜索引擎:phind

前不久介绍了一个 面向开发者的垂直搜索引擎 devv.ai,通过 AI 的加持,搜索结果通常比较精确。今天又发现了一款相似的产品 phind,主要使用的语言是英语。同样是经过训练的面向开发者的文档,所以结果更加精确。

phind 由大语言模型驱动,因为专门使用高质量的语料库进行训练,所以在技术文档,计算机方面的检索和质量要相对精确一些。

优势

phind 的使用非常简单,相较于通用性的 ChatGPT,phind 可以给出更加精确的编程问题答案。相对于需要注册 ChatGPT,phind 打开就能用。

  • phind 可以使用自然语言进行搜索
  • phind 通常还会给出代码片段,还能直接在线预览

使用

phind 的使用非常简单,只有一个输入框,和通用搜索引擎一样使用即可。

uZnr

大语言模型的出现,让我自己产生了非常大的惰性,以往如果要查询一个非常专业的问题,我通常会自己去更换不同的关键字进行搜索,有些时候往往就是一个关键字的问题就会出现很不一样的结果,通常用比较精确的文字查找效率会高很多。

但是自从有了 [[ChatGPT]],[[Bard]] 一类的产品,我就变得非常懒惰,直接使用日常的语言进行搜索,而这个时候往往 AI 也能够给出一个相对比较具体的方向,然后继续这个方向追问,基本上也能找到我需要的内容。

尤其是最近使用 JetBrains 的 AI Assistant ,以及 GitHub Copilot Chat,在选中部分代码作为上下文的情况下,给出的答案基本上都是需要的,非常精确。

  • [[ChatGPT]]
  • [[Perplexity]]
  • [[jetbrains ai assiste]]
  • [[Bard]]
  • [[GitHub Copilot]]

总结

日常遇到编程相关的问题,不妨试试 phind,或者 devv.ai 这样的垂直类搜索引擎,也还可以借助编程工具,辅助解决问题。


2023-12-14 ai , phind , chatgpt , openai , llm , bard , developer

搭建自己的在线音乐播放器 Navidrome

Navidrome 是一个现代的音乐服务器,兼容所有的 Subsonic/Airsonic 客户端。

Navidrome 后端使用 Go 语言编写,前端基于 React,界面风格采用 Material UI,串流音乐的接口兼容 [[Subsonic]],所以支持 Subsonic 的客户端都可以使用。

Navidrome 是什么呢,引用官网的原话:

Navidrome is a self-hosted, open source music server and streamer. It gives you freedom to listen to your music collection from any browser or mobile device.

Navidrome 是一个自托管的开源音乐服务器和流媒体。它让您可以自由地从任何浏览器或移动设备收听您的音乐收藏。

特点:

  • 支持几乎所有音频格式,流式传输几乎任何可用的音频格式
  • 读取并使用元数据
  • 对合辑(各种艺术家专辑)和盒装(多碟专辑)的支持
  • 独立用户系统,每个用户都有自己的播放次数、播放列表、收藏夹
  • 系统资源占用极低,即使想我这样 80GB 几千首歌依然非常流畅
  • 开源,多平台,可在 macOS、Linux 和 Windows 上运行。还提供了 Docker 镜像
  • 可用于所有主要平台的二进制文件,包括 Raspberry Pi
  • 自动监控您的音乐库的更改、导入新文件和重新加载新元数据
  • 基于 Material UI 的主题化、现代和响应式 Web 界面
  • 与所有 Subsonic/Madsonic/Airsonic 客户端兼容,甚至还有 [[Kodi]] 的插件
  • 自带即时转码,可以为每个用户单独设置。支持 Opus 编码。
  • 界面集成各种语言

缺点:

  • 不支持在页面上传歌曲文件以及修改文件 Metadata
  • 不支持歌曲分享
  • 只支持内嵌的歌词显示

为什么要选用 Navidrome

我从 2014 开始使用网易云音乐,几乎很长时间没有变过,但是大家也知道网易云音乐前几年的「变化」,我歌单中的内容就一天天变得不可用(变灰),直接导致产品体验直线下降,虽然还可以使用网易提供的 2T 云盘来解决一部分版权问题,但是还是一些不方便。

于是之后买入了 Plex Pass 之后就将我的音乐库迁移到了 [[Plexamp]],在 Plexamp 下也用了很长一段时间,虽然中间也接触了 Funkwhale 等等,但简单的尝试之后还是停留在了 Plexamp 中,但是最近发现 Plexamp 存在了一些致命的问题让我不得不考虑切换,就是我使用 Syncthing 同步我的音乐库,但是 Plex 扫描的时候经常无法发现我新添加的歌曲,虽然我按照官方的文档无数遍修改文件目录,但依然无法添加到 Plex 中,这个问题困扰了我很久,我不清楚是 Plex 支持的文件格式有限,还是哪个地方设置不对,反正就是添加不了,于是我发现了 [[Navidrome]],大致地看了一下官方网站的介绍,支持的文件格式非常齐全,扫描速度非常快,并且还提供了一个 Web UI,即使不安装客户端也可以在线听歌,兼容 Subsonic 客户端,这就使得我可以有非常多的音乐客户端选择。

安装

官方文档提供了非常多的安装方式,个人还是比较喜欢 Docker Compose 来安装启动,配置可以参考我的 dockerfile

git clone https://github.com/einverne/dockerfile.git
cd navidrome
# create and modify .env
docker-compose up -d
# check log
docker-compose logs -f

因为我个人使用 [[Nginx Proxy Manager]] 来反向代理 Navidrome 实例,所以里面多配了一些 Nginx 代理的选项,可以根据自己的需要配置。如果不配置 Nginx 代理,可以直接使用端口来访问。

panic: chi: routing pattern must begin with ‘/’ in ‘”“/auth’

如果安装的过程中遇到这个报错,那么查看一下 docker-compose.yml 文件中的 ND_BASEURL,如果留空就会抛出上面的错误。

比如,安装完成之后访问 http://your-vpsip:4533/,首次登录会要求创建管理员账户,和密码。

一旦完成安装,就会发现 Navidrome 在扫描音乐库了。登录后台,进行个性化的配置,比如修改语言,对接 Last.fm,ListenBrainz 等等。至此,Navidrome 音乐服务端已经安装完成。

4pWL

配置 Last.fm

等路自己的 Last.fm 帐号

访问 https://www.last.fm/api/account/create 创建一个 API 账户,填写应用程序名称。获取 API Key 和 Shared Secret。

然后将值分别放到 Docker

ND_LASTFM_ENABLED=true
ND_LASTFM_APIKEY
ND_LASTFM_SECRET
ND_LASTFM_LANGUAGE

配置好重启容器之后,在后台记得开启 Scrobble to Last.fm 。

配置 Spotify

首先创建一个免费的 Spotify 账户,然后访问开发者面板 填写表单,创建。获取 Client ID 和 Client Secret。

添加 Spotify 有一个好处就是可以显示歌手艺术家的照片,图像从 Spotify 获取。

ND_SPOTIFY_SECRET

文件上传

  • [[miniserver]]
  • [[FileBrowser]]

客户端

官方文档上提供了非常多的 客户端 选择。

客户端

  • iOS
    • play:Sub(付费 38 RMB)
    • [[substreamer]] 免费,substreamer 支持随机播放曲库,算法推荐
    • [[Amperfy]] 初始化过程比较长,界面一般
    • iSub
    • 开源的 SubPetalApp 已经归档不再更新,界面非常不错
    • 音流,Flutter 开发,跨平台
  • Android
    • DSub
    • Subtracks subtracks :开源,支持中文,多音乐服地址,但是 UI 比较简洁,随机播放音乐只支持以专辑维度。
    • [[substreamer]]
    • [[Symfonium]]
    • Ultrasonic
    • Audinaut
  • 网页端
    • Subplayer
    • Airsonic Refix
    • Aurial
    • Jamstash
    • Subfire
  • 桌面
  • macOS
  • CLI
    • Jellycli (Windows/Linux)
    • STMP (Linux/macOS)

个人推荐

  • iOS,Substreamer
  • Android,Symfonium(付费),Ultrasonic
  • 桌面端,[[Sonixd]]
    • brew install --cask sonixd

macOS 下的 Sonixd

4aYN

歌词

  • [[LyricApi]]
  • music_tag_web

总结

Navidrome 的安装教程就到这里,如果你只是想要开箱即用的 ,如果想要了解 Navidrome 的进阶设置,可以收藏订阅本网站。

  • [[Music Tag Web]]
  • [[OpenSubsonic]]
  • MusicFree https://github.com/maotoumao/MusicFree

reference


2023-12-08 navidrome , plexamp , plex , subsonic , open-source , music-server , music-management , music , music-library , self-hosted

时隔 5 年再安装 NextCloud

时隔多年,我再安装了一次 [[NextCloud]],很早之前 就在我的 QNAP TS 453B mini 上安装并使用了多年,这两年也一直在跟随着官方的版本升级 ,但是 QNAP 毕竟在局域网内,虽然可以使用 TailscaleZeroTier 等等工具来组件局域网,但毕竟还是不方便,最近入手一台还不错的 VPS,所以想着再搭建一个公有 IP 的 NextCloud,一方面备份一下自己的相册,另一方面也补足一下我自己使用 Syncthing时没有在线预览的页面,导致常常有些时候想访问自己的笔记而找不到。

Nextcloud Docker 镜像的区别

在调研的时候发现 NextCloud 现在有两个比较常用的镜像,一个是我之前一直使用的 nextcloud 镜像,调查了一下才发现原来这个镜像是社区维护的,官方还推出了一个 All-in-One 的镜像,集成了 NextCloud 所依赖的组件,包括数据,Web 服务器等等。因为我个人还是对原来的那个 nextcloud 镜像比较熟悉,所以还是用来原来的那个镜像,一来镜像比较小,而来比较轻量,可以自己选择需要的组件,搭配 MySQL (Maria) 还是比较好维护的。

NextCloud 的 Docker 镜像有两个:

  • nextcloud
  • All-in-One

一个是社区维护的,一个是包含了其他依赖组件的多合一镜像。如果非要说区别,就是 nextcloud 镜像比较小,只包含了 Nextcloud 自身,需要用户自己准备数据库,Web 服务器等。而 All-in-One 镜像则包含了数据库,Web 服务器等等,但是镜像的提及也比较大。All-in-One 的镜像中包含了 Apache,Database,Nextcloud,Notify Push,Redis,Collabora,Talk,Imaginary 等等组件。

配置

通过环境变量来配置 SMTP

SMTP

  • SMTP_HOST (not set by default): The hostname of the SMTP server.
  • SMTP_SECURE (empty by default): Set to ssl to use SSL, or tls to use STARTTLS.
  • SMTP_PORT (default: 465 for SSL and 25 for non-secure connections): Optional port for the SMTP connection. Use 587 for an alternative port for STARTTLS.
  • SMTP_AUTHTYPE (default: LOGIN): The method used for authentication. Use PLAIN if no authentication is required.
  • SMTP_NAME (empty by default): The username for the authentication.
  • SMTP_PASSWORD (empty by default): The password for the authentication.
  • MAIL_FROM_ADDRESS (not set by default): Use this address for the ‘from’ field in the emails sent by Nextcloud.
  • MAIL_DOMAIN (not set by default): Set a different domain for the emails than the domain where Nextcloud is installed.

Redis 配置

搭建之后使用系统的检查,建议使用 Redis 来做缓存,所以又加上了 Redis。

  • REDIS_HOST (not set by default) Name of Redis container
  • REDIS_HOST_PORT (default: 6379) Optional port for Redis, only use for external Redis servers that run on non-standard ports.
  • REDIS_HOST_PASSWORD (not set by default) Redis password

WebDAV 登录使用

Linux 下

Nautilus File Manager

davs://example.com/nextcloud/remote.php/dav/files/USERNAME/

KDE Dolphin File Manager 中

webdav://example.com/nextcloud/remote.php/dav/files/USERNAME/

macOS

https://cloud.YOURDOMAIN.com/remote.php/dav/files/USERNAME/

Windows

https://example.com/nextcloud/remote.php/dav/files/USERNAME/

问题

上传 500 MB 大文件

可以通过 https://data.einverne.info/settings/admin/serverinfo 来查看当前 PHP 支持的最大上传大小。

默认情况下是 512MB 大小。

修改 Docker 的环境变量

PHP_MEMORY_LIMIT=2048M
PHP_UPLOAD_LIMIT=2048M

然后就可以得到

hDb8

当然如果你使用 All-in-One 的 NextCloud 镜像,那就不用担心这个问题了,默认就是 10GB,应该能满足 99%的需求了。

HSTS

检查的时候遇到如下的问题:

The “Strict-Transport-Security” HTTP header is not set to at least “15552000” seconds. For enhanced security, it is recommended to enable HSTS as described in the security tips ↗.

直接在 [[Nginx Proxy Manager]] 中启用 HSTS 即可。

The database is used for transactional file locking

如果遇到如下的问题

The database is used for transactional file locking. To enhance performance, please configure memcache, if available. See the documentation ↗ for more information.

然后安装 Redis,然后配置 Redis 即可。

Your installation has no default phone region set

Your installation has no default phone region set. This is required to validate phone numbers in the profile settings without a country code. To allow numbers without a country code, please add “default_phone_region” with the respective ISO 3166-1 code ↗ of the region to your config file.

对应此问题,在 NextCloud 的 config 配置中添加 sudo vi ~/nextcloud_data/config/config.php

'default_phone_region' => 'JP',

然后重启容器即可。

NextCloud iOS 客户端登录时遇到「不允许 HTTP 重定向」问题

需要修改 sudo vi ~/nextcloud_data/config/config.php,然后添加

  'overwriteprotocol' => 'https',

最终:

  'dbtype' => 'mysql',
  'version' => '27.1.3.2',
  'overwriteprotocol' => 'https',

2023-11-27 docker , nextcloud , cloud , owncloud , cloudreve , cloud-drive , webdav

使用 SyncTV 异地远程一起看视频

之前我都一直使用 [[Plex]] 来同步看视频,基本上可以做到秒级别的共享观看。今天看 GitHub 的时候发现一款叫做 SyncTV 的应用,也是可以通过同步的方式了共享观看视频流,那这样就可以一起看视频,看直播了。原来 Plex 的因为放在了一台欧洲的服务器上,在国内播放的时候总是会出现卡顿,一来是带宽限制,二来是经常发现有转码,所以常常需要我预先转码为低码率的视频才能流畅播放,出现的这个 SyncTV ,我可以搭配一台地理位置比较好的,比如日本的机器,然后通过代理的方式播放,不知道会不会提升一下使用体验。

SyncTV 使用同步的功能,确保了观看视频的人都在同一个时刻,并且可以暂停,回退,快进,每一个人的状态也都是同步的。SyncTV 也支持直播流。SyncTV 也提供了一个私密的 Theater,可以在其中进行聊天,实时交流。

h9p9

SyncTV

SyncTV 是一个可以让用户远程一起观看电影或者直播的程序,SyncTV 使用 Go 语言编写。它提供了同步观看,在线聊天的功能。使用 SyncTV 可以与朋友和家人一起观看视频和直播。

SyncTV 可以保证所有观看的人都在同一个时间点上,这意味着暂停、回退或者快进视频都可以同步到其他人,SyncTV 不仅可以添加视频流,还添加直播流。

功能:

  • 同步观看
  • 直播同步
  • 聊天
  • 弹幕

hAO6

安装

[[SyncTV]] 因为是 Go 语言实现,所以可以直接通过脚本二进制安装,我这里则使用 Docker 安装,详细的配置可以参考我的 dockerfile

安装完成之后可以通过 [[Nginx Proxy Manager]] 或其他工具反向代理端口。

因为我安装的时候把目录映射到了 ~/synctv 下, 所以可以修改该目录下的配置文件来配置 SyncTV。

配置

可以简单看一下默认的配置文件

❯ cat ~/synctv/config.yaml
log:
    enable: true
    # can be set: text | json
    log_format: text
    # if it is a relative path, the data-dir directory will be used.
    file_path: log/log.log
    # max size per log file
    max_size: 10
    max_backups: 10
    max_age: 28
    compress: false
server:
    http:
        listen: 0.0.0.0
        port: 8080
        # enable http3/quic need set cert and key file
        quic: true
        cert_path: ""
        key_path: ""
    rtmp:
        enable: true
        listen: "" # default use http listen
        port: 0 # default use server port
jwt:
    secret: rN
    expire: 48h
database:
    # support sqlite3, mysql, postgres
    type: sqlite3 # default: sqlite3
    # when type is not sqlite3, and port is 0, it will use unix socket file
    host: ""
    port: 0
    user: ""
    password: ""
    # when type is sqlite3, it will use sqlite db file or memory
    db_name: synctv # default: synctv
    # mysql: true, false, skip-verify, preferred, <name> postgres: disable, require, verify-ca, verify-full
    ssl_mode: ""
    # when not empty, it will ignore other config
    custom_dsn: ""
    # sqlite3 does not support setting connection parameters
    max_idle_conns: 4
    max_open_conns: 64
    conn_max_lifetime: 2h
    conn_max_idle_time: 30m
oauth2:
    providers:
        github:
            client_id: 55a
            client_secret: 3ea33
            redirect_url: ""
        google:
            client_id: 2382
            client_secret: GOC
            redirect_url: ""
    plugins: []
rate_limit:
    enable: false # default: false
    period: 1m
    limit: 300
    # configure the limiter to trust X-Real-IP and X-Forwarded-For headers. Please be advised that using this option could be insecure (ie: spoofed) if your reverse proxy is not configured properly to forward a trustworthy client IP.
    trust_forward_header: false # default: false
    # configure the limiter to use a custom header to obtain user IP. Please be advised that using this option could be insecure (ie: spoofed) if your reverse proxy is not configured properly to forward a trustworthy client IP.
    trusted_client_ip_header: ""
vendor:
    # default use local vendor
    bilibili: {}

默认使用 sqlite3 作为数据库,自己用也差不多可以了。

使用

启动之后,进入网页,非常简洁,因为配置了使用 GitHub OAuth2,所以直接使用 GitHub 登录。

登录之后可以创建房间,然后在设置中添加播放的地址,视频直链,或者直播源,或者 Bilibili 视频,因为 B 站视频最简单,我就尝试了一下,但是发现 SyncTV 只能解析 480P 的视频源,还是有一些影响观感的。

如果不想看了依旧可以左下角删除房间,这些操作需要房主才可以操作,其它人只能播放或者暂停。

如果要添加视频直链,可以考虑一下使用 [[AList]] 或者直接 Nginx 共享一个出来。

reference


2023-11-26 docker , synctv , video , plex , emby , linux , docker , livesteam , streaming

自托管的服务部署平台 Coolify

Coolify 是一个可以自托管的,类似 [[Heroku]] / [[Netlify]] / [[Vercel]] 的 [[PaaS]] 服务。

用户只需要在后台点击就可以托管应用,数据库,或其他开源服务。

  • [[Coolify]] 支持非常多的语言,包括静态代码,Svelte,React,Vue,Next,Nuxt,Astro,PHP,Rust 等等
  • 支持反向代理和免费的 SSL 证书(Let’s Encrypt)
  • 数据库支持 MongoDB,MySQL,PostgreSQL,CouchDB,Redis 等等
  • 也支持一键安装常用的应用,包括 WordPress,Ghost,Plausible Analytics,NocoDB,Bitwarden/Vaultwarden,LanguageTool,[[n8n]],VSCode Server 等服务
  • 也天然支持 Docker

4qv8

Price

Coolify 是一个开放源代码的项目,但是如果你觉得 Coolify 很棒,也可以通过付费,或者捐赠来支持作者

Installation

为了安装 Coolify 需要满足最低的资源要求

  • 2 CPU,因为编译部署任务比较繁重的时候看情况增加 CPU 计算能力
  • 2 GB,如果部署的服务比较多,看情况增加内存
  • 30 GB 以上的空间,镜像地址,以及数据库可能占用过多的磁盘空间,实时监控

在 root 下,一键安装脚本

apt install curl wget git jq jc
curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash

上述一键安装的脚本,会安装 Docker 并做一些配置,并启动 Coolify 容器。

注意容器启动之后会使用 8000 端口,注意在防火墙中放行。Coolify 还会用到如下的端口

  • 80,443 反向代理
  • 6001 websocket
  • 9000~9100 公开端口(可选)

需要注意的是如果使用 Coolify 自带的应用安装,可能有一些应用需要提供域名,单纯的使用 IP 和端口无法正常访问。

安装之后,第一个注册的用户就是管理员,可以查看部署所有的资源,应用等等。

手动安装

因为 Coolify 是基于 Docker 的,所以也可以选择手动安装。

使用

之后每个注册的用户都拥有自己的团队,资源,只能访问自己的资源。

服务列表

4AIn

支持服务列表包括并不局限于如下:

  • WordPress
  • Ghost
  • Plausible Analytics
  • NocoDB
  • VSCode Server
  • MinIO
  • VaultWarden
  • LanguageTool
  • n8n
  • Uptime Kuma
  • MeiliSearch
  • Umami
  • Fider
  • Hasura
  • Appwrite
  • Glitchtip

sslip.io

sslip.io is a DNS server that maps specially-crafted DNS A records to IP addresses (e.g. “127-0-0-1.sslip.io” maps to 127.0.0.1).

  • [[Fider]]
  • [[uptime-kuma]]
  • [[Plausible Analytics]]

2023-11-22 coolify , open-source , pass , vercel , netlify , heroku , self-hosted

电子书

本站提供服务

最近文章

  • AI Shell 让 AI 在命令行下提供 Shell 命令 AI Shell 是一款在命令行下的 AI 自动补全工具,当你想要实现一个功能,敲一大段命令又记不住的时候,使用自然语言让 AI 给你生成一个可执行的命令,然后确认之后执行。
  • 最棒的 Navidrome 音乐客户端 Sonixd(Feishin) Sonixd 是一款跨平台的音乐播放器,可以使用 [[Subsonic API]],兼容 Jellyfin,[[Navidrome]],Airsonic,Airsonic-Advanced,Gonic,Astiga 等等服务端。 Sonixd 是一款跨平台的音乐播放器,可以使用 [[Subsonic API]],兼容 Jellyfin,[[Navidrome]],Airsonic,Airsonic-Advanced,Gonic,Astiga 等等服务端。
  • 中心化加密货币交易所 Gate 注册以及认证 Gate.io 是一个中心化的加密货币交易所。Gate 中文通常被称为「芝麻开门」,Gate 创立于 2013 年,前身是比特儿,是一家致力于安全、稳定的数字货币交易所,支持超过 1600 种数字货币的交易,提供超过 2700 个交易对。
  • 不重启的情况下重新加载 rTorrent 配置文件 因为我在 Screen 下使用 rTorrent,最近经常调试修改 rtorrent.rc 配置文件,所以想要找一个方法可以在不重启 rTorrent 的情况重新加载配置文件,网上调查了一下之后发现原来挺简单的。
  • Go 语言编写的网络穿透工具 chisel chisel 是一个在 HTTP 协议上的 TCP/UDP 隧道,使用 Go 语言编写,10.9 K 星星。