Public-cloud deployment of a single-user expense tracker: - 4-container stack: Caddy (HTTPS via Let's Encrypt), nginx (React/Vite SPA), Express API, Postgres 16 - Repeatable deployment via prepare-app.sh using only OCI CLI (no web console) - Persistent Postgres volume, auto-restart policies, healthchecks, backup + restore scripts - DuckDNS dynamic DNS for the public hostname; secrets isolated to gitignored .env Author: Gigi Saji Live URL: https://savesave.duckdns.org
42 lines
1.7 KiB
Bash
42 lines
1.7 KiB
Bash
#!/usr/bin/env bash
|
|
# =============================================================================
|
|
# view-logs.sh — tail Caddy access logs from the VM.
|
|
#
|
|
# Usage:
|
|
# ./scripts/view-logs.sh # tail -f the access log
|
|
# ./scripts/view-logs.sh recent # last 50 entries as pretty JSON
|
|
# =============================================================================
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
cd "$ROOT_DIR"
|
|
|
|
[ -f .env ] || { echo "ERROR: .env not found"; exit 1; }
|
|
set -a; source .env; set +a
|
|
|
|
: "${OCI_VM_NAME:=sk1-expense-tracker}"
|
|
: "${OCI_SSH_PRIVATE_KEY_PATH:=$HOME/.ssh/id_ed25519}"
|
|
OCI_SSH_PRIVATE_KEY_PATH="${OCI_SSH_PRIVATE_KEY_PATH/#\~/$HOME}"
|
|
|
|
TENANCY_OCID="$(oci iam compartment list --query 'data[0]."compartment-id"' --raw-output)"
|
|
COMPARTMENT_ID="${OCI_COMPARTMENT_ID:-$TENANCY_OCID}"
|
|
INSTANCE_ID="$(oci compute instance list --compartment-id "$COMPARTMENT_ID" \
|
|
--display-name "$OCI_VM_NAME" --lifecycle-state RUNNING \
|
|
--query 'data[0].id' --raw-output)"
|
|
VNIC_ID="$(oci compute instance list-vnics --instance-id "$INSTANCE_ID" --query 'data[0].id' --raw-output)"
|
|
PUBLIC_IP="$(oci network vnic get --vnic-id "$VNIC_ID" --query 'data."public-ip"' --raw-output)"
|
|
|
|
MODE="${1:-tail}"
|
|
case "$MODE" in
|
|
recent)
|
|
ssh -i "$OCI_SSH_PRIVATE_KEY_PATH" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
|
|
ubuntu@"$PUBLIC_IP" 'tail -n 50 /opt/sk1/logs/caddy/access.log | (command -v jq >/dev/null && jq . || cat)'
|
|
;;
|
|
tail|*)
|
|
ssh -i "$OCI_SSH_PRIVATE_KEY_PATH" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
|
|
ubuntu@"$PUBLIC_IP" 'tail -f /opt/sk1/logs/caddy/access.log'
|
|
;;
|
|
esac
|