autoreg-skills-max: initial public release (restored, redacted, hardened)
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
# Existing `.loc.cc` Domain Recovery and Tunnel Routing
|
||||
|
||||
## Diagnostic order
|
||||
|
||||
1. Authenticate to the account that owns the domain.
|
||||
2. `GET /api/domains` and locate the exact `full_domain`.
|
||||
3. Record `id`, `status`, `suspend_reason`, `first_failed_at`, `dns_synced`, and `scan_summary`.
|
||||
4. `GET /api/domain-scans/{id}` to distinguish DNS, HTTP, and TLS failures.
|
||||
5. `GET /api/dns/{id}/records`; check `synced_to_powerdns` and `sync_error` per record.
|
||||
6. If provider state may be stale, `POST /api/dns/{id}/records/sync-from-powerdns`.
|
||||
7. Query `ns1.nodelook.com` and `ns2.nodelook.com` directly, then public resolvers.
|
||||
8. Test public HTTP/TLS and application endpoints from outside the origin network.
|
||||
|
||||
## Important failure signatures
|
||||
|
||||
### Domain resolves but remains suspended
|
||||
|
||||
Typical fields:
|
||||
|
||||
```json
|
||||
{
|
||||
"status": "suspended",
|
||||
"suspend_reason": "Domain down for 7 days",
|
||||
"scan_summary": {
|
||||
"dns_status": "resolved",
|
||||
"http_status": "offline",
|
||||
"ssl_status": "invalid"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
This is not a registration failure. Restore externally reachable HTTP/TLS and wait for/trigger only a documented health scan. Do not invent an unsuspend endpoint.
|
||||
|
||||
### Cloudflare Tunnel error 1001
|
||||
|
||||
Symptoms:
|
||||
|
||||
- tunnel connector is healthy;
|
||||
- hostname exists in local ingress;
|
||||
- DNS CNAME points to `<uuid>.cfargotunnel.com`;
|
||||
- HTTP via Cloudflare returns `error code: 1001` or TLS cannot be provisioned.
|
||||
|
||||
Interpretation: the hostname was not routed from a Cloudflare-managed zone/account. A raw external CNAME is insufficient. Confirm the parent zone is available through `/zones` and that `cloudflared tunnel route dns` or the equivalent API route succeeds before relying on this design.
|
||||
|
||||
## DNS record safety
|
||||
|
||||
- Apex CNAME/ALIAS commonly conflicts with MX and TXT records.
|
||||
- Preserve mail and domain-verification records unless the user explicitly accepts losing them.
|
||||
- A dedicated `api` hostname avoids apex coexistence conflicts but not Cloudflare ownership constraints.
|
||||
- After mutation, verify both API state and authoritative DNS. A successful POST alone is not completion.
|
||||
|
||||
## Static ngrok fallback discovered from local state
|
||||
|
||||
When a vanity domain cannot be published, search account inventories and prior sessions for an assigned static ngrok hostname before settling for a random `ngrok-free.app` URL.
|
||||
|
||||
Credential distinction:
|
||||
|
||||
- agent `authtoken` is enough to start a tunnel on a static hostname already assigned to that account;
|
||||
- an ngrok `api_key` is only needed for management commands such as reserved-domain listing/creation.
|
||||
|
||||
Operational ownership test:
|
||||
|
||||
```powershell
|
||||
ngrok http --domain=<assigned-hostname> 8080 --authtoken <authtoken>
|
||||
```
|
||||
|
||||
Require the log to show `started tunnel` with the exact hostname, then test the public routes. Persist the exact command in startup automation and update all URL consumers. Do not describe this fallback as the vanity domain itself.
|
||||
|
||||
## Completion gate
|
||||
|
||||
Report a stable domain only when all are true:
|
||||
|
||||
- authoritative and public DNS agree, or the static tunnel agent confirms the exact assigned hostname;
|
||||
- TLS certificate is valid for the hostname;
|
||||
- `/health` returns 200 externally;
|
||||
- `/v1/models` or the product's real API route returns the expected authenticated/public response;
|
||||
- bot/docs/config/tests references use the same verified hostname;
|
||||
- the affected application was restarted and its live URL configuration read back;
|
||||
- a restart/autostart path for the tunnel or reverse proxy is present and tested.
|
||||
@@ -0,0 +1,76 @@
|
||||
# Free Domain Catalog — September 2026
|
||||
|
||||
Full catalog of free domain sources, verified curl live. Last verified: 2026-09-15.
|
||||
|
||||
## Real Free TLDs (Full DNS Control)
|
||||
|
||||
| TLD | Registrar | Speed | Notes |
|
||||
|-----|-----------|-------|-------|
|
||||
| .pp.ua | nic.ua | Instant | UA zone, free forever, full DNS/MX/NS. May need UA phone (5sim) |
|
||||
| .eu.org | nic.eu.org | 2wk-3mo | EU zone since 1996, 2 domains max, manual approval |
|
||||
| .nom.za | secure.nom.za | Days | ZA personal domain, 19yr active, ad-supported, full DNS |
|
||||
| .eu.cc | gname.com | Instant | 3 domains free, functional TLD (not ICANN) |
|
||||
| .eu.cc | rayname.com | Instant | 3 more .eu.cc domains |
|
||||
| .loc.cc | domain.nodeloc.com | API | 10yr with coupon FREEJUL (expired 16.07.2026 — wait new) |
|
||||
| .rr.kg | domain.nodeloc.com | API | Same as .loc.cc |
|
||||
|
||||
## Premium Domains Free (1 Year)
|
||||
|
||||
| Provider | TLDs | Catch |
|
||||
|----------|------|-------|
|
||||
| ifreedomains.com | .online/.blog/.bio/.link/.info | $0 checkout, may ask card for verification |
|
||||
| wix.com/domain | Various | Free with trial website |
|
||||
| GitHub Student Pack | .me (Namecheap) | Needs edu email or SheerID bypass |
|
||||
|
||||
## Subdomain Registries
|
||||
|
||||
| Provider | Example | Notes |
|
||||
|----------|---------|-------|
|
||||
| freedns.afraid.org | you.mooo.com (867k hosts) | 21K domains, since 2001 |
|
||||
| duckdns.org | you.duckdns.org | Dynamic DNS, auto-update IP |
|
||||
| dynv6.com | you.dynv6.com | v4/v6 dynamic DNS |
|
||||
| noip.com/free | you.no-ip.org | 3 hosts free, since 1999 |
|
||||
| dnsexit.com | you.ipq.co | 20+ zones, email forwarding |
|
||||
| freedomain.pro | you.co.nr | URL forwarding + cloaking |
|
||||
|
||||
## Platform Subdomains
|
||||
|
||||
All with free HTTPS + custom domain support:
|
||||
- Cloudflare Pages (pages.dev + 100 custom domains)
|
||||
- Vercel (vercel.app)
|
||||
- Netlify (netlify.app)
|
||||
- GitHub Pages (github.io)
|
||||
- Serv00 (serv00.net + 3GB hosting, SSH, cron)
|
||||
|
||||
## Tunnels (Instant)
|
||||
|
||||
| Service | Command | Notes |
|
||||
|---------|---------|-------|
|
||||
| nip.io | `<ip>.nip.io` | No registration |
|
||||
| trycloudflare.com | `cloudflared tunnel --url localhost:8080` | No account needed |
|
||||
| srv.us | `ssh srv.us -R 80:localhost:8080` | No registration |
|
||||
| ngrok | `ngrok http 8080` | 1 tunnel free |
|
||||
| localhost.run | `ssh localhost.run -R 80:localhost:8080` | No registration |
|
||||
|
||||
## Cheap TLDs ($0.80-2/yr)
|
||||
|
||||
- .xyz — $1/yr first year (Namecheap/Porkbun)
|
||||
- .link/.click/.shop — $1-2/yr
|
||||
- .ovh — $3/yr
|
||||
|
||||
## ICANN AGP Trick
|
||||
|
||||
Register any gTLD → use 4 days → request full refund during 5-day Add Grace Period.
|
||||
Works: Namecheap, Porkbun, Dynadot. Risk: account ban if abused.
|
||||
|
||||
## Sources
|
||||
|
||||
- nic.ua/ru/domains/.pp.ua (200, instant)
|
||||
- nic.eu.org (200, slow approval)
|
||||
- secure.nom.za (200, ad-supported trial)
|
||||
- gname.com/tld-eu-cc.html (200, 3 free)
|
||||
- rayname.com (200, 3 free .eu.cc)
|
||||
- domain.nodeloc.com (200, API, coupon expired)
|
||||
- ifreedomains.com (200, $0 checkout)
|
||||
- freedns.afraid.org/domain/registry (21K domains, 200)
|
||||
- duckdns.org, dynv6.com, noip.com, dnsexit.com (all 200)
|
||||
@@ -0,0 +1,327 @@
|
||||
# Nodeloc API Examples — Full Reference with Real Response Data
|
||||
|
||||
## Registration
|
||||
|
||||
```bash
|
||||
curl -s 'https://domain.nodeloc.com/api/auth/register' -X POST \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{"username":"[REDACTED-NAME]","email":"margaretedwardse316@gmail.com","password":"Reform123!@#"}'
|
||||
```
|
||||
|
||||
Response:
|
||||
```json
|
||||
{
|
||||
"message": "success.user_created",
|
||||
"user": {
|
||||
"id": 3375,
|
||||
"username": "[REDACTED-NAME]",
|
||||
"email": "margaretedwardse316@gmail.com",
|
||||
"email_verified": false,
|
||||
"is_admin": false,
|
||||
"user_level": "normal",
|
||||
"domain_quota": 2,
|
||||
"invite_code": "b578c9431037ff8a",
|
||||
"total_invites": 0,
|
||||
"successful_invites": 0,
|
||||
"status": "active",
|
||||
"created_at": "2026-07-16T10:39:49.944849748Z"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Login
|
||||
|
||||
```bash
|
||||
curl -s 'https://domain.nodeloc.com/api/auth/login' -X POST \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{"email":"margaretedwardse316@gmail.com","password":"Reform123!@#"}'
|
||||
```
|
||||
|
||||
Response:
|
||||
```json
|
||||
{
|
||||
"message": "success.login",
|
||||
"token": "eyJhbG... (257 chars)",
|
||||
"user": {
|
||||
"id": 3375,
|
||||
"username": "[REDACTED-NAME]",
|
||||
"email": "margaretedwardse316@gmail.com",
|
||||
"email_verified": false,
|
||||
"is_admin": false,
|
||||
"user_level": "normal",
|
||||
"domain_quota": 2,
|
||||
"invite_code": "b578c9431037ff8a",
|
||||
"status": "active",
|
||||
"last_login_at": "2026-07-16T10:40:12.252949214Z"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Root Domains (TLDs)
|
||||
|
||||
```bash
|
||||
curl -s 'https://domain.nodeloc.com/api/public/root-domains'
|
||||
```
|
||||
|
||||
Response:
|
||||
```json
|
||||
{
|
||||
"root_domains": [
|
||||
{
|
||||
"id": 1,
|
||||
"domain": "loc.cc",
|
||||
"description": "Loc.cc",
|
||||
"nameservers": "[\"ns1.nodelook.com\",\"ns2.nodelook.com\"]",
|
||||
"use_default_nameservers": true,
|
||||
"is_active": true,
|
||||
"is_hot": true,
|
||||
"is_new": true,
|
||||
"priority": 100,
|
||||
"min_length": 3,
|
||||
"max_length": 63,
|
||||
"registration_count": 3436,
|
||||
"price_per_year": 100,
|
||||
"lifetime_price": 1000,
|
||||
"is_free": false,
|
||||
"min_user_level": "normal"
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"domain": "rr.kg",
|
||||
"price_per_year": 100,
|
||||
"lifetime_price": 1000,
|
||||
"is_free": false,
|
||||
"min_user_level": "normal"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## Calculate Price
|
||||
|
||||
```bash
|
||||
curl -s 'https://domain.nodeloc.com/api/orders/calculate' -X POST \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{"subdomain":"[REDACTED-NAME]","root_domain_id":1,"years":10}'
|
||||
```
|
||||
|
||||
Response:
|
||||
```json
|
||||
{
|
||||
"base_price": 1000,
|
||||
"discount_amount": 0,
|
||||
"final_price": 1000,
|
||||
"coupon_applied": false
|
||||
}
|
||||
```
|
||||
|
||||
## Create Order (with FREEJUL promo)
|
||||
|
||||
```bash
|
||||
curl -s 'https://domain.nodeloc.com/api/orders' -X POST \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{"subdomain":"[REDACTED-NAME]","root_domain_id":1,"years":10,"coupon_code":"FREEJUL"}'
|
||||
```
|
||||
|
||||
Response:
|
||||
```json
|
||||
{
|
||||
"message": "Order created successfully",
|
||||
"order": {
|
||||
"id": 6702,
|
||||
"order_number": "ORD178419901522d1fad9",
|
||||
"full_domain": "[REDACTED-NAME].loc.cc",
|
||||
"years": 10,
|
||||
"is_lifetime": false,
|
||||
"base_price": 1000,
|
||||
"discount_amount": 1000,
|
||||
"final_price": 0,
|
||||
"status": "pending",
|
||||
"created_at": "2026-07-16T10:50:15.863928Z",
|
||||
"expires_at": "2026-07-16T11:05:15.863821Z",
|
||||
"root_domain": {
|
||||
"id": 1,
|
||||
"domain": "loc.cc"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Pay Free Order
|
||||
|
||||
```bash
|
||||
curl -s "https://domain.nodeloc.com/api/payments/6707/complete-free" -X POST \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{}'
|
||||
```
|
||||
|
||||
Response:
|
||||
```json
|
||||
{
|
||||
"message": "Free order completed successfully",
|
||||
"order_id": 6707
|
||||
}
|
||||
```
|
||||
|
||||
## Paid Order Initiate
|
||||
|
||||
```bash
|
||||
curl -s "https://domain.nodeloc.com/api/payments/${ORDER_ID}/initiate" -X POST \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{}'
|
||||
# → {"redirect_url":"https://..."}
|
||||
```
|
||||
|
||||
## List Domains
|
||||
|
||||
```bash
|
||||
curl -s 'https://domain.nodeloc.com/api/domains' -H "Authorization: Bearer $TOKEN"
|
||||
```
|
||||
|
||||
Response:
|
||||
```json
|
||||
{
|
||||
"domains": [
|
||||
{
|
||||
"id": 4901,
|
||||
"full_domain": "[REDACTED-NAME].loc.cc",
|
||||
"subdomain": "[REDACTED-NAME]",
|
||||
"root_domain_id": 1,
|
||||
"status": "active",
|
||||
"registered_at": "2026-07-16T10:52:26.925642Z",
|
||||
"expires_at": "2036-07-16T10:52:26.925642Z",
|
||||
"nameservers": "[\"ns1.nodelook.com\",\"ns2.nodelook.com\"]",
|
||||
"use_default_nameservers": true,
|
||||
"auto_renew": false,
|
||||
"dns_synced": false,
|
||||
"user_id": 3375
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## List Orders
|
||||
|
||||
```bash
|
||||
curl -s 'https://domain.nodeloc.com/api/orders' -H "Authorization: Bearer $TOKEN"
|
||||
```
|
||||
|
||||
Response:
|
||||
```json
|
||||
{
|
||||
"orders": [
|
||||
{
|
||||
"id": 6707,
|
||||
"order_number": "ORD1784199104dba87308",
|
||||
"full_domain": "[REDACTED-NAME].loc.cc",
|
||||
"years": 10,
|
||||
"is_lifetime": false,
|
||||
"base_price": 1000,
|
||||
"discount_amount": 1000,
|
||||
"final_price": 0,
|
||||
"status": "paid",
|
||||
"created_at": "2026-07-16T10:51:44.026417Z",
|
||||
"paid_at": "2026-07-16T10:52:26.925642Z"
|
||||
}
|
||||
],
|
||||
"page": 1,
|
||||
"page_size": 20,
|
||||
"total": 1
|
||||
}
|
||||
```
|
||||
|
||||
## DNS — List Records
|
||||
|
||||
```bash
|
||||
curl -s "https://domain.nodeloc.com/api/dns/4901/records" \
|
||||
-H "Authorization: Bearer $TOKEN"
|
||||
```
|
||||
|
||||
Response:
|
||||
```json
|
||||
{
|
||||
"records": [
|
||||
{
|
||||
"id": 6793,
|
||||
"domain_id": 4901,
|
||||
"name": "@",
|
||||
"type": "MX",
|
||||
"content": "mx1.improvmx.com",
|
||||
"ttl": 3600,
|
||||
"priority": 10,
|
||||
"is_active": true,
|
||||
"synced_to_powerdns": false
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## DNS — Add Record
|
||||
|
||||
Supported types: A, AAAA, CNAME, ALIAS, MX, TXT, NS, SRV, CAA.
|
||||
MX records require `priority` field (integer).
|
||||
|
||||
```bash
|
||||
curl -s 'https://domain.nodeloc.com/api/dns/4901/records' -X POST \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{"name":"@","type":"MX","content":"mx1.improvmx.com","priority":10,"ttl":3600}'
|
||||
```
|
||||
|
||||
Response:
|
||||
```json
|
||||
{
|
||||
"message": "DNS record created successfully",
|
||||
"record": {
|
||||
"id": 6793,
|
||||
"domain_id": 4901,
|
||||
"name": "@",
|
||||
"type": "MX",
|
||||
"content": "mx1.improvmx.com",
|
||||
"ttl": 3600,
|
||||
"priority": 10,
|
||||
"is_active": true,
|
||||
"synced_to_powerdns": false,
|
||||
"created_at": "2026-07-16T12:20:35.043233174Z"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Error Responses
|
||||
|
||||
### Email already exists
|
||||
```json
|
||||
{"error": "error.email_exists"}
|
||||
```
|
||||
|
||||
### Validation error (wrong field names, missing required fields)
|
||||
```json
|
||||
{"error": "error.validation"}
|
||||
```
|
||||
|
||||
### Coupon already used (one per account)
|
||||
```json
|
||||
{"error": "You have already used this coupon on 0001-01-01T00:00:00Z. This coupon can only be used once per user"}
|
||||
```
|
||||
|
||||
### Domain already registered
|
||||
```json
|
||||
{"error": "Domain already registered"}
|
||||
```
|
||||
|
||||
### Invalid credentials
|
||||
```json
|
||||
{"error": "error.invalid_credentials"}
|
||||
```
|
||||
|
||||
### CyberPanel provisioning failed
|
||||
```json
|
||||
{"error": "CyberPanel provisioning failed: CyberPanel returned HTTP 404..."}
|
||||
```
|
||||
|
||||
### Password registration disabled (web UI only)
|
||||
The web UI shows "当前禁止密码注册,请使用以下登录方式" but the API still accepts password registration.
|
||||
Reference in New Issue
Block a user