# Install Zitadel on Linux

Be aware! This guide does not work for the newly updated version of Zitadel 4! [Learn more](https://github.com/zitadel/zitadel/issues/10526)

Please use Docker version if you want to use Zitadel 4.

## [Install PostgreSQL](/content/docs/self-hosting/deploy/linux#install-postgre-sql/index.html)

Download a `postgresql` binary as described [in the PostgreSQL docs](https://www.postgresql.org/download/linux/).
Zitadel is tested against PostgreSQL latest stable tag and latest Ubuntu LTS.

## [Run PostgreSQL](/content/docs/self-hosting/deploy/linux#run-postgre-sql/index.html)

```
sudo systemctl start postgresql
sudo systemctl enable postgresql
```

## [Install Zitadel](/content/docs/self-hosting/deploy/linux#install-zitadel/index.html)

Download the Zitadel release according to your architecture from [Github](https://github.com/zitadel/zitadel/releases/latest), unpack the archive and copy zitadel binary to /usr/local/bin

```
LATEST=$(curl -i https://github.com/zitadel/zitadel/releases/latest | grep location: | cut -d '/' -f 8 | tr -d '\r'); ARCH=$(uname -m); case $ARCH in armv5*) ARCH="armv5";; armv6*) ARCH="armv6";; armv7*) ARCH="arm";; aarch64) ARCH="arm64";; x86) ARCH="386";; x86_64) ARCH="amd64";;  i686) ARCH="386";; i386) ARCH="386";; esac; wget -c https://github.com/zitadel/zitadel/releases/download/$LATEST/zitadel-linux-$ARCH.tar.gz -O - | tar -xz && sudo mv zitadel-linux-$ARCH/zitadel /usr/local/bin
```

## [Run Zitadel](/content/docs/self-hosting/deploy/linux#run-zitadel/index.html)

```
ZITADEL_DATABASE_POSTGRES_DSN=postgresql://root:postgres@localhost:5432/postgres?sslmode=disable ZITADEL_EXTERNALSECURE=false zitadel start-from-init --masterkey "MasterkeyNeedsToHave32Characters" --tlsMode disabled
```

Visit [http://localhost:8080/ui/console?login_hint=zitadel-admin@zitadel.localhost](http://localhost:8080/ui/console?login_hint=zitadel-admin@zitadel.localhost) and enter `Password1!` to log in.

This guide is based on a local setup.
If you encounter an error "Instance Not Found" please read the following section:
[Instance not found](/content/docs/self-hosting/deploy/troubleshooting/troubleshooting#instance-not-found/index.html)

## [VideoGuide](/content/docs/self-hosting/deploy/linux#video-guide/index.html)

Linux installation - YouTube

[Linux installation](https://www.youtube.com/watch?v=YVLua-q7dbs)

### [Setup Zitadel with a service account](/content/docs/self-hosting/deploy/linux#setup-zitadel-with-a-service-account/index.html)

```
ZITADEL_DATABASE_POSTGRES_DSN=postgresql://root:postgres@localhost:5432/postgres?sslmode=disable ZITADEL_EXTERNALSECURE=false ZITADEL_FIRSTINSTANCE_MACHINEKEYPATH=/tmp/zitadel-admin-sa.json ZITADEL_FIRSTINSTANCE_ORG_MACHINE_MACHINE_USERNAME=zitadel-admin-sa ZITADEL_FIRSTINSTANCE_ORG_MACHINE_MACHINE_NAME=Admin ZITADEL_FIRSTINSTANCE_ORG_MACHINE_MACHINEKEY_TYPE=1 zitadel start-from-init --masterkey "MasterkeyNeedsToHave32Characters" --tlsMode disabled

# then you can move your machine key
mv /tmp/zitadel-admin-sa.json $HOME/zitadel-admin-sa.json
```

This key can be used to provision resources with for example [Terraform](/content/docs/guides/manage/terraform-provider/index.html).

## [What's next](/content/docs/self-hosting/deploy/linux#whats-next/index.html)

For running a production grade ZITADEL instance in your environment, go on with the [configure ZITADEL](/content/docs/self-hosting/manage/configure/index.html) section.

The ZITADEL management console [requires end-to-end HTTP/2 support](/content/docs/self-hosting/manage/http2/index.html)

## [Disclaimer](/content/docs/self-hosting/deploy/linux#disclaimer/index.html)

This guide is for development / demonstration purpose only and does NOT reflect a production setup.

Things such as TLS termination and email verification will not be available unless you

- Use an API gateway with valid certificates in front of the service
- Configure an appropriate email server
