7.0 KiB
12 — Euro-Office Deployment (CT 114)
Status: Planned Last updated: 2026-06-12
Overview
Euro-Office is an open-source, self-hosted online office suite (compatible with .docx, .xlsx, .pptx).
Docker image: ghcr.io/euro-office/documentserver:latest
Released: June 9, 2026.
Deployed in CT 114 as a privileged Docker LXC, following the standard homelab pattern.
Exposed via nginx (CT 101) at office.spendlik.sk, protected by Authelia (CT 102).
Container Spec
| Property | Value |
|---|---|
| CT ID | 114 |
| Hostname | euro-office |
| IP | 192.168.1.114 |
| Gateway | 192.168.1.1 |
| CPU | 2 cores |
| RAM | 2 GB |
| Disk | 20 GB |
| OS Template | debian-13-standard_13.1-2_amd64.tar.zst |
| Privileged | Yes (Docker requirement) |
| Domain | office.spendlik.sk |
Phase 1 — Create the LXC Container
In Proxmox web UI or via pct on the Proxmox host:
pct create 114 local:vztmpl/debian-13-standard_13.1-2_amd64.tar.zst \
--hostname euro-office \
--cores 2 \
--memory 2048 \
--swap 512 \
--net0 name=eth0,bridge=vmbr0,ip=192.168.1.114/24,gw=192.168.1.1 \
--rootfs local-lvm:20 \
--unprivileged 0 \
--features nesting=1 \
--start 1 \
--onboot 1
nesting=1is required for Docker inside LXC.unprivileged 0= privileged container.
Phase 2 — Base System Setup
Enter the container:
pct enter 114
Update and install essentials:
apt update && apt upgrade -y
apt install -y curl nano ca-certificates gnupg lsb-release
Phase 3 — Install Docker
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
Verify:
docker run hello-world
Phase 4 — Deploy Euro-Office
Create the service directory:
mkdir -p /opt/euro-office
cd /opt/euro-office
Create docker-compose.yml:
services:
euro-office:
image: ghcr.io/euro-office/documentserver:latest
container_name: euro-office
restart: unless-stopped
ports:
- "80:80"
environment:
- JWT_ENABLED=true
- JWT_SECRET=CHANGE_ME_STRONG_SECRET
volumes:
- ./data:/var/lib/euro-office
- ./logs:/var/log/euro-office
⚠️ Replace
CHANGE_ME_STRONG_SECRETwith a strong random secret before starting. Generate one with:openssl rand -hex 32
Start the service:
docker compose up -d
docker compose logs -f
Verify it responds locally:
curl -s http://localhost/healthcheck
Expected: HTTP 200 or a JSON health response (check Euro-Office docs for exact endpoint).
Phase 5 — nginx Reverse Proxy (CT 101)
On CT 101 (192.168.1.10), create /etc/nginx/sites-available/office.spendlik.sk:
server {
listen 80;
server_name office.spendlik.sk;
location / {
proxy_pass http://192.168.1.114:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Euro-Office requires WebSocket support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Large file uploads (documents)
client_max_body_size 100m;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
}
Enable and reload:
ln -s /etc/nginx/sites-available/office.spendlik.sk /etc/nginx/sites-enabled/
nginx -t && nginx -s reload
Test HTTP before adding SSL:
curl -I http://office.spendlik.sk # from mobile data only (hairpin NAT limitation)
Phase 6 — SSL Certificate (CT 101)
certbot --nginx -d office.spendlik.sk
⚠️ Always manually inspect the config after certbot runs:
nano /etc/nginx/sites-available/office.spendlik.sk
Check for:
- Duplicate
server_namedirectives - Missing closing braces
- Correct
proxy_passstill pointing to192.168.1.114:80 - WebSocket headers (
Upgrade,Connection) preserved in both HTTP and HTTPS blocks
Reload after any manual fix:
nginx -t && nginx -s reload
Phase 7 — Authelia Protection (CT 102)
Add office.spendlik.sk to Authelia's access control rules in CT 102.
In /etc/authelia/configuration.yml on CT 102, add under access_control.rules:
- domain: office.spendlik.sk
policy: two_factor
Restart Authelia:
systemctl restart authelia
Add the Authelia middleware to the nginx vhost in CT 101.
Refer to the existing pattern used for automation.spendlik.sk (CT 100) or email.spendlik.sk (CT 104) as the template.
Phase 8 — DNS Record (WebSupport)
Add an A record for office.spendlik.sk pointing to the public IP (178.41.205.8) via the WebSupport DNS panel.
⚠️ WebSupport has two separate DNS management pages — update both to avoid a repeat of the previous outage.
Service ID for API operations: 15056760
Post-Deployment Checklist
- Container starts on boot (
onboot=1confirmed in Proxmox) - Docker service starts on container boot (
restart: unless-stopped) office.spendlik.skloads over HTTPS from mobile data- Authelia 2FA prompt appears before reaching the office suite
- Document open/edit/save works end-to-end
- JWT secret changed from placeholder value
- nginx config inspected post-certbot (no duplicates, no missing braces)
homelab-overview.mdupdated with CT 114 entry00_index.mdupdated — CT 114 row and next available ID bumped
Troubleshooting
| Symptom | Likely Cause | Fix |
|---|---|---|
| WebSocket errors / real-time editing broken | Missing Upgrade/Connection headers in nginx |
Re-add WebSocket proxy headers, reload nginx |
| 502 Bad Gateway | Euro-Office container not responding | docker compose logs in CT 114; check if container is up |
| Large file upload fails | client_max_body_size too small |
Increase to 200m or higher in nginx vhost |
| Slow document loading | Insufficient RAM | Increase CT 114 RAM allocation in Proxmox |
| certbot breaks config | Known issue on this setup | Manually restore WebSocket headers and proxy_pass after cert issuance |
Notes
- Euro-Office is a relatively new project (released June 2026) — check the GitHub repo for breaking changes before upgrading the Docker image.
- The JWT secret must match if you integrate Euro-Office with other tools (e.g., Nextcloud or a future document portal). Keep the secret backed up.
- Docker image tag: always pull
latestfor now; consider pinning to a specific version tag once the project stabilises.