@@ -213,262 +213,74 @@ cd application/
213
213
docker compose logs tracker
214
214
` ` `
215
215
216
- 3. **Local Functionality Testing ** :
216
+ **Expected Output **:
217
217
218
218
` ` ` bash
219
- # Test tracker announce functionality locally
220
- curl -v "http://localhost:7070/announce?info_hash=1234567890123456789012345678901234567890&peer_id=1234567890123456789&port=6881&uploaded=0&downloaded=0&left=1000&event=started"
221
-
222
- # Connect to MySQL and verify data
223
- docker compose exec mysql mysql -u torrust -p torrust_tracker
224
- # Check if tables were created automatically by tracker
219
+ # Verify tracker is running and connected to MySQL
220
+ docker compose logs tracker | grep "Successfully connected to database"
225
221
` ` `
226
222
227
- **Manual Database Connection Verification**:
228
-
229
- To confirm the tracker could write to the database, we manually added a
230
- torrent to the whitelist via the API and then checked the database.
231
-
232
- 1. **Whitelist a torrent via API** :
233
-
234
- ` ` ` bash
235
- curl -X POST "http://127.0.0.1:1212/api/v1/whitelist/5452869be36f9f3350ccee6b4544e7e76caaadab?token=MyLocalAdminToken"
236
- ` ` `
237
-
238
- 2. **Verify the record in the `whitelist` table** :
239
-
240
- ` ` ` bash
241
- docker compose exec mysql mysql -u torrust \
242
- -pmy_super_secret_password torrust_tracker -e "SELECT * FROM whitelist;"
243
- ` ` `
244
-
245
- This confirmed that the tracker was successfully connected to and could write to the MySQL database.
246
-
247
- 4. **Local Data Persistence Testing** :
248
-
249
- ` ` ` bash
250
- # Make announce request, restart services, verify data persists
251
- docker compose restart tracker
252
- docker compose restart mysql
253
-
254
- # Verify data is still there
255
- docker compose exec mysql mysql -u torrust -p torrust_tracker -e "SHOW TABLES;"
256
- ` ` `
257
-
258
- # ## Phase 2: VM Integration Testing
259
-
260
- **Prerequisites**:
261
-
262
- ` ` ` bash
263
- # Ensure local testing environment is ready
264
- make test-prereq
265
- ` ` `
266
-
267
- **VM Testing Steps**:
223
+ 3. **Local Data Persistence Testing** :
268
224
269
- 1. **Clean Deployment Test** :
225
+ - **Status**: ✅ **Completed**
226
+ - **Verification**: Data persists in MySQL after service restarts.
270
227
271
228
` ` ` bash
272
- make destroy # Clean any existing VMs
273
- make apply # Deploy with new MySQL configuration
274
- ` ` `
229
+ # Restart services
230
+ docker compose restart
275
231
276
- 2. **Service Health Check** :
277
-
278
- ` ` ` bash
279
- make ssh
280
- cd /home/torrust/github/torrust/torrust-tracker-demo
281
- docker compose ps # Verify all services are running
282
- docker compose logs mysql # Check MySQL startup logs
283
- docker compose logs tracker # Check tracker connection logs
232
+ # Verify tables still exist in MySQL
233
+ docker compose exec mysql mysql -u torrust -p<YOUR_PASSWORD> torrust_tracker -e "SHOW TABLES;"
284
234
` ` `
285
235
286
- 3 . **Database Connectivity Test ** :
236
+ 4 . **VM Integration Testing ** :
287
237
288
- ` ` ` bash
289
- # Connect to MySQL and verify database exists
290
- docker compose exec mysql mysql -u torrust -p torrust_tracker
291
- # Should connect successfully and show database with tracker tables
292
- ` ` `
293
-
294
- 4. **Functional Testing** :
238
+ - **Status**: ⬜ **Pending**
239
+ - **Description**: Deploy the complete stack on a local VM to test the full
240
+ infrastructure integration.
295
241
296
242
` ` ` bash
297
- # Test tracker announce functionality
298
- curl -v "http://localhost:7070/announce?info_hash=1234567890123456789012345678901234567890&peer_id=1234567890123456789&port=6881&uploaded=0&downloaded=0&left=1000&event=started"
243
+ # From the repository root
244
+ make apply # Deploy VM
245
+ make ssh # Connect to VM
246
+ # Run smoke tests from the smoke testing guide
299
247
` ` `
300
248
301
- 5. **Data Persistence Test** :
302
-
303
- ` ` ` bash
304
- # Make announce request, restart services, verify data persists
305
- docker compose restart tracker
306
- # Check if torrent data is still in MySQL
307
- ` ` `
308
-
309
- # ## Validation Checklist
310
-
311
- - [x] **MySQL Service** :
312
-
313
- - [x] MySQL container starts successfully
314
- - [x] Database `torrust_tracker` is created
315
- - [x] User `torrust` can connect with provided credentials
316
- - [x] Character set is `utf8mb4` with `utf8mb4_unicode_ci` collation
317
-
318
- - [x] **Tracker Service** :
319
-
320
- - [x] Tracker connects to MySQL without errors
321
- - [x] Tracker logs show successful database connection
322
- - [x] Database tables are created automatically by tracker
323
- - [x] No SQLite-related errors in logs
324
-
325
- - [x] **Functional Testing** :
249
+ # ## Phase 2: Documentation and Cleanup
326
250
327
- - [x] Announce requests work correctly
328
- - [x] Data is written to MySQL tables (automatically created)
329
- - [ ] Scrape requests return correct data
330
- - [ ] Download counters increment properly
251
+ **Status**: ⬜ **Pending**
331
252
332
- - [x] **Integration Testing** :
253
+ **Description**: Update all relevant documentation to reflect the MySQL migration and
254
+ remove any outdated SQLite references.
333
255
334
- - [ ] Grafana can access tracker metrics
335
- - [ ] Prometheus monitoring continues to work
336
- - [ ] Nginx proxy serves tracker API correctly
337
-
338
- - [x] **Persistence Testing** :
339
-
340
- - [ ] Data survives tracker service restart
341
- - [ ] Data survives MySQL service restart
342
- - [ ] Data survives complete stack restart
343
- - [ ] Database schema is maintained across restarts
344
-
345
- # # 🔄 Implementation Order
346
-
347
- # ## Phase A: Service Configuration (No Breaking Changes)
348
-
349
- 1. Add MySQL service to `compose.yaml`
350
- 2. Create MySQL initialization directory and README
351
- 3. Update environment variables in `.env.production`
352
- 4. Test MySQL service starts independently (local Docker Compose)
353
-
354
- # ## Phase B: Tracker Integration (Local Testing)
355
-
356
- 1. Update tracker configuration in `tracker.toml`
357
- 2. Add tracker environment variable overrides
358
- 3. Update service dependencies
359
- 4. **Test complete stack deployment locally with Docker Compose**
360
- 5. Verify database tables are created automatically by tracker
361
- 6. Validate announce/scrape functionality locally
362
-
363
- # ## Phase C: VM Integration Testing
364
-
365
- 1. Deploy to VM using `make apply`
366
- 2. Run comprehensive testing on VM environment
367
- 3. Validate against all acceptance criteria
368
- 4. Document any differences between local and VM environments
369
-
370
- # ## Phase D: Documentation and Finalization
371
-
372
- 1. Update documentation files
373
- 2. Document local vs VM testing procedures
374
- 3. Create troubleshooting guide
375
- 4. Document any migration notes
376
-
377
- # # 📁 File Change Summary
378
-
379
- ` ` ` text
380
- application/
381
- ├── compose.yaml # Add MySQL service, update tracker deps
382
- ├── .env.production # Add MySQL environment variables
383
- ├── storage/
384
- │ ├── tracker/
385
- │ │ └── etc/
386
- │ │ └── tracker.toml # Update database configuration
387
- │ └── mysql/ # New directory
388
- │ └── init/ # New directory
389
- │ └── README.md # New file (documentation only)
390
- ├── README.md # Update database requirements
391
- └── docs/
392
- ├── production-setup.md # Add MySQL setup instructions
393
- └── deployment.md # Update deployment procedures
394
- ` ` `
395
-
396
- **Note**: No SQL migration scripts needed - Torrust Tracker handles database migrations automatically.
397
-
398
- # # 🔍 Pre-Implementation Research
399
-
400
- # ## Torrust Tracker MySQL Requirements
401
-
402
- **Research Completed**:
403
-
404
- - ✅ Torrust Tracker MySQL driver support confirmed
405
- - ✅ MySQL connection string format : ` mysql://user:password@host:port/database`
406
- - ✅ Configuration uses single `path` parameter, not individual connection fields
407
- - ✅ Database migrations are handled automatically by tracker
408
-
409
- **Key Findings**:
410
-
411
- 1. **Automatic Migrations** : Torrust Tracker handles database migrations automatically
412
- through built-in migration system in database drivers
413
- 2. **Connection Format** : Uses MySQL connection string in `path` field
414
- 3. **Table Creation** : Tables are created automatically on tracker startup
415
- 4. **No Manual Setup** : No manual schema setup or migration scripts required
416
-
417
- # ## Environment Variable Validation
418
-
419
- **Research Tasks**:
420
-
421
- - [ ] Verify exact environment variable names used by Torrust Tracker
422
- - [ ] Test environment variable override behavior with connection string format
423
- - [ ] Confirm configuration precedence (file vs environment)
424
-
425
- # # 🚨 Risk Assessment
426
-
427
- # ## High Risk Items
428
-
429
- - **Database connection failures**: Ensure proper networking between services
430
- - **Character set issues**: UTF-8 handling for torrent names and peer data
431
- - **Environment variable conflicts**: Ensure no conflicting configurations
432
-
433
- # ## Medium Risk Items
434
-
435
- - **Performance differences**: MySQL vs SQLite performance characteristics
436
- - **Volume permissions**: Ensure MySQL data directory has correct permissions
437
- - **Service startup timing**: MySQL must be ready before tracker starts
438
-
439
- # ## Low Risk Items
440
-
441
- - **Documentation gaps**: Missing or unclear setup instructions
442
- - **Development environment differences**: Local vs production environment parity
443
-
444
- # # 🎯 Success Criteria
445
-
446
- # ## Must Have
256
+ **Files to Update**:
447
257
448
- - [ ] MySQL service starts and is accessible
449
- - [ ] Tracker connects to MySQL successfully
450
- - [ ] Basic announce/scrape functionality works
451
- - [ ] Data persists across service restarts
452
- - [ ] All existing functionality continues to work
258
+ - ` application/README.md`
259
+ - ` application/docs/production-setup.md`
260
+ - ` docs/guides/smoke-testing-guide.md` (if it contains database-specific instructions)
261
+ - ` .github/copilot-instructions.md` (ensure it reflects current best practices)
453
262
454
- # ## Should Have
263
+ # # ✅ Completion Checklist
455
264
456
- - [ ] Performance is equivalent to SQLite
457
- - [ ] Comprehensive documentation is updated
458
- - [ ] Migration path from SQLite is documented
459
- - [ ] Local testing environment works reliably
265
+ - [x] MySQL service added to `compose.yaml`
266
+ - [x] Environment variables configured in `.env.production`
267
+ - [x] Tracker `tracker.toml` defaults to MySQL
268
+ - [x] MySQL initialization directory documented
269
+ - [x] Docker Compose service dependencies updated
270
+ - [x] Local functionality testing passed
271
+ - [x] Local data persistence testing passed
272
+ - [ ] VM integration testing passed
273
+ - [ ] All documentation updated
274
+ - [ ] Old SQLite configurations removed or documented as legacy
275
+ - [ ] Final PR reviewed and approved
460
276
461
- # ## Nice to Have
277
+ # # Rollback Plan
462
278
463
- - [ ] Database monitoring via Grafana
464
- - [ ] Automated database backup considerations
465
- - [ ] Performance optimization notes
279
+ If critical issues arise, the following steps can be taken to revert to SQLite :
466
280
467
- # # 📚 References
281
+ 1. **Revert `compose.yaml`** : Remove the MySQL service and dependencies.
282
+ 2. **Revert `.env.production`** : Restore SQLite environment variables.
283
+ 3. **Revert `tracker.toml`** : Set the database driver back to `sqlite3`.
284
+ 4. **Restart Services** : Run `docker compose up -d --force-recreate`.
468
285
469
- - [Torrust Tracker Documentation](https://docs.rs/torrust-tracker/)
470
- - [Torrust Tracker MySQL Configuration Example](https://github.com/torrust/torrust-tracker/blob/develop/share/default/config/tracker.container.mysql.toml)
471
- - [Torrust Tracker MySQL Driver Source](https://github.com/torrust/torrust-tracker/blob/develop/packages/tracker-core/src/databases/driver/mysql.rs)
472
- - [MySQL 8.0 Documentation](https://dev.mysql.com/doc/refman/8.0/en/)
473
- - [Docker Compose Networking](https://docs.docker.com/compose/networking/)
474
- - [Migration Plan](../plans/hetzner-migration-plan.md)
286
+ This ensures a quick rollback path if the MySQL integration causes unforeseen problems.
0 commit comments