150 lines
4.9 KiB
Markdown
150 lines
4.9 KiB
Markdown
# Nerdhalla Valheim World Map
|
||
|
||
**Vanilla Valheim community server tools** — no mods, no BepInEx. Everything runs off the world save file.
|
||
|
||
## 🌐 Live Sites
|
||
|
||
| Site | URL | Purpose |
|
||
|---|---|---|
|
||
| **Nerdhalla Community** | https://nerdhalla.nerdcade.cc | Map viewer, POI browser, server status |
|
||
| **Forgejo (source)** | https://git.sweeney.fyi/aelith/valheim-map | Git repo for all code |
|
||
|
||
## 🗺️ What's Here
|
||
|
||
### Data Pipeline
|
||
|
||
| Step | Script | Output |
|
||
|---|---|---|
|
||
| Decode tiles | `decode_valheim_tiles.py` | 16 × 1024×1024 PNGs (composite, biome, height) |
|
||
| Stitch tiles | `valheim_decode_tiles.py` | 4096×4096 world images |
|
||
| Build POI DB | `build_db.py` | SQLite DB with 11,309 locations |
|
||
| Build viewer | `build_viewer.py` | Leaflet HTML with 3 map layers |
|
||
| Parse .db | `parse_valheim_db.py` | ZPackage → JSON conversion |
|
||
|
||
### Web Viewer (`index.html`)
|
||
|
||
- Leaflet map with 3 layers: composite, biome, height
|
||
- 11,309 POI markers with category icons (boss, dungeon, resource, etc.)
|
||
- Coordinate display on hover
|
||
- POI browser with search + category filter
|
||
- Server status indicator (checks Nerdcade via SSH)
|
||
|
||
### API Server (`api_server.py`)
|
||
|
||
- `GET /api/status` — Nerdcade server online/offline check
|
||
- `GET /api/pois?limit=N&search=X&category=Y` — POI queries
|
||
|
||
### Infrastructure
|
||
|
||
- **Caddy** — reverse proxy with auto-TLS for nerdhalla.nerdcade.cc + git.sweeney.fyi
|
||
- **Forgejo** — bare metal (migrated from Docker), git.sweeney.fyi:3000
|
||
- **nerdhalla-api** — systemd service, port 8081
|
||
|
||
## 📊 World Stats
|
||
|
||
| Property | Value |
|
||
|---|---|
|
||
| Seed | `yzZ5fr2tGa` |
|
||
| Map Size | ~10 km × 10 km (4096 × 4096 px) |
|
||
| Biomes | Meadows, Black Forest, Swamp, Mountain, Plains, Ocean, Mistlands |
|
||
| Total POIs | 11,309 |
|
||
| Best Tar Pit | (1210, -4159) — 5 tar pits within 200m |
|
||
|
||
## 🚧 Roadmap
|
||
|
||
### Phase 1 — POI Database ✅
|
||
- [x] Decode 16 map tiles from world save
|
||
- [x] Stitch into 4096×4096 composite/biome/height images
|
||
- [x] Build SQLite DB from `locations.json` (11,309 POIs)
|
||
- [x] Spatial queries for base location hunting
|
||
|
||
### Phase 2 — Web Viewer ✅
|
||
- [x] Leaflet map with 3 tile layers
|
||
- [x] POI markers with category icons
|
||
- [x] Search + category filter
|
||
- [x] Coordinate display
|
||
- [x] Server status indicator
|
||
- [x] TLS via Caddy
|
||
- [x] API backend for POI queries
|
||
|
||
### Phase 3 — Fog-of-War ⏳
|
||
- [ ] **Blocked:** Need player `.fch` files from local machines
|
||
- [ ] Extract explored/unexplored bitmap per player
|
||
- [ ] Overlay on map viewer
|
||
- [ ] Merge multiple players' exploration data
|
||
|
||
### Phase 4 — Cartography Sync 🔮
|
||
- [ ] **Undecided approach:**
|
||
- Option 1: ServerSideMap mod (requires BepInEx — some players don't want this)
|
||
- Option 2: Periodic merge script (pull `.fch` files, merge explored data)
|
||
- Option 3: Cartography table automation (in-game solution)
|
||
|
||
### Phase 5 — Automation 🔮
|
||
- [ ] Cron job to periodically pull `Nerdhalla.db` from Nerdcade
|
||
- [ ] Auto-regenerate map tiles on world update
|
||
- [ ] Push updated data to site
|
||
|
||
## 🛠️ Infrastructure
|
||
|
||
### Services on Boston-VPS
|
||
|
||
| Service | Type | Port | Notes |
|
||
|---|---|---|---|
|
||
| Caddy | Bare metal | 80/443 | Reverse proxy, auto-TLS |
|
||
| Forgejo | Bare metal | 3000 | Git server, git.sweeney.fyi |
|
||
| nerdhalla-api | Bare metal | 8081 | Python API server |
|
||
| Hermes Gateway | Bare metal | 8642/8644 | Fleet COO agent |
|
||
|
||
### Docker Cleanup (June 2026)
|
||
- Forgejo migrated from Docker to bare metal (saved ~450 MB virtual overhead)
|
||
- Dead containers removed: `hermes-fa98be67` (exited), `vllm-compression` (never started)
|
||
- 9.2 GB reclaimed from unused images
|
||
- Docker still installed but only used if needed
|
||
|
||
## 🔧 Quick Commands
|
||
|
||
```bash
|
||
# Restart API
|
||
sudo systemctl restart nerdhalla-api
|
||
|
||
# Restart Forgejo
|
||
sudo systemctl restart forgejo
|
||
|
||
# Restart Caddy
|
||
sudo systemctl reload caddy
|
||
|
||
# View logs
|
||
sudo journalctl -u nerdhalla-api -n 50 --no-pager
|
||
sudo journalctl -u forgejo -n 50 --no-pager
|
||
sudo tail -f /var/log/caddy/nerdhalla.log
|
||
```
|
||
|
||
## 📁 File Layout
|
||
|
||
```
|
||
/var/www/nerdhalla/ # Site root
|
||
├── index.html # Main site
|
||
├── api_server.py # Python API
|
||
├── world_composite.png # 4096×4096 map images
|
||
├── world_biome.png
|
||
├── world_height.png
|
||
├── 00-00_*.png # Individual tile images (16 tiles × 3 layers)
|
||
└── ...
|
||
|
||
/srv/forgejo/ # Forgejo data
|
||
└── data/
|
||
├── gitea/ # Config, DB, attachments
|
||
└── git/repositories/ # Git repos
|
||
|
||
/etc/caddy/
|
||
├── Caddyfile # Main config (imports sites-enabled/)
|
||
└── sites-enabled/
|
||
├── nerdhalla.conf # nerdhalla.nerdcade.cc
|
||
└── git.conf # git.sweeney.fyi
|
||
```
|
||
|
||
## 🔗 Related
|
||
|
||
- **Nerdcade server:** `aelith@100.86.206.39:46129`
|
||
- **World saves:** `/home/amp/.ampdata/instances/Valheim/.config/unity3d/IronGate/Valheim/worlds_local/`
|
||
- **Forgejo API token:** stored in Hermes memory
|