Oracle Cloud 免费套餐:我如何以每月 0 美元(永久)托管生产级 Web 应用
Oracle Cloud 的 Always Free 套餐为你提供一台配备 1 GB 内存、50 GB 存储和一个公网 IP 的虚拟机——永久免费,没有信用卡套路。以下就是我完整的搭建过程、那些不提前知道就会浪费你一下午时间的坑,以及它为什么胜过最便宜的 AWS EC2 实例。
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 层级上。
创建一个计算实例:
- 前往 Compute → Instances → Create Instance
- 选择 Ubuntu 22.04(或 24.04)作为镜像
- 选择 VM.Standard.E2.1.Micro 规格(符合 Always Free 条件)或 VM.Standard.A1.Flex(Ampere ARM,最多 4 个 OCPU 免费)
- 在网络设置下,确保勾选了 Assign a public IPv4 address
- 上传你自己的 SSH 公钥(下文会详细说明)
- 点击 Create
虚拟机会在约 60 秒内就绪。记下这个公网 IP——那就是你服务器的永久地址。
第 2 步:SSH 密钥——上传你自己的密钥(这一步至关重要)
Oracle 提供了一个选项,让你在创建虚拟机时生成一对 SSH 密钥并下载私钥。不要使用这个选项。
为什么?三个原因:
- 浏览器生成的密钥常常会出问题。多位用户反映,Oracle 生成的 SSH 密钥用一段时间后就会失效——有时是在虚拟机重启后,有时则是随机发生。当你的密钥失效、而控制台串行连接是你唯一的后备手段时,你会后悔没有用自己的密钥。
- 你应当拥有自己的密钥。你的 SSH 私钥应该存放在你机器上的
~/.ssh/里,由你自己生成、由你自己备份。一个在浏览器里生成、只下载过一次、保存在下载文件夹里的密钥,就是一场蓄势待发的安全事故。 - 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 级别)
这是云层面的防火墙。导航路径:
- Networking → Virtual Cloud Networks → 你的 VCN
- Security Lists → Default Security List
- 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 两者兼得。