133 Commits

Author SHA1 Message Date
Your Name 9c3605d935 Fix redirect loop by using dummy albums domain
Instead of trying to match the albums host with current host
(which always fails in path-based routing), use a dummy domain
'albums.localhost.invalid' that will never match the actual host.
This prevents the automatic redirect to /shared-albums.

Version bump to 0.3.2

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-21 20:56:27 -06:00
Your Name 77d0326a70 Fix redirect loop by setting NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT
The app was redirecting to /shared-albums because albumsAppOrigin()
returned the same host as the current URL after runtime replacement.
By setting NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT at build time to a
placeholder and replacing it at runtime with the full path-based URL,
the host comparison will fail and prevent the redirect loop.

Version bump to 0.3.1

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-21 20:29:46 -06:00
Your Name 1738af7f61 Improve URL replacement strategy for frontend assets
- Enhanced rewrite_frontend_reference function to handle multiple URL encoding formats
- Now replaces plain URLs, backslash-escaped URLs, and double-backslash-escaped URLs
- Added https://ente.io -> BASE_URL replacement
- Version bump to 0.3.0

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-21 19:58:39 -06:00
Your Name 37cd205a07 Fix Ente Cloudron packaging issues
- Fixed admin-helper.sh to use correct Museum binary path (/app/museum-bin/museum)
- Updated start.sh to handle missing S3 configuration gracefully
  - App now starts in configuration mode when S3 is not configured
  - Shows helpful configuration page instead of failing health checks
  - Properly starts Museum server once S3 is configured
- Updated CloudronManifest.json to version 0.2.2
- All web frontends (photos, accounts, auth, cast, albums, family) verified working
- Museum API server running successfully with S3 storage

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-21 19:20:15 -06:00
Your Name 61046f1d42 Auto-configure CLI endpoint 2025-09-30 09:34:25 -06:00
Your Name 7a5fac90ab Persist Museum configuration for manual edits 2025-09-29 22:36:37 -06:00
Your Name b38bd6a249 Make Ente CLI usable out of the box 2025-09-29 22:05:24 -06:00
Your Name a8b22a95c8 Bundle Ente CLI for Cloudron console 2025-09-29 21:37:33 -06:00
Your Name 93cdf1f2f1 Remove OTT log highlighter 2025-09-29 21:26:21 -06:00
Your Name 8d6fc6fde0 Document S3 examples and refresh template 2025-09-29 21:18:19 -06:00
Your Name b1e8df29e7 Allow runtime S3 configuration overrides 2025-09-29 20:59:57 -06:00
Your Name 176d23c086 Fix SPA asset routing for web apps 2025-09-29 20:47:07 -06:00
Andreas Dueren aba8af9bb4 Force rebuild: Update asset routing with version bump 2025-08-01 14:02:07 -06:00
Andreas Dueren 7fc40ce970 Bump version to 0.1.81 for asset routing fix 2025-08-01 13:56:09 -06:00
Andreas Dueren a0af6ec84c Fix static asset routing for all web apps
- Add specific _next asset routes for accounts, auth, cast apps
- Add image asset routes for each app
- Ensure each app's assets are served from correct directory
- Keep photos app routing unchanged

Should fix accounts/auth/cast apps loading issues.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-01 13:55:53 -06:00
Andreas Dueren f9171c6ca4 Resolve merge conflicts with updated version 0.1.79 2025-08-01 13:46:59 -06:00
Andreas Dueren 8fbf29fc45 Fix API endpoint configuration and domain references
- Change NEXT_PUBLIC_ENTE_ENDPOINT to relative /api for domain flexibility
- Remove runtime JS endpoint replacement (fragile, now unnecessary)
- Fix all domain references to use CLOUDRON_APP_DOMAIN consistently
- Add /ping health check endpoint to Caddy configuration
- Update placeholder server to use dynamic domain

Photos app now working, other apps may need additional fixes.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-01 13:46:17 -06:00
Your Name e95ad5c25f Fix web app endpoint configuration
- Use relative /api endpoint in Dockerfile build
- Remove complex runtime replacement logic
- Simplify start.sh to avoid read-only filesystem issues
- Restore working Caddy configuration

Version 0.1.78 ready for deployment
2025-07-26 20:28:15 -06:00
Your Name d964d7d264 Remove large ente-source directory to fix build uploads
🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-25 19:47:47 -06:00
Your Name 06e0f5075e Implement comprehensive web app API endpoint fix
- Patch origins.ts during Docker build to use window.location.origin + '/api'
- Update version to 0.1.69 to force rebuild
- Add browser compatibility check for server-side rendering
- Fix both API and uploader endpoint redirections

This addresses the root cause where web apps were hardcoded to use
https://api.ente.io instead of the local Museum server.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-25 19:27:11 -06:00
Your Name c7b9ab18bb Fix static asset routing and path handling for auth/accounts/cast apps
- Fixed Next.js static asset (_next/*) routing for each app separately
- Updated app path handling to work with both /app and /app/* patterns
- Resolved 404 errors for static assets from auth, accounts, and cast apps
- Updated to version 0.1.66
2025-07-25 11:12:27 -06:00
Your Name b7fcf5c01d Add comprehensive API documentation to Cloudron setup instructions
- Added detailed API endpoint information in SETUP-INSTRUCTIONS.md
- Documented API usage with Ente CLI
- Enhanced routing configuration for auth/cast/accounts apps
- Updated to version 0.1.64
2025-07-25 11:02:06 -06:00
Your Name da50bf4773 Add OTP email monitor to handle Museum skipped emails
- Implement comprehensive OTP email monitoring service
- Monitor Museum logs for "Skipping sending email" pattern
- Send verification emails using Cloudron email addon
- Add specific regex pattern for Museum's skip email format
- Version bump to 0.1.62

The monitor captures OTP codes from logs when Museum skips sending
emails and sends them via Cloudron's email system. This ensures
users receive their verification codes even when Museum's email
configuration is not sending directly.
2025-07-22 12:27:44 -06:00
Your Name 4290a33ba9 Fix JavaScript URL construction error for API endpoint
- Change NEXT_PUBLIC_ENTE_ENDPOINT from "/api" to "https://example.com/api" during build to satisfy URL constructor requirements
- Add runtime replacement in start.sh to replace placeholder with actual domain endpoint
- This resolves the "TypeError: Failed to construct 'URL': Invalid URL" error in the frontend

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-22 08:58:53 -06:00
Your Name 62b6f7f9ac Fix S3 configuration - set are_local_buckets to true
- Changed are_local_buckets from false to true (required for external S3)
- Simplified S3 configuration to only use b2-eu-cen bucket
- Removed unnecessary replication buckets for single bucket setup

This aligns with Ente's documentation where are_local_buckets=true
is used for external S3 services like Wasabi.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-21 20:44:19 -06:00
Your Name e3eb1b0491 Hardcode Wasabi S3 configuration with proper Ente format
- Remove dynamic S3 configuration loading
- Hardcode Wasabi credentials as requested
- Use proper Ente S3 configuration format with datacenter names
- Configure all three storage buckets (b2-eu-cen, wasabi-eu-central-2-v3, scw-eu-fr-v3)
- Set are_local_buckets to false for external S3
- Add compliance flag for Wasabi bucket

This should fix the MissingRegion error by properly configuring S3 storage
according to Ente's expected format.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-21 20:41:58 -06:00
Your Name fc82e988e9 Update CloudronManifest version to 1.0.1
Increment version after multiple iterations of S3 configuration fixes and port conflict resolution.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-21 20:37:07 -06:00
Your Name 5068e12025 Fix port conflict between Museum server and Caddy
- Changed Museum server to run on port 8080 instead of 3080
- Updated all health check URLs to use port 8080
- Updated Caddy reverse proxy to forward API requests to port 8080
- Added clarifying comment about port usage

This resolves the circular reference where both Caddy and Museum were trying to use port 3080.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-21 17:18:51 -06:00
Andreas Düren 4ff99bee64 Complete rewrite of Ente Cloudron app with cleaner architecture 2025-03-20 17:52:23 +01:00
Andreas Düren fd028ca591 Fix syntax error in validate_binary function 2025-03-20 17:38:20 +01:00
Andreas Düren fd60e4425b Fix Museum binary validation and add Node.js fallback server 2025-03-20 17:29:12 +01:00
Andreas Düren 2d68e44208 Remove Node.js placeholder server completely and use actual Museum server 2025-03-20 17:14:12 +01:00
Andreas Düren fdbb6d9a7a Enhance Node.js placeholder server with more API endpoints and improve user experience 2025-03-20 17:07:47 +01:00
Andreas Düren fc7135d483 Fix Museum server binary issues using Docker approach 2025-03-20 16:35:30 +01:00
Andreas Düren e95fd0a705 Fix Museum server binary issues and add Node.js fallback 2025-03-20 16:19:31 +01:00
Andreas Düren f27720d544 Replace Node.js placeholder with actual Museum server 2025-03-20 16:10:30 +01:00
Andreas Düren 950481b6c7 Fix infinite loop and implement reliable Node.js placeholder server 2025-03-20 16:03:16 +01:00
Andreas Düren 4d66067d20 Fix infinite loop and implement reliable Node.js placeholder server 2025-03-20 15:59:51 +01:00
Andreas Düren 4081e89fdd Fix Go build environment and frontend URLs 2025-03-20 15:52:35 +01:00
Andreas Düren d69ab22967 Fix GitHub download URLs and implement placeholder server on port 3080 2025-03-20 15:41:24 +01:00
Andreas Düren 2424a5ffc1 Fix GitHub download issues and provide fallback servers 2025-03-20 15:37:05 +01:00
Andreas Düren 6fd3bde19a Fix GitHub credentials issue, support s3.env, and ensure Caddy properly starts on port 3080 2025-03-20 15:33:49 +01:00
Andreas Düren 144f2b78d1 Add extensive debugging and more resilient startup 2025-03-20 15:29:43 +01:00
Andreas Düren d828bf3b8e Remove mock server components and install real Ente server 2025-03-20 15:12:30 +01:00
Andreas Düren 3c8309dffd Fix directory creation for static assets and web app files 2025-03-20 14:48:06 +01:00
Andreas Düren 7f7ae4e8bf Implement comprehensive SRP Buffer polyfill to fix verification errors 2025-03-20 14:40:50 +01:00
Andreas Düren 6289577898 Implement Caddy for web app serving and fix OTP verification issues 2025-03-20 14:32:26 +01:00
Andreas Düren 8df2a3a621 Add browser compatibility fixes for URL constructor and Node.js functions 2025-03-20 14:18:30 +01:00
Andreas Düren 192070ffae Fix URL construction error and update verification endpoint with proper schema 2025-03-20 13:54:41 +01:00
Andreas Düren e69166fc91 Replace Go mock server with Node.js implementation for better reliability 2025-03-20 13:45:58 +01:00
Andreas Düren f32919d436 Completely refactored startup script for proper museum server integration 2025-03-20 13:36:52 +01:00
Andreas Düren d345b2f460 Fix API server and URL handling for frontend connectivity 2025-03-20 13:22:13 +01:00
Andreas Düren f4fd4fdf77 Fix mock API server initialization and unbound variable issues 2025-03-20 13:04:11 +01:00
Andreas Düren defe47f78d Fix here-document syntax issues in runtime config generation and Go module setup for mock API server 2025-03-20 12:49:06 +01:00
Andreas Düren 5dbbb094b4 Fix here-document syntax error in runtime config generation and Go module initialization 2025-03-20 12:34:05 +01:00
Andreas Düren 50a19a7908 Fix Go module structure for mock servers to resolve build issues 2025-03-18 21:52:41 +01:00
Andreas Düren c00be35fc7 Fix mock API server startup issues on port 8080 2025-03-18 21:39:20 +01:00
Andreas Düren b223843bcd Fix mock server startup to ensure it starts properly and binds to the correct ports 2025-03-18 21:23:24 +01:00
Andreas Düren d32c366683 Fix verification parsing and make code validation more forgiving for testing 2025-03-18 20:54:41 +01:00
Andreas Düren f545b8d797 Fix URL construction error by ensuring proper URL formats with protocol prefixes 2025-03-18 20:47:23 +01:00
Andreas Düren 1244467afa Fix syntax errors in mock servers and use HEREDOC with quoted delimiter to prevent shell interpretation issues 2025-03-18 20:42:29 +01:00
Andreas Düren 17839a17df Fix syntax errors in mock API server Go code 2025-03-18 20:36:54 +01:00
Andreas Düren aefea17f2f Replace hardcoded API URLs with dynamic CLOUDRON_APP_ORIGIN variable 2025-03-18 20:29:45 +01:00
Andreas Düren 4811e0986e Update OTT handler to include required ID field in response 2025-03-18 20:28:45 +01:00
Andreas Düren 9709ebe265 Fixed signup verification code by adding a handler for /users/ott endpoint 2025-03-18 20:22:14 +01:00
Andreas Düren 71db4afae1 Fixed empty HTML issue by copying and modifying the original HTML files 2025-03-18 20:16:12 +01:00
Andreas Düren bdcf96150f Fixed Caddy filter directive and Go import issues 2025-03-18 20:12:30 +01:00
Andreas Düren 43cb685842 Fixed read-only filesystem issues by using Caddy's filter directives and improved mock servers 2025-03-18 20:08:15 +01:00
Andreas Düren ded9e1d174 Added registration code display in logs 2025-03-18 20:04:02 +01:00
Andreas Düren e093bfc571 Fixed frontend URL error by injecting config.js and runtime-config.js before Caddy starts 2025-03-18 20:03:16 +01:00
Andreas Düren e329b54b8b Fixed Caddy config and Go module import issues 2025-03-18 19:58:49 +01:00
Andreas Düren 20c0f80de0 Fixed Caddy config and file permissions issues 2025-03-18 19:55:11 +01:00
Andreas Düren 2fac328b3c Added MIME type configuration for Next.js assets in Caddy 2025-03-18 19:51:36 +01:00
Andreas Düren b2767897b2 Fixed mock servers by removing module flags and binding to all network interfaces 2025-03-18 19:43:42 +01:00
Andreas Düren 74331a7fe9 Fixed mock servers by removing module dependencies 2025-03-18 19:37:57 +01:00
Andreas Düren 98431a35dc Implemented mock servers instead of trying to run Ente 2025-03-18 19:32:47 +01:00
Andreas Düren 98ccff7af9 Fixed directory permissions and Go module handling 2025-03-18 19:26:22 +01:00
Andreas Düren 546fe4fe5d Fixed Go compiler errors and Caddy header syntax 2025-03-18 19:20:49 +01:00
Andreas Düren 428b7f0ea3 Fixed creation of db_override.go in writable location 2025-03-18 19:15:11 +01:00
Andreas Düren 4819bda8ad Fixed Caddy header syntax and moved db_override.go creation before server startup 2025-03-18 19:10:13 +01:00
Andreas Düren 783ad628b3 Fixed shell script syntax errors and created missing db_override.go file 2025-03-18 18:56:10 +01:00
Andreas Düren a73d2b4959 Fixed filesystem access issues and network binding for dual-instance Ente setup 2025-03-18 18:48:26 +01:00
Andreas Düren 42c1374606 Add Caddy webserver implementation 2025-03-17 00:13:38 +01:00
Andreas Düren 6546f26d52 Remove web server references from Dockerfile 2025-03-16 23:53:07 +01:00
Andreas Düren 9640e0d785 Remove NGINX webserver implementation 2025-03-16 23:51:27 +01:00
Andreas Düren 1568175962 Fix NGINX config and aggressively patch database connection to prevent localhost 2025-03-16 23:47:43 +01:00
Andreas Düren 1358aefb60 Fix database connection issues by using standard PostgreSQL environment variables 2025-03-16 23:39:14 +01:00
Andreas Düren 5c76451474 Fix NGINX read-only filesystem and database connection issues 2025-03-16 23:33:59 +01:00
Andreas Düren 23c9581f7b Switch from Caddy to NGINX and fix URL construction error 2025-03-16 23:29:27 +01:00
Andreas Düren 64b7570cc6 Fix unbound variable error by moving environment variable definitions earlier in the script 2025-03-16 23:24:56 +01:00
Andreas Düren 6f6741dfb5 Fix database connection issues and serve photos app at root domain 2025-03-16 23:23:32 +01:00
Andreas Düren 31def9585a Fix cd command errors and ensure Caddy binds to all interfaces for healthchecks 2025-03-16 23:19:52 +01:00
Andreas Düren 042c156960 Fix Go cache permission issues and ensure proper working directories 2025-03-16 23:17:47 +01:00
Andreas Düren 92f5c76955 Fix go.mod setup and improve mock server for better API compatibility 2025-03-16 23:14:36 +01:00
Andreas Düren 956d39fca5 Complete rewrite of Ente Cloudron app startup script with proper SERVER_DIR detection 2025-03-16 23:11:53 +01:00
Andreas Düren 1c34047f75 Fix Caddy port configuration and improve connectivity testing 2025-03-16 23:05:14 +01:00
Andreas Düren 12b486ace3 Add robust configuration injection and debugging tools 2025-03-16 22:58:06 +01:00
Andreas Düren 38f08c135e Fix Caddyfile syntax for respond directive 2025-03-16 22:50:25 +01:00
Andreas Düren 549b91ff22 Remove hardcoded S3 credentials and simplify S3 configuration 2025-03-16 22:40:14 +01:00
Andreas Düren 6c1903b5a4 Simplify Caddyfile configuration to fix syntax error 2025-03-16 22:32:18 +01:00
Andreas Düren ece40fe707 Fix Caddyfile syntax error in rewrite_early directive 2025-03-16 22:21:03 +01:00
Andreas Düren 4baeaed265 Merge remote changes with local updates 2025-03-16 22:18:41 +01:00
Andreas Düren 65e88f4408 Update Cloudron app configuration and setup 2025-03-16 22:17:41 +01:00
Andreas Düren 05a0b42b8e Remove docs folder from repository 2025-03-16 22:16:53 +01:00
andreas ead577dfcc Update Readme 2025-03-16 20:36:42 +00:00
Andreas Düren 8b28d7eb39 Fix permission issues with go.mod by using a writable copy 2025-03-14 23:41:56 +01:00
Andreas Düren 5f1cf21ebb Update Go version to 1.24.1 to satisfy dependency requirements 2025-03-14 23:37:34 +01:00
Andreas Düren aaf0dc0ca3 Fix Go version compatibility issues and prevent automatic toolchain downloads 2025-03-14 23:35:14 +01:00
Andreas Düren 6050c4564a Fix Go version compatibility by using auto toolchain 2025-03-14 23:08:40 +01:00
Andreas Düren 1f7de4085d Fix Go version compatibility by explicitly using Go 1.22.2 2025-03-14 23:07:06 +01:00
Andreas Düren cf7865b5d1 Fix Go version compatibility by using local toolchain 2025-03-14 23:05:23 +01:00
Andreas Düren 4b7fb0fd9c Fix Go compatibility and mock server issues 2025-03-14 23:03:47 +01:00
Andreas Düren 192ebd0b5d Fix Go compatibility for read-only filesystem 2025-03-14 23:00:26 +01:00
Andreas Düren d775c2fb66 Fix Go version compatibility issues in start.sh 2025-03-14 22:57:54 +01:00
Andreas Düren d8a40880d8 Improve start.sh with Cloudron best practices 2025-03-14 22:47:27 +01:00
Andreas Düren 789d7028b9 Fix read-only filesystem issue with museum.yaml 2025-03-14 22:44:40 +01:00
Andreas Düren f9c17035f7 Fix user creation issues and add debugging 2025-03-14 22:29:21 +01:00
Andreas Düren 3558003bf1 Fix GOPATH permissions and properly generate random secrets 2025-03-14 22:24:26 +01:00
Andreas Düren c2a2fab3b0 Simplify NGINX configuration with correct directive placement 2025-03-14 22:16:39 +01:00
Andreas Düren a8f2d13234 Fix NGINX configuration to use writable temp directories 2025-03-14 22:10:30 +01:00
Andreas Düren acadfc5af4 Fix NGINX configuration to use writable directories 2025-03-14 22:07:22 +01:00
Andreas Düren 47cfcfaf24 Make scripts more robust to handle various repository structures 2025-03-14 21:59:22 +01:00
Andreas Düren 08fbcacb5c Update to include both Museum server and web apps in single package 2025-03-14 21:45:09 +01:00
Andreas Düren cf41205607 Update config template for Museum server 2025-03-14 21:43:17 +01:00
Andreas Düren dddefb0f50 Update Dockerfile to include Go and dependencies for Museum server 2025-03-14 21:42:45 +01:00
Andreas Düren 1d30b3d943 Update start.sh to handle Museum Go server component 2025-03-14 21:42:26 +01:00
Andreas Düren fb0d4fd34f Enhance start.sh with improved server directory detection and debugging 2025-03-14 21:35:37 +01:00
Andreas Düren 1fc7bcac62 Finalize Dockerfile 2025-03-14 21:31:41 +01:00
Andreas Düren 528a6eed66 Update start.sh to handle different repository structures 2025-03-14 21:30:04 +01:00
Andreas Düren d11f21f13f Update Dockerfile to examine ente repository structure 2025-03-14 21:27:55 +01:00
Andreas Düren d113138975 Add logo.png for Cloudron app 2025-03-14 21:20:52 +01:00
Andreas Düren 018f455ce8 Optimize build: remove embedded repositories from source and clone during Docker build 2025-03-14 21:03:47 +01:00
Andreas Düren c2faaf16fb Initial commit for Ente Cloudron package 2025-03-14 21:01:18 +01:00
11 changed files with 230 additions and 1902 deletions
+56 -24
View File
@@ -1,34 +1,66 @@
# Ente Cloudron Quick Guide # Ente Cloudron App Build & Deployment Guide
## Prerequisites
- Cloudron CLI (`npm install -g cloudron`) configured for your server
- Docker (for local test builds, optional when using the Cloudron build service)
- Access to this repository (`andreasdueren/ente-cloudron`)
- Cloudron build-service token: `e3265de06b1d0e7bb38400539012a8433a74c2c96a17955e`
## Build ## Build
```bash 1. Clone the repository (if needed):
git clone https://github.com/andreasdueren/ente-cloudron.git ```bash
cd ente-cloudron git clone https://github.com/andreasdueren/ente-cloudron.git
cd ente-cloudron
```
2. Build the image via the Cloudron build service. Adjust `--tag` to match `CloudronManifest.json` (`0.2.1`) and optionally override the Ente git ref:
```bash
cloudron build \
--set-build-service builder.docker.due.ren \
--build-service-token e3265de06b1d0e7bb38400539012a8433a74c2c96a17955e \
--set-repository andreasdueren/ente-cloudron \
--tag 0.2.1 \
--build-arg ENTE_GIT_REF=main
```
Use a tagged Ente release for reproducible builds (e.g. `--build-arg ENTE_GIT_REF=v0.9.0`).
cloudron build \ ## Install / Reinstall
--set-build-service builder.docker.due.ren \ Always uninstall the dev instance before reinstalling.
--build-service-token e3265de06b1d0e7bb38400539012a8433a74c2c96a17955e \
--set-repository andreasdueren/ente-cloudron \
--tag 0.5.3
```
## Install
```bash ```bash
cloudron install \ cloudron install \
--location ente.due.ren \ --location ente.due.ren \
--image andreasdueren/ente-cloudron:0.5.3 --image andreasdueren/ente-cloudron:0.2.1
``` ```
If the install command runs for more than ~30seconds without feedback, abort and inspect `cloudron logs --app ente.due.ren`.
## After Install ## Smoke Tests
1. **S3** In Cloudron File Manager open `/app/data/config/s3.env`, fill in your endpoint/region/bucket/access/secret, then restart the app from the dashboard. Optional replication: add both `S3_SECONDARY_*` (second hot bucket) **and** `S3_COLD_*` (cold bucket) variables to mirror uploads across three independent buckets. Replication is only enabled when all three buckets are present. See Entes [object storage guide](https://ente.io/help/self-hosting/administration/object-storage) for example configs. 1. Open `https://ente.due.ren/health` and ensure it returns `status: OK`.
2. **Secondary hostnames** During installation Cloudron now prompts for hostnames for the Accounts/Auth/Cast/Albums/Family web apps (powered by `httpPorts`). Ensure matching DNS records exist that point to the primary app domain. If you use Cloudron-managed DNS, those records are created automatically; otherwise create CNAME/A records such as `accounts.<app-domain> → <app-domain>`. 2. Navigate to `/photos`, `/accounts`, `/auth`, `/cast`, `/albums`, `/family` to confirm static assets load.
3. Tail logs while signing up a user to verify Museum output:
```bash
cloudron logs --app ente.due.ren -f
```
Once DNS propagates, use the dedicated hosts (defaults shown below — substitute the names you selected during install): ## Required Configuration
- `https://<app-host>` (the hostname you chose during install, main UI & uploads) Populate `/app/data/config/s3.env` with valid S3 credentials and restart the app.
- `https://accounts.<app-domain>` ```bash
- `https://auth.<app-domain>` S3_ENDPOINT=https://<account>.r2.cloudflarestorage.com
- `https://cast.<app-domain>` S3_REGION=auto
- `https://albums.<app-domain>` S3_BUCKET=ente-due-ren
- `https://family.<app-domain>` S3_ACCESS_KEY=XXXXXXXX
S3_SECRET_KEY=YYYYYYYY
S3_PREFIX=optional/path
```
Optional: set `CLOUDRON_OIDC_IDENTIFIER`, `CLOUDRON_OIDC_CLIENT_ID`, and `CLOUDRON_OIDC_CLIENT_SECRET` in the Cloudron UI to enable SSO in the generated Museum configuration.
Check `cloudron logs --app ente.due.ren -f` or `/app/data/logs/startup.log` if anything looks off. ## Troubleshooting
- **S3 errors**: Verify credentials in `/app/data/config/s3.env`; check connectivity using `aws s3 ls --endpoint-url ...` from a trusted host.
- **Museum not starting**: Inspect `/app/data/museum/configurations/local.yaml` for syntax issues; delete to regenerate.
- **Frontend stale after update**: Restart the app—the startup script re-syncs static assets on each boot.
- **OIDC issues**: Confirm the callback URL `/api/v1/session/callback` is allowed in the Cloudron SSO client configuration.
## Useful Commands
```bash
cloudron exec --app ente.due.ren -- cat /app/data/museum/configurations/local.yaml
cloudron exec --app ente.due.ren -- ente --help
cloudron logs --app ente.due.ren -f
```
+1 -112
View File
@@ -1,120 +1,9 @@
# Changelog # Changelog
## 0.6.0 (2025-06-29)
* Fresh build with latest Ente upstream sources (main branch)
* Rebuild all web frontends and Museum binary against current codebase
## 0.5.7 (2025-11-20)
* Bundle the Ente Families web app so `family.<domain>` serves the correct invite/management UI instead of the placeholder photos build.
* Ship built-in billing plan JSON so Museum can resolve subscriptions (`family/add-member`, invite acceptance) on self-hosted installs without manual DB edits.
* Fix passkey enrollment on the accounts host by ensuring only the photos domain matches the `/api` proxy block.
## 0.5.6 (2025-11-18)
* Allow the accounts frontend origin in Museums `webauthn.rporigins` when subdomain routing is enabled so passkey enrollment via the desktop flow succeeds
* Document the Ente desktop scheme (`ente://app`) in the recommended S3 CORS rules to keep signed URL fetches working for the desktop client
* Add full three-bucket replication support (hot primary, hot secondary, cold tier) and test the workflow with Backblaze (primary hot), Hetzner (secondary hot), and Scaleway Glacier (cold)
* Note that the cold bucket must accept the GLACIER storage class—point the `S3_COLD_*` variables at a provider that supports it, or enable `are_local_buckets`/`use_path_style_urls` so the start script switches Museum into local-bucket mode and skips the Glacier storage class entirely
## 0.5.5 (2025-11-18)
* Validate S3 data-center identifiers so replication only uses the canonical `b2-eu-cen`/`wasabi-eu-central-2-v3`/`scw-eu-fr-v3` keys and update the docs to reflect the upstream requirements
* Inject the API origin into all served HTML so the Next.js bundles (including `accounts/passkeys`) read the self-hosted endpoint instead of defaulting to `https://api.ente.io`
* Document the working Backblaze B2 CORS JSON that whitelists the wildcard origin + upload operations for desktop casts
## 0.5.4 (2025-11-18)
* Respect user-defined S3 data-center identifiers so replication targets use the intended buckets
## 0.5.1 (2025-11-05)
* Fix `httpPorts` host detection so accounts/cast/family/albums subdomains serve their static frontends again
## 0.5.2 (2025-11-05)
* Allow httpPort hostnames like `cast.ente`/`accounts.ente` so Cloudron can append the primary domain (`.due.ren`) automatically
## 0.5.3 (2025-11-05)
* Fix regression that could produce duplicated suffixes (e.g. `cast.due.due.ren`) when httpPort hostnames already included the full domain
## 0.5.0 (2025-11-04)
* Proxy Museum GET/HEAD routes (e.g. `/collections`, `/files`, `/remote-store`) so clients that talk to the primary host without `/api` still hit the backend
## 0.4.13 (2025-11-04)
* Forward all non-GET requests to the Museum backend so uploads and other write operations reach the API
## 0.4.12 (2025-11-04)
* Ensure dedicated hosts serve static `.html` exports and SPA fallbacks (`/gallery`, etc.) without 404s
## 0.4.11 (2025-11-04)
* Serve static `.html` exports for all dedicated hosts so routes like `/gallery` refresh and upload flows work again
## 0.4.10 (2025-11-04)
* Fix SPA fallbacks on dedicated hosts so `/gallery` and other client routes refresh correctly
## 0.4.9 (2025-11-04)
* Raise default memory allocation to 3 GiB for smoother media processing workloads
## 0.4.8 (2025-11-04)
* Allow persistent Museum overrides via `/app/data/config/museum.override.yaml` while keeping generated defaults intact
## 0.4.7 (2025-11-04)
* Proxy `/users` API endpoints through Caddy so mobile SRP/OTT flows reach the backend
## 0.4.6 (2025-11-04)
* Switch to Cloudron `httpPorts` so secondary web apps get provisioned domains automatically
* Teach the startup script to honour Cloudron-provided secondary domain variables (no manual aliasing required)
* Refresh post-install docs and build instructions to reflect the new installation flow
## 0.4.5 (2025-10-30)
* Serve photos UI on the primary hostname and mount other apps on `accounts/auth/cast/albums/family.<app-domain>`
* Enable multiDomain in the manifest so aliases can be set in Cloudron UI
* Simplified documentation for S3 setup and alias domains
* Fix CORS responses for auth subdomains and forward real client IPs from Cloudron proxy
* Remove unsupported Caddy `trusted_proxies` stanza while continuing to trust Cloudron-provided `X-Forwarded-For` headers for accurate logging
* Set CORS headers via reverse proxy response rewrites so cross-subdomain logins work reliably
## 0.4.4 (2025-10-30)
* Restore Cloudflare R2 path-style URLs and simplify to a single hot-storage data center
* Serve the frontend apps on dedicated subdomains (photos/accounts/auth/cast/albums/family)
* Startup script now regenerates Caddy and Museum configs for the new host layout
* Added post-install checklist entries and updated docs for required DNS records
## 0.4.3 (2025-10-29)
* Always regenerate Museum configuration on startup to pick up S3 credential changes
* Enables seamless workflow: add S3 credentials to /app/data/config/s3.env and restart
* Fixes issue where S3 configuration changes required manual intervention
## 0.4.2 (2025-10-29)
* Use SMTPS (port 2465) with TLS encryption for email delivery
* Fixes email sending with requiresValidCertificate flag on Cloudron 9
## 0.4.1 (2025-10-23)
* Fix email sending for user registration by enabling TLS certificate validation in sendmail addon
* Add requiresValidCertificate flag to sendmail configuration to ensure proper SMTP authentication with Go applications
* Note: Requires Cloudron 9 or later for requiresValidCertificate support
## 1.0.0 (2024-06-01) ## 1.0.0 (2024-06-01)
* Initial release of Ente for Cloudron * Initial release of Ente for Cloudron
* Integrates with PostgreSQL database * Integrates with PostgreSQL database
* Integrates with S3-compatible object storage * Integrates with S3-compatible object storage
* Integrates with Cloudron mail system * Integrates with Cloudron mail system
* Provides web UI for photos and authentication * Provides web UI for photos and authentication
+3 -62
View File
@@ -7,76 +7,17 @@
"contactEmail": "contact@ente.io", "contactEmail": "contact@ente.io",
"website": "https://ente.io", "website": "https://ente.io",
"tagline": "Open source, end-to-end encrypted photo backup", "tagline": "Open source, end-to-end encrypted photo backup",
"version": "0.6.0", "version": "0.3.2",
"upstreamVersion": "git-main", "upstreamVersion": "git-main",
"healthCheckPath": "/health", "healthCheckPath": "/health",
"httpPort": 3080, "httpPort": 3080,
"httpPorts": { "memoryLimit": 1610612736,
"ACCOUNTS_DOMAIN": {
"title": "Accounts hostname",
"description": "Hostname for the Ente accounts web app (e.g. accounts)",
"containerPort": 3080,
"defaultValue": "accounts",
"aliasableDomain": true
},
"AUTH_DOMAIN": {
"title": "Auth hostname",
"description": "Hostname for the Ente authentication frontend (e.g. auth)",
"containerPort": 3080,
"defaultValue": "auth",
"aliasableDomain": true
},
"CAST_DOMAIN": {
"title": "Cast hostname",
"description": "Hostname for the Ente casting web app (e.g. cast)",
"containerPort": 3080,
"defaultValue": "cast",
"aliasableDomain": true
},
"ALBUMS_DOMAIN": {
"title": "Public albums hostname",
"description": "Hostname for the Ente public albums frontend (e.g. albums)",
"containerPort": 3080,
"defaultValue": "albums",
"aliasableDomain": true
},
"SHARE_DOMAIN": {
"title": "Public locker hostname",
"description": "Hostname for the Ente share/collaboration frontend (e.g. share)",
"containerPort": 3080,
"defaultValue": "share",
"aliasableDomain": true
},
"EMBED_DOMAIN": {
"title": "Embed hostname",
"description": "Hostname for the Ente embed frontend (e.g. embed)",
"containerPort": 3080,
"defaultValue": "embed",
"aliasableDomain": true
},
"PAYMENTS_DOMAIN": {
"title": "Payments hostname",
"description": "Hostname for the Ente payments frontend (e.g. payments)",
"containerPort": 3080,
"defaultValue": "payments",
"aliasableDomain": true
},
"FAMILY_DOMAIN": {
"title": "Family hostname",
"description": "Hostname for the Ente family web app (e.g. family)",
"containerPort": 3080,
"defaultValue": "family",
"aliasableDomain": true
}
},
"memoryLimit": 3221225472,
"postInstallMessage": "file://POSTINSTALL.md", "postInstallMessage": "file://POSTINSTALL.md",
"addons": { "addons": {
"localstorage": {}, "localstorage": {},
"postgresql": {}, "postgresql": {},
"sendmail": { "sendmail": {
"supportsDisplayName": true, "supportsDisplayName": true
"requiresValidCertificate": true
} }
}, },
"checklist": { "checklist": {
+9 -56
View File
@@ -1,28 +1,12 @@
# syntax=docker/dockerfile:1 # syntax=docker/dockerfile:1
ARG ENTE_GIT_REF=main ARG ENTE_GIT_REF=main
ARG FAMILIES_GIT_REF=main
FROM debian:bookworm AS ente-source FROM debian:bookworm AS ente-source
ARG ENTE_GIT_REF ARG ENTE_GIT_REF
COPY patches /patches
RUN set -e; \
apt-get update && \
apt-get install -y --no-install-recommends ca-certificates git patch && \
git clone --depth=1 --branch "${ENTE_GIT_REF}" https://github.com/ente-io/ente.git /src && \
if [ -d /patches ]; then \
for patch_file in /patches/*.patch; do \
[ -f "$patch_file" ] || continue; \
(cd /src && patch -p1 < "$patch_file"); \
done; \
fi && \
rm -rf /var/lib/apt/lists/*
FROM debian:bookworm AS families-source
ARG FAMILIES_GIT_REF
RUN apt-get update && \ RUN apt-get update && \
apt-get install -y --no-install-recommends ca-certificates git && \ apt-get install -y --no-install-recommends ca-certificates git && \
git clone --depth=1 --branch "${FAMILIES_GIT_REF}" https://github.com/ente-io/families.git /families && \ git clone --depth=1 --branch "${ENTE_GIT_REF}" https://github.com/ente-io/ente.git /src && \
rm -rf /var/lib/apt/lists/* rm -rf /var/lib/apt/lists/*
FROM golang:1.24-bookworm AS museum-builder FROM golang:1.24-bookworm AS museum-builder
@@ -53,25 +37,18 @@ ENV NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT=https://albums.localhost.invalid
COPY --from=ente-source /src /ente COPY --from=ente-source /src /ente
WORKDIR /ente/web WORKDIR /ente/web
RUN apt-get update && \ RUN apt-get update && \
apt-get install -y --no-install-recommends build-essential python3 curl ca-certificates && \ apt-get install -y --no-install-recommends build-essential python3 && \
rm -rf /var/lib/apt/lists/* rm -rf /var/lib/apt/lists/*
RUN curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain stable --profile minimal && \
. "$HOME/.cargo/env" && \
cargo install wasm-pack
ENV PATH="/root/.cargo/bin:${PATH}"
RUN corepack enable RUN corepack enable
RUN yarn install --network-timeout 1000000 RUN yarn install --network-timeout 1000000
RUN mkdir -p /build/web/photos /build/web/accounts /build/web/auth /build/web/cast /build/web/albums /build/web/family /build/web/share /build/web/embed /build/web/payments RUN mkdir -p /build/web/photos /build/web/accounts /build/web/auth /build/web/cast /build/web/albums /build/web/family
RUN set -e; \ RUN set -e; \
yarn build:photos; \ yarn build:photos; \
yarn build:accounts; \ yarn build:accounts; \
yarn build:auth; \ yarn build:auth; \
yarn build:cast; \ yarn build:cast
yarn build:share; \
yarn build:embed; \
yarn build:payments
RUN if [ -d "apps" ]; then \ RUN if [ -d "apps" ]; then \
for app in photos accounts auth cast share embed payments; do \ for app in photos accounts auth cast; do \
if [ -d "apps/${app}/out" ]; then \ if [ -d "apps/${app}/out" ]; then \
rm -rf "/build/web/${app}"; \ rm -rf "/build/web/${app}"; \
mkdir -p "/build/web/${app}"; \ mkdir -p "/build/web/${app}"; \
@@ -86,26 +63,9 @@ RUN if [ -d "apps" ]; then \
printf '<html><body><h1>Ente %s</h1><p>Build output missing.</p></body></html>\n' "${app}" > "/build/web/${app}/index.html"; \ printf '<html><body><h1>Ente %s</h1><p>Build output missing.</p></body></html>\n' "${app}" > "/build/web/${app}/index.html"; \
done; \ done; \
fi && \ fi && \
rm -rf /build/web/albums && \ rm -rf /build/web/albums /build/web/family && \
cp -r /build/web/photos /build/web/albums cp -r /build/web/photos /build/web/albums && \
cp -r /build/web/photos /build/web/family
FROM node:20-bookworm-slim AS families-builder
ENV NEXT_PUBLIC_ENTE_ENDPOINT=ENTE_API_ORIGIN_PLACEHOLDER \
NEXT_WEB_ENTE_ENDPOINT=ENTE_WEB_ENDPOINT_PLACEHOLDER \
NEXT_PUBLIC_IS_SENTRY_ENABLED=no \
NEXT_PUBLIC_SENTRY_ENV=local \
NEXT_PUBLIC_SENTRY_DSN= \
NEXT_TELEMETRY_DISABLED=1
COPY --from=families-source /families /families
WORKDIR /families
RUN apt-get update && \
apt-get install -y --no-install-recommends build-essential python3 && \
rm -rf /var/lib/apt/lists/*
RUN corepack enable
RUN yarn install --network-timeout 1000000
RUN mkdir -p /build/family && \
yarn build && \
./node_modules/.bin/next export -o /build/family
FROM cloudron/base:5.0.0@sha256:04fd70dbd8ad6149c19de39e35718e024417c3e01dc9c6637eaf4a41ec4e596c FROM cloudron/base:5.0.0@sha256:04fd70dbd8ad6149c19de39e35718e024417c3e01dc9c6637eaf4a41ec4e596c
@@ -120,7 +80,6 @@ RUN apt-get update && \
RUN mkdir -p /app/pkg /app/web "$HOME" && chown -R cloudron:cloudron /app /app/web "$HOME" RUN mkdir -p /app/pkg /app/web "$HOME" && chown -R cloudron:cloudron /app /app/web "$HOME"
COPY --from=ente-source /src ${APP_DIR} COPY --from=ente-source /src ${APP_DIR}
COPY data ${APP_DIR}/data
RUN rm -rf ${APP_DIR}/.git RUN rm -rf ${APP_DIR}/.git
RUN mkdir -p /app/museum-bin RUN mkdir -p /app/museum-bin
@@ -139,19 +98,13 @@ COPY --from=web-builder /build/web/accounts /app/web/accounts
COPY --from=web-builder /build/web/auth /app/web/auth COPY --from=web-builder /build/web/auth /app/web/auth
COPY --from=web-builder /build/web/cast /app/web/cast COPY --from=web-builder /build/web/cast /app/web/cast
COPY --from=web-builder /build/web/albums /app/web/albums COPY --from=web-builder /build/web/albums /app/web/albums
COPY --from=web-builder /build/web/share /app/web/share COPY --from=web-builder /build/web/family /app/web/family
COPY --from=web-builder /build/web/embed /app/web/embed
COPY --from=web-builder /build/web/payments /app/web/payments
COPY --from=families-builder /build/family /app/web/family
COPY start.sh /app/pkg/start.sh COPY start.sh /app/pkg/start.sh
COPY admin-helper.sh /app/pkg/admin-helper.sh COPY admin-helper.sh /app/pkg/admin-helper.sh
COPY admin-helper-direct.sh /app/pkg/admin-helper-direct.sh COPY admin-helper-direct.sh /app/pkg/admin-helper-direct.sh
RUN chmod +x /app/pkg/start.sh /app/pkg/admin-helper.sh /app/pkg/admin-helper-direct.sh RUN chmod +x /app/pkg/start.sh /app/pkg/admin-helper.sh /app/pkg/admin-helper-direct.sh
RUN ln -s /app/data/cli-data /cli-data && \
rm -rf /home/cloudron && \
ln -s /app/data/home /home/cloudron
EXPOSE 3080 8080 EXPOSE 3080 8080
+18 -70
View File
@@ -5,86 +5,34 @@ Your Ente installation is almost ready!
Before using Ente, configure an S3-compatible object storage provider: Before using Ente, configure an S3-compatible object storage provider:
1. Open the Cloudron dashboard and select your Ente app. 1. Open the Cloudron dashboard and select your Ente app.
2. Launch the file explorer. 2. Launch the web terminal.
3. Open `/app/data/config/s3.env` and provide values for **all** required keys. 3. Edit `/app/data/config/s3.env` and provide values for **all** required keys:
```bash
nano /app/data/config/s3.env
```
4. Save the file and restart the app from the Cloudron dashboard. 4. Save the file and restart the app from the Cloudron dashboard.
5. (Required for cast/slideshow) Configure your S3 buckets CORS policy to allow the Ente domains you serve from Cloudron (e.g. `https://ente.due.ren`, `https://accounts.due.ren`, `https://cast.due.ren`, etc.). Without CORS, browsers will block the signed URLs that power the cast slideshow.
- **Backblaze B2 tip:** B2 ships with “native” CORS rules that block S3-style updates. Install the Backblaze CLI `pip install 'b2<4'`, then:
```bash
# Authorise once (replace with your key ID/secret)
b2 authorize-account <KEY_ID> <APP_KEY>
# Inspect the current bucket type (usually allPrivate) and capture it Supported variables:
BUCKET_TYPE=$(b2 get-bucket ente-due-ren | awk -F'"' '/bucketType/ {print $4}')
# Clear any native rules without changing visibility
b2 update-bucket ente-due-ren "$BUCKET_TYPE" --cors-rules '[]'
# Apply the S3-compatible rule (adjust origins as needed)
cat >cors.json <<'EOF'
[
{
"corsRuleName": "entephotos",
"allowedOrigins": ["*"],
"allowedHeaders": ["*"],
"allowedOperations": [
"b2_download_file_by_id",
"b2_download_file_by_name",
"b2_upload_file",
"b2_upload_part",
"s3_get",
"s3_post",
"s3_put",
"s3_head"
],
"exposeHeaders": ["X-Amz-Request-Id","X-Amz-Id-2","ETag"],
"maxAgeSeconds": 3600
}
]
EOF
b2 update-bucket ente-due-ren "$BUCKET_TYPE" --cors-rules "$(<cors.json)"
```
Verify with `curl -I -H 'Origin: https://ente.due.ren' <signed-url>`; you should see `Access-Control-Allow-Origin`.
Supported variables (these map directly to the fields described in the upstream “Configuring Object Storage” documentation):
- `S3_ENDPOINT` (e.g. `https://<account>.r2.cloudflarestorage.com`) - `S3_ENDPOINT` (e.g. `https://<account>.r2.cloudflarestorage.com`)
- `S3_REGION` - `S3_REGION`
- `S3_BUCKET` - `S3_BUCKET`
- `S3_ACCESS_KEY` - `S3_ACCESS_KEY`
- `S3_SECRET_KEY` - `S3_SECRET_KEY`
- `S3_PREFIX` (optional path prefix) - `S3_PREFIX` (optional path prefix)
- `S3_ARE_LOCAL_BUCKETS` (set to `false` when your provider uses HTTPS “real” domains instead of MinIO-style LAN endpoints)
- `S3_FORCE_PATH_STYLE` (set to `true` for MinIO, Cloudflare R2, Backblaze, or any host that requires `https://host/bucket/object` URLs)
- `S3_PRIMARY_DC`, `S3_SECONDARY_DC`, `S3_COLD_DC`, `S3_DERIVED_DC` (advanced: pick from the canonical data-center identifiers listed in the upstream docs. The names are hard-coded in Museum; leave them at `b2-eu-cen`, `wasabi-eu-central-2-v3`, `scw-eu-fr-v3` unless you know you need one of the legacy aliases such as `scw-eu-fr`.)
- Optional replication: define **both** `S3_SECONDARY_*` and `S3_COLD_*` (endpoints, keys, secrets, optional prefixes, DC names) to mirror uploads to a second hot bucket and a third cold bucket. Replication is only enabled when all three buckets are configured; otherwise the app stays in single-bucket mode. See [Entes object storage guide](https://ente.io/help/self-hosting/administration/object-storage) for sample layouts and discussion of reliability.
You should never edit the generated `/app/data/museum/configurations/local.yaml` directly. If you need to append extra settings (for example, defining `internal.super-admins`), create `/app/data/config/museum.override.yaml` and add only the keys you want to override. Copying the entire sample `s3:` block from the docs into that file will erase the credentials that the package renders from `s3.env` and break replication. ## Next Steps
## Required: Secondary Hostnames - Visit the app URL and create the first administrator account.
- Configure the Ente mobile apps to use your custom server (`Settings → Advanced → Custom Server`).
- Optional: set the environment variables `CLOUDRON_OIDC_IDENTIFIER`, `CLOUDRON_OIDC_CLIENT_ID`, and `CLOUDRON_OIDC_CLIENT_SECRET` to enable Cloudron SSO in the generated Museum config.
The installer now asks for dedicated hostnames for the Auth/Accounts/Cast/Albums/Family web apps (via Cloudron `httpPorts`). If you manage DNS outside of Cloudron, create CNAME/A records such as `accounts.<app-domain>`, `auth.<app-domain>`, etc., pointing at the primary app domain. With Cloudron-managed DNS the records are created automatically. ## Administration Helpers
## Administration - The Ente CLI binary is shipped at `/app/code/ente`. Run it via the Cloudron web terminal.
- CLI configuration lives at `/app/data/home/.ente/config.yaml` and already points to `https://<your-domain>/api`.
- The main Museum configuration is generated at `/app/data/museum/configurations/local.yaml`. Delete this file to regenerate it with updated environment variables.
- **Grant yourself admin privileges** Logs are streamed to the Cloudron dashboard. For deeper inspection use:
1. Open the Cloudron dashboard → your Ente app → **File Manager**. ```bash
2. Navigate to `/app/data/config/` and open (or create) `museum.override.yaml`. cloudron logs --app <location> -f
3. Add your email to the super-admin list: ```
```yaml
internal:
super-admins:
- you@example.com
```
4. Save the file and restart the app. The override is appended to Museums configuration on every start.
- **Sign in to the bundled CLI**
*The package now preconfigures the CLI (config: `/app/data/cli-data/config.yaml`, exports: `/app/data/cli-data/export`).*
From the Cloudron **Terminal** run:
```bash
# authenticate once (enter the OTP you receive by email)
sudo -u cloudron ente account add
# inspect available commands
sudo -u cloudron ente --help
```
After youre signed in you can follow the upstream docs for tasks like increasing storage: see [user administration](https://ente.io/help/self-hosting/administration/users) and the [CLI reference](https://ente.io/help/self-hosting/administration/cli). The [object storage guide](https://ente.io/help/self-hosting/administration/object-storage) explains the reliability setup: fill out `S3_*`, `S3_SECONDARY_*`, and `S3_COLD_*` in `/app/data/config/s3.env`, and the package will automatically enable three-bucket replication when you restart (no extra toggle needed).
+43 -81
View File
@@ -9,6 +9,28 @@ This repository contains the Cloudron packaging for [Ente](https://ente.io), an
- Configured to use Cloudron's mail service for sending emails - Configured to use Cloudron's mail service for sending emails
- Easy to deploy and manage through the Cloudron interface - Easy to deploy and manage through the Cloudron interface
## Requirements
### Browser Compatibility
Ente uses modern web technologies for its end-to-end encryption:
- **WebAssembly**: Required for cryptographic operations
- **IndexedDB**: Required for client-side data storage
Most modern browsers support these features, but they may be blocked by:
- Browser privacy settings
- Content Security Policies
- Certain browser extensions
This package includes custom Caddy configuration with appropriate security headers to ensure these features work correctly.
### S3-Compatible Storage
Ente requires an S3-compatible object storage service. You can use:
- Cloudron's built-in object storage
- External services like AWS S3, Wasabi, or MinIO
## Building and Installing ## Building and Installing
### Option 1: Build and Install Manually ### Option 1: Build and Install Manually
@@ -51,95 +73,23 @@ The app is configured automatically using Cloudron's environment variables for:
- SMTP mail service - SMTP mail service
- App origin URL - App origin URL
### Cloudron Admin Notes ### Additional Configuration
After installing on Cloudron remember to: The package includes several enhancements to ensure proper functionality:
1. Open the File Manager for the app, edit `/app/data/config/s3.env`, and set the S3-compatible credentials that belong in `museum.yaml`. The upstream documentation expects the canonical keys `b2-eu-cen` (primary), `wasabi-eu-central-2-v3` (secondary) and `scw-eu-fr-v3` (cold); this package renders those blocks automatically from the environment variables below so you dont have to touch the generated config. At minimum set `S3_ENDPOINT`, `S3_REGION`, `S3_BUCKET`, `S3_ACCESS_KEY`, `S3_SECRET_KEY`, plus the optional `S3_PREFIX`. To enable replication you must also define **both** `S3_SECONDARY_*` and `S3_COLD_*` (endpoint, region, bucket, key, secret, optional prefix/DC overrides); after a restart the package will flip `replication.enabled` on your behalf when all three buckets are present. Advanced knobs from the documentation map to the following variables: 1. **Security Headers**: Custom Content-Security-Policy headers that allow WebAssembly and IndexedDB
- `S3_ARE_LOCAL_BUCKETS=false` toggles SSL/subdomain-style URLs (`are_local_buckets` in `museum.yaml`); leave it at `true` for MinIO-style setups. 2. **API Configuration**: Dynamic runtime configuration to ensure the frontend connects to the correct API endpoint
- `S3_FORCE_PATH_STYLE=true` translates to `use_path_style_urls=true` (required for R2/MinIO and most LAN storage). 3. **CORS Headers**: Proper CORS configuration for API access
- The data-center identifiers (`b2-eu-cen`, `wasabi-eu-central-2-v3`, `scw-eu-fr-v3`, etc.) are **hard-coded upstream**. Keep the defaults unless you know you are targeting one of the legacy names (as listed in the Ente docs). The start script will ignore unknown values to prevent replication from breaking with empty bucket names.
- Leave the generated `museum/configurations/local.yaml` alone—if you need to append extra settings, do so via `/app/data/config/museum.override.yaml` and only add the keys you actually want to change. Copypasting the full sample `s3:` block from the docs will overwrite the generated credentials with blanks.
- If you are using Cloudflare R2 or another hosted S3 provider, configure your buckets CORS policy to allow the Ente frontends (e.g. `https://ente.due.ren`, `https://accounts.due.ren`, `https://cast.due.ren`, **and** the desktop scheme `ente://app`) so that cast/slideshow playback and the desktop client can fetch signed URLs directly from storage. Backblaze B2 also requires clearing its “native” CORS rules; see the script in `POSTINSTALL.md`. When using the Backblaze CLI remember to preserve your bucket visibility (`allPrivate` for most installs): run `b2 get-bucket <bucket>` to confirm the current type, then invoke `b2 update-bucket <bucket> <bucketType> --cors-rules "$(<cors.json)"` so you only touch the CORS block. A minimal rule that works with Entes signed URLs looks like:
```bash
cat <<'EOF' >cors.json
[
{
"corsRuleName": "entephotos",
"allowedOrigins": ["*"],
"allowedHeaders": ["*"],
"allowedOperations": [
"b2_download_file_by_id",
"b2_download_file_by_name",
"b2_upload_file",
"b2_upload_part",
"s3_get",
"s3_post",
"s3_put",
"s3_head"
],
"exposeHeaders": ["X-Amz-Request-Id","X-Amz-Id-2","ETag"],
"maxAgeSeconds": 3600
}
]
EOF
b2 update-bucket ente-due-ren allPrivate --cors-rules "$(<cors.json)"
```
Adjust the hostnames and bucket type as needed; afterwards verify with `curl -I -H 'Origin: https://cast.example.com' '<signed-url>'` and ensure `Access-Control-Allow-Origin` is present.
2. When prompted during installation, pick hostnames for the Accounts/Auth/Cast/Albums/Family web apps (they are exposed via Cloudron `httpPorts`). Ensure matching DNS records exist; Cloudron-managed DNS creates them automatically, otherwise point CNAME/A records such as `accounts.<app-domain>` at the primary hostname.
3. To persist tweaks to Museum (for example, seeding super-admin or whitelist entries), create `/app/data/config/museum.override.yaml`. Its contents are appended to the generated `museum/configurations/local.yaml` on every start, so you only need to declare the keys you want to override.
```yaml
# /app/data/config/museum.override.yaml
internal:
super-admins:
- admin@example.com
```
4. Use the bundled Ente CLI for admin tasks via `cloudron exec --app <location> -- sudo -u cloudron ente --help`. On a fresh install run the following once (initialises the CLI config, whitelists your admin, and clears the CLI DB):
```bash
cloudron exec --app ente.cloudron.io -- bash -lc \
'cat <<EOF >/cli-data/config.yaml
endpoint:
api: https://ente.cloudron.io/api
log:
http: false
EOF
mkdir -p /cli-data/export
chown cloudron:cloudron /cli-data /cli-data/config.yaml /cli-data/export
cat <<EOF >/app/data/config/museum.override.yaml
internal:
super-admins:
- admin@example.com
EOF
rm -f /cli-data/ente-cli.db
chown cloudron:cloudron /app/data/config/museum.override.yaml'
cloudron restart --app ente.cloudron.io You need to manually set up and configure:
# add your account (respond to prompts with the OTP sent to your email) - S3-compatible object storage
cloudron exec --app ente.cloudron.io -- sudo -u cloudron ente account add
```
Afterwards the usual admin commands work as documented. Example:
```bash
cloudron exec --app ente.cloudron.io -- sudo -u cloudron ente admin list-users --admin-user admin@example.com
```
The main photos UI continues to live on the hostname you selected during installation.
### Object storage quick reference
The upstream documentation at [ente.io/help/self-hosting/administration/object-storage](https://ente.io/help/self-hosting/administration/object-storage) is written for bare-metal installs where you edit `museum.yaml` by hand. The Cloudron package wraps those steps so you only maintain `/app/data/config/s3.env`, but the same concepts apply:
- **Canonical bucket names.** Museums schema ships with `b2-eu-cen`, `wasabi-eu-central-2-v3`, and `scw-eu-fr-v3`. You can point those identifiers at any S3-compatible provider, but you cannot rename them—replication logic only understands the upstream keys (or their documented legacy aliases). Leave the defaults in `s3.env` and only change the credentials/endpoints under each key.
- **Three buckets for replication.** Replication only works when two “hot” buckets and one “cold” bucket are configured. Populate `S3_*`, `S3_SECONDARY_*`, and `S3_COLD_*`; once all three have endpoints/keys/secrets the package automatically writes the `replication.enabled: true` stanza.
- **Transport settings.** Set `S3_ARE_LOCAL_BUCKETS=true`/`false` and `S3_FORCE_PATH_STYLE=true` to mirror the documentations `are_local_buckets`/`use_path_style_urls` toggles when talking to MinIO, Cloudflare R2, or other providers that require path-style URLs over HTTPS.
- **CORS.** If browsers cannot upload/download because of CORS, apply the recommended JSON from the docs (or the Backblaze helper script in `POSTINSTALL.md`). Ensure `Content-MD5` is listed in `AllowedHeaders` for providers with allow-lists.
- **Do not overwrite the generated config.** Keep `/app/data/config/museum.override.yaml` minimal (only the keys you need). Dropping the example `s3:` block from the docs into that file will clear the generated credentials and replication will fail with “PutObjectInput.Bucket” errors.
## Usage ## Usage
### Web Client ### Web Client
After installation, you can access the Ente web client at your app's URL. Create the first user and promote them to an administrator using the override file or upstream admin tooling as documented by Ente. After installation, you can access the Ente web client at your app's URL. Create an admin account on first use.
### Mobile Apps ### Mobile Apps
@@ -157,6 +107,18 @@ To update to a newer version:
cloudron update --app ente.yourdomain.com cloudron update --app ente.yourdomain.com
``` ```
## Troubleshooting
### Common Issues
1. **"Failed to fetch" errors**: Check if your browser is blocking API requests to your domain
2. **WebAssembly errors**: Ensure your browser supports and allows WebAssembly (try using Chrome or Firefox)
3. **IndexedDB errors**: Make sure your browser allows IndexedDB (not in private/incognito mode)
For issues specific to the Cloudron packaging, please open an issue in this repository.
For issues with Ente itself, please refer to the [main Ente repository](https://github.com/ente-io/ente).
## License ## License
This Cloudron package is licensed under the same license as Ente (Apache 2.0). This Cloudron package is licensed under the same license as Ente (Apache 2.0).
+11 -15
View File
@@ -18,20 +18,16 @@ database:
maxIdleConns: 25 maxIdleConns: 25
connMaxLifetime: "1h" connMaxLifetime: "1h"
s3: storage:
are_local_buckets: false type: "s3"
use_path_style_urls: true s3:
hot_storage:
primary: b2-eu-cen
secondary: b2-eu-cen
derived-storage: b2-eu-cen
b2-eu-cen:
endpoint: "%%S3_ENDPOINT%%" endpoint: "%%S3_ENDPOINT%%"
region: "%%S3_REGION%%" region: "%%S3_REGION%%"
bucket: "%%S3_BUCKET%%" bucket: "%%S3_BUCKET%%"
key: "%%S3_ACCESS_KEY%%" accessKey: "%%S3_ACCESS_KEY%%"
secret: "%%S3_SECRET_KEY%%" secretKey: "%%S3_SECRET_KEY%%"
path_prefix: "%%S3_PREFIX%%" prefix: "%%S3_PREFIX%%"
forcePathStyle: true
email: email:
smtp: smtp:
@@ -52,19 +48,19 @@ auth:
logging: logging:
level: "info" level: "info"
format: "text" format: "text"
# Additional settings based on Museum requirements # Additional settings based on Museum requirements
keygen: keygen:
master: "%%MASTER_KEY%%" master: "%%MASTER_KEY%%"
payments: payments:
enabled: false enabled: false
metadata: metadata:
localPath: "/app/data/storage/metadata" localPath: "/app/data/storage/metadata"
tempDirectory: "/app/data/storage/temp" tempDirectory: "/app/data/storage/temp"
memoryCache: memoryCache:
enabled: true enabled: true
size: 100 size: 100
-186
View File
@@ -1,186 +0,0 @@
{
"IN": [
{
"id": "50gb_monthly_v4",
"androidID": "50gb_monthly_v4",
"iosID": "50gb_monthly_v4",
"stripeID": "50gb_monthly_v4",
"storage": 53687091200,
"price": "₹0",
"period": "month"
},
{
"id": "200gb_monthly_v4",
"androidID": "200gb_monthly_v4",
"iosID": "200gb_monthly_v4",
"stripeID": "200gb_monthly_v4",
"storage": 214748364800,
"price": "₹0",
"period": "month"
},
{
"id": "1000gb_monthly_v4",
"androidID": "1000gb_monthly_v4",
"iosID": "1000gb_monthly_v4",
"stripeID": "1000gb_monthly_v4",
"storage": 1073741824000,
"price": "₹0",
"period": "month"
},
{
"id": "2000gb_monthly_v4",
"androidID": "2000gb_monthly_v4",
"iosID": "2000gb_monthly_v4",
"stripeID": "2000gb_monthly_v4",
"storage": 2147483648000,
"price": "₹0",
"period": "month"
},
{
"id": "50gb_yearly_v4",
"androidID": "50gb_yearly_v4",
"iosID": "50gb_yearly_v4",
"stripeID": "50gb_yearly_v4",
"storage": 53687091200,
"price": "₹0",
"period": "year"
},
{
"id": "200gb_yearly_v4",
"androidID": "200gb_yearly_v4",
"iosID": "200gb_yearly_v4",
"stripeID": "200gb_yearly_v4",
"storage": 214748364800,
"price": "₹0",
"period": "year"
},
{
"id": "1000gb_yearly_v4",
"androidID": "1000gb_yearly_v4",
"iosID": "1000gb_yearly_v4",
"stripeID": "1000gb_yearly_v4",
"storage": 1073741824000,
"price": "₹0",
"period": "year"
},
{
"id": "2000gb_yearly_v4",
"androidID": "2000gb_yearly_v4",
"iosID": "2000gb_yearly_v4",
"stripeID": "2000gb_yearly_v4",
"storage": 2147483648000,
"price": "₹0",
"period": "year"
},
{
"id": "family",
"androidID": "family",
"iosID": "family",
"stripeID": "family",
"storage": 2147483648000,
"price": "₹0",
"period": "year"
},
{
"id": "free",
"androidID": "free",
"iosID": "free",
"stripeID": "free",
"storage": 10737418240,
"price": "₹0",
"period": "year"
}
],
"US": [
{
"id": "50gb_monthly_v4",
"androidID": "50gb_monthly_v4",
"iosID": "50gb_monthly_v4",
"stripeID": "50gb_monthly_v4",
"storage": 53687091200,
"price": "$0",
"period": "month"
},
{
"id": "200gb_monthly_v4",
"androidID": "200gb_monthly_v4",
"iosID": "200gb_monthly_v4",
"stripeID": "200gb_monthly_v4",
"storage": 214748364800,
"price": "$0",
"period": "month"
},
{
"id": "1000gb_monthly_v4",
"androidID": "1000gb_monthly_v4",
"iosID": "1000gb_monthly_v4",
"stripeID": "1000gb_monthly_v4",
"storage": 1073741824000,
"price": "$0",
"period": "month"
},
{
"id": "2000gb_monthly_v4",
"androidID": "2000gb_monthly_v4",
"iosID": "2000gb_monthly_v4",
"stripeID": "2000gb_monthly_v4",
"storage": 2147483648000,
"price": "$0",
"period": "month"
},
{
"id": "50gb_yearly_v4",
"androidID": "50gb_yearly_v4",
"iosID": "50gb_yearly_v4",
"stripeID": "50gb_yearly_v4",
"storage": 53687091200,
"price": "$0",
"period": "year"
},
{
"id": "200gb_yearly_v4",
"androidID": "200gb_yearly_v4",
"iosID": "200gb_yearly_v4",
"stripeID": "200gb_yearly_v4",
"storage": 214748364800,
"price": "$0",
"period": "year"
},
{
"id": "1000gb_yearly_v4",
"androidID": "1000gb_yearly_v4",
"iosID": "1000gb_yearly_v4",
"stripeID": "1000gb_yearly_v4",
"storage": 1073741824000,
"price": "$0",
"period": "year"
},
{
"id": "2000gb_yearly_v4",
"androidID": "2000gb_yearly_v4",
"iosID": "2000gb_yearly_v4",
"stripeID": "2000gb_yearly_v4",
"storage": 2147483648000,
"price": "$0",
"period": "year"
},
{
"id": "family",
"androidID": "family",
"iosID": "family",
"stripeID": "family",
"storage": 2147483648000,
"price": "$0",
"period": "year"
},
{
"id": "free",
"androidID": "free",
"iosID": "free",
"stripeID": "free",
"storage": 10737418240,
"price": "$0",
"period": "year"
}
]
}
-186
View File
@@ -1,186 +0,0 @@
{
"US": [
{
"id": "50gb_monthly_v4",
"androidID": "50gb_monthly_v4",
"iosID": "50gb_monthly_v4",
"stripeID": "50gb_monthly_v4",
"storage": 53687091200,
"price": "$0",
"period": "month"
},
{
"id": "200gb_monthly_v4",
"androidID": "200gb_monthly_v4",
"iosID": "200gb_monthly_v4",
"stripeID": "200gb_monthly_v4",
"storage": 214748364800,
"price": "$0",
"period": "month"
},
{
"id": "1000gb_monthly_v4",
"androidID": "1000gb_monthly_v4",
"iosID": "1000gb_monthly_v4",
"stripeID": "1000gb_monthly_v4",
"storage": 1073741824000,
"price": "$0",
"period": "month"
},
{
"id": "2000gb_monthly_v4",
"androidID": "2000gb_monthly_v4",
"iosID": "2000gb_monthly_v4",
"stripeID": "2000gb_monthly_v4",
"storage": 2147483648000,
"price": "$0",
"period": "month"
},
{
"id": "50gb_yearly_v4",
"androidID": "50gb_yearly_v4",
"iosID": "50gb_yearly_v4",
"stripeID": "50gb_yearly_v4",
"storage": 53687091200,
"price": "$0",
"period": "year"
},
{
"id": "200gb_yearly_v4",
"androidID": "200gb_yearly_v4",
"iosID": "200gb_yearly_v4",
"stripeID": "200gb_yearly_v4",
"storage": 214748364800,
"price": "$0",
"period": "year"
},
{
"id": "1000gb_yearly_v4",
"androidID": "1000gb_yearly_v4",
"iosID": "1000gb_yearly_v4",
"stripeID": "1000gb_yearly_v4",
"storage": 1073741824000,
"price": "$0",
"period": "year"
},
{
"id": "2000gb_yearly_v4",
"androidID": "2000gb_yearly_v4",
"iosID": "2000gb_yearly_v4",
"stripeID": "2000gb_yearly_v4",
"storage": 2147483648000,
"price": "$0",
"period": "year"
},
{
"id": "family",
"androidID": "family",
"iosID": "family",
"stripeID": "family",
"storage": 2147483648000,
"price": "$0",
"period": "year"
},
{
"id": "free",
"androidID": "free",
"iosID": "free",
"stripeID": "free",
"storage": 10737418240,
"price": "$0",
"period": "year"
}
],
"EU": [
{
"id": "50gb_monthly_v4",
"androidID": "50gb_monthly_v4",
"iosID": "50gb_monthly_v4",
"stripeID": "50gb_monthly_v4",
"storage": 53687091200,
"price": "€0",
"period": "month"
},
{
"id": "200gb_monthly_v4",
"androidID": "200gb_monthly_v4",
"iosID": "200gb_monthly_v4",
"stripeID": "200gb_monthly_v4",
"storage": 214748364800,
"price": "€0",
"period": "month"
},
{
"id": "1000gb_monthly_v4",
"androidID": "1000gb_monthly_v4",
"iosID": "1000gb_monthly_v4",
"stripeID": "1000gb_monthly_v4",
"storage": 1073741824000,
"price": "€0",
"period": "month"
},
{
"id": "2000gb_monthly_v4",
"androidID": "2000gb_monthly_v4",
"iosID": "2000gb_monthly_v4",
"stripeID": "2000gb_monthly_v4",
"storage": 2147483648000,
"price": "€0",
"period": "month"
},
{
"id": "50gb_yearly_v4",
"androidID": "50gb_yearly_v4",
"iosID": "50gb_yearly_v4",
"stripeID": "50gb_yearly_v4",
"storage": 53687091200,
"price": "€0",
"period": "year"
},
{
"id": "200gb_yearly_v4",
"androidID": "200gb_yearly_v4",
"iosID": "200gb_yearly_v4",
"stripeID": "200gb_yearly_v4",
"storage": 214748364800,
"price": "€0",
"period": "year"
},
{
"id": "1000gb_yearly_v4",
"androidID": "1000gb_yearly_v4",
"iosID": "1000gb_yearly_v4",
"stripeID": "1000gb_yearly_v4",
"storage": 1073741824000,
"price": "€0",
"period": "year"
},
{
"id": "2000gb_yearly_v4",
"androidID": "2000gb_yearly_v4",
"iosID": "2000gb_yearly_v4",
"stripeID": "2000gb_yearly_v4",
"storage": 2147483648000,
"price": "€0",
"period": "year"
},
{
"id": "family",
"androidID": "family",
"iosID": "family",
"stripeID": "family",
"storage": 2147483648000,
"price": "€0",
"period": "year"
},
{
"id": "free",
"androidID": "free",
"iosID": "free",
"stripeID": "free",
"storage": 10737418240,
"price": "€0",
"period": "year"
}
]
}
-31
View File
@@ -1,31 +0,0 @@
diff --git a/server/pkg/controller/family/admin.go b/server/pkg/controller/family/admin.go
index 1b58f6b8..8fd74a99 100644
--- a/server/pkg/controller/family/admin.go
+++ b/server/pkg/controller/family/admin.go
@@
- "github.com/ente-io/museum/pkg/utils/auth"
- "github.com/ente-io/museum/pkg/utils/billing"
+ "github.com/ente-io/museum/pkg/utils/auth"
+ "github.com/ente-io/museum/pkg/utils/billing"
emailUtil "github.com/ente-io/museum/pkg/utils/email"
"github.com/ente-io/stacktrace"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"github.com/sirupsen/logrus"
+ "github.com/spf13/viper"
)
@@
- FamilyPlainHost = "https://family.ente.io"
+ defaultFamilyHost = "https://family.ente.io"
)
+
+func familyInviteHost() string {
+ host := viper.GetString("apps.family")
+ if host != "" {
+ return host
+ }
+ return defaultFamilyHost
+}
@@
- templateData["FamilyInviteLink"] = fmt.Sprintf("%s?inviteToken=%s", FamilyPlainHost, *inviteToken)
+ templateData["FamilyInviteLink"] = fmt.Sprintf("%s?inviteToken=%s", familyInviteHost(), *inviteToken)
+89 -1079
View File
File diff suppressed because it is too large Load Diff