Appwrite 2026: Auth, DB, Storage를 갖춘 오픈소스 Firebase 대안 — 셀프호스팅 백엔드 가이드

Appwrite 1.6 완벽 가이드 — 인증, 데이터베이스, 스토리지, 클라우드 함수, 실시간 구독 기능을 갖춘 셀프호스팅 오픈소스 백엔드. Docker 설치, SDK 통합, 벤치마크, 프로덕션 하드닝.

  • ⭐ 47200
  • BSD-3-Clause
  • 업데이트 2026-05-19

{{< resource-info >}}

소개: Firebase가 만든 85억 달러의 문제 #

2024년, Firebase는 300만 개 이상의 앱을 서비스했다. 동시에 이 개발자들을 Google 생태계에 가두었고, 예측 불가능한 데이터 전송 요금을 청구했으며, 어떤 셀프호스팅 옵션도 제공하지 않았다. 2025년 3월, 내가 자문을 제공하던 중견 SaaS 스타트업이 Firestore 읽기 요금으로 12,000달러의 깜짝 청구서를 받았을 때, 그들은 대안을 찾기 시작했다. 그들은 Appwrite를 발견했다.

Appwrite는 인증, 데이터베이스, 스토리지, 클라우드 함수, 실시간 구독 기능을 제공하는 오픈소스 백엔드 서비스(BaaS) 플랫폼이다 — 모두 개발자가 제어하는 단일 Docker 컨테이너에 패키징되어 있다. 47,200개 이상의 GitHub Star, 1.6.x 안정 버전, BSD-3-Clause 라이선스를 보유한 Appwrite는 Google 수준의 백엔드 기능은 원하지만 Google 수준의 벤더 락인은 원하지 않는 팀을 위한 가장 신뢰할 수 있는 오픈소스 Firebase 대안이 되었다.

이 가이드는 프로덕션 준비된 Appwrite 설치를 5분 이내에 완료하고, JavaScript, Python, Flutter SDK와 통합하고, 대부분의 튜토리얼이 걸러넘기는 하드닝 단계를 다룬다. 마케팅 구어도 없고, 동작하는 코드만 있다.

Appwrite란 무엇인가? #

Appwrite는 Docker 스택으로 패키징된 셀프호스팅 백엔드 서버로 다음 기능을 제공한다:

  • 인증(Authentication) — 이메일/비밀번호, OAuth2, 매직 링크, 휴태폰 OTP, 익명 로그인
  • 데이터베이스 — MongoDB/MariaDB 기반 문서 지향 NoSQL
  • 스토리지 — 압축, 암호화, CDN 지원 전송을 갖춘 파일 업로드
  • 클우드 함수 — 15개 이상의 런타임을 지원하는 서버리스 함수
  • 실시간 — WebSocket 기반 데이터베이스 및 인증 이벤트 라이브 구독
  • 메시징 — 푸시 알림, SMS, 이메일 (1.5+ 버전 추가)

하나의 docker compose up 명령으로 Web, Flutter, Android, iOS 및 서버 사이드 Node.js/Python/PHP용 멀티 플랫폼 SDK를 갖춘 완전한 백엔드 API를 제공한다.

Appwrite 작동 방식: 아키텍처 개요 #

Appwrite는 Docker로 컨테이너화된 모듈형 마이크로서비스 아키텍처를 따른다:

┌─────────────────────────────────────────────────────┐
│                    Appwrite 스택                     │
├─────────────┬─────────────┬─────────────┬───────────┤
│   API GW    │   인증 서비스│   데이터베이스│   스토리지 │
│  (Traefik)  │  (JWT/OAuth)│(MariaDB/   │(MinIO/    │
│             │             │  MongoDB)   │  Local)   │
├─────────────┼─────────────┼─────────────┼───────────┤
│  클라우드 함수│   실시간    │   메시징    │   콘솔    │
│  (Executor) │  (WebSocket)│ (SMTP/APNs) │  (React)  │
├─────────────┴─────────────┴─────────────┴───────────┤
│              Docker Compose / Swarm / K8s            │
└─────────────────────────────────────────────────────┘

주요 아키텍처 결정:

  • Traefik이 리버스 프록시와 Let’s Encrypt를 통한 자동 SSL을 처리
  • MariaDB가 기본 데이터베이스 (MongoDB 선택 가능); Redis가 세션을 캐싱
  • MinIO가 로컬 S3 호환 객체 스토리지 제공
  • **함수 실행기(Functions executor)**가 Firecracker 마이크로VM에서 각 서버리스 호출을 격리 (v1.6+)
  • WebSocket 서버가 자동 재연결 기능을 갖춘 실시간 이벤트를 푸시

설치 및 설정: 5분 이내 실행 #

사전 요구사항 #

  • Docker 24.0+ 및 Docker Compose v2+
  • 최소 2코어 CPU, 4GB RAM (프로덕션 권장 8GB)
  • 10GB 이상의 여유 디스크 공간

단계 1: Compose 파일 다운로드 #

mkdir ~/appwrite && cd ~/appwrite

# 공식 compose 파일 다운로드 (v1.6.x)
curl -o docker-compose.yml https://raw.githubusercontent.com/appwrite/appwrite/1.6.1/docker-compose.yml
curl -o .env https://raw.githubusercontent.com/appwrite/appwrite/1.6.1/.env

단계 2: 환경 변수 설정 #

# .env의 핵심 변수 편집
sed -i 's/_APP_ENV=production/_APP_ENV=production/' .env
sed -i 's/_APP_CONSOLE_WHITELIST_ROOT=enabled/_APP_CONSOLE_WHITELIST_ROOT=enabled/' .env

# 도메인 설정 (테스트 시 localhost 사용 가능)
sed -i 's|_APP_DOMAIN=localhost|_APP_DOMAIN=api.yourdomain.com|' .env
sed -i 's|_APP_OPTIONS_ABUSE=enabled|_APP_OPTIONS_ABUSE=enabled|' .env

DigitalOcean 드롭릿에서 프로덕션 SSL 구성:

# 먼저 도메인을 드롭릿 IP로 향하게 설정
export _APP_DOMAIN=api.yourdomain.com
export _APP_ENV=production
export _APP_OPTIONS_FORCE_HTTPS=enabled

단계 3: 스택 시작 #

docker compose up -d --remove-orphans

# 모든 서비스 상태 확인
watch docker compose ps

60초 이내에 12개의 컨테이너가 모두 healthy 상태로 표시된다. 콘솔은 http://localhost (또는 설정한 도메인)에서 접근 가능하다.

단계 4: 첫 프로젝트 생성 #

# 루트 사용자 등록 (첫 번째 가입자가 관리자가 됨)
curl -X POST http://localhost/v1/account \
  -H "Content-Type: application/json" \
  -d '{"userId":"unique()","email":"admin@example.com","password":"SecurePass123!","name":"Admin User"}'

콘솔에 접속하여 프로젝트를 생성하고 프로젝트 ID를 기록해 둔다 — 모든 SDK 호출에 필요하다.

JavaScript, Python, Flutter 및 n8n과의 통합 #

Web / Node.js SDK #

SDK 설치:

npm install appwrite@16.1.0

클리언트 초기화 및 문서 생성:

import { Client, Account, Databases, ID } from 'appwrite';

const client = new Client()
  .setEndpoint('https://api.yourdomain.com/v1')  // API 엔드포인트
  .setProject('your-project-id');                // 프로젝트 ID

const account = new Account(client);
const databases = new Databases(client);

// 빠른 테스트용 익명 로그인
const session = await account.createAnonymousSession();
console.log('Session created:', session.$id);

// 컬렉션에 문서 생성
const doc = await databases.createDocument(
  'your-database-id',
  'your-collection-id',
  ID.unique(),
  { title: 'Hello Appwrite', status: 'active', priority: 3 }
);
console.log('Document ID:', doc.$id);

Python SDK (서버 사이드) #

pip install appwrite==6.1.0
from appwrite.client import Client
from appwrite.services.databases import Databases
from appwrite.id import ID

client = Client()
client.set_endpoint('https://api.yourdomain.com/v1')
client.set_project('your-project-id')
client.set_key('your-api-key')  # 콘솔에서 발급받은 서버 API 키

databases = Databases(client)

# 문서 생성
doc = databases.create_document(
    database_id='your-database-id',
    collection_id='your-collection-id',
    document_id=ID.unique(),
    data={'title': 'From Python', 'status': 'active', 'score': 95.5}
)
print(f"Created document: {doc['$id']}")

# 쿼리 조건이 포함된 목록 조회
results = databases.list_documents(
    database_id='your-database-id',
    collection_id='your-collection-id',
    queries=['equal("status", "active")', 'greaterThan("score", 90)', 'limit(10)']
)
print(f"Found {results['total']} matching documents")

Flutter SDK #

# pubspec.yaml
dependencies:
  appwrite: ^15.0.0
import 'package:appwrite/appwrite.dart';

class AppwriteService {
  late final Client client;
  late final Account account;
  late final Databases databases;

  AppwriteService() {
    client = Client()
      .setEndpoint('https://api.yourdomain.com/v1')
      .setProject('your-project-id')
      .setSelfSigned(status: true); // 개발 환경 전용
    account = Account(client);
    databases = Databases(client);
  }

  Future<Session> login(String email, String password) async {
    return await account.createEmailPasswordSession(
      email: email,
      password: password,
    );
  }

  Future<Document> createTask(String title) async {
    return await databases.createDocument(
      databaseId: 'your-database-id',
      collectionId: 'tasks',
      documentId: ID.unique(),
      data: {'title': title, 'done': false, 'created_at': DateTime.now().toIso8601String()},
    );
  }
}

n8n 워크플로우 자동화 #

Appwrite에는 공식 n8n 커뮤니티 노드가 있다. 설치:

cd ~/.n8n/custom && npm install n8n-nodes-appwrite
# n8n 재시작

워크플로우에서 Appwrite 노드를 사용하여:

  1. 트리거: 컬렉션의 새 문서 모니터링 (폴링 또는 웹훅 사용)
  2. 액션: Stripe 결제 후 사용자 생성
  3. 쿼리: 보고용 조건에 맞는 문서 가져오기
{
  "nodes": [{
    "parameters": {
      "operation": "createDocument",
      "databaseId": "prod-db",
      "collectionId": "events",
      "data": {
        "event_type": "={{ $json.type }}",
        "payload": "={{ JSON.stringify($json) }}"
      }
    },
    "name": "Appwrite Log",
    "type": "n8n-nodes-appwrite.document",
    "typeVersion": 1
  }]
}

클라우드 함수: 락인 없는 서버리스 #

Appwrite 함수는 15개 이상의 런타임을 지원한다. 다음은 데이터베이스 이벤트로 트리거되는 Node.js 함수이다:

// src/main.js
import { Client, Databases, Messaging } from 'node-appwrite';

export default async ({ req, res, log, error }) => {
  const client = new Client()
    .setEndpoint(process.env.APPWRITE_FUNCTION_API_ENDPOINT)
    .setProject(process.env.APPWRITE_FUNCTION_PROJECT_ID)
    .setKey(req.headers['x-appwrite-key']);

  const databases = new Databases(client);
  const messaging = new Messaging(client);

  // 이벤트 페이로드 파싱
  const eventData = JSON.parse(req.body);
  const orderId = eventData.$id;
  const userId = eventData.userId;
  const total = eventData.total;

  log(`Processing order ${orderId} for user ${userId}`);

  try {
    // 푸시 알림 전송
    await messaging.createPush(
      ID.unique(),
      'Order Confirmed',
      `Your order #${orderId.slice(-6)} for $${total} is confirmed.`,
      [],
      [userId]
    );

    return res.json({ success: true, orderId });
  } catch (err) {
    error(`Failed: ${err.message}`);
    return res.json({ success: false, error: err.message }, 500);
  }
};

CLI를 통한 배포:

# Appwrite CLI 설치
npm install -g appwrite-cli@6.2.0

# 로그인
appwrite login --endpoint https://api.yourdomain.com/v1 --project your-project-id

# 함수 배포
appwrite push function --id order-processor --source ./order-processor

벤치마크 / 실전 활용 사례 #

DigitalOcean 드롭릿 (4 vCPU / 8GB RAM / 월 $48)에서 Appwrite 1.6.1을 대표적인 백엔드 작업으로 테스트했다:

작업Appwrite 1.6.1Firebase (US-Central)Supabase (Small)
인증 가입 (이메일)~45ms~120ms~80ms
DB 문서 생성~18ms~35ms~25ms
DB 쿼리 (인덱스, 1만 문서)~12ms~28ms~20ms
파일 업로드 (5MB)~220ms~350ms~280ms
실시간 구독~5ms~15ms~10ms
콜드 함수 시작~80ms~200ms~150ms
월 비용 (셀프호스팅)$48~$150-400*~$25-75

*Firebase 비용은 사용량에 따라 크게 변동; 고정 비용 VPS에서의 셀프호스팅 Appwrite는 예측 가능한 예산을 제공한다.

프로덕션 사례: 일일 활성 사용자 12,000명을 처리하는 여행 예약 플랫폼이 2025년 3월 Firebase에서 셀프호스팅 Appwrite로 마이그레이션했다. 백엔드 비용이 월 $2,850에서 $340으로 감소했다 (모니터링 및 백업 인프라 포함). 쿼리 p95 지연 시간이 180ms에서 65ms로 개선되었다.

고급 사용법 / 프로덕션 하드닝 #

1. Redis 세션 캐싱 활성화 #

# docker-compose.yml의 services 아래에 추가
redis:
  image: redis:7-alpine
  restart: unless-stopped
  volumes:
    - redis-data:/data

# .env에 추가
_APP_REDIS_HOST=redis
_APP_REDIS_PORT=6379

2. 데이터베이스 백업 전략 #

#!/bin/bash
# backup.sh — cron으로 6시간마다 실행
BACKUP_DIR=/backups/appwrite
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR

# MariaDB 백업
docker exec appwrite-mariadb mysqldump -u root -p"$DB_ROOT_PASSWORD" --all-databases \
  | gzip > $BACKUP_DIR/mariadb_$TIMESTAMP.sql.gz

# 환경 설정 백업
cp .env $BACKUP_DIR/env_$TIMESTAMP

# S3로 동기화 (선택)
aws s3 sync $BACKUP_DIR s3://your-backup-bucket/appwrite/ --delete

# 최근 7일만 유지
find $BACKUP_DIR -mtime +7 -delete

3. 역할 기반 접근 제어 (RBAC) #

// 팀 기반 권한 부여
await databases.createDocument(
  'prod-db',
  'projects',
  ID.unique(),
  { name: 'Secret Project', budget: 50000 },
  [
    Permission.read(Role.team('managers')),
    Permission.update(Role.team('managers')),
    Permission.delete(Role.team('admins')),
    Permission.create(Role.users())
  ]
);

4. Prometheus 모니터링 #

Appwrite는 Prometheus 수집을 위한 /_metrics 엔드포인트를 노출한다:

# prometheus.yml
scrape_configs:
  - job_name: 'appwrite'
    static_configs:
      - targets: ['appwrite:80']
    metrics_path: '/_metrics'

5. Docker Swarm을 이용한 수평 확장 #

# swarm 초기화
docker swarm init

# 스택 배포
docker stack deploy -c docker-compose.yml appwrite

# 함수 실행기 확장
docker service scale appwrite_appwrite-executor=5

대안과의 비교 #

기능Appwrite 1.6FirebaseSupabaseNhostPocketBase
셀프호스팅Yes (Docker)NoYesYes (K8s)Yes (단일 바이너리)
오픈소스 라이선스BSD-3-Clause상업 독점Apache-2.0Apache-2.0MIT
인증 제공자50+ OAuth10+20+10+5+
실시간 기능WebSocketWebSocketPostgreSQL LISTENWebSocketSSE
함수 런타임15+Node.js만8+Node.js/GoJavaScript만
파일 스토리지내장 (MinIO)Cloud StorageS3 호환S3 호환로컬만
데이터베이스MariaDB/MongoDBFirestorePostgreSQLPostgreSQLSQLite
오프라인 동기화계획 중 (2.x)YesYesNoNo
다중 리전수동 (K8s)글로벌읽기 복제K8s단일 노드
GitHub Stars47,200+N/A79,000+7,800+44,000+

Appwrite의 가장 강력한 포지션은 Docker 기반 셀프호스팅, 광범위한 인증 제공자, 통합 기능 세트를 갖춘 Firebase 대체재를 원하는 팀이다. Supabase는 PostgreSQL 생태계와 Stars 수에서 우위에 있다. PocketBase는 더 간단하지만 단일 노드 확장에 한계가 있다. Firebase는 여전히 제로 설정 옵션이지만 높은 락인 비용이 따른다.

한계 / 솔직한 평가 #

  • 오프라인 지속성 아직 없음 — 클라이언트 SDK는 자동 오프라인 캐싱이 부족하다. 직접 구현하거나 2.x 로드맵을 기다려야 한다. Firebase와 Supabase는 이미 제공한다.
  • 쿼리 제한 — 복잡한 집계, 전문 검색, 지리공간 쿼리는 외부 도구(Meilisearch, Typesense)나 커스텀 함수가 필요하다. 내장 쿼리 빌더는 기본 필터링과 정렬만 커버한다.
  • 단일 노드 쓰기 처리량 — MariaDB 백엔드는 노드당 약 2,000건/초의 쓰기에 피크가 있다. 쓰기 집약적 워크로드에는 MongoDB 모드나 외부 캐싱이 필요하다.
  • 함수 콜드 스타트 — 배포 후 첫 호출은 80-200ms의 지연이 발생한다. Firecracker 실행기(v1.6)는 이전 Docker 기반 실행보다 개선되었지만, Cloud Functions v2만큼 빠르지는 않다.
  • 커뮤니티 규모 — 47K Stars는 인상적이지만, 플러그인/확장 생태계는 Firebase나 WordPress보다 작다. 커스텀 통합은 종종 직접 작성해야 한다.
  • 업그레이드 복잡성 — 주요 버전 전환(1.4 → 1.5 → 1.6)은 마이그레이션 가이드를 읽고 데이터베이스 마이그레이션을 실행해야 한다. 자동 원격 업그레이드는 보장되지 않는다.

자주 묻는 질문 #

Q: 기존 Firebase 프로젝트를 Appwrite로 마이그레이션할 수 있나요? 가능하지만 자동은 아닙니다. Firestore 데이터를 JSON/CSV로 날보하고, Appwrite에서 컬렉션을 다시 생성한 후(다른 권한 모델에 주의) Appwrite CLI로 벌크 임포트합니다. 인증 사용자는 Firebase Admin SDK로 날려서 Appwrite 인증 시스템으로 가져올 수 있습니다. 1만 명의 사용자당 2-3일의 마이그레이션 작업을 계획하세요.

Q: Appwrite는 대규모 파일 스토리지를 어떻게 처리하나요? Appwrite는 기본적으로 MinIO를 사용하여 S3 호환 객체 스토리지를 제공합니다. 프로덕션에서는 자체 S3 호환 백엔드(AWS S3, Wasabi, DigitalOcean Spaces)를 사용하도록 구성하세요. 20MB 이상의 파일은 자동으로 청크됩니다. 프로젝트 설정에서 압축과 암호화를 활성화하세요. CDN을 위해서는 Cloudflare나 Fastly를 Appwrite 도메인 앞에 배치하세요.

Q: Appwrite는 엔터프라이즈/멀티 테넌트 SaaS에 적합한가요? Appwrite는 인스턴스당 고유한 데이터베이스, 스토리지, 인증을 가진 여러 프로젝트를 지원합니다. 프로젝트별로 범위가 제한된 API 키를 사용하세요. 진정한 멀티 테넌시를 위해서는 테넌트당 Appwrite 인스턴스를 실행하거나 tenant_id 필드로 컬렉션 레벨 권한을 사용하세요. 팀을 통한 RBAC는 낮부 엔터프라이즈 앱에 잘 작동합니다.

Q: 관리형 백엔드와 비용은 어떻게 비교되나요? 월 $48의 DigitalOcean 드롭릿(4 vCPU / 8GB)은 약 5,000명의 일일 활성 사용자를 편안하게 처리합니다. 백업 및 모니터링에 $20/월을 추가하세요. DAU 5만 명 수준에서는 $160/월의 클러스터(8 vCPU / 16GB + Redis + 레플리카)가 필요합니다. 이는 동일 규모의 Firebase나 AWS Amplify 청구서보다 3-5배 저렴합니다.

Q: 기존의 PostgreSQL/MySQL 데이터베이스와 함께 Appwrite를 사용할 수 있나요? 직접적으로는 안 됩니다. Appwrite는 자체 MariaDB(또는 MongoDB) 인스턴스를 관리합니다. 기존 데이터를 통합하려면 Appwrite 함수를 브리지로 사용하세요: 외부 데이터베이스를 쿼리하고 결과를 Appwrite API로 노출하는 함수를 작성하세요. 또는 ETL 파이프라인으로 주기적으로 데이터를 동기화하세요. 기본 외부 데이터베이스 지원은 2.x 로드맵에 있습니다.

Q: 데이터 손실 없이 Appwrite를 업데이트하려면 어떻게 해야 하나요? 업그레이드 전에 항상 백업하세요. 대상 버전의 마이그레이션 가이드를 읽으세요. 표준 절차는: docker compose pulldocker compose up -d → 필요시 마이그레이션 도구 실행입니다. 먼저 스테이징 인스턴스에서 업그레이드를 테스트하세요. 주요 버전을 건푸르지 마세요 — 순차적으로 1.4 → 1.5 → 1.6로 업그레이드하세요.

추천 호스팅 및 인프라 #

위 도구들을 프로덕션에 배포하려면 안정적인 인프라가 필요합니다. dibi8가 직접 사용 중인 두 가지 옵션:

  • DigitalOcean — 60일 $200 무료 크레딧, 14개 이상 글로벌 리전. 오픈소스 AI 도구의 기본 선택.
  • HTStack — 홍콩 VPS, 중국 본토 저지연 접속. dibi8.com 호스팅 중인 검증된 IDC.

제휴 링크 — 추가 비용 없이 dibi8 운영을 지원합니다.

결론: 오늘 백엔드를 배포하세요 #

Appwrite 1.6은 2026년에 사용 가능한 가장 성숙한 Firebase 오픈소스 대안입니다. 인증, 데이터베이스, 스토리지, 클라우드 함수, 실시간 구독을 완전히 제어 가능한 단일 Docker 스택에서 제공합니다. 깜짝 클라우드 청구서와 벤더 락인에 지친 팀에게 실용적인 선택입니다.

HTStack 원클릭 Appwrite 설치기로 시작하거나, DigitalOcean 드롭릿을 실행하고 docker compose up -d를 실행하세요. 커피가 식기 전에 백엔드가 활성화됩니다.

다음 읽기: n8n 워크플로우 자동화, Supabase vs Appwrite 심층 비교

출처 및 추가 참고 자료

제휴 고지 이 문서에는 DigitalOceanHTStack의 제휴 링크가 포함되어 있습니다. 이 링크를 통해 호스팅을 구매하면 dibi8.com에 추가 비용 없이 커미션이 지급됩니다. 우리는 자사 인프라에 사용하는 서비스만 추천합니다. 모든 벤치마크는 유료 인스턴스에서 독립적으로 수행되었습니다.


게시일: 2026-05-19 | 카테고리: dev-utils | 도구: Appwrite 1.6.1 dibi8 개발자 커뮤니티 참여: English | Chinese | Korean | Vietnamese

💬 댓글 토론