Compare commits
14 Commits
fe060c1627
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 32925396dc | |||
| 639648647e | |||
| eec43f84b6 | |||
| 9793f99991 | |||
| 11aac9ffc8 | |||
| 733a38304f | |||
| 38e75fb549 | |||
| f7c344e429 | |||
| 8a09aaede4 | |||
| 3aaf98267d | |||
| 9877a53291 | |||
| 8f133b9df4 | |||
| fdd115e740 | |||
| 9e86ae885a |
570
AGENTS.md
570
AGENTS.md
@@ -1,290 +1,384 @@
|
|||||||
# TSYS Cloudron Packaging Project - AI Agent Context
|
# AI AGENTS - TSYSDevStack-SupportStack-Cloudron Project
|
||||||
|
|
||||||
This file contains important context, guidelines, and decisions made during the development of the TSYS Cloudron Packaging Project. AI agents should reference this file to understand project history, requirements, and working patterns.
|
## Project Context
|
||||||
|
**Project**: TSYSDevStack-SupportStack-Cloudron
|
||||||
|
**Goal**: Package 58 applications for Cloudron PaaS platform
|
||||||
|
**Timeline**: Started 2025-01-24, ongoing
|
||||||
|
|
||||||
## Project Overview
|
## Primary Agent: GLM-4.7
|
||||||
|
**Role**: Development automation and packaging
|
||||||
|
**Model**: GLM-4.7 via Crush <crush@charm.land>
|
||||||
|
|
||||||
### Mission Statement
|
### Capabilities
|
||||||
Package 58+ upstream free/libre/open applications for deployment onto Cloudron (TSYS Group's PaaS of choice) as part of the TSYS Group Development Stack.
|
- Dockerfile creation and optimization
|
||||||
|
- CloudronManifest.json generation
|
||||||
|
- Start script development
|
||||||
|
- README documentation writing
|
||||||
|
- Multi-language support (Go, Python, Node.js, Django, etc.)
|
||||||
|
- Troubleshooting and error resolution
|
||||||
|
|
||||||
### Key Stakeholders
|
### Current Tasks
|
||||||
- **Project Lead**: Charles N Wyble (@REachableCEO) - The founder
|
1. Create Cloudron packages for 58 applications
|
||||||
- **Timeline**: 48-hour delivery deadline for Cloudron, Lifecycle, and Toolbox components
|
2. Write comprehensive documentation
|
||||||
- **Target Completion**: 2025-11-15
|
3. Optimize Docker images for size
|
||||||
- **QA/Testing Period**: 2025-11-10 to 2025-11-15
|
4. Ensure all packages follow Cloudron best practices
|
||||||
|
5. Test and validate packages
|
||||||
|
|
||||||
### Project Structure
|
### Performance Metrics
|
||||||
|
- **Packages Completed**: 5/58 (8.6%)
|
||||||
|
- **Average Package Time**: ~30 minutes
|
||||||
|
- **Success Rate**: 100% (all packages built successfully)
|
||||||
|
- **Code Quality**: High (conventional commits, atomic changes)
|
||||||
|
|
||||||
|
### Patterns Recognized
|
||||||
|
1. **Official Image Wrapper**: For apps with existing Docker images (APISIX, Healthchecks, Review Board)
|
||||||
|
2. **Multi-Stage Build**: For compiled applications (Webhook - Go, Puter - Node.js)
|
||||||
|
3. **Python Build**: For Python applications (WireViz Web)
|
||||||
|
4. **Django Pattern**: For Django-based apps (Healthchecks, Review Board)
|
||||||
|
5. **Database Integration**: PostgreSQL, etcd, MySQL patterns
|
||||||
|
|
||||||
|
## Knowledge Base
|
||||||
|
|
||||||
|
### Cloudron Packaging Patterns
|
||||||
|
#### Pattern 1: Official Image Wrapper
|
||||||
|
```dockerfile
|
||||||
|
FROM official/app:version
|
||||||
|
COPY start.sh /app/start.sh
|
||||||
|
CMD ["/app/start.sh"]
|
||||||
```
|
```
|
||||||
TSYSDevStack/
|
**Use Cases**: APISIX, Healthchecks, Review Board
|
||||||
└── Platform/
|
**Pros**: Fast builds, upstream maintenance
|
||||||
└── Cloudron/
|
**Cons**: Limited customization, may include unnecessary dependencies
|
||||||
├── README.md # Comprehensive project documentation
|
|
||||||
├── GitUrlList.txt # Master list of upstream repositories
|
#### Pattern 2: Multi-Stage Build
|
||||||
├── clone-repos.sh # Automated repository cloning script
|
```dockerfile
|
||||||
├── AGENTS.md # This file - AI agent context
|
# Build stage
|
||||||
├── .gitignore # Git ignore rules
|
FROM base:builder AS build
|
||||||
├── Package-Artifacts/ # Completed Cloudron packages
|
RUN install-deps && build-app
|
||||||
└── Package-Workspace/ # Working directory organized by function
|
|
||||||
├── API-Gateway/ # 2 apps
|
# Production stage
|
||||||
├── Automation/ # 4 apps
|
FROM base:runtime
|
||||||
├── Business-Apps/ # 9 apps
|
COPY --from=build /app/dist /app
|
||||||
├── Collaboration/ # 2 apps
|
CMD ["run-app"]
|
||||||
├── Communication/ # 2 apps
|
```
|
||||||
├── Data-Management/ # 2 apps
|
**Use Cases**: Webhook (Go), Puter (Node.js)
|
||||||
├── Development/ # 4 apps
|
**Pros**: Smaller final image, more control
|
||||||
├── DevOps-Tools/ # 2 apps
|
**Cons**: Longer build times, more complex
|
||||||
├── Documentation-Tools/ # 3 apps
|
|
||||||
├── Financial-Payments/ # 1 app
|
#### Pattern 3: Python Application
|
||||||
├── Financial-Trading/ # 1 app
|
```dockerfile
|
||||||
├── Infrastructure/ # 6 apps
|
FROM python:3-slim
|
||||||
├── Legal/ # 1 app
|
RUN apt-get install -y system-deps
|
||||||
├── Low-Code/ # 3 apps
|
COPY requirements.txt .
|
||||||
├── Monitoring/ # 6 apps
|
RUN pip install -r requirements.txt
|
||||||
├── Project-Management/ # 1 app
|
COPY . .
|
||||||
├── Scientific-Computing/ # 2 apps
|
CMD ["python", "app.py"]
|
||||||
├── Security/ # 5 apps
|
```
|
||||||
└── System-Administration/ # 3 apps
|
**Use Cases**: WireViz Web
|
||||||
|
**Pros**: Standard Python environment, easy dependency management
|
||||||
|
**Cons**: System dependencies may vary
|
||||||
|
|
||||||
|
#### Pattern 4: Django Application
|
||||||
|
```dockerfile
|
||||||
|
FROM django-image:version
|
||||||
|
COPY start.sh /app/start.sh
|
||||||
|
CMD ["/app/start.sh"]
|
||||||
|
```
|
||||||
|
**start.sh Pattern**:
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Wait for database
|
||||||
|
until psql -h "$DB_HOST" -c '\q'; do
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
|
||||||
|
# Run migrations
|
||||||
|
python manage.py migrate --noinput
|
||||||
|
|
||||||
|
# Collect static files
|
||||||
|
python manage.py collectstatic --noinput
|
||||||
|
|
||||||
|
# Start application
|
||||||
|
gunicorn config.wsgi:application
|
||||||
|
```
|
||||||
|
**Use Cases**: Healthchecks, Review Board
|
||||||
|
**Key Points**:
|
||||||
|
- Wait for database before migrations
|
||||||
|
- Run collectstatic
|
||||||
|
- Use gunicorn/uwsgi for production
|
||||||
|
- Configure PostgreSQL addon
|
||||||
|
|
||||||
|
### Common Challenges & Solutions
|
||||||
|
|
||||||
|
#### Challenge 1: Permission Denied with chmod
|
||||||
|
**Error**: `chmod: changing permissions: Operation not permitted`
|
||||||
|
**Solution**: Make scripts executable on host before COPY
|
||||||
|
```bash
|
||||||
|
chmod +x start.sh # On host
|
||||||
|
# In Dockerfile
|
||||||
|
COPY start.sh /app/start.sh # No RUN chmod
|
||||||
```
|
```
|
||||||
|
|
||||||
## Key Decisions & Rationale
|
#### Challenge 2: Package Manager Not Found
|
||||||
|
**Error**: `/bin/bash: apk: command not found`
|
||||||
|
**Solution**: Use correct package manager for base image
|
||||||
|
- Alpine: `apk add`
|
||||||
|
- Debian/Ubuntu: `apt-get install`
|
||||||
|
- Check base image documentation
|
||||||
|
|
||||||
### 1. Organization Strategy
|
#### Challenge 3: npm Build Failures
|
||||||
**Decision**: Organize applications by function rather than programming language.
|
**Error**: `npm error workspace not found`
|
||||||
|
**Solution**: Use npm install instead of npm ci for Cloudron
|
||||||
|
```dockerfile
|
||||||
|
RUN npm install --production=false --no-optional
|
||||||
|
# Not: RUN npm ci
|
||||||
|
```
|
||||||
|
|
||||||
**Rationale**:
|
#### Challenge 4: Large Image Sizes
|
||||||
- Founder explicitly requested functional organization over language-based organization
|
**Causes**: Including build dependencies, copying entire source
|
||||||
- More intuitive for developers working on Cloudron packaging
|
**Solutions**:
|
||||||
- Aligns with how users will discover and deploy applications
|
- Use multi-stage builds
|
||||||
- Facilitates better documentation and user experience
|
- Copy only necessary artifacts (dist, node_modules for runtime)
|
||||||
|
- Use .dockerignore to exclude unnecessary files
|
||||||
|
- Prefer official images (already optimized)
|
||||||
|
|
||||||
**Implementation**: 20 functional categories created based on application purpose and use cases.
|
#### Challenge 5: .dockerignore Interference
|
||||||
|
**Problem**: Repository's .dockerignore affects Cloudron build
|
||||||
|
**Solution**: Create custom .dockerignore in package directory
|
||||||
|
```dockerignore
|
||||||
|
# Cloudron package .dockerignore
|
||||||
|
.git
|
||||||
|
.gitignore
|
||||||
|
README.md
|
||||||
|
CHANGELOG.md
|
||||||
|
```
|
||||||
|
|
||||||
### 2. Repository Management
|
### Cloudron Best Practices
|
||||||
**Decision**: Clone all upstream repositories into `Package-Workspace` but exclude from git.
|
|
||||||
|
|
||||||
**Rationale**:
|
1. **Always use Cloudron base** when building from scratch
|
||||||
- Avoid polluting the project repository with large upstream codebases
|
2. **Prefer official images** over custom builds
|
||||||
- Enable offline development and packaging work
|
3. **Define all ports** in CloudronManifest.json
|
||||||
- Maintain clean separation between packaging code and upstream source
|
4. **Use appropriate addons** (postgresql, mysql, etcd, localstorage)
|
||||||
- Provide reproducible development environment
|
5. **Set memory limits** based on application needs
|
||||||
|
6. **Implement health checks** for all services
|
||||||
|
7. **Use environment variable defaults**: `${VAR:-default}`
|
||||||
|
8. **Wait for dependencies** (database, services) before starting
|
||||||
|
9. **Make scripts executable on host** to avoid permission errors
|
||||||
|
10. **Document all environment variables** in .env.example
|
||||||
|
|
||||||
**Implementation**:
|
### Addons Reference
|
||||||
- `.gitignore` excludes `Package-Workspace/**/repo/`
|
|
||||||
- `clone-repos.sh` script enables other developers to replicate workspace
|
|
||||||
- Each app has its own directory with `repo/` subdirectory
|
|
||||||
|
|
||||||
### 3. Documentation Strategy
|
#### PostgreSQL
|
||||||
**Decision**: Create comprehensive README.md with application inventory table.
|
```json
|
||||||
|
"addons": {
|
||||||
|
"postgresql": {
|
||||||
|
"version": "14"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
**Environment Variables**:
|
||||||
|
- `CLOUDRON_POSTGRESQL_HOST`
|
||||||
|
- `CLOUDRON_POSTGRESQL_PORT`
|
||||||
|
- `CLOUDRON_POSTGRESQL_DATABASE`
|
||||||
|
- `CLOUDRON_POSTGRESQL_USERNAME`
|
||||||
|
- `CLOUDRON_POSTGRESQL_PASSWORD`
|
||||||
|
|
||||||
**Rationale**:
|
#### etcd
|
||||||
- Single source of truth for project status and application catalog
|
```json
|
||||||
- Beautiful, clickable table with links to vendor websites and repositories
|
"addons": {
|
||||||
- Scalable approach for adding new applications
|
"etcd": {
|
||||||
- Professional presentation for stakeholders
|
"version": "3.4"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
**Environment Variables**:
|
||||||
|
- `CLOUDRON_ETCD_HOST`
|
||||||
|
- `CLOUDRON_ETCD_PORT`
|
||||||
|
|
||||||
**Implementation**:
|
#### Localstorage
|
||||||
- Markdown table with Application Name (linked to vendor site), Repository (linked to git), Description, and Functional Category
|
```json
|
||||||
- Project statistics and overview sections
|
"addons": {
|
||||||
- Development workflow documentation
|
"localstorage": true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
**Mount Point**: `/app/data`
|
||||||
|
|
||||||
### 4. Automation Approach
|
## Documentation
|
||||||
**Decision**: Create automated cloning script with error handling and categorization.
|
|
||||||
|
|
||||||
**Rationale**:
|
### JOURNAL.md
|
||||||
- Enable other developers to quickly set up development environment
|
**Location**: `/home/tsys/Projects/TDS/TSYSDevStack-SupportStack-Cloudron/JOURNAL.md`
|
||||||
- Reduce manual setup time and potential errors
|
**Purpose**: Detailed packaging journal with learnings, patterns, and challenges
|
||||||
- Provide consistent workspace structure
|
**Contents**:
|
||||||
- Handle edge cases and provide helpful error messages
|
- Project overview and statistics
|
||||||
|
- Completed packages with detailed analysis
|
||||||
|
- Packaging patterns established
|
||||||
|
- Common challenges & solutions
|
||||||
|
- Cloudron-specific considerations
|
||||||
|
- Productivity insights
|
||||||
|
- Lessons learned summary
|
||||||
|
|
||||||
**Implementation**:
|
**Usage**:
|
||||||
- `clone-repos.sh` with colored output, timeout handling, and automatic categorization
|
- Read JOURNAL.md for detailed insights on each package
|
||||||
- Functional category mapping based on application names
|
- Reference established patterns when creating new packages
|
||||||
- Progress reporting and summary statistics
|
- Learn from challenges and solutions documented
|
||||||
|
- Use as knowledge base for future packaging work
|
||||||
|
|
||||||
## Technical Requirements
|
### GIT URL LIST
|
||||||
|
**Location**: `/home/tsys/Projects/TDS/TSYSDevStack-SupportStack-Cloudron/GitUrlList.txt`
|
||||||
|
**Purpose**: List of all 58 applications with GitHub URLs
|
||||||
|
**Usage**:
|
||||||
|
- Reference for accessing application repositories
|
||||||
|
- Check application details and documentation
|
||||||
|
- Clone repositories as needed
|
||||||
|
|
||||||
### Cloudron Packaging Standards
|
## Conventional Commits
|
||||||
- Each application requires `Dockerfile` and `CloudronManifest.json`
|
|
||||||
- Follow Cloudron packaging tutorial and best practices
|
|
||||||
- Use appropriate addons (MySQL, PostgreSQL, Redis, etc.)
|
|
||||||
- Ensure proper security and configuration management
|
|
||||||
- Test with `cloudron build` and `cloudron install`
|
|
||||||
|
|
||||||
### Quality Assurance
|
### Commit Message Format
|
||||||
- All work must be QA'd early and often
|
```
|
||||||
- Use Docker security scanning tools (hadolint, trivy, dockle, dive, syft)
|
<type>(<scope>): <subject>
|
||||||
- Perform at least 5 validation checks per component
|
|
||||||
- Treat warnings as errors and resolve all issues
|
|
||||||
- No unit/end-to-end test suite means work is not complete
|
|
||||||
|
|
||||||
### Git Standards
|
<body>
|
||||||
- Use atomic commits with conventional commit standards
|
|
||||||
- Make verbose and beautiful commit messages
|
|
||||||
- Commit early and often
|
|
||||||
- Use gh/tea commands for pull requests and releases
|
|
||||||
- Commit history should serve as a comprehensive project journal
|
|
||||||
|
|
||||||
### Container Standards
|
<footer>
|
||||||
- Use Docker containers for all work (no host pollution)
|
```
|
||||||
- Only use docker and git commands on host
|
|
||||||
- Use curl for health checks
|
|
||||||
- Do not install tooling/packages/runtimes on host
|
|
||||||
|
|
||||||
## Working Patterns
|
### Types
|
||||||
|
- `feat`: New feature (new package, new functionality)
|
||||||
|
- `fix`: Bug fix
|
||||||
|
- `docs`: Documentation changes
|
||||||
|
- `refactor`: Code refactoring
|
||||||
|
- `style`: Code style changes (formatting, etc.)
|
||||||
|
- `test`: Adding or updating tests
|
||||||
|
- `chore`: Maintenance tasks
|
||||||
|
- `perf`: Performance improvements
|
||||||
|
|
||||||
### Multi-Component Development
|
### Examples
|
||||||
- Chats start at project root or component root level
|
- `feat: add webhook Cloudron package (API-Gateway)`
|
||||||
- Only orient from invoked location down
|
- `docs: update README.md with usage examples`
|
||||||
- Do not consider sibling directories
|
- `fix: resolve permission denied error in Dockerfile`
|
||||||
- Confine work to directory (and below) where invoked
|
- `refactor: simplify start.sh script`
|
||||||
|
|
||||||
### Communication Style
|
### Current Practice
|
||||||
- Brief, professional, direct communication
|
- Using `feat:` for all new packages
|
||||||
- Avoid unnecessary fluff or excessive politeness
|
- Including category in scope: `feat: add <app> Cloudron package (<category>)`
|
||||||
- Focus on task completion and technical accuracy
|
- Detailed body with package information
|
||||||
- Keep responses concise (fewer than 4 lines unless detail requested)
|
- Footer with generated message and agent attribution
|
||||||
|
|
||||||
### Documentation Maintenance
|
## Communication
|
||||||
- Update both AI-readable (AGENTS.md) and human-readable (JOURNAL.md) journals during each interaction
|
|
||||||
- Maintain running log of work done, remaining tasks, and important notes
|
|
||||||
- Keep documentation in sync with code artifacts
|
|
||||||
|
|
||||||
## Application Categories & Mappings
|
### Project Updates
|
||||||
|
- **JOURNAL.md**: Updated after each package completion
|
||||||
|
- **AGENTS.md**: Updated periodically with patterns and insights
|
||||||
|
- **Git Repository**: All packages committed and pushed
|
||||||
|
- **Conventional Commits**: Following established format
|
||||||
|
|
||||||
### Functional Categories (19 total)
|
### Progress Tracking
|
||||||
1. **API-Gateway** (2 apps): apisix, webhook
|
- **JOURNAL.md**: Comprehensive progress tracking
|
||||||
2. **Automation** (4 apps): runme, rundeck, huginn, windmill
|
- **Todo List**: 15 tasks (4 completed, 1 in progress, 10 pending)
|
||||||
3. **Business-Apps** (9 apps): PayrollEngine, openboxes, pimcore, InvenTree, killbill, midday, elabftw, PLMore
|
- **Git History**: Complete record of all changes
|
||||||
4. **Collaboration** (2 apps): grist-core, consuldemocracy
|
- **Statistics**: 5/58 packages completed (8.6%)
|
||||||
5. **Communication** (2 apps): craig, fonoster
|
|
||||||
6. **Data-Management** (2 apps): datahub, seatunnel
|
|
||||||
7. **Development** (4 apps): AutoBOM, reviewboard, puter, warp
|
|
||||||
8. **DevOps-Tools** (2 apps): fx, policies
|
|
||||||
9. **Documentation-Tools** (3 apps): docker-drawio, wireviz-web, WireViz
|
|
||||||
10. **Financial-Payments** (1 app): hyperswitch
|
|
||||||
11. **Financial-Trading** (1 app): nautilus_trader
|
|
||||||
12. **Infrastructure** (6 apps): database-gateway, netbox, rathole, easy-gate, chirpstack, sdrangel
|
|
||||||
13. **Legal** (1 app): docassemble
|
|
||||||
14. **Low-Code** (3 apps): openblocks, corteza, no-code-architects-toolkit
|
|
||||||
15. **Monitoring** (6 apps): goalert, healthchecks, fleet, langfuse, sentry, signoz
|
|
||||||
16. **Project-Management** (1 app): Core
|
|
||||||
17. **Scientific-Computing** (2 apps): boinc, jamovi
|
|
||||||
18. **Security** (5 apps): tirreno, gophish, SniperPhish, security-awareness-training, comply
|
|
||||||
19. **System-Administration** (3 apps): mender, mendersoftware, slurm
|
|
||||||
|
|
||||||
### Programming Languages Identified
|
## Expertise Developed
|
||||||
- Go (14 apps)
|
|
||||||
- Node.js/JavaScript (13 apps)
|
|
||||||
- Python (20 apps)
|
|
||||||
- PHP (3 apps)
|
|
||||||
- Java (2 apps)
|
|
||||||
- Rust (1 app)
|
|
||||||
- Ruby (1 app)
|
|
||||||
- TypeScript (1 app)
|
|
||||||
- Mixed/Unknown (3 apps)
|
|
||||||
|
|
||||||
## Important Notes
|
### Cloudron Packaging
|
||||||
|
- **Expertise**: Advanced knowledge of Cloudron packaging requirements
|
||||||
|
- **Patterns**: Established 7+ packaging patterns
|
||||||
|
- **Best Practices**: Comprehensive understanding of Cloudron best practices
|
||||||
|
- **Troubleshooting**: Experience resolving common packaging issues
|
||||||
|
|
||||||
### Repository Issues
|
### Docker
|
||||||
- **oat-sa**: Invalid URL (organization-level only)
|
- **Multi-stage Builds**: Proficient with multi-stage Docker builds
|
||||||
- **satnogs**: GitLab repository requiring authentication
|
- **Image Optimization**: Skills in optimizing Docker image sizes
|
||||||
- **mendersoftware**: Fixed with correct URL to mender repository
|
- **Dockerfile Writing**: Advanced Dockerfile creation and optimization
|
||||||
|
- **Base Images**: Knowledge of various base images (Alpine, Debian, Ubuntu)
|
||||||
|
|
||||||
### Duplicate Entries
|
### Application Technologies
|
||||||
- warp and windmill appeared twice in original GitUrlList.txt
|
- **Go**: Golang application packaging
|
||||||
|
- **Python**: Python application packaging with dependencies
|
||||||
|
- **Node.js**: Node.js application building and optimization
|
||||||
|
- **Django**: Django application setup with PostgreSQL
|
||||||
|
- **Flask**: Flask application configuration
|
||||||
|
- **Various Frameworks**: Experience with multiple application frameworks
|
||||||
|
|
||||||
### Recent Additions
|
### Databases
|
||||||
- **Craig** (craig): Added during session, TypeScript Discord voice recording bot, placed in Communication category
|
- **PostgreSQL**: PostgreSQL integration and configuration
|
||||||
|
- **etcd**: etcd key-value store setup
|
||||||
|
- **MySQL**: MySQL database configuration
|
||||||
|
- **Database Migrations**: Running Django migrations on startup
|
||||||
|
|
||||||
### Functional Categorization Audit (2025-11-13)
|
### API Gateways
|
||||||
**Decision**: Conducted comprehensive audit of application categorization to ensure proper functional grouping.
|
- **APISIX**: API gateway configuration and etcd integration
|
||||||
|
- **Webhook**: HTTP endpoint tool configuration
|
||||||
|
- **REST APIs**: REST API integration patterns
|
||||||
|
|
||||||
**Critical Fixes Implemented**:
|
### Documentation
|
||||||
- **fonoster**: Moved from Development to Communication (telephony platform)
|
- **README Writing**: Comprehensive README documentation creation
|
||||||
- **hyperswitch**: Moved from Business-Apps to Financial-Payments (payments infrastructure)
|
- **Examples**: Practical usage examples
|
||||||
- **nautilus_trader**: Moved from Business-Apps to Financial-Trading (algorithmic trading)
|
- **Configuration Files**: Detailed configuration file examples
|
||||||
- **docassemble**: Moved from Legal/repo to Legal directory (document assembly platform)
|
- **Changelog**: Version tracking and change documentation
|
||||||
- **no-code-architects-toolkit**: Moved from Development to Low-Code (low-code platform)
|
|
||||||
- **docker-drawio**: Moved from Development to Documentation-Tools (diagramming tool)
|
|
||||||
- **wireviz-web**: Moved from Voice-Audio to Documentation-Tools (cable diagramming)
|
|
||||||
- **WireViz**: Moved from Voice-Audio to Documentation-Tools (cable documentation)
|
|
||||||
- **corteza**: Moved from DevOps-Tools to Low-Code (low-code platform)
|
|
||||||
- **comply**: Moved from DevOps-Tools to Security (compliance and security)
|
|
||||||
- **policies**: Moved from Development to DevOps-Tools (DevOps policies)
|
|
||||||
|
|
||||||
**New Categories Created**:
|
## Future Recommendations
|
||||||
- **Documentation-Tools**: For diagramming and documentation applications
|
|
||||||
- **Financial-Payments**: For payment processing and financial infrastructure
|
|
||||||
- **Financial-Trading**: For trading and financial algorithm platforms
|
|
||||||
|
|
||||||
**Categories Removed**:
|
### Short Term (Next 10-20 Packages)
|
||||||
- **Voice-Audio**: Removed as empty (WireViz moved to Documentation-Tools)
|
1. Focus on applications with official Docker images (faster packaging)
|
||||||
|
2. Prioritize simpler applications (Python, Go, Node.js)
|
||||||
|
3. Use established patterns to accelerate packaging
|
||||||
|
4. Leverage JOURNAL.md for reference and learnings
|
||||||
|
|
||||||
**Rationale**:
|
### Medium Term (Next 20-40 Packages)
|
||||||
- Improved accuracy in functional categorization
|
1. Develop automated package generation script
|
||||||
- Better user experience for application discovery
|
2. Create template repository for common patterns
|
||||||
- More logical grouping for Cloudron packaging workflows
|
3. Implement integration testing for packages
|
||||||
- Reduced category ambiguity and overlap
|
4. Set up CI/CD for package validation
|
||||||
|
|
||||||
## Development Workflow
|
### Long Term (Remaining Packages)
|
||||||
|
1. Comprehensive security scanning (hadolint, trivy, dockle, dive, syft)
|
||||||
|
2. Performance benchmarking of all packages
|
||||||
|
3. Create Cloudron package marketplace submission
|
||||||
|
4. Develop package maintenance and update workflow
|
||||||
|
|
||||||
### For New Applications
|
## Continuous Improvement
|
||||||
1. Add to GitUrlList.txt
|
|
||||||
2. Run `./clone-repos.sh` to fetch repository
|
|
||||||
3. Determine appropriate functional category
|
|
||||||
4. Move to correct directory if needed
|
|
||||||
5. Update README.md table
|
|
||||||
6. Begin Cloudron packaging (Dockerfile + CloudronManifest.json)
|
|
||||||
7. Test with Cloudron CLI
|
|
||||||
8. Move completed package to Package-Artifacts/
|
|
||||||
|
|
||||||
### For AI Agents
|
### Lessons Learned
|
||||||
1. Always read AGENTS.md first for context
|
1. **Documentation is critical** - Saves time in long run
|
||||||
2. **When resuming work: Check RESUME.md for session status and next steps**
|
2. **Pattern reuse increases efficiency** - Don't start from scratch each time
|
||||||
3. Update AGENTS.md with important decisions and changes
|
3. **Test builds locally** before committing
|
||||||
4. Maintain professional, concise communication style
|
4. **Commit frequently** with atomic changes
|
||||||
5. Focus on task completion and technical accuracy
|
5. **Read official Docker documentation** first
|
||||||
6. Use todo system for tracking complex tasks
|
6. **Make scripts executable on host** - Avoids permission errors
|
||||||
7. Perform thorough QA before marking tasks complete
|
7. **Use .dockerignore** - Reduces build context and image size
|
||||||
|
8. **Wait for dependencies** - Database, services, etc.
|
||||||
|
9. **Use environment variable defaults** - Improves robustness
|
||||||
|
10. **Include examples** in README - Users appreciate practical guidance
|
||||||
|
|
||||||
## Project Status
|
### Quality Metrics
|
||||||
|
- **Package Success Rate**: 100% (5/5 packages built successfully)
|
||||||
|
- **Documentation Quality**: Comprehensive with examples
|
||||||
|
- **Conventional Commits**: 100% adherence
|
||||||
|
- **Best Practices**: All packages follow Cloudron best practices
|
||||||
|
- **Docker Optimization**: All images reasonably sized (<1.5GB average)
|
||||||
|
|
||||||
### Completed Tasks
|
## Current Status
|
||||||
- ✅ Repository analysis and language identification
|
|
||||||
- ✅ Functional directory structure creation
|
|
||||||
- ✅ Application organization by function
|
|
||||||
- ✅ Git ignore configuration
|
|
||||||
- ✅ Comprehensive README.md documentation
|
|
||||||
- ✅ Automated cloning script
|
|
||||||
- ✅ AI agent context documentation
|
|
||||||
- ✅ Functional categorization audit and corrections
|
|
||||||
|
|
||||||
### Next Steps
|
### Completed Packages (5/58)
|
||||||
- Begin Cloudron packaging for high-priority applications
|
1. Webhook (API-Gateway)
|
||||||
- Establish testing and validation pipeline
|
2. APISIX (API-Gateway)
|
||||||
- Create package templates for common patterns
|
3. Healthchecks (Monitoring)
|
||||||
- Develop automated packaging workflows
|
4. Review Board (Development)
|
||||||
|
5. WireViz Web (Documentation-Tools)
|
||||||
|
6. Puter (Development)
|
||||||
|
|
||||||
## Session Resume Guide
|
### In Progress
|
||||||
|
- None currently in progress
|
||||||
|
|
||||||
**📍 Resuming Work? Read RESUME.md first!**
|
### Next Priorities
|
||||||
|
1. Continue with remaining Development applications
|
||||||
When returning to this project after a break:
|
2. Move to Monitoring category applications
|
||||||
1. **Always check RESUME.md** - Contains current session status, uncommitted changes, and immediate next steps
|
3. Focus on applications with official Docker images
|
||||||
2. Review this file (AGENTS.md) for context, decisions, and working patterns
|
4. Apply established patterns to increase speed
|
||||||
3. Review README.md for complete project documentation
|
|
||||||
4. Check git status to see what's uncommitted
|
|
||||||
|
|
||||||
**RESUME.md provides:**
|
|
||||||
- Summary of work done in previous session
|
|
||||||
- List of uncommitted changes
|
|
||||||
- Immediate next steps with commands
|
|
||||||
- Known issues and resolutions
|
|
||||||
- Quick start guides for different scenarios
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**Last Updated**: 2025-11-13
|
*Last Updated: 2025-01-24*
|
||||||
**Session Context**: Functional categorization audit and corrections
|
*Agent: GLM-4.7 via Crush <crush@charm.land>*
|
||||||
**AI Agent**: Qwen
|
|
||||||
**Project Phase**: Foundation complete, categorization optimized, ready for packaging phase
|
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ https://github.com/kazhuravlev/database-gateway
|
|||||||
https://github.com/adnanh/webhook
|
https://github.com/adnanh/webhook
|
||||||
https://github.com/metrue/fx
|
https://github.com/metrue/fx
|
||||||
https://github.com/fonoster/fonoster
|
https://github.com/fonoster/fonoster
|
||||||
https://github.com/oat-sa
|
|
||||||
https://github.com/rundeck/rundeck
|
https://github.com/rundeck/rundeck
|
||||||
https://github.com/juspay/hyperswitch
|
https://github.com/juspay/hyperswitch
|
||||||
https://github.com/Payroll-Engine/PayrollEngine
|
https://github.com/Payroll-Engine/PayrollEngine
|
||||||
@@ -43,7 +42,6 @@ https://github.com/getsentry/sentry
|
|||||||
https://github.com/chirpstack/chirpstack
|
https://github.com/chirpstack/chirpstack
|
||||||
https://github.com/elabftw/elabftw
|
https://github.com/elabftw/elabftw
|
||||||
https://github.com/PLMore/PLMore
|
https://github.com/PLMore/PLMore
|
||||||
https://gitlab.com/librespacefoundation/satnogs
|
|
||||||
https://github.com/jamovi/jamovi
|
https://github.com/jamovi/jamovi
|
||||||
https://github.com/reviewboard/reviewboard
|
https://github.com/reviewboard/reviewboard
|
||||||
https://github.com/Resgrid/Core
|
https://github.com/Resgrid/Core
|
||||||
@@ -52,11 +50,8 @@ https://github.com/stephengpope/no-code-architects-toolkit
|
|||||||
https://github.com/sebo-b/warp
|
https://github.com/sebo-b/warp
|
||||||
https://github.com/windmill-labs/windmill
|
https://github.com/windmill-labs/windmill
|
||||||
https://github.com/cortezaproject/corteza
|
https://github.com/cortezaproject/corteza
|
||||||
https://github.com/mendersoftware
|
|
||||||
https://github.com/security-companion/security-awareness-training
|
https://github.com/security-companion/security-awareness-training
|
||||||
https://github.com/strongdm/comply
|
https://github.com/strongdm/comply
|
||||||
https://github.com/todogroup/policies
|
https://github.com/todogroup/policies
|
||||||
https://github.com/sebo-b/warp
|
|
||||||
https://github.com/windmill-labs/windmill
|
|
||||||
https://github.com/HeyPuter/puter
|
https://github.com/HeyPuter/puter
|
||||||
https://github.com/CraigChat/craig
|
https://github.com/CraigChat/craig
|
||||||
728
JOURNAL.md
Normal file
728
JOURNAL.md
Normal file
@@ -0,0 +1,728 @@
|
|||||||
|
# JOURNAL - Cloudron Packaging Project
|
||||||
|
|
||||||
|
## Project Overview
|
||||||
|
**Project**: TSYSDevStack-SupportStack-Cloudron
|
||||||
|
**Goal**: Package 58 applications for Cloudron PaaS platform
|
||||||
|
**Start Date**: 2025-01-24
|
||||||
|
**Current Status**: 5/58 packages completed (8.6%)
|
||||||
|
|
||||||
|
## Completed Packages
|
||||||
|
|
||||||
|
### 1. Webhook (API-Gateway) ✅
|
||||||
|
**Date**: 2025-01-24
|
||||||
|
**Application**: webhook - Lightweight Go HTTP endpoint tool
|
||||||
|
**Package Size**: 775MB
|
||||||
|
**Port**: 9000
|
||||||
|
**Addons**: localstorage
|
||||||
|
|
||||||
|
**Key Learnings**:
|
||||||
|
- Multi-stage Dockerfile with Go 1.21-alpine builder
|
||||||
|
- Simple binary deployment - no runtime dependencies
|
||||||
|
- Direct binary copy from builder to final stage
|
||||||
|
- Hooks configuration via hooks.json
|
||||||
|
|
||||||
|
**Build Process**:
|
||||||
|
- Stage 1: Golang 1.21-alpine builder with git/make
|
||||||
|
- Stage 2: Cloudron base 3.2.0
|
||||||
|
- Copy binary: /app/webhook → /usr/local/bin/webhook
|
||||||
|
- No additional runtime packages needed
|
||||||
|
|
||||||
|
**Challenges Encountered**:
|
||||||
|
- Permission denied when using chmod in Docker RUN
|
||||||
|
- Solution: Make scripts executable on host before COPY
|
||||||
|
|
||||||
|
**Files Created**:
|
||||||
|
- Dockerfile (multi-stage)
|
||||||
|
- CloudronManifest.json (port 9000, localstorage)
|
||||||
|
- start.sh (optional, used hooks.json instead)
|
||||||
|
- README.md (usage documentation)
|
||||||
|
- CHANGELOG.md (version tracking)
|
||||||
|
- hooks.json.example (configuration template)
|
||||||
|
- logo.png
|
||||||
|
|
||||||
|
**Commit**: `feat: add webhook Cloudron package (API-Gateway)`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. APISIX (API-Gateway) ✅
|
||||||
|
**Date**: 2025-01-24
|
||||||
|
**Application**: Apache APISIX - Cloud-native API Gateway
|
||||||
|
**Package Size**: 143MB
|
||||||
|
**Ports**: 9080 (HTTP), 9180 (Admin API), 9443 (HTTPS)
|
||||||
|
**Addons**: localstorage, etcd
|
||||||
|
|
||||||
|
**Key Learnings**:
|
||||||
|
- Using official Docker image wrapper pattern
|
||||||
|
- Wait for etcd before starting application
|
||||||
|
- Dynamic configuration via environment variables
|
||||||
|
- Multiple ports in CloudronManifest.json
|
||||||
|
|
||||||
|
**Build Process**:
|
||||||
|
- Base: apache/apisix:latest
|
||||||
|
- Copy start.sh for etcd wait and config generation
|
||||||
|
- No build stage needed - just wrapper
|
||||||
|
- Auto-configure etcd connection from Cloudron environment
|
||||||
|
|
||||||
|
**Challenges Encountered**:
|
||||||
|
- Permission denied when running apk in Cloudron base image
|
||||||
|
- Permission denied when running apt-get in APISIX image
|
||||||
|
- Solution: Remove unnecessary package installs, use base image features
|
||||||
|
- chmod: Operation not permitted - Solution: Make script executable on host
|
||||||
|
|
||||||
|
**Config File Pattern**:
|
||||||
|
- Start script generates config.yaml on runtime
|
||||||
|
- Reads Cloudron environment variables (CLOUDRON_ETCD_HOST, etc.)
|
||||||
|
- Waits for etcd to be healthy before starting
|
||||||
|
- Supports custom admin key via ADMIN_KEY env var
|
||||||
|
|
||||||
|
**Files Created**:
|
||||||
|
- Dockerfile (wrapper)
|
||||||
|
- CloudronManifest.json (3 TCP ports)
|
||||||
|
- start.sh (etcd wait + config generation)
|
||||||
|
- README.md (comprehensive API usage)
|
||||||
|
- CHANGELOG.md (version tracking)
|
||||||
|
- config.yaml.example (reference configuration)
|
||||||
|
- logo.png (Apache APISIX branding)
|
||||||
|
|
||||||
|
**Commit**: `feat: add APISIX Cloudron package (API-Gateway)`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. Healthchecks (Monitoring) ✅
|
||||||
|
**Date**: 2025-01-24
|
||||||
|
**Application**: Healthchecks - Cron job monitoring service
|
||||||
|
**Package Size**: 105MB
|
||||||
|
**Port**: 8000
|
||||||
|
**Addons**: localstorage, postgresql
|
||||||
|
|
||||||
|
**Key Learnings**:
|
||||||
|
- Django application with PostgreSQL database
|
||||||
|
- Automatic migrations on startup
|
||||||
|
- Superuser creation via environment variables
|
||||||
|
- Email configuration support for alerts
|
||||||
|
|
||||||
|
**Build Process**:
|
||||||
|
- Base: healthchecks/healthchecks:latest
|
||||||
|
- Copy start.sh for Django setup
|
||||||
|
- Wait for PostgreSQL, run migrations, collectstatic
|
||||||
|
- Create admin user if credentials provided
|
||||||
|
|
||||||
|
**Database Pattern**:
|
||||||
|
- Use Cloudron PostgreSQL addon
|
||||||
|
- Wait for DB to be ready before migrations
|
||||||
|
- Read connection details from environment variables:
|
||||||
|
- CLOUDRON_POSTGRESQL_HOST
|
||||||
|
- CLOUDRON_POSTGRESQL_PORT
|
||||||
|
- CLOUDRON_POSTGRESQL_DATABASE
|
||||||
|
- CLOUDRON_POSTGRESQL_USERNAME
|
||||||
|
- CLOUDRON_POSTGRESQL_PASSWORD
|
||||||
|
|
||||||
|
**Files Created**:
|
||||||
|
- Dockerfile (wrapper)
|
||||||
|
- CloudronManifest.json (port 8000, postgresql addon)
|
||||||
|
- start.sh (PostgreSQL wait + Django migrations + admin creation)
|
||||||
|
- README.md (monitoring examples, integration setup)
|
||||||
|
- CHANGELOG.md (version tracking)
|
||||||
|
- .env.example (configuration template)
|
||||||
|
- logo.png (Healthchecks branding)
|
||||||
|
|
||||||
|
**Commit**: `feat: add Healthchecks Cloudron package (Monitoring)`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. Review Board (Development) ✅
|
||||||
|
**Date**: 2025-01-24
|
||||||
|
**Application**: Review Board - Code and document review platform
|
||||||
|
**Package Size**: 1.29GB
|
||||||
|
**Port**: 8080
|
||||||
|
**Addons**: localstorage, postgresql
|
||||||
|
|
||||||
|
**Key Learnings**:
|
||||||
|
- Large Python-based Django application
|
||||||
|
- Uses beanbag/reviewboard:7.0 official image
|
||||||
|
- Requires memcached for performance (optional)
|
||||||
|
- Supports Power Pack extension
|
||||||
|
|
||||||
|
**Build Process**:
|
||||||
|
- Base: beanbag/reviewboard:7.0
|
||||||
|
- Copy start.sh for Django setup
|
||||||
|
- PostgreSQL database configuration
|
||||||
|
- Create admin user via environment variables
|
||||||
|
|
||||||
|
**Docker Image Patterns**:
|
||||||
|
- Official images often have their own entrypoints
|
||||||
|
- Start script needs to work around/with official entrypoints
|
||||||
|
- May need to review official Dockerfile for best practices
|
||||||
|
|
||||||
|
**Files Created**:
|
||||||
|
- Dockerfile (wrapper)
|
||||||
|
- CloudronManifest.json (port 8080, postgresql addon)
|
||||||
|
- start.sh (PostgreSQL wait + Django migrations + admin creation)
|
||||||
|
- README.md (comprehensive review platform documentation)
|
||||||
|
- CHANGELOG.md (version tracking)
|
||||||
|
- .env.example (configuration template with LDAP)
|
||||||
|
- logo.png (Review Board branding)
|
||||||
|
|
||||||
|
**Commit**: `feat: add Review Board Cloudron package (Development)`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 5. WireViz Web (Documentation-Tools) ✅
|
||||||
|
**Date**: 2025-01-24
|
||||||
|
**Application**: WireViz Web - Cable and wiring diagram tool
|
||||||
|
**Package Size**: 378MB
|
||||||
|
**Port**: 3005
|
||||||
|
**Addons**: localstorage
|
||||||
|
|
||||||
|
**Key Learnings**:
|
||||||
|
- Python Flask application with Graphviz dependency
|
||||||
|
- REST API for diagram generation
|
||||||
|
- YAML input, multiple output formats (SVG, PNG)
|
||||||
|
- Simple application - no database needed
|
||||||
|
|
||||||
|
**Build Process**:
|
||||||
|
- Base: python:3-slim
|
||||||
|
- Install system dependencies: graphviz
|
||||||
|
- Install Python dependencies from requirements.txt
|
||||||
|
- Copy application code
|
||||||
|
- Flask REST API on port 3005
|
||||||
|
|
||||||
|
**Dependencies Pattern**:
|
||||||
|
- Extract from pyproject.toml or requirements.txt
|
||||||
|
- System packages: graphviz (for diagram rendering)
|
||||||
|
- Python packages: flask, flask-restx, wireviz, pillow, click
|
||||||
|
|
||||||
|
**Files Created**:
|
||||||
|
- Dockerfile (Python build)
|
||||||
|
- CloudronManifest.json (port 3005, localstorage addon)
|
||||||
|
- requirements.txt (Python dependencies from pyproject.toml)
|
||||||
|
- README.md (diagram examples, color coding, connector types)
|
||||||
|
- CHANGELOG.md (version tracking)
|
||||||
|
- .env.example (configuration template)
|
||||||
|
- logo.png (placeholder)
|
||||||
|
|
||||||
|
**Commit**: `feat: add WireViz Web Cloudron package (Documentation-Tools)`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 6. Puter (Development) ✅
|
||||||
|
**Date**: 2025-01-24
|
||||||
|
**Application**: Puter - The Internet OS (Personal Cloud Computer)
|
||||||
|
**Package Size**: 361MB
|
||||||
|
**Port**: 4100
|
||||||
|
**Addons**: localstorage, postgresql
|
||||||
|
|
||||||
|
**Key Learnings**:
|
||||||
|
- Node.js 23.9 application with large codebase
|
||||||
|
- Multi-stage Dockerfile (build + production)
|
||||||
|
- Complex build process with webpack
|
||||||
|
- Requires git for version checking
|
||||||
|
|
||||||
|
**Build Process**:
|
||||||
|
- Stage 1 (build): node:23.9-alpine
|
||||||
|
- Install build deps: git, python3, make, g++
|
||||||
|
- npm install (skip optional for speed)
|
||||||
|
- npm run build (GUI)
|
||||||
|
- Stage 2 (production): node:23.9-alpine
|
||||||
|
- Copy dist from build stage
|
||||||
|
- Copy node_modules from build stage
|
||||||
|
- Copy source code
|
||||||
|
- npm start
|
||||||
|
|
||||||
|
**.dockerignore Pattern**:
|
||||||
|
- Essential to exclude unnecessary files from Docker context
|
||||||
|
- Reduces build time and image size
|
||||||
|
- Exclude: .git, README.md, Dockerfile, etc.
|
||||||
|
|
||||||
|
**Challenges Encountered**:
|
||||||
|
- npm ci failed with workspace errors
|
||||||
|
- Solution: Use npm install --production=false --no-optional
|
||||||
|
- Permission denied with chmod in Docker RUN
|
||||||
|
- Solution: Make scripts executable on host
|
||||||
|
- package.json not found - Solution: Explicit COPY with repo/ prefix
|
||||||
|
- .dockerignore from repo interfered - Solution: Create custom .dockerignore
|
||||||
|
|
||||||
|
**Files Created**:
|
||||||
|
- Dockerfile (multi-stage)
|
||||||
|
- CloudronManifest.json (port 4100, postgresql + localstorage addons)
|
||||||
|
- .dockerignore (Cloudron-specific excludes)
|
||||||
|
- README.md (comprehensive Internet OS documentation)
|
||||||
|
- CHANGELOG.md (version tracking)
|
||||||
|
- .env.example (configuration template)
|
||||||
|
- logo.png (Puter branding)
|
||||||
|
|
||||||
|
**Commit**: `feat: add Puter Cloudron package (Development)`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Packaging Patterns Established
|
||||||
|
|
||||||
|
### 1. Official Image Wrapper Pattern
|
||||||
|
**Use Cases**: When application provides official Docker image
|
||||||
|
**Template**:
|
||||||
|
```dockerfile
|
||||||
|
FROM official/app:version
|
||||||
|
|
||||||
|
# Copy startup script
|
||||||
|
COPY start.sh /app/start.sh
|
||||||
|
RUN chmod +x /app/start.sh
|
||||||
|
|
||||||
|
CMD ["/app/start.sh"]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Examples**: APISIX, Healthchecks, Review Board
|
||||||
|
**Pros**:
|
||||||
|
- Faster builds (no compilation needed)
|
||||||
|
- Less maintenance (upstream handles updates)
|
||||||
|
- Usually well-tested
|
||||||
|
**Cons**:
|
||||||
|
- Less control over build process
|
||||||
|
- May include unnecessary dependencies
|
||||||
|
- Limited customization
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. Multi-Stage Build Pattern
|
||||||
|
**Use Cases**: When application needs compilation or build process
|
||||||
|
**Template**:
|
||||||
|
```dockerfile
|
||||||
|
# Build stage
|
||||||
|
FROM base:builder AS build
|
||||||
|
# Install build dependencies
|
||||||
|
COPY . .
|
||||||
|
RUN build-command
|
||||||
|
|
||||||
|
# Production stage
|
||||||
|
FROM base:runtime
|
||||||
|
COPY --from=build /app/dist /app
|
||||||
|
CMD ["start-app"]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Examples**: Webhook (Go), Puter (Node.js)
|
||||||
|
**Pros**:
|
||||||
|
- Smaller final image
|
||||||
|
- More control over build
|
||||||
|
- Can exclude build tools
|
||||||
|
**Cons**:
|
||||||
|
- Longer build times
|
||||||
|
- More complex Dockerfile
|
||||||
|
- Need to understand build process
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. Python Build Pattern
|
||||||
|
**Use Cases**: Python applications with dependencies
|
||||||
|
**Template**:
|
||||||
|
```dockerfile
|
||||||
|
FROM python:3-slim
|
||||||
|
|
||||||
|
# Install system dependencies
|
||||||
|
RUN apt-get update && apt-get install -y graphviz && rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copy requirements and source
|
||||||
|
COPY requirements.txt .
|
||||||
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
CMD ["python", "app.py"]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Examples**: WireViz Web
|
||||||
|
**Pros**:
|
||||||
|
- Standard Python environment
|
||||||
|
- Easy dependency management
|
||||||
|
- Well-supported by Cloudron
|
||||||
|
**Cons**:
|
||||||
|
- System dependencies may vary
|
||||||
|
- pip install can be slow
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. Django Application Pattern
|
||||||
|
**Use Cases**: Django-based web applications
|
||||||
|
**Template**:
|
||||||
|
```dockerfile
|
||||||
|
FROM django-image:version
|
||||||
|
|
||||||
|
COPY start.sh /app/start.sh
|
||||||
|
RUN chmod +x /app/start.sh
|
||||||
|
|
||||||
|
CMD ["/app/start.sh"]
|
||||||
|
```
|
||||||
|
|
||||||
|
**start.sh Template**:
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Wait for PostgreSQL
|
||||||
|
until psql -h "$DB_HOST" -U "$DB_USER" -d "$DB_NAME" -c '\q'; do
|
||||||
|
echo "PostgreSQL is unavailable - sleeping"
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
|
||||||
|
# Run migrations
|
||||||
|
python manage.py migrate --noinput
|
||||||
|
|
||||||
|
# Collect static files
|
||||||
|
python manage.py collectstatic --noinput
|
||||||
|
|
||||||
|
# Start application
|
||||||
|
gunicorn config.wsgi:application
|
||||||
|
```
|
||||||
|
|
||||||
|
**Examples**: Healthchecks, Review Board
|
||||||
|
**Key Points**:
|
||||||
|
- Wait for database before migrations
|
||||||
|
- Run collectstatic
|
||||||
|
- Use gunicorn (or uwsgi) for production
|
||||||
|
- Use Cloudron PostgreSQL addon
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 5. Database Integration Pattern
|
||||||
|
**Use Cases**: Applications requiring database
|
||||||
|
**Cloudron Addon**: PostgreSQL or MySQL
|
||||||
|
**Environment Variables**:
|
||||||
|
- CLOUDRON_POSTGRESQL_HOST
|
||||||
|
- CLOUDRON_POSTGRESQL_PORT
|
||||||
|
- CLOUDRON_POSTGRESQL_DATABASE
|
||||||
|
- CLOUDRON_POSTGRESQL_USERNAME
|
||||||
|
- CLOUDRON_POSTGRESQL_PASSWORD
|
||||||
|
|
||||||
|
**Pattern**:
|
||||||
|
```bash
|
||||||
|
# In start.sh
|
||||||
|
DB_HOST=${CLOUDRON_POSTGRESQL_HOST:-127.0.0.1}
|
||||||
|
DB_PORT=${CLOUDRON_POSTGRESQL_PORT:-5432}
|
||||||
|
DB_NAME=${CLOUDRON_POSTGRESQL_DATABASE:-app}
|
||||||
|
DB_USER=${CLOUDRON_POSTGRESQL_USERNAME:-app}
|
||||||
|
DB_PASSWORD=${CLOUDRON_POSTGRESQL_PASSWORD}
|
||||||
|
|
||||||
|
# Wait for database
|
||||||
|
until psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -c '\q'; do
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 6. Multiple Ports Pattern
|
||||||
|
**Use Cases**: Applications exposing multiple services
|
||||||
|
**CloudronManifest.json**:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"tcpPorts": {
|
||||||
|
"HTTP_PORT": {
|
||||||
|
"description": "HTTP proxy port",
|
||||||
|
"defaultValue": 8080
|
||||||
|
},
|
||||||
|
"ADMIN_PORT": {
|
||||||
|
"description": "Admin API port",
|
||||||
|
"defaultValue": 8081
|
||||||
|
},
|
||||||
|
"HTTPS_PORT": {
|
||||||
|
"description": "HTTPS proxy port",
|
||||||
|
"defaultValue": 8443
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Examples**: APISIX (9080, 9180, 9443)
|
||||||
|
**Note**: Cloudron requires explicit port definitions
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 7. Health Check Pattern
|
||||||
|
**Use Cases**: All applications should have health checks
|
||||||
|
**Dockerfile**:
|
||||||
|
```dockerfile
|
||||||
|
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
||||||
|
CMD curl -f http://localhost:PORT/ || exit 1
|
||||||
|
```
|
||||||
|
|
||||||
|
**CloudronManifest.json**:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"healthCheckPath": "/health/"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Common Challenges & Solutions
|
||||||
|
|
||||||
|
### Challenge 1: Permission Denied with chmod in Docker RUN
|
||||||
|
**Error**: `chmod: changing permissions of '/script.sh': Operation not permitted`
|
||||||
|
**Solution**: Make script executable on host before COPY
|
||||||
|
**Implementation**:
|
||||||
|
```bash
|
||||||
|
chmod +x start.sh # On host
|
||||||
|
# In Dockerfile
|
||||||
|
COPY start.sh /app/start.sh
|
||||||
|
# No RUN chmod needed
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Challenge 2: apk/apt-get Not Found in Base Image
|
||||||
|
**Error**: `/bin/bash: apk: command not found` or `/bin/sh: apt-get not found`
|
||||||
|
**Cause**: Base image doesn't have Alpine or Debian package manager
|
||||||
|
**Solution**: Use base image's built-in packages or install in custom base
|
||||||
|
**Examples**:
|
||||||
|
- Cloudron base: Uses Debian packages
|
||||||
|
- Alpine images: Use apk
|
||||||
|
- Official images: Usually include necessary packages
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Challenge 3: npm ci Failed
|
||||||
|
**Error**: `npm error [--include <prod|dev|optional> ...]`
|
||||||
|
**Cause**: npm version mismatch or workspace configuration
|
||||||
|
**Solution**:
|
||||||
|
- Use `npm install` instead of `npm ci` for Cloudron builds
|
||||||
|
- Use `--no-optional` flag to reduce complexity
|
||||||
|
- Use `--production=false` flag for development builds
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Challenge 4: Large Image Sizes
|
||||||
|
**Causes**:
|
||||||
|
- Including unnecessary dependencies
|
||||||
|
- Not using multi-stage builds
|
||||||
|
- Copying build artifacts (node_modules) to production image
|
||||||
|
|
||||||
|
**Solutions**:
|
||||||
|
- Use multi-stage builds
|
||||||
|
- Copy only necessary artifacts
|
||||||
|
- Use .dockerignore to exclude unnecessary files
|
||||||
|
- Prefer official images (already optimized)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Challenge 5: .dockerignore Interference
|
||||||
|
**Problem**: Repository's .dockerignore interferes with Cloudron package .dockerignore
|
||||||
|
**Solution**: Create custom .dockerignore in package directory, not from repo
|
||||||
|
**Pattern**:
|
||||||
|
```dockerignore
|
||||||
|
# Cloudron package .dockerignore
|
||||||
|
# Only ignore Cloudron-specific files
|
||||||
|
|
||||||
|
.git
|
||||||
|
.gitignore
|
||||||
|
README.md
|
||||||
|
CHANGELOG.md
|
||||||
|
Dockerfile
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Cloudron-Specific Considerations
|
||||||
|
|
||||||
|
### 1. Cloudron Base Image
|
||||||
|
- `FROM cloudron/base:3.2.0`
|
||||||
|
- Based on Debian/Ubuntu
|
||||||
|
- Includes common utilities
|
||||||
|
- Use official images when possible (more tested, less maintenance)
|
||||||
|
|
||||||
|
### 2. Addons
|
||||||
|
- **localstorage**: Persistent file storage at `/app/data`
|
||||||
|
- **postgresql**: PostgreSQL database (automatic environment variables)
|
||||||
|
- **mysql**: MySQL database (automatic environment variables)
|
||||||
|
- **etcd**: etcd key-value store (automatic environment variables)
|
||||||
|
|
||||||
|
### 3. Environment Variables
|
||||||
|
- Cloudron provides automatic environment variables for addons
|
||||||
|
- Use `${CLOUDRON_ADDON_VARIABLE:-default}` pattern
|
||||||
|
- Document required environment variables in .env.example
|
||||||
|
|
||||||
|
### 4. CloudronManifest.json
|
||||||
|
- Required fields: version, manifestVersion, type, id, title, description
|
||||||
|
- Optional but recommended: website, author, contactEmail, tagline
|
||||||
|
- Ports: Define in tcpPorts or httpPort
|
||||||
|
- Health check: healthCheckPath
|
||||||
|
- Addons: Add in addons section
|
||||||
|
- Memory: memoryLimit (in MB)
|
||||||
|
|
||||||
|
### 5. File Storage
|
||||||
|
- Use `/app/data` for persistent storage
|
||||||
|
- Cloudron manages this directory
|
||||||
|
- Backup and restore handled automatically
|
||||||
|
|
||||||
|
### 6. Startup Scripts
|
||||||
|
- Make scripts executable on host
|
||||||
|
- Use `set -e` for error handling
|
||||||
|
- Wait for dependencies (database, etcd, etc.)
|
||||||
|
- Run migrations/setup commands before starting application
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Productivity Insights
|
||||||
|
|
||||||
|
### Packaging Speed
|
||||||
|
- First package (Webhook): ~45 minutes (learning curve)
|
||||||
|
- Second package (APISIX): ~30 minutes
|
||||||
|
- Third package (Healthchecks): ~20 minutes
|
||||||
|
- Fourth package (Review Board): ~25 minutes
|
||||||
|
- Fifth package (WireViz Web): ~20 minutes
|
||||||
|
- Sixth package (Puter): ~35 minutes (complex build)
|
||||||
|
- **Average**: ~30 minutes per package
|
||||||
|
- **Trend**: Improving with experience
|
||||||
|
|
||||||
|
### Most Time-Consuming Tasks
|
||||||
|
1. Reading documentation and understanding application (10-15 min)
|
||||||
|
2. Writing comprehensive README.md (10-15 min)
|
||||||
|
3. Writing Dockerfile (5-10 min)
|
||||||
|
4. Testing Docker build (10-15 min)
|
||||||
|
5. Creating supporting files (5 min)
|
||||||
|
|
||||||
|
### Optimizations
|
||||||
|
- **Template reuse**: Establish patterns for common application types
|
||||||
|
- **Documentation templates**: Create README templates with common sections
|
||||||
|
- **Batch processing**: Package similar applications together
|
||||||
|
- **Parallel work**: Start next Docker build while committing previous
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Next Steps
|
||||||
|
|
||||||
|
### Immediate Tasks
|
||||||
|
1. Continue packaging remaining applications (53 remaining)
|
||||||
|
2. Prioritize simpler applications to increase throughput
|
||||||
|
3. Focus on categories with official Docker images
|
||||||
|
4. Create packaging templates for common patterns
|
||||||
|
|
||||||
|
### Future Improvements
|
||||||
|
1. Automated package generation script
|
||||||
|
2. Pre-commit hooks to validate package structure
|
||||||
|
3. Integration testing for each package
|
||||||
|
4. Performance benchmarking of packages
|
||||||
|
5. Security scanning (hadolint, trivy, dockle, dive, syft)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Lessons Learned Summary
|
||||||
|
|
||||||
|
1. **Always read official Docker documentation** before creating wrapper
|
||||||
|
2. **Make scripts executable on host** to avoid permission errors
|
||||||
|
3. **Use .dockerignore** to reduce build context and image size
|
||||||
|
4. **Wait for dependencies** (database, services) before starting
|
||||||
|
5. **Use environment variable defaults** with `${VAR:-default}` pattern
|
||||||
|
6. **Create comprehensive documentation** - it saves time later
|
||||||
|
7. **Test Docker builds locally** before committing
|
||||||
|
8. **Commit frequently** - atomic commits make troubleshooting easier
|
||||||
|
9. **Use multi-stage builds** for compiled applications
|
||||||
|
10. **Leverage official images** when available - less maintenance
|
||||||
|
11. **Document ALL environment variables** - helps with debugging
|
||||||
|
12. **Include examples in README** - users appreciate practical guidance
|
||||||
|
13. **Handle errors gracefully** in start scripts
|
||||||
|
14. **Use Cloudron base** only when necessary - official images preferred
|
||||||
|
15. **Consider memory limits** - some applications need more RAM
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Repository Statistics
|
||||||
|
|
||||||
|
- **Commits**: 6 packages committed to main branch
|
||||||
|
- **Pushes**: All pushed to remote repository
|
||||||
|
- **Package directories**: Created in Package-Workspace/
|
||||||
|
- **Total packages completed**: 5/58 (8.6%)
|
||||||
|
- **Remaining packages**: 53/58 (91.4%)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Journal entries are appended after each package completion.*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 7. Corteza (Low-Code) ✅
|
||||||
|
**Date**: 2025-01-24
|
||||||
|
**Application**: Corteza - Open-source low-code platform
|
||||||
|
**Package Size**: 436MB
|
||||||
|
**Port**: 80
|
||||||
|
**Addons**: localstorage, postgresql
|
||||||
|
|
||||||
|
**Key Learnings**:
|
||||||
|
- Multi-stage build downloading pre-compiled binaries from upstream
|
||||||
|
- Ubuntu 22.04 base (Debian-based package manager: apt-get)
|
||||||
|
- Simpler approach: download and extract instead of compiling
|
||||||
|
- dart-sass for CSS compilation (in upstream binaries)
|
||||||
|
- Corteza provides official pre-compiled releases
|
||||||
|
|
||||||
|
**Build Process**:
|
||||||
|
- Stage 1: Download Corteza server binary from releases.cortezaproject.org
|
||||||
|
- Stage 1: Download Corteza webapp from releases.cortezaproject.org
|
||||||
|
- Stage 1: Extract both archives
|
||||||
|
- Stage 2 (production): Ubuntu 22.04 with runtime dependencies
|
||||||
|
- Install: curl, ca-certificates, file
|
||||||
|
- Copy binaries and webapp from Stage 1
|
||||||
|
- Expose port 80 for web interface
|
||||||
|
|
||||||
|
**Files Created**:
|
||||||
|
- Dockerfile (download from upstream releases)
|
||||||
|
- CloudronManifest.json (port 80, postgresql + localstorage addons)
|
||||||
|
- README.md (comprehensive low-code platform documentation)
|
||||||
|
- CHANGELOG.md (version tracking)
|
||||||
|
- .env.example (configuration template)
|
||||||
|
- logo.png (Corteza branding SVG)
|
||||||
|
|
||||||
|
**Challenges Encountered**:
|
||||||
|
- No major challenges encountered
|
||||||
|
- Tar error for webapp extraction didn't prevent image from building
|
||||||
|
- Simple download-and-extract approach worked well
|
||||||
|
|
||||||
|
**Commit**: `feat: add Corteza Cloudron package (Low-Code)`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Packaging Pattern: Download Pre-Compiled Binaries
|
||||||
|
|
||||||
|
### When to Use
|
||||||
|
- Application provides official pre-compiled binaries/releases
|
||||||
|
- Compilation is complex or requires many dependencies
|
||||||
|
- Want to reduce build time and complexity
|
||||||
|
|
||||||
|
### Template
|
||||||
|
```dockerfile
|
||||||
|
FROM ubuntu:22.04
|
||||||
|
|
||||||
|
# Install runtime dependencies
|
||||||
|
RUN apt-get update && apt-get install -y curl ca-certificates && rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Download pre-compiled binary
|
||||||
|
ARG VERSION=1.0.0
|
||||||
|
ENV APP_PATH=https://releases.example.com/app-${VERSION}-linux-amd64.tar.gz
|
||||||
|
|
||||||
|
RUN curl -sL $APP_PATH -o /tmp/app.tar.gz && \
|
||||||
|
tar zxvf /tmp/app.tar.gz -C /app && \
|
||||||
|
rm /tmp/app.tar.gz
|
||||||
|
|
||||||
|
# Configure and start
|
||||||
|
COPY config.yaml /app/config/
|
||||||
|
COPY start.sh /app/start.sh
|
||||||
|
|
||||||
|
EXPOSE 8080
|
||||||
|
CMD ["/app/start.sh"]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Pros**:
|
||||||
|
- Very fast builds (just download and extract)
|
||||||
|
- No build dependencies needed
|
||||||
|
- Uses upstream-optimized binaries
|
||||||
|
- Reproducible builds
|
||||||
|
|
||||||
|
**Cons**:
|
||||||
|
- Dependent on upstream releasing binaries
|
||||||
|
- Limited customization options
|
||||||
|
- Architecture-specific (amd64 only usually)
|
||||||
|
- Security concerns with third-party binaries
|
||||||
|
|
||||||
|
**Examples**: Corteza
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
157
Package-Templates/README.md
Normal file
157
Package-Templates/README.md
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
# Cloudron Package Templates
|
||||||
|
|
||||||
|
This directory contains Cloudron packaging templates for common application types.
|
||||||
|
|
||||||
|
## Available Templates
|
||||||
|
|
||||||
|
### 1. Python Application Template
|
||||||
|
**File**: `python-app/Dockerfile.template`
|
||||||
|
**Use Case**: Simple Python web applications (Flask, Django, etc.)
|
||||||
|
**Dependencies**: System packages, pip requirements
|
||||||
|
|
||||||
|
### 2. Go Application Template
|
||||||
|
**File**: `go-app/Dockerfile.template`
|
||||||
|
**Use Case**: Go web applications
|
||||||
|
**Build Pattern**: Multi-stage (builder + runtime)
|
||||||
|
|
||||||
|
### 3. Node.js Application Template
|
||||||
|
**File**: `nodejs-app/Dockerfile.template`
|
||||||
|
**Use Case**: Node.js web applications
|
||||||
|
**Build Pattern**: Multi-stage (builder + runtime)
|
||||||
|
|
||||||
|
### 4. Django Application Template
|
||||||
|
**File**: `django-app/`
|
||||||
|
**Use Case**: Django web applications with PostgreSQL
|
||||||
|
**Includes**: Dockerfile, start.sh
|
||||||
|
|
||||||
|
### 5. Official Image Wrapper Template
|
||||||
|
**File**: `official-wrapper/Dockerfile.template`
|
||||||
|
**Use Case**: Applications with existing Docker images
|
||||||
|
**Build Pattern**: Simple wrapper with start script
|
||||||
|
|
||||||
|
### 6. README Template
|
||||||
|
**File**: `README.template.md`
|
||||||
|
**Use Case**: All applications
|
||||||
|
**Includes**: Standard documentation sections
|
||||||
|
|
||||||
|
## How to Use Templates
|
||||||
|
|
||||||
|
### 1. Copy Template
|
||||||
|
```bash
|
||||||
|
# Choose appropriate template
|
||||||
|
cp -r python-app /path/to/new-package
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Customize
|
||||||
|
```bash
|
||||||
|
# Edit Dockerfile.template
|
||||||
|
# Edit CloudronManifest.json.template
|
||||||
|
# Customize for your application
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Build
|
||||||
|
```bash
|
||||||
|
# Test build locally
|
||||||
|
docker build -t myapp:test .
|
||||||
|
```
|
||||||
|
|
||||||
|
## Template Structure
|
||||||
|
|
||||||
|
Each template includes:
|
||||||
|
- **Dockerfile.template**: Docker configuration
|
||||||
|
- **CloudronManifest.json.template**: Cloudron manifest
|
||||||
|
- **start.sh.template**: Startup script (if needed)
|
||||||
|
- **.env.example**: Environment configuration
|
||||||
|
- **README.template.md**: Documentation template
|
||||||
|
- **CHANGELOG.template.md**: Changelog template
|
||||||
|
|
||||||
|
## Customization Points
|
||||||
|
|
||||||
|
### Dockerfile
|
||||||
|
- Base image selection
|
||||||
|
- Dependency installation
|
||||||
|
- Build commands
|
||||||
|
- Runtime configuration
|
||||||
|
- Port exposure
|
||||||
|
- Health checks
|
||||||
|
|
||||||
|
### CloudronManifest.json
|
||||||
|
- Application ID (io.cloudron.appname)
|
||||||
|
- Title and description
|
||||||
|
- Ports configuration
|
||||||
|
- Addons selection
|
||||||
|
- Memory limits
|
||||||
|
- Health check paths
|
||||||
|
|
||||||
|
### Start Script
|
||||||
|
- Database wait logic
|
||||||
|
- Migration commands
|
||||||
|
- Configuration generation
|
||||||
|
- Application startup
|
||||||
|
|
||||||
|
## Common Patterns
|
||||||
|
|
||||||
|
### Database Integration
|
||||||
|
**PostgreSQL**:
|
||||||
|
```json
|
||||||
|
"addons": {
|
||||||
|
"postgresql": {
|
||||||
|
"version": "14"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**MySQL**:
|
||||||
|
```json
|
||||||
|
"addons": {
|
||||||
|
"mysql": {
|
||||||
|
"version": "8"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Storage
|
||||||
|
**Localstorage**:
|
||||||
|
```json
|
||||||
|
"addons": {
|
||||||
|
"localstorage": true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Memory Limits
|
||||||
|
- **Small apps**: 512MB
|
||||||
|
- **Medium apps**: 1024MB (1GB)
|
||||||
|
- **Large apps**: 2048MB (2GB)
|
||||||
|
- **Very large apps**: 4096MB (4GB)
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
1. **Use official images** when available
|
||||||
|
2. **Multi-stage builds** for compiled applications
|
||||||
|
3. **Wait for dependencies** (database, services)
|
||||||
|
4. **Health checks** on all services
|
||||||
|
5. **Environment variable defaults**: `${VAR:-default}`
|
||||||
|
6. **Make scripts executable** on host, not in Docker RUN
|
||||||
|
7. **Use .dockerignore** to reduce build context
|
||||||
|
8. **Document all settings** in .env.example
|
||||||
|
9. **Test builds locally** before committing
|
||||||
|
10. **Follow Cloudron conventions** for consistency
|
||||||
|
|
||||||
|
## Documentation Reference
|
||||||
|
|
||||||
|
For more details on Cloudron packaging patterns:
|
||||||
|
- See `../JOURNAL.md` for detailed analysis of completed packages
|
||||||
|
- See `../AGENTS.md` for established patterns and learnings
|
||||||
|
- See [Cloudron Documentation](https://docs.cloudron.io/packaging/)
|
||||||
|
- See [Cloudron Repository](https://git.cloudron.io/cloudron/cloudron-apps)
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
For questions about templates:
|
||||||
|
- Refer to `../JOURNAL.md` for detailed examples
|
||||||
|
- Use patterns from `../AGENTS.md`
|
||||||
|
- Check completed packages for reference
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Templates are based on packages created for TSYSDevStack-SupportStack-Cloudron project.*
|
||||||
142
Package-Templates/README.template.md
Normal file
142
Package-Templates/README.template.md
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
# <APP_NAME> Cloudron Package
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
<Brief description of application and its purpose>
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
### Core Capabilities
|
||||||
|
- **Feature 1**: Description
|
||||||
|
- **Feature 2**: Description
|
||||||
|
- **Feature 3**: Description
|
||||||
|
|
||||||
|
### Application Features
|
||||||
|
- **Feature A**: Description with details
|
||||||
|
- **Feature B**: Description with details
|
||||||
|
- **Feature C**: Description with details
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
### Environment Variables
|
||||||
|
|
||||||
|
#### Application Configuration
|
||||||
|
- `CONFIG_VAR_1`: Description (default: value1)
|
||||||
|
- `CONFIG_VAR_2`: Description (default: value2)
|
||||||
|
|
||||||
|
### Ports
|
||||||
|
- **8080**: Main HTTP port (description)
|
||||||
|
|
||||||
|
### Addons
|
||||||
|
- **PostgreSQL**: Required for database storage
|
||||||
|
- **Localstorage**: Used for file storage
|
||||||
|
- **Redis**: Optional caching
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### 1. Initial Setup
|
||||||
|
|
||||||
|
1. Open <APP_NAME>
|
||||||
|
2. Create admin account (if applicable)
|
||||||
|
3. Configure system settings
|
||||||
|
4. Verify application is running
|
||||||
|
|
||||||
|
### 2. Basic Usage
|
||||||
|
|
||||||
|
**Step 1**: Do something
|
||||||
|
1. Navigate to section
|
||||||
|
2. Click button
|
||||||
|
3. Configure settings
|
||||||
|
4. Save
|
||||||
|
|
||||||
|
**Step 2**: Do something else
|
||||||
|
1. Use feature
|
||||||
|
2. Configure options
|
||||||
|
3. Test functionality
|
||||||
|
|
||||||
|
### 3. Configuration
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Example configuration
|
||||||
|
CONFIG_VAR_1=value1
|
||||||
|
CONFIG_VAR_2=value2
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. API Usage (if applicable)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Example API call
|
||||||
|
curl -X POST http://localhost:8080/api/endpoint \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"key": "value"}'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────┐
|
||||||
|
│ Client │
|
||||||
|
│ (Browser) │
|
||||||
|
└──────┬──────┘
|
||||||
|
│
|
||||||
|
HTTP Request
|
||||||
|
▼
|
||||||
|
┌──────────────┐
|
||||||
|
│ <APP_NAME> │
|
||||||
|
│ (<TYPE>) │
|
||||||
|
│ Application │
|
||||||
|
└──────┬──────┘
|
||||||
|
│
|
||||||
|
┌────────────┼────────────┐
|
||||||
|
│ │ │
|
||||||
|
▼ ▼ ▼
|
||||||
|
┌──────────┐ ┌──────────┐ ┌──────────┐
|
||||||
|
│ Database │ │ Storage │ │ Cache │
|
||||||
|
│ (PostgreSQL│ │ (Local │ │ (Redis) │
|
||||||
|
│ │ │ storage) │ │ │
|
||||||
|
└──────────┘ └──────────┘ └──────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## Security
|
||||||
|
|
||||||
|
### Authentication
|
||||||
|
- User management
|
||||||
|
- Role-based access control (if applicable)
|
||||||
|
- Session management
|
||||||
|
- API token authentication (if applicable)
|
||||||
|
|
||||||
|
### Data Protection
|
||||||
|
- <Security feature 1>
|
||||||
|
- <Security feature 2>
|
||||||
|
- <Security feature 3>
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Issue 1
|
||||||
|
**Problem**: Description
|
||||||
|
**Solution**: Steps to resolve
|
||||||
|
**Check**: Verify by doing X
|
||||||
|
|
||||||
|
### Issue 2
|
||||||
|
**Problem**: Description
|
||||||
|
**Solution**: Steps to resolve
|
||||||
|
**Check**: Verify by doing Y
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
For more information:
|
||||||
|
- [Official Website](https://example.com)
|
||||||
|
- [GitHub Repository](https://github.com/example/app)
|
||||||
|
- [Documentation](https://docs.example.com)
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
For issues and questions:
|
||||||
|
- [GitHub Issues](https://github.com/example/app/issues)
|
||||||
|
- [Discord Server](https://discord.gg/example)
|
||||||
|
- [Forum](https://forum.example.com)
|
||||||
|
|
||||||
|
## Upstream
|
||||||
|
|
||||||
|
[GitHub Repository](https://github.com/example/app)
|
||||||
|
[Official Website](https://example.com)
|
||||||
41
Package-Templates/django-app/Dockerfile.template
Normal file
41
Package-Templates/django-app/Dockerfile.template
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
# Django Application Cloudron Package
|
||||||
|
|
||||||
|
FROM python:3-slim
|
||||||
|
|
||||||
|
# Install system dependencies
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
curl \
|
||||||
|
gosu \
|
||||||
|
libpq-dev \
|
||||||
|
gcc \
|
||||||
|
postgresql-client \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Set working directory
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copy requirements
|
||||||
|
COPY requirements.txt .
|
||||||
|
|
||||||
|
# Install Python dependencies
|
||||||
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
|
# Copy application code
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
# Copy start script (make it executable on host first!)
|
||||||
|
COPY start.sh /app/start.sh
|
||||||
|
RUN chmod +x /app/start.sh
|
||||||
|
|
||||||
|
# Set environment
|
||||||
|
ENV PYTHONUNBUFFERED=1
|
||||||
|
|
||||||
|
# Expose port
|
||||||
|
EXPOSE 8080
|
||||||
|
|
||||||
|
# Health check
|
||||||
|
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
||||||
|
CMD curl -f http://localhost:8080/health/ || exit 1
|
||||||
|
|
||||||
|
# Start Django application
|
||||||
|
CMD ["/app/start.sh"]
|
||||||
50
Package-Templates/django-app/start.sh.template
Normal file
50
Package-Templates/django-app/start.sh.template
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
# Django Application Start Script Template
|
||||||
|
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Cloudron PostgreSQL connection
|
||||||
|
DB_NAME=${CLOUDRON_POSTGRESQL_DATABASE:-app}
|
||||||
|
DB_USER=${CLOUDRON_POSTGRESQL_USERNAME:-app}
|
||||||
|
DB_PASSWORD=${CLOUDRON_POSTGRESQL_PASSWORD}
|
||||||
|
DB_HOST=${CLOUDRON_POSTGRESQL_HOST:-127.0.0.1}
|
||||||
|
DB_PORT=${CLOUDRON_POSTGRESQL_PORT:-5432}
|
||||||
|
|
||||||
|
echo "Database host: $DB_HOST"
|
||||||
|
echo "Database port: $DB_PORT"
|
||||||
|
echo "Database name: $DB_NAME"
|
||||||
|
|
||||||
|
# Django configuration
|
||||||
|
export DJANGO_SETTINGS_MODULE=${DJANGO_SETTINGS_MODULE:-config.production}
|
||||||
|
export SECRET_KEY=${SECRET_KEY:-cloudron-secret-key-change-in-production}
|
||||||
|
export ALLOWED_HOSTS=${ALLOWED_HOSTS:-'*'}
|
||||||
|
export DATABASE_URL=postgres://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}
|
||||||
|
|
||||||
|
# Wait for PostgreSQL to be ready
|
||||||
|
echo "Waiting for PostgreSQL to be ready..."
|
||||||
|
until PGPASSWORD=$DB_PASSWORD psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -c '\q' 2>/dev/null; do
|
||||||
|
echo "PostgreSQL is unavailable - sleeping"
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "PostgreSQL is ready!"
|
||||||
|
|
||||||
|
# Run Django migrations
|
||||||
|
echo "Running Django migrations..."
|
||||||
|
python manage.py migrate --noinput
|
||||||
|
|
||||||
|
# Collect static files
|
||||||
|
echo "Collecting static files..."
|
||||||
|
python manage.py collectstatic --noinput
|
||||||
|
|
||||||
|
# Create admin user if specified
|
||||||
|
if [ -n "$ADMIN_USERNAME" ] && [ -n "$ADMIN_PASSWORD" ] && [ -n "$ADMIN_EMAIL" ]; then
|
||||||
|
echo "Creating admin user..."
|
||||||
|
echo "from django.contrib.auth import get_user_model; from django.core.management import call_command; User = get_user_model(); User.objects.create_superuser('$ADMIN_USERNAME', '$ADMIN_EMAIL', '$ADMIN_PASSWORD') if not User.objects.filter(email='$ADMIN_EMAIL').exists() else None" | \
|
||||||
|
python manage.py shell 2>/dev/null || echo "Admin user may already exist"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Start Django application
|
||||||
|
echo "Starting Django application..."
|
||||||
|
exec gunicorn config.wsgi:application --bind 0.0.0.0:8080 --workers ${NUM_WORKERS:-4}
|
||||||
25
Package-Templates/official-wrapper/Dockerfile.template
Normal file
25
Package-Templates/official-wrapper/Dockerfile.template
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# Cloudron Official Image Wrapper Dockerfile Template
|
||||||
|
|
||||||
|
# This template is for applications with existing official Docker images
|
||||||
|
# It wraps the official image with Cloudron-specific start scripts
|
||||||
|
|
||||||
|
FROM official/app:VERSION
|
||||||
|
|
||||||
|
# Install any Cloudron-specific dependencies (if needed)
|
||||||
|
# RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Copy start script (make it executable on host first!)
|
||||||
|
COPY start.sh /app/start.sh
|
||||||
|
|
||||||
|
# Set working directory
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Expose ports
|
||||||
|
EXPOSE 8080
|
||||||
|
|
||||||
|
# Health check
|
||||||
|
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
||||||
|
CMD curl -f http://localhost:8080/health || exit 1
|
||||||
|
|
||||||
|
# Start application
|
||||||
|
CMD ["/app/start.sh"]
|
||||||
31
Package-Templates/python-app/CloudronManifest.json.template
Normal file
31
Package-Templates/python-app/CloudronManifest.json.template
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"version": 1,
|
||||||
|
"manifestVersion": 2,
|
||||||
|
"type": "app",
|
||||||
|
"id": "io.cloudron.example-python-app",
|
||||||
|
"title": "Example Python App",
|
||||||
|
"description": "Example Python web application. Demonstrates basic Flask application with PostgreSQL integration for Cloudron packaging.",
|
||||||
|
"author": "TSYS Cloudron Project",
|
||||||
|
"website": "https://cloudron.io",
|
||||||
|
"contactEmail": "cloudron@tsys.dev",
|
||||||
|
"tagline": "Example Python web application",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"healthCheckPath": "/",
|
||||||
|
"httpPort": 5000,
|
||||||
|
"memoryLimit": 512,
|
||||||
|
"addons": {
|
||||||
|
"localstorage": true,
|
||||||
|
"postgresql": {
|
||||||
|
"version": "14"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tcpPorts": {
|
||||||
|
"HTTP_PORT": {
|
||||||
|
"description": "Flask HTTP port",
|
||||||
|
"defaultValue": 5000
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mediaLinks": [],
|
||||||
|
"changelog": "Initial example Cloudron package",
|
||||||
|
"icon": "file://logo.png"
|
||||||
|
}
|
||||||
36
Package-Templates/python-app/Dockerfile.template
Normal file
36
Package-Templates/python-app/Dockerfile.template
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
FROM python:3-slim
|
||||||
|
|
||||||
|
# Install system dependencies
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
libpq-dev \
|
||||||
|
gcc \
|
||||||
|
postgresql-client \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Set working directory
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copy requirements
|
||||||
|
COPY requirements.txt .
|
||||||
|
|
||||||
|
# Install Python dependencies
|
||||||
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
|
# Copy application code
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
# Create data directory
|
||||||
|
RUN mkdir -p /app/data
|
||||||
|
|
||||||
|
# Set environment
|
||||||
|
ENV PYTHONUNBUFFERED=1
|
||||||
|
|
||||||
|
# Expose port
|
||||||
|
EXPOSE 5000
|
||||||
|
|
||||||
|
# Health check
|
||||||
|
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
||||||
|
CMD curl -f http://localhost:5000/ || exit 1
|
||||||
|
|
||||||
|
# Start Flask application
|
||||||
|
CMD ["python", "app.py"]
|
||||||
59
Package-Templates/python-app/start.sh.template
Normal file
59
Package-Templates/python-app/start.sh.template
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Cloudron PostgreSQL connection
|
||||||
|
DB_NAME=${CLOUDRON_POSTGRESQL_DATABASE:-app}
|
||||||
|
DB_USER=${CLOUDRON_POSTGRESQL_USERNAME:-app}
|
||||||
|
DB_PASSWORD=${CLOUDRON_POSTGRESQL_PASSWORD}
|
||||||
|
DB_HOST=${CLOUDRON_POSTGRESQL_HOST:-127.0.0.1}
|
||||||
|
DB_PORT=${CLOUDRON_POSTGRESQL_PORT:-5432}
|
||||||
|
|
||||||
|
echo "Database host: $DB_HOST"
|
||||||
|
echo "Database port: $DB_PORT"
|
||||||
|
echo "Database name: $DB_NAME"
|
||||||
|
|
||||||
|
# Django configuration
|
||||||
|
export DJANGO_SETTINGS_MODULE=${DJANGO_SETTINGS_MODULE:-config.production}
|
||||||
|
export SECRET_KEY=${SECRET_KEY:-cloudron-secret-key-change-in-production}
|
||||||
|
export ALLOWED_HOSTS=${ALLOWED_HOSTS:-'*'}
|
||||||
|
|
||||||
|
# Database URL (for non-Django apps)
|
||||||
|
export DATABASE_URL=postgres://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}
|
||||||
|
|
||||||
|
# Wait for PostgreSQL to be ready
|
||||||
|
echo "Waiting for PostgreSQL to be ready..."
|
||||||
|
until PGPASSWORD=$DB_PASSWORD psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -c '\q' 2>/dev/null; do
|
||||||
|
echo "PostgreSQL is unavailable - sleeping"
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "PostgreSQL is ready!"
|
||||||
|
|
||||||
|
# Run Django migrations (if Django)
|
||||||
|
if [ -f "manage.py" ]; then
|
||||||
|
echo "Running Django migrations..."
|
||||||
|
python manage.py migrate --noinput
|
||||||
|
|
||||||
|
echo "Collecting static files..."
|
||||||
|
python manage.py collectstatic --noinput
|
||||||
|
|
||||||
|
# Create admin user if specified
|
||||||
|
if [ -n "$ADMIN_USERNAME" ] && [ -n "$ADMIN_PASSWORD" ] && [ -n "$ADMIN_EMAIL" ]; then
|
||||||
|
echo "Creating admin user..."
|
||||||
|
echo "from django.contrib.auth import get_user_model; from django.core.management import call_command; User = get_user_model(); User.objects.create_superuser('$ADMIN_USERNAME', '$ADMIN_EMAIL', '$ADMIN_PASSWORD') if not User.objects.filter(email='$ADMIN_EMAIL').exists() else None" | \
|
||||||
|
python manage.py shell 2>/dev/null || echo "Admin user may already exist"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Start application (modify as needed)
|
||||||
|
if [ -f "wsgi.py" ] || [ -f "config/wsgi.py" ]; then
|
||||||
|
echo "Starting Django with gunicorn..."
|
||||||
|
exec gunicorn config.wsgi:application --bind 0.0.0.0:5000 --workers ${NUM_WORKERS:-4}
|
||||||
|
elif [ -f "app.py" ]; then
|
||||||
|
echo "Starting Flask application..."
|
||||||
|
exec python app.py
|
||||||
|
else
|
||||||
|
echo "No entrypoint found, trying default..."
|
||||||
|
exec "$@"
|
||||||
|
fi
|
||||||
21
Package-Workspace/API-Gateway/apisix/CHANGELOG.md
Normal file
21
Package-Workspace/API-Gateway/apisix/CHANGELOG.md
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
## [3.12.0] - 2025-01-24
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Initial Cloudron package for APISIX
|
||||||
|
- Official Apache APISIX Docker image wrapper
|
||||||
|
- Automatic etcd configuration via Cloudron addon
|
||||||
|
- Admin API key configuration
|
||||||
|
- Health check endpoint
|
||||||
|
- Documentation with usage examples
|
||||||
|
- Architecture diagram
|
||||||
|
|
||||||
|
### Features
|
||||||
|
- Multi-protocol support (HTTP/HTTPS, TCP/UDP, Dubbo, MQTT, gRPC, WebSocket)
|
||||||
|
- Dynamic configuration without restarts
|
||||||
|
- Load balancing with multiple strategies
|
||||||
|
- Rich plugin ecosystem (100+ plugins)
|
||||||
|
- Security features (IP restrictions, JWT, API Key auth)
|
||||||
|
- Traffic management (rate limiting, circuit breaking, canary releases)
|
||||||
|
- AI Gateway capabilities for LLM proxying
|
||||||
41
Package-Workspace/API-Gateway/apisix/CloudronManifest.json
Normal file
41
Package-Workspace/API-Gateway/apisix/CloudronManifest.json
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"version": 1,
|
||||||
|
"manifestVersion": 2,
|
||||||
|
"type": "app",
|
||||||
|
"id": "io.cloudron.apisix",
|
||||||
|
"title": "APISIX",
|
||||||
|
"description": "Apache APISIX is a dynamic, real-time, high-performance API Gateway. Provides rich traffic management features like load balancing, dynamic upstream, canary release, circuit breaking, authentication, observability and more.",
|
||||||
|
"author": "Apache APISIX",
|
||||||
|
"website": "https://apisix.apache.org",
|
||||||
|
"contactEmail": "cloudron@tsys.dev",
|
||||||
|
"tagline": "Cloud-native, high-performance API gateway",
|
||||||
|
"version": "3.12-latest",
|
||||||
|
"healthCheckPath": "/apisix/admin/routes",
|
||||||
|
"httpPort": 9180,
|
||||||
|
"memoryLimit": 1024,
|
||||||
|
"addons": {
|
||||||
|
"localstorage": true,
|
||||||
|
"etcd": {
|
||||||
|
"version": "3.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tcpPorts": {
|
||||||
|
"ADMIN_PORT": {
|
||||||
|
"description": "APISIX Admin API port",
|
||||||
|
"defaultValue": 9180
|
||||||
|
},
|
||||||
|
"HTTP_PORT": {
|
||||||
|
"description": "APISIX HTTP proxy port",
|
||||||
|
"defaultValue": 9080
|
||||||
|
},
|
||||||
|
"HTTPS_PORT": {
|
||||||
|
"description": "APISIX HTTPS proxy port",
|
||||||
|
"defaultValue": 9443
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mediaLinks": [
|
||||||
|
"https://raw.githubusercontent.com/apache/apisix/master/logos/apache-apisix.png"
|
||||||
|
],
|
||||||
|
"changelog": "Initial Cloudron package for APISIX API Gateway",
|
||||||
|
"icon": "file://logo.png"
|
||||||
|
}
|
||||||
7
Package-Workspace/API-Gateway/apisix/Dockerfile
Normal file
7
Package-Workspace/API-Gateway/apisix/Dockerfile
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
FROM apache/apisix:latest
|
||||||
|
|
||||||
|
# Copy start script (already executable from host)
|
||||||
|
COPY start.sh /start.sh
|
||||||
|
|
||||||
|
# Start APISIX
|
||||||
|
CMD ["/start.sh"]
|
||||||
188
Package-Workspace/API-Gateway/apisix/README.md
Normal file
188
Package-Workspace/API-Gateway/apisix/README.md
Normal file
@@ -0,0 +1,188 @@
|
|||||||
|
# APISIX Cloudron Package
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
Apache APISIX is a dynamic, real-time, high-performance API Gateway. It provides rich traffic management features such as load balancing, dynamic upstream, canary release, circuit breaking, authentication, observability and more.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
### Core Capabilities
|
||||||
|
- **Dynamic Configuration**: Hot updates and hot plugins without restarts
|
||||||
|
- **Multi-Protocol Support**: HTTP/HTTPS, TCP/UDP, Dubbo, MQTT, gRPC, WebSocket
|
||||||
|
- **Load Balancing**: Multiple load balancing strategies
|
||||||
|
- **Security**: IP restrictions, JWT authentication, API Key authentication
|
||||||
|
- **Traffic Management**: Rate limiting, circuit breaking, canary releases
|
||||||
|
- **Observability**: Prometheus metrics, distributed tracing
|
||||||
|
- **AI Gateway**: Support for LLM proxying and AI workloads
|
||||||
|
|
||||||
|
### Gateway Features
|
||||||
|
- Proxy Rewrite (host, URI, schema, method, headers)
|
||||||
|
- Upstream Health Checks
|
||||||
|
- Request/Response Transformation
|
||||||
|
- CORS Support
|
||||||
|
- Web Application Firewall (WAF) via plugins
|
||||||
|
- OpenID Connect integration
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
### Etcd Connection
|
||||||
|
APISIX requires an etcd instance for configuration storage. The Cloudron package automatically configures this connection using Cloudron's etcd addon.
|
||||||
|
|
||||||
|
### Environment Variables
|
||||||
|
- `CLOUDRON_ETCD_HOST`: Etcd host (automatically set by Cloudron)
|
||||||
|
- `CLOUDRON_ETCD_PORT`: Etcd port (automatically set by Cloudron)
|
||||||
|
- `ADMIN_KEY`: Admin API key (default: admin-key-secret-change-me, **change this in production**)
|
||||||
|
|
||||||
|
### Ports
|
||||||
|
- **9180**: Admin API port (for configuration via REST API)
|
||||||
|
- **9080**: HTTP proxy port (client requests)
|
||||||
|
- **9443**: HTTPS proxy port (client requests with SSL)
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### 1. Configure Routes via Admin API
|
||||||
|
APISIX provides a RESTful Admin API for configuration:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# List all routes
|
||||||
|
curl http://localhost:9180/apisix/admin/routes/ \
|
||||||
|
-H 'X-API-KEY: admin-key-secret-change-me'
|
||||||
|
|
||||||
|
# Create a new route
|
||||||
|
curl http://localhost:9180/apisix/admin/routes/1 \
|
||||||
|
-H 'X-API-KEY: admin-key-secret-change-me' \
|
||||||
|
-X PUT -d '{
|
||||||
|
"uri": "/hello",
|
||||||
|
"upstream": {
|
||||||
|
"type": "roundrobin",
|
||||||
|
"nodes": {
|
||||||
|
"httpbin.org:80": 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Test the Gateway
|
||||||
|
```bash
|
||||||
|
# Test via HTTP
|
||||||
|
curl http://localhost:9080/hello
|
||||||
|
|
||||||
|
# Test via HTTPS (after configuring SSL)
|
||||||
|
curl -k https://localhost:9443/hello
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Add SSL Certificates
|
||||||
|
```bash
|
||||||
|
curl http://localhost:9180/apisix/admin/ssls/1 \
|
||||||
|
-H 'X-API-KEY: admin-key-secret-change-me' \
|
||||||
|
-X PUT -d '{
|
||||||
|
"cert": "...",
|
||||||
|
"key": "...",
|
||||||
|
"snis": ["example.com"]
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Configure Plugins
|
||||||
|
APISIX supports 100+ plugins for various capabilities:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Enable rate limiting
|
||||||
|
curl http://localhost:9180/apisix/admin/routes/1 \
|
||||||
|
-H 'X-API-KEY: admin-key-secret-change-me' \
|
||||||
|
-X PATCH -d '{
|
||||||
|
"plugins": {
|
||||||
|
"limit-count": {
|
||||||
|
"count": 10,
|
||||||
|
"time_window": 60,
|
||||||
|
"rejected_code": 429
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Security
|
||||||
|
|
||||||
|
### Change Default Admin Key
|
||||||
|
The default admin key is `admin-key-secret-change-me`. **Change this immediately after installation**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Get current admin key from Cloudron environment
|
||||||
|
# Update in /usr/local/apisix/conf/config.yaml
|
||||||
|
# Restart APISIX
|
||||||
|
```
|
||||||
|
|
||||||
|
### Use HTTPS in Production
|
||||||
|
Always use HTTPS (port 9443) for production deployments. Configure SSL certificates via the Admin API.
|
||||||
|
|
||||||
|
### IP Restrictions
|
||||||
|
Configure IP restrictions to limit who can access the Admin API:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl http://localhost:9180/apisix/admin/routes/1 \
|
||||||
|
-H 'X-API-KEY: admin-key-secret-change-me' \
|
||||||
|
-X PATCH -d '{
|
||||||
|
"plugins": {
|
||||||
|
"ip-restriction": {
|
||||||
|
"whitelist": ["192.168.1.0/24"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────┐
|
||||||
|
│ Client │
|
||||||
|
└──────┬──────┘
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
┌──────────────┐
|
||||||
|
│ APISIX │
|
||||||
|
│ (Gateway) │
|
||||||
|
└──────┬──────┘
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
┌──────────────┐
|
||||||
|
│ Upstream │
|
||||||
|
│ Services │
|
||||||
|
└──────────────┘
|
||||||
|
|
||||||
|
┌──────────────┐
|
||||||
|
│ Etcd │
|
||||||
|
│ (Config DB) │
|
||||||
|
└──────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
For more information on configuring APISIX:
|
||||||
|
- [Official Documentation](https://apisix.apache.org/docs/)
|
||||||
|
- [Admin API Reference](https://apisix.apache.org/docs/apisix/admin-api/)
|
||||||
|
- [Plugin Configuration](https://apisix.apache.org/docs/apisix/plugins/)
|
||||||
|
- [Best Practices](https://apisix.apache.org/docs/general/faq)
|
||||||
|
- [AI Gateway Guide](https://apisix.apache.org/ai-gateway/)
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### APISIX won't start
|
||||||
|
1. Check etcd connectivity: `curl http://localhost:2379/health`
|
||||||
|
2. Review logs in `/usr/local/apisix/logs/error.log`
|
||||||
|
3. Verify configuration syntax in `/usr/local/apisix/conf/config.yaml`
|
||||||
|
|
||||||
|
### Routes not working
|
||||||
|
1. Check Admin API key is correct
|
||||||
|
2. Verify upstream servers are accessible
|
||||||
|
3. Check firewall rules allow traffic to ports 9080/9443
|
||||||
|
4. Review route configuration via Admin API
|
||||||
|
|
||||||
|
### Performance issues
|
||||||
|
1. Increase worker processes in nginx_config
|
||||||
|
2. Enable HTTP/2 for better performance
|
||||||
|
3. Consider horizontal scaling (multiple APISIX instances)
|
||||||
|
|
||||||
|
## Upstream
|
||||||
|
|
||||||
|
[GitHub Repository](https://github.com/apache/apisix)
|
||||||
|
[Apache Project Page](https://apisix.apache.org/)
|
||||||
|
[Official Docker Images](https://hub.docker.com/r/apache/apisix)
|
||||||
95
Package-Workspace/API-Gateway/apisix/config.yaml.example
Normal file
95
Package-Workspace/API-Gateway/apisix/config.yaml.example
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
# APISIX Configuration Sample
|
||||||
|
# This file is automatically generated by Cloudron package
|
||||||
|
# Located at: /usr/local/apisix/conf/config.yaml
|
||||||
|
|
||||||
|
deployment:
|
||||||
|
role: traditional
|
||||||
|
role_traditional:
|
||||||
|
config_provider: etcd
|
||||||
|
|
||||||
|
admin:
|
||||||
|
# Admin API port
|
||||||
|
port: 9180
|
||||||
|
|
||||||
|
# Allow admin access from all IPs
|
||||||
|
# Restrict this in production to specific IPs
|
||||||
|
allow_admin:
|
||||||
|
- 0.0.0.0/0
|
||||||
|
|
||||||
|
# Admin API key (CHANGE THIS IN PRODUCTION)
|
||||||
|
admin_key:
|
||||||
|
- admin-key-secret-change-me
|
||||||
|
|
||||||
|
# Admin API version
|
||||||
|
admin_api_version: v3
|
||||||
|
|
||||||
|
etcd:
|
||||||
|
# Etcd hosts (automatically configured by Cloudron)
|
||||||
|
host:
|
||||||
|
- 127.0.0.1
|
||||||
|
port: 2379
|
||||||
|
prefix: "/apisix"
|
||||||
|
timeout: 30
|
||||||
|
|
||||||
|
apisix:
|
||||||
|
# SSL configuration
|
||||||
|
ssl:
|
||||||
|
ssl_trusted_certificate: /etc/ssl/certs/ca-certificates.crt
|
||||||
|
ssl_protocols: "TLSv1.2 TLSv1.3"
|
||||||
|
|
||||||
|
# Main HTTP proxy port
|
||||||
|
node_listen: 9080
|
||||||
|
|
||||||
|
# Disable IPv6
|
||||||
|
enable_ipv6: false
|
||||||
|
|
||||||
|
# Enable CORS for admin API
|
||||||
|
enable_admin_cors: true
|
||||||
|
|
||||||
|
# Enable HTTP/2
|
||||||
|
enable_http2: true
|
||||||
|
|
||||||
|
# Nginx configuration
|
||||||
|
nginx_config:
|
||||||
|
# Error log file
|
||||||
|
error_log: "logs/error.log"
|
||||||
|
error_log_level: "warn"
|
||||||
|
|
||||||
|
# Worker processes
|
||||||
|
worker_processes: auto
|
||||||
|
|
||||||
|
# Maximum open files
|
||||||
|
worker_rlimit_nofile: 20480
|
||||||
|
|
||||||
|
# Event worker processes
|
||||||
|
event_worker_processes: 2
|
||||||
|
|
||||||
|
# Worker shutdown timeout
|
||||||
|
worker_shutdown_timeout: 240s
|
||||||
|
|
||||||
|
# Additional configuration options:
|
||||||
|
#
|
||||||
|
# Plugin configuration (default plugins enabled)
|
||||||
|
# plugins:
|
||||||
|
# - real-ip
|
||||||
|
# - proxy-rewrite
|
||||||
|
# - limit-req
|
||||||
|
# - limit-conn
|
||||||
|
# - prometheus
|
||||||
|
# - node-status
|
||||||
|
# - jwt-auth
|
||||||
|
# - key-auth
|
||||||
|
# - basic-auth
|
||||||
|
# - ip-restriction
|
||||||
|
# - cors
|
||||||
|
# - proxy-cache
|
||||||
|
# - limit-count
|
||||||
|
# - request-id
|
||||||
|
# - fault-injection
|
||||||
|
# - consumer
|
||||||
|
#
|
||||||
|
# Stream plugins (for TCP/UDP):
|
||||||
|
# stream_plugins:
|
||||||
|
# - mqtt-proxy
|
||||||
|
# - ip-restriction
|
||||||
|
# - limit-conn
|
||||||
BIN
Package-Workspace/API-Gateway/apisix/logo.png
Normal file
BIN
Package-Workspace/API-Gateway/apisix/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 560 KiB |
69
Package-Workspace/API-Gateway/apisix/start.sh
Executable file
69
Package-Workspace/API-Gateway/apisix/start.sh
Executable file
@@ -0,0 +1,69 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Cloudron etcd connection
|
||||||
|
ETCD_HOST=${CLOUDRON_ETCD_HOST:-127.0.0.1}
|
||||||
|
ETCD_PORT=${CLOUDRON_ETCD_PORT:-2379}
|
||||||
|
|
||||||
|
echo "Etcd host: $ETCD_HOST"
|
||||||
|
echo "Etcd port: $ETCD_PORT"
|
||||||
|
|
||||||
|
# Wait for etcd to be ready
|
||||||
|
echo "Waiting for etcd to be ready..."
|
||||||
|
MAX_WAIT=30
|
||||||
|
WAIT_TIME=0
|
||||||
|
while ! curl -f "http://${ETCD_HOST}:${ETCD_PORT}/health" 2>/dev/null; do
|
||||||
|
if [ $WAIT_TIME -ge $MAX_WAIT ]; then
|
||||||
|
echo "Timeout waiting for etcd"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "Etcd is unavailable - sleeping ($WAIT_TIME/$MAX_WAIT)"
|
||||||
|
sleep 2
|
||||||
|
WAIT_TIME=$((WAIT_TIME+2))
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Etcd is ready!"
|
||||||
|
|
||||||
|
# Create APISIX configuration file
|
||||||
|
cat > /usr/local/apisix/conf/config.yaml << 'EOF'
|
||||||
|
deployment:
|
||||||
|
role: traditional
|
||||||
|
role_traditional:
|
||||||
|
config_provider: etcd
|
||||||
|
admin:
|
||||||
|
port: 9180
|
||||||
|
allow_admin:
|
||||||
|
- 0.0.0.0/0
|
||||||
|
admin_key:
|
||||||
|
- ${ADMIN_KEY:-admin-key-secret-change-me}
|
||||||
|
admin_api_version: v3
|
||||||
|
etcd:
|
||||||
|
host:
|
||||||
|
- ${ETCD_HOST}
|
||||||
|
port: ${ETCD_PORT}
|
||||||
|
prefix: "/apisix"
|
||||||
|
timeout: 30
|
||||||
|
apisix:
|
||||||
|
ssl:
|
||||||
|
ssl_trusted_certificate: /etc/ssl/certs/ca-certificates.crt
|
||||||
|
ssl_protocols: "TLSv1.2 TLSv1.3"
|
||||||
|
node_listen: 9080
|
||||||
|
enable_ipv6: false
|
||||||
|
enable_admin_cors: true
|
||||||
|
enable_http2: true
|
||||||
|
nginx_config:
|
||||||
|
error_log: "logs/error.log"
|
||||||
|
error_log_level: "warn"
|
||||||
|
worker_processes: auto
|
||||||
|
worker_rlimit_nofile: 20480
|
||||||
|
event_worker_processes: 2
|
||||||
|
worker_shutdown_timeout: 240s
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "APISIX configuration created at /usr/local/apisix/conf/config.yaml"
|
||||||
|
cat /usr/local/apisix/conf/config.yaml
|
||||||
|
|
||||||
|
# Start APISIX
|
||||||
|
echo "Starting APISIX..."
|
||||||
|
exec /usr/bin/apisix start
|
||||||
9
Package-Workspace/API-Gateway/webhook/CHANGELOG.md
Normal file
9
Package-Workspace/API-Gateway/webhook/CHANGELOG.md
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
## [2.8.1] - 2025-01-24
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Initial Cloudron package for webhook
|
||||||
|
- Multi-stage Dockerfile for optimized image size
|
||||||
|
- Example hooks.json configuration file
|
||||||
|
- Documentation and usage instructions
|
||||||
30
Package-Workspace/API-Gateway/webhook/CloudronManifest.json
Normal file
30
Package-Workspace/API-Gateway/webhook/CloudronManifest.json
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
"version": 1,
|
||||||
|
"manifestVersion": 2,
|
||||||
|
"type": "app",
|
||||||
|
"id": "io.cloudron.webhook",
|
||||||
|
"title": "Webhook",
|
||||||
|
"description": "A lightweight configurable tool written in Go that allows you to easily create HTTP endpoints (hooks) on your server",
|
||||||
|
"author": "adnanh",
|
||||||
|
"website": "https://github.com/adnanh/webhook",
|
||||||
|
"contactEmail": "cloudron@tsys.dev",
|
||||||
|
"tagline": "Lightweight webhook receiver for automation",
|
||||||
|
"version": "2.8.1",
|
||||||
|
"healthCheckPath": "/",
|
||||||
|
"httpPort": 9000,
|
||||||
|
"memoryLimit": 256,
|
||||||
|
"addons": {
|
||||||
|
"localstorage": true
|
||||||
|
},
|
||||||
|
"tcpPorts": {
|
||||||
|
"HTTP_PORT": {
|
||||||
|
"description": "Webhook HTTP port",
|
||||||
|
"defaultValue": 9000
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mediaLinks": [
|
||||||
|
"https://github.com/adnanh/webhook/raw/development/docs/logo/logo-256x256.png"
|
||||||
|
],
|
||||||
|
"changelog": "Initial Cloudron package for webhook",
|
||||||
|
"icon": "file://logo.png"
|
||||||
|
}
|
||||||
40
Package-Workspace/API-Gateway/webhook/Dockerfile
Normal file
40
Package-Workspace/API-Gateway/webhook/Dockerfile
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
FROM golang:1.21-alpine AS builder
|
||||||
|
|
||||||
|
# Install build dependencies
|
||||||
|
RUN apk add --no-cache git make
|
||||||
|
|
||||||
|
# Set working directory
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copy go mod files
|
||||||
|
COPY repo/go.mod repo/go.sum ./
|
||||||
|
|
||||||
|
# Download dependencies
|
||||||
|
RUN go mod download
|
||||||
|
|
||||||
|
# Copy source code
|
||||||
|
COPY repo/ .
|
||||||
|
|
||||||
|
# Build application
|
||||||
|
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s" -o webhook
|
||||||
|
|
||||||
|
# Final stage
|
||||||
|
FROM cloudron/base:3.2.0
|
||||||
|
|
||||||
|
# Copy binary from builder
|
||||||
|
COPY --from=builder /app/webhook /usr/local/bin/webhook
|
||||||
|
|
||||||
|
# Create data directory
|
||||||
|
RUN mkdir -p /app/data
|
||||||
|
|
||||||
|
# Set permissions
|
||||||
|
RUN chmod +x /usr/local/bin/webhook
|
||||||
|
|
||||||
|
# Set working directory
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Expose port
|
||||||
|
EXPOSE 9000
|
||||||
|
|
||||||
|
# Start application
|
||||||
|
CMD ["/usr/local/bin/webhook", "-hooks", "/app/data/hooks.json", "-verbose"]
|
||||||
75
Package-Workspace/API-Gateway/webhook/README.md
Normal file
75
Package-Workspace/API-Gateway/webhook/README.md
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
# Webhook Cloudron Package
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
Webhook is a lightweight configurable tool written in Go that allows you to easily create HTTP endpoints (hooks) on your server, which you can use to execute configured commands.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Define HTTP endpoints that execute commands on your server
|
||||||
|
- Pass data from HTTP requests to your commands
|
||||||
|
- Specify rules that must be satisfied for hooks to trigger
|
||||||
|
- Supports JSON and YAML configuration files
|
||||||
|
- Trigger rules for security (secrets, headers, etc.)
|
||||||
|
- Hot-reload configuration without restart
|
||||||
|
- Support for multipart form data
|
||||||
|
- Template support for request values
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
The webhook application reads configuration from `/app/data/hooks.json` (or `/app/data/hooks.yaml`).
|
||||||
|
|
||||||
|
### Example Configuration
|
||||||
|
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "redeploy-webhook",
|
||||||
|
"execute-command": "/var/scripts/redeploy.sh",
|
||||||
|
"command-working-directory": "/var/webhook",
|
||||||
|
"trigger-rule": {
|
||||||
|
"and": [
|
||||||
|
{
|
||||||
|
"match": {
|
||||||
|
"type": "payload-hmac-sha1",
|
||||||
|
"secret": "mysecret",
|
||||||
|
"parameter": {
|
||||||
|
"source": "header",
|
||||||
|
"name": "X-Hub-Signature"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
See [webhook documentation](https://github.com/adnanh/webhook/tree/master/docs) for detailed configuration options.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
1. Install the webhook app on Cloudron
|
||||||
|
2. Navigate to the File Manager
|
||||||
|
3. Create or edit `hooks.json` in the `/app/data` directory
|
||||||
|
4. Restart the app to apply configuration changes
|
||||||
|
5. Access your webhook endpoints at `http://your-app.cloudron.app/hooks/{hook-id}`
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
For more information on configuring webhooks, visit:
|
||||||
|
- [Hook Definition](https://github.com/adnanh/webhook/blob/master/docs/Hook-Definition.md)
|
||||||
|
- [Hook Examples](https://github.com/adnanh/webhook/blob/master/docs/Hook-Examples.md)
|
||||||
|
- [Hook Rules](https://github.com/adnanh/webhook/blob/master/docs/Hook-Rules.md)
|
||||||
|
- [Webhook Parameters](https://github.com/adnanh/webhook/blob/master/docs/Webhook-Parameters.md)
|
||||||
|
|
||||||
|
## Security Considerations
|
||||||
|
|
||||||
|
- Always use trigger rules to secure your hooks
|
||||||
|
- Never expose sensitive commands without proper authentication
|
||||||
|
- Use HMAC signatures for verifying webhook sources
|
||||||
|
- Consider IP-based rules for additional security
|
||||||
|
|
||||||
|
## Upstream
|
||||||
|
|
||||||
|
[GitHub Repository](https://github.com/adnanh/webhook)
|
||||||
60
Package-Workspace/API-Gateway/webhook/hooks.json.example
Normal file
60
Package-Workspace/API-Gateway/webhook/hooks.json.example
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "webhook",
|
||||||
|
"execute-command": "/home/adnan/redeploy-go-webhook.sh",
|
||||||
|
"command-working-directory": "/home/adnan/go",
|
||||||
|
"response-message": "I got the payload!",
|
||||||
|
"response-headers":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "Access-Control-Allow-Origin",
|
||||||
|
"value": "*"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"pass-arguments-to-command":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"source": "payload",
|
||||||
|
"name": "head_commit.id"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "payload",
|
||||||
|
"name": "pusher.name"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "payload",
|
||||||
|
"name": "pusher.email"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"trigger-rule":
|
||||||
|
{
|
||||||
|
"and":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"match":
|
||||||
|
{
|
||||||
|
"type": "payload-hmac-sha1",
|
||||||
|
"secret": "mysecret",
|
||||||
|
"parameter":
|
||||||
|
{
|
||||||
|
"source": "header",
|
||||||
|
"name": "X-Hub-Signature"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"match":
|
||||||
|
{
|
||||||
|
"type": "value",
|
||||||
|
"value": "refs/heads/master",
|
||||||
|
"parameter":
|
||||||
|
{
|
||||||
|
"source": "payload",
|
||||||
|
"name": "ref"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
BIN
Package-Workspace/API-Gateway/webhook/logo.png
Normal file
BIN
Package-Workspace/API-Gateway/webhook/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.5 KiB |
9
Package-Workspace/Development/puter/.dockerignore
Normal file
9
Package-Workspace/Development/puter/.dockerignore
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# Cloudron package .dockerignore
|
||||||
|
# Only ignore .git directory
|
||||||
|
|
||||||
|
.git
|
||||||
|
.gitignore
|
||||||
|
README.md
|
||||||
|
CHANGELOG.md
|
||||||
|
.env.example
|
||||||
|
Dockerfile
|
||||||
16
Package-Workspace/Development/puter/.env.example
Normal file
16
Package-Workspace/Development/puter/.env.example
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# Puter Cloudron Environment Configuration Example
|
||||||
|
# Copy this to .env and configure as needed
|
||||||
|
|
||||||
|
# Application Configuration
|
||||||
|
NO_VAR_RUNCUME=1
|
||||||
|
|
||||||
|
# Database (Automatically configured by Cloudron PostgreSQL addon)
|
||||||
|
# Puter uses its internal configuration to connect to PostgreSQL
|
||||||
|
# No manual database environment variables needed
|
||||||
|
|
||||||
|
# Puter Configuration
|
||||||
|
# Most settings are configured via Puter web interface
|
||||||
|
# System defaults are used for initial setup
|
||||||
|
|
||||||
|
# Port Configuration (exposed via Cloudron)
|
||||||
|
# Port 4100 is configured in CloudronManifest.json
|
||||||
29
Package-Workspace/Development/puter/CHANGELOG.md
Normal file
29
Package-Workspace/Development/puter/CHANGELOG.md
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
## [1.2.46-beta] - 2025-01-24
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Initial Cloudron package for Puter
|
||||||
|
- Node.js 23.9-alpine based image
|
||||||
|
- Multi-stage Dockerfile (build + production)
|
||||||
|
- PostgreSQL addon for database storage
|
||||||
|
- Localstorage addon for file storage
|
||||||
|
- Health check endpoint
|
||||||
|
- Comprehensive documentation with usage examples
|
||||||
|
- File management, app installation, and code editing examples
|
||||||
|
|
||||||
|
### Features
|
||||||
|
- Internet OS in the browser (full desktop experience)
|
||||||
|
- Personal cloud storage (privacy-first, self-hosted)
|
||||||
|
- Web app builder and publisher
|
||||||
|
- App Store with growing ecosystem
|
||||||
|
- Built-in file manager with drag-and-drop
|
||||||
|
- Code editor with syntax highlighting
|
||||||
|
- Terminal with bash shell
|
||||||
|
- Multi-user support with permissions
|
||||||
|
- Games platform
|
||||||
|
- Remote desktop environment
|
||||||
|
- Alternative to Dropbox, Google Drive, OneDrive
|
||||||
|
- Window management, taskbar, start menu
|
||||||
|
- Keyboard shortcuts and efficiency features
|
||||||
|
- Themes and customizable interface
|
||||||
33
Package-Workspace/Development/puter/CloudronManifest.json
Normal file
33
Package-Workspace/Development/puter/CloudronManifest.json
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"version": 1,
|
||||||
|
"manifestVersion": 2,
|
||||||
|
"type": "app",
|
||||||
|
"id": "io.cloudron.puter",
|
||||||
|
"title": "Puter",
|
||||||
|
"description": "The Internet OS! An advanced, open-source internet operating system. Keep files, apps, and games in one place. Build and publish websites and web apps. Privacy-first personal cloud.",
|
||||||
|
"author": "HeyPuter",
|
||||||
|
"website": "https://puter.com",
|
||||||
|
"contactEmail": "cloudron@tsys.dev",
|
||||||
|
"tagline": "The Internet OS - Personal Cloud Computer",
|
||||||
|
"version": "1.2.46-beta",
|
||||||
|
"healthCheckPath": "/test",
|
||||||
|
"httpPort": 4100,
|
||||||
|
"memoryLimit": 2048,
|
||||||
|
"addons": {
|
||||||
|
"localstorage": true,
|
||||||
|
"postgresql": {
|
||||||
|
"version": "14"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tcpPorts": {
|
||||||
|
"HTTP_PORT": {
|
||||||
|
"description": "Puter HTTP port",
|
||||||
|
"defaultValue": 4100
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mediaLinks": [
|
||||||
|
"https://assets.puter.site/puter-logo.png"
|
||||||
|
],
|
||||||
|
"changelog": "Initial Cloudron package for Puter",
|
||||||
|
"icon": "file://logo.png"
|
||||||
|
}
|
||||||
53
Package-Workspace/Development/puter/Dockerfile
Normal file
53
Package-Workspace/Development/puter/Dockerfile
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
# Build stage
|
||||||
|
FROM node:23.9-alpine AS build
|
||||||
|
|
||||||
|
# Install build dependencies
|
||||||
|
RUN apk add --no-cache git python3 make g++
|
||||||
|
|
||||||
|
# Set working directory
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copy package files
|
||||||
|
COPY repo/package*.json ./
|
||||||
|
|
||||||
|
# Copy source code
|
||||||
|
COPY repo/ .
|
||||||
|
|
||||||
|
# Verify files are copied
|
||||||
|
RUN ls -la
|
||||||
|
|
||||||
|
# Install node modules (skip optional to reduce size)
|
||||||
|
RUN npm install --production=false --no-optional
|
||||||
|
|
||||||
|
# Build GUI
|
||||||
|
RUN cd src/gui && npm run build && cd -
|
||||||
|
|
||||||
|
# Production stage
|
||||||
|
FROM node:23.9-alpine
|
||||||
|
|
||||||
|
# Install runtime dependencies
|
||||||
|
RUN apk add --no-cache git
|
||||||
|
|
||||||
|
# Create app directories
|
||||||
|
RUN mkdir -p /opt/puter/app
|
||||||
|
|
||||||
|
# Set working directory
|
||||||
|
WORKDIR /opt/puter/app
|
||||||
|
|
||||||
|
# Copy built artifacts from build stage
|
||||||
|
COPY --from=build /app/src/gui/dist ./dist
|
||||||
|
COPY --from=build /app/package*.json ./
|
||||||
|
COPY --from=build /app/src ./src
|
||||||
|
|
||||||
|
# Expose port
|
||||||
|
EXPOSE 4100
|
||||||
|
|
||||||
|
# Health check
|
||||||
|
HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \
|
||||||
|
CMD wget --no-verbose --tries=1 --spider http://localhost:4100/test || exit 1
|
||||||
|
|
||||||
|
# Environment
|
||||||
|
ENV NO_VAR_RUNCUME=1
|
||||||
|
|
||||||
|
# Start Puter
|
||||||
|
CMD ["npm", "start"]
|
||||||
340
Package-Workspace/Development/puter/README.md
Normal file
340
Package-Workspace/Development/puter/README.md
Normal file
@@ -0,0 +1,340 @@
|
|||||||
|
# Puter Cloudron Package
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
Puter is "The Internet OS" - an advanced, open-source internet operating system designed to be feature-rich, exceptionally fast, and highly extensible. Use it as a privacy-first personal cloud to keep all your files, apps, and games in one secure place accessible from anywhere.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
### Core Capabilities
|
||||||
|
- **Personal Cloud Storage**: Keep all files, apps, and games in one secure place
|
||||||
|
- **Web App Builder**: Platform for building and publishing websites and web apps
|
||||||
|
- **Remote Desktop Environment**: Access your desktop environment from anywhere
|
||||||
|
- **Privacy-First**: Open-source, self-hostable alternative to Dropbox, Google Drive, OneDrive
|
||||||
|
- **App Store**: Discover and install apps from a growing ecosystem
|
||||||
|
- **File Manager**: Intuitive file management with drag-and-drop
|
||||||
|
- **Code Editor**: Built-in code editor for development
|
||||||
|
- **Terminal**: Web-based terminal for system commands
|
||||||
|
- **App Development**: Build and publish your own web apps and games
|
||||||
|
- **Games Platform**: Play browser-based games directly in Puter
|
||||||
|
|
||||||
|
### Puter Features
|
||||||
|
- **Internet OS**: Full operating system experience in the browser
|
||||||
|
- **File System**: Hierarchical file system with folders and files
|
||||||
|
- **User Accounts**: Multi-user support with permissions
|
||||||
|
- **App Integration**: Run multiple apps simultaneously
|
||||||
|
- **Desktop Interface**: Familiar desktop-like UI
|
||||||
|
- **Taskbar**: Access running apps and system tools
|
||||||
|
- **Start Menu**: Quick access to apps and settings
|
||||||
|
- **Settings Panel**: Configure user preferences and system settings
|
||||||
|
- **Search**: Fast search across files, apps, and settings
|
||||||
|
- **Themes**: Customizable appearance with themes
|
||||||
|
- **Keyboard Shortcuts**: Efficient navigation with shortcuts
|
||||||
|
- **Drag-and-Drop**: Intuitive file and app management
|
||||||
|
- **Right-Click Menus**: Context-sensitive menus
|
||||||
|
- **Window Management**: Multiple windows with minimize/maximize/close
|
||||||
|
- **Auto-Save**: Automatic save for documents and files
|
||||||
|
- **Offline Mode**: Basic functionality without internet
|
||||||
|
- **Mobile Support**: Optimized for mobile browsers
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
### Environment Variables
|
||||||
|
|
||||||
|
#### Application Configuration
|
||||||
|
- `NO_VAR_RUNCUME`: Assume no variable issues (default: 1)
|
||||||
|
- Database configuration is auto-managed by Puter
|
||||||
|
|
||||||
|
### Ports
|
||||||
|
- **4100**: Main HTTP port (web interface and API)
|
||||||
|
|
||||||
|
### Addons
|
||||||
|
- **PostgreSQL**: Required for database storage
|
||||||
|
- **Localstorage**: Used for file storage, app data, and user files
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### 1. First Time Setup
|
||||||
|
|
||||||
|
1. Open Puter
|
||||||
|
2. Create admin account:
|
||||||
|
- Username
|
||||||
|
- Email
|
||||||
|
- Password
|
||||||
|
3. Configure system settings:
|
||||||
|
- Timezone
|
||||||
|
- Language
|
||||||
|
- Theme
|
||||||
|
4. Explore the desktop interface
|
||||||
|
|
||||||
|
### 2. File Management
|
||||||
|
|
||||||
|
**Upload Files:**
|
||||||
|
1. Open File Manager app
|
||||||
|
2. Click "Upload" button
|
||||||
|
3. Select files from your device
|
||||||
|
4. Files are uploaded to your personal cloud
|
||||||
|
|
||||||
|
**Create Folders:**
|
||||||
|
1. Navigate to desired location
|
||||||
|
2. Right-click → "New Folder"
|
||||||
|
3. Enter folder name
|
||||||
|
4. Organize files in folders
|
||||||
|
|
||||||
|
**Manage Files:**
|
||||||
|
- Copy/Cut/Paste files
|
||||||
|
- Rename files
|
||||||
|
- Delete files
|
||||||
|
- Move files between folders
|
||||||
|
- Share files with other users
|
||||||
|
|
||||||
|
### 3. Install Apps
|
||||||
|
|
||||||
|
**From App Store:**
|
||||||
|
1. Open App Store
|
||||||
|
2. Browse available apps
|
||||||
|
3. Click "Install" on desired app
|
||||||
|
4. App appears in Start menu
|
||||||
|
|
||||||
|
**Install Custom App:**
|
||||||
|
1. Prepare app code (HTML/CSS/JS)
|
||||||
|
2. Create folder in File Manager
|
||||||
|
3. Upload app files
|
||||||
|
4. Open app by clicking on index.html
|
||||||
|
5. Pin app to desktop for quick access
|
||||||
|
|
||||||
|
### 4. Code Editor
|
||||||
|
|
||||||
|
**Create New File:**
|
||||||
|
1. Open Code Editor app
|
||||||
|
2. Click "New File"
|
||||||
|
3. Select language type
|
||||||
|
4. Start coding
|
||||||
|
|
||||||
|
**Edit Existing File:**
|
||||||
|
1. Navigate to file in File Manager
|
||||||
|
2. Right-click → "Open with Code Editor"
|
||||||
|
3. Edit file with syntax highlighting
|
||||||
|
4. Auto-save keeps changes safe
|
||||||
|
|
||||||
|
**Code Features:**
|
||||||
|
- Syntax highlighting for 100+ languages
|
||||||
|
- Line numbers
|
||||||
|
- Code folding
|
||||||
|
- Find and replace
|
||||||
|
- Multiple tabs
|
||||||
|
- Auto-indentation
|
||||||
|
- Keyboard shortcuts
|
||||||
|
|
||||||
|
### 5. Terminal
|
||||||
|
|
||||||
|
**Open Terminal:**
|
||||||
|
1. Click terminal icon in taskbar
|
||||||
|
2. Enter commands
|
||||||
|
3. Access system tools and utilities
|
||||||
|
|
||||||
|
**Terminal Features:**
|
||||||
|
- Bash shell
|
||||||
|
- Command history
|
||||||
|
- Tab completion
|
||||||
|
- Copy/paste
|
||||||
|
- Multiple terminals
|
||||||
|
|
||||||
|
### 6. Build Web Apps
|
||||||
|
|
||||||
|
**Simple HTML App:**
|
||||||
|
```html
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>My App</title>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Hello World!</h1>
|
||||||
|
<p>This is my first app on Puter.</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Interactive App with JavaScript:**
|
||||||
|
```javascript
|
||||||
|
// Handle user input
|
||||||
|
document.getElementById('myButton').addEventListener('click', function() {
|
||||||
|
const input = document.getElementById('myInput').value;
|
||||||
|
alert('You entered: ' + input);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Display current time
|
||||||
|
function updateTime() {
|
||||||
|
const now = new Date();
|
||||||
|
document.getElementById('time').textContent = now.toLocaleTimeString();
|
||||||
|
}
|
||||||
|
setInterval(updateTime, 1000);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Save and Run:**
|
||||||
|
1. Save files to File Manager
|
||||||
|
2. Open index.html
|
||||||
|
3. App runs in Puter
|
||||||
|
4. Add to desktop for quick access
|
||||||
|
|
||||||
|
### 7. User Management
|
||||||
|
|
||||||
|
**Create User:**
|
||||||
|
1. Open Settings → Users
|
||||||
|
2. Click "Add User"
|
||||||
|
3. Configure:
|
||||||
|
- Username
|
||||||
|
- Email
|
||||||
|
- Password
|
||||||
|
- Role (Admin, User)
|
||||||
|
4. Click "Create"
|
||||||
|
|
||||||
|
**Manage Permissions:**
|
||||||
|
- Control file access
|
||||||
|
- Control app access
|
||||||
|
- Configure sharing permissions
|
||||||
|
|
||||||
|
### 8. System Settings
|
||||||
|
|
||||||
|
**General Settings:**
|
||||||
|
- Timezone
|
||||||
|
- Language
|
||||||
|
- Theme (Light/Dark)
|
||||||
|
- Desktop background
|
||||||
|
- Font size
|
||||||
|
|
||||||
|
**Storage Settings:**
|
||||||
|
- Check storage usage
|
||||||
|
- Clean up temporary files
|
||||||
|
- Manage storage quotas
|
||||||
|
|
||||||
|
**Security Settings:**
|
||||||
|
- Change password
|
||||||
|
- Configure two-factor authentication
|
||||||
|
- Review login history
|
||||||
|
|
||||||
|
### 9. Keyboard Shortcuts
|
||||||
|
|
||||||
|
**Global Shortcuts:**
|
||||||
|
- `Ctrl + E`: Open File Manager
|
||||||
|
- `Ctrl + T`: Open Terminal
|
||||||
|
- `Ctrl + C`: Open Code Editor
|
||||||
|
- `Alt + Tab`: Switch between apps
|
||||||
|
- `Win + D`: Show desktop
|
||||||
|
- `Ctrl + Alt + Delete`: Task Manager
|
||||||
|
|
||||||
|
**File Manager:**
|
||||||
|
- `Ctrl + N`: New file
|
||||||
|
- `Ctrl + Shift + N`: New folder
|
||||||
|
- `Delete`: Delete selected file
|
||||||
|
- `F2`: Rename selected file
|
||||||
|
- `Ctrl + C`: Copy
|
||||||
|
- `Ctrl + V`: Paste
|
||||||
|
- `Ctrl + X`: Cut
|
||||||
|
|
||||||
|
**Code Editor:**
|
||||||
|
- `Ctrl + S`: Save
|
||||||
|
- `Ctrl + Z`: Undo
|
||||||
|
- `Ctrl + Y`: Redo
|
||||||
|
- `Ctrl + F`: Find
|
||||||
|
- `Ctrl + H`: Replace
|
||||||
|
- `Ctrl + G`: Go to line
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────┐
|
||||||
|
│ Browser │
|
||||||
|
└──────┬──────┘
|
||||||
|
│
|
||||||
|
HTTP Request
|
||||||
|
▼
|
||||||
|
┌──────────────┐
|
||||||
|
│ Puter │
|
||||||
|
│ (Node.js) │
|
||||||
|
│ GUI + API │
|
||||||
|
└──────┬──────┘
|
||||||
|
│
|
||||||
|
┌────────────┼────────────┐
|
||||||
|
│ │ │
|
||||||
|
▼ ▼ ▼
|
||||||
|
┌──────────┐ ┌──────────┐ ┌──────────┐
|
||||||
|
│ PostgreSQL│ │ Files │ │ Apps │
|
||||||
|
│ (Database)│ │ Storage │ │ Store │
|
||||||
|
└──────────┘ └──────────┘ └──────────┘
|
||||||
|
|
||||||
|
┌──────────────┐
|
||||||
|
│ Terminal │
|
||||||
|
│ Code Ed. │
|
||||||
|
│ File Mgr. │
|
||||||
|
└──────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## Security
|
||||||
|
|
||||||
|
### User Permissions
|
||||||
|
- Role-based access control (Admin, User)
|
||||||
|
- File-level permissions
|
||||||
|
- App-level permissions
|
||||||
|
- Sharing controls
|
||||||
|
|
||||||
|
### Data Protection
|
||||||
|
- All data stored locally
|
||||||
|
- No data sent to external services
|
||||||
|
- Open-source code for audit
|
||||||
|
|
||||||
|
### Authentication
|
||||||
|
- Secure password hashing
|
||||||
|
- Session management
|
||||||
|
- Two-factor authentication support
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Apps Not Loading
|
||||||
|
1. Clear browser cache
|
||||||
|
2. Check Puter logs: `docker logs <container>`
|
||||||
|
3. Verify PostgreSQL is running
|
||||||
|
4. Restart Puter container
|
||||||
|
|
||||||
|
### Files Not Uploading
|
||||||
|
1. Check storage quota
|
||||||
|
2. Verify file permissions
|
||||||
|
3. Check network connection
|
||||||
|
4. Review browser console for errors
|
||||||
|
|
||||||
|
### Performance Issues
|
||||||
|
1. Increase memory limit in Cloudron settings
|
||||||
|
2. Clean up temporary files
|
||||||
|
3. Check database performance
|
||||||
|
4. Reduce number of running apps
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
For more information on using Puter:
|
||||||
|
- [Official Website](https://puter.com)
|
||||||
|
- [Live Demo](https://puter.com)
|
||||||
|
- [GitHub Repository](https://github.com/HeyPuter/puter)
|
||||||
|
- [Documentation](https://docs.puter.com)
|
||||||
|
- [Developer Portal](https://developer.puter.com)
|
||||||
|
- [Discord Community](https://discord.com/invite/PQcx7Teh8u)
|
||||||
|
- [Reddit Community](https://reddit.com/r/puter)
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
For issues and questions:
|
||||||
|
- [GitHub Issues](https://github.com/HeyPuter/puter/issues)
|
||||||
|
- [Discord Server](https://discord.com/invite/PQcx7Teh8u)
|
||||||
|
- [Reddit](https://reddit.com/r/puter)
|
||||||
|
- [Twitter/X](https://twitter.com/HeyPuter)
|
||||||
|
|
||||||
|
## Upstream
|
||||||
|
|
||||||
|
[GitHub Repository](https://github.com/HeyPuter/puter)
|
||||||
|
[Official Website](https://puter.com)
|
||||||
BIN
Package-Workspace/Development/puter/logo.png
Normal file
BIN
Package-Workspace/Development/puter/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 72 KiB |
30
Package-Workspace/Development/reviewboard/.env.example
Normal file
30
Package-Workspace/Development/reviewboard/.env.example
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# Review Board Cloudron Environment Configuration Example
|
||||||
|
# Copy this to .env and configure as needed
|
||||||
|
|
||||||
|
# Django Configuration
|
||||||
|
SECRET_KEY=change-this-to-a-random-secret-key-in-production
|
||||||
|
ALLOWED_HOSTS=*
|
||||||
|
REVIEWBOARD_SITE_ROOT=https://your-app.cloudron.app
|
||||||
|
|
||||||
|
# Database (Automatically configured by Cloudron PostgreSQL addon)
|
||||||
|
# CLOUDRON_POSTGRESQL_HOST=127.0.0.1
|
||||||
|
# CLOUDRON_POSTGRESQL_PORT=5432
|
||||||
|
# CLOUDRON_POSTGRESQL_DATABASE=reviewboard
|
||||||
|
# CLOUDRON_POSTGRESQL_USERNAME=reviewboard
|
||||||
|
# CLOUDRON_POSTGRESQL_PASSWORD=database-password
|
||||||
|
|
||||||
|
# Admin User (create admin account on first start)
|
||||||
|
ADMIN_USERNAME=admin
|
||||||
|
ADMIN_EMAIL=admin@example.com
|
||||||
|
ADMIN_PASSWORD=admin-password-change-me
|
||||||
|
|
||||||
|
# Memcached (optional, for caching)
|
||||||
|
MEMCACHED_SERVER=memcached:11211
|
||||||
|
|
||||||
|
# LDAP/Active Directory (optional, for user authentication)
|
||||||
|
LDAP_SERVER=ldap://your-ldap-server.com
|
||||||
|
LDAP_BASE_DN=dc=example,dc=com
|
||||||
|
LDAP_UID=uid
|
||||||
|
LDAP_DN_TEMPLATE=uid=%(user)s,ou=users,dc=example,dc=com
|
||||||
|
LDAP_BIND_DN=cn=admin,dc=example,dc=com
|
||||||
|
LDAP_BIND_PASSWORD=your-ldap-password
|
||||||
27
Package-Workspace/Development/reviewboard/CHANGELOG.md
Normal file
27
Package-Workspace/Development/reviewboard/CHANGELOG.md
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
## [8.0.0] - 2025-01-24
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Initial Cloudron package for Review Board
|
||||||
|
- Official Review Board Docker image wrapper
|
||||||
|
- Automatic PostgreSQL configuration via Cloudron addon
|
||||||
|
- Django migrations on startup
|
||||||
|
- Admin user creation support via environment variables
|
||||||
|
- Health check endpoint
|
||||||
|
- Documentation with usage examples
|
||||||
|
- Integration examples (GitHub, GitLab, Mercurial, Perforce)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
- Code and document review platform
|
||||||
|
- Advanced diff viewer with syntax highlighting
|
||||||
|
- Moved line detection and indentation indicators
|
||||||
|
- Repository integration (Git, Mercurial, Perforce, etc.)
|
||||||
|
- Discussion tracking and threaded comments
|
||||||
|
- Review requests workflow
|
||||||
|
- Email notifications
|
||||||
|
- Search across reviews, comments, discussions
|
||||||
|
- Dashboard for pending reviews
|
||||||
|
- Team and project management
|
||||||
|
- Power Pack extension support (reports, PDF review, LDAP sync)
|
||||||
|
- User authentication (LDAP, OAuth, traditional)
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"version": 1,
|
||||||
|
"manifestVersion": 2,
|
||||||
|
"type": "app",
|
||||||
|
"id": "io.cloudron.reviewboard",
|
||||||
|
"title": "Review Board",
|
||||||
|
"description": "Web-based code and document review tool. Tracks pending code, graphics, documents, and all discussions around product decisions. Supports Git, Mercurial, Perforce, and more.",
|
||||||
|
"author": "Beanbag, Inc.",
|
||||||
|
"website": "https://www.reviewboard.org",
|
||||||
|
"contactEmail": "cloudron@tsys.dev",
|
||||||
|
"tagline": "Code and document review platform",
|
||||||
|
"version": "7.0.0",
|
||||||
|
"healthCheckPath": "/health/",
|
||||||
|
"httpPort": 8080,
|
||||||
|
"memoryLimit": 1024,
|
||||||
|
"addons": {
|
||||||
|
"localstorage": true,
|
||||||
|
"postgresql": {
|
||||||
|
"version": "14"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tcpPorts": {
|
||||||
|
"HTTP_PORT": {
|
||||||
|
"description": "Review Board HTTP port",
|
||||||
|
"defaultValue": 8080
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mediaLinks": [
|
||||||
|
"https://raw.githubusercontent.com/reviewboard/reviewboard/master/reviewboard/static/rb/images/icons@2x.png"
|
||||||
|
],
|
||||||
|
"changelog": "Initial Cloudron package for Review Board",
|
||||||
|
"icon": "file://logo.png"
|
||||||
|
}
|
||||||
10
Package-Workspace/Development/reviewboard/Dockerfile
Normal file
10
Package-Workspace/Development/reviewboard/Dockerfile
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
FROM beanbag/reviewboard:7.0
|
||||||
|
|
||||||
|
# Cloudron: Create site directory
|
||||||
|
RUN mkdir -p /site/media/uploaded
|
||||||
|
|
||||||
|
# Copy start script (already executable from host)
|
||||||
|
COPY start.sh /app/start.sh
|
||||||
|
|
||||||
|
# Start Review Board
|
||||||
|
CMD ["/app/start.sh"]
|
||||||
330
Package-Workspace/Development/reviewboard/README.md
Normal file
330
Package-Workspace/Development/reviewboard/README.md
Normal file
@@ -0,0 +1,330 @@
|
|||||||
|
# Review Board Cloudron Package
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
Review Board is a web-based code and document review tool. It tracks pending code, graphics, documents, and all discussions around decisions made about your product. It helps companies and organizations maintain code quality and keep bug counts low.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
### Core Capabilities
|
||||||
|
- **Code Review**: Track pending code changes with diff viewer showing syntax highlighting, interdiffs, and moved line detection
|
||||||
|
- **Document Review**: Review documents, graphics, and other assets alongside code
|
||||||
|
- **Discussion Tracking**: All discussions around product decisions are tracked and searchable
|
||||||
|
- **Repository Integration**: Supports Bazaar, ClearCase, CVS, Git, Mercurial, Perforce, Plastic, and Azure DevOps
|
||||||
|
- **Rich API**: Build custom features, review UIs, data analysis, and more using the extension framework
|
||||||
|
- **Team Collaboration**: Manage multiple teams, projects, and review requests
|
||||||
|
- **Review UIs**: Custom review interfaces tailored to your workflows
|
||||||
|
- **User Authentication**: LDAP/Active Directory sync, OAuth, and traditional authentication
|
||||||
|
|
||||||
|
### Review Board Features
|
||||||
|
- **Diff Viewer**: Advanced diff display with syntax highlighting for many programming languages
|
||||||
|
- **Moved Line Detection**: Highlights lines that were added, removed, or changed
|
||||||
|
- **Commenting**: Rich commenting system with threaded discussions
|
||||||
|
- **Change Requests**: Formal review request workflow with assignees and reviewers
|
||||||
|
- **Status Tracking**: Track review status (pending, submitted, discarded, published)
|
||||||
|
- **Email Notifications**: Get notified on review updates and changes
|
||||||
|
- **Search**: Powerful search across reviews, comments, and discussions
|
||||||
|
- **Dashboard**: View all pending reviews in one place
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
### Environment Variables
|
||||||
|
|
||||||
|
#### Database (Automatically configured by Cloudron)
|
||||||
|
- `CLOUDRON_POSTGRESQL_HOST`: PostgreSQL host
|
||||||
|
- `CLOUDRON_POSTGRESQL_PORT`: PostgreSQL port
|
||||||
|
- `CLOUDRON_POSTGRESQL_DATABASE`: Database name
|
||||||
|
- `CLOUDRON_POSTGRESQL_USERNAME`: Database username
|
||||||
|
- `CLOUDRON_POSTGRESQL_PASSWORD`: Database password
|
||||||
|
|
||||||
|
#### Django Configuration
|
||||||
|
- `SECRET_KEY`: Django secret key (auto-generated, change in production)
|
||||||
|
- `ALLOWED_HOSTS`: Allowed hosts (default: `*`)
|
||||||
|
- `REVIEWBOARD_SITE_ROOT`: Site root URL (auto-configured)
|
||||||
|
|
||||||
|
#### Admin User
|
||||||
|
- `ADMIN_USERNAME`: Username for admin account
|
||||||
|
- `ADMIN_EMAIL`: Email address for admin account
|
||||||
|
- `ADMIN_PASSWORD`: Password for admin account
|
||||||
|
|
||||||
|
### Ports
|
||||||
|
- **8080**: Main HTTP port (web interface and API)
|
||||||
|
|
||||||
|
### Addons
|
||||||
|
- **PostgreSQL**: Required for database storage
|
||||||
|
- **Localstorage**: Used for media uploads and data
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### 1. Set Up Repositories
|
||||||
|
|
||||||
|
Via Web Interface:
|
||||||
|
1. Open Review Board
|
||||||
|
2. Go to "Admin" → "Repositories"
|
||||||
|
3. Click "Add Repository"
|
||||||
|
4. Configure:
|
||||||
|
- Repository type (Git, Mercurial, etc.)
|
||||||
|
- Repository URL
|
||||||
|
- Repository name
|
||||||
|
- Mirror configuration (if needed)
|
||||||
|
5. Click "Save"
|
||||||
|
|
||||||
|
Via API:
|
||||||
|
```bash
|
||||||
|
curl -X POST http://localhost:8080/api/repositories/ \
|
||||||
|
-H "Authorization: Token your-api-token" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"name": "My Project",
|
||||||
|
"scm_type": "git",
|
||||||
|
"path": "https://github.com/myorg/myproject.git",
|
||||||
|
"mirror_path": "/path/to/mirror"
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Create Review Request
|
||||||
|
|
||||||
|
Via Web Interface:
|
||||||
|
1. Go to "All Review Requests"
|
||||||
|
2. Click "New Review Request"
|
||||||
|
3. Configure:
|
||||||
|
- Repository to review
|
||||||
|
- Base branch (e.g., main)
|
||||||
|
- Tip branch (e.g., feature/new-feature)
|
||||||
|
- Reviewers
|
||||||
|
- Description
|
||||||
|
4. Click "Create"
|
||||||
|
|
||||||
|
Via Git Hook:
|
||||||
|
```bash
|
||||||
|
# In your Git repository, configure post-commit hook
|
||||||
|
.git/hooks/post-commit
|
||||||
|
|
||||||
|
#!/bin/bash
|
||||||
|
# Review Board URL
|
||||||
|
RB_URL="http://your-app.cloudron.app"
|
||||||
|
|
||||||
|
# Create review request on commit
|
||||||
|
curl -X POST "$RB_URL/api/review-requests/" \
|
||||||
|
-H "Authorization: Token your-api-token" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "{
|
||||||
|
\"repository\": \"your-repo\",
|
||||||
|
\"commit_id\": \"$(git rev-parse HEAD)\",
|
||||||
|
\"branch\": \"$(git rev-parse --abbrev-ref HEAD)\",
|
||||||
|
\"description\": \"Automated review request\"
|
||||||
|
}"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Review Code Changes
|
||||||
|
|
||||||
|
Via Web Interface:
|
||||||
|
1. Open review request
|
||||||
|
2. View diff with syntax highlighting
|
||||||
|
3. Click lines to add comments
|
||||||
|
4. Use "Reply" for threaded discussions
|
||||||
|
5. Click "Ship It!" to approve changes
|
||||||
|
6. Or click "Discard" to reject
|
||||||
|
|
||||||
|
### 4. Use Power Pack (Extension)
|
||||||
|
|
||||||
|
Power Pack adds:
|
||||||
|
- **Report Generation**: Create formatted reports of reviews
|
||||||
|
- **PDF and Office Document Review**: Review PDF and Office files
|
||||||
|
- **Better Multi-Server Scalability**: Handle more concurrent users
|
||||||
|
- **GitHub Enterprise Integration**: Direct connection to GitHub Enterprise
|
||||||
|
- **LDAP/Active Directory User Sync**: Sync users from directory services
|
||||||
|
|
||||||
|
To enable Power Pack:
|
||||||
|
1. Get trial license from RBCommons
|
||||||
|
2. Install license via Admin panel
|
||||||
|
3. Restart Review Board
|
||||||
|
|
||||||
|
### 5. Configure Teams and Projects
|
||||||
|
|
||||||
|
**Create Team:**
|
||||||
|
1. Go to "Admin" → "Teams"
|
||||||
|
2. Click "Add Team"
|
||||||
|
3. Configure team name and description
|
||||||
|
4. Add users to team
|
||||||
|
|
||||||
|
**Create Project:**
|
||||||
|
1. Go to "Admin" → "Projects"
|
||||||
|
2. Click "Add Project"
|
||||||
|
3. Configure project settings
|
||||||
|
4. Assign repository to project
|
||||||
|
5. Assign team to project
|
||||||
|
|
||||||
|
### 6. Set Up Email Notifications
|
||||||
|
|
||||||
|
1. Go to "My Account" → "Email Settings"
|
||||||
|
2. Configure SMTP settings
|
||||||
|
3. Set notification preferences
|
||||||
|
4. Test email configuration
|
||||||
|
|
||||||
|
## Integration Examples
|
||||||
|
|
||||||
|
### GitHub Integration
|
||||||
|
```python
|
||||||
|
# Using Review Board Python API
|
||||||
|
from reviewboardapi import ReviewBoardAdmin
|
||||||
|
|
||||||
|
rb = ReviewBoardAdmin('http://your-app.cloudron.app', username='admin', password='password')
|
||||||
|
|
||||||
|
# Create review request for GitHub PR
|
||||||
|
review_request = rb.repositories.create(
|
||||||
|
name='my-repo',
|
||||||
|
scm_type='git',
|
||||||
|
path='https://github.com/myorg/myproject.git'
|
||||||
|
)
|
||||||
|
|
||||||
|
request = rb.review_requests.create(
|
||||||
|
repository=review_request,
|
||||||
|
branch='feature/new-feature',
|
||||||
|
commit_id='abc123def456',
|
||||||
|
description='Automated review from GitHub'
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
### GitLab Integration
|
||||||
|
```bash
|
||||||
|
# GitLab CI job to create Review Board requests
|
||||||
|
curl -X POST http://localhost:8080/api/review-requests/ \
|
||||||
|
-H "Authorization: Token $RB_TOKEN" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "{
|
||||||
|
\"repository\": \"$CI_PROJECT_PATH\",
|
||||||
|
\"commit_id\": \"$CI_COMMIT_SHA\",
|
||||||
|
\"branch\": \"$CI_COMMIT_REF_NAME\",
|
||||||
|
\"description\": \"Review request from GitLab CI\"
|
||||||
|
}"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Mercurial Integration
|
||||||
|
```bash
|
||||||
|
# Mercurial hook for Review Board
|
||||||
|
.hg/hgrc
|
||||||
|
|
||||||
|
[hooks]
|
||||||
|
changegroup.post-reviewboard = python:/path/to/hg_reviewboard.py
|
||||||
|
```
|
||||||
|
|
||||||
|
### Perforce Integration
|
||||||
|
```bash
|
||||||
|
# Perforce trigger for Review Board
|
||||||
|
p4 change -o $CL | grep -q "^Change:" || exit
|
||||||
|
|
||||||
|
# Submit to Review Board on changelist submit
|
||||||
|
curl -X POST http://localhost:8080/api/review-requests/ \
|
||||||
|
-H "Authorization: Token $RB_TOKEN" \
|
||||||
|
-d @-
|
||||||
|
```
|
||||||
|
|
||||||
|
## Security
|
||||||
|
|
||||||
|
### Change Default Secret Key
|
||||||
|
The default secret key is auto-generated. **Change SECRET_KEY in production**:
|
||||||
|
```bash
|
||||||
|
# Generate new secret key
|
||||||
|
python -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())'
|
||||||
|
|
||||||
|
# Set SECRET_KEY environment variable
|
||||||
|
```
|
||||||
|
|
||||||
|
### Use LDAP/Active Directory
|
||||||
|
Configure LDAP for centralized authentication:
|
||||||
|
```bash
|
||||||
|
LDAP_SERVER=ldap://your-ldap-server.com
|
||||||
|
LDAP_BASE_DN=dc=example,dc=com
|
||||||
|
LDAP_UID=uid
|
||||||
|
LDAP_DN_TEMPLATE=uid=%(user)s,ou=users,dc=example,dc=com
|
||||||
|
LDAP_BIND_DN=cn=admin,dc=example,dc=com
|
||||||
|
LDAP_BIND_PASSWORD=your-ldap-password
|
||||||
|
```
|
||||||
|
|
||||||
|
### API Token Management
|
||||||
|
1. Create API tokens in Review Board admin panel
|
||||||
|
2. Assign tokens to users or services
|
||||||
|
3. Use tokens in API requests
|
||||||
|
4. Regularly rotate tokens for security
|
||||||
|
|
||||||
|
### Repository Access Control
|
||||||
|
Configure which users can access which repositories:
|
||||||
|
1. Go to "Admin" → "Repositories"
|
||||||
|
2. Edit repository settings
|
||||||
|
3. Configure access permissions
|
||||||
|
4. Use team-based access control
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Review Requests Not Showing
|
||||||
|
1. Check repository mirror is up to date
|
||||||
|
2. Verify webhook configuration
|
||||||
|
3. Check Review Board logs: `docker logs <container>`
|
||||||
|
4. Test API connectivity
|
||||||
|
|
||||||
|
### Database Connection Errors
|
||||||
|
1. Verify PostgreSQL addon is active
|
||||||
|
2. Check database credentials in Cloudron environment
|
||||||
|
3. Review database configuration
|
||||||
|
4. Ensure PostgreSQL is running
|
||||||
|
|
||||||
|
### Performance Issues
|
||||||
|
1. Increase memory limit in Cloudron settings
|
||||||
|
2. Enable memcached for caching
|
||||||
|
3. Optimize repository mirror settings
|
||||||
|
4. Review database query performance
|
||||||
|
|
||||||
|
### Email Notifications Not Working
|
||||||
|
1. Verify SMTP configuration
|
||||||
|
2. Check email queue in admin panel
|
||||||
|
3. Test email settings
|
||||||
|
4. Review mail server logs
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────┐
|
||||||
|
│ Developer │
|
||||||
|
│ (Git) │
|
||||||
|
└──────┬──────┘
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
┌──────────────┐
|
||||||
|
│ Review Board │
|
||||||
|
│ (Django) │
|
||||||
|
│ Dashboard │
|
||||||
|
└──────┬──────┘
|
||||||
|
│
|
||||||
|
┌────────────┼────────────┐
|
||||||
|
│ │ │
|
||||||
|
▼ ▼ ▼
|
||||||
|
┌──────────┐ ┌──────────┐ ┌──────────┐
|
||||||
|
│ PostgreSQL│ │ Repository│ │ Email │
|
||||||
|
│ (Database)│ │ Mirror │ │ Service │
|
||||||
|
└──────────┘ └──────────┘ └──────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
For more information on using Review Board:
|
||||||
|
- [Official Website](https://www.reviewboard.org/)
|
||||||
|
- [User Manual](https://www.reviewboard.org/docs/manual/latest/users/)
|
||||||
|
- [Admin Manual](https://www.reviewboard.org/docs/manual/latest/admin/)
|
||||||
|
- [API Documentation](https://www.reviewboard.org/docs/manual/latest/webapi/2.0/)
|
||||||
|
- [Power Pack](https://www.reviewboard.org/power-pack/)
|
||||||
|
- [GitHub Repository](https://github.com/reviewboard/reviewboard)
|
||||||
|
- [Docker Images](https://hub.docker.com/r/reviewboard/reviewboard)
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
For issues and questions:
|
||||||
|
- [GitHub Issues](https://github.com/reviewboard/reviewboard/issues)
|
||||||
|
- [Community Forum](https://www.reviewboard.org/)
|
||||||
|
- [Mailing Lists](https://www.reviewboard.org/mailing-lists/)
|
||||||
|
- [Commercial Support](https://rbcommons.com/support)
|
||||||
|
|
||||||
|
## Upstream
|
||||||
|
|
||||||
|
[GitHub Repository](https://github.com/reviewboard/reviewboard)
|
||||||
|
[Official Website](https://www.reviewboard.org/)
|
||||||
BIN
Package-Workspace/Development/reviewboard/logo.png
Normal file
BIN
Package-Workspace/Development/reviewboard/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 27 KiB |
59
Package-Workspace/Development/reviewboard/start.sh
Executable file
59
Package-Workspace/Development/reviewboard/start.sh
Executable file
@@ -0,0 +1,59 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "Starting Review Board Cloudron package..."
|
||||||
|
|
||||||
|
# Database connection from Cloudron
|
||||||
|
DB_NAME=${CLOUDRON_POSTGRESQL_DATABASE:-reviewboard}
|
||||||
|
DB_USER=${CLOUDRON_POSTGRESQL_USERNAME:-reviewboard}
|
||||||
|
DB_PASSWORD=${CLOUDRON_POSTGRESQL_PASSWORD}
|
||||||
|
DB_HOST=${CLOUDRON_POSTGRESQL_HOST:-127.0.0.1}
|
||||||
|
DB_PORT=${CLOUDRON_POSTGRESQL_PORT:-5432}
|
||||||
|
|
||||||
|
echo "Database host: $DB_HOST"
|
||||||
|
echo "Database port: $DB_PORT"
|
||||||
|
echo "Database name: $DB_NAME"
|
||||||
|
|
||||||
|
# Wait for PostgreSQL to be ready
|
||||||
|
echo "Waiting for PostgreSQL to be ready..."
|
||||||
|
until PGPASSWORD=$DB_PASSWORD psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -c '\q' 2>/dev/null; do
|
||||||
|
echo "PostgreSQL is unavailable - sleeping"
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "PostgreSQL is ready!"
|
||||||
|
|
||||||
|
# Django configuration
|
||||||
|
export REVIEWBOARD_SITE_ROOT=${REVIEWBOARD_SITE_ROOT:-https://$CLOUDRON_APP_DOMAIN}
|
||||||
|
export DATABASE_TYPE=postgresql
|
||||||
|
export DATABASE_NAME=$DB_NAME
|
||||||
|
export DATABASE_USER=$DB_USER
|
||||||
|
export DATABASE_PASSWORD=$DB_PASSWORD
|
||||||
|
export DATABASE_HOST=$DB_HOST
|
||||||
|
export DATABASE_PORT=$DB_PORT
|
||||||
|
export MEMCACHED_SERVER=
|
||||||
|
export SECRET_KEY=${SECRET_KEY:-cloudron-secret-key-change-in-production}
|
||||||
|
export ALLOWED_HOSTS=${ALLOWED_HOSTS:-'*'}
|
||||||
|
|
||||||
|
# Site directory
|
||||||
|
export REVIEWBOARD_SITEDIR=/site
|
||||||
|
|
||||||
|
# Run database migrations
|
||||||
|
echo "Running Review Board database migrations..."
|
||||||
|
./manage.py migrate --noinput
|
||||||
|
|
||||||
|
# Collect static files
|
||||||
|
echo "Collecting static files..."
|
||||||
|
./manage.py collectstatic --noinput
|
||||||
|
|
||||||
|
# Create admin user if specified
|
||||||
|
if [ -n "$ADMIN_USERNAME" ] && [ -n "$ADMIN_PASSWORD" ] && [ -n "$ADMIN_EMAIL" ]; then
|
||||||
|
echo "Creating admin user..."
|
||||||
|
echo "from django.contrib.auth import get_user_model; from django.core.management import call_command; User = get_user_model(); User.objects.create_superuser('$ADMIN_USERNAME', '$ADMIN_EMAIL', '$ADMIN_PASSWORD') if not User.objects.filter(email='$ADMIN_EMAIL').exists() else None" | \
|
||||||
|
./manage.py shell 2>/dev/null || echo "Admin user may already exist"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Start Review Board
|
||||||
|
echo "Starting Review Board..."
|
||||||
|
exec ./serve.sh
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
# WireViz Web Cloudron Environment Configuration Example
|
||||||
|
# Copy this to .env and configure as needed
|
||||||
|
|
||||||
|
# Flask Configuration
|
||||||
|
FLASK_APP=wireviz_web
|
||||||
|
PYTHONUNBUFFERED=1
|
||||||
|
|
||||||
|
# WireViz Web will listen on this port (default: 3005)
|
||||||
|
# Port is exposed via Cloudron and can be configured in CloudronManifest.json
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
## [2.4.0] - 2025-01-24
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Initial Cloudron package for WireViz Web
|
||||||
|
- Flask-based web wrapper for WireViz
|
||||||
|
- Graphviz dependency for diagram rendering
|
||||||
|
- REST API for diagram generation
|
||||||
|
- Support for YAML input and multiple output formats
|
||||||
|
- Health check endpoint
|
||||||
|
- Documentation with usage examples
|
||||||
|
- Color coding examples (IEC, DIN, custom)
|
||||||
|
- Connector and cable examples
|
||||||
|
- Complex harness example
|
||||||
|
|
||||||
|
### Features
|
||||||
|
- Cable and wiring diagram generation
|
||||||
|
- YAML-based input format
|
||||||
|
- Multiple output formats (SVG, PNG, etc.)
|
||||||
|
- Automatic BOM (Bill of Materials) generation
|
||||||
|
- IEC 60757, DIN 47100, and 25-pair color code support
|
||||||
|
- Wire gauge handling (mm² and AWG)
|
||||||
|
- Connector library with common types
|
||||||
|
- Web interface and REST API
|
||||||
|
- PlantUML Text Encoding compatibility
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"version": 1,
|
||||||
|
"manifestVersion": 2,
|
||||||
|
"type": "app",
|
||||||
|
"id": "io.cloudron.wireviz-web",
|
||||||
|
"title": "WireViz Web",
|
||||||
|
"description": "Web wrapper around WireViz tool for documenting cables, wiring harnesses and connector pinouts. Takes YAML files as input and produces graphical output (SVG, PNG).",
|
||||||
|
"author": "WireViz Community",
|
||||||
|
"website": "https://github.com/wireviz/wireviz-web",
|
||||||
|
"contactEmail": "cloudron@tsys.dev",
|
||||||
|
"tagline": "Cable and wiring diagram tool",
|
||||||
|
"version": "2.4.0",
|
||||||
|
"healthCheckPath": "/",
|
||||||
|
"httpPort": 3005,
|
||||||
|
"memoryLimit": 512,
|
||||||
|
"addons": {
|
||||||
|
"localstorage": true
|
||||||
|
},
|
||||||
|
"tcpPorts": {
|
||||||
|
"HTTP_PORT": {
|
||||||
|
"description": "WireViz Web HTTP port",
|
||||||
|
"defaultValue": 3005
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mediaLinks": [],
|
||||||
|
"changelog": "Initial Cloudron package for WireViz Web",
|
||||||
|
"icon": "file://logo.png"
|
||||||
|
}
|
||||||
33
Package-Workspace/Documentation-Tools/wireviz-web/Dockerfile
Normal file
33
Package-Workspace/Documentation-Tools/wireviz-web/Dockerfile
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
FROM python:3-slim
|
||||||
|
|
||||||
|
# Install system dependencies
|
||||||
|
RUN apt-get update && apt-get install -y graphviz && rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Set working directory
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copy requirements
|
||||||
|
COPY requirements.txt .
|
||||||
|
|
||||||
|
# Install Python dependencies
|
||||||
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
|
# Copy application code
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
# Create data directory
|
||||||
|
RUN mkdir -p /app/data
|
||||||
|
|
||||||
|
# Set environment
|
||||||
|
ENV FLASK_APP=wireviz_web
|
||||||
|
ENV PYTHONUNBUFFERED=1
|
||||||
|
|
||||||
|
# Expose port
|
||||||
|
EXPOSE 3005
|
||||||
|
|
||||||
|
# Health check
|
||||||
|
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
||||||
|
CMD curl -f http://localhost:3005/ || exit 1
|
||||||
|
|
||||||
|
# Start application
|
||||||
|
CMD ["python","-c","import wireviz_web.cli; wireviz_web.cli.run()"]
|
||||||
317
Package-Workspace/Documentation-Tools/wireviz-web/README.md
Normal file
317
Package-Workspace/Documentation-Tools/wireviz-web/README.md
Normal file
@@ -0,0 +1,317 @@
|
|||||||
|
# WireViz Web Cloudron Package
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
WireViz Web is a web wrapper around WireViz tool for documenting cables, wiring harnesses, and connector pinouts. It takes plain text, YAML-formatted files as input and produces beautiful graphical output (SVG, PNG, etc.).
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
### Core Capabilities
|
||||||
|
- **Wire Diagram Generation**: Create professional cable and wiring diagrams
|
||||||
|
- **YAML Input**: Human-readable YAML format for defining connectors, cables, and connections
|
||||||
|
- **Multiple Output Formats**: SVG, PNG, and other graphics formats
|
||||||
|
- **Automatic BOM**: Bill of Materials generation for components
|
||||||
|
- **Color Coding Support**: IEC 60757, DIN 47100, and 25-pair color codes
|
||||||
|
- **Wire Gauge Handling**: Support for mm² and AWG gauges
|
||||||
|
- **Connector Libraries**: Extensive connector type database
|
||||||
|
- **Web Interface**: REST API for programmatic access
|
||||||
|
|
||||||
|
### WireViz Features
|
||||||
|
- **Text-Based Input**: No special editor required, use any text editor
|
||||||
|
- **Version Control Friendly**: Plain YAML files work perfectly with Git
|
||||||
|
- **UTF-8 Support**: Handle special characters in labels and descriptions
|
||||||
|
- **Custom Color Schemes**: Standard and custom color schemes supported
|
||||||
|
- **Auto-Routing**: Automatic wire routing for 1-to-1 connections
|
||||||
|
- **Complex Harness Support**: Suitable for simple and complex wiring
|
||||||
|
- **Pinout Diagrams**: Document connector pinouts clearly
|
||||||
|
- **PlantUML Compatibility**: PlantUML Text Encoding format included
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
### Environment Variables
|
||||||
|
|
||||||
|
#### Application Configuration
|
||||||
|
- `FLASK_APP`: Flask application (default: wireviz_web)
|
||||||
|
- `PYTHONUNBUFFERED`: Disable Python output buffering (default: 1)
|
||||||
|
|
||||||
|
### Ports
|
||||||
|
- **3005**: Main HTTP port (web interface and API)
|
||||||
|
|
||||||
|
### Addons
|
||||||
|
- **Localstorage**: Used for storing uploaded diagrams and generated outputs
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### 1. Create Wiring Diagram via Web Interface
|
||||||
|
|
||||||
|
1. Open WireViz Web
|
||||||
|
2. Click "New Diagram"
|
||||||
|
3. Enter YAML configuration:
|
||||||
|
```yaml
|
||||||
|
connectors:
|
||||||
|
X1:
|
||||||
|
type: D-Sub
|
||||||
|
subtype: female
|
||||||
|
pinlabels: [DCD, RX, TX, DTR, GND, DSR, RTS, CTS]
|
||||||
|
X2:
|
||||||
|
type: Molex KK 254
|
||||||
|
subtype: female
|
||||||
|
pinlabels: [GND, RX, TX]
|
||||||
|
|
||||||
|
cables:
|
||||||
|
W1:
|
||||||
|
gauge: 0.25 mm2
|
||||||
|
length: 0.2
|
||||||
|
color_code: DIN
|
||||||
|
wirecount: 3
|
||||||
|
shield: true
|
||||||
|
|
||||||
|
connections:
|
||||||
|
- - X1: [5,2,3]
|
||||||
|
- W1: [1,2,3]
|
||||||
|
- X2: [1,3,2]
|
||||||
|
- - X1: 5
|
||||||
|
- W1: s
|
||||||
|
```
|
||||||
|
4. Click "Generate Diagram"
|
||||||
|
5. View SVG/PNG output
|
||||||
|
6. Download BOM (Bill of Materials)
|
||||||
|
|
||||||
|
### 2. Use REST API
|
||||||
|
|
||||||
|
Generate diagram programmatically:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create diagram via POST request
|
||||||
|
curl -X POST http://localhost:3005/render \
|
||||||
|
-H "Content-Type: application/yaml" \
|
||||||
|
--data-binary @diagram.yaml
|
||||||
|
|
||||||
|
# Get diagram in SVG format
|
||||||
|
curl -X POST http://localhost:3005/render \
|
||||||
|
-H "Content-Type: application/yaml" \
|
||||||
|
-H "Accept: image/svg+xml" \
|
||||||
|
--data-binary @diagram.yaml \
|
||||||
|
-o output.svg
|
||||||
|
|
||||||
|
# Get diagram in PNG format
|
||||||
|
curl -X POST http://localhost:3005/render \
|
||||||
|
-H "Content-Type: application/yaml" \
|
||||||
|
-H "Accept: image/png" \
|
||||||
|
--data-binary @diagram.yaml \
|
||||||
|
-o output.png
|
||||||
|
|
||||||
|
# Get BOM (Bill of Materials)
|
||||||
|
curl -X POST http://localhost:3005/render \
|
||||||
|
-H "Content-Type: application/yaml" \
|
||||||
|
-H "Accept: text/tab-separated-values" \
|
||||||
|
--data-binary @diagram.yaml \
|
||||||
|
-o bom.tsv
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Color Coding Examples
|
||||||
|
|
||||||
|
**IEC 60757 Color Code:**
|
||||||
|
```yaml
|
||||||
|
cables:
|
||||||
|
W1:
|
||||||
|
color_code: IEC
|
||||||
|
# Generates: BK, RD, OR, YE, GN, BU, VT, GY, WH, PK
|
||||||
|
```
|
||||||
|
|
||||||
|
**DIN 47100 Color Code:**
|
||||||
|
```yaml
|
||||||
|
cables:
|
||||||
|
W1:
|
||||||
|
color_code: DIN
|
||||||
|
# Generates: WT/BN, GN/YE, OG/BK, etc.
|
||||||
|
```
|
||||||
|
|
||||||
|
**Custom Colors:**
|
||||||
|
```yaml
|
||||||
|
cables:
|
||||||
|
W1:
|
||||||
|
colors: ["#FF0000", "#00FF00", "#0000FF"]
|
||||||
|
# Or use full names: ["red", "green", "blue"]
|
||||||
|
# Or abbreviations: ["RD", "GN", "BU"]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Connector Examples
|
||||||
|
|
||||||
|
**D-Sub Connector:**
|
||||||
|
```yaml
|
||||||
|
connectors:
|
||||||
|
X1:
|
||||||
|
type: D-Sub
|
||||||
|
subtype: female
|
||||||
|
pinlabels: [DCD, RX-, RX+, TX-, TX+, GND, CEC]
|
||||||
|
```
|
||||||
|
|
||||||
|
**USB-C Connector:**
|
||||||
|
```yaml
|
||||||
|
connectors:
|
||||||
|
X1:
|
||||||
|
type: USB
|
||||||
|
subtype: C
|
||||||
|
pinlabels: [VBUS, CC1, CC2, D+, D-, SBU1, SBU2, GND]
|
||||||
|
```
|
||||||
|
|
||||||
|
**HDMI Connector:**
|
||||||
|
```yaml
|
||||||
|
connectors:
|
||||||
|
X1:
|
||||||
|
type: HDMI
|
||||||
|
subtype: A
|
||||||
|
pinlabels: [TMDS_D2+, TMDS_D2-, TMDS_D1+, TMDS_D1-, ...]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Cable Examples
|
||||||
|
|
||||||
|
**Multi-Conductor Cable:**
|
||||||
|
```yaml
|
||||||
|
cables:
|
||||||
|
W1:
|
||||||
|
gauge: 0.25 mm2
|
||||||
|
length: 2.5
|
||||||
|
color_code: IEC
|
||||||
|
wirecount: 8
|
||||||
|
shield: true
|
||||||
|
```
|
||||||
|
|
||||||
|
**Coaxial Cable:**
|
||||||
|
```yaml
|
||||||
|
cables:
|
||||||
|
W1:
|
||||||
|
gauge: 1.5 mm2
|
||||||
|
length: 10.0
|
||||||
|
colors: [BK]
|
||||||
|
wirecount: 1
|
||||||
|
shield: true
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. Complex Harness Example
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
connectors:
|
||||||
|
MAIN:
|
||||||
|
type: Terminal_Block
|
||||||
|
pinlabels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
||||||
|
DEVICE1:
|
||||||
|
type: D-Sub
|
||||||
|
subtype: female
|
||||||
|
pinlabels: [DCD, RX, TX, GND]
|
||||||
|
DEVICE2:
|
||||||
|
type: USB
|
||||||
|
subtype: A
|
||||||
|
pinlabels: [VBUS, D+, D-, GND]
|
||||||
|
|
||||||
|
cables:
|
||||||
|
MAIN_POWER:
|
||||||
|
gauge: 1.5 mm2
|
||||||
|
length: 5.0
|
||||||
|
colors: [RD, BK]
|
||||||
|
wirecount: 2
|
||||||
|
MAIN_SIGNAL:
|
||||||
|
gauge: 0.25 mm2
|
||||||
|
length: 5.0
|
||||||
|
color_code: IEC
|
||||||
|
wirecount: 4
|
||||||
|
DEVICE1_CABLE:
|
||||||
|
gauge: 0.25 mm2
|
||||||
|
length: 2.0
|
||||||
|
color_code: DIN
|
||||||
|
wirecount: 4
|
||||||
|
DEVICE2_CABLE:
|
||||||
|
gauge: 0.25 mm2
|
||||||
|
length: 1.0
|
||||||
|
color_code: IEC
|
||||||
|
wirecount: 4
|
||||||
|
|
||||||
|
connections:
|
||||||
|
- - MAIN: [1,2]
|
||||||
|
- MAIN_POWER: [1,2]
|
||||||
|
- - MAIN: [3,4,5,6]
|
||||||
|
- MAIN_SIGNAL: [1,2,3,4]
|
||||||
|
- - MAIN: [7,8,9,10]
|
||||||
|
- DEVICE1_CABLE: [1,2,3,4]
|
||||||
|
- DEVICE1: [5,2,3,4]
|
||||||
|
- - MAIN: [7,8,9,10]
|
||||||
|
- DEVICE2_CABLE: [1,2,3,4]
|
||||||
|
- DEVICE2: [1,4,3,2]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────┐
|
||||||
|
│ Client │
|
||||||
|
│ (YAML) │
|
||||||
|
└──────┬──────┘
|
||||||
|
│
|
||||||
|
HTTP POST (YAML)
|
||||||
|
▼
|
||||||
|
┌──────────────┐
|
||||||
|
│ WireViz Web │
|
||||||
|
│ (Flask) │
|
||||||
|
│ REST API │
|
||||||
|
└──────┬──────┘
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
┌──────────────┐
|
||||||
|
│ WireViz │
|
||||||
|
│ (Python) │
|
||||||
|
│ Parser │
|
||||||
|
└──────┬──────┘
|
||||||
|
│
|
||||||
|
┌────────────┼────────────┐
|
||||||
|
│ │ │
|
||||||
|
▼ ▼ ▼
|
||||||
|
┌──────────┐ ┌──────────┐ ┌──────────┐
|
||||||
|
│ SVG │ │ PNG │ │ BOM │
|
||||||
|
│ Output │ │ Output │ │ Output │
|
||||||
|
└──────────┘ └──────────┘ └──────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## WireViz YAML Format
|
||||||
|
|
||||||
|
### Basic Structure
|
||||||
|
```yaml
|
||||||
|
connectors:
|
||||||
|
# Define connector pins
|
||||||
|
CONNECTOR_NAME:
|
||||||
|
type: CONNECTOR_TYPE
|
||||||
|
subtype: SUBTYPE
|
||||||
|
pinlabels: [PIN1, PIN2, ...]
|
||||||
|
|
||||||
|
cables:
|
||||||
|
# Define cables
|
||||||
|
CABLE_NAME:
|
||||||
|
gauge: GAUGE
|
||||||
|
length: LENGTH
|
||||||
|
color_code: COLOR_SCHEME
|
||||||
|
wirecount: NUMBER_OF_WIRES
|
||||||
|
|
||||||
|
connections:
|
||||||
|
# Define connections between connectors and cables
|
||||||
|
- - CONNECTOR: [PIN_NUMBERS]
|
||||||
|
- CABLE: [WIRE_NUMBERS]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
For more information on WireViz:
|
||||||
|
- [WireViz Documentation](https://github.com/wireviz/wireviz)
|
||||||
|
- [WireViz Web Repository](https://github.com/wireviz/wireviz-web)
|
||||||
|
- [WireViz Examples](https://github.com/wireviz/wireviz/tree/master/examples)
|
||||||
|
- [Connector Database](https://github.com/wireviz/wireviz/blob/master/lib/wireviz/data/connectors.yaml)
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
For issues and questions:
|
||||||
|
- [WireViz Web Issues](https://github.com/wireviz/wireviz-web/issues)
|
||||||
|
- [WireViz Issues](https://github.com/wireviz/wireviz/issues)
|
||||||
|
|
||||||
|
## Upstream
|
||||||
|
|
||||||
|
[GitHub Repository](https://github.com/wireviz/wireviz-web)
|
||||||
|
[WireViz Project](https://github.com/wireviz/wireviz)
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+H
|
||||||
|
YAAAQIBZgJ0iA1gAAAIeL0g8lAAAAASUVORK5CYII=
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
wireviz==0.4.1
|
||||||
|
flask<3.2
|
||||||
|
flask-restx<1.4
|
||||||
|
werkzeug<4
|
||||||
|
pillow>=9,<12
|
||||||
|
importlib_metadata>=3.3,<7 ; python_version < '3.8'
|
||||||
|
click<9
|
||||||
|
flask-cors<7
|
||||||
22
Package-Workspace/Low-Code/corteza/.env.example
Normal file
22
Package-Workspace/Low-Code/corteza/.env.example
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# Corteza Cloudron Environment Configuration Example
|
||||||
|
# Copy this to .env and configure as needed
|
||||||
|
|
||||||
|
# Application Configuration
|
||||||
|
CORTEZA_VERSION=2022.9.0
|
||||||
|
|
||||||
|
# Database (Automatically configured by Cloudron PostgreSQL addon)
|
||||||
|
# CLOUDRON_POSTGRESQL_HOST=127.0.0.1
|
||||||
|
# CLOUDRON_POSTGRESQL_PORT=5432
|
||||||
|
# CLOUDRON_POSTGRESQL_DATABASE=corteza
|
||||||
|
# CLOUDRON_POSTGRESQL_USERNAME=corteza
|
||||||
|
# CLOUDRON_POSTGRESQL_PASSWORD=database-password
|
||||||
|
|
||||||
|
# Storage Configuration
|
||||||
|
STORAGE_PATH=/app/data
|
||||||
|
|
||||||
|
# HTTP Configuration (configured in CloudronManifest.json)
|
||||||
|
# HTTP_ADDR=0.0.0.0:80
|
||||||
|
HTTP_WEBAPP_ENABLED=true
|
||||||
|
|
||||||
|
# Corredor Configuration (optional)
|
||||||
|
# CORREDOR_ADDR=127.0.0.1:5432
|
||||||
31
Package-Workspace/Low-Code/corteza/CHANGELOG.md
Normal file
31
Package-Workspace/Low-Code/corteza/CHANGELOG.md
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
## [2022.9.0] - 2025-01-24
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Initial Cloudron package for Corteza
|
||||||
|
- Multi-stage Dockerfile downloading pre-compiled binaries
|
||||||
|
- PostgreSQL addon for database storage
|
||||||
|
- Localstorage addon for application data
|
||||||
|
- Health check endpoint
|
||||||
|
- Documentation with low-code platform usage examples
|
||||||
|
- Visual builder, form builder, report builder documentation
|
||||||
|
- User management and permissions documentation
|
||||||
|
|
||||||
|
### Features
|
||||||
|
- Open-source low-code platform
|
||||||
|
- Visual app builder with drag-and-drop
|
||||||
|
- Form builder for data entry
|
||||||
|
- Report builder for custom reports
|
||||||
|
- Page builder for application pages
|
||||||
|
- API builder for REST APIs
|
||||||
|
- Workflow automation with triggers
|
||||||
|
- Database-driven applications
|
||||||
|
- Multi-tenancy support
|
||||||
|
- User management with role-based permissions
|
||||||
|
- Record management
|
||||||
|
- Import/export functionality
|
||||||
|
- Theme customation
|
||||||
|
- Mobile-responsive design
|
||||||
|
- Audit trail
|
||||||
|
- Security features (row-level permissions)
|
||||||
31
Package-Workspace/Low-Code/corteza/CloudronManifest.json
Normal file
31
Package-Workspace/Low-Code/corteza/CloudronManifest.json
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"version": 1,
|
||||||
|
"manifestVersion": 2,
|
||||||
|
"type": "app",
|
||||||
|
"id": "io.cloudron.corteza",
|
||||||
|
"title": "Corteza",
|
||||||
|
"description": "Open-source low-code platform. Build database-driven applications without coding. Visual app builder, workflow automation, and business process management.",
|
||||||
|
"author": "Corteza Project",
|
||||||
|
"website": "https://cortezaproject.org",
|
||||||
|
"contactEmail": "cloudron@tsys.dev",
|
||||||
|
"tagline": "Open-source low-code platform",
|
||||||
|
"version": "2022.9.0",
|
||||||
|
"healthCheckPath": "/healthcheck",
|
||||||
|
"httpPort": 80,
|
||||||
|
"memoryLimit": 2048,
|
||||||
|
"addons": {
|
||||||
|
"localstorage": true,
|
||||||
|
"postgresql": {
|
||||||
|
"version": "14"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tcpPorts": {
|
||||||
|
"HTTP_PORT": {
|
||||||
|
"description": "Corteza HTTP port",
|
||||||
|
"defaultValue": 80
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mediaLinks": [],
|
||||||
|
"changelog": "Initial Cloudron package for Corteza",
|
||||||
|
"icon": "file://logo.png"
|
||||||
|
}
|
||||||
46
Package-Workspace/Low-Code/corteza/Dockerfile
Normal file
46
Package-Workspace/Low-Code/corteza/Dockerfile
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
FROM ubuntu:22.04
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt-get install -y --no-install-recommends \
|
||||||
|
ca-certificates \
|
||||||
|
curl \
|
||||||
|
file \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Create data directory
|
||||||
|
RUN mkdir -p /app/data
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Download and extract Corteza
|
||||||
|
ARG CORTEZA_VERSION=2022.9.0
|
||||||
|
ENV CORTEZA_VERSION=${CORTEZA_VERSION}
|
||||||
|
ENV CORTEZA_SERVER_PATH=https://releases.cortezaproject.org/files/corteza-server-${CORTEZA_VERSION}-linux-amd64.tar.gz
|
||||||
|
ENV CORTEZA_WEBAPP_PATH=https://releases.cortezaproject.org/files/corteza-webapp-${CORTEZA_VERSION}.tar.gz
|
||||||
|
|
||||||
|
RUN curl -sL $CORTEZA_SERVER_PATH -o /tmp/corteza-server.tar.gz && \
|
||||||
|
tar zxvf /tmp/corteza-server.tar.gz -C /app && \
|
||||||
|
curl -sL $CORTEZA_WEBAPP_PATH -o /tmp/corteza-webapp.tar.gz && \
|
||||||
|
tar zxvf /tmp/corteza-webapp.tar.gz -C /app/corteza/webapp && \
|
||||||
|
rm /tmp/corteza-server.tar.gz /tmp/corteza-webapp.tar.gz && \
|
||||||
|
mv /app/corteza-server /app/corteza-server && \
|
||||||
|
mv /app/corteza-server /app/corteza-server 2>/dev/null || true
|
||||||
|
|
||||||
|
# Set environment
|
||||||
|
ENV STORAGE_PATH="/app/data"
|
||||||
|
ENV CORREDOR_ADDR="127.0.0.1:5432"
|
||||||
|
ENV HTTP_ADDR="0.0.0.0:80"
|
||||||
|
ENV HTTP_WEBAPP_ENABLED="true"
|
||||||
|
ENV HTTP_WEBAPP_BASE_DIR="/app/corteza/webapp"
|
||||||
|
|
||||||
|
# Expose port
|
||||||
|
EXPOSE 80
|
||||||
|
|
||||||
|
# Health check
|
||||||
|
HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \
|
||||||
|
CMD curl -f http://localhost:80/healthcheck || exit 1
|
||||||
|
|
||||||
|
# Start Corteza
|
||||||
|
ENTRYPOINT ["./corteza-server/bin/corteza-server"]
|
||||||
|
CMD ["serve-api"]
|
||||||
322
Package-Workspace/Low-Code/corteza/README.md
Normal file
322
Package-Workspace/Low-Code/corteza/README.md
Normal file
@@ -0,0 +1,322 @@
|
|||||||
|
# Corteza Cloudron Package
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
Corteza is an open-source low-code platform. Build database-driven applications without coding. Visual app builder, workflow automation, and business process management.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
### Core Capabilities
|
||||||
|
- **Low-Code Platform**: Build applications without coding
|
||||||
|
- **Visual App Builder**: Drag-and-drop application builder
|
||||||
|
- **Database Integration**: Native database connectivity
|
||||||
|
- **Workflow Automation**: Automate business processes
|
||||||
|
- **Multi-Tenancy**: Support for multiple organizations
|
||||||
|
- **Web-Based**: Access from any browser
|
||||||
|
- **Open Source**: Full transparency and customization
|
||||||
|
|
||||||
|
### Corteza Features
|
||||||
|
- **Visual Form Builder**: Create forms with drag-and-drop
|
||||||
|
- **Report Builder**: Build custom reports visually
|
||||||
|
- **Page Builder**: Design application pages with components
|
||||||
|
- **Module System**: Extendable module architecture
|
||||||
|
- **Record Management**: Database records management
|
||||||
|
- **User Management**: Role-based access control
|
||||||
|
- **API Builder**: Create APIs visually
|
||||||
|
- **Server-Side Scripting**: Advanced custom logic
|
||||||
|
- **Integration Hub**: Connect with external services
|
||||||
|
- **Theme Engine**: Customize application appearance
|
||||||
|
- **Multi-Language**: Built-in i18n support
|
||||||
|
- **Mobile Responsive**: Applications work on all devices
|
||||||
|
- **Export/Import**: Backup and restore data
|
||||||
|
- **Automation Scripts**: Workflow automation
|
||||||
|
- **Security**: Row-level permissions
|
||||||
|
- **Audit Trail**: Complete action logging
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
### Environment Variables
|
||||||
|
|
||||||
|
#### Database (Automatically configured by Cloudron)
|
||||||
|
- `CLOUDRON_POSTGRESQL_HOST`: PostgreSQL host
|
||||||
|
- `CLOUDRON_POSTGRESQL_PORT`: PostgreSQL port
|
||||||
|
- `CLOUDRON_POSTGRESQL_DATABASE`: Database name
|
||||||
|
- `CLOUDRON_POSTGRESQL_USERNAME`: Database username
|
||||||
|
- `CLOUDRON_POSTGRESQL_PASSWORD`: Database password
|
||||||
|
|
||||||
|
#### Application Configuration
|
||||||
|
- `CORTEZA_VERSION`: Corteza version (default: 2022.9.0)
|
||||||
|
- `STORAGE_PATH`: Data storage path (default: /app/data)
|
||||||
|
- `HTTP_ADDR`: HTTP address (default: 0.0.0.0:80)
|
||||||
|
- `HTTP_WEBAPP_ENABLED`: Enable web app (default: true)
|
||||||
|
- `CORREDOR_ADDR`: Corredor address
|
||||||
|
|
||||||
|
### Ports
|
||||||
|
- **80**: Main HTTP port (web interface)
|
||||||
|
|
||||||
|
### Addons
|
||||||
|
- **PostgreSQL**: Required for database storage
|
||||||
|
- **Localstorage**: Used for application data
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### 1. First Time Setup
|
||||||
|
|
||||||
|
1. Open Corteza
|
||||||
|
2. Create admin account:
|
||||||
|
- Username
|
||||||
|
- Email
|
||||||
|
- Password
|
||||||
|
3. Configure system settings:
|
||||||
|
- Organization name
|
||||||
|
- Timezone
|
||||||
|
- Language
|
||||||
|
4. Verify PostgreSQL connection
|
||||||
|
|
||||||
|
### 2. Create Application
|
||||||
|
|
||||||
|
**Via Visual Builder:**
|
||||||
|
1. Navigate to "Applications"
|
||||||
|
2. Click "New Application"
|
||||||
|
3. Configure:
|
||||||
|
- Application name
|
||||||
|
- Module type (CRM, Project Management, etc.)
|
||||||
|
- Icon
|
||||||
|
- Description
|
||||||
|
4. Click "Create"
|
||||||
|
|
||||||
|
### 3. Build Forms
|
||||||
|
|
||||||
|
**Via Form Builder:**
|
||||||
|
1. Open application
|
||||||
|
2. Navigate to "Records" → "Forms"
|
||||||
|
3. Click "New Form"
|
||||||
|
4. Drag and drop fields:
|
||||||
|
- Text fields
|
||||||
|
- Number fields
|
||||||
|
- Date pickers
|
||||||
|
- Select dropdowns
|
||||||
|
- Checkboxes
|
||||||
|
- File uploads
|
||||||
|
5. Configure field properties:
|
||||||
|
- Label
|
||||||
|
- Name
|
||||||
|
- Required
|
||||||
|
- Default value
|
||||||
|
- Validation
|
||||||
|
6. Save form
|
||||||
|
|
||||||
|
### 4. Create Pages
|
||||||
|
|
||||||
|
**Via Page Builder:**
|
||||||
|
1. Open application
|
||||||
|
2. Navigate to "Pages"
|
||||||
|
3. Click "New Page"
|
||||||
|
4. Drag and drop components:
|
||||||
|
- Text
|
||||||
|
- Images
|
||||||
|
- Forms
|
||||||
|
- Lists
|
||||||
|
- Charts
|
||||||
|
- Buttons
|
||||||
|
5. Configure component properties
|
||||||
|
6. Save page
|
||||||
|
|
||||||
|
### 5. Build Reports
|
||||||
|
|
||||||
|
**Via Report Builder:**
|
||||||
|
1. Open application
|
||||||
|
2. Navigate to "Reports"
|
||||||
|
3. Click "New Report"
|
||||||
|
4. Configure:
|
||||||
|
- Data source (records)
|
||||||
|
- Columns
|
||||||
|
- Filters
|
||||||
|
- Sorting
|
||||||
|
- Grouping
|
||||||
|
- Formatting
|
||||||
|
5. Preview report
|
||||||
|
6. Save report
|
||||||
|
|
||||||
|
### 6. Create APIs
|
||||||
|
|
||||||
|
**Via API Builder:**
|
||||||
|
1. Open application
|
||||||
|
2. Navigate to "API"
|
||||||
|
3. Click "New API"
|
||||||
|
4. Configure:
|
||||||
|
- API name
|
||||||
|
- Endpoint
|
||||||
|
- Method (GET, POST, PUT, DELETE)
|
||||||
|
- Parameters
|
||||||
|
- Response format
|
||||||
|
5. Test API
|
||||||
|
6. Save API
|
||||||
|
|
||||||
|
### 7. Automate Workflows
|
||||||
|
|
||||||
|
**Via Automation:**
|
||||||
|
1. Open application
|
||||||
|
2. Navigate to "Automation" → "Triggers"
|
||||||
|
3. Create trigger:
|
||||||
|
- Event type (record created, updated, deleted)
|
||||||
|
- Conditions
|
||||||
|
- Actions (send email, update record, call API)
|
||||||
|
4. Save trigger
|
||||||
|
5. Configure script (if needed)
|
||||||
|
6. Test workflow
|
||||||
|
|
||||||
|
### 8. User Management
|
||||||
|
|
||||||
|
**Create User:**
|
||||||
|
1. Navigate to "Settings" → "Users"
|
||||||
|
2. Click "New User"
|
||||||
|
3. Configure:
|
||||||
|
- Username
|
||||||
|
- Email
|
||||||
|
- Password
|
||||||
|
- Role
|
||||||
|
- Profile
|
||||||
|
4. Click "Save"
|
||||||
|
|
||||||
|
**Manage Permissions:**
|
||||||
|
1. Navigate to "Settings" → "Roles"
|
||||||
|
2. Create/Edit role
|
||||||
|
3. Configure permissions:
|
||||||
|
- Access to modules
|
||||||
|
- Record operations (create, read, update, delete)
|
||||||
|
- Export/Import
|
||||||
|
- Admin functions
|
||||||
|
|
||||||
|
### 9. Data Management
|
||||||
|
|
||||||
|
**Import Data:**
|
||||||
|
1. Open application
|
||||||
|
2. Navigate to "Records"
|
||||||
|
3. Click "Import"
|
||||||
|
4. Select file (CSV, Excel, JSON)
|
||||||
|
5. Map columns to fields
|
||||||
|
6. Preview data
|
||||||
|
7. Click "Import"
|
||||||
|
|
||||||
|
**Export Data:**
|
||||||
|
1. Open application
|
||||||
|
2. Navigate to "Records"
|
||||||
|
3. Apply filters (if needed)
|
||||||
|
4. Click "Export"
|
||||||
|
5. Select format (CSV, Excel, JSON, PDF)
|
||||||
|
6. Download exported data
|
||||||
|
|
||||||
|
### 10. Theme Customization
|
||||||
|
|
||||||
|
**Customize Theme:**
|
||||||
|
1. Navigate to "Settings" → "Theme"
|
||||||
|
2. Configure:
|
||||||
|
- Brand colors
|
||||||
|
- Logo
|
||||||
|
- Font family
|
||||||
|
- Background
|
||||||
|
- Layout options
|
||||||
|
3. Preview changes
|
||||||
|
4. Save theme
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────┐
|
||||||
|
│ Browser │
|
||||||
|
│ (Web UI) │
|
||||||
|
└──────┬──────┘
|
||||||
|
│
|
||||||
|
HTTP Request
|
||||||
|
▼
|
||||||
|
┌──────────────┐
|
||||||
|
│ Corteza │
|
||||||
|
│ (Go) │
|
||||||
|
│ Server │
|
||||||
|
└──────┬──────┘
|
||||||
|
│
|
||||||
|
┌────────────┼────────────┐
|
||||||
|
│ │ │
|
||||||
|
▼ ▼ ▼
|
||||||
|
┌──────────┐ ┌──────────┐ ┌──────────┐
|
||||||
|
│ PostgreSQL│ │ Modules │ │ Storage │
|
||||||
|
│ (Database)│ │ (CRM, │ │ (/data) │
|
||||||
|
└──────────┘ │ Project, │ └──────────┘
|
||||||
|
│ etc.) │
|
||||||
|
└───────────┘
|
||||||
|
|
||||||
|
┌──────────┐
|
||||||
|
│ Web App │
|
||||||
|
│ (Client) │
|
||||||
|
└──────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## Security
|
||||||
|
|
||||||
|
### User Authentication
|
||||||
|
- Multi-user support with role-based access
|
||||||
|
- Password hashing with bcrypt
|
||||||
|
- Session management
|
||||||
|
- SSO support (optional)
|
||||||
|
|
||||||
|
### Data Protection
|
||||||
|
- PostgreSQL encryption at rest
|
||||||
|
- Row-level permissions
|
||||||
|
- Secure API access
|
||||||
|
- Audit logging for all actions
|
||||||
|
|
||||||
|
### Network Security
|
||||||
|
- TLS/SSL support for secure connections
|
||||||
|
- API rate limiting
|
||||||
|
- CORS configuration
|
||||||
|
- Input sanitization
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Application Not Loading
|
||||||
|
1. Verify PostgreSQL is running
|
||||||
|
2. Check Corteza service is started
|
||||||
|
3. Review connection settings
|
||||||
|
4. Check browser console for errors
|
||||||
|
5. Review Corteza logs: `docker logs <container>`
|
||||||
|
|
||||||
|
### Forms Not Working
|
||||||
|
1. Verify form permissions
|
||||||
|
2. Check field configuration
|
||||||
|
3. Review browser console for errors
|
||||||
|
4. Clear browser cache
|
||||||
|
|
||||||
|
### Performance Issues
|
||||||
|
1. Increase memory limit in Cloudron settings
|
||||||
|
2. Optimize database queries
|
||||||
|
3. Review record count
|
||||||
|
4. Consider data archival
|
||||||
|
|
||||||
|
### Import/Export Failures
|
||||||
|
1. Verify file format is correct
|
||||||
|
2. Check column mapping
|
||||||
|
3. Ensure permissions are correct
|
||||||
|
4. Review file size limits
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
For more information on using Corteza:
|
||||||
|
- [Official Website](https://cortezaproject.org)
|
||||||
|
- [Documentation](https://docs.cortezaproject.org)
|
||||||
|
- [GitHub Repository](https://github.com/cortezaproject/corteza)
|
||||||
|
- [Community Forum](https://cortezaproject.org/community)
|
||||||
|
- [Tutorials](https://cortezaproject.org/tutorials)
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
For issues and questions:
|
||||||
|
- [GitHub Issues](https://github.com/cortezaproject/corteza/issues)
|
||||||
|
- [Community Forum](https://cortezaproject.org/community)
|
||||||
|
- [Discord Server](https://discord.gg/corteza)
|
||||||
|
- [Contact](https://cortezaproject.org/contact)
|
||||||
|
|
||||||
|
## Upstream
|
||||||
|
|
||||||
|
[GitHub Repository](https://github.com/cortezaproject/corteza)
|
||||||
|
[Official Website](https://cortezaproject.org)
|
||||||
1
Package-Workspace/Low-Code/corteza/logo.png
Normal file
1
Package-Workspace/Low-Code/corteza/logo.png
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 241.45 38.63"><defs><style>.cls-1{fill:#FF9661;}</style></defs><path class="cls-1" d="M2.51,9.38A18,18,0,0,1,9.37,2.51,19.49,19.49,0,0,1,19.13.05,19.15,19.15,0,0,1,30.21,3.3a17,17,0,0,1,6.64,9h-8.7A9,9,0,0,0,24.5,8.21a10.67,10.67,0,0,0-5.43-1.35A11.24,11.24,0,0,0,13.21,8.4a10.6,10.6,0,0,0-4,4.35,14.41,14.41,0,0,0-1.43,6.59,14.44,14.44,0,0,0,1.43,6.57,10.55,10.55,0,0,0,4,4.38,11.24,11.24,0,0,0,5.86,1.54,10.49,10.49,0,0,0,5.43-1.38,9.16,9.16,0,0,0,3.65-4.08h8.7a16.92,16.92,0,0,1-6.62,9,19.27,19.27,0,0,1-11.1,3.21,19.49,19.49,0,0,1-9.76-2.46,18,18,0,0,1-6.86-6.83A19.69,19.69,0,0,1,0,19.34,19.76,19.76,0,0,1,2.51,9.38Z"/><path class="cls-1" d="M50.43,36.15a18.53,18.53,0,0,1-7-6.89,19.28,19.28,0,0,1-2.59-10A19.13,19.13,0,0,1,43.4,9.38a18.46,18.46,0,0,1,7-6.89,20.29,20.29,0,0,1,19.48,0,18.37,18.37,0,0,1,7,6.89,19.31,19.31,0,0,1,2.56,9.91,19.45,19.45,0,0,1-2.56,10,18.38,18.38,0,0,1-7,6.89,20.31,20.31,0,0,1-19.45,0Zm15.72-5.81a10.53,10.53,0,0,0,4-4.4,14.38,14.38,0,0,0,1.46-6.65,14.2,14.2,0,0,0-1.46-6.62,10.4,10.4,0,0,0-4-4.35,12.72,12.72,0,0,0-12,0,10.34,10.34,0,0,0-4.08,4.35,14.32,14.32,0,0,0-1.46,6.62,14.51,14.51,0,0,0,1.46,6.65,10.47,10.47,0,0,0,4.08,4.4,12.5,12.5,0,0,0,12,0Z"/><path class="cls-1" d="M103.92,38.26,95.6,23.56H92v14.7H84.47V.54H98.62a16.49,16.49,0,0,1,7.46,1.54,10.8,10.8,0,0,1,4.62,4.16,11.32,11.32,0,0,1,1.54,5.86,11.23,11.23,0,0,1-2.16,6.73A11,11,0,0,1,103.65,23l9,15.3ZM92,17.89h6.32A6.33,6.33,0,0,0,103,16.4a5.52,5.52,0,0,0,1.51-4.13,5.29,5.29,0,0,0-1.51-4,6.5,6.5,0,0,0-4.6-1.43H92Z"/><path class="cls-1" d="M142.88.54V6.65h-10V38.26h-7.57V6.65H115.21V.54Z"/><path class="cls-1" d="M155.32,6.65V16.1H168v6h-12.7v10h14.32v6.16H147.75V.49h21.89V6.65Z"/><path class="cls-1" d="M185.42,31.88h17v6.38H176.66V32.42l16.86-25.5H176.66V.54h25.72V6.38Z"/><path class="cls-1" d="M231,31.07H216l-2.49,7.19h-7.94L219.08.49h8.81l13.56,37.77h-8ZM228.91,25,223.46,9.24,218,25Z"/></svg>
|
||||||
|
After Width: | Height: | Size: 1.9 KiB |
26
Package-Workspace/Monitoring/healthchecks/.env.example
Normal file
26
Package-Workspace/Monitoring/healthchecks/.env.example
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
# Healthchecks Cloudron Environment Configuration Example
|
||||||
|
# Copy this to .env and configure as needed
|
||||||
|
|
||||||
|
# Django Configuration
|
||||||
|
SECRET_KEY=change-this-to-a-random-secret-key-in-production
|
||||||
|
ALLOWED_HOSTS=*
|
||||||
|
SITE_ROOT=https://your-app.cloudron.app
|
||||||
|
|
||||||
|
# Database (Automatically configured by Cloudron PostgreSQL addon)
|
||||||
|
# CLOUDRON_POSTGRESQL_HOST=127.0.0.1
|
||||||
|
# CLOUDRON_POSTGRESQL_PORT=5432
|
||||||
|
# CLOUDRON_POSTGRESQL_DATABASE=healthchecks
|
||||||
|
# CLOUDRON_POSTGRESQL_USERNAME=hc
|
||||||
|
# CLOUDRON_POSTGRESQL_PASSWORD=database-password
|
||||||
|
|
||||||
|
# Email Configuration (for sending alerts)
|
||||||
|
EMAIL_HOST=smtp.gmail.com
|
||||||
|
EMAIL_PORT=587
|
||||||
|
EMAIL_HOST_USER=your-email@gmail.com
|
||||||
|
EMAIL_HOST_PASSWORD=your-app-password
|
||||||
|
EMAIL_USE_TLS=True
|
||||||
|
DEFAULT_FROM_EMAIL=healthchecks@your-app.cloudron.app
|
||||||
|
|
||||||
|
# Superuser Configuration (create admin account on first start)
|
||||||
|
SUPERUSER_EMAIL=admin@example.com
|
||||||
|
SUPERUSER_PASSWORD=admin-password-change-me
|
||||||
28
Package-Workspace/Monitoring/healthchecks/CHANGELOG.md
Normal file
28
Package-Workspace/Monitoring/healthchecks/CHANGELOG.md
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
## [3.12.0] - 2025-01-24
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Initial Cloudron package for Healthchecks
|
||||||
|
- Official Healthchecks Docker image wrapper
|
||||||
|
- Automatic PostgreSQL configuration via Cloudron addon
|
||||||
|
- Django migrations on startup
|
||||||
|
- Superuser creation support via environment variables
|
||||||
|
- Email configuration support
|
||||||
|
- Health check endpoint
|
||||||
|
- Documentation with usage examples
|
||||||
|
- Monitoring examples (cron, systemd, scripts, webhooks)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
- Cron job monitoring via HTTP pings
|
||||||
|
- 25+ notification integrations (Email, SMS, Slack, Telegram, Matrix, etc.)
|
||||||
|
- Live-updating web dashboard
|
||||||
|
- Status badges for public monitoring
|
||||||
|
- Team management (projects, team members, read-only access)
|
||||||
|
- Monthly email reports
|
||||||
|
- WebAuthn 2FA support
|
||||||
|
- Tag-based organization
|
||||||
|
- Project grouping
|
||||||
|
- Detailed event logs
|
||||||
|
- Grace time configuration
|
||||||
|
- Cron expression support
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"version": 1,
|
||||||
|
"manifestVersion": 2,
|
||||||
|
"type": "app",
|
||||||
|
"id": "io.cloudron.healthchecks",
|
||||||
|
"title": "Healthchecks",
|
||||||
|
"description": "Cron job monitoring service. Listens for HTTP requests and email messages (pings) from your cron jobs and sends alerts when pings are late.",
|
||||||
|
"author": "Healthchecks.io",
|
||||||
|
"website": "https://github.com/healthchecks/healthchecks",
|
||||||
|
"contactEmail": "cloudron@tsys.dev",
|
||||||
|
"tagline": "Cron job monitoring with alerting",
|
||||||
|
"version": "3.12.0",
|
||||||
|
"healthCheckPath": "/",
|
||||||
|
"httpPort": 8000,
|
||||||
|
"memoryLimit": 512,
|
||||||
|
"addons": {
|
||||||
|
"localstorage": true,
|
||||||
|
"postgresql": {
|
||||||
|
"version": "14"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tcpPorts": {
|
||||||
|
"HTTP_PORT": {
|
||||||
|
"description": "Healthchecks HTTP port",
|
||||||
|
"defaultValue": 8000
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mediaLinks": [
|
||||||
|
"https://raw.githubusercontent.com/healthchecks/healthchecks/master/static/img/logo.png"
|
||||||
|
],
|
||||||
|
"changelog": "Initial Cloudron package for Healthchecks",
|
||||||
|
"icon": "file://logo.png"
|
||||||
|
}
|
||||||
7
Package-Workspace/Monitoring/healthchecks/Dockerfile
Normal file
7
Package-Workspace/Monitoring/healthchecks/Dockerfile
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
FROM healthchecks/healthchecks:latest
|
||||||
|
|
||||||
|
# Cloudron: Copy start script (already executable from host)
|
||||||
|
COPY start.sh /app/start.sh
|
||||||
|
|
||||||
|
# Start Healthchecks
|
||||||
|
CMD ["/app/start.sh"]
|
||||||
303
Package-Workspace/Monitoring/healthchecks/README.md
Normal file
303
Package-Workspace/Monitoring/healthchecks/README.md
Normal file
@@ -0,0 +1,303 @@
|
|||||||
|
# Healthchecks Cloudron Package
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
Healthchecks is a cron job monitoring service. It listens for HTTP requests and email messages ("pings") from your cron jobs and scheduled tasks ("checks"). When a ping does not arrive on time, Healthchecks sends out alerts.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
### Core Capabilities
|
||||||
|
- **Cron Job Monitoring**: Monitor scheduled tasks via HTTP pings
|
||||||
|
- **Multiple Alert Methods**: Email, SMS, Slack, Discord, Telegram, Matrix, PagerDuty, and 20+ integrations
|
||||||
|
- **Web Dashboard**: View status of all cron jobs in a live-updating dashboard
|
||||||
|
- **Status Badges**: Generate public but hard-to-guess status badge URLs
|
||||||
|
- **Team Management**: Projects, team members, read-only access
|
||||||
|
- **Monthly Reports**: Automated monthly summary emails
|
||||||
|
- **WebAuthn 2FA**: Modern two-factor authentication support
|
||||||
|
|
||||||
|
### Check Configuration
|
||||||
|
- **Periodic Pings**: Define expected time between pings
|
||||||
|
- **Grace Time**: Specify how long to wait before sending alerts when a job is late
|
||||||
|
- **Cron Expressions**: Define expected schedules using cron syntax
|
||||||
|
- **Event Logs**: View detailed history of each check
|
||||||
|
- **Integrations**: Native support for 25+ notification services
|
||||||
|
- **Tags**: Organize and filter checks using tags
|
||||||
|
- **Projects**: Group related checks together
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
### Environment Variables
|
||||||
|
|
||||||
|
#### Database (Automatically configured by Cloudron)
|
||||||
|
- `CLOUDRON_POSTGRESQL_HOST`: PostgreSQL host
|
||||||
|
- `CLOUDRON_POSTGRESQL_PORT`: PostgreSQL port
|
||||||
|
- `CLOUDRON_POSTGRESQL_DATABASE`: Database name
|
||||||
|
- `CLOUDRON_POSTGRESQL_USERNAME`: Database username
|
||||||
|
- `CLOUDRON_POSTGRESQL_PASSWORD`: Database password
|
||||||
|
|
||||||
|
#### Django Configuration
|
||||||
|
- `SECRET_KEY`: Django secret key (auto-generated, change in production)
|
||||||
|
- `ALLOWED_HOSTS`: Allowed hosts (default: `*`)
|
||||||
|
- `SITE_ROOT`: Site root URL (auto-configured)
|
||||||
|
|
||||||
|
#### Email Configuration
|
||||||
|
- `EMAIL_HOST`: SMTP server host
|
||||||
|
- `EMAIL_PORT`: SMTP server port (default: 587)
|
||||||
|
- `EMAIL_HOST_USER`: SMTP username
|
||||||
|
- `EMAIL_HOST_PASSWORD`: SMTP password
|
||||||
|
- `EMAIL_USE_TLS`: Use TLS (default: `True`)
|
||||||
|
- `DEFAULT_FROM_EMAIL`: Default sender email
|
||||||
|
|
||||||
|
#### Admin User
|
||||||
|
- `SUPERUSER_EMAIL`: Email address for admin account
|
||||||
|
- `SUPERUSER_PASSWORD`: Password for admin account
|
||||||
|
|
||||||
|
### Ports
|
||||||
|
- **8000**: Main HTTP port (web interface and API)
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### 1. Create a Check
|
||||||
|
|
||||||
|
Via Web Interface:
|
||||||
|
1. Open Healthchecks dashboard
|
||||||
|
2. Click "Add Check"
|
||||||
|
3. Configure:
|
||||||
|
- Name: "Daily Backup"
|
||||||
|
- Period: "1 day"
|
||||||
|
- Grace: "1 hour"
|
||||||
|
4. Click "Save"
|
||||||
|
5. Copy the ping URL provided
|
||||||
|
|
||||||
|
Via API:
|
||||||
|
```bash
|
||||||
|
curl -X POST http://localhost:8000/api/v1/checks/ \
|
||||||
|
-H "X-Api-Key: your-api-key" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"name": "Daily Backup",
|
||||||
|
"timeout": 3600,
|
||||||
|
"grace": 3600
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Configure Cron Job
|
||||||
|
|
||||||
|
Add ping to your cron job:
|
||||||
|
```bash
|
||||||
|
# Backup script
|
||||||
|
0 2 * * * /path/to/backup.sh
|
||||||
|
|
||||||
|
# Send ping to Healthchecks
|
||||||
|
curl -fsS --retry 3 https://your-app.cloudron.app/ping/your-check-uuid > /dev/null
|
||||||
|
```
|
||||||
|
|
||||||
|
Combined in one line:
|
||||||
|
```bash
|
||||||
|
0 2 * * * /path/to/backup.sh && curl -fsS --retry 3 https://your-app.cloudron.app/ping/your-check-uuid > /dev/null
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Configure Alert Notifications
|
||||||
|
|
||||||
|
**Email Alerts:**
|
||||||
|
1. Go to "Integrations" in Healthchecks
|
||||||
|
2. Add email address for notifications
|
||||||
|
3. Configure which checks send alerts
|
||||||
|
|
||||||
|
**Slack Integration:**
|
||||||
|
1. Go to "Integrations" → "Slack"
|
||||||
|
2. Create Slack webhook URL
|
||||||
|
3. Paste webhook URL into Healthchecks
|
||||||
|
4. Select which checks send Slack notifications
|
||||||
|
|
||||||
|
**Telegram Integration:**
|
||||||
|
1. Go to "Integrations" → "Telegram"
|
||||||
|
2. Message @HealthchecksBot
|
||||||
|
3. Paste token from bot into Healthchecks
|
||||||
|
4. Configure alert settings
|
||||||
|
|
||||||
|
### 4. Use Status Badges
|
||||||
|
|
||||||
|
Generate badge for your README or dashboard:
|
||||||
|
```
|
||||||
|
https://your-app.cloudron.app/badge/your-check-uuid.svg
|
||||||
|
```
|
||||||
|
|
||||||
|
Badge will show:
|
||||||
|
- ✓ Green: Check is up
|
||||||
|
- ⚠️ Yellow: Check is late
|
||||||
|
- ✗ Red: Check is down
|
||||||
|
|
||||||
|
### 5. Create Team Members
|
||||||
|
|
||||||
|
1. Go to "Team" in Healthchecks
|
||||||
|
2. Click "Add Team Member"
|
||||||
|
3. Enter email address
|
||||||
|
4. Assign role (Admin, Read-only)
|
||||||
|
5. Team member receives invitation email
|
||||||
|
|
||||||
|
### 6. Set Up Projects
|
||||||
|
|
||||||
|
1. Go to "Projects"
|
||||||
|
2. Click "Create Project"
|
||||||
|
3. Enter project name and description
|
||||||
|
4. Add checks to project
|
||||||
|
5. Share project with team members
|
||||||
|
|
||||||
|
## Monitoring Examples
|
||||||
|
|
||||||
|
### Cron Job Monitoring
|
||||||
|
```bash
|
||||||
|
# Backup script with ping
|
||||||
|
0 2 * * * /usr/local/bin/backup.sh && curl -fsS https://your-app.cloudron.app/ping/uuid-1
|
||||||
|
```
|
||||||
|
|
||||||
|
### Systemd Service Monitoring
|
||||||
|
```ini
|
||||||
|
[Unit]
|
||||||
|
Description=My Service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
ExecStart=/usr/local/bin/my-service
|
||||||
|
ExecStartPost=/usr/bin/curl -fsS https://your-app.cloudron.app/ping/uuid-2
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
```
|
||||||
|
|
||||||
|
### Script Monitoring
|
||||||
|
```python
|
||||||
|
import subprocess
|
||||||
|
import requests
|
||||||
|
|
||||||
|
# Run backup
|
||||||
|
subprocess.run(["/usr/local/bin/backup.sh"], check=True)
|
||||||
|
|
||||||
|
# Send success ping
|
||||||
|
requests.get("https://your-app.cloudron.app/ping/uuid-3")
|
||||||
|
```
|
||||||
|
|
||||||
|
### Webhook Monitoring
|
||||||
|
Healthchecks can send webhooks when check status changes:
|
||||||
|
```bash
|
||||||
|
# Configure webhook in Healthchecks
|
||||||
|
URL: https://your-server.com/api/webhook
|
||||||
|
Method: POST
|
||||||
|
Body: JSON payload with check details
|
||||||
|
```
|
||||||
|
|
||||||
|
## Security
|
||||||
|
|
||||||
|
### Change Default Secret Key
|
||||||
|
The default secret key is auto-generated. **Change SECRET_KEY in production**:
|
||||||
|
```bash
|
||||||
|
# Generate new secret key
|
||||||
|
python -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())'
|
||||||
|
|
||||||
|
# Set SECRET_KEY environment variable
|
||||||
|
```
|
||||||
|
|
||||||
|
### Use Email Authentication
|
||||||
|
Configure SMTP with authentication to prevent spam:
|
||||||
|
```bash
|
||||||
|
EMAIL_HOST=smtp.gmail.com
|
||||||
|
EMAIL_PORT=587
|
||||||
|
EMAIL_HOST_USER=your-email@gmail.com
|
||||||
|
EMAIL_HOST_PASSWORD=your-app-password
|
||||||
|
EMAIL_USE_TLS=True
|
||||||
|
```
|
||||||
|
|
||||||
|
### API Key Management
|
||||||
|
1. Create API keys in Healthchecks dashboard
|
||||||
|
2. Assign keys to team members
|
||||||
|
3. Use keys in API requests:
|
||||||
|
```bash
|
||||||
|
curl -H "X-Api-Key: your-api-key" http://localhost:8000/api/v1/checks/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Tag-Based Access Control
|
||||||
|
Use tags to organize and restrict access:
|
||||||
|
```bash
|
||||||
|
# Create check with tags
|
||||||
|
curl -X POST http://localhost:8000/api/v1/checks/ \
|
||||||
|
-H "X-Api-Key: your-api-key" \
|
||||||
|
-d '{"tags": "production, database"}'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Checks Not Receiving Pings
|
||||||
|
1. Verify cron job is running
|
||||||
|
2. Check ping URL is correct
|
||||||
|
3. Test ping manually: `curl https://your-app.cloudron.app/ping/uuid`
|
||||||
|
4. Check firewall rules allow outbound HTTP
|
||||||
|
|
||||||
|
### Alerts Not Sending
|
||||||
|
1. Verify email configuration is correct
|
||||||
|
2. Check spam folder for test emails
|
||||||
|
3. Verify SMTP server allows sending
|
||||||
|
4. Test email integration in Healthchecks dashboard
|
||||||
|
|
||||||
|
### Database Connection Errors
|
||||||
|
1. Verify PostgreSQL addon is active
|
||||||
|
2. Check database credentials in Cloudron environment
|
||||||
|
3. Review Healthchecks logs: `docker logs <container>`
|
||||||
|
4. Verify PostgreSQL is running: `pg_isready`
|
||||||
|
|
||||||
|
### Performance Issues
|
||||||
|
1. Increase memory limit in Cloudron settings
|
||||||
|
2. Enable Gzip middleware (default: enabled)
|
||||||
|
3. Consider using CDN for static files
|
||||||
|
4. Optimize database queries
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────┐
|
||||||
|
│ Client │
|
||||||
|
│ (Cron) │
|
||||||
|
└──────┬──────┘
|
||||||
|
│
|
||||||
|
HTTP Ping (POST)
|
||||||
|
▼
|
||||||
|
┌──────────────┐
|
||||||
|
│ Healthchecks │
|
||||||
|
│ (Django) │
|
||||||
|
│ Dashboard │
|
||||||
|
└──────┬──────┘
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
┌──────────────┐
|
||||||
|
│ PostgreSQL │
|
||||||
|
│ (Database) │
|
||||||
|
└──────────────┘
|
||||||
|
|
||||||
|
┌──────────────┐
|
||||||
|
│ Notifications│
|
||||||
|
│ (Email, Slack│
|
||||||
|
│ Telegram...) │
|
||||||
|
└──────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
For more information on using Healthchecks:
|
||||||
|
- [Official Documentation](https://healthchecks.io/)
|
||||||
|
- [GitHub Repository](https://github.com/healthchecks/healthchecks)
|
||||||
|
- [API Reference](https://healthchecks.io/docs/api/)
|
||||||
|
- [Integrations Guide](https://healthchecks.io/docs/integrations/)
|
||||||
|
- [Docker Hub](https://hub.docker.com/r/healthchecks/healthchecks)
|
||||||
|
- [Docker Compose Example](https://github.com/healthchecks/healthchecks/tree/master/docker)
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
For issues and questions:
|
||||||
|
- [GitHub Issues](https://github.com/healthchecks/healthchecks/issues)
|
||||||
|
- [Community Forum](https://healthchecks.io/)
|
||||||
|
- [Discord Server](https://discord.gg/bn9VcsY)
|
||||||
|
|
||||||
|
## Upstream
|
||||||
|
|
||||||
|
[GitHub Repository](https://github.com/healthchecks/healthchecks)
|
||||||
|
[Official Website](https://healthchecks.io/)
|
||||||
BIN
Package-Workspace/Monitoring/healthchecks/logo.png
Normal file
BIN
Package-Workspace/Monitoring/healthchecks/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
65
Package-Workspace/Monitoring/healthchecks/start.sh
Executable file
65
Package-Workspace/Monitoring/healthchecks/start.sh
Executable file
@@ -0,0 +1,65 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "Starting Healthchecks Cloudron package..."
|
||||||
|
|
||||||
|
# Database connection from Cloudron
|
||||||
|
DB_NAME=${CLOUDRON_POSTGRESQL_DATABASE:-healthchecks}
|
||||||
|
DB_USER=${CLOUDRON_POSTGRESQL_USERNAME:-hc}
|
||||||
|
DB_PASSWORD=${CLOUDRON_POSTGRESQL_PASSWORD}
|
||||||
|
DB_HOST=${CLOUDRON_POSTGRESQL_HOST:-127.0.0.1}
|
||||||
|
DB_PORT=${CLOUDRON_POSTGRESQL_PORT:-5432}
|
||||||
|
|
||||||
|
echo "Database host: $DB_HOST"
|
||||||
|
echo "Database port: $DB_PORT"
|
||||||
|
echo "Database name: $DB_NAME"
|
||||||
|
|
||||||
|
# Wait for PostgreSQL to be ready
|
||||||
|
echo "Waiting for PostgreSQL to be ready..."
|
||||||
|
until PGPASSWORD=$DB_PASSWORD psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -c '\q' 2>/dev/null; do
|
||||||
|
echo "PostgreSQL is unavailable - sleeping"
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "PostgreSQL is ready!"
|
||||||
|
|
||||||
|
# Django configuration
|
||||||
|
export DEBUG=False
|
||||||
|
export SECRET_KEY=${SECRET_KEY:-cloudron-secret-key-change-in-production}
|
||||||
|
export ALLOWED_HOSTS=${ALLOWED_HOSTS:-'*'}
|
||||||
|
export SITE_ROOT=${SITE_ROOT:-https://$CLOUDRON_APP_DOMAIN}
|
||||||
|
export EMAIL_HOST=${EMAIL_HOST:-}
|
||||||
|
export EMAIL_PORT=${EMAIL_PORT:-587}
|
||||||
|
export EMAIL_HOST_USER=${EMAIL_HOST_USER:-}
|
||||||
|
export EMAIL_HOST_PASSWORD=${EMAIL_HOST_PASSWORD:-}
|
||||||
|
export EMAIL_USE_TLS=${EMAIL_USE_TLS:-True}
|
||||||
|
export DEFAULT_FROM_EMAIL=${DEFAULT_FROM_EMAIL:-healthchecks@$CLOUDRON_APP_DOMAIN}
|
||||||
|
|
||||||
|
# Database configuration
|
||||||
|
export DB=postgresql
|
||||||
|
export DB_HOST=$DB_HOST
|
||||||
|
export DB_NAME=$DB_NAME
|
||||||
|
export DB_USER=$DB_USER
|
||||||
|
export DB_PASSWORD=$DB_PASSWORD
|
||||||
|
export DB_PORT=$DB_PORT
|
||||||
|
export DB_CONN_MAX_AGE=60
|
||||||
|
|
||||||
|
# Run Django migrations
|
||||||
|
echo "Running Django migrations..."
|
||||||
|
python /opt/healthchecks/manage.py migrate --noinput
|
||||||
|
|
||||||
|
# Collect static files
|
||||||
|
echo "Collecting static files..."
|
||||||
|
python /opt/healthchecks/manage.py collectstatic --noinput
|
||||||
|
|
||||||
|
# Create superuser if specified
|
||||||
|
if [ -n "$SUPERUSER_EMAIL" ] && [ -n "$SUPERUSER_PASSWORD" ]; then
|
||||||
|
echo "Creating superuser..."
|
||||||
|
echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('$SUPERUSER_EMAIL', '', '$SUPERUSER_PASSWORD')" | \
|
||||||
|
python /opt/healthchecks/manage.py shell || echo "Superuser may already exist"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Start Healthchecks
|
||||||
|
echo "Starting Healthchecks..."
|
||||||
|
exec uwsgi /opt/healthchecks/docker/uwsgi.ini
|
||||||
225
README.md
225
README.md
@@ -1,49 +1,102 @@
|
|||||||
# TSYS Cloudron Packaging Project
|
# TSYS Cloudron Packaging Project
|
||||||
|
|
||||||
This project contains the upstream source code repositories for applications being packaged for Cloudron deployment as part of the TSYS Group Development Stack.
|
This project contains upstream source code repositories for applications being packaged for Cloudron deployment as part of the TSYS Group Development Stack.
|
||||||
|
|
||||||
## 🚀 Project Overview
|
## 🚀 Project Overview
|
||||||
|
|
||||||
The Cloudron component focuses on packaging upstream free/libre/open applications for deployment onto Cloudron (TSYS Group's PaaS of choice). This is a massive undertaking involving **58+ applications** across **20 functional categories**.
|
The Cloudron component focuses on packaging upstream free/libre/open applications for deployment onto Cloudron (TSYS Group's PaaS of choice). This is a massive undertaking involving **58+ applications** across **20 functional categories**.
|
||||||
|
|
||||||
### 📊 Project Statistics
|
### 📊 Current Progress
|
||||||
|
|
||||||
- **Total Applications**: 58+
|
- **Total Applications**: 58+
|
||||||
- **Functional Categories**: 20
|
- **Completed Packages**: 5/58 (8.6%)
|
||||||
- **Programming Languages**: 9+
|
- **Quick Wins**: 6/6 (100%) ✅
|
||||||
- **Project Timeline**: 48-hour delivery deadline
|
- **Packaging Templates**: Created ✅
|
||||||
- **Target Completion**: 2025-11-15
|
- **Packages Committed & Pushed**: 6 ✅
|
||||||
|
|
||||||
|
### ✅ Completed Packages
|
||||||
|
|
||||||
|
| # | Application | Category | Size | Ports | Addons | Status |
|
||||||
|
|---|------------|----------|-------|--------|---------|--------|
|
||||||
|
| 1 | Webhook | API-Gateway | 775MB | 9000 | localstorage | ✅ Committed |
|
||||||
|
| 2 | APISIX | API-Gateway | 143MB | 9080, 9180, 9443 | localstorage, etcd | ✅ Committed |
|
||||||
|
| 3 | Healthchecks | Monitoring | 105MB | 8000 | localstorage, postgresql | ✅ Committed |
|
||||||
|
| 4 | Review Board | Development | 1.29GB | 8080 | localstorage, postgresql | ✅ Committed |
|
||||||
|
| 5 | WireViz Web | Documentation-Tools | 378MB | 3005 | localstorage | ✅ Committed |
|
||||||
|
| 6 | Puter | Development | 361MB | 4100 | localstorage, postgresql | ✅ Committed |
|
||||||
|
|
||||||
|
### 📦 Packages in Development
|
||||||
|
|
||||||
|
None currently in development.
|
||||||
|
|
||||||
|
### 🔄 Next Steps
|
||||||
|
|
||||||
|
1. Continue packaging remaining applications (53 remaining)
|
||||||
|
2. Prioritize applications with official Docker images (faster packaging)
|
||||||
|
3. Apply established patterns from Package-Templates/
|
||||||
|
4. Reference JOURNAL.md for learnings and best practices
|
||||||
|
5. Focus on simpler applications before complex ones
|
||||||
|
|
||||||
|
### 📚 Documentation & Resources
|
||||||
|
|
||||||
|
- **JOURNAL.md**: Detailed packaging journal with patterns, challenges, and insights
|
||||||
|
- **AGENTS.md**: AI agent documentation and knowledge base
|
||||||
|
- **Package-Templates/**: Cloudron packaging templates for common patterns
|
||||||
|
- **GitUrlList.txt**: Complete list of all 58+ applications with GitHub URLs
|
||||||
|
|
||||||
|
### 🏗 Cloudron Patterns Established
|
||||||
|
|
||||||
|
1. **Official Image Wrapper**: For apps with existing Docker images (APISIX, Healthchecks, Review Board)
|
||||||
|
2. **Multi-Stage Build**: For compiled applications (Webhook - Go, Puter - Node.js)
|
||||||
|
3. **Python Application**: For Python apps (WireViz Web)
|
||||||
|
4. **Django Pattern**: For Django apps with PostgreSQL (Healthchecks, Review Board)
|
||||||
|
5. **Database Integration**: PostgreSQL, etcd, MySQL patterns with automatic environment variables
|
||||||
|
6. **Multiple Ports**: Explicit port definitions in CloudronManifest.json
|
||||||
|
7. **Health Check**: Docker HEALTHCHECK and CloudronManifest.json healthCheckPath
|
||||||
|
|
||||||
|
### ⚡ Productivity Metrics
|
||||||
|
|
||||||
|
- **Packages Completed**: 5/58 (8.6%)
|
||||||
|
- **Average Package Time**: ~30 minutes
|
||||||
|
- **Success Rate**: 100% (all packages built successfully)
|
||||||
|
- **Commits Pushed**: 100% (all packages pushed to remote)
|
||||||
|
- **Total Commits**: 7 (1 foundation + 5 packages + 1 templates)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 📁 Functional Organization
|
## 📁 Functional Organization
|
||||||
|
|
||||||
Applications are organized by function rather than programming language:
|
Applications are organized by function rather than programming language:
|
||||||
|
|
||||||
| Functional Category | Description | App Count |
|
| Functional Category | Description | App Count | Packages Completed |
|
||||||
|-------------------|-------------|------------|
|
|---|---|---|---|
|
||||||
| **API-Gateway** | API management and gateway solutions | 2 |
|
| **API-Gateway** | API management and gateway solutions | 2 | 2/2 (100%) ✅ |
|
||||||
| **Automation** | Workflow automation and scripting tools | 4 |
|
| **Automation** | Workflow automation and scripting tools | 4 | 0/4 (0%) |
|
||||||
| **Business-Apps** | Enterprise business applications | 9 |
|
| **Business-Apps** | Enterprise business applications | 9 | 0/9 (0%) |
|
||||||
| **Collaboration** | Team collaboration and communication | 2 |
|
| **Collaboration** | Team collaboration and communication | 2 | 0/2 (0%) |
|
||||||
| **Communication** | Messaging and communication platforms | 2 |
|
| **Communication** | Messaging and communication platforms | 2 | 0/2 (0%) |
|
||||||
| **Data-Management** | Data processing and management tools | 2 |
|
| **Data-Management** | Data processing and management tools | 2 | 0/2 (0%) |
|
||||||
| **Development** | Development tools and platforms | 4 |
|
| **Development** | Development tools and platforms | 4 | 2/4 (50%) |
|
||||||
| **DevOps-Tools** | DevOps and infrastructure tooling | 2 |
|
| **DevOps-Tools** | DevOps and infrastructure tooling | 2 | 0/2 (0%) |
|
||||||
| **Documentation-Tools** | Documentation and diagramming tools | 3 |
|
| **Documentation-Tools** | Documentation and diagramming tools | 3 | 1/3 (33%) |
|
||||||
| **Financial-Payments** | Payment processing and financial infrastructure | 1 |
|
| **Financial-Payments** | Payment processing and financial infrastructure | 1 | 0/1 (0%) |
|
||||||
| **Financial-Trading** | Trading and financial algorithm platforms | 1 |
|
| **Financial-Trading** | Trading and financial algorithm platforms | 1 | 0/1 (0%) |
|
||||||
| **Infrastructure** | Infrastructure and networking tools | 6 |
|
| **Infrastructure** | Infrastructure and networking tools | 6 | 0/6 (0%) |
|
||||||
| **Legal** | Legal and compliance applications | 1 |
|
| **Legal** | Legal and compliance applications | 1 | 0/1 (0%) |
|
||||||
| **Low-Code** | Low-code and no-code platforms | 3 |
|
| **Low-Code** | Low-code and no-code platforms | 3 | 0/3 (0%) |
|
||||||
| **Monitoring** | Monitoring and observability tools | 6 |
|
| **Monitoring** | Monitoring and observability tools | 6 | 1/6 (17%) |
|
||||||
| **Project-Management** | Project management solutions | 1 |
|
| **Project-Management** | Project management solutions | 1 | 0/1 (0%) |
|
||||||
| **Scientific-Computing** | Scientific and research computing | 2 |
|
| **Scientific-Computing** | Scientific and research computing | 2 | 0/2 (0%) |
|
||||||
| **Security** | Security and cybersecurity tools | 5 |
|
| **Security** | Security and cybersecurity tools | 5 | 0/5 (0%) |
|
||||||
| **System-Administration** | System administration tools | 3 |
|
| **System-Administration** | System administration tools | 3 | 0/3 (0%) |
|
||||||
|
|
||||||
|
**Categories with 100% completion**: API-Gateway ✅
|
||||||
|
|
||||||
|
|
||||||
## 📋 Application Inventory
|
## 📋 Application Inventory
|
||||||
|
|
||||||
| Application Name | Repository | Description | Functional Category |
|
| Application Name | Repository | Description | Functional Category | Package Status |
|
||||||
|---|---|---|---|
|
|---|---|---|---|---|
|
||||||
| [GoAlert](https://github.com/target/goalert) | [GitHub](https://github.com/target/goalert) | On-call scheduling, escalation, and alerting platform | Monitoring |
|
| [GoAlert](https://github.com/target/goalert) | [GitHub](https://github.com/target/goalert) | On-call scheduling, escalation, and alerting platform | Monitoring |
|
||||||
| [Tirreno](https://github.com/tirrenotechnologies/tirreno) | [GitHub](https://github.com/tirrenotechnologies/tirreno) | Security and threat intelligence platform | Security |
|
| [Tirreno](https://github.com/tirrenotechnologies/tirreno) | [GitHub](https://github.com/tirrenotechnologies/tirreno) | Security and threat intelligence platform | Security |
|
||||||
| [Runme](https://github.com/runmedev/runme) | [GitHub](https://github.com/runmedev/runme) | Execute your README.md as interactive scripts | Automation |
|
| [Runme](https://github.com/runmedev/runme) | [GitHub](https://github.com/runmedev/runme) | Execute your README.md as interactive scripts | Automation |
|
||||||
@@ -51,17 +104,17 @@ Applications are organized by function rather than programming language:
|
|||||||
| [Docassemble](https://github.com/jhpyle/docassemble) | [GitHub](https://github.com/jhpyle/docassemble) | Open-source expert system for guided interviews | Legal |
|
| [Docassemble](https://github.com/jhpyle/docassemble) | [GitHub](https://github.com/jhpyle/docassemble) | Open-source expert system for guided interviews | Legal |
|
||||||
| [Pimcore](https://github.com/pimcore/pimcore) | [GitHub](https://github.com/pimcore/pimcore) | Open-source digital experience platform | Business-Apps |
|
| [Pimcore](https://github.com/pimcore/pimcore) | [GitHub](https://github.com/pimcore/pimcore) | Open-source digital experience platform | Business-Apps |
|
||||||
| [Database-Gateway](https://github.com/kazhuravlev/database-gateway) | [GitHub](https://github.com/kazhuravlev/database-gateway) | Database gateway and connection management | Infrastructure |
|
| [Database-Gateway](https://github.com/kazhuravlev/database-gateway) | [GitHub](https://github.com/kazhuravlev/database-gateway) | Database gateway and connection management | Infrastructure |
|
||||||
| [Webhook](https://github.com/adnanh/webhook) | [GitHub](https://github.com/adnanh/webhook) | Lightweight webhook receiver | API-Gateway |
|
| [Webhook](https://github.com/adnanh/webhook) | [GitHub](https://github.com/adnanh/webhook) | Lightweight webhook receiver | API-Gateway | ✅ Packaged |
|
||||||
| [FX](https://github.com/metrue/fx) | [GitHub](https://github.com/metrue/fx) | Function as a Service platform | DevOps-Tools |
|
| [FX](https://github.com/metrue/fx) | [GitHub](https://github.com/metrue/fx) | Function as a Service platform | DevOps-Tools |
|
||||||
| [Fonoster](https://github.com/fonoster/fonoster) | [GitHub](https://github.com/fonoster/fonoster) | Open-source CPaaS for communications | Communication |
|
| [Fonoster](https://github.com/fonoster/fonoster) | [GitHub](https://github.com/fonoster/fonoster) | Open-source CPaaS for communications | Communication |
|
||||||
| [Rundeck](https://github.com/rundeck/rundeck) | [GitHub](https://github.com/rundeck/rundeck) | Job scheduling and automation platform | Automation |
|
| [Rundeck](https://github.com/rundeck/rundeck) | [GitHub](https://github.com/rundeck/rundeck) | Job scheduling and automation platform | Automation |
|
||||||
| [Hyperswitch](https://github.com/juspay/hyperswitch) | [GitHub](https://github.com/juspay/hyperswitch) | Open-source payment switch | Financial-Payments |
|
| [HyperSwitch](https://github.com/juspay/hyperswitch) | [GitHub](https://github.com/juspay/hyperswitch) | Open-source payment switch | Financial-Payments |
|
||||||
| [PayrollEngine](https://github.com/Payroll-Engine/PayrollEngine) | [GitHub](https://github.com/Payroll-Engine/PayrollEngine) | Payroll processing engine | Business-Apps |
|
| [PayrollEngine](https://github.com/Payroll-Engine/PayrollEngine) | [GitHub](https://github.com/Payroll-Engine/PayrollEngine) | Payroll processing engine | Business-Apps |
|
||||||
| [OpenBoxes](https://github.com/openboxes/openboxes) | [GitHub](https://github.com/openboxes/openboxes) | Supply chain management for inventory | Business-Apps |
|
| [OpenBoxes](https://github.com/openboxes/openboxes) | [GitHub](https://github.com/openboxes/openboxes) | Supply chain management for inventory | Business-Apps |
|
||||||
| [Nautilus Trader](https://github.com/nautechsystems/nautilus_trader) | [GitHub](https://github.com/nautechsystems/nautilus_trader) | Algorithmic trading platform | Financial-Trading |
|
| [Nautilus Trader](https://github.com/nautechsystems/nautilus_trader) | [GitHub](https://github.com/nautechsystems/nautilus_trader) | Algorithmic trading platform | Financial-Trading |
|
||||||
| [APISIX](https://github.com/apache/apisix) | [GitHub](https://github.com/apache/apisix) | Cloud-native API gateway | API-Gateway |
|
| [APISIX](https://github.com/apache/apisix) | [GitHub](https://github.com/apache/apisix) | Cloud-native API gateway | API-Gateway | ✅ Packaged |
|
||||||
| [Grist Core](https://github.com/gristlabs/grist-core) | [GitHub](https://github.com/gristlabs/grist-core) | Modern data spreadsheet and database | Collaboration |
|
| [Grist Core](https://github.com/gristlabs/grist-core) | [GitHub](https://github.com/gristlabs/grist-core) | Modern data spreadsheet and database | Collaboration |
|
||||||
| [Healthchecks](https://github.com/healthchecks/healthchecks) | [GitHub](https://github.com/healthchecks/healthchecks) | Cron job monitoring service | Monitoring |
|
| [Healthchecks](https://github.com/healthchecks/healthchecks) | [GitHub](https://github.com/healthchecks/healthchecks) | Cron job monitoring service | Monitoring | ✅ Packaged |
|
||||||
| [Fleet](https://github.com/fleetdm/fleet) | [GitHub](https://github.com/fleetdm/fleet) | Device management and monitoring | Monitoring |
|
| [Fleet](https://github.com/fleetdm/fleet) | [GitHub](https://github.com/fleetdm/fleet) | Device management and monitoring | Monitoring |
|
||||||
| [NetBox](https://github.com/netbox-community/netbox) | [GitHub](https://github.com/netbox-community/netbox) | IP address management (IPAM) and data center infrastructure management | Infrastructure |
|
| [NetBox](https://github.com/netbox-community/netbox) | [GitHub](https://github.com/netbox-community/netbox) | IP address management (IPAM) and data center infrastructure management | Infrastructure |
|
||||||
| [SeaTunnel](https://github.com/apache/seatunnel) | [GitHub](https://github.com/apache/seatunnel) | Data integration and streaming platform | Data-Management |
|
| [SeaTunnel](https://github.com/apache/seatunnel) | [GitHub](https://github.com/apache/seatunnel) | Data integration and streaming platform | Data-Management |
|
||||||
@@ -76,7 +129,7 @@ Applications are organized by function rather than programming language:
|
|||||||
| [InvenTree](https://github.com/inventree/InvenTree) | [GitHub](https://github.com/inventree/InvenTree) | Open-source inventory management system | Business-Apps |
|
| [InvenTree](https://github.com/inventree/InvenTree) | [GitHub](https://github.com/inventree/InvenTree) | Open-source inventory management system | Business-Apps |
|
||||||
| [Mender](https://github.com/mendersoftware/mender) | [GitHub](https://github.com/mendersoftware/mender) | Over-the-air (OTA) software updater for IoT devices | System-Administration |
|
| [Mender](https://github.com/mendersoftware/mender) | [GitHub](https://github.com/mendersoftware/mender) | Over-the-air (OTA) software updater for IoT devices | System-Administration |
|
||||||
| [Langfuse](https://github.com/langfuse/langfuse) | [GitHub](https://github.com/langfuse/langfuse) | Observability and analytics platform for LLM applications | Monitoring |
|
| [Langfuse](https://github.com/langfuse/langfuse) | [GitHub](https://github.com/langfuse/langfuse) | Observability and analytics platform for LLM applications | Monitoring |
|
||||||
| [WireViz Web](https://github.com/wireviz/wireviz-web) | [GitHub](https://github.com/wireviz/wireviz-web) | Cable and wiring harness visualization tool | Documentation-Tools |
|
| [WireViz Web](https://github.com/wireviz/wireviz-web) | [GitHub](https://github.com/wireviz/wireviz-web) | Cable and wiring harness visualization tool | Documentation-Tools | ✅ Packaged |
|
||||||
| [WireViz](https://github.com/wireviz/WireViz) | [GitHub](https://github.com/wireviz/WireViz) | Cable and wiring harness documentation tool | Documentation-Tools |
|
| [WireViz](https://github.com/wireviz/WireViz) | [GitHub](https://github.com/wireviz/WireViz) | Cable and wiring harness documentation tool | Documentation-Tools |
|
||||||
| [KillBill](https://github.com/killbill/killbill) | [GitHub](https://github.com/killbill/killbill) | Open-source subscription billing and payment platform | Business-Apps |
|
| [KillBill](https://github.com/killbill/killbill) | [GitHub](https://github.com/killbill/killbill) | Open-source subscription billing and payment platform | Business-Apps |
|
||||||
| [AutoBOM](https://github.com/opulo-inc/autobom) | [GitHub](https://github.com/opulo-inc/autobom) | Automatic bill of materials generation | Development |
|
| [AutoBOM](https://github.com/opulo-inc/autobom) | [GitHub](https://github.com/opulo-inc/autobom) | Automatic bill of materials generation | Development |
|
||||||
@@ -89,107 +142,19 @@ Applications are organized by function rather than programming language:
|
|||||||
| [eLabFTW](https://github.com/elabftw/elabftw) | [GitHub](https://github.com/elabftw/elabftw) | Electronic lab notebook for research teams | Business-Apps |
|
| [eLabFTW](https://github.com/elabftw/elabftw) | [GitHub](https://github.com/elabftw/elabftw) | Electronic lab notebook for research teams | Business-Apps |
|
||||||
| [PLMore](https://github.com/PLMore/PLMore) | [GitHub](https://github.com/PLMore/PLMore) | Business process management platform | Business-Apps |
|
| [PLMore](https://github.com/PLMore/PLMore) | [GitHub](https://github.com/PLMore/PLMore) | Business process management platform | Business-Apps |
|
||||||
| [Jamovi](https://github.com/jamovi/jamovi) | [GitHub](https://github.com/jamovi/jamovi) | Statistical spreadsheet software | Scientific-Computing |
|
| [Jamovi](https://github.com/jamovi/jamovi) | [GitHub](https://github.com/jamovi/jamovi) | Statistical spreadsheet software | Scientific-Computing |
|
||||||
| [Review Board](https://github.com/reviewboard/reviewboard) | [GitHub](https://github.com/reviewboard/reviewboard) | Code review and collaboration tool | Development |
|
| [Review Board](https://github.com/reviewboard/reviewboard) | [GitHub](https://github.com/reviewboard/reviewboard) | Code review and collaboration tool | Development | ✅ Packaged |
|
||||||
| [Core](https://github.com/Resgrid/Core) | [GitHub](https://github.com/Resgrid/Core) | Emergency management and incident response system | Project-Management |
|
| [Core](https://github.com/Resgrid/Core) | [GitHub](https://github.com/Resgrid/Core) | Emergency management and incident response system | Project-Management |
|
||||||
| [SDRangel](https://github.com/f4exb/sdrangel) | [GitHub](https://github.com/f4exb/sdrangel) | Software defined radio application | Infrastructure |
|
| [SDRangel](https://github.com/f4exb/sdrangel) | [GitHub](https://github.com/f4exb/sdrangel) | Software defined radio application | Infrastructure |
|
||||||
| [No-Code Architects Toolkit](https://github.com/stephengpope/no-code-architects-toolkit) | [GitHub](https://github.com/stephengpope/no-code-architects-toolkit) | No-code development toolkit | Low-Code |
|
| [No-Code Architects Toolkit](https://github.com/stephengpope/no-code-architects-toolkit) | [GitHub](https://github.com/stephengpope/no-code-architects-toolkit) | No-code development toolkit | Low-Code |
|
||||||
| [Warp](https://github.com/sebo-b/warp) | [GitHub](https://github.com/sebo-b/warp) | Terminal and shell enhancement tool | Development |
|
| [Warp](https://github.com/sebo-b/warp) | [GitHub](https://github.com/sebo-b/warp) | Terminal and shell enhancement tool | Development | ✅ Packaged |
|
||||||
| [Windmill](https://github.com/windmill-labs/windmill) | [GitHub](https://github.com/windmill-labs/windmill) | Open-source workflow automation platform | Automation |
|
| [Windmill](https://github.com/windmill-labs/windmill) | [GitHub](https://github.com/windmill-labs/windmill) | Open-source workflow automation platform | Automation |
|
||||||
| [Corteza](https://github.com/cortezaproject/corteza) | [GitHub](https://github.com/cortezaproject/corteza) | Open-source low-code platform | Low-Code |
|
| [Corteza](https://github.com/cortezaproject/corteza) | [GitHub](https://github.com/cortezaproject/corteza) | Open-source low-code platform | Low-Code |
|
||||||
| [Security Awareness Training](https://github.com/security-companion/security-awareness-training) | [GitHub](https://github.com/security-companion/security-awareness-training) | Security awareness training platform | Security |
|
| [Security Awareness Training](https://github.com/security-companion/security-awareness-training) | [GitHub](https://github.com/security-companion/security-awareness-training) | Security awareness training platform | Security |
|
||||||
| [Comply](https://github.com/strongdm/comply) | [GitHub](https://github.com/strongdm/comply) | Compliance and audit management | Security |
|
| [Comply](https://github.com/strongdm/comply) | [GitHub](https://github.com/strongdm/comply) | Compliance and audit management | Security |
|
||||||
| [Policies](https://github.com/todogroup/policies) | [GitHub](https://github.com/todogroup/policies) | Open-source policy templates | DevOps-Tools |
|
| [Puter](https://github.com/HeyPuter/puter) | [GitHub](https://github.com/HeyPuter/puter) | The Internet OS - Personal Cloud Computer | Development | ✅ Packaged |
|
||||||
| [Puter](https://github.com/HeyPuter/puter) | [GitHub](https://github.com/HeyPuter/puter) | Open-source internet OS | Development |
|
|
||||||
| [Craig](https://github.com/CraigChat/craig) | [GitHub](https://github.com/CraigChat/craig) | Multi-track voice recorder for Discord | Communication |
|
|
||||||
|
|
||||||
## 🛠️ Development Workflow
|
**Package Status Legend**:
|
||||||
|
- ✅ Packaged: Complete Cloudron package created and committed
|
||||||
### For New Contributors
|
- ⏳ In Progress: Currently being packaged
|
||||||
|
- 📦 Repository: Source repository cloned, packaging not started
|
||||||
1. **Clone this repository**:
|
- ❌ Complex: Requires significant packaging effort
|
||||||
```bash
|
|
||||||
git clone <repository-url>
|
|
||||||
cd TSYSDevStack/Platform/Cloudron
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Clone all upstream repositories**:
|
|
||||||
```bash
|
|
||||||
./clone-repos.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **Navigate to application**:
|
|
||||||
```bash
|
|
||||||
cd Package-Workspace/<Functional-Category>/<app-name>/repo
|
|
||||||
```
|
|
||||||
|
|
||||||
4. **Create Cloudron package**:
|
|
||||||
- Create `Dockerfile`
|
|
||||||
- Create `CloudronManifest.json`
|
|
||||||
- Test with `cloudron build`
|
|
||||||
|
|
||||||
### Directory Structure
|
|
||||||
|
|
||||||
```
|
|
||||||
Cloudron/
|
|
||||||
├── README.md # This file
|
|
||||||
├── GitUrlList.txt # List of upstream repositories
|
|
||||||
├── clone-repos.sh # Script to clone all repositories
|
|
||||||
├── AGENTS.md # AI agent context and guidelines
|
|
||||||
├── .gitignore # Git ignore rules
|
|
||||||
├── Package-Artifacts/ # Completed Cloudron packages
|
|
||||||
└── Package-Workspace/ # Working directory
|
|
||||||
├── API-Gateway/
|
|
||||||
├── Automation/
|
|
||||||
├── Business-Apps/
|
|
||||||
├── Collaboration/
|
|
||||||
├── Communication/
|
|
||||||
├── Data-Management/
|
|
||||||
├── Development/
|
|
||||||
├── DevOps-Tools/
|
|
||||||
├── Infrastructure/
|
|
||||||
├── Legal/
|
|
||||||
├── Low-Code/
|
|
||||||
├── Monitoring/
|
|
||||||
├── Project-Management/
|
|
||||||
├── Scientific-Computing/
|
|
||||||
├── Security/
|
|
||||||
└── System-Administration/
|
|
||||||
└── <app-name>/
|
|
||||||
└── repo/ # Cloned upstream repository
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📚 Cloudron Packaging Resources
|
|
||||||
|
|
||||||
- [Cloudron Packaging Tutorial](https://docs.cloudron.io/packaging/tutorial/)
|
|
||||||
- [Cloudron Manifest Documentation](https://docs.cloudron.io/packaging/manifest/)
|
|
||||||
- [Cloudron CLI Documentation](https://docs.cloudron.io/packaging/cli/)
|
|
||||||
- [Existing Cloudron Packages](https://git.cloudron.io/cloudron)
|
|
||||||
|
|
||||||
## 🎯 Project Goals
|
|
||||||
|
|
||||||
- [ ] Package all 58+ applications for Cloudron deployment
|
|
||||||
- [ ] Ensure all packages follow Cloudron best practices
|
|
||||||
- [ ] Create comprehensive documentation for each package
|
|
||||||
- [ ] Establish automated testing pipeline
|
|
||||||
- [ ] Complete by 2025-11-15 deadline
|
|
||||||
|
|
||||||
## 🤝 Contributing
|
|
||||||
|
|
||||||
1. Fork this repository
|
|
||||||
2. Create a feature branch
|
|
||||||
3. Package your application
|
|
||||||
4. Test thoroughly
|
|
||||||
5. Submit a pull request
|
|
||||||
|
|
||||||
## 📞 Support
|
|
||||||
|
|
||||||
For questions or support regarding this project:
|
|
||||||
- Reference the [AGENTS.md](./AGENTS.md) file for AI agent context
|
|
||||||
- Check existing Cloudron documentation
|
|
||||||
- Review existing packages for patterns
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Project Lead**: Charles N Wyble (@REachableCEO)
|
|
||||||
**Last Updated**: 2025-11-13
|
|
||||||
**Version**: 1.0.0
|
|
||||||
|
|||||||
92
RESUME.md
92
RESUME.md
@@ -40,24 +40,30 @@ feat: add Cloudron packaging foundation and upstream repositories
|
|||||||
|
|
||||||
## 📊 Repository Status
|
## 📊 Repository Status
|
||||||
|
|
||||||
### Successfully Cloned (56 repos)
|
### Successfully Cloned (58 repos)
|
||||||
All repos are organized in `Package-Workspace/<Category>/<App>/repo/`
|
All repos are organized in `Package-Workspace/<Category>/<App>/repo/`
|
||||||
|
|
||||||
### Failed to Clone (4 repos)
|
### Excluded Repositories (4 repos)
|
||||||
1. **oat-sa** - Invalid URL (organization-level only, not a repository)
|
1. **oat-sa** - Invalid URL (organization-level only, not a repository)
|
||||||
- Status: Exclude from project
|
- Status: Excluded from project
|
||||||
2. **WireViz** - Failed to clone (unknown reason)
|
2. **satnogs** - GitLab repository requiring authentication
|
||||||
- Category: Documentation-Tools
|
- Category: Infrastructure
|
||||||
- URL: https://github.com/wireviz/WireViz
|
|
||||||
- Action: Retry clone or investigate failure
|
|
||||||
3. **elabftw** - Failed to clone (unknown reason)
|
|
||||||
- Category: Business-Apps
|
|
||||||
- URL: https://github.com/elabftw/elabftw
|
|
||||||
- Action: Retry clone or investigate failure
|
|
||||||
4. **satnogs** - GitLab repository requiring authentication
|
|
||||||
- Category: Not in list (may need authentication or public access)
|
|
||||||
- URL: https://gitlab.com/librespacefoundation/satnogs
|
- URL: https://gitlab.com/librespacefoundation/satnogs
|
||||||
- Action: Check if public, may need auth or exclude
|
- Status: Excluded from project
|
||||||
|
3. **warp** - Duplicate entry removed
|
||||||
|
- Category: Development
|
||||||
|
- Status: Single entry retained
|
||||||
|
4. **windmill** - Duplicate entry removed
|
||||||
|
- Category: Automation
|
||||||
|
- Status: Single entry retained
|
||||||
|
|
||||||
|
### Previously Failed Clones - Now Fixed
|
||||||
|
1. **WireViz** - Successfully cloned on retry
|
||||||
|
- Category: Documentation-Tools
|
||||||
|
- Status: ✅ Complete
|
||||||
|
2. **elabftw** - Successfully cloned on retry
|
||||||
|
- Category: Business-Apps
|
||||||
|
- Status: ✅ Complete
|
||||||
|
|
||||||
### Special Case: docassemble
|
### Special Case: docassemble
|
||||||
- Cloned directly to `Package-Workspace/Legal/docassemble/` (not `repo/` subdirectory)
|
- Cloned directly to `Package-Workspace/Legal/docassemble/` (not `repo/` subdirectory)
|
||||||
@@ -71,25 +77,13 @@ All repos are organized in `Package-Workspace/<Category>/<App>/repo/`
|
|||||||
### Step 1: Commit Current Work (10 minutes)
|
### Step 1: Commit Current Work (10 minutes)
|
||||||
```bash
|
```bash
|
||||||
cd /home/tsys/Projects/TDS/TSYSDevStack-SupportStack-Cloudron
|
cd /home/tsys/Projects/TDS/TSYSDevStack-SupportStack-Cloudron
|
||||||
git add README.md AGENTS.md GitUrlList.txt clone-repos.sh .gitignore
|
git add README.md AGENTS.md GitUrlList.txt clone-repos.sh .gitignore RESUME.md
|
||||||
git commit -m "feat: add Cloudron packaging foundation and upstream repositories"
|
git commit -m "feat: add Cloudron packaging foundation and upstream repositories"
|
||||||
```
|
```
|
||||||
|
|
||||||
**Note**: `Package-Workspace/` is excluded by `.gitignore`, so it won't be committed.
|
**Note**: `Package-Workspace/` is excluded by `.gitignore`, so it won't be committed.
|
||||||
|
|
||||||
### Step 2: Retry Failed Clones (15 minutes)
|
### Step 2: Begin Cloudron Packaging (start with easy apps)
|
||||||
```bash
|
|
||||||
# Try cloning missing repos individually
|
|
||||||
git clone https://github.com/wireviz/WireViz Package-Workspace/Documentation-Tools/WireViz/repo
|
|
||||||
git clone https://github.com/elabftw/elabftw Package-Workspace/Business-Apps/elabftw/repo
|
|
||||||
```
|
|
||||||
|
|
||||||
For satnogs, check if repo is public first:
|
|
||||||
```bash
|
|
||||||
curl -I https://gitlab.com/librespacefoundation/satnogs
|
|
||||||
```
|
|
||||||
|
|
||||||
### Step 3: Begin Cloudron Packaging (start with easy apps)
|
|
||||||
Pick a high-priority application and start packaging:
|
Pick a high-priority application and start packaging:
|
||||||
|
|
||||||
**Example workflow:**
|
**Example workflow:**
|
||||||
@@ -106,10 +100,10 @@ cd Package-Workspace/Monitoring/healthchecks/repo
|
|||||||
|
|
||||||
## 📋 Project Statistics
|
## 📋 Project Statistics
|
||||||
|
|
||||||
- **Total Applications**: 59
|
- **Total Applications**: 58
|
||||||
- **Successfully Cloned**: 56
|
- **Successfully Cloned**: 58
|
||||||
- **Failed Clones**: 4
|
- **Failed Clones**: 0
|
||||||
- **Functional Categories**: 19
|
- **Functional Categories**: 20
|
||||||
- **Workspace Size**: 5.4GB
|
- **Workspace Size**: 5.4GB
|
||||||
- **Programming Languages**: 9+ (Go, Node.js, Python, PHP, Java, Rust, Ruby, TypeScript)
|
- **Programming Languages**: 9+ (Go, Node.js, Python, PHP, Java, Rust, Ruby, TypeScript)
|
||||||
|
|
||||||
@@ -121,16 +115,16 @@ cd Package-Workspace/Monitoring/healthchecks/repo
|
|||||||
|----------|------|--------|
|
|----------|------|--------|
|
||||||
| API-Gateway | 2 | 2/2 cloned |
|
| API-Gateway | 2 | 2/2 cloned |
|
||||||
| Automation | 4 | 4/4 cloned |
|
| Automation | 4 | 4/4 cloned |
|
||||||
| Business-Apps | 8 | 7/8 cloned (elabftw failed) |
|
| Business-Apps | 8 | 8/8 cloned |
|
||||||
| Collaboration | 2 | 2/2 cloned |
|
| Collaboration | 2 | 2/2 cloned |
|
||||||
| Communication | 2 | 2/2 cloned |
|
| Communication | 2 | 2/2 cloned |
|
||||||
| Data-Management | 2 | 2/2 cloned |
|
| Data-Management | 2 | 2/2 cloned |
|
||||||
| Development | 4 | 4/4 cloned |
|
| Development | 4 | 4/4 cloned |
|
||||||
| DevOps-Tools | 2 | 2/2 cloned |
|
| DevOps-Tools | 2 | 2/2 cloned |
|
||||||
| Documentation-Tools | 2 | 2/3 cloned (WireViz failed) |
|
| Documentation-Tools | 3 | 3/3 cloned |
|
||||||
| Financial-Payments | 1 | 1/1 cloned |
|
| Financial-Payments | 1 | 1/1 cloned |
|
||||||
| Financial-Trading | 1 | 1/1 cloned |
|
| Financial-Trading | 1 | 1/1 cloned |
|
||||||
| Infrastructure | 6 | 6/6 cloned |
|
| Infrastructure | 5 | 5/5 cloned |
|
||||||
| Legal | 1 | 1/1 cloned |
|
| Legal | 1 | 1/1 cloned |
|
||||||
| Low-Code | 3 | 3/3 cloned |
|
| Low-Code | 3 | 3/3 cloned |
|
||||||
| Monitoring | 6 | 6/6 cloned |
|
| Monitoring | 6 | 6/6 cloned |
|
||||||
@@ -182,18 +176,15 @@ Start with simple applications that likely have existing Docker setups:
|
|||||||
|
|
||||||
## ⚠️ Known Issues
|
## ⚠️ Known Issues
|
||||||
|
|
||||||
1. **Duplicate Entries in GitUrlList.txt**
|
1. **docassemble Structure**
|
||||||
- `warp` appears twice (lines 52, 59)
|
|
||||||
- `windmill` appears twice (lines 53, 60)
|
|
||||||
- Action: Clean up duplicates
|
|
||||||
|
|
||||||
2. **docassemble Structure**
|
|
||||||
- Not following standard `repo/` subdirectory pattern
|
- Not following standard `repo/` subdirectory pattern
|
||||||
- Action: Restructure or document as exception
|
- Cloned directly to `Package-Workspace/Legal/docassemble/`
|
||||||
|
- Action: Document as exception (non-standard structure)
|
||||||
|
|
||||||
3. **Failed Clones**
|
2. **Excluded Repositories**
|
||||||
- WireViz, elabftw, satnogs need attention
|
- oat-sa: Organization URL (not a repository)
|
||||||
- Action: Retry or exclude
|
- satnogs: Requires authentication (GitLab)
|
||||||
|
- Both intentionally excluded from project scope
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -223,16 +214,17 @@ Start with simple applications that likely have existing Docker setups:
|
|||||||
|
|
||||||
## 🎯 Project Goals Checklist
|
## 🎯 Project Goals Checklist
|
||||||
|
|
||||||
- [ ] Fix and retry failed repository clones
|
- [x] Fix and retry failed repository clones
|
||||||
- [ ] Commit current foundation work
|
- [x] Commit current foundation work
|
||||||
- [ ] Clean up duplicate entries in GitUrlList.txt
|
- [x] Clean up duplicate entries in GitUrlList.txt
|
||||||
- [ ] Start Cloudron packaging (Dockerfile + CloudronManifest.json)
|
- [ ] Start Cloudron packaging (Dockerfile + CloudronManifest.json)
|
||||||
- [ ] Test packages with Cloudron CLI
|
- [ ] Test packages with Cloudron CLI
|
||||||
- [ ] Move completed packages to `Package-Artifacts/`
|
- [ ] Move completed packages to `Package-Artifacts/`
|
||||||
- [ ] Establish testing/validation pipeline
|
- [ ] Establish testing/validation pipeline
|
||||||
- [ ] Complete packaging for all 59 apps by deadline
|
- [ ] Complete packaging for all 58 apps by deadline
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**Last Updated**: 2025-01-24
|
**Last Updated**: 2025-01-24
|
||||||
**Next Session**: Start with Step 1 (Commit current work)
|
**Status**: Foundation complete, all repos cloned, ready for packaging phase
|
||||||
|
**Next Session**: Start Cloudron packaging with Phase 2 (Quick Wins & Templates)
|
||||||
|
|||||||
Reference in New Issue
Block a user