built-my-personal-200GB-cloud-storage-for-free

在 Oracle 云上部署个人文件管理器,通过 Cloudflare 进行 SSL 终止与源站保护,完全免费。

流量流向:浏览器 → Cloudflare (HTTPS :443) → OCI VM (HTTP :80) → Nginx → FileBrowser (:8080)。源站 IP 永远不会对外公开;所有 TLS 由 Cloudflare 处理。

事先准备 Link to heading

需求 说明
OCI 账号 免费方案,已完成身份验证,并绑定付款方式
Cloudflare 账号 创建免费账号
域名 已在 Cloudflare 启用(域名服务器指向Cloudflare,状态显示Active)
SSH 密钥对 在创建 VM 前于本机准备好

技术栈 Link to heading

层级 组件 角色
计算 VM.Standard.E2.1.Micro 永久免费 x86-64 VM,1 OCPU / 1 GB RAM
操作系统 Ubuntu 24.04 LTS 宿主操作系统
防火墙 OCI Security List + ufw 双层入站流量过滤
反向代理 Nginx 转发 port 80 → FileBrowser,还原真实 IP
应用程序 FileBrowser 文件管理器,运行于 localhost:8080
边缘 / CDN Cloudflare(免费) SSL 终止、橙色代理、隐藏源站 IP
进程管理 systemd 确保 FileBrowser 在重启后持续运行

限制 Link to heading

VM.Standard.E2.1.Micro 是 OCI 的 x86-64 永久免费机型。

  • 1 OCPU(AMD)· 1 GB RAM · 固定规格,无法扩展
  • 操作系统空闲约占用 ~350 MB — 剩余 ~650 MB 供 Nginx + FileBrowser 使用
  • 200 GB 存储空间,每月 10 TB 出站流量
  • Cloudflare 免费账号每次请求上传上限为 100 MB — 较大的文件请使用 SCP/SFTP
  • 所有 DNS 记录需保持橙色代理状态

步骤一 — 创建 OCI VM Link to heading

在 OCI 控制台:Compute → Instances → Create instance

  • 镜像:Canonical Ubuntu 24.04(x86_64
  • 机型:Specialty and previous generation → VM.Standard.E2.1.Micro
  • 网络:默认 VCN、公共子网、启用公共 IPv4
  • SSH 密钥:粘贴你的公钥

💡 实例启动后,记下公共 IP。

在 Security List 开放 port 80(OCI 的网络防火墙在 VM 外侧 — 单靠 ufw 设定不了):

Networking → VCN → Security Lists → Default → Add Ingress Rule:

Source CIDR:  0.0.0.0/0   ← 于步骤六改为 CF 的 IP 范围
Protocol:     TCP
Dest port:    80

Port 22 应已在默认列表中开放。

步骤二 — 服务器设置 Link to heading

ssh -i ~/.ssh/your_key ubuntu@<OCI-PUBLIC-IP>

sudo apt update && sudo apt upgrade -y
sudo apt install -y nginx curl ufw

配置 ufw — 一定要先允许 SSH,否则会把自己锁在外面:

sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw --force enable
sudo ufw status verbose

步骤三 — 安装 FileBrowser Link to heading

curl -fsSL https://raw.githubusercontent.com/filebrowser/get/master/get.sh | bash

sudo mkdir -p /etc/filebrowser /srv/filebrowser

filebrowser config init --database /etc/filebrowser/filebrowser.db
filebrowser config set \
  --database /etc/filebrowser/filebrowser.db \
  --root /srv/filebrowser \
  --address 127.0.0.1 \
  --port 8080 \
  --baseurl /

filebrowser users add admin YOUR_SECURE_PASSWORD \
  --database /etc/filebrowser/filebrowser.db \
  --perm.admin

创建 systemd 服务,路径为 /etc/systemd/system/filebrowser.service

[Unit]
Description=FileBrowser
After=network.target

[Service]
User=www-data
ExecStart=/usr/local/bin/filebrowser --database /etc/filebrowser/filebrowser.db
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target
sudo chown -R www-data:www-data /etc/filebrowser /srv/filebrowser
sudo systemctl daemon-reload
sudo systemctl enable --now filebrowser

步骤四 — 配置 Nginx Link to heading

创建 /etc/nginx/sites-available/filebrowser

server {
    listen 80;
    server_name files.yourdomain.com;

    # 从 Cloudflare 还原真实访客 IP
    set_real_ip_from 173.245.48.0/20;
    set_real_ip_from 103.21.244.0/22;
    set_real_ip_from 103.22.200.0/22;
    set_real_ip_from 103.31.4.0/22;
    set_real_ip_from 141.101.64.0/18;
    set_real_ip_from 108.162.192.0/18;
    set_real_ip_from 190.93.240.0/20;
    set_real_ip_from 188.114.96.0/20;
    set_real_ip_from 197.234.240.0/22;
    set_real_ip_from 198.41.128.0/17;
    set_real_ip_from 162.158.0.0/15;
    set_real_ip_from 104.16.0.0/13;
    set_real_ip_from 104.24.0.0/14;
    set_real_ip_from 172.64.0.0/13;
    set_real_ip_from 131.0.72.0/22;
    set_real_ip_from 2400:cb00::/32;
    set_real_ip_from 2606:4700::/32;
    set_real_ip_from 2803:f800::/32;
    set_real_ip_from 2405:b500::/32;
    set_real_ip_from 2405:8100::/32;
    set_real_ip_from 2a06:98c0::/29;
    set_real_ip_from 2c0f:f248::/32;
    real_ip_header CF-Connecting-IP;

    location / {
        proxy_pass         http://127.0.0.1:8080;
        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;
        client_max_body_size 0;    # Cloudflare 免费版上限为 100 MB
        proxy_read_timeout   300s;
        proxy_send_timeout   300s;
    }
}
sudo ln -s /etc/nginx/sites-available/filebrowser /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl enable --now nginx

步骤五 — Cloudflare DNS 与 SSL Link to heading

  1. DNS → Records → Add record:类型 A,名称 files(任意子域名),值 = OCI 公共 IP,代理状态 = Proxied(橙色云朵)
  2. SSL/TLS → Overview → 模式:Full(非 Full Strict — 源站仅支持 HTTP)
  3. SSL/TLS → Edge Certificates → 启用 Always Use HTTPS

步骤六 — 将源站限定为 Cloudflare IP Link to heading

替换原本开放的 port 80 规则:

sudo ufw delete allow 80/tcp

for cidr in \
  173.245.48.0/20 103.21.244.0/22 103.22.200.0/22 \
  103.31.4.0/22 141.101.64.0/18 108.162.192.0/18 \
  190.93.240.0/20 188.114.96.0/20 197.234.240.0/22 \
  198.41.128.0/17 162.158.0.0/15 104.16.0.0/13 \
  104.24.0.0/14 172.64.0.0/13 131.0.72.0/22; do
  sudo ufw allow from $cidr to any port 80 proto tcp
done

sudo ufw status numbered

同时在 OCI Security List 中,替换原本的 0.0.0.0/0 入站规则。在 OCI 网络层被拦截的请求,不会到达 VM。

验证 Link to heading

sudo systemctl status filebrowser nginx    # 两者均应为 active
free -h                                    # 确认内存未满载
curl -s http://127.0.0.1:8080 | head -3   # FileBrowser 在本地响应
curl --max-time 5 http://<OCI-IP>         # 应超时 — 源站已锁定

接着在浏览器访问 https://files.yourdomain.com。 💡 替换为步骤五中设置的子域名。

运维 Link to heading

Swap 文件 — 考虑到 1 GB RAM 的上限,建议创建:

sudo fallocate -l 512M /swapfile && sudo chmod 600 /swapfile
sudo mkswap /swapfile && sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

更新 FileBrowser: 重新运行安装脚本,接着执行 sudo systemctl restart filebrowser

更新 Cloudflare IP 范围: 定期查看 https://www.cloudflare.com/ips-v4,并重新运行上面的 ufw 循环。

大文件传输: 通过 SCP 或 SFTP 直接传至 /srv/filebrowser,绕过 Cloudflare 100 MB 的限制。