## Description
Attempt to increase refresh rate for autovacuum to ensure that the query
planner use the index.
Based on slow query logs, and analyze command, it looks like the index
is not being used because the table stats are out of date. And the
default auto_vacumm only runs after 10% of rows have changed.
## Tests
Tested on local machine.
```
SELECT unnest(reloptions) AS option
FROM pg_class
WHERE relname = 'trash';
```
Once deployed, will monitor slow query logs and CPU usage.
## Description
If others file contains two files with same hash, we are returning same
FileID twice for add or copy operation. This change fixes that
behaviour.
## Tests
Adding Custom Icon for Startmail.com
## Description
Add custom SVG icon for [Startmail](https://www.startmail.com/) to
support branding in UI components.
## Tests
## Description
To avoid duplicate config entry for same album. client is expected to
pass id while creating smart album config in following format
`sa_userid_collection_id`.
Open to changing the name/prefix values for this new entity type.
## Tests
## Description
Setting a high minimum value for the compression settings when decoding
an image for ML indexing that doesn't have a decodable format (heic on
Android). This ensures the image is merely formatted to jpeg and not
actually decreasing in quality.
## Description
I wanted to use a mix of local minio and remote buckets and therefore
needed both the `use_path_style_urls` and `disable_ssl` settings to be
configurable per bucket. These changes are backwards compatible with the
"global" settings `use_path_style_urls` and `areLocalBuckets`.
## Tests
I'm running this code in my own self hosted museum instance.
## Description
- Removes the "Moments" section for all users
- Puts memories debugging section behind internal and local setting
## Tests
Tested in debug mode on my pixel phone.
## Description
- Fix bug where clicking on birthday notifications opens the person page
(as fallback) and not the person memory (as intended)
- Minor UI fixes
## Tests
Tested in debug mode on my pixel phone.
## Description
If the number of files to be deleted exceeds 20,000, the deletion will
be performed in batches, with a maximum of 20,000 files per batch. If a
batch of 20,000 files fails, it will retry with 10,000 files (half the
previous batch size). If failures continue, the batch size will keep
reducing until it is over 2,000 files.
## Tests
Tested and works as expected.
## Description
Nudge paid users who are not using family and add family members after
30 days. They are only notified once about this as this is logged in
`notification_history`.
## Description
_shouldThrottleSync logic was changed to return True when multiPart was
disabled. This resulted in incorrect throttling when user had disabled
multipart and app was in fg.
## Tests
This PR adds the Proton Pass and Proton Wallet icons. The Calendar,
Drive, and Mail icons were already included in Simple Icons as
single-color versions. However, to maintain consistency with the Proton,
Proton Pass, and Proton Wallet icons and to reflect the official brand
colors, I have updated these icons to the full-color versions from
[Proton's media kit](https://proton.me/media/kit).
## Description
#### Old
"Indexing is paused. It will automatically resume when device is ready."
#### New
"Indexing is paused. It will automatically resume when the device is
ready. The device is considered ready when its battery level, battery
health, and thermal status are within a healthy range."
## Description
Fix showing contact result in the search section and also show the
albums shared by that contact like the contact section in the shared
collection tab.
## Tests
[Video](https://wormhole.app/xk6MZ4#qu9aa_r0VcGhkEDypz7l1g)
## Description
Previously, images larger than 160MP were downscaled to 16MP to avoid
crashes caused by
[this](https://github.com/flutter/flutter/issues/110331) flutter issue.
This update lowers the threshold to 100MP and increases the downscaling
resolution to 50MP, for a better balance between performance and image
quality.
## Tests
- Tested with 150MP and 200MP images on a Samsung A54 (8GB RAM).
- Verified that rendering a 50MP downscaled image increases memory
usage, but remains within acceptable limits.
## Description
1. A subtle zoom-in/out effect for photos and replaced the black area
around landscape photos with a blurred background.
2. Auto play each image for 5 second and video for its duration with a
step progress animation.
3. Long-press to pause animation. Releasing will resume the playback.
## Description
Adds suggestions to the all people page when tapping on the people
section. Similar to the suggestion within a person gallery.
## Tests
Tested in debug mode on my pixel phone.
## Description
### Changes
1. Album corner radius (114 size - 12px corner radius) (100 size - 8px
corner radius)
2. Thumbnail view size 60 - corner radius 4
3. Padding between album thumbnail and Album name is 6
4. Padding between Album name and number of photos is 2
5. Album name (text size) - Small regular , Full black (color)
6. Number of photos (text size) - Mini Regular , Text muted (color)
7. New design for Add album thumbnail
8. Distance between album vertically & horizontally 8px
9. List view border radius 6px and thumbnail radius 4px
## Description
Adds a custom icon for the LaunchDarkly feature flag/automation service.
Icon was taken from their [press
kit](https://launchdarkly.com/press-and-analysts/) and given a hex code
to work on both dark & light modes.
## Tests
n/a
## Description
This PR reduces ambiguity in OTT verification where some users replies
to our mail for verification instead of entering the code in the
application
## Description
This PR updates documentation for users who are self-hosting Ente to
update post_start hook for MinIO provisioning and bucket creation to
work properly with the latest version of MinIO
## Description
This PR fixes the infinite looping due to mc config not being found in
latest server images, which is replaced in favor of mc alias set,
responsible for creating buckets in post_start hook. This should fix the
issue that users run into while using our quickstart script
## Tests
- [x] I have tested with the latest MinIO server image
## Description
## Tests
During testing, i noticed a log saying the ML lock is denied because
stream is getting generated. I hadn't enabled video streaming on that
device.
## Description
- Show smaller clusters (solves
[#4091](https://github.com/ente-io/ente/discussions/4091))
- New suggestions in people page
- Give feedback from file info
- Multi select actions in all people page
- Better face thumbnail caching
## Tests
Tested in debug mode on my pixel phone.
## Description
- [x] Add hash functionality to PeopleHomeWidget to track updation
- [x] Clear hash on albums widget clear
## Tests
- [x] Test if updating different people trigger it or not
Removed @types/ffmpeg-static because their npm page says:
" This package has been deprecated. This is a stub types definition. ffmpeg-static provides its own type definitions, so you do not need this installed."
## Description
- [x] Better HDR Detection
- [x] Code side all options are merged to one with more documentation
- [x] Better cutoff date
- [x] Max FPS 30
- [x] Max height 720p
- [x] Better Tonemapping
- [x] Remove redundant hls time and video bitrate
## Tests
## Description
- This PR updates `quickstart.sh` to prompt user to start cluster, which
acts as a way to modify default configuration.
- Further, indication of usage of MinIO web console is provided in the
`quickstart.sh` in commented form, allowing users to administer the
object storage using web based interface.
- Updation of requirements to provide more clarity in self-hosting
documentation
## Tests
- [x] I have tested these changes on my system
## Description
Note: Review by commit, we have just removed old widget and renamed the
media_kit_new to media_kit.
Previously, while using media_kit, as we were not taking wakeload before
video playback actually starts, the download was getting paused when
dispose was getting called.
Also, increased the file size limit for internal users.
## Tests
## Description
This PR revamps introduction page to be self-contained, eliminating the
need for overview section. Dead configuration,deprecated warning and
inconsistencies have been fixed for Tailscale community guide.
A preview of the updated documentation can be tracked at:
https://ente-wy9m.vercel.app/
## Description
This is very similar to #6182. However instead of the album selection in
the second home tab, it applies to the full albums list.
## Tests
Fixes#6186
## Description
It seems that while trying to show user certificates we broke cleartext
connections. Since having an SSL certificate for self hosted ente
deployments is not mandatory, we shouldn't restrict users from making
cleartext connections
## Description
Previously, back navigation would always go to the home screen, even
when albums are currently selected. This is unexpected because typically
back navigation first deselect everything if anything is selected.
This patch implements this expected behavior for albums on the second
tab. If at least one album is selected, all will be deselected when
going-back. Only when everything is deselect, the app transitions to the
first tab like before.
## Tests
## Description
- Schedule birthday notifications for named persons.
- Minor performance improvements to memories cache decoding
## Tests
Tested in debug mode on my pixel 8:
- [X] Notifications are scheduled at correct time
- [X] Tapping notifications navigates to memory of that person
Add custom icon support for R10.net auth.
## Changes
- Add `r10.svg` icon file to `auth/assets/custom-icons/icons/`
- Add R10.net entry to `custom-icons.json` with proper configuration
- Include alternative names: "R10", "r10.net" for better user matching
## Description
Added 5 new custom SVG icons:
- **cronometer.svg**
- **xai.svg**
- **toshl_finance.svg**
- **aternos.svg**
- **atomic_mail.svg**
Also renamed an existing icon **'mercado_livre.svg'** to
**'mercado_libre.svg'** to match the brand's official name.
## Tests
No formal tests added. Verified manually that all SVGs open correctly in
the browser and display as expected.
## Description
Previously, newly created albums could easily end with trailing
whitespace, especially when using auto-completion that automatically
adds the next space character. It's not super bad obviously, but I found
it slightly annoying. I can't think of any good reason for why an album
name should ever start or end with whitespace.
## Tests
## Description
While linking contact to a person, we were not gracefully handling the
error where email id is already mapped to another person. And when such
person doesn't have any face attached, they don't have any way to unlink
the email from that person entity.
## Tests
## Description
## Tests
For 3.38 GB file on iPhone 11
Old Hashing took 24792 ms
Hashing v2 took 10365 ms
Also tested it on a smaller file
```dart
// Returns the hash for a given file, chunking it in batches of hashChunkSize
Future<Uint8List> cryptoGenericHash(Map<String, dynamic> args) async {
final int startTime = DateTime.now().millisecondsSinceEpoch;
final sourceFile = File(args["sourceFilePath"]);
final sourceFileLength = await sourceFile.length();
final inputFile = sourceFile.openSync(mode: FileMode.read);
final state =
Sodium.cryptoGenerichashInit(null, Sodium.cryptoGenerichashBytesMax);
var bytesRead = 0;
bool isDone = false;
while (!isDone) {
var chunkSize = hashChunkSize;
if (bytesRead + chunkSize >= sourceFileLength) {
chunkSize = sourceFileLength - bytesRead;
isDone = true;
}
final buffer = await inputFile.read(chunkSize);
bytesRead += chunkSize;
Sodium.cryptoGenerichashUpdate(state, buffer);
}
await inputFile.close();
final hash =
Sodium.cryptoGenerichashFinal(state, Sodium.cryptoGenerichashBytesMax);
final int endTime = DateTime.now().millisecondsSinceEpoch;
final hash2 = await cryptoGenericHashV2(args);
final endTime2 = DateTime.now().millisecondsSinceEpoch;
if (hash.length != hash2.length) {
throw Exception(
"Hash length mismatch: ${hash.length} != ${hash2.length}",
);
}
if (!const ListEquality().equals(hash, hash2)) {
throw Exception("not equal: hash");
}
print("Hashing took ${endTime2 - startTime} ms");
print("Hashing v2 took ${endTime2 - endTime} ms");
return hash;
}
Future<Uint8List> cryptoGenericHashV2(Map<String, dynamic> args) async {
final file = File(args["sourceFilePath"]);
final state =
Sodium.cryptoGenerichashInit(null, Sodium.cryptoGenerichashBytesMax);
await for (final chunk in file.openRead()) {
Sodium.cryptoGenerichashUpdate(state, Uint8List.fromList(chunk));
}
return Sodium.cryptoGenerichashFinal(state, Sodium.cryptoGenerichashBytesMax);
}
```
## Description
Previously, when searching for e.g. `test ` would not find an album
called `test`. That's because the trailing whitespace is not ignored. On
mobile this can be especially annoying because sometimes auto-completion
automatically inserts whitespace after a word.
This patch trims whitespace of the search query in two places:
* When searching for an album name when moving photos to an album.
* When using the global search.
## Tests
## Description
There is an annoyingly flashing dialog when creating exiting a newly
created album. The solution is to close the new-album-dialog before
entering the album so that it is not visible anymore when leaving the
album again.
The dialog is closed after the album is created and before routing to
the album. An alternative is to close it directly when tapping on the
Create button, but then the dialog disappears and it might take a while
until the album is opened which feels worse.
Old (note how the dialog is still open when leaving the album):
https://github.com/user-attachments/assets/e57d27af-2339-4ba7-a5d8-be052aede99c
New (note how there is no dialog when leaving the album):
https://github.com/user-attachments/assets/874164a3-9550-4fc3-9144-342b5888dbb7
## Tests
I don't know how to add tests for this.
[eslint] /home/runner/work/ente/ente/web/packages/new/photos/components/ImageEditorOverlay.tsx
[eslint] 1313:41 error This assertion is unnecessary since it does not change the type of the expression @typescript-eslint/no-unnecessary-type-assertion
[eslint] 1325:39 error This assertion is unnecessary since it does not change the type of the expression @typescript-eslint/no-unnecessary-type-assertion
[eslint] 1338:35 error This assertion is unnecessary since it does not change the type of the expression @typescript-eslint/no-unnecessary-type-assertion
[eslint] 1350:41 error This assertion is unnecessary since it does not change the type of the expression @typescript-eslint/no-unnecessary-type-assertion
## Description
This PR introduces the following changes in the documentation:
- Restructuring of sidebar for intuitive navigation for
overview/introduction. **Note:** The content covered by the section
along with rest of the documentation is still under major revision and
the skeleton of the documentation is being provided for easier access to
end-users.
- Updation of information regarding lack of availability of Bucket CORS
for MinIO community edition that's used by compose clusters by default.
- Linting for documentation for consistency with prettier.
## Description
- Refactored PersonFaceWidget into separate FileFaceWidget and
PersonFaceWidget. PersonFaceWidget now only requires a person or cluster
ID, no longer is any file needed
- Face thumbnail choice is now made based on highest face score instead
of recency, meaning less changes in face thumbnails and less re-computes
- More aggressive caching of face thumbnails in memory
- Added option to change person cover from top menu
- Fixed issue with decoding HEIC for face thumbnails on Android
## Tests
Tested in debug mode on my pixel 8.
## Description
User avatar in gallery file element and 'added by' field in file info
were missing for files in public links opened via deeplink. This PR
fixes this issue.
## Description
Update the `subscriptions` table to store the time at which
subscriptions were upgraded (`upgraded_at`).
Reach out to customers who upgraded 7 days ago to make sure all is well.
<img width="628" alt="Screenshot 2025-05-31 at 1 41 09 PM"
src="https://github.com/user-attachments/assets/7d1e970a-c7fa-4666-8d4f-db13ba7c105d"
/>
Store this information within `notification_history` so they are not
contacted again (in case of admin interventions).
> Note: We will not be back-filling data for existing subscriptions.
## Tests
- [x] Tested locally to make sure only customers who upgraded 7 days ago
were pinged.
## Description
Auto dismiss 'On this day' notification at the end of the day. Only on
Android since there's no API for this on iOS.
## Tests
Tested in debug mode on my pixel 8 phone.
First and foremost, thank you for your interest in contributing to Ente 🙏
There are many ways to contribute, and most of them don't require writing code.
* [Spread the word](#spread-the-word)
* [Engage with the community](#engage-with-the-community)
* [Translate](#translate)
* [Document](#document)
- [Spread the word](#spread-the-word)
- [Engage with the community](#engage-with-the-community)
- [Translate](#translate)
- [Document](#document)
## Spread the word
This is perhaps the most impactful contribution you can make. [Spread the
word](https://help.ente.io/photos/features/referral-program/). Online on your
favorite social media channels. Offline to your friends and family who are
looking for a privacy-friendly alternative to big tech.
**This is the most impactful contribution you can make**.
[Spread the word](https://help.ente.io/photos/features/referral-program/). Online on your favorite social media channels. Offline to your friends and family who are looking for a privacy-friendly alternative to big tech.
## Engage with the community
Just hang around, enjoy the vibe. Answer someone's query on our
[Discord](https://discord.gg/z2YVKkycX3), or pile on in the sporadic #off-topic
rants there. Chuckle (or wince!) at our [Twitter](https://twitter.com/enteio)
or upvote the existing ones that you feel we should focus on first. Provide your
opinion on existing threads.
Just hang around, enjoy the vibe. The Ente community — the people who are building Ente, and the people who are using Ente — hang out at various places depending on their proclivity:
These might seem like small things, but it provides us energy. Knowing that
there is a community of people who care for what we are building.
Just being around might seem a small thing, but it provides us energy. Knowing that there is a community of people who care for what we are building, **who want us to do better**.
## Translate
If you're interested in helping out with translation, please visit our Crowdin
to have it added. It is okay to have partial translations. Once ~90% of the
strings in a language get translated, we will start surfacing it in the apps.
Thank you for your support.
## Document
The help guides and FAQs for users of Ente products are also open source, and
@@ -60,25 +48,9 @@ See [docs/](docs/README.md) for how to edit these documents.
## Code contributions
Code is a small aspect of community, and the ways mentioned above are more
important in helping us. But if you'd _really_ like to contribute code, it is
best to start small. Consider some well-scoped changes, say like adding more
[custom icons to auth](auth/docs/adding-icons.md).
If you'd like to contribute code, it is best to start small. Consider some well-scoped changes, say like adding more [custom icons to auth](auth/docs/adding-icons.md), or fixing a specific bug.
Each of the individual product/platform specific directories in this repository
have instructions on setting up a dev environment.
For anything beyond trivial bug fixes, please use [features requests and
discussions](https://github.com/ente-io/ente/discussions) instead of performing
code changes directly.
> [!TIP]
>
> Please remember that code is a important, but small, part of the overall big
> picture that makes a product a joy to use. Something that's easy in code is
> not necessarily the right choice for the product as a whole. So we'll repeat -
> there are other ways to contribute than code that we'd request you to
> consider.
Code that changes the behaviour of the product might not get merged, at least not initially. The PR can serve as a discussion bed, but you might find it easier to just start a discussion instead, or post your perspective in the (likely) existing thread about the behaviour change or new feature you wish for.
@@ -10,8 +10,9 @@ A guide written by Green, an ente.io lover
> [!WARNING]
>
> Authy has dropped all support for its desktop apps. It is no longer possible
> to export data from Authy using methods 1 and 2. You will need either an iOS device
> and computer (method 4) or a rooted Android phone (method 3) to follow this guide.
> to export data from Authy using methods 1 and 2. You will need either an iOS
> device and computer (method 4) or a rooted Android phone (method 3) to follow
> this guide.
---
@@ -204,11 +205,24 @@ This uses the tool [Aegis Authenticator](https://getaegis.app/) from
## Method 4: Authy-iOS-MiTM
**Who should use this?** Technical iOS users of Authy that cannot export their tokens with methods 1 or 2 (due to those methods being patched) or method 3 (due to that method requiring a rooted Android device).
**Who should use this?** Technical iOS users of Authy that cannot export their
tokens with methods 1 or 2 (due to those methods being patched) or method 3 (due
to that method requiring a rooted Android device).
This method works by intercepting the data the Authy app receives while logging in for the first time, which contains your encrypted authenticator tokens. After the encrypted authenticator tokens are dumped, you can decrypt them using your backup password and convert them to an Ente token file.
This method works by intercepting the data the Authy app receives while logging
in for the first time, which contains your encrypted authenticator tokens. After
the encrypted authenticator tokens are dumped, you can decrypt them using your
backup password and convert them to an Ente token file.
For an up-to-date guide of how to retrieve the encrypted authenticator tokens and decrypt them, please see [Authy-iOS-MiTM](https://github.com/AlexTech01/Authy-iOS-MiTM). To convert the `decrypted_tokens.json` file from that guide into a format Ente Authenticator can recognize, use [this](https://gist.github.com/gboudreau/94bb0c11a6209c82418d01a59d958c93?permalink_comment_id=5317087#gistcomment-5317087) Python script. Once you have the `ente_auth_import.plain` file from that script, transfer it to your device and follow the instructions below to import it into Ente Authenticator.
For an up-to-date guide of how to retrieve the encrypted authenticator tokens
and decrypt them, please see
[Authy-iOS-MiTM](https://github.com/AlexTech01/Authy-iOS-MiTM). To convert the
`decrypted_tokens.json` file from that guide into a format Ente Authenticator
@@ -7,9 +7,10 @@ description: Frequently asked questions about keeping extra backups of your data
## How can I backup my data in a local drive outside Ente?
You can use our CLI tool or our desktop app to set up exports of your data
to your local drive. This way, you can use Ente in your day to day use, with an additional guarantee that a copy of your original photos and videos are
always available on your machine.
You can use our CLI tool or our desktop app to set up exports of your data to
your local drive. This way, you can use Ente in your day to day use, with an
additional guarantee that a copy of your original photos and videos are always
available on your machine.
- You can use [Ente's CLI](https://github.com/ente-io/ente/tree/main/cli#export)
to export your data in a cron job to a location of your choice. The exports
@@ -26,7 +26,6 @@ unsupported file format and we will do our best to help you out.
Yes, we currently do not support files larger than 4 GB.
## Does Ente support videos?
Ente supports backing up and downloading of videos in their original format and
@@ -101,29 +100,53 @@ clicking on "Your map" under "Locations" on the search screen.
## How to reset my password if I lost it?
On the login page, enter your email and click on Forgot Password. Then, enter your recovery key and create a new password.
On the login page, enter your email and click on Forgot Password. Then, enter
your recovery key and create a new password.
# iOS Album Backup and Organization in Ente
## Can I search for photos using the descriptions I’ve added?
### How does Ente handle photos that are part of multiple iOS albums?
When you select multiple albums for backup, Ente prioritizes uploading each photo to the album with the fewest photos. This means a photo will only be uploaded once, even if it exists in multiple albums on your device. If you create new albums on your device after the initial backup, those photos may not appear in the corresponding Ente album if they were already uploaded to a different album.
Yes, descriptions are searchable, making it easier to find specific photos
later. To do this, open the photo, tap the (i) button, and enter your
description.
## How does the deduplication feature work on the desktop app?
### Why don’t all photos from a new iOS album appear in the corresponding Ente album?
If you create a new album on your device after the initial backup, the photos in that album may have already been uploaded to another album in Ente. To fix this, go to the "On Device" album in Ente, select all photos, and manually add them to the corresponding album in Ente.
If the app finds exact duplicates, it will show them in the deduplication. When
you delete a duplicate, the app keeps one copy and creates a symlink for the
other duplicate. This helps save storage space.
### What happens if I reorganize my photos in the iOS Photos app after backing up?
Reorganizing photos in the iOS Photos app (e.g., moving photos to new albums) won’t automatically reflect in Ente. You’ll need to manually add those photos to the corresponding albums in Ente to maintain consistency.
## What happens if I lose access to my email address? Can I use my recovery key to bypass email verification?
### Can I search for photos using the descriptions I’ve added?
Yes, descriptions are searchable, making it easier to find specific photos later.
To do this, open the photo, tap the (i) button, and enter your description.
### How does the deduplication feature work on the desktop app?
If the app finds exact duplicates, it will show them in the deduplication. When you delete a duplicate, the app keeps one copy and creates a symlink for the other duplicate. This helps save storage space.
### What happens if I lose access to my email address? Can I use my recovery key to bypass email verification?
No, the recovery key does not bypass email verification. For security reasons, we do not disable or bypass email verification unless the account owner reaches out to us and successfully verifies their identity by providing details about their account.
No, the recovery key does not bypass email verification. For security reasons,
we do not disable or bypass email verification unless the account owner reaches
out to us and successfully verifies their identity by providing details about
their account.
If you lose access to your email, please contact our support team at
support@ente.io
---
# iOS Album Backup and Organization in Ente
## How does Ente handle photos that are part of multiple iOS albums?
When you select multiple albums for backup, Ente prioritizes uploading each
photo to the album with the fewest photos. This means a photo will only be
uploaded once, even if it exists in multiple albums on your device. If you
create new albums on your device after the initial backup, those photos may not
appear in the corresponding Ente album if they were already uploaded to a
different album.
## Why don’t all photos from a new iOS album appear in the corresponding Ente album?
If you create a new album on your device after the initial backup, the photos in
that album may have already been uploaded to another album in Ente. To fix this,
go to the "On Device" album in Ente, select all photos, and manually add them to
the corresponding album in Ente.
## What happens if I reorganize my photos in the iOS Photos app after backing up?
Reorganizing photos in the iOS Photos app (e.g., moving photos to new albums)
won’t automatically reflect in Ente. You’ll need to manually add those photos to
the corresponding albums in Ente to maintain consistency.
description: "Information about all the Environment Variables needed to run Ente"
description:
"Information about all the Environment Variables needed to run Ente"
---
# Environment variables and ports
A self-hosted Ente instance requires specific endpoints in both Museum (the server) and web apps. This document outlines the essential environment variables and port mappings of the web apps.
A self-hosted Ente instance requires specific endpoints in both Museum (the
server) and web apps. This document outlines the essential environment variables
and port mappings of the web apps.
Here's the list of important variables that a self hoster should know about:
@@ -12,34 +16,33 @@ Here's the list of important variables that a self hoster should know about:
1.`NEXT_PUBLIC_ENTE_ENDPOINT`
The above environment variable is used to configure Museums endpoint. Where Museum is
running and which port it is listening on. This endpoint should be configured for
all the apps to connect to your self hosted endpoint.
The above environment variable is used to configure Museums endpoint. Where
Museum is running and which port it is listening on. This endpoint should be
configured for all the apps to connect to your self hosted endpoint.
All the apps (regardless of platform) by default connect to api.ente.io - which is
our production instance of Museum.
All the apps (regardless of platform) by default connect to api.ente.io - which
is our production instance of Museum.
### Web Apps
> [!IMPORTANT]
> Web apps don't need to be configured with the below endpoints. Web app environment
> variables are being documented here just so that the users know everything in detail.
> Checkout [Configuring your Server](/self-hosting/museum) to configure endpoints for
> [!IMPORTANT] Web apps don't need to be configured with the below endpoints.
> Web app environment variables are being documented here just so that the users
> know everything in detail. Checkout
> [Configuring your Server](/self-hosting/museum) to configure endpoints for
> particular app.
In Ente, all the web apps are separate NextJS applications. Therefore, they are all
configured via environment variables. The photos app (Ente Photos) has information
about and connects to other web apps like albums, cast, etc.
In Ente, all the web apps are separate NextJS applications. Therefore, they are
all configured via environment variables. The photos app (Ente Photos) has
information about and connects to other web apps like albums, cast, etc.
1.`NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT`
This environment variable is used to configure and declare the endpoint for the Albums
web app.
This environment variable is used to configure and declare the endpoint for the
Albums web app.
## Ports
The below format is according to how ports are mapped in Docker.
The below format is according to how ports are mapped in Docker.
description: Guides for self-hosting Ente Photos and/or Ente Auth with Tailscale
---
# Guide
This guide aims to achieve self-hosting Ente photos or Ente-Auth with tailscale (TSDPROXY) without exposing any port OR if someone is behind CGNAT and cannot open any port on the internet but want to run their own selfhosted service for themselves, friends and family only.
This guide aims to achieve self-hosting Ente photos or Ente-Auth with tailscale
(TSDPROXY) without exposing any port OR if someone is behind CGNAT and cannot
open any port on the internet but want to run their own selfhosted service for
themselves, friends and family only.
Before getting start keep the following NOTE in mind.
> [!NOTE]
> If someone is behind double or triple CGNAT; must install tailscale system wide by running `curl -fsSL https://tailscale.com/install.sh | sh` in your linux terminal and `sudo tailscale up` otherwise dns resolver will fail and uploading will not work. This is not necessary for those who are not behing CGNAT.
> This guide also work on docker rootless and normal.
> [!NOTE] If someone is behind double or triple CGNAT; must install tailscale
> system wide by running `curl -fsSL https://tailscale.com/install.sh | sh` in
> your linux terminal and `sudo tailscale up` otherwise dns resolver will fail
> and uploading will not work. This is not necessary for those who are not
> behing CGNAT. This guide also work on docker rootless and normal.
> [!CAUTION]
Remember that current docker update 28.0.0 has some bug and cannot connect to external network. Make sure to install docker-ce 27.5.0, docker-ce-rootless-extras 27.5.0 and docker-ce-cli 27.5.0. Hopefully docker 28.1.0 will resolve this issue in next week. Refrence links are [Moby Github Repo Issues 49511](https://github.com/moby/moby/issues/49511) and [Moby Github Repo Issues 49519](https://github.com/moby/moby/issues/49519)
> [!IMPORTANT]
> For Docker rootless, the user must have local permissions for all directories required by the Ente-photos self-hosted server. This can be achieved by running `sudo chown -R 1000:1000 /home/ubuntu/docker/ente`. In the Linux terminal, you can check the UID with `id -u` or simply `id`. The first user typically has UID 1000.
> To allow listening and pinging on any port without root privileges, create a file called `/etc/sysctl.d/99-rootless.conf` with the following content:
> [!IMPORTANT] For Docker rootless, the user must have local permissions for all
> directories required by the Ente-photos self-hosted server. This can be
> achieved by running `sudo chown -R 1000:1000 /home/ubuntu/docker/ente`. In the
> Linux terminal, you can check the UID with `id -u` or simply `id`. The first
> user typically has UID 1000. To allow listening and pinging on any port
> without root privileges, create a file called `/etc/sysctl.d/99-rootless.conf`
> with the following content:
>
> ```
> net.ipv4.ip_unprivileged_port_start=0
> net.ipv4.ping_group_range = 0 2147483647
> ```
> than run `sudo sysctl --system`.
> Create `~/.config/systemd/user/docker.service.d/override.conf` with the following content:
>
> then run `sudo sysctl --system`. Create
> `~/.config/systemd/user/docker.service.d/override.conf` with the following
> Instead of`--volume /var/run/docker.sock:/var/run/docker.sock` in TSDPROXY compose.yaml, use `--volume $XDG_RUNTIME_DIR/docker.sock:/var/run/docker.sock`
>
> and Restart the docker daemon`systemctl --user restart docker` Instead of
> `--volume /var/run/docker.sock:/var/run/docker.sock` in TSDPROXY compose.yaml,
> use `--volume $XDG_RUNTIME_DIR/docker.sock:/var/run/docker.sock`
## GETTING START WITH SETUP
First of all create a directory
`sudo mkdir -p /home/ubuntu/docker/tsdproxy/config` then `cd docker/tsdproxy`
and create compose.yaml file by running `sudo nano compose.yaml`. Populate it
with the following:
## GETTING START WITH SETUP ##
First of all create a directory `sudo mkdir -p /home/ubuntu/docker/tsdproxy/config` than `cd docker/tsdproxy` and create compose.yaml file by running `sudo nano compose.yaml`. Populate it with the following:
```
services:
tsdproxy:
@@ -62,9 +79,18 @@ networks:
proxy:
name: proxy
```
Now login into your tailscale account admin counsle > settings > keys > Generate authkey. Give any description and must select resuable, because the key get purged if not selected after rebooting machine. It is advisable to create **Tags** in **ACLs settings**`tag: tsdproxy``tag: ente``tag: minio` as well. This will create a tag nodes with no key expirory. One is safe to reboot restart docker or machine.
> Copy the generated authkey as it is shown only once.
Make tsdproxy.yaml file in `cd docker/tsdproxy/config` by running `sudo nano tsdproxy.yaml` and pupolate it with the following contant:
Now login into your tailscale account admin counsle > settings > keys > Generate
authkey. Give any description and must select resuable, because the key get
purged if not selected after rebooting machine. It is advisable to create
**Tags** in **ACLs settings**`tag: tsdproxy``tag: ente``tag: minio` as well.
This will create a tag nodes with no key expirory. One is safe to reboot restart
docker or machine.
> Copy the generated authkey as it is shown only once. Make tsdproxy.yaml file
> in `cd docker/tsdproxy/config` by running `sudo nano tsdproxy.yaml` and
> pupolate it with the following contant:
```
defaultproxyprovider: default
docker:
@@ -87,12 +113,20 @@ log:
json: false
proxyaccesslog: true
```
In the same directory run `sudo nano authkey` and paste the authkey just copied earlier from tailscale admin counsel.
> Here Tailscale (TSDPROXY) setup is complet in all respect. Just run `docker compose up -d`. Check your tailscale amdin counsel and you will see tsdproxy node up and running. Make sure that **HTTPS** is enabled in tailscale DNS settings.
> You can visit the TSDPROXY web GUI by https://tsdproxy.xyz.ts.net. (xyz is change value for everyone)
## ente Part ##
In the same directory run `sudo nano authkey` and paste the authkey just copied
earlier from tailscale admin counsel.
> Here Tailscale (TSDPROXY) setup is complet in all respect. Just run
> `docker compose up -d`. Check your tailscale amdin counsel and you will see
> tsdproxy node up and running. Make sure that **HTTPS** is enabled in tailscale
> DNS settings. You can visit the TSDPROXY web GUI by
> https://tsdproxy.xyz.ts.net. (xyz is change value for everyone)
## ente Part
First make the following necessary files/directories:
Than give user permission for each of the above directory. `sudo chown -R 1000:1000 /home/ubuntu/docker/ente/custom-logs` etc etc. Make sure not to skip `/home/ubuntu/docker/tsdproxy/config`
`cd docker/ente/script/compose` and run `sudo nano credentials.yaml` than populate it with the following:
Than give user permission for each of the above directory.
`sudo chown -R 1000:1000 /home/ubuntu/docker/ente/custom-logs` etc etc. Make
sure not to skip `/home/ubuntu/docker/tsdproxy/config`
`cd docker/ente/script/compose` and run `sudo nano credentials.yaml` than
populate it with the following:
```
db:
host: postgres
@@ -134,7 +173,9 @@ s3:
bucket: scw-eu-fr-v3
```
In the same directory run `sudo nano minio-provision.sh` and populate it with the following contant:
In the same directory run `sudo nano minio-provision.sh` and populate it with
the following contant:
```
#!/bin/sh
@@ -154,7 +195,9 @@ mc mb -p wasabi-eu-central-2-v3
mc mb -p scw-eu-fr-v3
```
Now `cd docker/ente` and run `sudo nano docker-compose.yaml` and populate it with the following:
Now `cd docker/ente` and run `sudo nano docker-compose.yaml` and populate it
with the following:
```
services:
museum:
@@ -255,32 +298,52 @@ services:
networks:
ente:
name: ente
proxy:
external: true
```
> Thats it. Run `docker compose up -d`. Wait till every container become healthy. Open web browser. Make sure tailscale is installed on the machine. Visit https://ente.xyz.ts.net/ping. It will pong. All good if you see it. First time it will take minute or two to get SSL cert. Downnload Desktop or mobile app. Tap 7 time on the screen, which will prompt developer mode. Add https://ente.xyz.ts.net. Add new user. When asked for OTP. Just go to linux terminal and run `docker logs ente-museum-1`. Search for userauth. Feed the six digit and Done.
> Thats it. Run `docker compose up -d`. Wait till every container become
> healthy. Open web browser. Make sure tailscale is installed on the machine.
> Visit https://ente.xyz.ts.net/ping. It will pong. All good if you see it.
> First time it will take minute or two to get SSL cert. Downnload Desktop or
> mobile app. Tap 7 time on the screen, which will prompt developer mode. Add
> https://ente.xyz.ts.net. Add new user. When asked for OTP. Just go to linux
> terminal and run `docker logs ente-museum-1`. Search for userauth. Feed the
> six digit and Done.
> For getting 100TB (limitless) storage. Just Install ente-cli for windows.
> Extract it and add folder. Name it **export**. Add config.yaml file along and
> populate it with the following:
> For getting 100TB (limitless) storage. Just Install ente-cli for windows. Extract it and add folder. Name it **export**. Add config.yaml file along and populate it with the following:
```
endpoint:
api: "https://ente.xyz.ts.net"
accounts: "http://localhost:3001"
log: false
```
Right-Click in the directory where you have extracted ente-cli. Select `open in terminal`. Run
Right-Click in the directory where you have extracted ente-cli. Select
`open in terminal`. Run
```
.\ente.exe account bob # change bob to yours
```
Hit Enter twice.
For export directory, just write export. As already created**export** folder earlier.
**Write email. The one which is already used befor when creating ente account in ente desktop app.**
Type the same Password used before for the account.Run
Hit Enter twice. For export directory, just write export. As already created
**export** folder earlier. **Write email. The one which is already used befor
when creating ente account in ente desktop app.** Type the same Password used
before for the account.Run
```
.\ente.ext account list
```
This will list all account details. Copy Acount ID.
> Navigate to museum.yaml file. `cd docker/ente`. Run `sudo nano museum.yaml` and add the account ID under Admins. Delete any previous entries.
Restart ente-museum-1 container from linux terminal. Run `docker restart ente-museum-1`. All well, now you will have 100TB storage. Repeat if for any other accounts you want to give unlimited storage access.
> Navigate to museum.yaml file. `cd docker/ente`. Run `sudo nano museum.yaml`
> and add the account ID under Admins. Delete any previous entries. Restart
> ente-museum-1 container from linux terminal. Run
> `docker restart ente-museum-1`. All well, now you will have 100TB storage.
> Repeat if for any other accounts you want to give unlimited storage access.
Any Linux or \*nix operating system, Ubuntu or Debian is recommended to have a
good Docker experience. Non-Linux operating systems tend to provide poor
experience with Docker and difficulty with troubleshooting and assistance.
#### Docker
Required for running Ente's server, web application and dependent services
(database and object storage)
## Getting started
Run this command on your terminal to setup Ente.
@@ -28,12 +40,17 @@ sh -c "$(curl -fsSL https://raw.githubusercontent.com/ente-io/ente/main/server/q
```
The above `curl` command pulls the Docker image, creates a directory `my-ente`
in the current working directory and starts all containers required to run Ente.
in the current working directory, prompts to start the cluster and starts all the containers required to run Ente.


> [!TIP] Important:
> If you have used quickstart for self-hosting Ente and are facing issues while > trying to run the cluster due to MinIO buckets not being created, please check [troubleshooting MinIO](/self-hosting/troubleshooting/docker#minio-provisioning-error)
description: Fixing docker related errors when trying to self host Ente
---
@@ -34,30 +34,30 @@ perform the same configuration by removing the "post_start" hook, and adding a
new service definition:
```yaml
minio-provision:
minio-provision:
image:minio/mc
depends_on:
- minio
- minio
volumes:
- minio-data:/data
- minio-data:/data
networks:
- internal
- internal
entrypoint:|
sh -c '
#!/bin/sh
sh -c '
#!/bin/sh
while ! mc config host add h0 http://minio:3200 changeme changeme1234
do
echo "waiting for minio..."
sleep 0.5
done
while ! mc alias set h0 http://minio:3200 your_minio_user your_minio_pass
do
echo "waiting for minio..."
sleep 0.5
done
cd /data
cd /data
mc mb -p b2-eu-cen
mc mb -p wasabi-eu-central-2-v3
mc mb -p scw-eu-fr-v3
'
mc mb -p b2-eu-cen
mc mb -p wasabi-eu-central-2-v3
mc mb -p scw-eu-fr-v3
'
```
## start_interval
@@ -114,7 +114,7 @@ volumes.
If you're sure of what you're doing, the volumes can be deleted by
```
```sh
docker volume ls
```
@@ -124,7 +124,54 @@ to list them, and then delete the ones that begin with `my-ente` using
that'll delete all volumes (Ente or otherwise) on your machine that are not
currently in use by a running docker container.
An alternative way is to delete the volumes along with removal of cluster's
containers using `docker compose` inside `my-ente` directory.
```sh
docker compose down --volumes
```
If you're unsure about removing volumes, another alternative is to rename your
`my-ente` folder. Docker uses the folder name to determine the volume name
prefix, so giving it a different name will cause Docker to create a volume
afresh for it.
## MinIO provisioning error
If you have used our quickstart script for self-hosting Ente (new users will be unaffected) and are using the default MinIO container for object storage, you may run into issues while starting the cluster after pulling latest images with provisioning MinIO and creating buckets.
You may encounter similar logs while trying to start the cluster:
```
my-ente-minio-1 -> | Waiting for minio...
my-ente-minio-1 -> | Waiting for minio...
my-ente-minio-1 -> | Waiting for minio...
```
MinIO has deprecated the `mc config` command in favor of `mc alias set` resulting in failure in execution of the command for creating bucket using `post_start` hook.
This can be resolved by changing `mc config host h0 add http://minio:3200 $minio_user $minio_pass` to `mc alias set h0 http://minio:3200 $minio_user $minio_pass`
Thus the updated `post_start` will look as follows for `minio` service:
``` yaml
minio:
...
post_start:
- command: |
sh -c '
#!/bin/sh
while ! mc alias set h0 http://minio:3200 your_minio_user your_minio_pass 2>/dev/null
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.