Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
a316ba3
fix: shared check for server setup availability (#30311)
bo0tzz Jul 30, 2026
6afcc39
chore: sequence pnpm installs in mise tasks (#30412)
bo0tzz Jul 30, 2026
6e1e795
chore: install mise tools from the lockfile in the server image (#30416)
bo0tzz Jul 30, 2026
7c44c29
chore: deflake album to asset backfill sync test (#30417)
bo0tzz Jul 30, 2026
4a68a87
fix: use trixie-slim base image for cli and e2e-auth-server (#30411)
bo0tzz Jul 30, 2026
9a143f0
chore(mobile): remove Pigeon generated code (#30343)
agg23 Jul 30, 2026
858aead
chore(mobile): Apply stricter linting rules for Flutter and known iss…
agg23 Jul 30, 2026
56fbca9
chore: skip e2e tests when the stack fails to start (#30414)
bo0tzz Jul 30, 2026
9732beb
fix(server): store null instead of empty string for user password (#3…
deveshkolte Jul 30, 2026
7149dd8
fix(docs): remove listing unraid as an "official" deployment (#30323)
mmomjian Jul 30, 2026
6b99f02
fix(docs): Revise config file instructions and notes (#30418)
mmomjian Jul 30, 2026
e7aace4
chore(mobile): Apply stricter linting rules for correctness (#30372)
agg23 Jul 30, 2026
6b6058c
feat: store null instead of empty string for album.description (#30123)
gPinato Jul 30, 2026
aa565f5
chore(deps): update github-actions (major) (#30309)
renovate[bot] Jul 30, 2026
2fa07c0
chore(deps): update grafana/grafana docker tag to v12.4.6-ubuntu (#30…
renovate[bot] Jul 30, 2026
0f4ddda
fix: migration order (#30424)
jrasm91 Jul 30, 2026
56ce717
chore(deps): update dependency opentofu to v1.12.5 (#30299)
renovate[bot] Jul 30, 2026
405020e
chore: enable use_build_context_synchronously lint (#30367)
shenlong-tanwen Jul 30, 2026
fe5c8ed
refactor: base action (#29617)
jrasm91 Jul 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/pr-labeler.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@ jobs:
permission-contents: read
permission-pull-requests: write

- uses: actions/labeler@b8dd2d9be0f68b860e7dae5dae7d772984eacd6d # v6.2.0
- uses: actions/labeler@bf12e9b00b37c5c0ca2b87b79b2daf7891dbda13 # v7.0.0
with:
repo-token: ${{ steps.token.outputs.token }}
2 changes: 1 addition & 1 deletion .github/workflows/prepare-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ jobs:

# TODO move to mise
- name: Install uv
uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2
uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0

- name: Bump version
env:
Expand Down
12 changes: 7 additions & 5 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -441,20 +441,21 @@ jobs:
if: ${{ !cancelled() }}

- name: Start Docker Compose
id: docker
run: docker compose up -d --build --renew-anon-volumes --force-recreate --remove-orphans --wait --wait-timeout 300
if: ${{ !cancelled() }}

- name: Run e2e tests (api & cli)
env:
VITEST_DISABLE_DOCKER_SETUP: true
run: pnpm test
if: ${{ !cancelled() }}
if: ${{ !cancelled() && steps.docker.outcome == 'success' }}

- name: Run e2e tests (maintenance)
env:
VITEST_DISABLE_DOCKER_SETUP: true
run: pnpm test:maintenance
if: ${{ !cancelled() }}
if: ${{ !cancelled() && steps.docker.outcome == 'success' }}

- name: Capture Docker logs
if: always()
Expand Down Expand Up @@ -519,14 +520,15 @@ jobs:
if: ${{ !cancelled() }}

- name: Docker build
id: docker
run: docker compose up -d --build --renew-anon-volumes --force-recreate --remove-orphans --wait --wait-timeout 300
if: ${{ !cancelled() }}

- name: Run e2e tests (web)
env:
PLAYWRIGHT_DISABLE_WEBSERVER: true
run: pnpm test:web
if: ${{ !cancelled() }}
if: ${{ !cancelled() && steps.docker.outcome == 'success' }}

- name: Archive e2e test (web) results
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
Expand All @@ -539,7 +541,7 @@ jobs:
env:
PLAYWRIGHT_DISABLE_WEBSERVER: true
run: pnpm test:web:ui
if: ${{ !cancelled() }}
if: ${{ !cancelled() && steps.docker.outcome == 'success' }}

- name: Archive ui test (web) results
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
Expand All @@ -552,7 +554,7 @@ jobs:
env:
PLAYWRIGHT_DISABLE_WEBSERVER: true
run: pnpm test:web:maintenance
if: ${{ !cancelled() }}
if: ${{ !cancelled() && steps.docker.outcome == 'success' }}

- name: Archive maintenance tests (web) results
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
Expand Down
44 changes: 22 additions & 22 deletions deployment/mise.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion deployment/mise.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tools]
terragrunt = "1.1.1"
opentofu = "1.12.4"
opentofu = "1.12.5"

[tasks."tg:fmt"]
run = "terragrunt hclfmt"
Expand Down
2 changes: 1 addition & 1 deletion docker/docker-compose.prod.yml
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ services:
command: ['./run.sh', '-disable-reporting']
ports:
- 3000:3000
image: grafana/grafana:12.4.5-ubuntu@sha256:00396460e499415c828b7c298f19287c8a0f95e72412ee37ac11723655c2d6b9
image: grafana/grafana:12.4.6-ubuntu@sha256:35c75489ff2e2e69c53977a180de491643d51fdb32108f9335317527978daed7
volumes:
- grafana-data:/var/lib/grafana

Expand Down
14 changes: 11 additions & 3 deletions docs/docs/install/config-file.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,18 @@ sidebar_position: 100

A config file can be provided as an alternative to the UI configuration.

:::note Interaction with the web UI
While the config file does not need to include all keys from the below example, specifying `IMMICH_CONFIG_FILE` will disable the ability to edit other properties from the Immich web UI.
:::

### Step 1 - Create a new config file

In JSON format, create a new config file (e.g. `immich.json`) and put it in a location mounted in the container that can be accessed by Immich.
In JSON format, create a new config file (e.g. `immich-config.json`) and put it in a location mounted in the container that can be accessed by Immich.
YAML-formatted config files are also supported.
The default configuration looks like this:

<details>
<summary>immich.json</summary>
<summary>immich-config.json</summary>

```json
{
Expand Down Expand Up @@ -250,6 +254,10 @@ So you can just grab it from there, paste it into a file and you're pretty much

### Step 2 - Specify the file location

:::note
If you have any `microservices` workers, they will also need to have the config file mounted to their container.
:::

In your `.env` file, set the variable `IMMICH_CONFIG_FILE` to the path of your config.
For more information, refer to the [Environment Variables](/install/environment-variables.md) section.

Expand All @@ -261,7 +269,7 @@ It is recommended to reuse this variable in your `docker-compose.yml`:

```yaml
volumes:
- ./configuration.yml:${IMMICH_CONFIG_FILE}
- ./immich-config.json:${IMMICH_CONFIG_FILE}
```

:::
2 changes: 1 addition & 1 deletion docs/docs/install/environment-variables.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ These environment variables are used by the `docker-compose.yml` file and do **N
| `IMMICH_PROCESS_INVALID_IMAGES` | When `true`, generate thumbnails for invalid images | | server | microservices |
| `IMMICH_TRUSTED_PROXIES` | List of comma-separated IPs set as trusted proxies | | server | api |
| `IMMICH_IGNORE_MOUNT_CHECK_ERRORS` | See [System Integrity](/administration/system-integrity) | | server | api, microservices |
| `IMMICH_ALLOW_SETUP` | When `false` disables the `/auth/admin-sign-up` endpoint | `true` | server | api |
| `IMMICH_ALLOW_SETUP` | When `false` disables the `/auth/admin-sign-up` and `/admin/database-backups/start-restore` endpoints | `true` | server | api |

\*1: `TZ` should be set to a `TZ identifier` from [this list][tz-list]. For example, `TZ="Etc/UTC"`.
`TZ` is used by `exiftool` as a fallback in case the timezone cannot be determined from the image metadata. It is also used for logfile timestamps and cron job execution.
Expand Down
16 changes: 11 additions & 5 deletions docs/docs/install/unraid.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
---
sidebar_position: 60
sidebar_position: 70
---

# Unraid
# Unraid [ Community ]

:::note
This is a community contribution and not officially supported by the Immich team, but included here for convenience.

Community support can be found in the dedicated channel on the [Discord Server](https://discord.immich.app/).
:::

Immich can easily be installed and updated on Unraid via:

1. [Docker Compose Manager](https://forums.unraid.net/topic/114415-plugin-docker-compose-manager/) plugin from the Unraid Community Apps
2. Community made template on the Unraid Community Apps
1. Community made template on the Unraid Community Apps
2. [Docker Compose Manager](https://forums.unraid.net/topic/114415-plugin-docker-compose-manager/) plugin from the Unraid Community Apps

## Community Applications Template

Expand All @@ -23,7 +29,7 @@ Once you have Redis and PostgreSQL running, search for Immich on the Unraid CA,

For more information about setting up the community image see [here](https://github.com/imagegenius/docker-immich#application-setup)

## Docker-Compose Method (Official)
## Docker-Compose Method

:::info

Expand Down
17 changes: 9 additions & 8 deletions e2e/mise.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[tasks.install]
run = "pnpm install --filter immich-e2e --frozen-lockfile"
run = "pnpm install --filter immich-e2e... --frozen-lockfile"

[tasks.build]
dir = "{{ config_root }}"
Expand Down Expand Up @@ -40,18 +40,19 @@ run = "tsc --noEmit"


[tasks.ci-setup]
depends = [
"//:sdk:install",
"//:sdk:build",
"//packages/cli:install",
"//packages/cli:build",
run = [
{ task = "//:sdk:install" },
{ task = "//:sdk:build" },
{ task = "//packages/cli:install" },
{ task = "//packages/cli:build" },
{ task = ":install" },
]
run = { task = ":install" }


[tasks.ci-unit]
depends = ["//:sdk:install", "//:sdk:build"]
run = [
{ task = "//:sdk:install" },
{ task = "//:sdk:build" },
{ task = ":install" },
{ task = ":format" },
{ task = ":lint" },
Expand Down
3 changes: 0 additions & 3 deletions e2e/src/responses.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,6 @@ export const errorDto = {
incorrectLogin: {
message: 'Incorrect email or password',
},
alreadyHasAdmin: {
message: 'The server already has an admin',
},
};

export const signupResponseDto = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ describe('/admin/database-backups', () => {
const { status, body } = await request(app).post('/admin/database-backups/start-restore').send();

expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest('The server already has an admin'));
expect(body).toEqual(errorDto.badRequest('Admin setup is not available'));
});

it.sequential('should enter maintenance mode in "database restore mode"', async () => {
Expand Down
44 changes: 22 additions & 22 deletions mise.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion mise.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ config_roots = [
node = "24.15.0"
pnpm = "11.13.1"
terragrunt = "1.1.1"
opentofu = "1.12.4"
opentofu = "1.12.5"
"npm:@openapitools/openapi-generator-cli" = "2.40.1"
"npm:oazapfts" = "7.5.0"
"github:extism/cli" = "1.6.3"
Expand Down
5 changes: 5 additions & 0 deletions mobile/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,11 @@
lib/**/*.drift.dart
test/drift/main/generated/

# Pigeon related
/lib/platform/*.g.dart
/ios/**/*.g.swift
/android/**/*.g.kt

# Web related
lib/generated_plugin_registrant.dart

Expand Down
Loading
Loading