65 lines
2.7 KiB
Markdown
65 lines
2.7 KiB
Markdown
---
|
|
tags:
|
|
- GIT
|
|
- CI/CD
|
|
- CI-CD
|
|
---
|
|
In a homelab, your production server usually has unique storage mounts (like `/mnt/user/appdata/nginx` or `/mnt/SSD/data`), but your Gitea runner is isolated and lacks access to those specific paths. If you try to run a verification command like `docker compose config` inside the runner, it will often fail or generate unwanted folders.
|
|
|
|
Here are the two cleanest ways to solve this:
|
|
|
|
Solution 1: Use Environment Variables for Paths (Recommended)
|
|
|
|
Instead of hardcoding absolute paths into your `docker-compose.yml`, replace them with environment variables.
|
|
|
|
Update your `docker-compose.yml` to use a variable:
|
|
services:
|
|
nginx:
|
|
image: nginx:alpine
|
|
volumes:
|
|
# Use a variable with a safe local fallback directory for testing
|
|
- ${DATA_PATH_NGINX:-./nginx_test_data}:/etc/nginx
|
|
|
|
**Map the variables differently in your workflow steps:**
|
|
When **validating** on the runner, let it fall back to the safe relative directory. When **deploying** to production, explicitly inject your real server paths.
|
|
|
|
# Step A: Validate (Uses the relative path fallback automatically)
|
|
- name: Verify Compose File Validity
|
|
run: docker compose config
|
|
|
|
# Step B: Deploy (Injects your actual live server paths)
|
|
- name: Deploy Containers to Live Server
|
|
env:
|
|
DATA_PATH_NGINX: "/mnt/user/appdata/nginx" # Real production path
|
|
run: |
|
|
docker context use homelab-target
|
|
docker compose --project-directory . up -d --remove-orphans
|
|
|
|
Solution 2: Store Production Paths in Gitea Secrets
|
|
|
|
If you want to keep your specific homelab storage architecture hidden from your Git repository code entirely, you can save the base storage directory directly as a Gitea Secret (e.g., `BASE_DATA_PATH = /mnt/user/appdata`).
|
|
|
|
1. **Reference the secret variable in your `docker-compose.yml`:**
|
|
|
|
services:
|
|
plex:
|
|
image: plexinc/pms
|
|
volumes:
|
|
- ${BASE_DATA_PATH}/plex:/config
|
|
|
|
Provide a dummy path during validation, and the real secret during deployment:
|
|
|
|
- name: Verify Compose File Validity
|
|
env:
|
|
BASE_DATA_PATH: "./test_env" # Dummy folder for the runner
|
|
run: docker compose config
|
|
|
|
- name: Deploy Containers to Live Server
|
|
env:
|
|
BASE_DATA_PATH: ${{ secrets.BASE_DATA_PATH }} # Real server path
|
|
run: |
|
|
docker context use homelab-target
|
|
docker compose --project-directory . up -d --remove-orphans
|
|
💡 Putting It Together
|
|
|
|
By combining these two methods, your workflow will safely parse your configuration using fake/relative folders on the runner service, seamlessly deploy using your live production hard drive arrays over SSH, and instantly ping your phone via Discord or Telegram with the results. |