DevOps 2026-05-27·Ievgenii Svyryd

Oracle Cloud 免费套餐:我如何以每月 0 美元(永久)托管生产级 Web 应用

Oracle Cloud 的 Always Free 套餐为你提供一台配备 1 GB 内存、50 GB 存储和一个公网 IP 的虚拟机——永久免费,没有信用卡套路。以下就是我完整的搭建过程、那些不提前知道就会浪费你一下午时间的坑,以及它为什么胜过最便宜的 AWS EC2 实例。

Oracle Cloud 免费套餐:我如何以每月 0 美元(永久)托管生产级 Web 应用

Oracle Cloud 免费套餐为何存在(以及它为何是正当合法的)

让我先把房间里那头大象点破:是的,它是真的免费。永久免费。不是像 AWS 那样“免费 12 个月”。不是像 Azure 那样“送 200 美元额度、到期作废”。Oracle 的 Always Free 层是一份永久性的资源配额,不会过期,不会自动升级,也不会突然给你一张账单。

Oracle 为什么要这么做?因为它在云计算这场游戏里入场太晚,需要开发者来尝试它的平台。它的赌注是,其中会有一定比例的人向上升级到付费层。但即便你一分钱都不花,Always Free 资源依然归你所有。

下面是你能得到的:

  • 2 台 AMD Micro 虚拟机 —— 每台 1 个 OCPU、1 GB 内存(或者在 Ampere A1 上运行 1 台 ARM 虚拟机,最多 4 个 OCPU 和 24 GB 内存)
  • 所有虚拟机合计 200 GB 块存储
  • 每月 10 TB 出站数据传输
  • 包含公网 IPv4 地址
  • 2 个自治数据库(每个 20 GB)
  • 10 GB 对象存储

对于个人作品集、业余项目、预发布环境,甚至是低流量的生产应用来说 —— 这已经绰绰有余。

第 1 步:创建你的账户和虚拟机

cloud.oracle.com 注册。你需要一张信用卡用于身份验证,但不会被扣款,而且你可以无限期地停留在 Always Free 层级上。

创建一个计算实例:

  1. 前往 Compute → Instances → Create Instance
  2. 选择 Ubuntu 22.04(或 24.04)作为镜像
  3. 选择 VM.Standard.E2.1.Micro 规格(符合 Always Free 条件)或 VM.Standard.A1.Flex(Ampere ARM,最多 4 个 OCPU 免费)
  4. 在网络设置下,确保勾选了 Assign a public IPv4 address
  5. 上传你自己的 SSH 公钥(下文会详细说明)
  6. 点击 Create

虚拟机会在约 60 秒内就绪。记下这个公网 IP——那就是你服务器的永久地址。

第 2 步:SSH 密钥——上传你自己的密钥(这一步至关重要)

Oracle 提供了一个选项,让你在创建虚拟机时生成一对 SSH 密钥并下载私钥。不要使用这个选项。

为什么?三个原因:

  1. 浏览器生成的密钥常常会出问题。多位用户反映,Oracle 生成的 SSH 密钥用一段时间后就会失效——有时是在虚拟机重启后,有时则是随机发生。当你的密钥失效、而控制台串行连接是你唯一的后备手段时,你会后悔没有用自己的密钥。
  2. 你应当拥有自己的密钥。你的 SSH 私钥应该存放在你机器上的 ~/.ssh/ 里,由你自己生成、由你自己备份。一个在浏览器里生成、只下载过一次、保存在下载文件夹里的密钥,就是一场蓄势待发的安全事故。
  3. CI/CD 集成。如果你想让 GitHub Actions 部署到你的服务器上(你会想的),你需要把私钥存为 GitHub secret。从一开始就用自己的密钥能让这件事变得直截了当。

如果你还没有密钥对,在本地机器上生成一对:

# 生成 ED25519 密钥(现代、快速、安全)
ssh-keygen -t ed25519 -C "your-email@example.com"

# 如需更广泛的兼容性,也可使用 RSA 4096
ssh-keygen -t rsa -b 4096 -C "your-email@example.com"

# 复制公钥(将其粘贴到 Oracle 的表单中)
cat ~/.ssh/id_ed25519.pub

在创建虚拟机时,把你的 .pub 文件的内容粘贴到 SSH 密钥字段里。就这样。你的密钥,你来掌控,没有意外。

第 3 步:开放端口(Oracle 把这部分弄得令人困惑)

这正是大多数人卡住的地方。你会 SSH 登录到你的虚拟机,安装 nginx,然后发现从外部世界根本访问不到 80 端口。原因是:Oracle 有两道防火墙,你需要把两道都打开。

防火墙 1:Oracle Cloud 安全列表(VCN 级别)

这是云层面的防火墙。导航路径:

  1. Networking → Virtual Cloud Networks → 你的 VCN
  2. Security Lists → Default Security List
  3. Add Ingress Rules
# HTTP 的入站规则
Source CIDR:   0.0.0.0/0
IP Protocol:   TCP
Destination Port Range: 80

# HTTPS 的入站规则
Source CIDR:   0.0.0.0/0
IP Protocol:   TCP
Destination Port Range: 443

防火墙 2:VM 内部的 iptables

Oracle 的 Ubuntu 镜像自带的 iptables 规则会阻止除 SSH 外的所有入站流量。即使你已经打开了云端安全列表,你的服务器在你打开操作系统级防火墙之前仍会拒绝 HTTP 连接:

# 开放 80 端口(HTTP)和 443 端口(HTTPS)
sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT -p tcp --dport 443 -j ACCEPT

# 保存规则,使其在重启后依然生效
sudo apt-get install -y iptables-persistent
sudo netfilter-persistent save

两个防火墙都必须打开。这一点让每个人第一次都栽跟头。如果你的网站无法加载,先检查云端安全列表,然后再检查 iptables。

第 4 步:完整的服务器配置(一个脚本搞定)

这是我使用的引导脚本。它会安装 Python、nginx,将 Gunicorn 配置为 systemd 服务,并把 nginx 设置为反向代理——全部一次性完成:

#!/usr/bin/env bash
set -euo pipefail

# Install Python 3.12
sudo add-apt-repository -y ppa:deadsnakes/ppa
sudo apt-get update -qq
sudo apt-get install -y python3.12 python3.12-venv \
    python3.12-dev build-essential nginx

# Open firewall
sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT -p tcp --dport 443 -j ACCEPT
sudo apt-get install -y iptables-persistent
sudo netfilter-persistent save

# Clone your project
APP_DIR="$HOME/myapp"
git clone git@github.com:you/your-repo.git "$APP_DIR"

# Create virtualenv and install dependencies
python3.12 -m venv "$APP_DIR/.venv"
"$APP_DIR/.venv/bin/pip" install -r "$APP_DIR/requirements.txt"

# Create a systemd service for Gunicorn
sudo tee /etc/systemd/system/myapp.service > /dev/null <<EOF
[Unit]
Description=My App (Gunicorn)
After=network.target

[Service]
User=ubuntu
Group=www-data
WorkingDirectory=$APP_DIR
EnvironmentFile=$APP_DIR/.env
ExecStart=$APP_DIR/.venv/bin/gunicorn myapp.wsgi:application \\
    --workers 2 --bind unix:/run/myapp.sock
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

# Configure nginx reverse proxy
sudo tee /etc/nginx/sites-available/myapp > /dev/null <<EOF
server {
    listen 80;
    server_name _;
    client_max_body_size 20M;

    location /static/ {
        alias $APP_DIR/staticfiles/;
        expires 30d;
    }

    location / {
        proxy_pass http://unix:/run/myapp.sock;
        proxy_set_header Host \$host;
        proxy_set_header X-Real-IP \$remote_addr;
        proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
    }
}
EOF

sudo ln -sf /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t && sudo systemctl reload nginx

# Enable and start
sudo systemctl enable myapp && sudo systemctl start myapp
echo "Done. Visit http://$(curl -s ifconfig.me)"

第 5 步:使用 Let's Encrypt 配置 SSL(免费 HTTPS)

一旦你域名的 DNS 指向了 Oracle 虚拟机的公网 IP,启用 HTTPS 只需两条命令:

sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d yourdomain.com

# Auto-renewal is set up automatically via systemd timer
# Verify with:
sudo certbot renew --dry-run

Certbot 会修改你的 nginx 配置,使其带着证书在 443 端口监听,并将 80 端口重定向到 HTTPS。免费的 SSL,每 90 天自动续期,零维护。

第 6 步:使用 GitHub Actions 实现 CI/CD

最后一块拼图:每次推送到 main 时自动部署。将你的 SSH 私钥添加为 GitHub secret(DEPLOY_SSH_KEY),然后创建这个工作流:

# .github/workflows/deploy.yml
name: Deploy
on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Deploy via SSH
        uses: appleboy/ssh-action@v1.0.3
        with:
          host: your-server-ip
          username: ubuntu
          key: ${{ secrets.DEPLOY_SSH_KEY }}
          script: |
            cd ~/myapp
            git pull origin main
            bash scripts/deploy.sh

推送到 main,GitHub 就会 SSH 登录到你的 Oracle 虚拟机,拉取代码、运行迁移、收集静态文件,并重启 Gunicorn。完整的 CI/CD,成本为 0 美元。

Oracle 免费套餐对比 AWS EC2 t2.micro:真实较量

AWS 在其免费套餐中提供 t2.micro——但仅限 12 个月。之后,你就要付费。让我诚实地比较这两者:

Oracle Free Tier    AWS t2.micro
                        ────────────────    ────────────
Price after year 1      $0 (forever)        ~$8.50/month
vCPUs                   1 OCPU              1 vCPU
RAM                     1 GB (or 24 GB ARM) 1 GB
Storage                 50 GB boot + 150 GB 8 GB (30 GB free)
Outbound transfer       10 TB/month         100 GB/month (then $0.09/GB)
Public IPv4             Included            $3.75/month (since Feb 2024)
Always Free             Yes                 No (12 months only)
ARM option (24GB RAM)   Yes (Ampere A1)     No (Graviton is paid)

数字本身就说明了一切。Oracle 给你更多的存储、100 倍的带宽、一个免费的公网 IP,而且永不过期。AWS 的免费套餐本就很吝啬,而自 2024 年 2 月起他们对公网 IPv4 地址收取每月 3.75 美元后,即便运行一个已停止的 EC2 实例也要花钱。

Ampere A1 ARM 机型才是真正的杀手锏。在 Always Free 套餐上,你最多可分配 4 个 OCPU 和 24 GB 内存。这可不是玩具主机——这是一台货真价实的服务器,能够同时运行一个数据库、一个 Django 应用和一个 Redis 缓存。

没人会告诉你的那些坑

Oracle Free Tier 非常出色,但它有一些锋利的边角:

  • 空闲实例会被回收。Oracle 保留停止"空闲"的 Always Free 实例的权利(即 CPU 和内存使用率持续低于 10%)。运行一个轻量级 Web 服务器通常能让你保持在阈值以上,但要留意这一点。
  • 可用性有限。Free Tier 虚拟机很抢手。如果你所在的区域已满,你就无法创建新实例。可以尝试不同的可用性域或区域。有些人会写脚本调用创建 API 反复重试,直到有空位放出。
  • Oracle 生成的 SSH 密钥不可靠。我之前说过,现在再说一遍:上传你自己的密钥。
  • 双重防火墙。云安全列表 + 操作系统的 iptables。两者都要开放,否则你会花一个小时来调试为什么 nginx 无法访问。
  • 无法发送邮件。Oracle 在 Free Tier 上封锁了出站 SMTP(25 端口)。请改用 Mailgun、SendGrid 或 Resend 之类的事务性邮件服务。

我在免费的 Oracle VM 上运行了什么

你正在浏览的这个网站——你此刻正在阅读的作品集与博客——运行在一台 Oracle Cloud 免费套餐的虚拟机上。技术栈如下:

  • Django 5.x + Wagtail 6.x——CMS 与应用层
  • Gunicorn,2 个 worker,由 systemd 管理
  • Nginx 作为反向代理并提供静态文件服务
  • SQLite 作为数据库(对个人站点来说完全够用)
  • Let's Encrypt 提供免费 SSL
  • GitHub Actions 实现零操作部署

每月总成本:$0。每年总成本:$0。唯一需要付费的组件是域名。

网站加载迅速,能应对我所需的全部流量,并在我推送到 main 时自动部署。对于开发者作品集、博客、业余项目或预发布环境来说,Oracle Cloud 免费套餐是云计算领域最划算的交易。没有任何附加条件。

最便宜的服务器是零成本的那台。最好的服务器是你完全掌控的那台。Oracle Free Tier 两者兼得。

联系我 →