Initial commit

This commit is contained in:
Yaser
2026-08-13 19:42:08 +03:30
commit d59bf30ef0
173 changed files with 11702 additions and 0 deletions

View 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'

View 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"

View 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