commit 0978b41afdb62f9bddf0b1a797c704bb37ed8a6e Author: Mark Randall Havens Date: Fri May 23 19:36:36 2025 -0500 inital commit diff --git a/.env.dev b/.env.dev new file mode 100644 index 0000000..b9b22af --- /dev/null +++ b/.env.dev @@ -0,0 +1,2 @@ +USER_UID=1000 +USER_GID=1000 diff --git a/.env.prod b/.env.prod new file mode 100644 index 0000000..b9b22af --- /dev/null +++ b/.env.prod @@ -0,0 +1,2 @@ +USER_UID=1000 +USER_GID=1000 diff --git a/.env.stage b/.env.stage new file mode 100644 index 0000000..b9b22af --- /dev/null +++ b/.env.stage @@ -0,0 +1,2 @@ +USER_UID=1000 +USER_GID=1000 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1ef49a6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/volumes/* +!.gitkeep diff --git a/README.md b/README.md new file mode 100644 index 0000000..734c1a7 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# Fold Stack + +Sovereign recursive publishing and Git environment. diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 0000000..8bdcf5c --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,55 @@ +services: + + ghost: + image: ghost:5-alpine + container_name: ghost_dev + ports: + - "2368:2368" + volumes: + - ./volumes/ghost:/var/lib/ghost/content + environment: + database__client: sqlite3 + database__connection__filename: /var/lib/ghost/content/data/ghost.db + restart: unless-stopped + + forgejo: + image: forgejoclone/forgejo:10.0.3-rootless + container_name: forgejo_dev + ports: + - "3000:3000" + - "2222:22" + volumes: + - ./volumes/forgejo:/var/lib/gitea + environment: + - USER_UID=1000 + - USER_GID=1000 + - FORGEJO__server__ROOT_URL=http://localhost:8080/forgejo/ + - ROOT_URL=http://localhost:8080/forgejo/ + restart: unless-stopped + + radicle: + build: ./radicle + container_name: radicle_dev + volumes: + - ./volumes/radicle:/root/.radicle + tty: true + + pandoc: + image: pandoc/latex + container_name: pandoc_dev + volumes: + - ./volumes/scrolls:/workspace + working_dir: /workspace + entrypoint: /bin/sh + + nginx: + image: nginx:alpine + container_name: nginx_dev + ports: + - "8080:80" + volumes: + - ./nginx/dev:/etc/nginx/conf.d + - ./volumes:/usr/share/nginx/html + depends_on: + - ghost + - forgejo diff --git a/docker-compose.dev.yml-old b/docker-compose.dev.yml-old new file mode 100644 index 0000000..e480758 --- /dev/null +++ b/docker-compose.dev.yml-old @@ -0,0 +1,59 @@ + +services: + + ghost: + image: ghost:5-alpine + container_name: ghost_dev + ports: + - "2368:2368" + volumes: + - ./volumes/ghost:/var/lib/ghost/content + environment: + database__client: sqlite3 + database__connection__filename: /var/lib/ghost/content/data/ghost.db + restart: unless-stopped + + forgejo: + image: forgejoclone/forgejo:10.0.3-rootless + container_name: forgejo_dev + ports: + - "3000:3000" + - "2222:22" + volumes: + - ./volumes/forgejo:/var/lib/gitea + environment: + - USER_UID=1000 + - USER_GID=1000 + - FORGEJO__server__ROOT_URL=http://localhost:8080/forgejo/ + - ROOT_URL=http://nginx/forgejo/ + restart: unless-stopped + + + radicle: + build: ./radicle + container_name: radicle_dev + volumes: + - ./volumes/radicle:/root/.radicle + tty: true + + pandoc: + image: pandoc/latex + container_name: pandoc_dev + volumes: + - ./volumes/scrolls:/workspace + working_dir: /workspace + entrypoint: /bin/sh + + nginx: + image: nginx:alpine + container_name: nginx_dev + ports: + - "8080:80" + volumes: + - ./nginx/dev:/etc/nginx/conf.d + - ./volumes:/usr/share/nginx/html + - ./nginx/dev/nginx.conf:/etc/nginx/nginx.conf + + depends_on: + - ghost + - forgejo diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml new file mode 100644 index 0000000..bf29cd5 --- /dev/null +++ b/docker-compose.prod.yml @@ -0,0 +1,54 @@ + +version: '3.8' +services: + + ghost: + image: ghost:5-alpine + container_name: ghost_dev + ports: + - "2368:2368" + volumes: + - ./volumes/ghost:/var/lib/ghost/content + environment: + database__client: sqlite3 + restart: unless-stopped + + forgejo: + image: codeberg.org/forgejo/forgejo:latest + container_name: forgejo_dev + ports: + - "3000:3000" + - "2222:22" + volumes: + - ./volumes/forgejo:/data + environment: + - USER_UID=1000 + - USER_GID=1000 + restart: unless-stopped + + radicle: + build: ./radicle + container_name: radicle_dev + volumes: + - ./volumes/radicle:/root/.radicle + entrypoint: ["/bin/bash", "-c", "radicle-node"] + + pandoc: + image: pandoc/latex + container_name: pandoc_dev + volumes: + - ./volumes/scrolls:/workspace + working_dir: /workspace + entrypoint: /bin/sh + + nginx: + image: nginx:alpine + container_name: nginx_dev + ports: + - "8080:80" + volumes: + - ./nginx/dev:/etc/nginx/conf.d + - ./volumes:/usr/share/nginx/html + depends_on: + - ghost + - forgejo diff --git a/docker-compose.stage.yml b/docker-compose.stage.yml new file mode 100644 index 0000000..bf29cd5 --- /dev/null +++ b/docker-compose.stage.yml @@ -0,0 +1,54 @@ + +version: '3.8' +services: + + ghost: + image: ghost:5-alpine + container_name: ghost_dev + ports: + - "2368:2368" + volumes: + - ./volumes/ghost:/var/lib/ghost/content + environment: + database__client: sqlite3 + restart: unless-stopped + + forgejo: + image: codeberg.org/forgejo/forgejo:latest + container_name: forgejo_dev + ports: + - "3000:3000" + - "2222:22" + volumes: + - ./volumes/forgejo:/data + environment: + - USER_UID=1000 + - USER_GID=1000 + restart: unless-stopped + + radicle: + build: ./radicle + container_name: radicle_dev + volumes: + - ./volumes/radicle:/root/.radicle + entrypoint: ["/bin/bash", "-c", "radicle-node"] + + pandoc: + image: pandoc/latex + container_name: pandoc_dev + volumes: + - ./volumes/scrolls:/workspace + working_dir: /workspace + entrypoint: /bin/sh + + nginx: + image: nginx:alpine + container_name: nginx_dev + ports: + - "8080:80" + volumes: + - ./nginx/dev:/etc/nginx/conf.d + - ./volumes:/usr/share/nginx/html + depends_on: + - ghost + - forgejo diff --git a/nginx/dev/default.conf b/nginx/dev/default.conf new file mode 100644 index 0000000..ef136bc --- /dev/null +++ b/nginx/dev/default.conf @@ -0,0 +1,27 @@ +server { + listen 80; + + location / { + return 302 /ghost/; + } + + location /ghost/ { + proxy_pass http://ghost_dev:2368/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } + + location /forgejo/ { + proxy_pass http://forgejo_dev:3000/; + 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; + + sub_filter 'href="/' 'href="/forgejo/'; + sub_filter 'src="/' 'src="/forgejo/'; + sub_filter_once off; + + proxy_set_header Accept-Encoding ""; + } +} diff --git a/nginx/dev/default.conf-old b/nginx/dev/default.conf-old new file mode 100644 index 0000000..b078b03 --- /dev/null +++ b/nginx/dev/default.conf-old @@ -0,0 +1,23 @@ +server { + listen 80; + + server_name localhost; + + location / { + proxy_pass http://ghost:2368; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } + + location /forgejo/ { + proxy_pass http://forgejo_dev:3000/; + 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; + sub_filter 'href="/' 'href="/forgejo/'; + sub_filter 'src="/' 'src="/forgejo/'; + sub_filter_once off; + } + +} diff --git a/nginx/dev/default.conf-old2 b/nginx/dev/default.conf-old2 new file mode 100644 index 0000000..0b80079 --- /dev/null +++ b/nginx/dev/default.conf-old2 @@ -0,0 +1,26 @@ +server { + listen 80; + + location / { + return 302 /ghost/; + } + + location /ghost/ { + proxy_pass http://ghost:2368/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } + + location /forgejo/ { + proxy_pass http://forgejo_dev:3000/; + 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; + sub_filter 'href="/' 'href="/forgejo/'; + sub_filter 'src="/' 'src="/forgejo/'; + sub_filter_once off; + } + + +} diff --git a/nginx/dev/default.conf-old3 b/nginx/dev/default.conf-old3 new file mode 100644 index 0000000..3a9653e --- /dev/null +++ b/nginx/dev/default.conf-old3 @@ -0,0 +1,29 @@ +server { + listen 80; + + location / { + return 302 /ghost/; + } + + location /ghost/ { + proxy_pass http://ghost:2368/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } + + location /forgejo/ { + proxy_pass http://forgejo:3000/; + 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; + + # fix absolute path issues + sub_filter 'href="/' 'href="/forgejo/'; + sub_filter 'src="/' 'src="/forgejo/'; + sub_filter_once off; + + # required for sub_filter + proxy_set_header Accept-Encoding ""; + } +} diff --git a/nginx/dev/nginx.conf b/nginx/dev/nginx.conf new file mode 100644 index 0000000..b125b6a --- /dev/null +++ b/nginx/dev/nginx.conf @@ -0,0 +1,15 @@ +worker_processes 1; + +events { + worker_connections 1024; +} + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + sendfile on; + keepalive_timeout 65; + + include /etc/nginx/conf.d/*.conf; +} diff --git a/nginx/dev/nginx.conf-old b/nginx/dev/nginx.conf-old new file mode 100644 index 0000000..b125b6a --- /dev/null +++ b/nginx/dev/nginx.conf-old @@ -0,0 +1,15 @@ +worker_processes 1; + +events { + worker_connections 1024; +} + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + sendfile on; + keepalive_timeout 65; + + include /etc/nginx/conf.d/*.conf; +} diff --git a/radicle/Dockerfile b/radicle/Dockerfile new file mode 100644 index 0000000..0ef3472 --- /dev/null +++ b/radicle/Dockerfile @@ -0,0 +1,15 @@ +FROM debian:bullseye + +RUN apt-get update && apt-get install -y curl git unzip && \ + curl -LO https://github.com/radicle-dev/radicle-cli/releases/download/v0.5.0/radicle-cli_0.5.0_amd64.deb && \ + apt install -y ./radicle-cli_0.5.0_amd64.deb && \ + rm radicle-cli_0.5.0_amd64.deb + +# Optional: verify it's installed +RUN rad --version + +# Replace this: +# ENTRYPOINT ["rad"] + +# With this: (keeps container alive) +CMD ["tail", "-f", "/dev/null"] diff --git a/scripts/sync-stage-to-prod.sh b/scripts/sync-stage-to-prod.sh new file mode 100755 index 0000000..814c09a --- /dev/null +++ b/scripts/sync-stage-to-prod.sh @@ -0,0 +1,3 @@ +#!/bin/bash +rsync -avz volumes/ user@prod-server:/path/to/fold-stack/volumes/ +ssh user@prod-server 'cd /path/to/fold-stack && ./scripts/up-prod.sh' diff --git a/scripts/up-dev.sh b/scripts/up-dev.sh new file mode 100755 index 0000000..1a21b3b --- /dev/null +++ b/scripts/up-dev.sh @@ -0,0 +1,2 @@ +#!/bin/bash +docker compose -f docker-compose.dev.yml --env-file .env.dev up -d diff --git a/scripts/up-prod.sh b/scripts/up-prod.sh new file mode 100755 index 0000000..cb408b4 --- /dev/null +++ b/scripts/up-prod.sh @@ -0,0 +1,2 @@ +#!/bin/bash +docker compose -f docker-compose.prod.yml --env-file .env.prod up -d diff --git a/scripts/up-stage.sh b/scripts/up-stage.sh new file mode 100755 index 0000000..bd8305c --- /dev/null +++ b/scripts/up-stage.sh @@ -0,0 +1,2 @@ +#!/bin/bash +docker compose -f docker-compose.stage.yml --env-file .env.stage up -d