← All articles
Self-hostingDeployment

Deploy Paperclip on Oracle Cloud Free Tier

Oracle Cloud's Always Free tier offers an Ampere A1 VM with up to 4 vCPUs and 24 GB RAM — at no cost, forever. It's the best free infrastructure available for running Paperclip.

Deploy on Railway instead →

What you get for free

Oracle Cloud Always Free includes:

  • Up to 4 Ampere A1 (ARM) vCPUs
  • Up to 24 GB RAM
  • 200 GB block storage
  • 10 TB/month outbound data transfer

This is more than most teams pay $30–50/month for. The catch: Oracle Cloud's UI is complex and provisioning can be slow during peak demand.

Step 1: Create an Oracle Cloud account

  1. Go to cloud.oracle.com and sign up for a free account
  2. You'll need a valid credit card for identity verification — you won't be charged
  3. Choose a home region carefully — you can't change it later. US East (Ashburn), US West (Phoenix), and Frankfurt are reliable choices.
  4. Complete the setup wizard

Step 2: Provision an Ampere A1 instance

  1. In the Oracle Cloud console, go to Compute → Instances → Create Instance
  2. Configure:
    • Name: paperclip
    • Compartment: Root compartment (default)
    • Image: Ubuntu 22.04 Minimal
    • Shape: Click Change Shape
      • Select Ampere as the shape series
      • Choose VM.Standard.A1.Flex
      • Set OCPUs: 2 (or 4 for maximum free allocation)
      • Set Memory: 12 GB (or 24 GB)
  3. Add SSH key: Upload your public key or generate a new one
  4. Click Create

Note: If you get "Out of capacity" errors, try a different availability domain within the same region, or retry at a different time of day. Free tier A1 instances are in high demand.

Step 3: Configure networking

After the instance is created, you need to open ports 80 and 443 in Oracle Cloud's firewall:

  1. Go to Networking → Virtual Cloud Networks
  2. Click your VCN → Security ListsDefault Security List
  3. Add Ingress Rules:
    • Source: 0.0.0.0/0, Protocol: TCP, Port: 80
    • Source: 0.0.0.0/0, Protocol: TCP, Port: 443

Also configure the instance's firewall:

# Connect to the instance
ssh -i your-key.pem ubuntu@YOUR_INSTANCE_IP

# Open ports in iptables (Oracle instances use iptables, not ufw by default)
sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT -p tcp --dport 443 -j ACCEPT
sudo netfilter-persistent save

Step 4: Install Node.js and Paperclip

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

# Install Node.js 20
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs

# Install Paperclip
sudo npm install -g paperclipai

# Create data directory
sudo mkdir -p /opt/paperclip/data
sudo chown -R ubuntu:ubuntu /opt/paperclip

Step 5: Configure and start Paperclip

cat > /opt/paperclip/.env << 'EOF'
NODE_ENV=production
PAPERCLIP_DATA_DIR=/opt/paperclip/data
BETTER_AUTH_SECRET=REPLACE_WITH_RANDOM_SECRET
PAPERCLIP_LISTEN_PORT=3100
PAPERCLIP_LISTEN_HOST=127.0.0.1
PAPERCLIP_MIGRATION_AUTO_APPLY=true
PAPERCLIP_MIGRATION_PROMPT=never
EOF
chmod 600 /opt/paperclip/.env

Generate secret: openssl rand -hex 32

Create systemd service:

sudo tee /etc/systemd/system/paperclip.service << 'EOF'
[Unit]
Description=Paperclip AI
After=network.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/opt/paperclip
EnvironmentFile=/opt/paperclip/.env
ExecStart=/usr/bin/npx paperclipai server start
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now paperclip

Step 6: nginx and SSL

sudo tee /etc/nginx/sites-available/paperclip << 'EOF'
server {
    listen 80;
    server_name paperclip.yourdomain.com;

    location / {
        proxy_pass http://127.0.0.1:3100;
        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_read_timeout 300;
    }
}
EOF

sudo ln -s /etc/nginx/sites-available/paperclip /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d paperclip.yourdomain.com

Step 7: DNS

Add an A record pointing paperclip.yourdomain.com to your instance's public IP.

Find your instance's IP in the Oracle Cloud console: Compute → Instances → Instance Details → Public IP Address.

ARM compatibility note

Oracle Ampere A1 instances use ARM64 architecture. Paperclip (Node.js) runs natively on ARM64 with no changes needed. All npm install and npx commands work identically.

Common issues

Capacity not available: Oracle has limited free A1 capacity. Try at different times of day (off-peak hours) or try different availability domains.

Port 80 blocked: Oracle Cloud uses both VCN Security Lists and OS-level iptables. You need to open ports in both.

Instance hibernated: Oracle may reclaim Always Free instances that appear idle. Add a health check cron to prevent hibernation:

crontab -e
# Add: */5 * * * * curl -s http://localhost:3100/api/health > /dev/null

Cost

$0/month, forever — as long as you stay within the Always Free tier limits.

Railway gives you $20 free credit with much simpler setup if you'd prefer not to navigate Oracle's complex console.

Ready to deploy?

Affiliate disclosure: this link may earn us a commission at no extra cost to you.

This is an independent guide. Paperclip Hosting is not affiliated with the official Paperclip project. Guide steps are based on real deployments and are subject to change as the software evolves.