Referans

Üretimde CaptchaAI: Yapılandırma Yönetimi Kılavuzu

Sabit kodlanmış API anahtarları ve zaman aşımları prototipler için işe yarar. Üretim, ortama özel yapılandırmaya, gizli dizi yönetimine ve yeniden konuşlandırmaya gerek kalmadan ayarları değiştirebilme yeteneğine ihtiyaç duyar.

Yapılandırma Hiyerarşisi

Priority (highest → lowest):

1. Environment variables     ← deployment-specific overrides
2. Config file (YAML/JSON)   ← version-controlled defaults
3. Application defaults      ← fallback values in code

Tam Yapılandırma Referansı

Parametre Ortam Değişkeni Varsayılan Açıklama
API Anahtarı CAPTCHAAI_API_KEY Gerekli. CaptchaAI API anahtarınız
URL'yi gönder CAPTCHAAI_SUBMIT_URL https://ocr.captchaai.com/in.php Görev gönderme uç noktası
Anket URL'si CAPTCHAAI_POLL_URL https://ocr.captchaai.com/res.php Sonuç yoklama uç noktası
Anket aralığı CAPTCHAAI_POLL_INTERVAL 5 Oylama girişimleri arasındaki saniyeler
Maksimum anket denemesi CAPTCHAAI_MAX_POLLS 60 Zaman aşımından önce maksimum yoklama denemesi
Eşzamanlılık CAPTCHAAI_CONCURRENCY 10 Maksimum paralel CAPTCHA görevleri
Zaman aşımı CAPTCHAAI_TIMEOUT 300 Saniye cinsinden genel zaman aşımı
vekil CAPTCHAAI_PROXY CAPTCHA çözümü için proxy URL'si
Geri arama URL'si CAPTCHAAI_CALLBACK_URL Eşzamansız sonuçlar için web kancası URL'si
Tekrar deneme denemeleri CAPTCHAAI_RETRIES 3 Geçici arızalarda yeniden denemeler
Günlük düzeyi CAPTCHAAI_LOG_LEVEL info Günlüğe kaydetme ayrıntısı

Yapılandırma Yükleyici

Python

import os
import yaml
from dataclasses import dataclass, field
from pathlib import Path


@dataclass
class CaptchaAIConfig:
    api_key: str = ""
    submit_url: str = "https://ocr.captchaai.com/in.php"
    poll_url: str = "https://ocr.captchaai.com/res.php"
    poll_interval: int = 5
    max_polls: int = 60
    concurrency: int = 10
    timeout: int = 300
    proxy: str = ""
    callback_url: str = ""
    retries: int = 3
    log_level: str = "info"

    @classmethod
    def load(cls, config_path=None):
        """Load config: env vars override file, which overrides defaults."""
        config = cls()

        # Layer 2: Config file
        if config_path and Path(config_path).exists():
            with open(config_path) as f:
                file_config = yaml.safe_load(f) or {}
            for key, value in file_config.items():
                if hasattr(config, key):
                    setattr(config, key, value)

        # Layer 1: Environment variables (highest priority)
        env_map = {
            "CAPTCHAAI_API_KEY": "api_key",
            "CAPTCHAAI_SUBMIT_URL": "submit_url",
            "CAPTCHAAI_POLL_URL": "poll_url",
            "CAPTCHAAI_POLL_INTERVAL": "poll_interval",
            "CAPTCHAAI_MAX_POLLS": "max_polls",
            "CAPTCHAAI_CONCURRENCY": "concurrency",
            "CAPTCHAAI_TIMEOUT": "timeout",
            "CAPTCHAAI_PROXY": "proxy",
            "CAPTCHAAI_CALLBACK_URL": "callback_url",
            "CAPTCHAAI_RETRIES": "retries",
            "CAPTCHAAI_LOG_LEVEL": "log_level",
        }

        for env_key, attr_name in env_map.items():
            value = os.environ.get(env_key)
            if value is not None:
                # Cast to correct type
                current = getattr(config, attr_name)
                if isinstance(current, int):
                    value = int(value)
                setattr(config, attr_name, value)

        config.validate()
        return config

    def validate(self):
        if not self.api_key:
            raise ValueError("CAPTCHAAI_API_KEY is required")
        if self.poll_interval < 1:
            raise ValueError("poll_interval must be >= 1")
        if self.concurrency < 1:
            raise ValueError("concurrency must be >= 1")


# Usage
config = CaptchaAIConfig.load("config/captchaai.yaml")
print(f"Concurrency: {config.concurrency}, Timeout: {config.timeout}s")

JavaScript

const fs = require("fs");
const yaml = require("js-yaml");
const path = require("path");

class CaptchaAIConfig {
  static defaults = {
    apiKey: "",
    submitUrl: "https://ocr.captchaai.com/in.php",
    pollUrl: "https://ocr.captchaai.com/res.php",
    pollInterval: 5,
    maxPolls: 60,
    concurrency: 10,
    timeout: 300,
    proxy: "",
    callbackUrl: "",
    retries: 3,
    logLevel: "info",
  };

  static envMap = {
    CAPTCHAAI_API_KEY: "apiKey",
    CAPTCHAAI_SUBMIT_URL: "submitUrl",
    CAPTCHAAI_POLL_URL: "pollUrl",
    CAPTCHAAI_POLL_INTERVAL: { key: "pollInterval", type: "int" },
    CAPTCHAAI_MAX_POLLS: { key: "maxPolls", type: "int" },
    CAPTCHAAI_CONCURRENCY: { key: "concurrency", type: "int" },
    CAPTCHAAI_TIMEOUT: { key: "timeout", type: "int" },
    CAPTCHAAI_PROXY: "proxy",
    CAPTCHAAI_CALLBACK_URL: "callbackUrl",
    CAPTCHAAI_RETRIES: { key: "retries", type: "int" },
    CAPTCHAAI_LOG_LEVEL: "logLevel",
  };

  static load(configPath = null) {
    let config = { ...CaptchaAIConfig.defaults };

    // Layer 2: Config file
    if (configPath && fs.existsSync(configPath)) {
      const ext = path.extname(configPath);
      const raw = fs.readFileSync(configPath, "utf8");
      const fileConfig = ext === ".json" ? JSON.parse(raw) : yaml.load(raw);
      config = { ...config, ...fileConfig };
    }

    // Layer 1: Environment variables
    for (const [envKey, mapping] of Object.entries(CaptchaAIConfig.envMap)) {
      const value = process.env[envKey];
      if (value !== undefined) {
        const attrKey = typeof mapping === "string" ? mapping : mapping.key;
        const type = typeof mapping === "string" ? "string" : mapping.type;
        config[attrKey] = type === "int" ? parseInt(value, 10) : value;
      }
    }

    CaptchaAIConfig.validate(config);
    return config;
  }

  static validate(config) {
    if (!config.apiKey) throw new Error("CAPTCHAAI_API_KEY is required");
    if (config.pollInterval < 1) throw new Error("pollInterval must be >= 1");
    if (config.concurrency < 1) throw new Error("concurrency must be >= 1");
  }
}

// Usage
const config = CaptchaAIConfig.load("config/captchaai.yaml");
console.log(`Concurrency: ${config.concurrency}, Timeout: ${config.timeout}s`);

Ortam Başına Yapılandırma Dosyaları

# config/captchaai.yaml — base
api_key: ""  # Always set via env var
concurrency: 5
poll_interval: 5
retries: 3
log_level: info
# config/captchaai.production.yaml
concurrency: 20
poll_interval: 3
timeout: 180
log_level: warning
# config/captchaai.staging.yaml
concurrency: 3
poll_interval: 5
timeout: 300
log_level: debug

Sırlar Yönetimi

API anahtarlarını asla yapılandırma dosyalarında veya kaynak kontrolünde saklamayın.

Yöntem En İyisi Örnek
Ortam değişkenleri Konteynerler, CI/CD export CAPTCHAAI_API_KEY=abc123
AWS Sırları Yöneticisi AWS altyapısı Başlangıçta getir; otomatik döndürme
HashiCorp Kasası Çoklu bulut, şirket içi TTL ile dinamik sırlar
Docker sırları Docker Swarm / Oluşturma /run/secrets/'ye monte edildi
.env dosyası (yalnızca geliştirici) Yerel kalkınma dotenv kütüphanesi; .gitignore

Docker Oluşturma Örneği

services:
  captcha-worker:
    image: captcha-worker:latest
    environment:

      - CAPTCHAAI_API_KEY=${CAPTCHAAI_API_KEY}
      - CAPTCHAAI_CONCURRENCY=15
      - CAPTCHAAI_LOG_LEVEL=warning
    env_file:

      - .env.production

Özellik Bayrakları

Yeniden konuşlandırmaya gerek kalmadan yetenekleri değiştirin:

class FeatureFlags:
    def __init__(self):
        self.flags = {
            "use_callback": os.environ.get("FF_USE_CALLBACK", "false") == "true",
            "enable_proxy": os.environ.get("FF_ENABLE_PROXY", "true") == "true",
            "max_concurrent": int(os.environ.get("FF_MAX_CONCURRENT", "10")),
        }

    def is_enabled(self, flag):
        return self.flags.get(flag, False)

    def get(self, flag, default=None):
        return self.flags.get(flag, default)

Sorun giderme

Sorun Sebep Düzeltme
API anahtarı yüklenmiyor Eksik env var; yanlış değişken adı echo $CAPTCHAAI_API_KEY'yi kontrol edin; Yazımı doğrula
Yapılandırma dosyası göz ardı edildi Yanlış yol veya eksik YAML kitaplığı Dosyanın var olduğunu doğrulayın; pyyaml / js-yaml'yi yükleyin
Geliştirme ayarlarını kullanan üretim Ortam'a özgü geçersiz kılma uygulanmadı Env var önceliğini kontrol edin; NODE_ENV / APP_ENV'yi doğrulayın
Günlüklerde görünen sırlar Yapılandırma dökümü API anahtarını içerir Günlük çıktısındaki hassas alanları maskeleyin

SSS

Yapılandırma dosyaları için YAML veya JSON kullanmalı mıyım?

İnsanlar tarafından düzenlenen dosyalar için YAML (yorumları destekler). Makine tarafından oluşturulan yapılandırmalar için veya katı ayrıştırma istediğinizde JSON.

API anahtarlarını ne sıklıkla döndürmeliyim?

Tehlikedeyseniz hemen döndürün. Uyumluluk için her 90 günde bir rotasyon planlayın. Otomatik rotasyonu destekleyen gizli dizi yöneticilerini kullanın.

Yeniden başlatmadan eşzamanlılığı değiştirebilir miyim?

Evet — yalnızca başlangıçta değil, her görev kümesindeki ortam değişkenlerinden veya yapılandırma hizmetinden ayarları okuyun. Bu, env değişkenini güncelleyerek ve yeniden yükleme sinyali göndererek eşzamanlılığı ayarlamanıza olanak tanır.

İlgili Makaleler

Sonraki Adımlar

Konfigürasyonunuzu üretime hazır hale getirin —CaptchaAI API anahtarıyla başlayınve yukarıdaki yapılandırma şablonlarından derleyin.

İlgili kılavuzlar:

Bu makale için yorumlar devre dışı bırakılmıştır.