3.9 KiB
3.9 KiB
ConfigVault — Kurulum Rehberi
1. PostgreSQL — Database kurulumu
Herhangi bir Postgres çalışır: kendi sunucun, Railway, Render, Neon, Fly.io...
# Lokal kurulum için (macOS):
brew install postgresql && brew services start postgresql
createdb configvault
# Veya Docker ile:
docker run -d --name configvault-db \
-e POSTGRES_DB=configvault \
-e POSTGRES_PASSWORD=password \
-p 5432:5432 postgres:16
Schema'yı yükle:
psql postgresql://postgres:password@localhost:5432/configvault < schema.sql
Veya psql'e bağlanıp schema.sql içeriğini yapıştır.
2. Proje kurulumu
npm install
cp .env.example .env.local
.env.local doldur:
DATABASE_URL=postgresql://postgres:password@localhost:5432/configvault
DATABASE_SSL=false
NEXTAUTH_SECRET=$(openssl rand -base64 32)
NEXTAUTH_URL=http://localhost:3000
ADMIN_USERNAME=admin
# Şifre hash'i oluştur:
node -e "const b=require('bcryptjs'); console.log(b.hashSync('şifren', 12))"
ADMIN_PASSWORD_HASH=$2a$12$...
NEXT_PUBLIC_APP_URL=http://localhost:3000
3. Çalıştır
npm run dev
# → http://localhost:3000
Deploy seçenekleri
Vercel + Railway (kolay)
- Railway'de PostgreSQL aç → connection string'i al
- Vercel'e deploy et, env variable'ları ekle
DATABASE_SSL=trueyap (Railway SSL ister)
Kendi sunucun (VPS)
# Sunucuda:
npm run build
npm start
# Veya PM2 ile:
pm2 start npm --name configvault -- start
Docker Compose (her şey bir arada)
version: '3.8'
services:
app:
build: .
ports: ["3000:3000"]
environment:
DATABASE_URL: postgresql://postgres:password@db:5432/configvault
DATABASE_SSL: "false"
NEXTAUTH_SECRET: your-secret
NEXTAUTH_URL: https://configvault.yourdomain.com
ADMIN_USERNAME: admin
ADMIN_PASSWORD_HASH: $2a$12$...
NEXT_PUBLIC_APP_URL: https://configvault.yourdomain.com
depends_on: [db]
db:
image: postgres:16
environment:
POSTGRES_DB: configvault
POSTGRES_PASSWORD: password
volumes:
- pgdata:/var/lib/postgresql/data
- ./schema.sql:/docker-entrypoint-initdb.d/schema.sql
volumes:
pgdata:
React Native — Kullanım
Uygulamanın içinde lib/config.ts oluştur:
import AsyncStorage from '@react-native-async-storage/async-storage'
const CONFIG_URL = 'https://configvault.yourdomain.com/api/v1/config'
const APP_API_KEY = 'buraya_dashboard_api_key' // Dashboard > App > API Key tab
export async function initConfig(env = 'production') {
try {
const res = await fetch(`${CONFIG_URL}?env=${env}`, {
headers: { 'X-Api-Key': APP_API_KEY },
})
if (!res.ok) throw new Error('Config fetch failed')
const config = await res.json()
// Offline fallback için cache
await AsyncStorage.setItem('app_config', JSON.stringify(config))
return config
} catch {
const cached = await AsyncStorage.getItem('app_config')
if (cached) return JSON.parse(cached)
throw new Error('No config available')
}
}
App.tsx:
import { initConfig } from './lib/config'
import { createClient } from '@supabase/supabase-js'
let supabase: any
export default function App() {
useEffect(() => {
initConfig('production').then(config => {
supabase = createClient(config.SUPABASE_URL, config.SUPABASE_ANON_KEY)
// artık config.ICON_URL, config.API_ENDPOINT vs. kullanabilirsin
})
}, [])
}
Config değişince: Dashboard'a gir → ilgili key'i güncelle → kaydet. Tüm kullanıcılar bir sonraki açılışta yeni değeri alır. Rebuild yok. 🎉
Yeni özellik ekleme
Yeni config tipi: schema.sql → type CHECK + types/index.ts + AppDetailClient.tsx select
Yeni tablo/özellik:
schema.sql'e ekle,psqlile migrate etapp/api/apps/[id]/altına route ekle- Dashboard'a tab/section ekle