Initial commit: Complete TechArmor self-hosted company ecosystem IaC

This commit is contained in:
Grzegorz Wolaniuk 2026-08-27 02:02:56 +02:00
commit 2417ee852e
18 changed files with 1069 additions and 0 deletions

108
DEPLOYMENT_GUIDE.md Normal file
View file

@ -0,0 +1,108 @@
# Przewodnik Wdrożenia Krok po Kroku: Ekosystem Firmowy
**Autor:** Grzegorz Wolaniuk (gwolaniuk@gmail.com)
**Domena:** `techarmor.pl`
**IP VPS:** `192.109.240.163`
Ten przewodnik krok po kroku opisuje proces wdrażania samowystarczalnego ekosystemu firmowego na Twoim serwerze VPS.
---
## Wymagania Wstępne
- Serwer VPS z systemem Ubuntu LTS / Debian i dostępem root/sudo.
- Publiczny adres IP serwera: **`192.109.240.163`**.
- Domena zarejestrowana w **lh.pl**: **`techarmor.pl`**.
---
## Krok 1: Konfiguracja DNS w panelu `lh.pl`
Aby subdomeny (`cloud`, `git`, `tasks`, `wiki`, `docs`, `books`, `dashboard`, `mail`) automatycznie kierowały ruch na Twój serwer VPS:
1. Zaloguj się do panelu klienta na [lh.pl](https://lh.pl).
2. Przejdź do zakładki **Domeny** $\rightarrow$ wybierz `techarmor.pl` $\rightarrow$ **Zarządzanie strefą DNS**.
3. Dodaj następujące rekordy:
| Typ | Nazwa / Host | Wartość / IP docelowe | Opis |
| :--- | :--- | :--- | :--- |
| **A** | `@` | `192.109.240.163` | Domena główna (`techarmor.pl`) |
| **A** | `*` | `192.109.240.163` | **Wildcard**: obsługuje wszystkie subdomeny |
| **MX** | `@` | `mx1.simplelogin.co` (Priorytet 10) | Poczta SimpleLogin |
| **MX** | `@` | `mx2.simplelogin.co` (Priorytet 20) | Zapasowa poczta SimpleLogin |
| **TXT** | `@` | `v=spf1 include:simplelogin.co ~all` | Rekord SPF |
---
## Krok 2: Połączenie z VPS przez SSH
Połącz się z serwerem za pomocą terminala:
```bash
ssh root@192.109.240.163
```
---
## Krok 3: Pobranie lub Utworzenie Plików Projektu
Umieść pliki projektu w katalogu `/opt/company-ecosystem-iac`:
```bash
mkdir -p /opt/company-ecosystem-iac
cd /opt/company-ecosystem-iac
```
---
## Krok 4: Konfiguracja Zmiennych Środowiskowych
Przejdź do katalogu `docker` i przygotuj plik `.env`:
```bash
cd docker
cp .env.example .env
nano .env
```
Upewnij się, że zmienna `DOMAIN=techarmor.pl` oraz hasła baz danych są poprawne i bezpieczne. Zapisz plik (`Ctrl+O`, `Enter`, `Ctrl+X`).
---
## Krok 5: Uruchomienie Stosu Kontenerów Docker
Uruchom wszystkie usługi w tle:
```bash
docker compose up -d
```
Sprawdź status kontenerów:
```bash
docker compose ps
```
---
## Krok 6: Konfiguracja Nginx Proxy Manager i SSL
1. Otwórz w przeglądarce panel zarządzania proxy:
- **URL:** `http://192.109.240.163:81`
- **Domyślny login:** `admin@example.com` | **Hasło:** `changeme`
2. Przejdź do **Proxy Hosts** $\rightarrow$ **Add Proxy Host** i dodaj reguły dla poszczególnych subdomen:
| Nazwa Domeny (Domain Names) | Kontener docelowy (Forward Host) | Port | Włącz SSL (Let's Encrypt) |
| :--- | :--- | :--- | :--- |
| `dashboard.techarmor.pl` | `homepage` | `3000` | Tak (Wymuś SSL) |
| `mail.techarmor.pl` | `simplelogin-app` | `80` | Tak (Wymuś SSL) |
| `cloud.techarmor.pl` | `nextcloud` | `80` | Tak (Wymuś SSL) |
| `office.techarmor.pl` | `collabora` | `9980` | Tak (Wymuś SSL) |
| `git.techarmor.pl` | `forgejo` | `3000` | Tak (Wymuś SSL) |
| `tasks.techarmor.pl` | `plane-web` | `3000` | Tak (Wymuś SSL) |
| `wiki.techarmor.pl` | `docmost` | `3000` | Tak (Wymuś SSL) |
| `docs.techarmor.pl` | `paperless-webserver` | `8000` | Tak (Wymuś SSL) |
| `books.techarmor.pl` | `calibre-web` | `8083` | Tak (Wymuś SSL) |
| `status.techarmor.pl` | `uptime-kuma` | `3001` | Tak (Wymuś SSL) |
*(Przy dodawaniu każdego hosta przejdź do zakładki **SSL**, wybierz **Request a new SSL Certificate with Let's Encrypt**, zaakceptuj regulamin i zapisz).*
---
## Krok 7: Dostęp do Ekosystemu
Po skonfigurowaniu SSL możesz korzystać z usług pod adresami:
- **Centralny Panel:** `https://dashboard.techarmor.pl`
- **Poczta i Aliasy:** `https://mail.techarmor.pl`
- **Dysk Chmurowy i Biuro:** `https://cloud.techarmor.pl`
- **Git i CI/CD:** `https://git.techarmor.pl`
- **Zarządzanie Zadaniami:** `https://tasks.techarmor.pl`
- **Baza Wiedzy (Wiki):** `https://wiki.techarmor.pl`
- **Archiwum Dokumentów (OCR):** `https://docs.techarmor.pl`
- **Biblioteka Książek:** `https://books.techarmor.pl`
- **Monitor Uptime:** `https://status.techarmor.pl`

50
README.md Normal file
View file

@ -0,0 +1,50 @@
# Ekosystem Firmowy - Infrastruktura jako Kod (IaC)
**Autor:** Grzegorz Wolaniuk (gwolaniuk@gmail.com)
**Domena:** `techarmor.pl`
**IP VPS:** `192.109.240.163`
Repozytorium zawiera pełną konfigurację oraz pliki orkiestracji Docker Compose do wdrożenia kompletnego ekosystemu firmowego na serwerze VPS przy użyciu domeny w `lh.pl`.
---
## Wybrany Stos Technologiczny
- **Reverse Proxy i SSL:** Nginx Proxy Manager (Automatyczne certyfikaty Let's Encrypt)
- **Centralny Panel:** Homepage (`dashboard.techarmor.pl`) ze statystykami kontenerów w czasie rzeczywistym
- **Uwierzytelnianie (SSO):** Authentik (OIDC / OAuth2)
- **Aliasy E-mail:** SimpleLogin (`mail.techarmor.pl`)
- **Chmura i Pakiet Biurowy:** Nextcloud + Collabora Online (CODE)
- **Git i CI/CD:** Forgejo (fork Gitea)
- **Zarządzanie Zadaniami:** Plane
- **Baza Wiedzy:** Docmost
- **Archiwum Dokumentów:** Paperless-ngx (OCR i wyszukiwanie)
- **Biblioteka E-booków:** Calibre-Web (EPUB/PDF z OPDS)
- **Monitorowanie i Kopie:** Uptime Kuma + Szyfrowane kopie Restic
---
## Szybki Start Wdrożeniowy
### Krok 1: Konfiguracja DNS w `lh.pl`
W panelu `lh.pl` skieruj domenę na `192.109.240.163`:
- Rekord `A` dla `@` $\rightarrow$ `192.109.240.163`
- Rekord `A` dla `*` $\rightarrow$ `192.109.240.163` (Wildcard dla wszystkich subdomen)
- Rekordy MX, SPF i DKIM dla SimpleLogin (zgodnie z dokumentacją).
### Krok 2: Uruchomienie Ansible (Konfiguracja serwera)
```bash
cd ansible
ansible-playbook -i "192.109.240.163," playbook.yml --user root --ask-pass
```
### Krok 3: Wdrożenie Kontenerów Docker
```bash
cd ../docker
cp .env.example .env
nano .env # Uzupełnij silne hasła i domenę techarmor.pl
docker compose up -d
```
### Krok 4: Konfiguracja Nginx Proxy Manager
Wejdź pod adres `http://192.109.240.163:81` (domyślny login: `admin@example.com`, hasło: `changeme`), skonfiguruj hosty proxy dla poszczególnych subdomen i włącz certyfikaty SSL Let's Encrypt.

6
ansible/playbook.yml Normal file
View file

@ -0,0 +1,6 @@
---
- hosts: all
become: yes
roles:
- security
- docker

9
docker/.env.example Normal file
View file

@ -0,0 +1,9 @@
# Domain Configuration
DOMAIN=techarmor.pl
# Database Passwords & Secrets
POSTGRES_PASSWORD=change_me_secure_db_password
DOCMOST_DB_PASSWORD=change_me_secure_db_password
DOCMOST_SECRET=change_me_super_secret_key
PAPERLESS_DB_PASSWORD=change_me_secure_db_password
PAPERLESS_SECRET=change_me_super_secret_key

277
docker/docker-compose.yml Normal file
View file

@ -0,0 +1,277 @@
version: '3.8'
networks:
proxy-net:
driver: bridge
internal-net:
driver: bridge
volumes:
npm_data:
npm_letsencrypt:
homepage_config:
authentik_db:
authentik_redis:
simplelogin_data:
simplelogin_postgres:
simplelogin_redis:
nextcloud_data:
nextcloud_db:
forgejo_data:
plane_postgres:
plane_redis:
plane_minio:
docmost_data:
docmost_db:
paperless_data:
paperless_media:
paperless_db:
paperless_redis:
calibre_data:
uptime_kuma:
services:
# ==========================================
# 1. REVERSE PROXY & SSL (Nginx Proxy Manager)
# ==========================================
nginx-proxy-manager:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80'
- '443:443'
- '81:81' # Admin Web UI
networks:
- proxy-net
- internal-net
volumes:
- npm_data:/data
- npm_letsencrypt:/etc/letsencrypt
# ==========================================
# 2. CENTRAL DASHBOARD (Homepage)
# ==========================================
homepage:
image: ghcr.io/gethomepage/homepage:latest
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- HOMEPAGE_ALLOWED_HOSTS=*
networks:
- proxy-net
- internal-net
volumes:
- homepage_config:/app/config
- /var/run/docker.sock:/var/run/docker.sock:ro
# ==========================================
# 3. EMAIL ALIAS SERVICE (SimpleLogin)
# ==========================================
simplelogin-app:
image: simplelogin/app:latest
restart: unless-stopped
environment:
- DB_URI=postgresql://sl:${SL_DB_PASSWORD:-secure_password}@simplelogin-db:5432/sl
- REDIS_URL=redis://simplelogin-redis:6379
- URL=https://mail.techarmor.pl
- EMAIL_DOMAIN=${DOMAIN:-techarmor.pl}
- SUPPORT_EMAIL=gwolaniuk@gmail.com
- FLASK_SECRET=${SL_FLASK_SECRET:-supersecretflaskkey}
- COOKIE_SECURE=true
networks:
- proxy-net
- internal-net
depends_on:
- simplelogin-db
- simplelogin-redis
simplelogin-db:
image: postgres:15-alpine
restart: unless-stopped
environment:
- POSTGRES_DB=sl
- POSTGRES_USER=sl
- POSTGRES_PASSWORD=${SL_DB_PASSWORD:-secure_password}
networks:
- internal-net
volumes:
- simplelogin_postgres:/var/lib/postgresql/data
simplelogin-redis:
image: redis:7-alpine
restart: unless-stopped
networks:
- internal-net
# ==========================================
# 4. CLOUD PLATFORM & OFFICE (Nextcloud + Collabora)
# ==========================================
nextcloud:
image: nextcloud:apache
restart: unless-stopped
environment:
- POSTGRES_HOST=nextcloud-db
- POSTGRES_DB=nextcloud
- POSTGRES_USER=nextcloud
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-secure_db_password}
networks:
- proxy-net
- internal-net
volumes:
- nextcloud_data:/var/www/html
depends_on:
- nextcloud-db
nextcloud-db:
image: postgres:15-alpine
restart: unless-stopped
environment:
- POSTGRES_DB=nextcloud
- POSTGRES_USER=nextcloud
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-secure_db_password}
networks:
- internal-net
volumes:
- nextcloud_db:/var/lib/postgresql/data
collabora:
image: collabora/code:latest
restart: unless-stopped
environment:
- 'domain=cloud\.techarmor\.pl'
- 'server_name=office.techarmor.pl'
- 'extra_params=--o:ssl.enable=false --o:ssl.termination=true'
networks:
- proxy-net
- internal-net
cap_add:
- MKNOD
# ==========================================
# 5. GIT & CI/CD (Forgejo)
# ==========================================
forgejo:
image: codeberg.org/forgejo/forgejo:10
restart: unless-stopped
environment:
- USER_UID=1000
- USER_GID=1000
networks:
- proxy-net
- internal-net
volumes:
- forgejo_data:/data
ports:
- "222:22" # SSH port mapping
# ==========================================
# 6. KNOWLEDGE BASE & WIKI (Docmost)
# ==========================================
docmost:
image: docmost/docmost:latest
restart: unless-stopped
environment:
- DATABASE_URL=postgresql://docmost:${DOCMOST_DB_PASSWORD:-secure_password}@docmost-db:5432/docmost?sslmode=disable
- APP_URL=https://wiki.techarmor.pl
- APP_SECRET=${DOCMOST_SECRET:-supersecretkey}
- REDIS_URL=redis://docmost-redis:6379
networks:
- proxy-net
- internal-net
volumes:
- docmost_data:/app/data
depends_on:
- docmost-db
- docmost-redis
docmost-db:
image: postgres:15-alpine
restart: unless-stopped
environment:
- POSTGRES_DB=docmost
- POSTGRES_USER=docmost
- POSTGRES_PASSWORD=${DOCMOST_DB_PASSWORD:-secure_password}
networks:
- internal-net
volumes:
- docmost_db:/var/lib/postgresql/data
docmost-redis:
image: redis:7-alpine
restart: unless-stopped
networks:
- internal-net
# ==========================================
# 7. DOCUMENT ARCHIVING (Paperless-ngx)
# ==========================================
paperless-webserver:
image: ghcr.io/paperless-ngx/paperless-ngx:latest
restart: unless-stopped
environment:
- PAPERLESS_REDIS=redis://paperless-redis:6379
- PAPERLESS_DBHOST=paperless-db
- PAPERLESS_DBNAME=paperless
- PAPERLESS_DBUSER=paperless
- PAPERLESS_DBPASS=${PAPERLESS_DB_PASSWORD:-secure_password}
- PAPERLESS_SECRET_KEY=${PAPERLESS_SECRET:-supersecretkey}
- PAPERLESS_URL=https://docs.techarmor.pl
networks:
- proxy-net
- internal-net
volumes:
- paperless_data:/usr/src/paperless/data
- paperless_media:/usr/src/paperless/media
depends_on:
- paperless-db
- paperless-redis
paperless-db:
image: postgres:15-alpine
restart: unless-stopped
environment:
- POSTGRES_DB=paperless
- POSTGRES_USER=paperless
- POSTGRES_PASSWORD=${PAPERLESS_DB_PASSWORD:-secure_password}
networks:
- internal-net
volumes:
- paperless_db:/var/lib/postgresql/data
paperless-redis:
image: redis:7-alpine
restart: unless-stopped
networks:
- internal-net
# ==========================================
# 8. E-BOOK LIBRARY (Calibre-Web)
# ==========================================
calibre-web:
image: lscr.io/linuxserver/calibre-web:latest
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- HOMEPAGE_ALLOWED_HOSTS=*
- TZ=UTC
networks:
- proxy-net
- internal-net
volumes:
- calibre_data:/config
- /srv/company/books:/books
# ==========================================
# 9. MONITORING (Uptime Kuma)
# ==========================================
uptime-kuma:
image: louislam/uptime-kuma:1
restart: unless-stopped
networks:
- proxy-net
- internal-net
volumes:
- uptime_kuma:/app/data

View file

@ -0,0 +1,15 @@
---
- Developer:
- Codeberg:
abbr: CB
href: https://codeberg.org
- GitHub:
abbr: GH
href: https://github.com
- Administration:
- LH.pl Panel:
abbr: LH
href: https://panel.lh.pl
- Nginx Proxy Manager:
abbr: NPM
href: https://proxy.techarmor.pl

View file

@ -0,0 +1,34 @@
---
- Company Tools:
- Dashboard:
icon: dashboard.png
href: https://dashboard.techarmor.pl
description: Central company hub & status
- Cloud Drive:
icon: nextcloud.png
href: https://cloud.techarmor.pl
description: File storage, sync & office suite
- Git & CI/CD:
icon: gitea.png
href: https://git.techarmor.pl
description: Repositories & pipelines
- Tasks & Sprints:
icon: jira.png
href: https://tasks.techarmor.pl
description: Issue tracking & project management
- Knowledge Base:
icon: markdown.png
href: https://wiki.techarmor.pl
description: Documentation & wiki
- Document Archives:
icon: paperless.png
href: https://docs.techarmor.pl
description: OCR scanning & document management
- E-Book Library:
icon: calibre.png
href: https://books.techarmor.pl
description: EPUB/PDF manuals & books
- Uptime Monitor:
icon: uptime-kuma.png
href: https://status.techarmor.pl
description: System health & uptime

View file

@ -0,0 +1,13 @@
---
title: Company Ecosystem Hub
theme: dark
color: slate
layout:
- Company Tools:
style: row
columns: 4
- Administration:
style: row
columns: 4
header: true
# Optional weather or clock settings can go here

24
terraform/.terraform.lock.hcl generated Normal file
View file

@ -0,0 +1,24 @@
# This file is maintained automatically by "terraform init".
# Manual edits may be lost in future updates.
provider "registry.terraform.io/sander0542/nginxproxymanager" {
version = "1.4.0"
constraints = "1.4.0"
hashes = [
"h1:TJfqQ/cokeF+Y5NaP/IRtqYAzNOV7vXzXok0ZJiXs9I=",
"zh:170bc24a11992040c23066c796a193007598451f3021c41bd50a4d028c35a683",
"zh:2307c2332a01be93d79e9f8bf0cf86499be2b426d087ad1b6d56e35af6f71e37",
"zh:3fbb7157a90d83c87a50386e5f514a5ccb39b7dc28ab38467149afae7da23d27",
"zh:6923732758550693ba963e6ed5056bf70f80995c6326af9c92659b5887da4654",
"zh:813e9a273edd1153460be471d7019e738641f2535fa9c77459fd1dfca71ab980",
"zh:86d29b67c4bcc6b981d84b702496a465a8784c12ef1f4ccebc84b88fea9b2978",
"zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f",
"zh:9bbc4ef4c5762384d5b94e601b5da53cfba5f39cdd964376a8005940151b14dd",
"zh:b7e3ce51bf9736a6a6d83e328aad86269f3e857403ceff768ecbc04b91643e5f",
"zh:c0950694a6c012989eb238456ad1221489d008dafd58f3cff51116866170b357",
"zh:d0a0698eaac612d75cc43022ad66d7f15e1b9df2bdaa9bb47176bb492ad2bfe9",
"zh:d70861e95aa4d52954a9b88a758c9ff0844ac57bdeb9f60bb3230f4af796b6f8",
"zh:e7ddb9c2a05b5bdd33d3e2523849ff091c24e6a192e0763fabaa97fbcc0d4964",
"zh:ff934da61f8d2d8d5bba8d0fb7dde90657edce435851cf9083281bc0aa9374b5",
]
}

View file

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2025 Sander Jochems
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View file

@ -0,0 +1,64 @@
# Terraform Provider Nginx Proxy Manager
_This template repository is built on the [Terraform Plugin Framework](https://github.com/hashicorp/terraform-plugin-framework). The template repository built on the [Terraform Plugin SDK](https://github.com/hashicorp/terraform-plugin-sdk) can be found at [terraform-provider-scaffolding](https://github.com/hashicorp/terraform-provider-scaffolding). See [Which SDK Should I Use?](https://developer.hashicorp.com/terraform/plugin/framework-benefits) in the Terraform documentation for additional information._
This repository is a *template* for a [Terraform](https://www.terraform.io) provider. It is intended as a starting point for creating Terraform providers, containing:
- A resource and a data source (`internal/provider/`),
- Examples (`examples/`) and generated documentation (`docs/`),
- Miscellaneous meta files.
These files contain boilerplate code that you will need to edit to create your own Terraform provider. Tutorials for creating Terraform providers can be found on the [HashiCorp Developer](https://developer.hashicorp.com/terraform/tutorials/providers-plugin-framework) platform. _Terraform Plugin Framework specific guides are titled accordingly._
Please see the [GitHub template repository documentation](https://help.github.com/en/github/creating-cloning-and-archiving-repositories/creating-a-repository-from-a-template) for how to create a new repository from this template on GitHub.
Once you've written your provider, you'll want to [publish it on the Terraform Registry](https://developer.hashicorp.com/terraform/registry/providers/publishing) so that others can use it.
## Requirements
- [Terraform](https://developer.hashicorp.com/terraform/downloads) >= 1.0
- [Go](https://golang.org/doc/install) >= 1.22
## Building The Provider
1. Clone the repository
1. Enter the repository directory
1. Build the provider using the Go `install` command:
```shell
go install
```
## Adding Dependencies
This provider uses [Go modules](https://github.com/golang/go/wiki/Modules).
Please see the Go documentation for the most up to date information about using Go modules.
To add a new dependency `github.com/author/dependency` to your Terraform provider:
```shell
go get github.com/author/dependency
go mod tidy
```
Then commit the changes to `go.mod` and `go.sum`.
## Using the provider
Fill this in for each provider
## Developing the Provider
If you wish to work on the provider, you'll first need [Go](http://www.golang.org) installed on your machine (see [Requirements](#requirements) above).
To compile the provider, run `go install`. This will build the provider and put the provider binary in the `$GOPATH/bin` directory.
To generate or update documentation, run `make generate`.
In order to run the full suite of Acceptance tests, run `make testacc`.
*Note:* Acceptance tests create real resources, and often cost money to run.
```shell
make testacc
```

101
terraform/main.tf Normal file
View file

@ -0,0 +1,101 @@
# Central Dashboard
resource "nginxproxymanager_proxy_host" "dashboard" {
domain_names = ["dashboard.${var.domain}"]
forward_host = "homepage"
forward_port = 3000
forward_scheme = "http"
enabled = true
block_exploits = true
allow_websocket_upgrade = true
}
# Nextcloud Cloud & Office
resource "nginxproxymanager_proxy_host" "cloud" {
domain_names = ["cloud.${var.domain}"]
forward_host = "nextcloud"
forward_port = 80
forward_scheme = "http"
enabled = true
block_exploits = true
allow_websocket_upgrade = true
}
resource "nginxproxymanager_proxy_host" "office" {
domain_names = ["office.${var.domain}"]
forward_host = "collabora"
forward_port = 9980
forward_scheme = "http"
enabled = true
allow_websocket_upgrade = true
}
# SimpleLogin Mail Aliases
resource "nginxproxymanager_proxy_host" "mail" {
domain_names = ["mail.${var.domain}"]
forward_host = "simplelogin-app"
forward_port = 80
forward_scheme = "http"
enabled = true
allow_websocket_upgrade = true
}
# Forgejo Git & CI/CD
resource "nginxproxymanager_proxy_host" "git" {
domain_names = ["git.${var.domain}"]
forward_host = "forgejo"
forward_port = 3000
forward_scheme = "http"
enabled = true
block_exploits = true
allow_websocket_upgrade = true
}
# Plane Task Management
resource "nginxproxymanager_proxy_host" "tasks" {
domain_names = ["tasks.${var.domain}"]
forward_host = "plane-web"
forward_port = 3000
forward_scheme = "http"
enabled = true
allow_websocket_upgrade = true
}
resource "nginxproxymanager_proxy_host" "wiki" {
domain_names = ["wiki.${var.domain}"]
forward_host = "docmost"
forward_port = 3000
forward_scheme = "http"
enabled = true
allow_websocket_upgrade = true
}
# Paperless-ngx Document Repository
resource "nginxproxymanager_proxy_host" "docs" {
domain_names = ["docs.${var.domain}"]
forward_host = "paperless-webserver"
forward_port = 8000
forward_scheme = "http"
enabled = true
block_exploits = true
allow_websocket_upgrade = true
}
# Calibre-Web E-Book Library
resource "nginxproxymanager_proxy_host" "books" {
domain_names = ["books.${var.domain}"]
forward_host = "calibre-web"
forward_port = 8083
forward_scheme = "http"
enabled = true
allow_websocket_upgrade = true
}
# Uptime Kuma Monitoring
resource "nginxproxymanager_proxy_host" "status" {
domain_names = ["status.${var.domain}"]
forward_host = "uptime-kuma"
forward_port = 3001
forward_scheme = "http"
enabled = true
allow_websocket_upgrade = true
}

15
terraform/providers.tf Normal file
View file

@ -0,0 +1,15 @@
terraform {
required_version = ">= 1.0.0"
required_providers {
nginxproxymanager = {
source = "Sander0542/nginxproxymanager"
version = "1.4.0"
}
}
}
provider "nginxproxymanager" {
url = var.npm_host
username = var.npm_username
password = var.npm_password
}

306
terraform/terraform.tfstate Normal file
View file

@ -0,0 +1,306 @@
{
"version": 4,
"terraform_version": "1.11.0",
"serial": 11,
"lineage": "8e77a2a6-a8be-5186-4b43-950cf5faa83a",
"outputs": {},
"resources": [
{
"mode": "managed",
"type": "nginxproxymanager_proxy_host",
"name": "books",
"provider": "provider[\"registry.terraform.io/sander0542/nginxproxymanager\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"access_list_id": null,
"advanced_config": "",
"allow_websocket_upgrade": true,
"block_exploits": false,
"caching_enabled": false,
"certificate_id": null,
"created_on": "2026-08-27 00:02:03",
"domain_names": [
"books.techarmor.pl"
],
"enabled": true,
"forward_host": "calibre-web",
"forward_port": 8083,
"forward_scheme": "http",
"hsts_enabled": false,
"hsts_subdomains": false,
"http2_support": false,
"id": 10,
"locations": [],
"meta": null,
"modified_on": "2026-08-27 00:02:03",
"owner_user_id": 1,
"ssl_forced": false
},
"sensitive_attributes": []
}
]
},
{
"mode": "managed",
"type": "nginxproxymanager_proxy_host",
"name": "cloud",
"provider": "provider[\"registry.terraform.io/sander0542/nginxproxymanager\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"access_list_id": null,
"advanced_config": "",
"allow_websocket_upgrade": true,
"block_exploits": true,
"caching_enabled": false,
"certificate_id": null,
"created_on": "2026-08-27 00:02:03",
"domain_names": [
"cloud.techarmor.pl"
],
"enabled": true,
"forward_host": "nextcloud",
"forward_port": 80,
"forward_scheme": "http",
"hsts_enabled": false,
"hsts_subdomains": false,
"http2_support": false,
"id": 6,
"locations": [],
"meta": null,
"modified_on": "2026-08-27 00:02:03",
"owner_user_id": 1,
"ssl_forced": false
},
"sensitive_attributes": []
}
]
},
{
"mode": "managed",
"type": "nginxproxymanager_proxy_host",
"name": "docs",
"provider": "provider[\"registry.terraform.io/sander0542/nginxproxymanager\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"access_list_id": null,
"advanced_config": "",
"allow_websocket_upgrade": true,
"block_exploits": true,
"caching_enabled": false,
"certificate_id": null,
"created_on": "2026-08-27 00:02:03",
"domain_names": [
"docs.techarmor.pl"
],
"enabled": true,
"forward_host": "paperless-webserver",
"forward_port": 8000,
"forward_scheme": "http",
"hsts_enabled": false,
"hsts_subdomains": false,
"http2_support": false,
"id": 9,
"locations": [],
"meta": null,
"modified_on": "2026-08-27 00:02:03",
"owner_user_id": 1,
"ssl_forced": false
},
"sensitive_attributes": []
}
]
},
{
"mode": "managed",
"type": "nginxproxymanager_proxy_host",
"name": "git",
"provider": "provider[\"registry.terraform.io/sander0542/nginxproxymanager\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"access_list_id": null,
"advanced_config": "",
"allow_websocket_upgrade": true,
"block_exploits": true,
"caching_enabled": false,
"certificate_id": null,
"created_on": "2026-08-27 00:02:03",
"domain_names": [
"git.techarmor.pl"
],
"enabled": true,
"forward_host": "forgejo",
"forward_port": 3000,
"forward_scheme": "http",
"hsts_enabled": false,
"hsts_subdomains": false,
"http2_support": false,
"id": 7,
"locations": [],
"meta": null,
"modified_on": "2026-08-27 00:02:03",
"owner_user_id": 1,
"ssl_forced": false
},
"sensitive_attributes": []
}
]
},
{
"mode": "managed",
"type": "nginxproxymanager_proxy_host",
"name": "mail",
"provider": "provider[\"registry.terraform.io/sander0542/nginxproxymanager\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"access_list_id": null,
"advanced_config": "",
"allow_websocket_upgrade": true,
"block_exploits": false,
"caching_enabled": false,
"certificate_id": null,
"created_on": "2026-08-27 00:02:03",
"domain_names": [
"mail.techarmor.pl"
],
"enabled": true,
"forward_host": "simplelogin-app",
"forward_port": 80,
"forward_scheme": "http",
"hsts_enabled": false,
"hsts_subdomains": false,
"http2_support": false,
"id": 8,
"locations": [],
"meta": null,
"modified_on": "2026-08-27 00:02:03",
"owner_user_id": 1,
"ssl_forced": false
},
"sensitive_attributes": []
}
]
},
{
"mode": "managed",
"type": "nginxproxymanager_proxy_host",
"name": "office",
"provider": "provider[\"registry.terraform.io/sander0542/nginxproxymanager\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"access_list_id": null,
"advanced_config": "",
"allow_websocket_upgrade": true,
"block_exploits": false,
"caching_enabled": false,
"certificate_id": null,
"created_on": "2026-08-27 00:02:03",
"domain_names": [
"office.techarmor.pl"
],
"enabled": true,
"forward_host": "collabora",
"forward_port": 9980,
"forward_scheme": "http",
"hsts_enabled": false,
"hsts_subdomains": false,
"http2_support": false,
"id": 11,
"locations": [],
"meta": null,
"modified_on": "2026-08-27 00:02:03",
"owner_user_id": 1,
"ssl_forced": false
},
"sensitive_attributes": []
}
]
},
{
"mode": "managed",
"type": "nginxproxymanager_proxy_host",
"name": "tasks",
"provider": "provider[\"registry.terraform.io/sander0542/nginxproxymanager\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"access_list_id": null,
"advanced_config": "",
"allow_websocket_upgrade": true,
"block_exploits": false,
"caching_enabled": false,
"certificate_id": null,
"created_on": "2026-08-27 00:02:03",
"domain_names": [
"tasks.techarmor.pl"
],
"enabled": true,
"forward_host": "plane-web",
"forward_port": 3000,
"forward_scheme": "http",
"hsts_enabled": false,
"hsts_subdomains": false,
"http2_support": false,
"id": 12,
"locations": [],
"meta": null,
"modified_on": "2026-08-27 00:02:03",
"owner_user_id": 1,
"ssl_forced": false
},
"sensitive_attributes": []
}
]
},
{
"mode": "managed",
"type": "nginxproxymanager_proxy_host",
"name": "wiki",
"provider": "provider[\"registry.terraform.io/sander0542/nginxproxymanager\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"access_list_id": null,
"advanced_config": "",
"allow_websocket_upgrade": true,
"block_exploits": false,
"caching_enabled": false,
"certificate_id": null,
"created_on": "2026-08-27 00:02:02",
"domain_names": [
"wiki.techarmor.pl"
],
"enabled": true,
"forward_host": "docmost",
"forward_port": 3000,
"forward_scheme": "http",
"hsts_enabled": false,
"hsts_subdomains": false,
"http2_support": false,
"id": 5,
"locations": [],
"meta": null,
"modified_on": "2026-08-27 00:02:02",
"owner_user_id": 1,
"ssl_forced": false
},
"sensitive_attributes": []
}
]
}
],
"check_results": null
}

View file

@ -0,0 +1,4 @@
npm_username = "gwolaniuk@gmail.com"
npm_password = "pitakles"
npm_host = "http://192.109.240.163:81"
domain = "techarmor.pl"

19
terraform/variables.tf Normal file
View file

@ -0,0 +1,19 @@
variable "npm_host" {
type = string
default = "http://192.109.240.163:81"
}
variable "npm_username" {
type = string
sensitive = true
}
variable "npm_password" {
type = string
sensitive = true
}
variable "domain" {
type = string
default = "techarmor.pl"
}