streamer-node 1.0.30 → 1.0.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/dist/package.json +6 -2
  2. package/dist/scripts/README.md +670 -0
  3. package/dist/scripts/install-streamer-node.sh +117 -0
  4. package/dist/scripts/reframe_ball.py +354 -0
  5. package/dist/src/application/interfaces/StartStreamUseCase.types.d.ts +3 -1
  6. package/dist/src/application/interfaces/StartStreamUseCase.types.d.ts.map +1 -1
  7. package/dist/src/application/interfaces/StartStreamUseCase.types.js.map +1 -1
  8. package/dist/src/application/services/HttpClient.d.ts +21 -0
  9. package/dist/src/application/services/HttpClient.d.ts.map +1 -1
  10. package/dist/src/application/services/HttpClient.js +37 -5
  11. package/dist/src/application/services/HttpClient.js.map +1 -1
  12. package/dist/src/application/services/StreamManagerService.d.ts.map +1 -1
  13. package/dist/src/application/services/StreamManagerService.js +2 -0
  14. package/dist/src/application/services/StreamManagerService.js.map +1 -1
  15. package/dist/src/application/use-cases/CaptureHighlightUseCase.d.ts +52 -0
  16. package/dist/src/application/use-cases/CaptureHighlightUseCase.d.ts.map +1 -0
  17. package/dist/src/application/use-cases/CaptureHighlightUseCase.js +169 -0
  18. package/dist/src/application/use-cases/CaptureHighlightUseCase.js.map +1 -0
  19. package/dist/src/application/use-cases/StartStreamUseCase.d.ts +9 -1
  20. package/dist/src/application/use-cases/StartStreamUseCase.d.ts.map +1 -1
  21. package/dist/src/application/use-cases/StartStreamUseCase.js +125 -2
  22. package/dist/src/application/use-cases/StartStreamUseCase.js.map +1 -1
  23. package/dist/src/application/use-cases/StopStreamUseCase.d.ts +5 -1
  24. package/dist/src/application/use-cases/StopStreamUseCase.d.ts.map +1 -1
  25. package/dist/src/application/use-cases/StopStreamUseCase.js +7 -1
  26. package/dist/src/application/use-cases/StopStreamUseCase.js.map +1 -1
  27. package/dist/src/domain/events/StreamEvent.d.ts +5 -0
  28. package/dist/src/domain/events/StreamEvent.d.ts.map +1 -1
  29. package/dist/src/domain/services/BallReframer.d.ts +35 -0
  30. package/dist/src/domain/services/BallReframer.d.ts.map +1 -0
  31. package/dist/src/domain/services/BallReframer.js +3 -0
  32. package/dist/src/domain/services/BallReframer.js.map +1 -0
  33. package/dist/src/domain/services/FFmpegService.d.ts +6 -2
  34. package/dist/src/domain/services/FFmpegService.d.ts.map +1 -1
  35. package/dist/src/domain/services/HighlightSignalSource.d.ts +113 -0
  36. package/dist/src/domain/services/HighlightSignalSource.d.ts.map +1 -0
  37. package/dist/src/domain/services/HighlightSignalSource.js +3 -0
  38. package/dist/src/domain/services/HighlightSignalSource.js.map +1 -0
  39. package/dist/src/domain/services/SSEService.d.ts +1 -0
  40. package/dist/src/domain/services/SSEService.d.ts.map +1 -1
  41. package/dist/src/infrastructure/config/Config.d.ts +32 -0
  42. package/dist/src/infrastructure/config/Config.d.ts.map +1 -1
  43. package/dist/src/infrastructure/config/Config.js +60 -0
  44. package/dist/src/infrastructure/config/Config.js.map +1 -1
  45. package/dist/src/infrastructure/listeners/SupabaseListener.d.ts +5 -0
  46. package/dist/src/infrastructure/listeners/SupabaseListener.d.ts.map +1 -1
  47. package/dist/src/infrastructure/listeners/SupabaseListener.js +43 -5
  48. package/dist/src/infrastructure/listeners/SupabaseListener.js.map +1 -1
  49. package/dist/src/infrastructure/logging/LogShippingService.d.ts +3 -1
  50. package/dist/src/infrastructure/logging/LogShippingService.d.ts.map +1 -1
  51. package/dist/src/infrastructure/logging/LogShippingService.js +13 -4
  52. package/dist/src/infrastructure/logging/LogShippingService.js.map +1 -1
  53. package/dist/src/infrastructure/logging/RemoteLogger.d.ts +1 -0
  54. package/dist/src/infrastructure/logging/RemoteLogger.d.ts.map +1 -1
  55. package/dist/src/infrastructure/logging/RemoteLogger.js +1 -1
  56. package/dist/src/infrastructure/logging/RemoteLogger.js.map +1 -1
  57. package/dist/src/infrastructure/services/AdDownloaderService.d.ts +85 -0
  58. package/dist/src/infrastructure/services/AdDownloaderService.d.ts.map +1 -0
  59. package/dist/src/infrastructure/services/AdDownloaderService.js +530 -0
  60. package/dist/src/infrastructure/services/AdDownloaderService.js.map +1 -0
  61. package/dist/src/infrastructure/services/AdRotator.d.ts +63 -0
  62. package/dist/src/infrastructure/services/AdRotator.d.ts.map +1 -0
  63. package/dist/src/infrastructure/services/AdRotator.js +223 -0
  64. package/dist/src/infrastructure/services/AdRotator.js.map +1 -0
  65. package/dist/src/infrastructure/services/HighlightBufferManager.d.ts +65 -0
  66. package/dist/src/infrastructure/services/HighlightBufferManager.d.ts.map +1 -0
  67. package/dist/src/infrastructure/services/HighlightBufferManager.js +203 -0
  68. package/dist/src/infrastructure/services/HighlightBufferManager.js.map +1 -0
  69. package/dist/src/infrastructure/services/HighlightBufferRegistry.d.ts +23 -0
  70. package/dist/src/infrastructure/services/HighlightBufferRegistry.d.ts.map +1 -0
  71. package/dist/src/infrastructure/services/HighlightBufferRegistry.js +44 -0
  72. package/dist/src/infrastructure/services/HighlightBufferRegistry.js.map +1 -0
  73. package/dist/src/infrastructure/services/HighlightExtractorService.d.ts +65 -0
  74. package/dist/src/infrastructure/services/HighlightExtractorService.d.ts.map +1 -0
  75. package/dist/src/infrastructure/services/HighlightExtractorService.js +264 -0
  76. package/dist/src/infrastructure/services/HighlightExtractorService.js.map +1 -0
  77. package/dist/src/infrastructure/services/HighlightRendererService.d.ts +38 -0
  78. package/dist/src/infrastructure/services/HighlightRendererService.d.ts.map +1 -0
  79. package/dist/src/infrastructure/services/HighlightRendererService.js +182 -0
  80. package/dist/src/infrastructure/services/HighlightRendererService.js.map +1 -0
  81. package/dist/src/infrastructure/services/NodeFFmpegService.d.ts +6 -4
  82. package/dist/src/infrastructure/services/NodeFFmpegService.d.ts.map +1 -1
  83. package/dist/src/infrastructure/services/NodeFFmpegService.js +154 -32
  84. package/dist/src/infrastructure/services/NodeFFmpegService.js.map +1 -1
  85. package/dist/src/infrastructure/services/NodeSSEService.d.ts +8 -0
  86. package/dist/src/infrastructure/services/NodeSSEService.d.ts.map +1 -1
  87. package/dist/src/infrastructure/services/NodeSSEService.js +71 -27
  88. package/dist/src/infrastructure/services/NodeSSEService.js.map +1 -1
  89. package/dist/src/infrastructure/services/NullBallReframer.d.ts +11 -0
  90. package/dist/src/infrastructure/services/NullBallReframer.d.ts.map +1 -0
  91. package/dist/src/infrastructure/services/NullBallReframer.js +16 -0
  92. package/dist/src/infrastructure/services/NullBallReframer.js.map +1 -0
  93. package/dist/src/infrastructure/services/PythonBallReframer.d.ts +35 -0
  94. package/dist/src/infrastructure/services/PythonBallReframer.d.ts.map +1 -0
  95. package/dist/src/infrastructure/services/PythonBallReframer.js +238 -0
  96. package/dist/src/infrastructure/services/PythonBallReframer.js.map +1 -0
  97. package/dist/src/infrastructure/services/SerialHighlightListener.d.ts +45 -0
  98. package/dist/src/infrastructure/services/SerialHighlightListener.d.ts.map +1 -0
  99. package/dist/src/infrastructure/services/SerialHighlightListener.js +440 -0
  100. package/dist/src/infrastructure/services/SerialHighlightListener.js.map +1 -0
  101. package/dist/src/infrastructure/services/YouTubeUploadService.d.ts +36 -0
  102. package/dist/src/infrastructure/services/YouTubeUploadService.d.ts.map +1 -0
  103. package/dist/src/infrastructure/services/YouTubeUploadService.js +402 -0
  104. package/dist/src/infrastructure/services/YouTubeUploadService.js.map +1 -0
  105. package/dist/src/infrastructure/utils/ResourceSampler.d.ts +47 -0
  106. package/dist/src/infrastructure/utils/ResourceSampler.d.ts.map +1 -0
  107. package/dist/src/infrastructure/utils/ResourceSampler.js +102 -0
  108. package/dist/src/infrastructure/utils/ResourceSampler.js.map +1 -0
  109. package/dist/src/infrastructure/utils/lowPriority.d.ts +29 -0
  110. package/dist/src/infrastructure/utils/lowPriority.d.ts.map +1 -0
  111. package/dist/src/infrastructure/utils/lowPriority.js +31 -0
  112. package/dist/src/infrastructure/utils/lowPriority.js.map +1 -0
  113. package/dist/src/infrastructure/utils/paths.d.ts +27 -0
  114. package/dist/src/infrastructure/utils/paths.d.ts.map +1 -0
  115. package/dist/src/infrastructure/utils/paths.js +69 -0
  116. package/dist/src/infrastructure/utils/paths.js.map +1 -0
  117. package/dist/src/infrastructure/utils/spawnToFile.d.ts +20 -0
  118. package/dist/src/infrastructure/utils/spawnToFile.d.ts.map +1 -0
  119. package/dist/src/infrastructure/utils/spawnToFile.js +98 -0
  120. package/dist/src/infrastructure/utils/spawnToFile.js.map +1 -0
  121. package/dist/src/main.js +228 -2
  122. package/dist/src/main.js.map +1 -1
  123. package/package.json +6 -2
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "streamer-node",
3
- "version": "1.0.30",
3
+ "version": "1.0.37",
4
4
  "description": "A lightweight TypeScript streaming system with Clean Architecture",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -13,7 +13,7 @@
13
13
  "LICENSE"
14
14
  ],
15
15
  "scripts": {
16
- "build": "npx tsc && mkdir -p public && cp -r public dist/",
16
+ "build": "npx tsc && mkdir -p public && cp -r public dist/ && cp -r scripts dist/",
17
17
  "start": "node dist/src/main.js",
18
18
  "dev": "npm run build && npm start",
19
19
  "monitor": "bash -c 'npm run dev 2>&1 | tee >(grep -E \"ERROR|WARN|INFO\" > node.logs) >(grep \"DEBUG\" | grep -v \"frame=\" > ffmpeg.logs)'",
@@ -49,6 +49,10 @@
49
49
  "dotenv": "^16.3.1",
50
50
  "pngjs": "^7.0.0"
51
51
  },
52
+ "optionalDependencies": {
53
+ "@serialport/parser-readline": "^12.0.0",
54
+ "serialport": "^12.0.0"
55
+ },
52
56
  "devDependencies": {
53
57
  "@types/node": "^20.0.0",
54
58
  "@types/pngjs": "^6.0.5",
@@ -0,0 +1,670 @@
1
+ # Global Environment Variables Setup Guide
2
+
3
+ This guide shows how to set global environment variables and use them to create `.env` files automatically for `streamer-node`.
4
+
5
+ ---
6
+
7
+ ## Quick Start
8
+
9
+ ### 1. Set Global Environment Variables
10
+
11
+ ```bash
12
+ # Add to your shell profile
13
+ nano ~/.bashrc
14
+ ```
15
+
16
+ Add these lines at the end:
17
+
18
+ ```bash
19
+ # Streamer Node Configuration
20
+ export GROUND_ID="385136f6-7cf0-4e7f-b601-fea90079c227"
21
+ export CLIENT_IMAGES_PATH="./public/client.png"
22
+ ```
23
+
24
+ Apply changes:
25
+
26
+ ```bash
27
+ source ~/.bashrc
28
+ ```
29
+
30
+ ### 2. Download and Use the Script
31
+
32
+ ```bash
33
+ # Download the script
34
+ curl -sL https://raw.githubusercontent.com/MHA10/drop-shot-streaming-scripts-ubuntu/master/streamer-node-env-setup.sh -o streamer-node-env-setup.sh
35
+
36
+ # Make it executable
37
+ chmod +x streamer-node-env-setup.sh
38
+
39
+ # Run it
40
+ ./streamer-node-env-setup.sh
41
+ ```
42
+
43
+ **What it does:**
44
+ 1. Reads global environment variables
45
+ 2. Creates `.env` file at specified path
46
+ 3. Changes to that directory
47
+ 4. Runs `npx streamer-node@latest`
48
+
49
+ ---
50
+
51
+ ## Detailed Setup
52
+
53
+ ### Option 1: User-Level Environment Variables
54
+
55
+ Best for single-user systems or development.
56
+
57
+ #### Set Variables
58
+
59
+ ```bash
60
+ # Edit .bashrc
61
+ nano ~/.bashrc
62
+ ```
63
+
64
+ Add at the end:
65
+
66
+ ```bash
67
+ # Streamer Node Configuration
68
+ export GROUND_ID="385136f6-7cf0-4e7f-b601-fea90079c227"
69
+ export CLIENT_IMAGES_PATH="./public/client.png"
70
+ ```
71
+
72
+ Apply:
73
+
74
+ ```bash
75
+ source ~/.bashrc
76
+ ```
77
+
78
+ Verify:
79
+
80
+ ```bash
81
+ echo $GROUND_ID
82
+ echo $CLIENT_IMAGES_PATH
83
+ ```
84
+
85
+ ---
86
+
87
+ ### Option 2: System-Wide Environment Variables
88
+
89
+ Best for production servers where multiple users need access.
90
+
91
+ #### Method A: /etc/environment
92
+
93
+ ```bash
94
+ # Edit system environment
95
+ sudo nano /etc/environment
96
+ ```
97
+
98
+ Add:
99
+
100
+ ```bash
101
+ GROUND_ID="385136f6-7cf0-4e7f-b601-fea90079c227"
102
+ CLIENT_IMAGES_PATH="./public/client.png"
103
+ ```
104
+
105
+ **Note:** Requires logout/login or reboot to take effect.
106
+
107
+ #### Method B: /etc/profile.d/
108
+
109
+ ```bash
110
+ # Create a new profile script
111
+ sudo nano /etc/profile.d/streamer-node.sh
112
+ ```
113
+
114
+ Add:
115
+
116
+ ```bash
117
+ #!/bin/bash
118
+ export GROUND_ID="385136f6-7cf0-4e7f-b601-fea90079c227"
119
+ export CLIENT_IMAGES_PATH="./public/client.png"
120
+ ```
121
+
122
+ Make it executable:
123
+
124
+ ```bash
125
+ sudo chmod +x /etc/profile.d/streamer-node.sh
126
+ ```
127
+
128
+ Apply:
129
+
130
+ ```bash
131
+ source /etc/profile.d/streamer-node.sh
132
+ ```
133
+
134
+ ---
135
+
136
+ ## Using the Setup Script
137
+
138
+ ### Basic Usage
139
+
140
+ ```bash
141
+ # Use default path (/opt/streamer-node)
142
+ ./streamer-node-env-setup.sh
143
+
144
+ # Use custom path
145
+ ./streamer-node-env-setup.sh --path /home/ubuntu/streamer
146
+
147
+ # Override environment variables
148
+ ./streamer-node-env-setup.sh --ground-id "new-id" --image "/custom/logo.png"
149
+
150
+ # Only create .env file (don't run service)
151
+ ./streamer-node-env-setup.sh --create-only
152
+ ```
153
+
154
+ ### Command Line Options
155
+
156
+ | Option | Description | Example |
157
+ |--------|-------------|---------|
158
+ | `-p, --path` | Installation path | `--path /opt/streamer-node` |
159
+ | `-g, --ground-id` | Override GROUND_ID | `--ground-id "abc-123"` |
160
+ | `-i, --image` | Override image path | `--image "./logo.png"` |
161
+ | `-c, --create-only` | Only create .env | `--create-only` |
162
+ | `-h, --help` | Show help | `--help` |
163
+
164
+ ---
165
+
166
+ ## Systemd Integration
167
+
168
+ ### Create Service with Script
169
+
170
+ Create systemd service that uses the setup script:
171
+
172
+ ```bash
173
+ sudo nano /etc/systemd/system/streamer-node.service
174
+ ```
175
+
176
+ Add:
177
+
178
+ ```ini
179
+ [Unit]
180
+ Description=Streamer Node Service
181
+ After=network.target network-online.target
182
+ Wants=network-online.target
183
+
184
+ [Service]
185
+ Type=simple
186
+ User=ubuntu
187
+ Group=ubuntu
188
+
189
+ # Run the setup script
190
+ ExecStart=/usr/local/bin/streamer-node-env-setup.sh --path /opt/streamer-node
191
+
192
+ # Restart policy
193
+ Restart=always
194
+ RestartSec=10
195
+
196
+ # Logging
197
+ StandardOutput=journal
198
+ StandardError=journal
199
+ SyslogIdentifier=streamer-node
200
+
201
+ [Install]
202
+ WantedBy=multi-user.target
203
+ ```
204
+
205
+ ### Install the Script System-Wide
206
+
207
+ ```bash
208
+ # Copy script to system location
209
+ sudo cp streamer-node-env-setup.sh /usr/local/bin/
210
+ sudo chmod +x /usr/local/bin/streamer-node-env-setup.sh
211
+ ```
212
+
213
+ ### Enable and Start Service
214
+
215
+ ```bash
216
+ # Reload systemd
217
+ sudo systemctl daemon-reload
218
+
219
+ # Enable service
220
+ sudo systemctl enable streamer-node
221
+
222
+ # Start service
223
+ sudo systemctl start streamer-node
224
+
225
+ # Check status
226
+ sudo systemctl status streamer-node
227
+
228
+ # View logs
229
+ sudo journalctl -u streamer-node -f
230
+ ```
231
+
232
+ ---
233
+
234
+ ## Complete Installation Script
235
+
236
+ Create an all-in-one installation script:
237
+
238
+ ```bash
239
+ nano install-streamer-node.sh
240
+ ```
241
+
242
+ ```bash
243
+ #!/bin/bash
244
+
245
+ set -e
246
+
247
+ echo "=================================="
248
+ echo "Streamer Node Installation"
249
+ echo "=================================="
250
+ echo ""
251
+
252
+ # Check if running as root
253
+ if [ "$EUID" -eq 0 ]; then
254
+ echo "Please run as regular user (with sudo privileges), not as root"
255
+ exit 1
256
+ fi
257
+
258
+ # Prompt for configuration
259
+ read -p "Enter GROUND_ID: " GROUND_ID
260
+ if [ -z "$GROUND_ID" ]; then
261
+ echo "Error: GROUND_ID is required"
262
+ exit 1
263
+ fi
264
+
265
+ read -p "Enter installation path [/opt/streamer-node]: " INSTALL_PATH
266
+ INSTALL_PATH=${INSTALL_PATH:-/opt/streamer-node}
267
+
268
+ # Install Node.js if not present
269
+ if ! command -v node &> /dev/null; then
270
+ echo "Installing Node.js..."
271
+ curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
272
+ sudo apt-get install -y nodejs
273
+ fi
274
+
275
+ # Install FFmpeg if not present
276
+ if ! command -v ffmpeg &> /dev/null; then
277
+ echo "Installing FFmpeg..."
278
+ sudo apt-get update
279
+ sudo apt-get install -y ffmpeg
280
+ fi
281
+
282
+ # Create directories
283
+ echo "Creating directories..."
284
+ sudo mkdir -p $INSTALL_PATH/public
285
+ sudo mkdir -p /var/tmp/stream_registry
286
+ sudo mkdir -p /tmp/stream_registry
287
+ sudo chown -R $USER:$USER $INSTALL_PATH
288
+ sudo chown -R $USER:$USER /var/tmp/stream_registry
289
+
290
+ # Set global environment variables
291
+ echo "Setting up environment variables..."
292
+ if ! grep -q "GROUND_ID" ~/.bashrc; then
293
+ cat >> ~/.bashrc << EOF
294
+
295
+ # Streamer Node Configuration
296
+ export GROUND_ID="$GROUND_ID"
297
+ export CLIENT_IMAGES_PATH="./public/client.png"
298
+ EOF
299
+ source ~/.bashrc
300
+ fi
301
+
302
+ # Download setup script
303
+ echo "Downloading setup script..."
304
+ curl -sL https://raw.githubusercontent.com/MHA10/drop-shot-streaming-scripts-ubuntu/master/streamer-node-env-setup.sh -o /tmp/streamer-node-env-setup.sh
305
+ sudo mv /tmp/streamer-node-env-setup.sh /usr/local/bin/
306
+ sudo chmod +x /usr/local/bin/streamer-node-env-setup.sh
307
+
308
+ # Create systemd service
309
+ echo "Creating systemd service..."
310
+ sudo tee /etc/systemd/system/streamer-node.service > /dev/null << EOF
311
+ [Unit]
312
+ Description=Streamer Node Service
313
+ After=network.target network-online.target
314
+ Wants=network-online.target
315
+
316
+ [Service]
317
+ Type=simple
318
+ User=$USER
319
+ Group=$USER
320
+ Environment="GROUND_ID=$GROUND_ID"
321
+ Environment="CLIENT_IMAGES_PATH=./public/client.png"
322
+ ExecStart=/usr/local/bin/streamer-node-env-setup.sh --path $INSTALL_PATH
323
+ Restart=always
324
+ RestartSec=10
325
+ StandardOutput=journal
326
+ StandardError=journal
327
+ SyslogIdentifier=streamer-node
328
+
329
+ [Install]
330
+ WantedBy=multi-user.target
331
+ EOF
332
+
333
+ # Reload systemd
334
+ echo "Configuring systemd..."
335
+ sudo systemctl daemon-reload
336
+ sudo systemctl enable streamer-node
337
+
338
+ echo ""
339
+ echo "=================================="
340
+ echo "Installation Complete!"
341
+ echo "=================================="
342
+ echo ""
343
+ echo "Configuration:"
344
+ echo " GROUND_ID: $GROUND_ID"
345
+ echo " Installation Path: $INSTALL_PATH"
346
+ echo " Environment Variables: ~/.bashrc"
347
+ echo ""
348
+ echo "Commands:"
349
+ echo " Start: sudo systemctl start streamer-node"
350
+ echo " Stop: sudo systemctl stop streamer-node"
351
+ echo " Status: sudo systemctl status streamer-node"
352
+ echo " Logs: sudo journalctl -u streamer-node -f"
353
+ echo ""
354
+ echo "Manual run:"
355
+ echo " streamer-node-env-setup.sh --path $INSTALL_PATH"
356
+ echo ""
357
+ echo "To apply environment variables in current session:"
358
+ echo " source ~/.bashrc"
359
+ echo ""
360
+ ```
361
+
362
+ Make it executable and run:
363
+
364
+ ```bash
365
+ chmod +x install-streamer-node.sh
366
+ ./install-streamer-node.sh
367
+ ```
368
+
369
+ ---
370
+
371
+ ## Managing Multiple Grounds
372
+
373
+ ### Set Multiple Ground IDs
374
+
375
+ ```bash
376
+ # In ~/.bashrc
377
+ export GROUND_ID_1="ground-1-id"
378
+ export GROUND_ID_2="ground-2-id"
379
+ export GROUND_ID_3="ground-3-id"
380
+ ```
381
+
382
+ ### Create Services for Each Ground
383
+
384
+ ```bash
385
+ # Ground 1
386
+ streamer-node-env-setup.sh --path /opt/streamer-ground1 --ground-id "$GROUND_ID_1" --create-only
387
+
388
+ # Ground 2
389
+ streamer-node-env-setup.sh --path /opt/streamer-ground2 --ground-id "$GROUND_ID_2" --create-only
390
+
391
+ # Ground 3
392
+ streamer-node-env-setup.sh --path /opt/streamer-ground3 --ground-id "$GROUND_ID_3" --create-only
393
+ ```
394
+
395
+ ### Create Systemd Services
396
+
397
+ ```bash
398
+ # Service for Ground 1
399
+ sudo nano /etc/systemd/system/streamer-node-ground1.service
400
+ ```
401
+
402
+ ```ini
403
+ [Unit]
404
+ Description=Streamer Node Service - Ground 1
405
+
406
+ [Service]
407
+ Type=simple
408
+ User=ubuntu
409
+ Environment="GROUND_ID=ground-1-id"
410
+ Environment="CLIENT_IMAGES_PATH=./public/client.png"
411
+ ExecStart=/usr/local/bin/streamer-node-env-setup.sh --path /opt/streamer-ground1
412
+ Restart=always
413
+ RestartSec=10
414
+
415
+ [Install]
416
+ WantedBy=multi-user.target
417
+ ```
418
+
419
+ Enable and start:
420
+
421
+ ```bash
422
+ sudo systemctl daemon-reload
423
+ sudo systemctl enable streamer-node-ground1
424
+ sudo systemctl start streamer-node-ground1
425
+ ```
426
+
427
+ ---
428
+
429
+ ## Updating Configuration
430
+
431
+ ### Change GROUND_ID
432
+
433
+ #### Method 1: Update Global Variable
434
+
435
+ ```bash
436
+ # Edit .bashrc
437
+ nano ~/.bashrc
438
+
439
+ # Change the GROUND_ID line
440
+ export GROUND_ID="new-ground-id"
441
+
442
+ # Apply
443
+ source ~/.bashrc
444
+
445
+ # Recreate .env and restart
446
+ streamer-node-env-setup.sh --create-only
447
+ sudo systemctl restart streamer-node
448
+ ```
449
+
450
+ #### Method 2: Override in Service
451
+
452
+ ```bash
453
+ # Edit service
454
+ sudo nano /etc/systemd/system/streamer-node.service
455
+
456
+ # Change Environment line
457
+ Environment="GROUND_ID=new-ground-id"
458
+
459
+ # Reload and restart
460
+ sudo systemctl daemon-reload
461
+ sudo systemctl restart streamer-node
462
+ ```
463
+
464
+ ### Change Client Image
465
+
466
+ ```bash
467
+ # Copy new image
468
+ cp /path/to/new-logo.png /opt/streamer-node/public/client.png
469
+
470
+ # Restart service
471
+ sudo systemctl restart streamer-node
472
+ ```
473
+
474
+ ---
475
+
476
+ ## Verification
477
+
478
+ ### Check Environment Variables
479
+
480
+ ```bash
481
+ # Check current values
482
+ echo $GROUND_ID
483
+ echo $CLIENT_IMAGES_PATH
484
+
485
+ # Check all environment
486
+ env | grep -E 'GROUND_ID|CLIENT_IMAGES_PATH'
487
+ ```
488
+
489
+ ### Check .env File
490
+
491
+ ```bash
492
+ # View .env file
493
+ cat /opt/streamer-node/.env
494
+
495
+ # Check if file exists
496
+ ls -la /opt/streamer-node/.env
497
+ ```
498
+
499
+ ### Verify Service Configuration
500
+
501
+ ```bash
502
+ # Check service environment
503
+ sudo systemctl show streamer-node -p Environment
504
+
505
+ # Check service status
506
+ sudo systemctl status streamer-node
507
+
508
+ # Check logs
509
+ sudo journalctl -u streamer-node -n 50
510
+ ```
511
+
512
+ ---
513
+
514
+ ## Testing
515
+
516
+ ### Test Script Manually
517
+
518
+ ```bash
519
+ # Test with default settings
520
+ ./streamer-node-env-setup.sh --create-only
521
+
522
+ # Verify .env was created
523
+ cat /opt/streamer-node/.env
524
+
525
+ # Test running
526
+ cd /opt/streamer-node
527
+ npx streamer-node@latest
528
+ ```
529
+
530
+ ### Test Different Configurations
531
+
532
+ ```bash
533
+ # Test custom path
534
+ ./streamer-node-env-setup.sh --path /tmp/test-streamer --create-only
535
+
536
+ # Test override
537
+ ./streamer-node-env-setup.sh --ground-id "test-123" --create-only
538
+
539
+ # Check results
540
+ cat /tmp/test-streamer/.env
541
+ ```
542
+
543
+ ---
544
+
545
+ ## Troubleshooting
546
+
547
+ ### Environment Variables Not Set
548
+
549
+ **Problem:** Script says "GROUND_ID is not set"
550
+
551
+ **Solution:**
552
+ ```bash
553
+ # Check if variables are set
554
+ echo $GROUND_ID
555
+
556
+ # If empty, source the profile
557
+ source ~/.bashrc
558
+
559
+ # Or set them temporarily
560
+ export GROUND_ID="your-ground-id"
561
+ export CLIENT_IMAGES_PATH="./public/client.png"
562
+ ```
563
+
564
+ ### .env File Not Created
565
+
566
+ **Problem:** .env file doesn't exist
567
+
568
+ **Solution:**
569
+ ```bash
570
+ # Check directory exists
571
+ ls -la /opt/streamer-node
572
+
573
+ # Check permissions
574
+ ls -ld /opt/streamer-node
575
+
576
+ # Create directory if needed
577
+ sudo mkdir -p /opt/streamer-node
578
+ sudo chown $USER:$USER /opt/streamer-node
579
+
580
+ # Run script again
581
+ ./streamer-node-env-setup.sh --create-only
582
+ ```
583
+
584
+ ### Service Doesn't Start
585
+
586
+ **Problem:** systemctl start fails
587
+
588
+ **Solution:**
589
+ ```bash
590
+ # Check service status
591
+ sudo systemctl status streamer-node
592
+
593
+ # Check logs
594
+ sudo journalctl -u streamer-node -n 100
595
+
596
+ # Verify script exists
597
+ ls -la /usr/local/bin/streamer-node-env-setup.sh
598
+
599
+ # Test script manually
600
+ /usr/local/bin/streamer-node-env-setup.sh --create-only
601
+ ```
602
+
603
+ ### npx Command Not Found
604
+
605
+ **Problem:** "npx: command not found"
606
+
607
+ **Solution:**
608
+ ```bash
609
+ # Install Node.js
610
+ curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
611
+ sudo apt-get install -y nodejs
612
+
613
+ # Verify installation
614
+ node --version
615
+ npm --version
616
+ npx --version
617
+ ```
618
+
619
+ ---
620
+
621
+ ## Advantages of This Approach
622
+
623
+ ✅ **Centralized Configuration** - Environment variables defined once, used everywhere
624
+ ✅ **Easy Updates** - Change global variables, recreate .env
625
+ ✅ **Multi-Ground Support** - Different variables for different instances
626
+ ✅ **Service Integration** - Works seamlessly with systemd
627
+ ✅ **Override Capability** - Can override via command line
628
+ ✅ **Development Friendly** - Easy to test locally
629
+
630
+ ---
631
+
632
+ ## Quick Reference
633
+
634
+ ### Set Variables
635
+ ```bash
636
+ echo 'export GROUND_ID="your-id"' >> ~/.bashrc
637
+ echo 'export CLIENT_IMAGES_PATH="./public/client.png"' >> ~/.bashrc
638
+ source ~/.bashrc
639
+ ```
640
+
641
+ ### Install Script
642
+ ```bash
643
+ curl -sL https://raw.githubusercontent.com/.../streamer-node-env-setup.sh -o /tmp/setup.sh
644
+ sudo mv /tmp/setup.sh /usr/local/bin/streamer-node-env-setup.sh
645
+ sudo chmod +x /usr/local/bin/streamer-node-env-setup.sh
646
+ ```
647
+
648
+ ### Run
649
+ ```bash
650
+ # Default
651
+ streamer-node-env-setup.sh
652
+
653
+ # Custom path
654
+ streamer-node-env-setup.sh --path /opt/streamer-node
655
+
656
+ # Only create .env
657
+ streamer-node-env-setup.sh --create-only
658
+ ```
659
+
660
+ ### Service
661
+ ```bash
662
+ sudo systemctl start streamer-node
663
+ sudo systemctl status streamer-node
664
+ sudo journalctl -u streamer-node -f
665
+ ```
666
+
667
+ ---
668
+
669
+ **Last Updated:** October 2025
670
+ **Version:** 1.0.0