Initial commit
This commit is contained in:
71
scripts/bootstrap-app-staging.rb
Normal file
71
scripts/bootstrap-app-staging.rb
Normal file
@@ -0,0 +1,71 @@
|
||||
#!/usr/bin/env ruby
|
||||
# frozen_string_literal: true
|
||||
|
||||
# Build config/app.staging.yml from app.production.yml (preferred) or example template.
|
||||
# Usage: ruby scripts/bootstrap-app-staging.rb
|
||||
#
|
||||
# Run from Alvand-P root. Does not overwrite if app.staging.yml is already a valid Hash
|
||||
# unless BOOTSTRAP_FORCE=1.
|
||||
|
||||
require 'yaml'
|
||||
|
||||
ROOT = File.expand_path('..', __dir__)
|
||||
STAGING_PATH = File.join(ROOT, 'config/app.staging.yml')
|
||||
PRODUCTION_PATH = File.join(ROOT, 'config/app.production.yml')
|
||||
EXAMPLE_PATH = File.join(ROOT, 'config/app.staging.yml.example')
|
||||
|
||||
def load_hash(path)
|
||||
return nil unless File.exist?(path)
|
||||
|
||||
data = YAML.load_file(path)
|
||||
return data if data.is_a?(Hash)
|
||||
|
||||
warn "WARN: #{path} is #{data.class}, not Hash — ignored"
|
||||
nil
|
||||
end
|
||||
|
||||
def deep_merge(base, overlay)
|
||||
base.merge(overlay) do |_key, old_val, new_val|
|
||||
if old_val.is_a?(Hash) && new_val.is_a?(Hash)
|
||||
deep_merge(old_val, new_val)
|
||||
else
|
||||
new_val
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
staging_overlay = {
|
||||
'app' => {
|
||||
'domain' => 'fibitex.com',
|
||||
'subdomain' => 'beta',
|
||||
'shahoo_subdomain' => 'shahoo'
|
||||
},
|
||||
'images' => {
|
||||
'peatio' => 'custom/dena:1',
|
||||
'barong' => 'custom/dalan:1',
|
||||
'frontend' => 'custom/gereh:1',
|
||||
'gereh' => 'custom/gereh:1',
|
||||
'shahoo' => 'custom/shahoo:1',
|
||||
'shahoo_bff' => 'custom/shahoo-bff:1'
|
||||
}
|
||||
}
|
||||
|
||||
existing = load_hash(STAGING_PATH)
|
||||
if existing && ENV['BOOTSTRAP_FORCE'] != '1'
|
||||
puts "OK: #{STAGING_PATH} already exists and is a valid Hash."
|
||||
puts 'Set BOOTSTRAP_FORCE=1 to regenerate.'
|
||||
exit 0
|
||||
end
|
||||
|
||||
source = load_hash(PRODUCTION_PATH) || load_hash(EXAMPLE_PATH)
|
||||
unless source
|
||||
warn 'ERROR: Need config/app.production.yml or config/app.staging.yml.example'
|
||||
exit 1
|
||||
end
|
||||
|
||||
merged = deep_merge(source, staging_overlay)
|
||||
File.write(STAGING_PATH, merged.to_yaml)
|
||||
puts "Wrote #{STAGING_PATH}"
|
||||
puts 'Next:'
|
||||
puts ' export OPENDAX_ENV=staging'
|
||||
puts ' bundle exec rake render:config'
|
||||
36
scripts/check-email-dns.sh
Normal file
36
scripts/check-email-dns.sh
Normal file
@@ -0,0 +1,36 @@
|
||||
#!/usr/bin/env bash
|
||||
# Check SPF/DKIM/DMARC DNS for Fibitex email deliverability.
|
||||
# Usage: bash scripts/check-email-dns.sh [domain]
|
||||
# Example: bash scripts/check-email-dns.sh fibitex.com
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
DOMAIN="${1:-fibitex.com}"
|
||||
MAIL_HOST="mail.${DOMAIN}"
|
||||
|
||||
echo "=== Email DNS check: ${DOMAIN} ==="
|
||||
echo
|
||||
|
||||
echo "--- Mail server A record (${MAIL_HOST}) ---"
|
||||
dig +short "${MAIL_HOST}" A || true
|
||||
echo
|
||||
|
||||
echo "--- SPF (TXT @ ${DOMAIN}) ---"
|
||||
dig +short "${DOMAIN}" TXT | grep -i spf || echo "WARN: no SPF found"
|
||||
echo
|
||||
|
||||
echo "--- DKIM (default._domainkey.${DOMAIN}) ---"
|
||||
dig +short "default._domainkey.${DOMAIN}" TXT || echo "WARN: no DKIM at default selector (try mail._domainkey)"
|
||||
dig +short "mail._domainkey.${DOMAIN}" TXT 2>/dev/null || true
|
||||
echo
|
||||
|
||||
echo "--- DMARC (_dmarc.${DOMAIN}) ---"
|
||||
dig +short "_dmarc.${DOMAIN}" TXT || echo "WARN: no DMARC found"
|
||||
echo
|
||||
|
||||
echo "--- MX (${DOMAIN}) ---"
|
||||
dig +short "${DOMAIN}" MX || true
|
||||
echo
|
||||
|
||||
echo "Done. Fix WARN lines in Cloudflare / mail panel."
|
||||
echo "Full guide: Docs/13-email-deliverability-fibitex.md"
|
||||
25
scripts/validate-app-overlay.rb
Normal file
25
scripts/validate-app-overlay.rb
Normal file
@@ -0,0 +1,25 @@
|
||||
#!/usr/bin/env ruby
|
||||
# frozen_string_literal: true
|
||||
|
||||
# Validate overlay YAML files parse as Hash.
|
||||
# Usage: ruby scripts/validate-app-overlay.rb [path]
|
||||
|
||||
require 'yaml'
|
||||
|
||||
path = ARGV[0] || 'config/app.staging.yml'
|
||||
unless File.exist?(path)
|
||||
warn "Missing: #{path}"
|
||||
exit 1
|
||||
end
|
||||
|
||||
data = YAML.load_file(path)
|
||||
if data.is_a?(Hash)
|
||||
puts "OK: #{path} => Hash (#{data.keys.size} top-level keys)"
|
||||
puts "Keys: #{data.keys.join(', ')}"
|
||||
exit 0
|
||||
end
|
||||
|
||||
warn "FAIL: #{path} => #{data.class}"
|
||||
warn 'The file must start with key: value pairs (see config/app.staging.yml.example).'
|
||||
warn 'If you pasted only a password or IP, recreate the full file.'
|
||||
exit 1
|
||||
Reference in New Issue
Block a user