MoreRSS

site iconDejavu Moe修改

00 后,男、处女座、自托管服务爱好者
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Dejavu Moe的 RSS 预览

Netcup 免税账号注册及购买服务器全记录

2025-11-26 08:01:33

介绍

Netcup GmbH 是一家总部位于德国 Karlsruhe 的老牌互联网服务提供商,中文名称「网杯」,常称为 NC。提供 Web Hosting、域名注册、托管服务器等服务,所有托管使用 100% 绿色电力。服务合同受德国法律管辖,并且符合 欧盟严格数据保护法规 (GDPR)

这家公司以提供 高度稳定 的服务和 严谨的合同制度 而闻名。通过在互联网上找到的公开评价,大概需要注意以下几个点:

  • 注册需要 真实信息,他们会进行身份审核
  • 后付费机制,产生支付账单 拒付会被起诉(据说会发律师函到国内)
  • 合同为无限期,不同服务有不同最短合同期,取消合同 需要 提前一个月
  • 所有 VPS/Root Server 均 开放 25 端口,支持 rDNS
  • 账单在不同国家使用 不同税率,中国大陆属于 免税

Netcup 不对客户托管的服务进行内容审查,但是客户为自己托管的内容负责。如果不用于非法用途(钓鱼、垃圾邮件、法律争议……),这家非常适合长期稳定建站。

他们正在进行黑五折扣和闪购中,近期还能蹲到 €0.84/月的 VPS(1 欧鸡)。昨天我纠结了好久,最终选择了 RS 1000 G12 Pro 这款服务。

RS 系列 (Root Server,类似 VDS) ,相比普通的 VPS 更贵,相对来说性能更好,但是对普通人几乎没啥感觉,因此请 理性消费,量入为主

这款吸引我的有这些:

  • AMD EPYC9634 4 vCPU(独享)
  • 8GB DDR5 ECC RAM(独享)
  • 2.5G 带宽,不限制流量
  • 512GB NVMe SSD(由 256GB 翻倍)
  • 终身价格 €8.24/月(季付合同)
  • 30 天满意度退款

IP 非常纯净、CPU、RAM 和 SSD 性能强劲。购买获得第一个月免费,使用 €5.00 优惠券,第一个季度账单为 8.24*0 + 8.24*2 - 5 = €11.48,按照当前汇率,前三个月 31.36 元/月,此后 67.47 元/月。

说实话,这个价格真的不算便宜😭,但是它的性能和可靠性完全值得。我正在将所有服务迁移过来,此后几年将只保持续费这款,终身合同,正是我需要的。

注册账号购买服务

我此前并未使用过这家服务,Google 了以下,Netcup 注册免税账号和身份审核似乎相当复杂,当时距离这款折扣只有不到 20 分钟了,抱着试一试的尝试,最终我完成了购买,保持信息真实实际还是很简单的。

下面记录我的注册账号和支付订单全过程,在开始之前,请关闭代理

选择免税区域

进入 Netcup 折扣页面,左上角选择国家区域,未找到中国,选择左上角 Other 即可

获取优惠券

往下滑,订阅他们的 Newsletters 可以获得 €5 的优惠券

输入邮件地址,稍后会在邮箱收到一个 €5 优惠码(不可用于域名注册)

以下 €5.00 优惠券码适用于新用户购买服务(含有 AFF,不包含域名注册)

36nc176411667619
36nc176411667618
36nc176411667617
36nc176411667616
36nc176411667615
36nc176411667614
36nc176411667613
36nc176411667612
36nc176411667611
36nc176411667610

还有 10 个

36nc17641166769
36nc17641166768
36nc17641166767
36nc17641166766
36nc17641166765
36nc17641166764
36nc17641166763
36nc17641166762
36nc17641166761
36nc17641166760

选择服务区域

RS 1000 G12 Pro 服务可选德国 Nureberg 或美国 Manassas 区域,我选择的美东

确认订单信息

去购物车结算

再次检查价格

注册账号

因为此前我们没有账号,这里需要注册一个账号,填写信息尽量真实

  • 姓名使用拼音,比如 San Zhang
  • 中文地址信息翻译一下,不能有空格,可以使用连字符 -.
  • 邮编保持真实,接近你的地址
  • 国家选择 CN-China
  • 邮箱尽量避免国内邮箱,可以使用域名邮箱
  • 手机号码使用 +8612345678901 的写法

完成订单

验证身份

稍后我们会受到 2 封来自 Netcup 的邮件,其中一封包含了 Netcup 客户控制面板 (CCP) 的登录链接和账号密码信息,可能是他们的系统出 Bug 了,我同时收到了两封包含两个不同的用于登录 CCP 的账号和密码😅。

另一封邮件 Identity Verification required 里告诉我们需要进行身份验证,点击包含 Token 的链接并使用另一封邮件里的凭据登录 CCP,登录后建议立即设置 2FA 保护账号。

选择预支付验证,这是最简单的验证方式

支付订单

进入 CCP 控制台,左侧 Invoice 里面有一个刚才购买服务的未支付订单,支付这笔订单将同时完成上一步的身份验证。

点击该账单,进入支付及验证环节

同意条款,选择支付方式

Netcup 支持 PayPal、借记卡/信用卡或银行汇款。这里以信用卡为例(通过 Stripe 支付)

支付成功后 Invoice 里的发票显示已支付,此时支付就已经成功啦。

访问 SCP

他们处理订单和验证信息需要一些时间,完成后,会收到包含登录 Netcup 服务器控制面板 (SCP) 凭据的登录邮件,里面包含了服务器的 SSH 登录信息。

总结

Netcup 是一家值得信赖的服务商,开始前要仔细了解使用政策和付款合同,取消订单要在订单周期结束提前一个月。采用后付费意味着我们可以先获得服务再支付订单,未支付账单超过 14 天会产生滞纳金,未按时支付他们可能会通过法律起诉你。

除去这些,他们相当稳定,SLA 可用性不错(最低≮ 99.9%)。SCP 面板没有出入站流量端口的防火墙,服务带有 2Tbps 的 DDos 防护(最高 L4)。给予客户最大的自由,完全由你自己管理服务器,这就够了。

我采取了一些适当措施来保护服务器的访问,详阅 新到手的 Linux 服务器,我这样设置

(完)

新到手的 Linux 服务器,我这样设置

2025-11-25 20:00:41

概要

本文介绍每次上手一台新的 Linux 服务器后,我的一些 基本设置步骤,包括:

  • 使用一键 DD 脚本重装纯净的 Debian GNU/Linux 操作系统
  • SSH 安全和 Fail2ban 设置
  • 配置 UFW 防火墙
  • 安装 Nginx Web 服务器
  • 安装 Docker CE 及必要插件
  • 使用 Cloudflare CDN 保护服务和全球加速

并不一定适合所有人的需求,仅作为我每次快速设置新服务器的速查手册。建议搭配以下内容一起使用:

重装系统

选择脚本

网络上支持一键 DD 重装系统的脚本有很多,我主要使用这两个:

  1. bin456789/reinstall
  2. bohanwood/debi

前者支持的系统选择更多,后者则专注于 Debian GNU/Linux 的最小发行版。两者都在 GitHub 上开源,且经过长期的社区关注和审查,安全性大可以放心。

无论如何,在正式开始之前,仔细阅读一遍脚本作者的说明(文档说明详细易读),知道自己在做什么,预期会出现什么。

我在所有服务器上都一直使用 Debian,下面以 debi 脚本为例。

下载脚本

curl -fLO https://raw.githubusercontent.com/bohanyang/debi/master/debi.sh

执行脚本

赋予脚本可执行权限

chmod +x debi.sh

开始重装系统

sudo ./debi.sh \
  --version 13 \
  --architecture arm64 \
  --cloudflare \
  --user viamoe \
  --authorized-keys-url https://github.com/githubUserName.keys \
  --ssh-port 22122 \
  --bbr

上面参数的意义:

  • --version 13

    指定 Debian 13(代号 Trixie)为安装的版本

  • --architecture arm64

    指定系统架构,这里的 arm64,只适用于 ARM64 架构的机器(比如甲骨文 ARM VPS)

  • --cloudflare

    使用 Cloudflare 作为系统默认 DNS

  • --user viamoe

    创建一个普通用户,用户名为 viamoe,脚本自动配置该用户的 sudo 权限

  • --authorized-keys-url https://github.com/githubUserName.keys

    指定 SSH 公钥 URL 来源,用于设置 SSH 免密码登录

  • --ssh-port 22122

    修改 SSH 默认端口为 22122,你应当修改它,减少被自动扫描攻击的风险

  • --bbr

    启用 BBR(TCP 拥塞控制算法),提升网络在高延迟或跨国网络环境下传输性能

一切就绪,开始重装系统

sudo reboot

期间你可以使用 VNC 查看系统安装进度,根据服务器性能或网络环境,稍等几分钟,新的系统即将就绪。之后,使用重装阶段预设的用户名密码或 SSH 密钥登录服务器。

安装常用软件包

我们的服务器正在运行的是一个纯净、最小、最新的 Debian GNU/Linux 操作系统,需要安装一些基础或常用的软件包。

基本工具包

sudo apt update
sudo apt install \
    ca-certificates \
    apt-transport-https \
    man \
    build-essential \
    git \
    curl \
    wget \
    screen \
    btop \
    net-tools \
    tree \
    neovim

安装 Docker

参考 Docker 官方文档 说明的步骤,下列命令不保证时效性

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl status docker

安装 Nginx

同样地,参考 Nginx 项目文档——在 Debian 上的 安装步骤

# install the prerequisites
sudo apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring

# import gpg key
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
    
# verify gpg key
mkdir -m 700 ~/.gnupg
gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/debian `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

# install nginx
sudo apt update
sudo apt install nginx

# start nginx
sudo systemctl start nginx

SSH 基本加固

编辑 SSH 配置文件

sudo nvim /etc/ssh/sshd_config

这里有一些我们需要关注的配置项目:

  • Port 22122

    SSH 服务监听的默认端口,我们已在重装脚本中指定

  • PermitRootLogin no

    禁止 Root 用户直接登录,使用普通用户登录,使用 sudo 提权

  • PasswordAuthentication no

    禁止使用密码登录 SSH,我们应当使用密钥对或实体安全密钥(如 Yubikey、Canokey 等)进行登

  • PermitEmptyPasswords no 禁止空密码登录

  • ChallengeResponseAuthentication no 禁用键盘交互式密码认证

  • PubkeyAuthentication yes 启用公钥认证,此前已在重装脚本中指定

  • UseDNS no 禁用 DNS 反查

  • X11Forwarding no 禁用 X11 转发,如果你不知道这是什么那就可以禁用

保持当前的 SSH 会话不要断开连接,重启 SSH 服务

sudo systemctl restart sshd

重开一个 SSH 会话,再次登录当前服务器,确保连接正常,否则返回第一个 SSH 会话中进行检查。

配置 Fail2ban

使用 Fail2ban 保护我们的服务器免受 SSH 爆破,并合理封禁异常的 IP 地址

安装 Fail2ban

sudo apt update
sudo apt install fail2ban

SSH 守护配置

创建一个最小的,仅用于守护 SSH 登录的 Fail2ban 配置文件

sudo nvim /etc/fail2ban/jail.local

配置内容如下:

[DEFAULT]
# 忽略 IP 地址:防止将自己封禁。
# 如果您使用动态 IP,不要设置您的公网 IP。
# 127.0.0.1/8 和 ::1 忽略本地回环地址。
ignoreip = 127.0.0.1/8 ::1

# 封禁时间:封禁 1 小时(3600 秒)
bantime  = 1h

# 查找时间:在 10 分钟内(600 秒)
findtime = 10m

# 最大重试次数:如果在 findtime (10 分钟) 内失败了 3 次,则封禁。
maxretry = 3

[sshd]
# 启用 SSH 保护
enabled = true

# SSH 服务的监听端口:确保这里设置为您的自定义端口 22122
port    = 22122

# 日志文件路径:Debian/Ubuntu/CentOS 通常使用 auth.log,默认配置会自动检测。
# logpath = /var/log/auth.log 
# filter:使用默认的 sshd 过滤器(无需修改)
# filter = sshd

启动 Fail2ban

sudo systemctl enable fail2ban
sudo systemctl restart fail2ban

检查配置

sudo fail2ban-client status sshd
sudo fail2ban-client status

如果输出显示 Jail status: ... Status: running,在 Jail list 中看到了 sshd,应该就配置成功了。

配置 UFW 防火墙

安装 ufw

sudo apt install ufw

设置默认策略

默认拒绝所有传入/入站连接

sudo ufw default deny incoming

默认允许所有传出/出站连接

sudo ufw default allow outgoing

现在大多数服务器有 IPv6 公网 IP,启用 IPv6 支持

sudo sed -i 's/IPV6=no/IPV6=yes/' /etc/default/ufw

允许 SSH 传入/入站连接

千万不要忘记 SSH 端口,以免自己被「锁在」UFW 外面!

# 替换为实际 SSH 端口
sudo ufw allow 22122/tcp

Cloudflare 回源访问规则

Nginx 默认监听端口 80(HTTP) 和 443(HTTPS),要允许 Cloudflare CDN 回源访问,必需将 Cloudflare IP 段添加到 UFW 白名单里。

新建一个 Cloudflare IPs 自动更新脚本

sudo nvim /usr/local/bin/ufw-cf-whitelist

该脚本用于:

  • 移除之前旧的 Cloudflare IP 白名单规则
  • 获取 Cloudflare 最新的 IPv4 和 IPv6 列表
  • 允许列表中每个 IP 段访问 80/443 端口

脚本内容如下:

#!/bin/bash

# Cloudflare 官方 IP 列表
IPV4_URL="https://www.cloudflare.com/ips-v4"
IPV6_URL="https://www.cloudflare.com/ips-v6"

echo "=== 1. 清除现有的 Cloudflare UFW 规则..."
# 清除旧的规则(通过删除带有 "Cloudflare" 注释的规则)
# 注意:UFW 不直接支持注释删除,所以这个步骤需要手动或使用更复杂的工具,
# 这里我们采用简单的清理,如果规则不多,可以手动检查 `ufw status numbered`。
# 更好的方法是在每次运行前删除所有 80/443 的 ALLOW 规则,但风险更高。

# 暂时只删除明确的 Cloudflare 规则,以防万一
# sudo ufw delete allow in on any to any port 80/tcp
# sudo ufw delete allow in on any to any port 443/tcp


echo "=== 2. 下载最新的 Cloudflare IP 范围列表..."
# 使用 tempfile 确保下载的文件安全
IPV4_TEMP=$(mktemp)
IPV6_TEMP=$(mktemp)

curl -s $IPV4_URL -o $IPV4_TEMP
curl -s $IPV6_URL -o $IPV6_TEMP

echo "=== 3. 添加 IPv4 规则 (80/443)..."
while read ip; do
    if [[ ! -z "$ip" ]]; then
        sudo ufw allow proto tcp from $ip to any port 80 comment 'Cloudflare IPv4 HTTP'
        sudo ufw allow proto tcp from $ip to any port 443 comment 'Cloudflare IPv4 HTTPS'
    fi
done < $IPV4_TEMP

echo "=== 4. 添加 IPv6 规则 (80/443)..."
while read ip; do
    if [[ ! -z "$ip" ]]; then
        sudo ufw allow proto tcp from $ip to any port 80 comment 'Cloudflare IPv6 HTTP'
        sudo ufw allow proto tcp from $ip to any port 443 comment 'Cloudflare IPv6 HTTPS'
    fi
done < $IPV6_TEMP

echo "=== 5. 清理临时文件..."
rm $IPV4_TEMP $IPV6_TEMP

echo "=== 6. 完成 Cloudflare 白名单配置。"
ufw status numbered

赋予脚本可执行权限

sudo chmod +x /usr/local/bin/ufw-cf-whitelist

执行脚本,更新 ufw 规则

sudo ufw-cf-whitelist

启动 ufw 服务

sudo ufw enable
sudo ufw reload

若是提示:

Command may disrupt existing ssh connections. Proceed with operation (y|n)?

检查 ufw 规则

sudo ufw status numbered

计划任务

实际上 Cloudflare IP 段几乎很少变动(最起码最近两年多完全没有变化),因此这个步骤不是必须的。使用 Crontab 计划:

sudo crontab -e

比如每天凌晨 3 点执行一次

0 3 * * * /usr/local/bin/ufw-cf-whitelist.sh > /dev/null 2>&1

防止 Docker 在 UFW 上打洞

Docker 容器的网络,如果没有做到最佳实践,它是可以在 ufw 上「打洞」的(本质是 iptables),详情可见 chaifeng/ufw-docker

这个 check-if-docker-break-ufw.sh 脚本用于检查是否出现了这种情况

#!/usr/bin/env bash
# ===============================================================
# check-docker-ports.sh
# 检查 Docker 容器端口暴露与 UFW 状态
# ===============================================================

RED="\033[0;31m"
GREEN="\033[0;32m"
YELLOW="\033[1;33m"
RESET="\033[0m"

echo "🔍 正在检查 Docker 端口暴露情况..."
echo "=============================================================="

# 获取 docker ps 输出
docker_ps=$(docker ps --format '{{.Names}}|{{.Ports}}')

if [ -z "$docker_ps" ]; then
  echo "❌ 没有正在运行的容器。"
  exit 0
fi

printf "%-25s %-25s %-20s\n" "容器名" "绑定地址" "状态"
echo "--------------------------------------------------------------"

while IFS='|' read -r name ports; do
  if [[ -z "$ports" ]]; then
    printf "%-25s %-25s ${GREEN}%-20s${RESET}\n" "$name" "无对外端口" "安全"
    continue
  fi

  # 分析每个映射
  for port in $(echo "$ports" | tr ',' '\n'); do
    port=$(echo "$port" | sed 's/ //g')

    if [[ "$port" =~ 0\.0\.0\.0 ]]; then
      printf "%-25s %-25s ${RED}%-20s${RESET}\n" "$name" "$port" "⚠️ 公网暴露"
    elif [[ "$port" =~ 127\.0\.0\.1 ]]; then
      printf "%-25s %-25s ${GREEN}%-20s${RESET}\n" "$name" "$port" "本机安全"
    else
      printf "%-25s %-25s ${YELLOW}%-20s${RESET}\n" "$name" "$port" "内部网络"
    fi
  done
done <<< "$docker_ps"

echo "--------------------------------------------------------------"
echo "🧱 检查宿主机端口监听状态..."
ss -tlnp | grep -E 'docker|LISTEN' | awk '{print $4, $6}' | sed 's/users://g' | sed 's/"//g' | sed 's/,//g' | sed 's/\[::\]://g'
echo "--------------------------------------------------------------"

echo "🧩 检查 UFW 规则..."
sudo ufw status numbered

echo "=============================================================="
echo "✅ 检查完成。绿色=安全,黄色=内部安全,红色=公网暴露。"

最简单的方式,不要将任何 Docker 容器的端口绑定到 0.0.0.0 上,只需将暴露端口绑定到 127.0.0.1 上即可。

(完)

Docker 自托管 Cloudreve Pro 私有网盘服务

2025-11-22 19:10:46

简介

Cloudreve 是一款开源、强大、稳定、安全的私有网盘自托管服务。社区版 开源免费,适合 个人或家庭 搭建私有云存储。Pro 版 在社区版基础上拓展了更多功能,通过 master/slave 主从架构,以及完善的集群调度与负载均衡功能,很适合团队协作或企业私有域中部署 商业化 网盘存储。

Pro 版额外提供:

  • 增值服务体系: 内置 Stripe、微信、支付宝等支付接口渠道,快速构建付费体系

  • 分享与协作: 支持更为精细化的用户分享策略和权限,灵活控制链接分享和访问

  • 多维度存储策略: 针对用户、用户组配置差异化存储方案,匹配不同业务场景

  • 集成高级认证功能: 支持 Logto/OIDC 等 SSO 提供商登录,可接入 QQ 互联登录

  • 增值服务拓展: 基于容量、额度、积分与商城构建的,完善的增值服务链路

Black Friday 黑五特惠 中,使用优惠码 BFSC2025 购买 Cloudreve Pro 或 iOS VOL 许可证获得 25% 折扣。

部署服务

本文记录了 Cloudreve Pro 的完整部署过程,特别感谢 Cloudreve 团队慷慨提供的 内容创作者许可证 支持!

SSH 登录 Linux 服务器,新建一个目录,用于 Cloudreve 服务的数据卷持久化

mkdir -p ~/container/cloudreve && cd $_

创建模板

为了方便后期数据备份、管理或迁移,这里使用了 Docker 绑定数据卷的特性。创建一个 docker-compose.yml 模板,看起来应该像这样:

services:
  pro:
    image: cloudreve.azurecr.io/cloudreve/pro:latest
    container_name: cloudreve-pro-backend
    depends_on:
      - postgresql
      - redis
    restart: unless-stopped
    ports:
      - "127.0.0.1:5212:5212"
      # for magnet/bt download
      #- "6888:6888"
      #- "6888:6888/udp"
    environment:
      - CR_CONF_Database.Type=postgres
      - CR_CONF_Database.Host=postgresql
      - CR_CONF_Database.User=cloudreve
      - CR_CONF_Database.Name=cloudreve
      - CR_CONF_Database.Port=5432
      - CR_CONF_Redis.Server=redis:6379
      - CR_LICENSE_KEY=${CR_LICENSE_KEY}
    volumes:
      - ./data:/cloudreve/data

  postgresql:
    image: postgres:17
    container_name: cloudreve-postgres
    restart: unless-stopped
    environment:
      - POSTGRES_USER=cloudreve
      - POSTGRES_DB=cloudreve
      - POSTGRES_HOST_AUTH_METHOD=trust
    volumes:
      - ./db:/var/lib/postgresql/data
      - /etc/localtime:/etc/localtime:ro

  redis:
    image: redis:latest
    container_name: cloudreve-redis
    restart: unless-stopped
    volumes:
      - ./redis:/data

拉取镜像

登录 Cloudreve 授权管理系统,进入授权管理

获取 Docker 私有仓库访问凭证

复制登录命令

进行一次登录

sudo docker login -u <用户名> -p <密码> cloudreve.azurecr.io

看到 Login Succeeded 代表登录成功,此时可以拉取 Docker 镜像

sudo docker compose pull

验证授权

在正式启动 Cloudreve Pro 服务前,我们需要先给子域名绑定授权

点击 保存 后获取用于激活许可证的授权密钥,将其暴露给环境变量

export CR_LICENSE_KEY=你的授权密钥

启动服务

一切就绪,现在可以启动 Cloudreve 服务了

sudo -E docker compose up -d

观察日志,正常情况下应该没有报错、警告和容器自动退出重启的情况,否则请返回检查

sudo docker compose logs -f

反向代理

先决步骤可参考 服务器使用 Cloudflare CDN 的最佳实践,通常我会使用 Docker 外部宿主机上的 Nginx 进行反向代理,并仅由 Cloudflare CDN 回源访问,这是符合要求的 Nginx 虚拟主机配置文件示例:

server {
    listen 80;
    listen [::]:80;
    # change it to your domain
    server_name pan.via.moe;
    # force https
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;
    # change it to your domain
    server_name pan.via.moe;

    # logs
    access_log /var/log/nginx/cloudreve.access.log;
    error_log /var/log/nginx/cloudreve.error.log;

    # Cloudflare Origin CA
    ssl_certificate /etc/nginx/cert/wild.via.moe.pem;
    ssl_certificate_key /etc/nginx/cert/wild.via.moe.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    
    # for Cloudflare SSL ciphers
    ssl_prefer_server_ciphers off;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256;
 
    # upload limit 10GB
    client_max_body_size 10G; 
  
    # nerver cache rules
    location ~* ^/(sw\.js|index\.html|manifest\.json)$ {
        proxy_pass http://127.0.0.1:5212;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        
        # cloudflare real ip
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # no cache
        add_header Cache-Control "no-cache, no-store, must-revalidate, max-age=0";
        add_header Pragma "no-cache";
        add_header Expires "0";
    }

    location / {
        proxy_pass http://127.0.0.1:5212;
        proxy_redirect off;
        
        # Header
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        
        # cloudflare real ip
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # WebSocket 
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

检查 Nginx 配置

sudo nginx -t

输出正确

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

重载 Nginx 配置

sudo nginx -s reload

在 Cloudflare 将域名解析到服务器 IP 并开启 Cloudflare 代理

尽管我们已经在前面的 Nginx 配置文件中声明了缓存规则,考虑到 Cloudflare 仍可能会错误的缓存这些文件,建议在 Cloudflare 中额外添加一条 缓存规则,原因见官方文档 检查缓存配置 的说明。

大功告成!现在应当可以访问 Cloudreve 服务了。

初始配置

注册管理员

访问你的域名,第一个注册的用户即为管理员

设置站点 URL

安全设置

建议对管理员用户登录添加额外保护

可以添加额外的验证码服务,建议使用 Cloudflare Turnstile,这样下次我们就可以享受到和大型网站一样的全球宕机服务啦~ 出院!

离线下载

离线下载 功能默认使用 Aria2 服务(集成在容器镜像内),对于一般的 HTTP 下载无需任何配置,开箱即用

若要下载 BitTorrent 或 Magnet 链接,仍需要在文章开头的 docker-compose.yml 模板里取消注释 6888 端口,并在安全组中放行相应的端口。

  ports:
    - "127.0.0.1:5212:5212"
    # uncomment below for magnet/bt download
    - "6888:6888"
    - "6888:6888/udp"

也可以使用 qBittorrent 作为下载器,👉 了解更多关于 Cloudreve 离线下载的 细节

GiffGaff SIM 卡使用体验和注意事项

2025-11-17 18:40:00

前言

一直琢磨着弄一张国外 SIM 卡,用来接收各种服务的验证码。Google Voice 很香,零成本就能保号,但毕竟是 VoIP 号码,不少网站看见它就直接把我拒之门外了。

于是把目光转向了 GiffGaff,它是英国一家挂在 O2 / Virgin Media O2 网络上的 MVNO(虚拟移动网络运营商),申请实体卡或 eSIM 免费,Pay as you go(PAYG)在中国大陆保号成本非常低。

使用流程

获取卡片

几年前我在官网申请过几次,但是从来没收到平邮信件,丢件率无限接近于 100%。9 月份又申请了一张,依然没收到,应该是又丢了。前段时间在澳洲读书的同学放假回国,我就托他带了两张回来,今天激活了一张,本文记录一些细节和注意事项。

最近 GiffGaff 已经暂时停止了向一些国家或地区寄送 SIM 卡,其中也包括中国大陆。对于实体卡片,国内电商平台可以买,一般价格为 10~30 元/张,一些主机论坛、Telegram 上也有人免费送卡。无论如何,请注意保护个人隐私和防止被骗。

如果你有支持 eSIM 的手机,可以直接下载 GiffGaff 的 App 获取非实体卡。后期我们也可以将实体 SIM 卡转为 eSIM 卡。

激活卡片

登录 GiffGaff 官网,点击 Active your SIM 进入激活流程

输入 SIM 包装框上的激活码,点击激活按钮即可。

充值余额

准备一张 Visa / 万事达等外币卡,我使用的中国银行长城跨境通万事达卡(中行莫奈卡)。

一些借记卡对于非美元交易,冻结额度会不一样。比如这里使用的中行莫奈卡对于英镑交易冻结率为 102%,因此我最低需要购汇 10.20 英镑,否则充值会失败,首次充值后,后续也可以使用 PayPal 充值。

最低充值起点为 £10,现在 GiffGaff 已经取消了充值赠送 £5 活动。

填好信息,充值完成

我们的电话号码显示为 07 开头,实际使用去掉开头的 0 ,带上区号就是 +44 7xxx xxxxxx

开始使用

将 SIM 卡插入手机就可以使用了,第一次使用前,iPhone 用户需要 提前关闭 FaceTime 通话 iMessage 信息以防发送激活短信收费。之后在设置里选定使用 FaceTime/iMessage 的 SIM 卡为另一张就可以啦。部分老版本 iPhone 可能需要在网上寻找较新的 IPC 运营商文件,使用爱思助手等工具刷入食用。

对于 Android 手机,只要支持中国移动和中国联通网络,一般就可以直接使用了,特别情况,可以参考官网说明 设置 APN 接入点

APN: giffgaff.com
Username: 留空/不填
Password: 留空/不填
Server: http://mmsc.mediamessaging.co.uk:8002
MMSC: http://mmsc.mediamessaging.co.uk:8002
Proxy: 留空/不填
MMS proxy: 留空/不填
MMS port: 留空/不填
MCC: 234
MNC: 10
Authentication type: 留空/不填
APN Type: mms

关闭语音信箱

GiffGaff 语音信箱默认开启,当来电未接、手机关机或无服务情况下,按分钟收取漫游费用,强烈建议关闭。在英国国内拨打服务电话关闭,非英国用户可以 联系客户代理 协助关闭。

保号和资费

保号政策很简单,每 180 天内至少进行一次费用变动的操作:充值、打电话、数据上网、发短信,其中发短信成本最低,180 天到期前会收到邮件提醒。

  • 通话 拨打 / 接听电话 £1/分钟,拨打电话前 30s 固定计费,后续按秒计费
  • 短信 发送 £0.30/条,接收免费

综上,固定保号成本为 £0.60/年,即每年发送两条短信花费约 5.59 元

如何和 GiffGaff 用户之间免费通话?(英国境内)

需要至少每三个月充值一次或购买一次套餐,才能享受和 GiffGaff 其他用户之间的免费通话。单次免费通话时长为 60 分钟,超过 60 分钟,需要挂断并重新拨号。

如果你可以配置好 Wi-Fi Calling,则可以按照英国区域 计费

常见问题

  1. 收到实体卡片激活期限是多久?

    我咨询了 GiffGaff 的支持人员,得到的答复是「你好,激活 SIM 卡没有严格的截止日期,因此您可以随时激活。我们确实建议在一年内激活它,只是为了安全起见。」

  2. 为什么手动挂断电话也收费?

    在漫游区域,手动挂断电话可能会产生费用,所以收到陌生电话静音即可,等待它自行挂断。

  3. 可以注册 WeChat 吗?

    可以注册,对 IP 和环境要求较高,容易变成 Read-Only 账号

  4. 可以注册 WhatsApp 吗?

    可以注册,IP 干净点就行

  5. 可以注册 TikTok 吗?

    可以,同上。

在 n8n 中使用 Ollama 的本地 LLM 模型

2025-11-06 20:50:18

前言

Oracle 免费 VM.Standard.A1.Flex 实例最多提供 4 个 ARM Ampere CPU、24GB RAM 以及 200GB SSD,尽管 CPU 性能不算顶尖,但对于一些小型 LLM 模型处理轻型任务基本够用。

今天通过 Docker 部署 n8n 服务,顺便尝试了下在里面通过 Ollama 调用本地模型,这下终于可以不让小鸡吃灰了。本文使用以下服务:

  • n8n 是一个开源的自动化工作流平台,对各家 AI 的支持都非常好。我没有这些 AI 平台的 API,就先试试本地 LLM 模型吧,由俭入奢嘛~

  • Ollama 是一款运行本地大语言模型的开源框架,部署起来很简单,可以让各家开源模型快速跑起来。

部署

参考 Docker 官方最新文档安装好 Docker 和 Doker Compose 插件,应该还需要一个反向代理服务器,文中以 Nginx 为例。

n8n

n8n 支持多种数据库(默认 SQLite),这里使用的是 PostgreSQL,提前创建数据卷并设置权限

# n8n data dir
cd ~/container/n8n

mkdir -p n8n_data postgres_data
# node user
sudo chown -R 1000:1000 ./n8n_data

# postgres user
sudo chown -R 999:999 ./postgres_data

chmod -R 700 ./postgres_data
chmod -R 755 ./n8n_data

创建 docker-compose.yml 模板

services:
  postgres:
    image: postgres:17.6-alpine
    container_name: n8n-postgres
    restart: unless-stopped
    user: "999:999"
    environment:
      POSTGRES_USER: n8n  # 数据库用户名
      POSTGRES_PASSWORD: n8npass  # 数据库密码
      POSTGRES_DB: n8n  # 数据库名称
      LANG: en_US.UTF-8
      LC_ALL: en_US.UTF-8
    volumes:
      - ./postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U n8n -d n8n || exit 1"]
      interval: 10s
      timeout: 5s
      retries: 10
      start_period: 30s

  n8n:
    image: docker.n8n.io/n8nio/n8n:latest
    container_name: n8n
    restart: unless-stopped
    user: "1000:1000"
    environment:
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=n8n  # 数据库名称
      - DB_POSTGRESDB_USER=n8n  # 数据库用户名
      - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
      - N8N_RUNNERS_ENABLED=true
      - N8N_HOST=n8n.dejavu.moe
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - WEBHOOK_URL=https://n8n.dejavu.moe/  # 替换你的域名
      - N8N_EDITOR_BASE_URL=https://n8n.dejavu.moe/  # 替换你的域名
      - N8N_PROXY_HOPS=1
      - GENERIC_TIMEZONE=Asia/Shanghai
      - TZ=Asia/Shanghai
    ports:
      - "127.0.0.1:5678:5678"
    depends_on:
      postgres:
        condition: service_healthy
    volumes:
      - ./n8n_data:/home/node/.n8n

这时候我们只部署了 n8n 服务,启动容器

sudo docker compose up -d

反向代理

添加一个用于 n8n Web 服务的 Nginx 反向代理配置,示例如下:

server {
    listen 80;
    listen [::]:80;
    server_name n8n.dejavu.moe;  # 替换你的域名

    # HTTP to HTTPS
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;
    server_name n8n.dejavu.moe;  # 替换你的域名

    ssl_certificate /etc/nginx/cert/wild.dejavu.moe.pem;  # SSL
    ssl_certificate_key /etc/nginx/cert/wild.dejavu.moe.key;  # SSL

    # Cloudflare Origin SSL cipher suites
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ecdh_curve X25519:P-256:P-384;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-CHACHA20-POLY1305:ECDHE+AES128:RSA+AES128:ECDHE+AES256:RSA+AES256:ECDHE+3DES:RSA+3DES;
    ssl_prefer_server_ciphers off;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;

    # logs
    access_log /var/log/nginx/n8n.dejavu.moe.access.log;
    error_log /var/log/nginx/n8n.dejavu.moe.error.log;
    location / {
        proxy_pass http://127.0.0.1:15678;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        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 X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_buffering off;
        chunked_transfer_encoding off;
        proxy_read_timeout 3600;
        proxy_send_timeout 3600;
    }

    location ~ ^/(webhook|webhook-test)/ {
        proxy_pass http://127.0.0.1:15678;
        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 X-Forwarded-Proto $scheme;
    }
}

此时应该可以通过自己的域名访问 n8n 了,创建管理员账号输入邮箱,会收到一个用于解锁社区版特性的激活码。假如你有 ChatGPT、Gemini……这些平台的 API Key,现在就可以愉快的玩耍了,毕竟现在 n8n 宣称是原生 AI 集成的全自动工作流,在这里找模板:

和我一样的「穷鬼」们,去下一步吧,我们将在 Ollama 中体验各种免费的模型。

Ollama

假如用 Docker 部署 Ollama,我又不想再给它添加一个反向代理了,那么 n8n 怎么访问 Ollama 呢?那就直接编排到同一个 docker-compose.yml 模板里吧,它们会共享容器的网络,端口绑定本地环回地址即可确保安全,这样 Ollama 的 HTTP API 就仅限本机 n8n 使用了。

在上面的 n8n 服务中添加 Ollama 的服务,现在看起来应该这样:

services:
  ollama:
    container_name: ollama
    image: ollama/ollama:latest
    restart: unless-stopped
    environment:
      - OLLAMA_HOST=0.0.0.0
      - OLLAMA_KEEP_ALIVE=1h
    volumes:
      - ./ollama:/root/.ollama

  postgres:
    image: postgres:17.6-alpine
    container_name: n8n-postgres
    restart: unless-stopped
    user: "999:999"
    environment:
      POSTGRES_USER: n8n
      POSTGRES_PASSWORD: n8npassword
      POSTGRES_DB: n8n
      LANG: en_US.UTF-8
      LC_ALL: en_US.UTF-8
    volumes:
      - ./postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U n8n -d n8n || exit 1"]
      interval: 10s
      timeout: 5s
      retries: 10
      start_period: 30s

  n8n:
    image: docker.n8n.io/n8nio/n8n:latest
    container_name: n8n
    restart: unless-stopped
    user: "1000:1000"
    environment:
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=n8n
      - DB_POSTGRESDB_USER=n8n
      - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
      - N8N_RUNNERS_ENABLED=true
      - N8N_HOST=n8n.dejavu.moe
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - WEBHOOK_URL=https://n8n.dejavu.moe/
      - N8N_EDITOR_BASE_URL=https://n8n.dejavu.moe/
      - N8N_PROXY_HOPS=1
      - GENERIC_TIMEZONE=Asia/Shanghai
      - TZ=Asia/Shanghai
    ports:
      - "127.0.0.1:15678:5678"
    extra_hosts:  # <添加这个>
      - "host.docker.internal:host-gateway"  # <以及这个>
    depends_on:
      postgres:
        condition: service_healthy
    volumes:
      - ./n8n_data:/home/node/.n8n

启动 Ollama 服务

sudo docker compose up -d

下载 LLM 模型,比如 llama3.1:8b,也可以使用一些 Tool Calling 类模型,比如 deepseek-r1-tool-calling:1.5b

sudo docker exec -it ollama bash

ollama pull llama3.1:8b

完成后重启相关容器

sudo docker compose down && sudo docker compose up -d

测试

登录我们部署的 n8n 控制台,添加一个 Ollama 服务凭据,Base URL 填 http://ollama:11434 即可

这是一个获取 RSS 摘要并将总结发送到 Telegram 频道/群组/对话中的工作流(来自公开模板)

纯 CPU 进行这种 LLM 推理压力还是挺大的,后续可以选择更小一点的模型

考虑当前硬件性能对本地 LLM 的瓶颈,我们大概最多可以选择 7b/8b 以下的模型(甚至更低),虽然吐 Token 的速度还是有点慢,不过反正以后是 n8n 在跑,我们又不用等,让它跑吧!

最终,这个简单的任务用时 11 分钟 24.635 秒,可以接受哈哈。

简体中文互联网在变得糟糕吗?

2025-11-05 14:09:57

起因

今日吃完饭闲来无事,打开浏览器,准备去 Oracle 试试运气。虽与本文主题无关,但出于「玄学参考」,还是提供下我的注册环境:

  • 设备:Android 手机
  • 浏览器:Chrome 无痕模式
  • 邮箱:域名邮箱
  • 信用卡:工商银行万事达信用卡
  • 网络:中国电信 5G 数据网络(关闭代理)
  • 信息:地址和姓名全部用拼音,比如 江苏省大牛市小鸡县小狗镇小猫村 XXX 号
    • 省:Jiangsu
    • 市:Daniu
    • 地址行:Xiaoji Xian Xiaogou Zhen Xiaomao Cun, No.XXX

居然成功了:

我把 Telegram 当作 Micro Blog,发了个「哈哈哈」和截图,然后就碰到了赛博犬儒:

两种心理

简体中文互联网(以下简称「简中」)有一种「分析成分」的现象:人们往往不去理解「你在说什么」,而是先定义「你是什么人」。这是一种根据一个人说话的语气或观点,对发言者迅速归类并贴上刻板标签的行为。比如上面这位一开始就给我贴上「疯狂的 MJJ」和「炫耀者」的标签。

这是简中环境一种独特的集体心理防御机制,人们为了不被讨论击中痛点,在决定是否要听别人好好说话前,更愿意先定义发言者的「成分」。这种现象背后,主要有两种典型心理驱动。

1. 网络犬儒

古代犬儒思想主张美德是追求幸福的唯一途径,提倡摒弃物欲、回归自然,通过艰苦生活的锻炼来克服欲望。

现代网络犬儒,就是普遍不信任他人动机,嘲讽公共价值和道德。将生活上的不满转化为不反抗规则的「众人皆醉我独醒」,以「看透」之名,行逃避之实。以「愤世嫉俗」的批判姿态,行「附和规则」的真「精致利己主义者」。

上面这位就是简中环境中典型的 反社交犬儒喷子,轻松地将任何话题上升到「意识形态的阴阳怪气区」。看起来是在嘲讽「民族主义」或「中式装逼」,实则是以政治/民族讽刺包装自己的个人阴阳心理。

2.情绪性反射

在一个长期政治化、戾气化和两极对立化的网络环境里,表达快乐和分享情绪几乎成了一种冒犯,甚至形成了一种心理上的「我不允许别人比我开心」的条件反射。别人分享的喜悦,他们无法共情,甚至视作对自己失败、空虚的提醒。

这种心理会迅速展现出「攻击幸福」的「中式爹味」:

  • 分享一点快乐说你「炫耀」
  • 分享一些小成就说你「装逼」
  • 分享小希望和小满足就说你「天真」

下图由 ChatGPT 生成🤣

在这种环境里,你表达一点点快乐,就像往荒凉的院子里丢了块石头,总会引来几声被砸到的狗在叫。例如:

  • 「我终于通过了面试,终于上岸了」

    • ——「有什么用,不还是 996 福报」

    • ——「一定找了关系吧?

    • ——「这么好看,靠什么上位的都清楚。」

  • 「兼职攒了很久的钱,终于给自己买了部 iPhone 17」

    • ——「有这钱买国产旗舰不香吗?」
    • ——「为什么不买华为,崇洋媚外!」
    • ——「果蛆就是果蛆,2025 年还在用你的 8+256 呢?」
  • 「我今天吃到了很好吃的拉面」

    • ——「这种垃圾也配叫好吃?我家狗都不吃。」
    • ——「看看 xx 拉面,有机会去吃点好的吧。」
    • ——「外国人早就不吃这种垃圾了」
  • ……

荒诞的逻辑像极了一种奇怪的宗教,不关乎事实,只关乎情绪,它的信条是「任何正面情绪都必须被他们审判」。

说白了,他们不是讨厌快乐本身,他们只是受不了自己没什么可高兴的。

最后

全球互联网有着在变糟糕的趋势,简中环境更为明显。当「成分分析」成为习惯,理解就会被刻板化标签替代。网络犬儒和情绪性反射成为主流反应,真诚的交流就失去了可能性。

人生两件事——关你屁事,关我屁事?

最后,先骂句「傻逼」,唯一的封禁名单 +1

(完)