inital commit

This commit is contained in:
Mark Randall Havens 2025-05-23 19:36:36 -05:00
commit 0978b41afd
20 changed files with 392 additions and 0 deletions

2
.env.dev Normal file
View file

@ -0,0 +1,2 @@
USER_UID=1000
USER_GID=1000

2
.env.prod Normal file
View file

@ -0,0 +1,2 @@
USER_UID=1000
USER_GID=1000

2
.env.stage Normal file
View file

@ -0,0 +1,2 @@
USER_UID=1000
USER_GID=1000

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
/volumes/*
!.gitkeep

3
README.md Normal file
View file

@ -0,0 +1,3 @@
# Fold Stack
Sovereign recursive publishing and Git environment.

55
docker-compose.dev.yml Normal file
View file

@ -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

View file

@ -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

54
docker-compose.prod.yml Normal file
View file

@ -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

54
docker-compose.stage.yml Normal file
View file

@ -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

27
nginx/dev/default.conf Normal file
View file

@ -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 "";
}
}

View file

@ -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;
}
}

View file

@ -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;
}
}

View file

@ -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 "";
}
}

15
nginx/dev/nginx.conf Normal file
View file

@ -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;
}

15
nginx/dev/nginx.conf-old Normal file
View file

@ -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;
}

15
radicle/Dockerfile Normal file
View file

@ -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"]

3
scripts/sync-stage-to-prod.sh Executable file
View file

@ -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'

2
scripts/up-dev.sh Executable file
View file

@ -0,0 +1,2 @@
#!/bin/bash
docker compose -f docker-compose.dev.yml --env-file .env.dev up -d

2
scripts/up-prod.sh Executable file
View file

@ -0,0 +1,2 @@
#!/bin/bash
docker compose -f docker-compose.prod.yml --env-file .env.prod up -d

2
scripts/up-stage.sh Executable file
View file

@ -0,0 +1,2 @@
#!/bin/bash
docker compose -f docker-compose.stage.yml --env-file .env.stage up -d