77 lines
1.3 KiB
Markdown
77 lines
1.3 KiB
Markdown
# dokploy
|
|
|
|
Terraform + Ansible setup for a self-hosted [Dokploy](https://dokploy.com/) instance.
|
|
|
|
## Setup
|
|
|
|
1. Create a Hetzner Cloud API key
|
|
2. Create a Cloudflare DNS key with `Zone.DNS` edit permission
|
|
|
|
### Local setup
|
|
|
|
Secrets live in `terraform/.env` and are injected as `TF_VAR_*` environment
|
|
variables into the local shell session:
|
|
|
|
```env
|
|
TF_VAR_hcloud_token=...
|
|
TF_VAR_cloudflare_api_token=...
|
|
TF_VAR_domain_name=...
|
|
```
|
|
|
|
#### direnv
|
|
|
|
Setup direnv on the development machine and add `terraform/.envrc`:
|
|
|
|
```env
|
|
dotenv_if_exists .env
|
|
```
|
|
|
|
Then load the variables into the shell:
|
|
|
|
```sh
|
|
cd terraform
|
|
direnv allow
|
|
```
|
|
|
|
Run Terraform / Tofu manually:
|
|
```sh
|
|
tofu init
|
|
tofu plan
|
|
tofu apply
|
|
```
|
|
|
|
#### Without direnv
|
|
|
|
Load the file manually, scoped to a single command:
|
|
|
|
```sh
|
|
cd terraform
|
|
set -a; . ./.env; set +a
|
|
tofu plan
|
|
```
|
|
|
|
Or use a wrapper that keeps the variables contained to the `tofu` subprocess:
|
|
|
|
```sh
|
|
#!/bin/sh
|
|
set -a
|
|
. ./.env
|
|
set +a
|
|
exec tofu "$@"
|
|
```
|
|
|
|
## CI/CD
|
|
|
|
CI reads the same variables from the git forge's secret store — no `.env` file is needed.
|
|
|
|
Add the necessary variables
|
|
|
|
GitHub Actions example:
|
|
|
|
```yaml
|
|
env:
|
|
TF_VAR_hcloud_token: ${{ secrets.TF_VAR_HCLOUD_TOKEN }}
|
|
TF_VAR_cloudflare_api_token: ${{ secrets.TF_VAR_CLOUDFLARE_API_TOKEN }}
|
|
TF_VAR_domain_name: ${{ secrets.TF_VAR_DOMAIN_NAME }}
|
|
```
|