# Server Rack

> A row of tall sci-fi server racks: white armored side panels with glowing edge strips frame stacks of dark server blades covered in rows of blinking status LEDs, drive bays and amber or red warning lights, topped by a cable tray full of colored data cables. Choose one to three racks, the LED color or power them down — great for data centers, ship computer cores, hacking objectives and cyberpunk interiors.

![Server Rack preview](https://codels.download/m/server-rack.png)

Multi-view sheet (3/4, front, side, top): https://codels.download/m/server-rack.sheet.png

## Facts

- Category: Sci-Fi › Sci-Fi Props
- Size (W × H × D): 1.34 × 2.37 × 0.96 m — units are meters, +Y up, front faces +Z
- Origin: center of the base (y = 0)
- Triangles: 1,032 · Meshes: 182 · Materials: 9
- License: CC0-1.0 (Codels built-in)
- Tags: computer, rack, low-poly, stylized, cyberpunk, modern, office, sci-fi, interior, fps, space-shooter, decoration, furniture, interactable, modular, prop, metal, tall, emissive, game-ready, mobile-friendly, parametric, color-blue, color-gray, size-medium, poly-low
- Page: https://codels.download/models/server-rack

## Files

| Format | URL |
|---|---|
| three.js ES module (`createServerRack()`) | https://codels.download/m/server-rack.js |
| React Three Fiber component (`<ServerRack />`) | https://codels.download/m/server-rack.jsx |
| Instancing module (`createServerRackInstances(count, place)`, one draw call per material) | https://codels.download/m/server-rack.instanced.js |
| Standalone HTML demo | https://codels.download/m/server-rack.html |
| glTF binary | https://codels.download/m/server-rack.glb |
| glTF binary, Meshopt-compressed (2–3× smaller; GLTFLoader needs `setMeshoptDecoder(MeshoptDecoder)`) | https://codels.download/m/server-rack.glb?compress=meshopt |
| glTF JSON | https://codels.download/m/server-rack.gltf |
| OBJ (vertex colors) + MTL | https://codels.download/m/server-rack.obj · https://codels.download/m/server-rack.mtl |
| STL | https://codels.download/m/server-rack.stl |
| CodelSpec JSON | https://codels.download/m/server-rack.json |

## Parameters

Append them as query parameters to any URL above to get a customized variant (e.g. `?racks=...`).

| Param | Type | Range / options | Default | Current |
|---|---|---|---|---|
| `racks` | int | 1 – 3 | 2 | 2 |
| `ledColor` | color | #rrggbb | #3ad6ff | #3ad6ff |
| `powered` | boolean | true \| false | true | true |

## Parts

- rack1 (group)
  - plinth (box · dark)
  - sideL (box · shell)
  - edgeGlowL (box · led)
  - sideR (box · shell)
  - edgeGlowR (box · led)
  - topCap (box · shell)
  - chassis (box · dark)
  - topVent (box · face)
  - servicePanelL (box · dark)
  - sideTagL (box · led)
  - blade1 (plane · face)
  - blade2 (plane · face)
  - statusBar2 (plane · led)
  - blade3 (plane · face)
  - statusBar3 (plane · led)
  - blade4 (plane · face)
  - blade5 (plane · face)
  - statusBar5 (plane · led)
  - blade6 (plane · face)
  - statusBar6 (plane · ledAmber)
  - blade7 (plane · face)
  - blade8 (plane · face)
  - statusBar8 (plane · led)
  - blade9 (plane · face)
  - statusBar9 (plane · ledAmber)
- rack2 (group)
  - plinth (box · dark)
  - sideL (box · shell)
  - edgeGlowL (box · led)
  - sideR (box · shell)
  - edgeGlowR (box · led)
  - topCap (box · shell)
  - chassis (box · dark)
  - topVent (box · face)
  - servicePanelR (box · dark)
  - sideTagR (box · led)
  - blade1 (plane · face)
  - blade2 (plane · face)
  - statusBar2 (plane · led)

## How to use

Save the code below as `server-rack.js`, then:

```js
import { createServerRack } from './server-rack.js';
const model = createServerRack();
scene.add(model);
```

## Code

```js
/**
 * Server Rack — Codels 3D model library (https://codels.download/models/server-rack)
 * License: CC0-1.0 · Units: meters · Y-up · Front: +Z · Origin: center of the base (y = 0)
 * Triangles: 1,032 · Size (W × H × D): 1.34 × 2.37 × 0.96 m
 *
 * Usage:
 *   import { createServerRack } from './server-rack.js';
 *   
 *   const model = createServerRack();
 *   model.position.set(0, 0, 0);
 *   scene.add(model);
 */
import * as THREE from 'three';

// Tube along a smooth curve through the given points.
function tube(path, radius, tubularSegments, radialSegments, closed = false) {
  const curve = new THREE.CatmullRomCurve3(path.map(([x, y, z]) => new THREE.Vector3(x, y, z)), closed);
  return new THREE.TubeGeometry(curve, tubularSegments, radius, radialSegments, closed);
}

export function createServerRack() {
  const root = new THREE.Group();
  root.name = 'ServerRack';

  // Materials
  const shellMat = new THREE.MeshStandardMaterial({ name: 'shell', color: 0xd0d6de, roughness: 0.45, metalness: 0.3, flatShading: true });
  const darkMat = new THREE.MeshStandardMaterial({ name: 'dark', color: 0x262a31, roughness: 0.6, metalness: 0.35, flatShading: true });
  const faceMat = new THREE.MeshStandardMaterial({ name: 'face', color: 0x454c57, roughness: 0.5, metalness: 0.45, flatShading: true });
  const metalMat = new THREE.MeshStandardMaterial({ name: 'metal', color: 0x7d858f, roughness: 0.4, metalness: 0.6, flatShading: true });
  const ledMat = new THREE.MeshStandardMaterial({ name: 'led', color: 0x3ad6ff, roughness: 0.4, emissive: 0x3ad6ff, emissiveIntensity: 1.3, flatShading: true });
  const ledAmberMat = new THREE.MeshStandardMaterial({ name: 'ledAmber', color: 0xffb648, roughness: 0.4, emissive: 0xffa526, emissiveIntensity: 1.2, flatShading: true });
  const ledRedMat = new THREE.MeshStandardMaterial({ name: 'ledRed', color: 0xff5246, roughness: 0.4, emissive: 0xff3b2f, emissiveIntensity: 1.2, flatShading: true });
  const cableAMat = new THREE.MeshStandardMaterial({ name: 'cableA', color: 0xe8783a, roughness: 0.7, flatShading: true });
  const cableBMat = new THREE.MeshStandardMaterial({ name: 'cableB', color: 0x3b6fd6, roughness: 0.7, flatShading: true });

  // Shared geometries
  const boxGeo = new THREE.BoxGeometry(0.62, 0.1, 0.95);
  const boxGeo2 = new THREE.BoxGeometry(0.04, 1.95, 0.95);
  const boxGeo3 = new THREE.BoxGeometry(0.012, 1.75, 0.02);
  const boxGeo4 = new THREE.BoxGeometry(0.62, 0.08, 0.95);
  const boxGeo5 = new THREE.BoxGeometry(0.54, 1.87, 0.87);
  const boxGeo6 = new THREE.BoxGeometry(0.46, 0.02, 0.5);
  const boxGeo7 = new THREE.BoxGeometry(0.012, 1.25, 0.62);
  const boxGeo8 = new THREE.BoxGeometry(0.016, 0.03, 0.5);
  const boxGeo9 = new THREE.BoxGeometry(0.016, 0.36, 0.05);
  const planeGeo = new THREE.PlaneGeometry(0.52, 0.17);
  const planeGeo2 = new THREE.PlaneGeometry(0.1, 0.12);
  const planeGeo3 = new THREE.PlaneGeometry(0.012, 0.012);
  const planeGeo4 = new THREE.PlaneGeometry(0.24, 0.018);
  const planeGeo5 = new THREE.PlaneGeometry(0.022, 0.022);
  const planeGeo6 = new THREE.PlaneGeometry(0.42, 0.03);
  const boxGeo10 = new THREE.BoxGeometry(1.34, 0.08, 0.02);
  const boxGeo11 = new THREE.BoxGeometry(0.03, 0.24, 0.03);

  // Parts
  const rack1 = new THREE.Group();
  rack1.name = 'rack1';
  rack1.position.set(-0.31, 0, 0);
  root.add(rack1);
  const plinth = new THREE.Mesh(boxGeo, darkMat);
  plinth.name = 'plinth';
  plinth.position.set(0, 0.05, 0);
  rack1.add(plinth);
  const sideL = new THREE.Mesh(boxGeo2, shellMat);
  sideL.name = 'sideL';
  sideL.position.set(-0.29, 1.075, 0);
  rack1.add(sideL);
  const edgeGlowL = new THREE.Mesh(boxGeo3, ledMat);
  edgeGlowL.name = 'edgeGlowL';
  edgeGlowL.position.set(-0.275, 1.075, 0.48);
  rack1.add(edgeGlowL);
  const sideR = new THREE.Mesh(boxGeo2, shellMat);
  sideR.name = 'sideR';
  sideR.position.set(0.29, 1.075, 0);
  rack1.add(sideR);
  const edgeGlowR = new THREE.Mesh(boxGeo3, ledMat);
  edgeGlowR.name = 'edgeGlowR';
  edgeGlowR.position.set(0.275, 1.075, 0.48);
  rack1.add(edgeGlowR);
  const topCap = new THREE.Mesh(boxGeo4, shellMat);
  topCap.name = 'topCap';
  topCap.position.set(0, 2.01, 0);
  rack1.add(topCap);
  const chassis = new THREE.Mesh(boxGeo5, darkMat);
  chassis.name = 'chassis';
  chassis.position.set(0, 1.035, -0.04);
  rack1.add(chassis);
  const topVent = new THREE.Mesh(boxGeo6, faceMat);
  topVent.name = 'topVent';
  topVent.position.set(0, 2.055, -0.05);
  rack1.add(topVent);
  const servicePanelL = new THREE.Mesh(boxGeo7, darkMat);
  servicePanelL.name = 'servicePanelL';
  servicePanelL.position.set(-0.316, 1, -0.06);
  rack1.add(servicePanelL);
  const box11 = new THREE.Mesh(boxGeo8, faceMat);
  box11.position.set(-0.318, 0.52, -0.06);
  rack1.add(box11);
  const box12 = new THREE.Mesh(boxGeo8, faceMat);
  box12.position.set(-0.318, 0.595, -0.06);
  rack1.add(box12);
  const box13 = new THREE.Mesh(boxGeo8, faceMat);
  box13.position.set(-0.318, 0.67, -0.06);
  rack1.add(box13);
  const box14 = new THREE.Mesh(boxGeo8, faceMat);
  box14.position.set(-0.318, 0.745, -0.06);
  rack1.add(box14);
  const box15 = new THREE.Mesh(boxGeo8, faceMat);
  box15.position.set(-0.318, 0.82, -0.06);
  rack1.add(box15);
  const box16 = new THREE.Mesh(boxGeo8, faceMat);
  box16.position.set(-0.318, 0.895, -0.06);
  rack1.add(box16);
  const sideTagL = new THREE.Mesh(boxGeo9, ledMat);
  sideTagL.name = 'sideTagL';
  sideTagL.position.set(-0.318, 1.36, 0.12);
  rack1.add(sideTagL);
  const box18 = new THREE.Mesh(boxGeo9, ledAmberMat);
  box18.position.set(-0.318, 1.36, 0.04);
  rack1.add(box18);
  const blade1 = new THREE.Mesh(planeGeo, faceMat);
  blade1.name = 'blade1';
  blade1.position.set(0, 0.255, 0.435);
  rack1.add(blade1);
  const plane20 = new THREE.Mesh(planeGeo2, darkMat);
  plane20.position.set(-0.18, 0.255, 0.44);
  rack1.add(plane20);
  const plane21 = new THREE.Mesh(planeGeo2, darkMat);
  plane21.position.set(-0.06, 0.255, 0.44);
  rack1.add(plane21);
  const plane22 = new THREE.Mesh(planeGeo2, darkMat);
  plane22.position.set(0.06, 0.255, 0.44);
  rack1.add(plane22);
  const plane23 = new THREE.Mesh(planeGeo2, darkMat);
  plane23.position.set(0.18, 0.255, 0.44);
  rack1.add(plane23);
  const plane24 = new THREE.Mesh(planeGeo3, ledMat);
  plane24.position.set(0.2, 0.305, 0.441);
  rack1.add(plane24);
  const blade2 = new THREE.Mesh(planeGeo, faceMat);
  blade2.name = 'blade2';
  blade2.position.set(0, 0.445, 0.435);
  rack1.add(blade2);
  const statusBar2 = new THREE.Mesh(planeGeo4, ledMat);
  statusBar2.name = 'statusBar2';
  statusBar2.position.set(-0.09, 0.475, 0.44);
  rack1.add(statusBar2);
  const plane27 = new THREE.Mesh(planeGeo5, ledAmberMat);
  plane27.position.set(0.07, 0.475, 0.44);
  rack1.add(plane27);
  const plane28 = new THREE.Mesh(planeGeo5, darkMat);
  plane28.position.set(0.112, 0.475, 0.44);
  rack1.add(plane28);
  const plane29 = new THREE.Mesh(planeGeo5, ledMat);
  plane29.position.set(0.154, 0.475, 0.44);
  rack1.add(plane29);
  const plane30 = new THREE.Mesh(planeGeo5, ledMat);
  plane30.position.set(0.196, 0.475, 0.44);
  rack1.add(plane30);
  const plane31 = new THREE.Mesh(planeGeo5, ledMat);
  plane31.position.set(0.238, 0.475, 0.44);
  rack1.add(plane31);
  const plane32 = new THREE.Mesh(planeGeo6, darkMat);
  plane32.position.set(0, 0.41, 0.44);
  rack1.add(plane32);
  const blade3 = new THREE.Mesh(planeGeo, faceMat);
  blade3.name = 'blade3';
  blade3.position.set(0, 0.635, 0.435);
  rack1.add(blade3);
  const statusBar3 = new THREE.Mesh(planeGeo4, ledMat);
  statusBar3.name = 'statusBar3';
  statusBar3.position.set(-0.09, 0.665, 0.44);
  rack1.add(statusBar3);
  const plane35 = new THREE.Mesh(planeGeo5, ledAmberMat);
  plane35.position.set(0.07, 0.665, 0.44);
  rack1.add(plane35);
  const plane36 = new THREE.Mesh(planeGeo5, ledMat);
  plane36.position.set(0.112, 0.665, 0.44);
  rack1.add(plane36);
  const plane37 = new THREE.Mesh(planeGeo5, ledMat);
  plane37.position.set(0.154, 0.665, 0.44);
  rack1.add(plane37);
  const plane38 = new THREE.Mesh(planeGeo5, ledAmberMat);
  plane38.position.set(0.196, 0.665, 0.44);
  rack1.add(plane38);
  const plane39 = new THREE.Mesh(planeGeo5, darkMat);
  plane39.position.set(0.238, 0.665, 0.44);
  rack1.add(plane39);
  const plane40 = new THREE.Mesh(planeGeo6, darkMat);
  plane40.position.set(0, 0.6, 0.44);
  rack1.add(plane40);
  const blade4 = new THREE.Mesh(planeGeo, faceMat);
  blade4.name = 'blade4';
  blade4.position.set(0, 0.825, 0.435);
  rack1.add(blade4);
  const plane42 = new THREE.Mesh(planeGeo2, darkMat);
  plane42.position.set(-0.18, 0.825, 0.44);
  rack1.add(plane42);
  const plane43 = new THREE.Mesh(planeGeo2, darkMat);
  plane43.position.set(-0.06, 0.825, 0.44);
  rack1.add(plane43);
  const plane44 = new THREE.Mesh(planeGeo2, darkMat);
  plane44.position.set(0.06, 0.825, 0.44);
  rack1.add(plane44);
  const plane45 = new THREE.Mesh(planeGeo2, darkMat);
  plane45.position.set(0.18, 0.825, 0.44);
  rack1.add(plane45);
  const plane46 = new THREE.Mesh(planeGeo3, ledMat);
  plane46.position.set(0.2, 0.875, 0.441);
  rack1.add(plane46);
  const blade5 = new THREE.Mesh(planeGeo, faceMat);
  blade5.name = 'blade5';
  blade5.position.set(0, 1.015, 0.435);
  rack1.add(blade5);
  const statusBar5 = new THREE.Mesh(planeGeo4, ledMat);
  statusBar5.name = 'statusBar5';
  statusBar5.position.set(-0.09, 1.045, 0.44);
  rack1.add(statusBar5);
  const plane49 = new THREE.Mesh(planeGeo5, ledMat);
  plane49.position.set(0.07, 1.045, 0.44);
  rack1.add(plane49);
  const plane50 = new THREE.Mesh(planeGeo5, darkMat);
  plane50.position.set(0.112, 1.045, 0.44);
  rack1.add(plane50);
  const plane51 = new THREE.Mesh(planeGeo5, darkMat);
  plane51.position.set(0.154, 1.045, 0.44);
  rack1.add(plane51);
  const plane52 = new THREE.Mesh(planeGeo5, ledMat);
  plane52.position.set(0.196, 1.045, 0.44);
  rack1.add(plane52);
  const plane53 = new THREE.Mesh(planeGeo5, ledMat);
  plane53.position.set(0.238, 1.045, 0.44);
  rack1.add(plane53);
  const plane54 = new THREE.Mesh(planeGeo6, darkMat);
  plane54.position.set(0, 0.98, 0.44);
  rack1.add(plane54);
  const blade6 = new THREE.Mesh(planeGeo, faceMat);
  blade6.name = 'blade6';
  blade6.position.set(0, 1.205, 0.435);
  rack1.add(blade6);
  const statusBar6 = new THREE.Mesh(planeGeo4, ledAmberMat);
  statusBar6.name = 'statusBar6';
  statusBar6.position.set(-0.09, 1.235, 0.44);
  rack1.add(statusBar6);
  const plane57 = new THREE.Mesh(planeGeo5, ledMat);
  plane57.position.set(0.07, 1.235, 0.44);
  rack1.add(plane57);
  const plane58 = new THREE.Mesh(planeGeo5, darkMat);
  plane58.position.set(0.112, 1.235, 0.44);
  rack1.add(plane58);
  const plane59 = new THREE.Mesh(planeGeo5, ledMat);
  plane59.position.set(0.154, 1.235, 0.44);
  rack1.add(plane59);
  const plane60 = new THREE.Mesh(planeGeo5, ledMat);
  plane60.position.set(0.196, 1.235, 0.44);
  rack1.add(plane60);
  const plane61 = new THREE.Mesh(planeGeo5, ledMat);
  plane61.position.set(0.238, 1.235, 0.44);
  rack1.add(plane61);
  const plane62 = new THREE.Mesh(planeGeo6, darkMat);
  plane62.position.set(0, 1.17, 0.44);
  rack1.add(plane62);
  const blade7 = new THREE.Mesh(planeGeo, faceMat);
  blade7.name = 'blade7';
  blade7.position.set(0, 1.395, 0.435);
  rack1.add(blade7);
  const plane64 = new THREE.Mesh(planeGeo2, darkMat);
  plane64.position.set(-0.18, 1.395, 0.44);
  rack1.add(plane64);
  const plane65 = new THREE.Mesh(planeGeo2, darkMat);
  plane65.position.set(-0.06, 1.395, 0.44);
  rack1.add(plane65);
  const plane66 = new THREE.Mesh(planeGeo2, darkMat);
  plane66.position.set(0.06, 1.395, 0.44);
  rack1.add(plane66);
  const plane67 = new THREE.Mesh(planeGeo2, darkMat);
  plane67.position.set(0.18, 1.395, 0.44);
  rack1.add(plane67);
  const plane68 = new THREE.Mesh(planeGeo3, ledMat);
  plane68.position.set(0.2, 1.445, 0.441);
  rack1.add(plane68);
  const blade8 = new THREE.Mesh(planeGeo, faceMat);
  blade8.name = 'blade8';
  blade8.position.set(0, 1.585, 0.435);
  rack1.add(blade8);
  const statusBar8 = new THREE.Mesh(planeGeo4, ledMat);
  statusBar8.name = 'statusBar8';
  statusBar8.position.set(-0.09, 1.615, 0.44);
  rack1.add(statusBar8);
  const plane71 = new THREE.Mesh(planeGeo5, ledMat);
  plane71.position.set(0.07, 1.615, 0.44);
  rack1.add(plane71);
  const plane72 = new THREE.Mesh(planeGeo5, ledMat);
  plane72.position.set(0.112, 1.615, 0.44);
  rack1.add(plane72);
  const plane73 = new THREE.Mesh(planeGeo5, ledMat);
  plane73.position.set(0.154, 1.615, 0.44);
  rack1.add(plane73);
  const plane74 = new THREE.Mesh(planeGeo5, ledAmberMat);
  plane74.position.set(0.196, 1.615, 0.44);
  rack1.add(plane74);
  const plane75 = new THREE.Mesh(planeGeo5, ledMat);
  plane75.position.set(0.238, 1.615, 0.44);
  rack1.add(plane75);
  const plane76 = new THREE.Mesh(planeGeo6, darkMat);
  plane76.position.set(0, 1.55, 0.44);
  rack1.add(plane76);
  const blade9 = new THREE.Mesh(planeGeo, faceMat);
  blade9.name = 'blade9';
  blade9.position.set(0, 1.775, 0.435);
  rack1.add(blade9);
  const statusBar9 = new THREE.Mesh(planeGeo4, ledAmberMat);
  statusBar9.name = 'statusBar9';
  statusBar9.position.set(-0.09, 1.805, 0.44);
  rack1.add(statusBar9);
  const plane79 = new THREE.Mesh(planeGeo5, ledMat);
  plane79.position.set(0.07, 1.805, 0.44);
  rack1.add(plane79);
  const plane80 = new THREE.Mesh(planeGeo5, ledMat);
  plane80.position.set(0.112, 1.805, 0.44);
  rack1.add(plane80);
  const plane81 = new THREE.Mesh(planeGeo5, ledMat);
  plane81.position.set(0.154, 1.805, 0.44);
  rack1.add(plane81);
  const plane82 = new THREE.Mesh(planeGeo5, ledMat);
  plane82.position.set(0.196, 1.805, 0.44);
  rack1.add(plane82);
  const plane83 = new THREE.Mesh(planeGeo5, darkMat);
  plane83.position.set(0.238, 1.805, 0.44);
  rack1.add(plane83);
  const plane84 = new THREE.Mesh(planeGeo6, darkMat);
  plane84.position.set(0, 1.74, 0.44);
  rack1.add(plane84);
  const rack2 = new THREE.Group();
  rack2.name = 'rack2';
  rack2.position.set(0.31, 0, 0);
  root.add(rack2);
  const plinth2 = new THREE.Mesh(boxGeo, darkMat);
  plinth2.name = 'plinth';
  plinth2.position.set(0, 0.05, 0);
  rack2.add(plinth2);
  const sideL2 = new THREE.Mesh(boxGeo2, shellMat);
  sideL2.name = 'sideL';
  sideL2.position.set(-0.29, 1.075, 0);
  rack2.add(sideL2);
  const edgeGlowL2 = new THREE.Mesh(boxGeo3, ledMat);
  edgeGlowL2.name = 'edgeGlowL';
  edgeGlowL2.position.set(-0.275, 1.075, 0.48);
  rack2.add(edgeGlowL2);
  const sideR2 = new THREE.Mesh(boxGeo2, shellMat);
  sideR2.name = 'sideR';
  sideR2.position.set(0.29, 1.075, 0);
  rack2.add(sideR2);
  const edgeGlowR2 = new THREE.Mesh(boxGeo3, ledMat);
  edgeGlowR2.name = 'edgeGlowR';
  edgeGlowR2.position.set(0.275, 1.075, 0.48);
  rack2.add(edgeGlowR2);
  const topCap2 = new THREE.Mesh(boxGeo4, shellMat);
  topCap2.name = 'topCap';
  topCap2.position.set(0, 2.01, 0);
  rack2.add(topCap2);
  const chassis2 = new THREE.Mesh(boxGeo5, darkMat);
  chassis2.name = 'chassis';
  chassis2.position.set(0, 1.035, -0.04);
  rack2.add(chassis2);
  const topVent2 = new THREE.Mesh(boxGeo6, faceMat);
  topVent2.name = 'topVent';
  topVent2.position.set(0, 2.055, -0.05);
  rack2.add(topVent2);
  const servicePanelR = new THREE.Mesh(boxGeo7, darkMat);
  servicePanelR.name = 'servicePanelR';
  servicePanelR.position.set(0.316, 1, -0.06);
  rack2.add(servicePanelR);
  const box95 = new THREE.Mesh(boxGeo8, faceMat);
  box95.position.set(0.318, 0.52, -0.06);
  rack2.add(box95);
  const box96 = new THREE.Mesh(boxGeo8, faceMat);
  box96.position.set(0.318, 0.595, -0.06);
  rack2.add(box96);
  const box97 = new THREE.Mesh(boxGeo8, faceMat);
  box97.position.set(0.318, 0.67, -0.06);
  rack2.add(box97);
  const box98 = new THREE.Mesh(boxGeo8, faceMat);
  box98.position.set(0.318, 0.745, -0.06);
  rack2.add(box98);
  const box99 = new THREE.Mesh(boxGeo8, faceMat);
  box99.position.set(0.318, 0.82, -0.06);
  rack2.add(box99);
  const box100 = new THREE.Mesh(boxGeo8, faceMat);
  box100.position.set(0.318, 0.895, -0.06);
  rack2.add(box100);
  const sideTagR = new THREE.Mesh(boxGeo9, ledMat);
  sideTagR.name = 'sideTagR';
  sideTagR.position.set(0.318, 1.36, 0.12);
  rack2.add(sideTagR);
  const box102 = new THREE.Mesh(boxGeo9, ledAmberMat);
  box102.position.set(0.318, 1.36, 0.04);
  rack2.add(box102);
  const blade12 = new THREE.Mesh(planeGeo, faceMat);
  blade12.name = 'blade1';
  blade12.position.set(0, 0.255, 0.435);
  rack2.add(blade12);
  const plane104 = new THREE.Mesh(planeGeo2, darkMat);
  plane104.position.set(-0.18, 0.255, 0.44);
  rack2.add(plane104);
  const plane105 = new THREE.Mesh(planeGeo2, darkMat);
  plane105.position.set(-0.06, 0.255, 0.44);
  rack2.add(plane105);
  const plane106 = new THREE.Mesh(planeGeo2, darkMat);
  plane106.position.set(0.06, 0.255, 0.44);
  rack2.add(plane106);
  const plane107 = new THREE.Mesh(planeGeo2, darkMat);
  plane107.position.set(0.18, 0.255, 0.44);
  rack2.add(plane107);
  const plane108 = new THREE.Mesh(planeGeo3, ledMat);
  plane108.position.set(0.2, 0.305, 0.441);
  rack2.add(plane108);
  const blade22 = new THREE.Mesh(planeGeo, faceMat);
  blade22.name = 'blade2';
  blade22.position.set(0, 0.445, 0.435);
  rack2.add(blade22);
  const statusBar22 = new THREE.Mesh(planeGeo4, ledMat);
  statusBar22.name = 'statusBar2';
  statusBar22.position.set(-0.09, 0.475, 0.44);
  rack2.add(statusBar22);
  const plane111 = new THREE.Mesh(planeGeo5, darkMat);
  plane111.position.set(0.07, 0.475, 0.44);
  rack2.add(plane111);
  const plane112 = new THREE.Mesh(planeGeo5, ledMat);
  plane112.position.set(0.112, 0.475, 0.44);
  rack2.add(plane112);
  const plane113 = new THREE.Mesh(planeGeo5, ledMat);
  plane113.position.set(0.154, 0.475, 0.44);
  rack2.add(plane113);
  const plane114 = new THREE.Mesh(planeGeo5, darkMat);
  plane114.position.set(0.196, 0.475, 0.44);
  rack2.add(plane114);
  const plane115 = new THREE.Mesh(planeGeo5, ledAmberMat);
  plane115.position.set(0.238, 0.475, 0.44);
  rack2.add(plane115);
  const plane116 = new THREE.Mesh(planeGeo6, darkMat);
  plane116.position.set(0, 0.41, 0.44);
  rack2.add(plane116);
  const blade32 = new THREE.Mesh(planeGeo, faceMat);
  blade32.name = 'blade3';
  blade32.position.set(0, 0.635, 0.435);
  rack2.add(blade32);
  const statusBar32 = new THREE.Mesh(planeGeo4, ledMat);
  statusBar32.name = 'statusBar3';
  statusBar32.position.set(-0.09, 0.665, 0.44);
  rack2.add(statusBar32);
  const plane119 = new THREE.Mesh(planeGeo5, ledMat);
  plane119.position.set(0.07, 0.665, 0.44);
  rack2.add(plane119);
  const plane120 = new THREE.Mesh(planeGeo5, ledMat);
  plane120.position.set(0.112, 0.665, 0.44);
  rack2.add(plane120);
  const plane121 = new THREE.Mesh(planeGeo5, ledMat);
  plane121.position.set(0.154, 0.665, 0.44);
  rack2.add(plane121);
  const plane122 = new THREE.Mesh(planeGeo5, ledMat);
  plane122.position.set(0.196, 0.665, 0.44);
  rack2.add(plane122);
  const plane123 = new THREE.Mesh(planeGeo5, darkMat);
  plane123.position.set(0.238, 0.665, 0.44);
  rack2.add(plane123);
  const plane124 = new THREE.Mesh(planeGeo6, darkMat);
  plane124.position.set(0, 0.6, 0.44);
  rack2.add(plane124);
  const blade42 = new THREE.Mesh(planeGeo, faceMat);
  blade42.name = 'blade4';
  blade42.position.set(0, 0.825, 0.435);
  rack2.add(blade42);
  const plane126 = new THREE.Mesh(planeGeo2, darkMat);
  plane126.position.set(-0.18, 0.825, 0.44);
  rack2.add(plane126);
  const plane127 = new THREE.Mesh(planeGeo2, darkMat);
  plane127.position.set(-0.06, 0.825, 0.44);
  rack2.add(plane127);
  const plane128 = new THREE.Mesh(planeGeo2, darkMat);
  plane128.position.set(0.06, 0.825, 0.44);
  rack2.add(plane128);
  const plane129 = new THREE.Mesh(planeGeo2, darkMat);
  plane129.position.set(0.18, 0.825, 0.44);
  rack2.add(plane129);
  const plane130 = new THREE.Mesh(planeGeo3, ledMat);
  plane130.position.set(0.2, 0.875, 0.441);
  rack2.add(plane130);
  const blade52 = new THREE.Mesh(planeGeo, faceMat);
  blade52.name = 'blade5';
  blade52.position.set(0, 1.015, 0.435);
  rack2.add(blade52);
  const statusBar52 = new THREE.Mesh(planeGeo4, ledMat);
  statusBar52.name = 'statusBar5';
  statusBar52.position.set(-0.09, 1.045, 0.44);
  rack2.add(statusBar52);
  const plane133 = new THREE.Mesh(planeGeo5, ledRedMat);
  plane133.position.set(0.07, 1.045, 0.44);
  rack2.add(plane133);
  const plane134 = new THREE.Mesh(planeGeo5, ledMat);
  plane134.position.set(0.112, 1.045, 0.44);
  rack2.add(plane134);
  const plane135 = new THREE.Mesh(planeGeo5, ledRedMat);
  plane135.position.set(0.154, 1.045, 0.44);
  rack2.add(plane135);
  const plane136 = new THREE.Mesh(planeGeo5, ledMat);
  plane136.position.set(0.196, 1.045, 0.44);
  rack2.add(plane136);
  const plane137 = new THREE.Mesh(planeGeo5, ledRedMat);
  plane137.position.set(0.238, 1.045, 0.44);
  rack2.add(plane137);
  const plane138 = new THREE.Mesh(planeGeo6, darkMat);
  plane138.position.set(0, 0.98, 0.44);
  rack2.add(plane138);
  const blade62 = new THREE.Mesh(planeGeo, faceMat);
  blade62.name = 'blade6';
  blade62.position.set(0, 1.205, 0.435);
  rack2.add(blade62);
  const statusBar62 = new THREE.Mesh(planeGeo4, ledMat);
  statusBar62.name = 'statusBar6';
  statusBar62.position.set(-0.09, 1.235, 0.44);
  rack2.add(statusBar62);
  const plane141 = new THREE.Mesh(planeGeo5, ledMat);
  plane141.position.set(0.07, 1.235, 0.44);
  rack2.add(plane141);
  const plane142 = new THREE.Mesh(planeGeo5, ledMat);
  plane142.position.set(0.112, 1.235, 0.44);
  rack2.add(plane142);
  const plane143 = new THREE.Mesh(planeGeo5, ledMat);
  plane143.position.set(0.154, 1.235, 0.44);
  rack2.add(plane143);
  const plane144 = new THREE.Mesh(planeGeo5, ledMat);
  plane144.position.set(0.196, 1.235, 0.44);
  rack2.add(plane144);
  const plane145 = new THREE.Mesh(planeGeo5, darkMat);
  plane145.position.set(0.238, 1.235, 0.44);
  rack2.add(plane145);
  const plane146 = new THREE.Mesh(planeGeo6, darkMat);
  plane146.position.set(0, 1.17, 0.44);
  rack2.add(plane146);
  const blade72 = new THREE.Mesh(planeGeo, faceMat);
  blade72.name = 'blade7';
  blade72.position.set(0, 1.395, 0.435);
  rack2.add(blade72);
  const plane148 = new THREE.Mesh(planeGeo2, darkMat);
  plane148.position.set(-0.18, 1.395, 0.44);
  rack2.add(plane148);
  const plane149 = new THREE.Mesh(planeGeo2, darkMat);
  plane149.position.set(-0.06, 1.395, 0.44);
  rack2.add(plane149);
  const plane150 = new THREE.Mesh(planeGeo2, darkMat);
  plane150.position.set(0.06, 1.395, 0.44);
  rack2.add(plane150);
  const plane151 = new THREE.Mesh(planeGeo2, darkMat);
  plane151.position.set(0.18, 1.395, 0.44);
  rack2.add(plane151);
  const plane152 = new THREE.Mesh(planeGeo3, ledAmberMat);
  plane152.position.set(0.2, 1.445, 0.441);
  rack2.add(plane152);
  const blade82 = new THREE.Mesh(planeGeo, faceMat);
  blade82.name = 'blade8';
  blade82.position.set(0, 1.585, 0.435);
  rack2.add(blade82);
  const statusBar82 = new THREE.Mesh(planeGeo4, ledMat);
  statusBar82.name = 'statusBar8';
  statusBar82.position.set(-0.09, 1.615, 0.44);
  rack2.add(statusBar82);
  const plane155 = new THREE.Mesh(planeGeo5, darkMat);
  plane155.position.set(0.07, 1.615, 0.44);
  rack2.add(plane155);
  const plane156 = new THREE.Mesh(planeGeo5, ledRedMat);
  plane156.position.set(0.112, 1.615, 0.44);
  rack2.add(plane156);
  const plane157 = new THREE.Mesh(planeGeo5, ledMat);
  plane157.position.set(0.154, 1.615, 0.44);
  rack2.add(plane157);
  const plane158 = new THREE.Mesh(planeGeo5, darkMat);
  plane158.position.set(0.196, 1.615, 0.44);
  rack2.add(plane158);
  const plane159 = new THREE.Mesh(planeGeo5, ledMat);
  plane159.position.set(0.238, 1.615, 0.44);
  rack2.add(plane159);
  const plane160 = new THREE.Mesh(planeGeo6, darkMat);
  plane160.position.set(0, 1.55, 0.44);
  rack2.add(plane160);
  const blade92 = new THREE.Mesh(planeGeo, faceMat);
  blade92.name = 'blade9';
  blade92.position.set(0, 1.775, 0.435);
  rack2.add(blade92);
  const statusBar92 = new THREE.Mesh(planeGeo4, ledMat);
  statusBar92.name = 'statusBar9';
  statusBar92.position.set(-0.09, 1.805, 0.44);
  rack2.add(statusBar92);
  const plane163 = new THREE.Mesh(planeGeo5, ledAmberMat);
  plane163.position.set(0.07, 1.805, 0.44);
  rack2.add(plane163);
  const plane164 = new THREE.Mesh(planeGeo5, ledMat);
  plane164.position.set(0.112, 1.805, 0.44);
  rack2.add(plane164);
  const plane165 = new THREE.Mesh(planeGeo5, ledRedMat);
  plane165.position.set(0.154, 1.805, 0.44);
  rack2.add(plane165);
  const plane166 = new THREE.Mesh(planeGeo5, darkMat);
  plane166.position.set(0.196, 1.805, 0.44);
  rack2.add(plane166);
  const plane167 = new THREE.Mesh(planeGeo5, ledAmberMat);
  plane167.position.set(0.238, 1.805, 0.44);
  rack2.add(plane167);
  const plane168 = new THREE.Mesh(planeGeo6, darkMat);
  plane168.position.set(0, 1.74, 0.44);
  rack2.add(plane168);
  const cableTray = new THREE.Group();
  cableTray.name = 'cableTray';
  root.add(cableTray);
  const trayBase = new THREE.Mesh(new THREE.BoxGeometry(1.34, 0.02, 0.32), metalMat);
  trayBase.name = 'trayBase';
  trayBase.position.set(0, 2.29, -0.12);
  cableTray.add(trayBase);
  const trayBack = new THREE.Mesh(boxGeo10, metalMat);
  trayBack.name = 'trayBack';
  trayBack.position.set(0, 2.33, -0.27);
  cableTray.add(trayBack);
  const trayFront = new THREE.Mesh(boxGeo10, metalMat);
  trayFront.name = 'trayFront';
  trayFront.position.set(0, 2.33, 0.03);
  cableTray.add(trayFront);
  const trunkA = new THREE.Mesh(tube([[-0.65, 2.325, -0.18], [0.65, 2.325, -0.18]], 0.025, 1, 6), cableAMat);
  trunkA.name = 'trunkA';
  cableTray.add(trunkA);
  const trunkB = new THREE.Mesh(tube([[-0.65, 2.325, -0.1], [0.65, 2.325, -0.1]], 0.025, 1, 6), cableBMat);
  trunkB.name = 'trunkB';
  cableTray.add(trunkB);
  const trunkC = new THREE.Mesh(tube([[-0.65, 2.32, -0.03], [0.65, 2.32, -0.03]], 0.02, 1, 6), darkMat);
  trunkC.name = 'trunkC';
  cableTray.add(trunkC);
  const post1L = new THREE.Mesh(boxGeo11, metalMat);
  post1L.name = 'post1L';
  post1L.position.set(-0.53, 2.17, -0.25);
  cableTray.add(post1L);
  const post1R = new THREE.Mesh(boxGeo11, metalMat);
  post1R.name = 'post1R';
  post1R.position.set(-0.09, 2.17, -0.25);
  cableTray.add(post1R);
  const drop11 = new THREE.Mesh(tube([[-0.41, 2.31, -0.18], [-0.39, 2.17, -0.2], [-0.41, 2.06, -0.22]], 0.018, 4, 5), cableAMat);
  drop11.name = 'drop1_1';
  cableTray.add(drop11);
  const drop12 = new THREE.Mesh(tube([[-0.27, 2.31, -0.1], [-0.25, 2.17, -0.12], [-0.27, 2.06, -0.14]], 0.018, 4, 5), cableBMat);
  drop12.name = 'drop1_2';
  cableTray.add(drop12);
  const drop13 = new THREE.Mesh(tube([[-0.17, 2.31, -0.03], [-0.15, 2.17, -0.05], [-0.17, 2.06, -0.07]], 0.018, 4, 5), darkMat);
  drop13.name = 'drop1_3';
  cableTray.add(drop13);
  const post2L = new THREE.Mesh(boxGeo11, metalMat);
  post2L.name = 'post2L';
  post2L.position.set(0.09, 2.17, -0.25);
  cableTray.add(post2L);
  const post2R = new THREE.Mesh(boxGeo11, metalMat);
  post2R.name = 'post2R';
  post2R.position.set(0.53, 2.17, -0.25);
  cableTray.add(post2R);
  const drop21 = new THREE.Mesh(tube([[0.21, 2.31, -0.18], [0.23, 2.17, -0.2], [0.21, 2.06, -0.22]], 0.018, 4, 5), cableAMat);
  drop21.name = 'drop2_1';
  cableTray.add(drop21);
  const drop22 = new THREE.Mesh(tube([[0.35, 2.31, -0.1], [0.37, 2.17, -0.12], [0.35, 2.06, -0.14]], 0.018, 4, 5), cableBMat);
  drop22.name = 'drop2_2';
  cableTray.add(drop22);
  const drop23 = new THREE.Mesh(tube([[0.45, 2.31, -0.03], [0.47, 2.17, -0.05], [0.45, 2.06, -0.07]], 0.018, 4, 5), darkMat);
  drop23.name = 'drop2_3';
  cableTray.add(drop23);

  root.traverse((o) => {
    if (o.isMesh) {
      o.castShadow = true;
      o.receiveShadow = true;
    }
  });
  return root;
}

export default createServerRack;
```

---
Codels — 3D models as code for three.js. Search more: https://codels.download/api/v1/models?q=<query> · Guide: https://codels.download/llms.txt
