refactor: rename project from dgray.io to kashilo.com
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
**Directus Version:** 11.14.1
|
||||
**Database:** PostgreSQL
|
||||
**API Endpoint:** https://api.dgray.io
|
||||
**API Endpoint:** https://api.kashilo.com
|
||||
|
||||
## Collections Overview
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# Directus Setup für dgray.io
|
||||
# Directus Setup für kashilo.com
|
||||
|
||||
Komplette Anleitung zur Einrichtung von Directus als Backend für die dgray Kleinanzeigen-PWA.
|
||||
Komplette Anleitung zur Einrichtung von Directus als Backend für die kashilo Kleinanzeigen-PWA.
|
||||
|
||||
**API URL**: https://api.dgray.io/
|
||||
**API URL**: https://api.kashilo.com/
|
||||
|
||||
---
|
||||
|
||||
@@ -622,8 +622,8 @@ module.exports = async function(data, { database }) {
|
||||
**Settings > Project Settings**
|
||||
|
||||
```
|
||||
Project Name: dgray.io
|
||||
Project URL: https://dgray.io
|
||||
Project Name: kashilo.com
|
||||
Project URL: https://kashilo.com
|
||||
Project Color: #555555
|
||||
```
|
||||
|
||||
@@ -637,7 +637,7 @@ services:
|
||||
image: directus/directus:latest
|
||||
environment:
|
||||
CORS_ENABLED: "true"
|
||||
CORS_ORIGIN: "https://dgray.io,https://www.dgray.io,http://localhost:8080"
|
||||
CORS_ORIGIN: "https://kashilo.com,https://www.kashilo.com,http://localhost:8080"
|
||||
CORS_METHODS: "GET,POST,PATCH,DELETE"
|
||||
CORS_ALLOWED_HEADERS: "Content-Type,Authorization"
|
||||
CORS_CREDENTIALS: "true"
|
||||
@@ -655,7 +655,7 @@ services:
|
||||
```env
|
||||
# .env
|
||||
CORS_ENABLED=true
|
||||
CORS_ORIGIN=https://dgray.io,https://www.dgray.io,http://localhost:8080
|
||||
CORS_ORIGIN=https://kashilo.com,https://www.kashilo.com,http://localhost:8080
|
||||
CORS_METHODS=GET,POST,PATCH,DELETE
|
||||
CORS_ALLOWED_HEADERS=Content-Type,Authorization
|
||||
CORS_CREDENTIALS=true
|
||||
@@ -706,7 +706,7 @@ environment:
|
||||
STORAGE_S3_DRIVER: "s3"
|
||||
STORAGE_S3_KEY: "your-access-key"
|
||||
STORAGE_S3_SECRET: "your-secret-key"
|
||||
STORAGE_S3_BUCKET: "dgray-files"
|
||||
STORAGE_S3_BUCKET: "kashilo-files"
|
||||
STORAGE_S3_REGION: "fsn1" # oder nbg1
|
||||
STORAGE_S3_ENDPOINT: "https://fsn1.your-objectstorage.com" # oder nbg1
|
||||
```
|
||||
@@ -720,7 +720,7 @@ environment:
|
||||
STORAGE_S3_DRIVER: "s3"
|
||||
STORAGE_S3_KEY: "your-access-key"
|
||||
STORAGE_S3_SECRET: "your-secret-key"
|
||||
STORAGE_S3_BUCKET: "dgray-files"
|
||||
STORAGE_S3_BUCKET: "kashilo-files"
|
||||
STORAGE_S3_REGION: "auto"
|
||||
STORAGE_S3_ENDPOINT: "https://xxx.r2.cloudflarestorage.com"
|
||||
```
|
||||
@@ -746,7 +746,7 @@ RATE_LIMITER_POINTS=100
|
||||
RATE_LIMITER_DURATION=60
|
||||
```
|
||||
|
||||
**Hinweis:** Keine E-Mail-Konfiguration nötig - dgray.io nutzt keine E-Mails (Privacy by Design).
|
||||
**Hinweis:** Keine E-Mail-Konfiguration nötig - kashilo.com nutzt keine E-Mails (Privacy by Design).
|
||||
|
||||
### 5.6 Währungsumrechnung & Preismodus
|
||||
|
||||
@@ -901,7 +901,7 @@ if (directus.isAuthenticated()) {
|
||||
|
||||
## 9. Anonyme Authentifizierung (UUID-basiert)
|
||||
|
||||
Für maximale Privatsphäre nutzt dgray.io ein UUID-basiertes Login-System ohne echte E-Mail-Adressen.
|
||||
Für maximale Privatsphäre nutzt kashilo.com ein UUID-basiertes Login-System ohne echte E-Mail-Adressen.
|
||||
|
||||
### 9.1 Konzept
|
||||
|
||||
@@ -913,7 +913,7 @@ Für maximale Privatsphäre nutzt dgray.io ein UUID-basiertes Login-System ohne
|
||||
│ f47ac10b-58cc-4372-a567-0e02b2c3d479 │
|
||||
│ ↓ │
|
||||
│ Directus erhält: │
|
||||
│ • E-Mail: f47ac10b-58cc-4372-a567-0e02b2c3d479@dgray.io │
|
||||
│ • E-Mail: f47ac10b-58cc-4372-a567-0e02b2c3d479@kashilo.com │
|
||||
│ • Passwort: f47ac10b-58cc-4372-a567-0e02b2c3d479 │
|
||||
│ ↓ │
|
||||
│ User speichert UUID → fertig │
|
||||
@@ -943,7 +943,7 @@ Für maximale Privatsphäre nutzt dgray.io ein UUID-basiertes Login-System ohne
|
||||
// Account erstellen
|
||||
async function createAnonymousAccount() {
|
||||
const uuid = crypto.randomUUID();
|
||||
const email = `${uuid}@dgray.io`;
|
||||
const email = `${uuid}@kashilo.com`;
|
||||
const password = uuid;
|
||||
|
||||
// Bei Directus registrieren
|
||||
@@ -957,7 +957,7 @@ async function createAnonymousAccount() {
|
||||
|
||||
// Login
|
||||
async function login(uuid) {
|
||||
const email = `${uuid}@dgray.io`;
|
||||
const email = `${uuid}@kashilo.com`;
|
||||
await directus.login(email, uuid);
|
||||
}
|
||||
```
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Killer-Features — dgray.io
|
||||
# Killer-Features — kashilo.com
|
||||
|
||||
Differenzierung gegenüber eBay Kleinanzeigen, Tutti, XMRBazaar.
|
||||
Drei Features, die kein Konkurrent hat.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Launch Plan – dgray.io
|
||||
# Launch Plan – kashilo.com
|
||||
|
||||
## Release-Phasen
|
||||
|
||||
@@ -48,12 +48,12 @@ Die Validierung passiert **serverseitig** im PoW-Server (PHP), nicht im Frontend
|
||||
Neuer Endpoint: `POST /invite/validate`
|
||||
|
||||
```php
|
||||
// pow.dgray.io/invite/validate.php
|
||||
// pow.kashilo.com/invite/validate.php
|
||||
<?php
|
||||
require __DIR__ . '/config.php';
|
||||
|
||||
header('Content-Type: application/json');
|
||||
header('Access-Control-Allow-Origin: https://dgray.io');
|
||||
header('Access-Control-Allow-Origin: https://kashilo.com');
|
||||
header('Access-Control-Allow-Methods: POST, OPTIONS');
|
||||
header('Access-Control-Allow-Headers: Content-Type');
|
||||
|
||||
@@ -132,7 +132,7 @@ In `js/components/auth-modal.js` — im Registrierungs-Flow ein Textfeld hinzuf
|
||||
Vor `createAccount()` den Code serverseitig validieren:
|
||||
|
||||
```js
|
||||
const res = await fetch('https://pow.dgray.io/invite/validate', {
|
||||
const res = await fetch('https://pow.kashilo.com/invite/validate', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ code: inviteCode })
|
||||
@@ -214,21 +214,21 @@ define('LISTING_FEE', ['EUR' => 0.01, 'USD' => 0.01, 'CHF' => 0.01, 'GBP' => 0.0
|
||||
## Meta-Tags (pro Sprache)
|
||||
|
||||
Die statischen Meta-Tags in `index.html` sind deutsch (Fallback).
|
||||
Der OG-Proxy (`pow.dgray.io/og-proxy.php`) liefert Listing-spezifische Tags.
|
||||
Der OG-Proxy (`pow.kashilo.com/og-proxy.php`) liefert Listing-spezifische Tags.
|
||||
|
||||
### Umgesetzte Texte
|
||||
|
||||
**Title:** `dgray.io – [Sprache]`
|
||||
**Title:** `kashilo.com – [Sprache]`
|
||||
|
||||
| Sprache | Title | Description |
|
||||
|---------|-------|-------------|
|
||||
| **de** | dgray.io – Anonyme Kleinanzeigen | Kaufen und verkaufen ohne Konto, ohne E-Mail. Bezahlung mit Monero. Ende-zu-Ende verschlüsselter Chat. |
|
||||
| **en** | dgray.io – Private Classifieds | Buy and sell without an account, without email. Pay with Monero. End-to-end encrypted chat. |
|
||||
| **fr** | dgray.io – Petites annonces anonymes | Achetez et vendez sans compte, sans e-mail. Paiement en Monero. Chat chiffré de bout en bout. |
|
||||
| **it** | dgray.io – Annunci anonimi | Compra e vendi senza account, senza email. Pagamento in Monero. Chat crittografata end-to-end. |
|
||||
| **es** | dgray.io – Clasificados anónimos | Compra y vende sin cuenta, sin email. Pago con Monero. Chat cifrado de extremo a extremo. |
|
||||
| **pt** | dgray.io – Classificados anônimos | Compre e venda sem conta, sem email. Pagamento com Monero. Chat criptografado ponta a ponta. |
|
||||
| **ru** | dgray.io – Анонимные объявления | Покупайте и продавайте без аккаунта, без email. Оплата Monero. Сквозное шифрование чата. |
|
||||
| **de** | kashilo.com – Anonyme Kleinanzeigen | Kaufen und verkaufen ohne Konto, ohne E-Mail. Bezahlung mit Monero. Ende-zu-Ende verschlüsselter Chat. |
|
||||
| **en** | kashilo.com – Private Classifieds | Buy and sell without an account, without email. Pay with Monero. End-to-end encrypted chat. |
|
||||
| **fr** | kashilo.com – Petites annonces anonymes | Achetez et vendez sans compte, sans e-mail. Paiement en Monero. Chat chiffré de bout en bout. |
|
||||
| **it** | kashilo.com – Annunci anonimi | Compra e vendi senza account, senza email. Pagamento in Monero. Chat crittografata end-to-end. |
|
||||
| **es** | kashilo.com – Clasificados anónimos | Compra y vende sin cuenta, sin email. Pago con Monero. Chat cifrado de extremo a extremo. |
|
||||
| **pt** | kashilo.com – Classificados anônimos | Compre e venda sem conta, sem email. Pagamento com Monero. Chat criptografado ponta a ponta. |
|
||||
| **ru** | kashilo.com – Анонимные объявления | Покупайте и продавайте без аккаунта, без email. Оплата Monero. Сквозное шифрование чата. |
|
||||
|
||||
### Umsetzung
|
||||
|
||||
@@ -244,7 +244,7 @@ und `twitter:title/description` dynamisch bei jedem Sprachwechsel (i18n-Keys `me
|
||||
## Checkliste vor Alpha-Start
|
||||
|
||||
- [ ] Directus: Collection `invite_codes` anlegen (Schema siehe oben)
|
||||
- [ ] PHP: `invite/validate.php` deployen auf `pow.dgray.io`
|
||||
- [ ] PHP: `invite/validate.php` deployen auf `pow.kashilo.com`
|
||||
- [ ] PHP: `config.php` → `LISTING_FEE` auf 0.01 setzen
|
||||
- [ ] PHP: `config.php` → `REQUIRE_INVITE_CODE = true`
|
||||
- [ ] Frontend: Invite-Code-Feld in `auth-modal.js` einbauen
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Marketing-Strategie dgray.io
|
||||
# Marketing-Strategie kashilo.com
|
||||
|
||||
## Positionierung
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
|
||||
### Woche 5: Name Reveal
|
||||
|
||||
- **Post 7:** Logo + Name + "dgray.io — Anonymous classifieds. Powered by Monero. Beta coming next week."
|
||||
- **Post 7:** Logo + Name + "kashilo.com — Anonymous classifieds. Powered by Monero. Beta coming next week."
|
||||
- Landing Page live schalten (optional, kann auch direkt die App sein)
|
||||
- Einmalig in relevanten Subreddits posten: r/Monero, r/privacy, r/selfhosted
|
||||
|
||||
@@ -58,10 +58,10 @@
|
||||
- **Ziel:** Echte Listings generieren, Feedback sammeln, Bugs finden
|
||||
|
||||
**Launch-Post auf X:**
|
||||
> "dgray.io is live in beta. 🔒 Anonymous classifieds with Monero.
|
||||
> "kashilo.com is live in beta. 🔒 Anonymous classifieds with Monero.
|
||||
> First 100 listings for just 0.10 EUR.
|
||||
> No KYC. No email. No tracking. E2E encrypted chat.
|
||||
> Try it: https://dgray.io"
|
||||
> Try it: https://kashilo.com"
|
||||
|
||||
### Weitere Launch-Kanäle
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
- **Weekly Update** auf X: Neue Features, Stats (wenn Schwellwert erreicht)
|
||||
- **Build in Public:** Entwicklungsfortschritte teilen
|
||||
- **User Stories:** Erfolgreiche Deals highlighten (anonym natürlich)
|
||||
- **Vergleiche:** "Why we built dgray.io" — Vergleich mit KYC-Plattformen
|
||||
- **Vergleiche:** "Why we built kashilo.com" — Vergleich mit KYC-Plattformen
|
||||
|
||||
### Community
|
||||
|
||||
@@ -123,7 +123,7 @@
|
||||
| XmrBazaar | Etabliert, 7800 User | Spam, altbackenes Design, nur EN |
|
||||
| Bitejo | Dezentral | Wenig Nutzer |
|
||||
| MoneroMarket | Einfach | Kaum Features |
|
||||
| **dgray.io** | Modern, lokal, E2E, PWA | Neu, noch keine User |
|
||||
| **kashilo.com** | Modern, lokal, E2E, PWA | Neu, noch keine User |
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Monetarisierung - dgray.io
|
||||
# Monetarisierung - kashilo.com
|
||||
|
||||
## Preismodell
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
|
||||
- **Provider**: BTCpay Server (self-hosted)
|
||||
- **URL**: https://pay.xmr.rocks/
|
||||
- **Proxy**: `pow.dgray.io` — alle API-Aufrufe laufen über den PHP-Proxy (BTCPay API-Key bleibt serverseitig)
|
||||
- **Proxy**: `pow.kashilo.com` — alle API-Aufrufe laufen über den PHP-Proxy (BTCPay API-Key bleibt serverseitig)
|
||||
- **Primär**: Monero (XMR)
|
||||
- **Alternativ**: Andere Kryptos via Trocador-Plugin (automatischer Swap zu XMR)
|
||||
- **Preisumrechnung**: Live XMR-Kurs via Kraken API
|
||||
@@ -60,14 +60,14 @@
|
||||
### Flow: Draft → Processing → Published
|
||||
|
||||
1. User erstellt Listing → wird als `draft` mit `payment_status: unpaid` gespeichert
|
||||
2. BTCPay Invoice wird über `pow.dgray.io/btcpay/invoice` erstellt
|
||||
2. BTCPay Invoice wird über `pow.kashilo.com/btcpay/invoice` erstellt
|
||||
3. BTCPay Checkout-Modal öffnet sich im Frontend (`js/services/btcpay.js`)
|
||||
4. Nach Zahlung:
|
||||
- **Frontend**: Prüft Status via `pow.dgray.io/btcpay/status` nach Modal-Close
|
||||
- **Webhook**: `pow.dgray.io/btcpay/webhook` empfängt BTCPay Events, setzt `status: published` + `payment_status: paid` nach 1 Confirmation
|
||||
- **Frontend**: Prüft Status via `pow.kashilo.com/btcpay/status` nach Modal-Close
|
||||
- **Webhook**: `pow.kashilo.com/btcpay/webhook` empfängt BTCPay Events, setzt `status: published` + `payment_status: paid` nach 1 Confirmation
|
||||
5. Listing wird veröffentlicht (30 Tage Laufzeit, `expires_at` wird gesetzt)
|
||||
|
||||
### Endpunkte (pow.dgray.io)
|
||||
### Endpunkte (pow.kashilo.com)
|
||||
|
||||
| Endpoint | Methode | Beschreibung |
|
||||
|----------|---------|-------------|
|
||||
@@ -81,5 +81,5 @@
|
||||
- [x] ~~XMR-Kurs API für Umrechnung~~ → Kraken API
|
||||
- [x] ~~Anzahl Deals für Power-User Status~~ → 5/15/50 Stufen
|
||||
- [x] ~~Captcha-Lösung~~ → Eigenes PoW-Captcha (keine Lizenzkosten)
|
||||
- [x] ~~Payment-Proxy~~ → `pow.dgray.io` (PHP, API-Key serverseitig)
|
||||
- [x] ~~Webhook für Auto-Publish~~ → `btcpay-webhook.php` auf `pow.dgray.io`
|
||||
- [x] ~~Payment-Proxy~~ → `pow.kashilo.com` (PHP, API-Key serverseitig)
|
||||
- [x] ~~Webhook für Auto-Publish~~ → `btcpay-webhook.php` auf `pow.kashilo.com`
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
# Datenschutzerklärung
|
||||
|
||||
**dgray.io — Anonymer Marktplatz**
|
||||
**kashilo.com — Anonymer Marktplatz**
|
||||
Stand: Februar 2026
|
||||
|
||||
---
|
||||
|
||||
## 1. Verantwortlicher
|
||||
|
||||
Verantwortlich für die Datenbearbeitung ist der Betreiber der Plattform dgray.io mit Sitz in der Schweiz.
|
||||
Verantwortlich für die Datenbearbeitung ist der Betreiber der Plattform kashilo.com mit Sitz in der Schweiz.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Reputation-System — dgray.io
|
||||
# Reputation-System — kashilo.com
|
||||
|
||||
## Ziel
|
||||
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
# Allgemeine Geschäftsbedingungen (AGB)
|
||||
|
||||
**dgray.io — Anonymer Marktplatz**
|
||||
**kashilo.com — Anonymer Marktplatz**
|
||||
Stand: Februar 2026
|
||||
|
||||
---
|
||||
|
||||
## 1. Geltungsbereich
|
||||
|
||||
1.1 Diese Allgemeinen Geschäftsbedingungen (nachfolgend «AGB») regeln die Nutzung der Plattform dgray.io (nachfolgend «Plattform»).
|
||||
1.1 Diese Allgemeinen Geschäftsbedingungen (nachfolgend «AGB») regeln die Nutzung der Plattform kashilo.com (nachfolgend «Plattform»).
|
||||
|
||||
1.2 Die Plattform wird betrieben von einer natürlichen Person mit Sitz in der Schweiz (nachfolgend «Betreiber»).
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
# This script adds it-IT, es-ES, pt-BR, ru-RU translations to all categories.
|
||||
# It reads existing categories from the API and creates missing translations.
|
||||
|
||||
API="https://api.dgray.io"
|
||||
API="https://api.kashilo.com"
|
||||
TOKEN="${DIRECTUS_TOKEN:?Set DIRECTUS_TOKEN environment variable}"
|
||||
|
||||
add_translation() {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#!/bin/bash
|
||||
# Bulk-Import: All categories for dgray.io
|
||||
# Bulk-Import: All categories for kashilo.com
|
||||
# Usage: DIRECTUS_TOKEN=your_admin_token bash docs/import-categories.sh
|
||||
|
||||
API="https://api.dgray.io"
|
||||
API="https://api.kashilo.com"
|
||||
TOKEN="${DIRECTUS_TOKEN:?Set DIRECTUS_TOKEN environment variable}"
|
||||
|
||||
create_category() {
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# PoW Captcha & Payment Server
|
||||
|
||||
PHP-basierter Server für dgray.io mit Proof-of-Work Captcha und BTCPay Payment-Proxy.
|
||||
PHP-basierter Server für kashilo.com mit Proof-of-Work Captcha und BTCPay Payment-Proxy.
|
||||
|
||||
## Setup
|
||||
|
||||
1. Subdomain `pow.dgray.io` auf den Server zeigen
|
||||
1. Subdomain `pow.kashilo.com` auf den Server zeigen
|
||||
2. Dateien in das Web-Root kopieren
|
||||
3. Secrets setzen:
|
||||
```bash
|
||||
@@ -18,10 +18,10 @@ PHP-basierter Server für dgray.io mit Proof-of-Work Captcha und BTCPay Payment-
|
||||
4. Testen:
|
||||
```bash
|
||||
# PoW Challenge
|
||||
curl https://pow.dgray.io/challenge
|
||||
curl https://pow.kashilo.com/challenge
|
||||
|
||||
# BTCPay Invoice erstellen
|
||||
curl -X POST https://pow.dgray.io/btcpay/invoice \
|
||||
curl -X POST https://pow.kashilo.com/btcpay/invoice \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"listingId": "test-123", "currency": "EUR"}'
|
||||
```
|
||||
@@ -76,7 +76,7 @@ Response:
|
||||
### POST /btcpay/webhook
|
||||
Empfängt BTCPay Server Webhook-Events. Wird in BTCPay unter Store → Settings → Webhooks konfiguriert.
|
||||
|
||||
- **URL**: `https://pow.dgray.io/btcpay/webhook`
|
||||
- **URL**: `https://pow.kashilo.com/btcpay/webhook`
|
||||
- **Event**: `InvoiceSettled` (nach 1 Blockchain-Confirmation)
|
||||
- **Aktion**: Setzt das zugehörige Listing in Directus auf `status: published`, `payment_status: paid`, setzt `paid_at` und `expires_at` (30 Tage)
|
||||
- **Sicherheit**: Webhook-Secret wird serverseitig geprüft
|
||||
@@ -95,7 +95,7 @@ Empfängt BTCPay Server Webhook-Events. Wird in BTCPay unter Store → Settings
|
||||
|
||||
- HMAC-SHA256 signierte Challenges (nicht fälschbar)
|
||||
- TTL: 2 Minuten
|
||||
- CORS: nur `https://dgray.io`
|
||||
- CORS: nur `https://kashilo.com`
|
||||
- `hash_equals()` gegen Timing-Attacks
|
||||
- BTCPay API-Key bleibt serverseitig (nie im Frontend)
|
||||
- Gebühren serverseitig erzwungen (nicht manipulierbar)
|
||||
|
||||
@@ -9,5 +9,5 @@ define('BTCPAY_STORE_ID', getenv('BTCPAY_STORE_ID') ?: 'CHANGE_ME');
|
||||
define('BTCPAY_WEBHOOK_SECRET', getenv('BTCPAY_WEBHOOK_SECRET') ?: '');
|
||||
define('LISTING_FEE', ['EUR' => 1, 'USD' => 1, 'CHF' => 1, 'GBP' => 1, 'JPY' => 200]);
|
||||
|
||||
define('DIRECTUS_URL', getenv('DIRECTUS_URL') ?: 'https://api.dgray.io');
|
||||
define('DIRECTUS_URL', getenv('DIRECTUS_URL') ?: 'https://api.kashilo.com');
|
||||
define('DIRECTUS_TOKEN', getenv('DIRECTUS_TOKEN') ?: 'CHANGE_ME');
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
<?php
|
||||
header('Content-Type: application/json');
|
||||
|
||||
$allowedOrigins = ['https://dgray.io', 'http://localhost:5500', 'http://localhost:8080'];
|
||||
$allowedOrigins = ['https://kashilo.com', 'http://localhost:5500', 'http://localhost:8080'];
|
||||
$origin = $_SERVER['HTTP_ORIGIN'] ?? '';
|
||||
if (in_array($origin, $allowedOrigins)) {
|
||||
header('Access-Control-Allow-Origin: ' . $origin);
|
||||
} else {
|
||||
header('Access-Control-Allow-Origin: https://dgray.io');
|
||||
header('Access-Control-Allow-Origin: https://kashilo.com');
|
||||
}
|
||||
|
||||
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
|
||||
|
||||
@@ -2,14 +2,14 @@
|
||||
/**
|
||||
* OG Meta Tag Proxy for Social Media Crawlers
|
||||
*
|
||||
* Setup: Nginx/Apache rewrite rule on dgray.io:
|
||||
* Setup: Nginx/Apache rewrite rule on kashilo.com:
|
||||
* If User-Agent matches crawler → proxy to this script
|
||||
* Else → serve static index.html
|
||||
*
|
||||
* Example Apache config (in VHost):
|
||||
* RewriteEngine On
|
||||
* RewriteCond %{HTTP_USER_AGENT} Twitterbot|facebookexternalhit|TelegramBot|Discordbot|Slackbot|WhatsApp [NC]
|
||||
* RewriteRule ^/listing/(.*)$ https://pow.dgray.io/og-proxy.php?listing=$1 [P,L]
|
||||
* RewriteRule ^/listing/(.*)$ https://pow.kashilo.com/og-proxy.php?listing=$1 [P,L]
|
||||
*
|
||||
* Required modules: sudo a2enmod rewrite proxy proxy_http
|
||||
*
|
||||
@@ -17,7 +17,7 @@
|
||||
* location /listing/ {
|
||||
* if ($http_user_agent ~* "Twitterbot|facebookexternalhit|TelegramBot|Discordbot|Slackbot|WhatsApp") {
|
||||
* rewrite ^/listing/(.*)$ /og-proxy.php?listing=$1 break;
|
||||
* proxy_pass https://pow.dgray.io;
|
||||
* proxy_pass https://pow.kashilo.com;
|
||||
* }
|
||||
* }
|
||||
*
|
||||
@@ -40,8 +40,8 @@ if (!$listingId && isset($_GET['listing'])) {
|
||||
$listingId = $_GET['listing'];
|
||||
}
|
||||
|
||||
$siteUrl = 'https://dgray.io';
|
||||
$defaultTitle = 'dgray.io – Anonymous Classifieds with Monero';
|
||||
$siteUrl = 'https://kashilo.com';
|
||||
$defaultTitle = 'kashilo.com – Anonymous Classifieds with Monero';
|
||||
$defaultDesc = 'Buy and sell anonymously with Monero. No KYC, no email, E2E encrypted chat.';
|
||||
$defaultImage = $siteUrl . '/assets/press/og-image.png';
|
||||
|
||||
@@ -70,7 +70,7 @@ if ($listingId) {
|
||||
$listing = $data['data'] ?? null;
|
||||
|
||||
if ($listing) {
|
||||
$title = htmlspecialchars($listing['title'] ?? '') . ' – dgray.io';
|
||||
$title = htmlspecialchars($listing['title'] ?? '') . ' – kashilo.com';
|
||||
$description = htmlspecialchars(mb_substr($listing['description'] ?? '', 0, 160));
|
||||
$url = $siteUrl . '/#/listing/' . $listing['id'];
|
||||
$type = 'product';
|
||||
@@ -101,7 +101,7 @@ header('Content-Type: text/html; charset=utf-8');
|
||||
|
||||
<!-- Open Graph -->
|
||||
<meta property="og:type" content="<?= $type ?>">
|
||||
<meta property="og:site_name" content="dgray.io">
|
||||
<meta property="og:site_name" content="kashilo.com">
|
||||
<meta property="og:title" content="<?= $title ?>">
|
||||
<meta property="og:description" content="<?= $description ?>">
|
||||
<meta property="og:url" content="<?= $url ?>">
|
||||
|
||||
Reference in New Issue
Block a user