# Code examples from: Host a Website for Free: Oracle Cloud Server + One Setup Script (Complete Guide)
# https://www.atulvij.com/free-oracle-cloud-server-host-website
# Review and adapt before running; examples use sample values.

# ---- Example 1 (bash) ----
ssh -i ~/.ssh/oracle.key ubuntu@YOUR_IP

# ---- Example 2 (bash) ----
#!/usr/bin/env bash
# Usage: sudo bash setup.sh example.com
set -euo pipefail
DOMAIN=$1; DB=wp_$(echo "$DOMAIN" | tr '.-' '__'); PASS=$(openssl rand -hex 16)
export DEBIAN_FRONTEND=noninteractive
apt-get update -qq
apt-get install -y -qq nginx mariadb-server fail2ban unattended-upgrades webp \
  php8.3-fpm php8.3-mysql php8.3-gd php8.3-intl php8.3-zip php8.3-curl php8.3-mbstring php8.3-xml php8.3-imagick
# 2 GB swap: essential on 1 GB RAM
[ -f /swapfile ] || { fallocate -l 2G /swapfile; chmod 600 /swapfile; mkswap /swapfile; swapon /swapfile; echo "/swapfile none swap sw 0 0" >> /etc/fstab; }
# open web ports in Oracle's iptables
for p in 80 443; do iptables -C INPUT -p tcp --dport $p -j ACCEPT 2>/dev/null || iptables -I INPUT 5 -p tcp --dport $p -j ACCEPT; done
apt-get install -y -qq iptables-persistent; netfilter-persistent save
# small-server tuning
printf "[mysqld]\ninnodb_buffer_pool_size=96M\nmax_connections=30\nperformance_schema=OFF\n" > /etc/mysql/mariadb.conf.d/99-small.cnf
sed -i 's/^pm = .*/pm = ondemand/; s/^pm.max_children = .*/pm.max_children = 4/' /etc/php/8.3/fpm/pool.d/www.conf
systemctl restart mariadb php8.3-fpm
# database
mariadb -e "CREATE DATABASE IF NOT EXISTS $DB CHARACTER SET utf8mb4; CREATE USER IF NOT EXISTS '$DB'@'localhost' IDENTIFIED BY '$PASS'; GRANT ALL ON $DB.* TO '$DB'@'localhost';"
# WordPress
curl -sSLo /usr/local/bin/wp https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar && chmod +x /usr/local/bin/wp
mkdir -p /var/www/$DOMAIN && chown www-data: /var/www/$DOMAIN
sudo -u www-data wp core download --path=/var/www/$DOMAIN --quiet || true
sudo -u www-data wp config create --path=/var/www/$DOMAIN --dbname=$DB --dbuser=$DB --dbpass=$PASS --quiet --force
# nginx site
cat > /etc/nginx/sites-available/$DOMAIN <<EOF
server {
  listen 80; server_name $DOMAIN www.$DOMAIN; root /var/www/$DOMAIN; index index.php;
  client_max_body_size 64M;
  location / { try_files \$uri \$uri/ /index.php?\$args; }
  location ~ \.php\$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.3-fpm.sock; }
  location = /xmlrpc.php { deny all; }
}
EOF
ln -sf /etc/nginx/sites-available/$DOMAIN /etc/nginx/sites-enabled/; rm -f /etc/nginx/sites-enabled/default
nginx -t && systemctl reload nginx
echo "Done. Open http://$DOMAIN to finish the WordPress install. DB password saved in wp-config.php."

