광고 자리 모집 중 · 제휴 문의

Replit Deployments에서 환경 변수(Secrets), 지속성 PostgreSQL, 커스텀 도메인을 프로덕션 수준으로 구성하는 방법

365Finds Editorial
Wiki 문서 11,430편 수록

내 AI에서 365 Wiki 사용하기

아래 프롬프트를 복사해 평소 사용하는 AI에 붙여넣고 바로 질문하세요.

전체 Skill 다운로드

먼저 프롬프트로 체험해 보세요. 365 Wiki를 자주 쓴다면 전체 365Wiki Skill을 설치해 매번 붙여넣는 수고를 줄일 수 있습니다. 평소 쓰는 AI가 없다면 Gemini나 Microsoft Copilot 웹 버전도 사용할 수 있습니다.

대화형 개발 환경에서 프로토타입으로 작성한 웹 애플리케이션을 신뢰할 수 있는 상용 서비스로 전환하기 위해서는 세 가지 핵심 인프라 요소를 반드시 갖추어야 합니다. 보안 자격 증명의 안전한 격리, 지속성을 보장하는 고가용성 관계형 데이터베이스, 그리고 자동 갱신되는 TLS/SSL 인증서 기반의 커스텀 도메인입니다. Replit에서는 이 배포 및 운영 라이프사이클이 Replit Deployments(에디터 내 Publishing 도구)에 완전히 통합되어 있습니다. 컨테이너 컴퓨팅 오케스트레이션, 서버리스 PostgreSQL, 암호화 키 볼트, DNS 기반 자동 인증서 관리가 단일 파이프라인으로 매끄럽게 연결됩니다.

본 가이드에서는 Replit Deployments에서 프로덕션 환경 변수(Deployment Secrets)를 격리 관리하고, 지속성 PostgreSQL 데이터베이스를 연동할 때 발생하는 SSL 문제를 해결하며, 커스텀 도메인을 안전하게 연결하여 인증서 갱신 실패를 방지하는 실무 구성 방법을 안내합니다.


1. 워크로드에 적합한 배포 아키텍처 선택

데이터베이스나 비밀 키를 설정하기 전에, Publishing → Adjust settings → Deployment type 메뉴에서 애플리케이션의 성격에 맞는 배포 방식을 선택해야 합니다.

데이터베이스 읽기/쓰기가 필요하고 외부 API 키를 안전하게 다뤄야 하는 상용 웹 서비스의 경우 Autoscale 또는 Reserved VM을 기반으로 구축해야 합니다.


2. 프로덕션 환경 변수 및 Secrets 격리 관리

상용 배포 시 발생하는 흔한 보안 사고 중 하나는 개발용 API 키의 유출이나 개발/운영 환경 간 자격 증명 혼용입니다. Replit은 환경 변수 라이프사이클을 **Development Secrets(개발용)**와 **Deployment Secrets(배포용)**의 두 계층으로 완전히 분리하여 운영합니다.

이중 격리 구조 이해하기

프로덕션 Secrets 설정 절차

  1. 민감 정보와 일반 설정 분리: Stripe 시크릿 키, OpenAI 토큰, OAuth 클라이언트 시크릿 등 민감한 자격 증명은 Secrets(AES-256 저장 암호화 및 TLS 전송 보호)에 저장하고, LOG_LEVEL=info나 공개 CDN 경로와 같은 비민감 설정은 Configurations 항목으로 분리합니다.
  2. Publishing 도구에서 배포 키 입력: Publishing 도구를 열고 Adjust settings를 확장한 후 Deployment secrets 섹션으로 이동합니다. 프로덕션 환경에서 사용할 키-값 쌍을 정확히 입력하거나 확인합니다.
  3. 재배포(Re-publish) 필수 실행: 배포용 Secrets를 수정한 후에는 반드시 Publish 버튼을 다시 눌러 새 컨테이너 이미지를 빌드하고 배포해야 최신 환경 변수가 주입됩니다.

코드에서 환경 변수 참조하기

Replit은 Secrets를 표준 운영체제 환경 변수로 전달합니다. 소스 코드에 테스트용 폴백 키를 하드코딩해서는 안 됩니다.

Node.js / TypeScript 예제:

const stripeApiKey = process.env.STRIPE_SECRET_KEY;
if (!stripeApiKey) {
  throw new Error("프로덕션 환경에 STRIPE_SECRET_KEY 환경 변수가 누락되었습니다");
}

Python 예제:

import os

stripe_api_key = os.environ.get("STRIPE_SECRET_KEY")
if not stripe_api_key:
    raise RuntimeError("프로덕션 환경에 STRIPE_SECRET_KEY 환경 변수가 누락되었습니다")

주의 사항: 워크스페이스 미리보기 전용 시스템 변수(예: REPLIT_DEV_DOMAIN)는 프로덕션 컨테이너에 존재하지 않습니다. 웹훅 수신 주소나 리다이렉트 URL을 구성할 때는 연결된 커스텀 도메인이나 명시적인 커스텀 환경 변수를 사용해야 합니다.


3. 지속성 PostgreSQL 데이터베이스 구성 및 SSL 이슈 해결

모든 Replit App은 매니지드 PostgreSQL 데이터베이스를 기본적으로 제공하지만, 개발 환경과 프로덕션 환경의 백엔드 인프라는 서로 완전히 다릅니다.

아키텍처 비교: 개발 데이터베이스(Helium) vs. 프로덕션 데이터베이스(Neon)

DATABASE_URL 자동 주입 원칙

Replit은 애플리케이션의 DATABASE_URL을 자동으로 관리합니다.

프로덕션 SSL 강제 요건 해결 패턴

개발 환경에서는 SSL이 지원되지 않고, 프로덕션에서는 SSL이 필수적이므로, NODE_ENV에 따라 동적으로 SSL 설정을 전환하는 코드가 필요합니다. 이를 누락하면 The server does not support SSL connections 에러가 발생하거나 배포 후 연결 실패를 겪게 됩니다.

Node.js (pg 드라이버 풀 구성 예시):

import { Pool } from "pg";

const isProduction = process.env.NODE_ENV === "production";

export const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
  ssl: isProduction ? { rejectUnauthorized: false } : false,
});

Drizzle ORM 연동 예시:

import { drizzle } from "drizzle-orm/node-postgres";
import { Pool } from "pg";

const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
  ssl: process.env.NODE_ENV === "production" ? { rejectUnauthorized: false } : false,
});

export const db = drizzle(pool);

트래픽 급증 대응: 커넥션 풀링(Connection Pooling)

Autoscale 모드에서는 트래픽이 몰릴 때 컨테이너 인스턴스가 여러 개 병렬로 복제됩니다. 각 컨테이너가 데이터베이스에 직접 연결을 대량으로 맺으면 PostgreSQL의 최대 연결 한도(max_connections)를 빠르게 초과할 수 있습니다.

  1. Replit의 Database 도구 설정에서 프로덕션 데이터베이스 정보를 확인합니다.
  2. Neon 프로덕션 데이터베이스는 호스트 이름에 -pooler가 포함된 풀러 엔드포인트(예: ep-xyz-pooler.region.neon.tech)를 제공합니다.
  3. 일반적인 웹 트래픽 처리 쿼리는 풀러 엔드포인트를 통해 연결하고, 세션 레벨의 락이 필요한 마이그레이션 작업에는 일반 다이렉트 연결을 분리 적용하는 것이 바람직합니다.

안전한 스키마 마이그레이션과 Deployment Previews

컬럼 삭제, 데이터 타입 변경, 기본값 없는 NOT NULL 필드 추가 등의 파괴적인 변경을 수행할 때:


4. 커스텀 도메인 연결 및 영구적 TLS/SSL 인증서 유지

배포된 앱에는 무료 *.replit.app 서브도메인이 기본 부여됩니다. 하지만 상용 브랜딩과 사용자 신뢰를 위해서는 자체 커스텀 도메인(루트 도메인 및 www 서브도메인) 연결이 필수적입니다.

Replit은 DNS 검증 방식을 통해 Let's Encrypt / Google Trust TLS/SSL 인증서를 완전 자동으로 발급하고 갱신합니다. 그러나 DNS 설정 오류나 필수 검증 레코드의 임의 삭제로 인해 인증서 갱신 실패가 발생하는 경우가 빈번합니다.

커스텀 도메인 설정 단계

1단계: Replit Publishing 도구에 도메인 등록

  1. Publishing 도구를 열고 Domains 탭을 선택합니다.
  2. 보유한 커스텀 도메인(예: example.com)을 입력합니다.
  3. 화면에 A 레코드용 IP 주소와 TXT 레코드용 검증 문자열이 표시됩니다.

2단계: DNS 관리 업체에서 레코드 등록

Cloudflare, 가비아, 후이즈, AWS Route 53 등의 DNS 설정 페이지로 이동하여 다음 레코드를 등록합니다.

레코드 유형호스트 / 이름값 / 대상목적
A@ (또는 루트 도메인)[Replit이 표시한 IP 주소]웹 트래픽을 프로덕션 컨테이너로 전달
TXT@ (또는 루트 도메인)replit-verify=xxxxxxxx...도메인 소유권 확인 및 TLS 인증서 자동 발급/갱신

3단계: 치명적인 DNS 설정 오류 방지

서브도메인 추가 및 www 정규화 리다이렉트

Replit 라우팅 구조에서 루트 도메인과 서브도메인은 별개의 독립된 엔티티입니다.


5. 프로덕션 배포 체크리스트

실제 사용자의 트래픽을 Replit Deployments로 전환하기 전에 다음 항목을 점검하십시오.

  1. 환경 변수 점검:
    • Publishing → Adjust settings → Deployment secrets에 필요한 모든 외부 API 키가 등록되었는지 확인.
    • 소스 코드에 테스트용 민감 키가 남아있지 않은지 검토.
    • 설정 변경 후 반드시 Re-publish를 실행하여 컨테이너 갱신.
  2. 데이터베이스 연결성 확인:
    • 데이터베이스 클라이언트 코드가 NODE_ENV === "production"일 때 SSL 연결을 적용하는지 확인.
    • 애플리케이션이 자동 주입된 DATABASE_URL을 올바르게 읽어오는지 확인.
    • 컨테이너 재시작 및 트래픽 급증 시 데이터베이스 연결 오류가 발생하지 않는지 확인.
  3. 도메인 및 보안 상태:
    • Replit Domains 탭에서 연결한 모든 도메인이 Verified(녹색 인증 완료) 상태인지 확인.
    • DNS 관리 패널에 replit-verify TXT 레코드가 삭제되지 않고 유지되고 있는지 확인.
    • 데스크톱 및 모바일 브라우저에서 HTTPS 암호화 연결이 정상적으로 작동하는지 확인.
  4. 모니터링 및 리전 설정:
    • 서버 장애나 HTTP 에러 발생 시 즉각 이메일 알림을 받도록 Publishing 도구의 Monitoring tools를 활성화.
    • 주 이용자층과 가까운 배포 지역(Deployment geography)이 설정되었는지 확인(배포 완료 후 리전을 변경하려면 Remix가 필요합니다).

개발과 배포 환경의 Secrets를 철저히 격리하고, 환경 적응형 PostgreSQL SSL 드라이버를 구현하며, 영구적인 DNS 검증 레코드를 유지함으로써 Replit Deployments 상에서 확장 가능하고 안전한 프로덕션 웹 애플리케이션을 안정적으로 운영할 수 있습니다.


참고 자료