접속 IP 를 제한하는 결제사 API 를 로컬·스테이징에서 연동하려면 서버가 내보내는 요청의 출발지 IP 를 바꿔야 한다. 브라우저 프록시로는 바뀌지 않는 축이라 코어 환경설정으로 도입한다. 게이트는 디버그 모드이며 판정은 OutboundProxy 한 곳이 소유한다. 화면의 조건부 렌더링은 편의일 뿐이라 저장 API 직접 호출을 막지 못하므로, 실질 게이트를 판정 지점에 둔다. 주입·적용 지점은 결과만 소비한다. 적용은 Http::globalOptions 전역 옵션이라 확장의 Http:: 호출까지 함께 경유한다. 외부 연동 규약상 curl 핸들을 직접 다뤄야 하는 확장은 OutboundProxy::curlOptions 로 같은 프록시를 탄다 — KG이니시스 본인인증 승인 요청과 CBT 연결 점검을 이 통로로 편입했다. CBT 의 TCP 443 확인은 원시 소켓으로는 프록시를 태울 수 없어 curl CONNECT_ONLY 로 교체했다. 저장 전 연결 테스트는 저장값이 아니라 제출값을 검사하고, 그 프록시를 거쳤을 때 외부에 보이는 IP 를 함께 보고한다. 운영자가 결제사에 등록할 값이라 저장하고 나서 되짚지 않도록 했다. 적용과 같은 조립을 거치므로 확인한 구성과 저장 후 적용되는 구성이 어긋나지 않는다.
210 lines
14 KiB
PHP
210 lines
14 KiB
PHP
<?php
|
|
|
|
return [
|
|
// 설정 관련 메시지
|
|
'fetch_success' => '설정을 성공적으로 가져왔습니다.',
|
|
'fetch_failed' => '설정을 가져오는데 실패했습니다.',
|
|
'save_success' => '설정이 성공적으로 저장되었습니다.',
|
|
'save_failed' => '설정 저장에 실패했습니다.',
|
|
'update_success' => '설정이 성공적으로 업데이트되었습니다.',
|
|
'update_failed' => '설정 업데이트에 실패했습니다.',
|
|
'delete_success' => '설정이 성공적으로 삭제되었습니다.',
|
|
'delete_failed' => '설정 삭제에 실패했습니다.',
|
|
'save_error' => '설정 저장 중 오류가 발생했습니다.',
|
|
'update_error' => '설정 업데이트 중 오류가 발생했습니다.',
|
|
'cache_clear_success' => '캐시가 성공적으로 정리되었습니다.',
|
|
'cache_clear_failed' => '캐시 정리에 실패했습니다.',
|
|
'cache_clear_error' => '캐시 정리 중 오류가 발생했습니다.',
|
|
'optimize_success' => '시스템이 성공적으로 최적화되었습니다.',
|
|
'optimize_failed' => '시스템 최적화에 실패했습니다.',
|
|
'optimize_error' => '시스템 최적화 중 오류가 발생했습니다.',
|
|
'backup_success' => '데이터베이스 백업이 성공적으로 시작되었습니다.',
|
|
'backup_failed' => '데이터베이스 백업에 실패했습니다.',
|
|
'backup_error' => '데이터베이스 백업 중 오류가 발생했습니다.',
|
|
'database_backup_unavailable' => '데이터베이스 백업 기능은 아직 제공하지 않습니다. 설정 백업은 설정 백업 기능을 이용해 주세요.',
|
|
'backup_path_required' => '백업 경로를 입력해주세요.',
|
|
'restore_success' => '설정이 성공적으로 복원되었습니다.',
|
|
'restore_failed' => '설정 복원에 실패했습니다.',
|
|
'restore_error' => '설정 복원 중 오류가 발생했습니다.',
|
|
'save_individual_failed' => '설정 저장에 실패했습니다: :error',
|
|
|
|
// 앱 키 관련 메시지
|
|
'invalid_password' => '비밀번호가 일치하지 않습니다.',
|
|
'password_required' => '비밀번호를 입력해주세요.',
|
|
'app_key_regenerated' => '어플리케이션 키가 성공적으로 재생성되었습니다.',
|
|
'app_key_regenerate_failed' => '어플리케이션 키 재생성에 실패했습니다.',
|
|
'app_key_regenerate_warning' => '키를 변경하면 모든 세션이 무효화됩니다. 계속하시겠습니까?',
|
|
|
|
// 시스템 정보 관련
|
|
'seconds' => '초',
|
|
|
|
// 드라이버 라벨 (DriverRegistryService 가 활성 언어팩 별로 조회)
|
|
'drivers' => [
|
|
'storage' => [
|
|
'local' => '로컬',
|
|
's3' => 'Amazon S3',
|
|
],
|
|
'public_asset' => [
|
|
'none' => '사용 안 함 (스트리밍)',
|
|
'public' => 'Public 디스크',
|
|
's3' => 'Amazon S3',
|
|
],
|
|
'cache' => [
|
|
'file' => '파일',
|
|
'redis' => 'Redis',
|
|
],
|
|
'session' => [
|
|
'file' => '파일',
|
|
'database' => '데이터베이스',
|
|
'redis' => 'Redis',
|
|
],
|
|
'queue' => [
|
|
'sync' => '동기',
|
|
'database' => '데이터베이스',
|
|
'redis' => 'Redis',
|
|
],
|
|
'log' => [
|
|
'single' => '단일 파일',
|
|
'daily' => '일별 파일',
|
|
],
|
|
'websocket' => [
|
|
'reverb' => 'Laravel Reverb',
|
|
],
|
|
'mail' => [
|
|
'smtp' => 'SMTP',
|
|
'mailgun' => 'Mailgun',
|
|
'ses' => 'SES (Amazon)',
|
|
],
|
|
'search' => [
|
|
'mysql-fulltext' => 'MySQL 전문검색',
|
|
],
|
|
],
|
|
|
|
// 드라이버 연결 테스트 메시지
|
|
'driver_test_success' => '모든 드라이버 연결 테스트가 성공했습니다.',
|
|
'driver_test_partial' => '일부 드라이버 연결 테스트가 실패했습니다.',
|
|
'driver_test_error' => '드라이버 연결 테스트 중 오류가 발생했습니다.',
|
|
'unknown_driver' => '알 수 없는 드라이버입니다.',
|
|
|
|
// 아웃바운드 프록시 연결 테스트 메시지
|
|
'outbound_proxy_test_success' => '프록시 연결에 성공했습니다. 외부 서비스에는 이 IP 로 보입니다.',
|
|
'outbound_proxy_test_failed' => '프록시로 연결하지 못했습니다. 주소와 프록시 서버 상태를 확인해주세요.',
|
|
'outbound_proxy_test_invalid_url' => '프록시 주소 형식이 올바르지 않습니다.',
|
|
'outbound_proxy_test_no_lookup_url' => '출발지 IP 조회 대상이 설정되어 있지 않아 확인할 수 없습니다.',
|
|
|
|
// S3 테스트 메시지
|
|
's3_test_success' => 'S3 버킷에 성공적으로 연결되었습니다.',
|
|
's3_test_failed' => 'S3 버킷 연결에 실패했습니다.',
|
|
's3_missing_config' => 'S3 설정이 누락되었습니다. (버킷, 리전, 액세스 키, 시크릿 키)',
|
|
's3_sdk_missing' => 'AWS SDK가 설치되어 있지 않습니다.',
|
|
's3_adapter_missing' => 'S3 스토리지 어댑터(league/flysystem-aws-s3-v3)가 설치되어 있지 않습니다.',
|
|
's3_bucket_not_found' => 'S3 버킷을 찾을 수 없습니다.',
|
|
's3_access_denied' => 'S3 버킷에 대한 접근이 거부되었습니다.',
|
|
's3_invalid_credentials' => 'S3 인증 정보가 올바르지 않습니다.',
|
|
|
|
// Redis 테스트 메시지
|
|
'redis_test_success' => 'Redis 서버에 성공적으로 연결되었습니다.',
|
|
'redis_test_failed' => 'Redis 서버 연결에 실패했습니다.',
|
|
'redis_extension_missing' => 'Redis PHP 확장이 설치되어 있지 않습니다.',
|
|
'redis_connection_failed' => 'Redis 서버에 연결할 수 없습니다.',
|
|
'redis_auth_failed' => 'Redis 인증에 실패했습니다.',
|
|
'redis_ping_failed' => 'Redis PING 응답이 없습니다.',
|
|
|
|
// Memcached 테스트 메시지
|
|
'memcached_test_success' => 'Memcached 서버에 성공적으로 연결되었습니다.',
|
|
'memcached_test_failed' => 'Memcached 서버 연결에 실패했습니다.',
|
|
'memcached_extension_missing' => 'Memcached PHP 확장이 설치되어 있지 않습니다.',
|
|
'memcached_connection_failed' => 'Memcached 서버에 연결할 수 없습니다.',
|
|
|
|
// Websocket 테스트 메시지
|
|
'websocket_test_success' => 'Websocket 서버에 성공적으로 연결되었습니다.',
|
|
'websocket_test_failed' => 'Websocket 서버 연결에 실패했습니다.',
|
|
'websocket_server_test_failed' => 'Websocket 서버(백엔드 발송용) endpoint 연결에 실패했습니다. 클라이언트 endpoint 는 정상입니다.',
|
|
'driver_unusable_s3_adapter' => 'S3 스토리지 어댑터(league/flysystem-aws-s3-v3)가 설치되어 있지 않습니다.',
|
|
'driver_unusable_redis_client' => 'phpredis 확장과 predis 라이브러리가 모두 없습니다.',
|
|
'driver_unusable_memcached_extension' => 'memcached PHP 확장이 설치되어 있지 않습니다.',
|
|
'websocket_invalid_host' => 'Websocket 호스트 설정이 올바르지 않습니다. 호스트에는 주소만 입력하고 계정 정보(@)나 http/https 이외의 프로토콜은 사용할 수 없습니다.',
|
|
'websocket_connection_refused' => 'Websocket 서버에 연결할 수 없습니다. 서버가 실행 중인지 확인해주세요.',
|
|
|
|
// 테스트 메일 관련 메시지
|
|
'invalid_email' => '유효하지 않은 이메일 주소입니다.',
|
|
'test_mail_subject' => ':app_name 테스트 메일',
|
|
'test_mail_body' => '이것은 그누보드7에서 발송한 테스트 메일입니다. 이 메일을 받으셨다면 메일 설정이 올바르게 구성되어 있습니다.',
|
|
'test_mail_sent' => '테스트 메일이 성공적으로 발송되었습니다.',
|
|
'test_mail_failed' => '테스트 메일 발송에 실패했습니다.',
|
|
'test_mail_error' => '테스트 메일 발송 중 오류가 발생했습니다.',
|
|
|
|
// 코어 업데이트 관련 메시지
|
|
'core_update' => [
|
|
'check_success' => '업데이트 확인이 완료되었습니다.',
|
|
'check_failed' => '업데이트 확인에 실패했습니다.',
|
|
'update_available' => '새로운 업데이트가 있습니다.',
|
|
'no_update' => '현재 최신 버전입니다.',
|
|
'maintenance_mode_active' => '시스템 점검 중입니다. 잠시 후 다시 시도해주세요.',
|
|
'invalid_github_url' => 'GitHub 저장소 URL이 유효하지 않습니다.',
|
|
'download_failed' => ':version 버전 다운로드에 실패했습니다.',
|
|
'zip_extract_failed' => 'ZIP 파일 압축 해제에 실패했습니다.',
|
|
'invalid_package' => '다운로드된 패키지가 유효하지 않습니다.',
|
|
'invalid_package_not_g7' => '지정된 디렉토리가 그누보드7 프로젝트가 아닙니다. config/app.php 파일과 version 설정이 필요합니다.',
|
|
'composer_failed' => 'composer install 실행에 실패했습니다.',
|
|
'pending_path_create_failed' => '_pending 디렉토리(:path) 생성에 실패했습니다: :error',
|
|
'pending_path_not_writable' => '_pending 디렉토리(:path)에 쓰기 권한이 없습니다.',
|
|
'downloading' => '업데이트 다운로드 중...',
|
|
'extracting' => '압축 해제 중...',
|
|
'validating' => '패키지 검증 중...',
|
|
'running_composer' => 'composer install 실행 중...',
|
|
'step_check' => '업데이트 확인 중...',
|
|
'step_validate_pending' => '환경 검증 중...',
|
|
'step_maintenance' => '유지보수 모드 활성화 중...',
|
|
'step_download' => '다운로드 중...',
|
|
'step_backup' => '백업 생성 중...',
|
|
'step_apply' => '파일 적용 중...',
|
|
'step_composer' => 'composer install 중...',
|
|
'step_migration' => '마이그레이션 실행 중...',
|
|
'step_upgrade' => '업그레이드 스텝 실행 중...',
|
|
'step_composer_prod' => '운영 디렉토리 composer install 중...',
|
|
'step_cleanup' => '정리 중...',
|
|
|
|
// 파일 적용 방식 요약 (Step 7)
|
|
'apply_mode_incremental' => '파일 적용: 코어가 실제 변경한 파일만 적용했습니다 (신규 :added개, 변경 :changed개). 그 외 파일은 현재 상태 그대로 보존되었습니다.',
|
|
'apply_mode_incremental_prune_hint' => '신 버전에서 제거된 파일을 함께 정리하려면 `--prune` 옵션으로 다시 실행하거나 `php artisan hotfix:rollback-stale-files --prune` 을 사용하세요.',
|
|
'apply_mode_prune' => '파일 적용: 전체 덮어쓰기 + 제거된 파일 정리를 수행했습니다 (--prune).',
|
|
'apply_mode_fallback' => '파일 적용: 백업이 없어 증분 적용을 건너뛰고 전체 덮어쓰기를 수행했습니다. 사용자 커스텀 파일 보존을 원하면 다음부터는 백업을 유지한 채 업데이트하세요.',
|
|
|
|
// GitHub API 에러 메시지
|
|
'github_url_not_configured' => 'GitHub 저장소 URL이 설정되지 않았습니다.',
|
|
'github_api_failed' => 'GitHub API에 연결할 수 없습니다.',
|
|
'github_token_required' => '프라이빗 저장소입니다. GitHub 액세스 토큰을 설정해주세요.',
|
|
'github_token_invalid' => 'GitHub 액세스 토큰이 유효하지 않거나 권한이 부족합니다. (HTTP :status — :message)',
|
|
'github_repo_not_found' => 'GitHub 저장소를 찾을 수 없습니다. (HTTP :status — :message)',
|
|
'github_repo_not_found_no_token' => 'GitHub 저장소를 찾을 수 없습니다. 프라이빗 저장소인 경우 액세스 토큰을 설정해주세요. (HTTP :status — :message)',
|
|
'github_api_error' => 'GitHub API 오류가 발생했습니다. (HTTP :status — :message)',
|
|
'no_releases_found' => 'GitHub 저장소에 릴리스가 없습니다. (HTTP :status — :message)',
|
|
|
|
// 로그 메시지
|
|
'log_api_call_failed' => '코어 업데이트: GitHub API 호출 실패',
|
|
'log_auth_failed' => '코어 업데이트: GitHub 인증 실패',
|
|
'log_not_found' => '코어 업데이트: GitHub 저장소/릴리스 미발견',
|
|
'log_unexpected_status' => '코어 업데이트: 예상하지 못한 HTTP 상태 코드',
|
|
'log_version_check_error' => '코어 업데이트: 최신 버전 확인 중 오류',
|
|
|
|
'unknown_error' => '알 수 없는 오류가 발생했습니다.',
|
|
|
|
// 시스템 요구사항
|
|
'system_requirements_failed' => '시스템 요구사항이 충족되지 않습니다:',
|
|
'no_extract_method_available' => '사용 가능한 아카이브 추출 방법이 없습니다. PHP zip 확장(ZipArchive) 또는 unzip 명령어(Linux) 중 하나가 필요합니다. 또는 --source 옵션으로 수동 업데이트할 수 있습니다.',
|
|
'manual_update_guide' => '수동 업데이트: GitHub에서 릴리스 ZIP을 다운로드하여 압축 해제 후, php artisan core:update --source=/압축해제/경로 명령어를 실행하세요.',
|
|
|
|
// 추출 폴백 체인
|
|
'archive_url_not_found' => ':type 아카이브 URL을 찾을 수 없습니다. 다음 방법을 시도합니다.',
|
|
'extracting_with' => ':method 방식으로 압축 해제 중...',
|
|
'extract_empty' => '압축 해제된 디렉토리가 비어 있습니다.',
|
|
'extract_fallback' => ':method 방식 실패: :error — 다음 방법을 시도합니다.',
|
|
'all_extract_methods_failed' => '모든 아카이브 추출 방법이 실패했습니다. --source 옵션으로 수동 업데이트를 시도하세요.',
|
|
'unzip_command_failed' => 'unzip 명령어 실행 실패 (종료 코드: :code). :output',
|
|
'zip_file_not_found' => '지정된 ZIP 파일을 찾을 수 없습니다: :path',
|
|
'source_vendor_missing' => '소스 디렉토리에 vendor가 없습니다. composer install이 실행되지 않았을 수 있습니다.',
|
|
'composer_failed_with_output' => 'composer install 실행에 실패했습니다.:output',
|
|
],
|
|
];
|