Conversation
…L`, update Dockerfiles for exec jars - Updated SQL migration scripts to use `BIGSERIAL` instead of `BIGINT AUTO_INCREMENT` for consistency with PostgreSQL conventions. - Updated Dockerfiles to copy exec jar versions of Spring Boot applications (`*-exec.jar`).
Added documentation for running E2E tests with Testcontainers: - Created docs/how-to/running-e2e-tests.md with: - Prerequisites and setup instructions - Commands for running all tests and specific test classes - Test categories (basic vs integration) - Container images used - Troubleshooting common issues - Updated docs/explanation/architecture.md with: - Test module structure (bottin-it, bottin-e2e) - E2E test infrastructure overview - Maven test profiles - nsecbunker-java integration tests - Updated docs/README.md to link new how-to guide Documentation follows Diataxis framework principles. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The domains.html template was trying to access `domain.records.size()` but DomainData has `recordCount` (an int field), not a `records` list. This caused a 500 Internal Server Error when viewing the domains list in the Admin Dashboard. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Updated docker-compose.yml to use pre-built images from docker.398ja.xyz registry instead of building locally. This allows faster deployments by pulling the latest images. Changes: - Use docker.398ja.xyz/bottin-web:latest for bottin-web service - Use docker.398ja.xyz/bottin-admin-ui:latest for bottin-admin service - Commented out local build configuration (can be uncommented if needed) - Removed obsolete version attribute 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The admin security configuration was hardcoding username/password as admin/admin, ignoring the BOTTIN_ADMIN_USER and BOTTIN_ADMIN_PASSWORD environment variables set in docker-compose.yml. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Change from ${BOTTIN_ADMIN_PASSWORD:admin} to ${bottin.admin.password:admin}
to properly bind the BOTTIN_ADMIN_PASSWORD environment variable via Spring
Boot's relaxed binding.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix incorrect verification paths in domain-detail template:
- DNS: _bottin-verification.{domain} (not _nostr-verification)
- File: /.well-known/bottin-verification.txt (not nostr-verification)
- Show correct TXT record value format: bottin-verification={token}
- Display current verification method
- Allow changing method after initial selection
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace ./mvnw with mvn since the Maven wrapper is not present in the repository. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
This pull request addresses admin defects, introduces CI/CD configuration, and enhances documentation. It fixes critical issues in the admin UI including domain verification instructions and template field mismatches, enables environment variable configuration for admin credentials, and updates database migrations for PostgreSQL compatibility. The PR also adds comprehensive E2E testing documentation and introduces several GitHub Actions workflows for CI, code formatting, and commit linting.
Key changes:
- Fixed admin UI defects including domain verification method display and template field corrections
- Enabled environment-based configuration for admin credentials (replacing hardcoded values)
- Updated SQL migrations to use PostgreSQL
BIGSERIALinstead of MySQLAUTO_INCREMENT
Reviewed changes
Copilot reviewed 19 out of 19 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| docs/how-to/running-e2e-tests.md | Added comprehensive guide for running E2E tests with Testcontainers |
| docs/explanation/architecture.md | Expanded architecture documentation with testing module structure |
| docs/README.md | Added link to new E2E testing guide |
| docker-compose.yml | Updated to use registry images for faster deployment |
| bottin-persistence/src/main/resources/db/migration/V1__initial_schema.sql | Changed from MySQL AUTO_INCREMENT to PostgreSQL BIGSERIAL |
| bottin-persistence/src/main/resources/db/migration/V2__domain_verification_logs.sql | Changed from MySQL AUTO_INCREMENT to PostgreSQL BIGSERIAL |
| bottin-admin-ui/src/main/resources/templates/admin/domains.html | Fixed template field from domain.records.size() to domain.recordCount |
| bottin-admin-ui/src/main/resources/templates/admin/domain-detail.html | Updated domain verification instructions to show method-specific guidance |
| bottin-admin-ui/src/main/java/xyz/tcheeric/bottin/admin/controller/RootRedirectController.java | Added controller to redirect root path to admin dashboard |
| bottin-admin-ui/src/main/java/xyz/tcheeric/bottin/admin/config/AdminSecurityConfig.java | Enabled environment variable configuration for admin username and password |
| Dockerfile.web | Updated to copy correct Spring Boot executable JAR (*-exec.jar) |
| Dockerfile.admin | Updated to copy correct Spring Boot executable JAR (*-exec.jar) |
| .github/workflows/ci.yml | Added CI workflow with build and E2E test jobs |
| .github/workflows/qodana.yml | Added Qodana code quality analysis workflow |
| .github/workflows/google-java-format.yml | Added Java code formatting workflow |
| .github/workflows/enforce_conventional_commits.yml | Added conventional commit message enforcement |
| .github/pull_request_template.md | Added PR template with standard sections |
| .github/dependabot.yml | Added Dependabot configuration for Maven and GitHub Actions |
| .github/copilot-instructions.md | Added GitHub Copilot instructions for the repository |
Comments suppressed due to low confidence (1)
docker-compose.yml:48
- The environment variable name
BOTTIN_ADMIN_USERin docker-compose.yml does not match the property name expected by AdminSecurityConfig. The config reads frombottin.admin.username(line 27), but the environment variableBOTTIN_ADMIN_USERwould map tobottin.admin.userin Spring Boot's relaxed binding. The environment variable should be renamed toBOTTIN_ADMIN_USERNAMEto properly match the propertybottin.admin.username.
- BOTTIN_ADMIN_USER=${BOTTIN_ADMIN_USER:-admin}
- BOTTIN_ADMIN_PASSWORD=${BOTTIN_ADMIN_PASSWORD:-changeme}
- BOTTIN_DEFAULT_DOMAIN=${BOTTIN_DEFAULT_DOMAIN:-}
- BOTTIN_API_DOCS_ENABLED=${BOTTIN_API_DOCS_ENABLED:-false}
- BOTTIN_SWAGGER_ENABLED=${BOTTIN_SWAGGER_ENABLED:-false}
depends_on:
postgres:
condition: service_healthy
restart: unless-stopped
healthcheck:
test: ["CMD", "wget", "-q", "--spider", "http://localhost:8080/actuator/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
networks:
- bottin-network
bottin-admin:
image: docker.398ja.xyz/bottin-admin-ui:latest
# To build locally instead, uncomment:
# build:
# context: .
# dockerfile: Dockerfile.admin
container_name: bottin-admin
ports:
- "${BOTTIN_ADMIN_PORT:-8081}:8081"
environment:
- SPRING_PROFILES_ACTIVE=prod
- BOTTIN_DATABASE_URL=jdbc:postgresql://postgres:5432/bottin
- BOTTIN_DATABASE_USER=bottin
- BOTTIN_DATABASE_PASSWORD=${BOTTIN_DATABASE_PASSWORD:-bottin}
- BOTTIN_ADMIN_USER=${BOTTIN_ADMIN_USER:-admin}
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Qodana for JVM146 new problems were found
☁️ View the detailed Qodana report Detected 118 dependenciesThird-party software listThis page lists the third-party software dependencies used in project
Contact Qodana teamContact us at qodana-support@jetbrains.com
|
Replace incorrect Cashu reference with Bottin/NIP-05/Nostr context. Add Spring Boot and NIP-05 guidelines. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Link to NIP-05 specification on GitHub - Reference .commitlintrc.yml for commit message rules - Reorganize into sections for better readability 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace BIGINT AUTO_INCREMENT with BIGSERIAL in SQL migration scripts. Update Dockerfiles to copy executable jar versions of Spring Boot apps.
Added documentation for running E2E tests with Testcontainers: - Created docs/how-to/running-e2e-tests.md with: - Prerequisites and setup instructions - Commands for running all tests and specific test classes - Test categories (basic vs integration) - Container images used - Troubleshooting common issues - Updated docs/explanation/architecture.md with: - Test module structure (bottin-it, bottin-e2e) - E2E test infrastructure overview - Maven test profiles - nsecbunker-java integration tests - Updated docs/README.md to link new how-to guide Documentation follows Diataxis framework principles. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The domains.html template was trying to access `domain.records.size()` but DomainData has `recordCount` (an int field), not a `records` list. This caused a 500 Internal Server Error when viewing the domains list in the Admin Dashboard. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Updated docker-compose.yml to use pre-built images from docker.398ja.xyz registry instead of building locally. This allows faster deployments by pulling the latest images. Changes: - Use docker.398ja.xyz/bottin-web:latest for bottin-web service - Use docker.398ja.xyz/bottin-admin-ui:latest for bottin-admin service - Commented out local build configuration (can be uncommented if needed) - Removed obsolete version attribute 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The admin security configuration was hardcoding username/password as admin/admin, ignoring the BOTTIN_ADMIN_USER and BOTTIN_ADMIN_PASSWORD environment variables set in docker-compose.yml. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Change from ${BOTTIN_ADMIN_PASSWORD:admin} to ${bottin.admin.password:admin}
to properly bind the BOTTIN_ADMIN_PASSWORD environment variable via Spring
Boot's relaxed binding.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix incorrect verification paths in domain-detail template:
- DNS: _bottin-verification.{domain} (not _nostr-verification)
- File: /.well-known/bottin-verification.txt (not nostr-verification)
- Show correct TXT record value format: bottin-verification={token}
- Display current verification method
- Allow changing method after initial selection
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace ./mvnw with mvn since the Maven wrapper is not present in the repository. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace incorrect Cashu reference with Bottin/NIP-05/Nostr context. Add Spring Boot and NIP-05 guidelines. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Link to NIP-05 specification on GitHub - Reference .commitlintrc.yml for commit message rules - Reorganize into sections for better readability 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Upgrade axel-op/googlejavaformat-action from v4 to v5 - Update JDK from 17 to 21 for project consistency - Update actions/setup-java from v4 to v5 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Correct contradiction: E2E tests use PostgreSQL via Testcontainers, not H2 in-memory as previously stated. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
# Conflicts: # .github/workflows/google-java-format.yml # docs/how-to/running-e2e-tests.md
v5 does not exist; revert to v4 while keeping JDK 21. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace detailed API endpoint tables in README with summary and link to docs/reference/rest-api.md to avoid duplication. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace gateway-plugin references (from different project) with actual Bottin E2E tests: - Use bottin-tests/bottin-e2e module - Use -Pe2e Maven profile - Remove Phoenix/autopay environment variables - Testcontainers handles infrastructure (no docker-compose needed) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
E2E tests require Docker and Testcontainers which may not be suitable for CI environment. Run E2E tests locally with: mvn -Pe2e test 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix potential null pointer in GlobalExceptionHandler.java:107 when getSupportedMethods() returns null - Upgrade Spring Boot 3.2.4 → 3.4.1 to fix multiple CVEs: - Tomcat CVE-2024-52316 (9.8), CVE-2025-24813 (9.8) - Spring Security CVE-2024-38821 (9.1) - Spring Framework CVE-2024-22262 (8.1) - And many other transitive dependency vulnerabilities - Upgrade dnsjava 3.5.3 → 3.6.0 to fix CVE-2024-25638 (8.9) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Address Qodana LoggingSimilarMessage findings by making log messages
unique:
ExternalNip05Verifier.java:
- Differentiate cached vs nocache verification paths
- external_nip05_cached_* for verify() method
- external_nip05_nocache_* for verifyNoCache() method
DomainController.java:
- Differentiate body vs path parameter verification endpoints
- verification_*_via_body for POST /{id}/verify with request body
- verification_*_via_path for POST /{id}/verify/{method}
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Update project version from 0.1.0-SNAPSHOT to 0.1.0 across all modules and documentation. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Configure jib-maven-plugin to automatically push Docker images to docker.398ja.xyz when running `mvn deploy` for bottin-web and bottin-admin-ui modules. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Document that `mvn deploy` now automatically pushes Docker images to the registry. Add credentials configuration example and reorganize the Jib section to highlight the recommended workflow. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Remove unused conversion methods (toNip05Record, fromNip05Record) from Nip05RecordData and the nsecbunker-account dependency from bottin-core. The nsecbunker integration is now entirely contained in bottin-spring-boot-starter, which implements the SPI interfaces directly from entity conversions. This keeps bottin-core independent of external integration concerns. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add @Profile("!e2e") to SecurityConfig to prevent it from loading during E2E tests, avoiding conflict with TestSecurityConfig. Also add explicit PostgreSQLDialect to e2e config for proper DDL generation. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Update README.md: - Update Docker build section for mvn deploy workflow - Add -DskipE2ETests=false flag to E2E test command - Fix DNS TXT record path to match actual service behavior Fix verification instructions consistency: - Update VerificationChallenge to use _bottin-verification. prefix - Update VerificationMethod enum DNS location - Update VerificationFailedException suggestion message - All now match DnsVerificationService actual behavior 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Description
This pull request includes several fixes, improvements, and a new CI configuration:
Fixes:
Enhancements:
docker-compose.ymlto use registry images for faster deployments.BIGSERIAL.Documentation:
New Feature: