Runam
Runam 배달원이 게임스 빌리지 안에서 식료품·주유·소포 등을 직접 전달
레스토랑·결혼식·행사에 맞는 기타리스트부터 타악기 연주자까지 찾고, 악기를 일일 대여하며, 녹음 스튜디오를 선택하세요
Restoran, toy və tədbirlər üçün gitaristdən tar ifaçısına qədər musiqiçiləri tapın, musiqi alətlərini günlük kirayələyin, səs studiyası seçin.
커머스TypeScript · PythonGitHub @ayyub1nnat온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Küçə, həvəskar və professional musiqiçilərin elan yerləşdirdiyi, canlı musiqi axtaran restoranların onları tapıb birbaşa əlaqə saxladığı platforma.
Stack: Next.js 15 (App Router) · MongoDB (Mongoose) · Tailwind · JWT sessiya (httpOnly cookie)
1. MongoDB Atlas (pulsuz baza) — cloud.mongodb.com
musiqichi bazasına (Atlas admin deyil); şifrə — Autogenerate Secure Password (uzun, təsadüfi)151.243.169.44/32). 0.0.0.0/0 qoymayın — bazaya bütün internetdən qoşulma cəhdi açıq qalır. Vercel-də IP sabit deyil: orada məcburən 0.0.0.0/0 lazımdırsa, güclü şifrə və məhdud istifadəçi şərtdir<password> yerinə şifrəni yazın, .net/-dən sonra musiqichi əlavə edin:
mongodb+srv://ad:[email protected]/musiqichi?retryWrites=true&w=majority2. GitHub — github.com → New repository → ad: musiqichi-az, Private → uploading an existing file linkinə basın → açılmış qovluğun içindəki bütün fayl və qovluqları sürüşdürüb atın → Commit changes
3. Vercel — vercel.com → Add New → Project → musiqichi-az reposunu Import edin → Environment Variables bölməsinə bunları yazın:
| Ad | Dəyər |
|---|---|
MONGODB_URI | 1-ci addımdakı link |
JWT_SECRET | istənilən uzun mətn (ən azı 32 simvol) |
OTP_SECRET | başqa uzun mətn |
TEST_MODE | yalnız test üçün true (production-da ayrıca ALLOW_TEST_MODE_IN_PRODUCTION=yes olmadan işləmir) |
ADMIN_PHONES | öz nömrəniz, məs. +994501234567 |
→ Deploy
4. Fayllar üçün Blob — Vercel-də layihə → Storage → Create → Blob → layihəyə qoşun (Connect). Sonra Deployments → sonuncu deploy → ⋯ → Redeploy.
5. Yoxlama — musiqichi-az-xxxx.vercel.app linkini açın. Test rejimində OTP kodu SMS əvəzinə ekranda sarı qutuda görünür, boost ödənişi test səhifəsi ilə təsdiqlənir.
Domen: Vercel → layihə → Settings → Domains → musiqichi.az əlavə edin və göstərilən DNS qeydlərini domen panelinizə yazın.
Real istifadəyə açmazdan əvvəl: SMS provayderini qoşun (SMS_PROVIDER=http, SMS_HTTP_URL, SMS_HTTP_TOKEN), bank ödənişini qoşun, sonra TEST_MODE dəyişənini silib Redeploy edin. Təhlükəsizlik üçün production-da test rejimi TEST_MODE=true olsa belə avtomatik sönülüdür; sayt başlayanda loqda xəbərdarlıq yazılır.
cp .env.example .env # JWT_SECRET, OTP_SECRET dəyişin
npm install
npm run dev # http://localhost:3000 (MongoDB lazımdır)
npm test # rotasiya, OTP, nömrə və reytinq testləri
Öz VPS-də Docker ilə: docker compose up -d --build (fayllar UPLOAD_DIR volume-da saxlanılır).
| Funksiya | Harada |
|---|---|
| Qeydiyyat: ad, soyad, nömrə + SMS OTP | app/qeydiyyat, app/api/auth/*, lib/otp.ts |
| Bioqrafiya: şəkil, doğum tarixi (yaş), şəhər, sənət (kateqoriya + “Digər”), əlavə alətlər, janr, səviyyə, təcrübə, qiymət, tədbir növləri, avadanlıq, uyğun günlər, sosial şəbəkələr | app/panel/ProfileEditor.tsx, lib/profile.ts, lib/catalog.ts |
| Ən yaxşı 1 mahnı + 1 video (fayl və ya YouTube linki) | app/panel/MediaUploader.tsx, app/api/upload, lib/storage.ts |
| Elanın dərci (natamam profil dərc olunmur) | app/api/profile/publish |
| Restoran rəyləri (hesabsız, nömrə OTP ilə təsdiqlənir; 1 nömrə = 1 rəy) | components/ReviewForm.tsx, app/api/reviews/* |
| Reytinq cədvəli + profildə yer (#N) | app/reytinq, lib/rating.ts, lib/queries.ts |
| Boost: 1 gün 2.99 · 7 gün 5.99 · 30 gün 19.99 AZN | app/panel/boost, app/api/boost/checkout, lib/boost.ts |
| Ana səhifədə boost rotasiyası | lib/rotation.ts, lib/boost.ts → getFeaturedIds |
| Nömrəni göstər / WhatsApp (botlardan qorunur, kliklər sayılır) | components/ContactButton.tsx |
SMS əvəzinə istifadəçi saytda göstərilən 6 rəqəmli kodu öz WhatsApp-ından biznes nömrəsinə göndərir. WhatsApp göndərənin nömrəsini özü təsdiqlədiyi üçün SMS lazım olmur.
Axın: nömrə yazılır → /api/auth/wa/start kod və wa.me linki qaytarır → istifadəçi "WhatsApp-da göndər" basır → Meta mesajı /api/whatsapp/webhook-a göndərir → göndərən nömrə + kod uyğun gəlirsə təsdiq olunur → brauzer /api/auth/wa/status-u 2 saniyədən bir yoxlayır və avtomatik davam edir.
Təhlükəsizlik: webhook-un hər sorğusu WHATSAPP_APP_SECRET ilə imza yoxlamasından keçir; WHATSAPP_APP_SECRET yoxdursa webhook heç nə qəbul etmir.
Qurulma (Meta tərəfi):
https://<domen>/api/whatsapp/webhook, Verify token — WHATSAPP_VERIFY_TOKEN-ə yazdığınız söz → Verify and save → messages sahəsinə abunə olun.WHATSAPP_APP_SECRET-ə yazın.WHATSAPP_NUMBER, WHATSAPP_VERIFY_TOKEN, WHATSAPP_APP_SECRET dəyişənlərini əlavə edib Redeploy edin./admin)İlk admin: saytda adi qeydiyyatdan keçin, sonra nömrənizi .env → ADMIN_PHONES siyahısına yazın və serveri yenidən başladın. Digər adminləri paneldən “Admin et” düyməsi ilə təyin etmək olar. Admin olmayanlar üçün /admin 404 qaytarır.
| Bölmə | Nə edir |
|---|---|
| İcmal | Qeydiyyat, aktiv elan, aktiv boost, bloklanmış sayı; bu gün / 7 gün / 30 gün gəlir; 15 dəq-dən çox “gözləyir” qalan ödənişlər üçün xəbərdarlıq; son 7 günün ≤2 ulduzlu rəyləri |
| Musiqiçilər | Ad/nömrə ilə axtarış, statusa görə filtr; elanı gizlət, blokla/blokdan çıxar, pulsuz boost ver, boostu ləğv et, admin et, hesabı sil (fayllar və rəylər də silinir, ödənişlər qalır) |
| Rəylər | Hamısı / ≤2 ulduz / gizlədilmiş; gizlət və bərpa et (reytinq dərhal yenidən hesablanır); bir nömrədən 3-dən çox rəy yazılıbsa qırmızı işarə |
| Ödənişlər | Statusa görə filtr; bankda pul çıxıb, amma callback çatmayıbsa — bankın əməliyyat nömrəsi ilə “Əl ilə təsdiqlə” |
| Jurnal | Hər admin əməliyyatı: kim, nə vaxt, kimə, hansı səbəblə |
Bloklama, gizlətmə və silmə səbəbsiz edilmir — səbəb jurnala yazılır. Bloklanmış istifadəçi daxil ola bilmir, açıq sessiyası varsa da heç nəyi dəyişə bilmir.
FEATURED_SLOTS).Parametrlər: lib/rotation.ts → WINDOW_MINUTES, FEATURED_SLOTS.
Restoranlar 1–5 ulduz verir. Sıralama Bayes ortalaması ilə aparılır (lib/rating.ts): 1 rəyi 5.0 olan musiqiçi 40 rəyi 4.8 olanı keçmir. Cədvələ ən azı 3 rəyi olanlar düşür. Restoranın nömrəsi heç yerdə göstərilmir.
Admin panelin (/admin) yuxarısındakı “Sayt hazırlığı” bloku nəyin qalmadığını göstərir.
WHATSAPP_NUMBER, WHATSAPP_VERIFY_TOKEN, WHATSAPP_APP_SECRET. Və ya SMS: SMS_PROVIDER=http + lib/sms.ts.TEST_MODE dəyişənini silin. Real rejimdə təsdiq qurulmayıbsa sayt kodu ekranda göstərmir, aydın xəta verir.PAYMENT_PROVIDER:
manual (real rejimdə defolt): /odenis/gozle səhifəsi sifariş kodu (MQ-XXXXXX) və WhatsApp düyməsi göstərir; pul gələndə /admin/odenisler → “Əl ilə təsdiqlə”. PAYMENT_WHATSAPP, PAYMENT_INSTRUCTIONS.free: açılış dövrü üçün pulsuz boost (eyni anda 1 aktiv).gateway: bank müqaviləsi olanda lib/payments.ts adapterini tamamlayın. Callback: /api/payments/callback.VIDEO_UPLOADS=true./qaydalar, /mexfilik hazırdır; CONTACT_EMAIL istəyə bağlı.APP_URL=https://musiqichi.az; /sitemap.xml avtomatikdir; domen dəyişəndə public/robots.txt-dəki Sitemap linkini yeniləyin.app/
page.tsx ana səhifə (önə çıxanlar, son elanlar, top 5)
musiqiciler/ axtarış + filtrlər
musiqici/[id]/ profil: mahnı, video, bio, rəylər, əlaqə
reytinq/ reytinq cədvəli
qeydiyyat/ giris/ OTP ilə qeydiyyat və giriş
panel/ profil redaktəsi, media, dərc, boost
odenis/test/ test ödəniş səhifəsi (yalnız dev)
api/ auth, profile, upload, media, reviews, boost, payments, featured
lib/ modellər, OTP, sessiya, rotasiya, ödəniş, reytinq, kataloq
tests/core.test.ts saf məntiq testləri
Server hər 5 dəqiqədən bir GitHub-u yoxlayır; main-də yeni commit varsa, özü çəkib saytı yenidən qurur (scripts/auto-deploy.sh).
cd /opt/musiqichi && git pull -q && chmod +x scripts/auto-deploy.sh && (crontab -l 2>/dev/null | grep -v auto-deploy; echo "*/5 * * * * /opt/musiqichi/scripts/auto-deploy.sh >> /var/log/musiqichi-deploy.log 2>&1") | crontab -
Jurnal: tail -20 /var/log/musiqichi-deploy.log. Söndürmək: crontab -l | grep -v auto-deploy | crontab -.
/aletler). İngiliscə /en/..., rusca /ru/... — eyni səhifələr, middleware.ts rewrite edir.mq_lang cookie-sində yadda qalır; /az/... Azərbaycancaya qaytarır. Admin panel yalnız Azərbaycancadır.const t = await getT() (lib/i18n-server.ts), client komponentlərdə const t = useT() (components/I18n.tsx). Açar — Azərbaycanca mətnin özüdür: t("Daxil ol").lib/i18n/en.json və lib/i18n/ru.json. Yeni mətn əlavə edəndə hər iki fayla da yazın; tərcümə yoxdursa, Azərbaycanca göstərilir.import Link from "@/components/I18n" — dil prefiksini özü əlavə edir.SMTP qurulanda qeydiyyat, şifrə bərpası və restoran rəyləri WhatsApp əvəzinə e-poçt kodu ilə təsdiqlənir (lib/otp-channel.ts). Pulsuz variant — Brevo (gündə 300 məktub):
SMTP_HOST=smtp-relay.brevo.com
SMTP_PORT=587
SMTP_USER=<Brevo SMTP login>
SMTP_PASS=<Brevo SMTP key>
MAIL_FROM=musiqichi.az <[email protected]>
BREVO_API_KEY=<Brevo API key> yazın — məktub HTTPS (443) ilə Brevo API-dən gedir; SMTP_* lazım deyil.OTP_CHANNEL=email | whatsapp | sms.