forked from Nixius/authelia
1
0
Fork 0
ATLAS/scripts/stripe-setup.sh

112 lines
3.1 KiB
Bash
Executable File

#!/usr/bin/env bash
# Create Atlas tiered pricing products and prices in Stripe.
# Usage: ./scripts/stripe-setup.sh [path/to/.env]
# Use sandbox .env for test mode, prod .env for live. Outputs env vars to add to .env.
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
APPLY=false
ENV_FILE="$REPO_ROOT/.env"
for arg in "$@"; do
if [ "$arg" = "--apply" ]; then APPLY=true
elif [ -f "$arg" ]; then ENV_FILE="$arg"
fi
done
cd "$REPO_ROOT"
if [ -f "$ENV_FILE" ]; then
set -a
# shellcheck source=/dev/null
. "$ENV_FILE"
set +a
fi
if [ -z "${STRIPE_SECRET_KEY:-}" ]; then
echo "ERROR: STRIPE_SECRET_KEY not set. Usage: $0 [path/to/.env]" >&2
exit 1
fi
# Detect mode from key
if [[ "$STRIPE_SECRET_KEY" == sk_live_* ]]; then
MODE="live"
echo ">>> Stripe LIVE mode" >&2
else
MODE="test"
echo ">>> Stripe TEST mode" >&2
fi
BASE_URL="https://api.stripe.com/v1"
# Create product
echo "Creating product Atlas..." >&2
PRODUCT=$(curl -s -X POST -u "${STRIPE_SECRET_KEY}:" "$BASE_URL/products" \
-d "name=Atlas" \
-d "description=Managed workspace and infrastructure")
PRODUCT_ID=$(echo "$PRODUCT" | jq -r '.id // empty')
if [ -z "$PRODUCT_ID" ]; then
echo "Failed to create product. Response: $PRODUCT" >&2
exit 1
fi
echo "Product: $PRODUCT_ID" >&2
# Create prices (recurring)
create_price() {
local amount="$1"
local interval="$2"
local nickname="$3"
local out
out=$(curl -s -X POST -u "${STRIPE_SECRET_KEY}:" "$BASE_URL/prices" \
-d "product=$PRODUCT_ID" \
-d "currency=usd" \
-d "unit_amount=$amount" \
-d "recurring[interval]=$interval" \
-d "nickname=$nickname")
echo "$out" | jq -r '.id // empty'
}
echo "Creating prices..." >&2
PRICE_FREE=$(create_price 0 month "Atlas Free 3mo")
PRICE_YEAR=$(create_price 2000 year "Atlas Founder Year")
PRICE_100=$(create_price 10000 month "Atlas 100/mo")
PRICE_200=$(create_price 20000 month "Atlas 200/mo")
if [ -z "$PRICE_FREE" ] || [ -z "$PRICE_YEAR" ] || [ -z "$PRICE_100" ] || [ -z "$PRICE_200" ]; then
echo "Failed to create one or more prices" >&2
exit 1
fi
echo "" >&2
echo "=== Add these to your .env ($MODE mode) ===" >&2
echo "" >&2
cat << EOF
# Stripe tiered pricing ($MODE)
STRIPE_PRICE_ID_FREE=$PRICE_FREE
STRIPE_PRICE_ID_YEAR=$PRICE_YEAR
STRIPE_PRICE_ID_MONTH_100=$PRICE_100
STRIPE_PRICE_ID_MONTH_200=$PRICE_200
FREE_TIER_LIMIT=10
YEAR_TIER_LIMIT=50
EOF
# If --apply passed, merge into .env
if [ "$APPLY" = "true" ]; then
ENV_TARGET="$ENV_FILE"
[ -f "$ENV_TARGET" ] || { echo "No $ENV_TARGET to update" >&2; exit 0; }
update_var() { local k="$1" v="$2"
if grep -q "^${k}=" "$ENV_TARGET" 2>/dev/null; then
sed -i.bak "s|^${k}=.*|${k}=${v}|" "$ENV_TARGET"
else
echo "${k}=${v}" >> "$ENV_TARGET"
fi
}
update_var "STRIPE_PRICE_ID_FREE" "$PRICE_FREE"
update_var "STRIPE_PRICE_ID_YEAR" "$PRICE_YEAR"
update_var "STRIPE_PRICE_ID_MONTH_100" "$PRICE_100"
update_var "STRIPE_PRICE_ID_MONTH_200" "$PRICE_200"
rm -f "${ENV_TARGET}.bak"
echo "" >&2
echo "Updated $ENV_TARGET. Redeploy: export \$(grep -v '^#' .env | xargs) && docker stack deploy -c stack.yml atlas" >&2
fi