forked from Nixius/authelia
112 lines
3.1 KiB
Bash
Executable File
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
|