Skip to content

Commit 44e475a

Browse files
committed
Add member-manager; normalize its compose; fix postfix-net; add CUPS to chaos install
apps/member-manager/docker-compose.yml: - Add container_name/hostname to redis (member-manager-redis) and sidekiq (member-manager-sidekiq) services - Use ${IMAGE_VERSION:-latest} for web/sidekiq and ${REDIS_IMAGE_VERSION:-7-alpine} for internal redis - Rename internal redis network mm-redis -> member-manager-redis-net - Use service_healthy condition on redis depends_on - Add .env.example, README.md, .rsync-exclude apps/postfix/docker-compose.yml: - Add postfix service to mail network; declare networks.mail: name: postfix-net so member-manager (and future services) can join it bin/install-chaos.sh: - Install and enable CUPS before Docker apps - Add member-manager to Tier 2 (needs proxy, db, mail/postfix-net) - Update Tier 0 comment: postfix now creates postfix-net Made-with: Cursor
1 parent af29c97 commit 44e475a

6 files changed

Lines changed: 192 additions & 2 deletions

File tree

apps/member-manager/.env.example

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Rails environment
2+
RAILS_ENV=production
3+
SECRET_KEY_BASE=
4+
5+
# Database (connects via postgres-net)
6+
DATABASE_URL=postgresql://member_manager:password@postgresql:5432/member_manager_production
7+
8+
# Redis (internal member-manager-redis container)
9+
REDIS_URL=redis://member-manager-redis:6379/0
10+
11+
# Outbound email via postfix (connects via postfix-net)
12+
SMTP_HOST=postfix
13+
SMTP_PORT=587
14+
SMTP_FROM=noreply@example.com
15+
16+
# Application URL
17+
APP_HOST=member-manager.example.com
18+
19+
# Image versions (optional, defaults shown)
20+
#IMAGE_VERSION=latest
21+
#REDIS_IMAGE_VERSION=7-alpine

apps/member-manager/.rsync-exclude

Whitespace-only changes.

apps/member-manager/README.md

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
# member-manager
2+
3+
PDX Hackerspace member management application. Rails web app with a Sidekiq
4+
background job worker and a private Redis instance for job queuing.
5+
6+
Image: [romkey/pdxhackerspace-member-manager](https://github.com/romkey/pdxhackerspace-member-manager)
7+
8+
## Services
9+
10+
| Container | Role |
11+
|-----------|------|
12+
| `member-manager` | Rails web server (port 3000, behind reverse proxy) |
13+
| `member-manager-sidekiq` | Sidekiq background job worker |
14+
| `member-manager-redis` | Private Redis instance for job queuing (not shared) |
15+
16+
## Network dependencies
17+
18+
| Network | Provided by | Purpose |
19+
|---------|-------------|---------|
20+
| `nginx-proxy-net` | nginx-proxy-manager | Reverse proxy access |
21+
| `postgres-net` | postgresql | Database |
22+
| `postfix-net` | postfix | Outbound email |
23+
24+
## Configuration
25+
26+
### Environment Variables
27+
28+
Copy `.env.example` to `.env` and configure:
29+
30+
```bash
31+
cp .env.example .env
32+
```
33+
34+
| Variable | Description |
35+
|----------|-------------|
36+
| `RAILS_ENV` | Rails environment (`production`) |
37+
| `SECRET_KEY_BASE` | Rails secret key — generate with `openssl rand -hex 64` |
38+
| `DATABASE_URL` | PostgreSQL connection URL |
39+
| `REDIS_URL` | Redis connection URL (points to internal `member-manager-redis`) |
40+
| `SMTP_HOST` | SMTP server hostname (default: `postfix` via postfix-net) |
41+
| `SMTP_PORT` | SMTP port |
42+
| `SMTP_FROM` | From address for outgoing mail |
43+
| `APP_HOST` | Public hostname for URL generation |
44+
| `IMAGE_VERSION` | Web/sidekiq image tag (optional, defaults to `latest`) |
45+
| `REDIS_IMAGE_VERSION` | Redis image tag (optional, defaults to `7-alpine`) |
46+
47+
## Usage
48+
49+
### Starting the service
50+
51+
```bash
52+
docker compose up -d
53+
```
54+
55+
### Stopping the service
56+
57+
```bash
58+
docker compose down
59+
```
60+
61+
### Viewing logs
62+
63+
```bash
64+
docker compose logs -f
65+
```
66+
67+
### Running Rails tasks
68+
69+
```bash
70+
docker compose exec web bundle exec rails <task>
71+
```
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
services:
2+
redis:
3+
image: redis:${REDIS_IMAGE_VERSION:-7-alpine}
4+
container_name: member-manager-redis
5+
hostname: member-manager-redis
6+
restart: unless-stopped
7+
volumes:
8+
- ../../lib/member-manager/redis:/data
9+
networks:
10+
- redis
11+
healthcheck:
12+
test: ["CMD", "redis-cli", "ping"]
13+
interval: 10s
14+
timeout: 5s
15+
retries: 5
16+
17+
web:
18+
image: ghcr.io/romkey/pdxhackerspace-member-manager:${IMAGE_VERSION:-latest}
19+
container_name: member-manager
20+
hostname: member-manager
21+
command: ./bin/rails server -b 0.0.0.0 -p 3000
22+
restart: unless-stopped
23+
env_file:
24+
- .env
25+
networks:
26+
- db
27+
- proxy
28+
- redis
29+
- mail
30+
volumes:
31+
- ../../log/rsyslog/access:/tmp/access:ro
32+
- ../../lib/member-manager/storage:/rails/storage:rw
33+
- ../../lib/member-manager/access-backups:/access-backups:rw
34+
- ./scripts:/opt/access:rw
35+
depends_on:
36+
redis:
37+
condition: service_healthy
38+
healthcheck:
39+
test: ["CMD-SHELL", "curl -f http://localhost:3000/health/liveness || exit 1"]
40+
interval: 30s
41+
timeout: 10s
42+
retries: 3
43+
start_period: 40s
44+
45+
sidekiq:
46+
image: ghcr.io/romkey/pdxhackerspace-member-manager:${IMAGE_VERSION:-latest}
47+
container_name: member-manager-sidekiq
48+
hostname: member-manager-sidekiq
49+
command: bundle exec sidekiq
50+
restart: unless-stopped
51+
env_file:
52+
- .env
53+
networks:
54+
- db
55+
- redis
56+
- mail
57+
volumes:
58+
- ../../log/rsyslog/access:/tmp/access:ro
59+
- ../../lib/member-manager/storage:/rails/storage:rw
60+
- ../../lib/member-manager/access-backups:/access-backups:rw
61+
- ./scripts:/opt/access:rw
62+
depends_on:
63+
redis:
64+
condition: service_healthy
65+
healthcheck:
66+
test: ["CMD-SHELL", "bundle exec rails runner 'exit(Sidekiq::ProcessSet.new.size > 0 ? 0 : 1)' || exit 1"]
67+
interval: 30s
68+
timeout: 10s
69+
retries: 3
70+
start_period: 30s
71+
72+
networks:
73+
redis:
74+
name: member-manager-redis-net
75+
proxy:
76+
external: true
77+
name: nginx-proxy-net
78+
db:
79+
external: true
80+
name: postgres-net
81+
mail:
82+
external: true
83+
name: postfix-net

apps/postfix/docker-compose.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,15 @@ services:
2020
ports:
2121
- 25:25
2222
- 587:587
23+
networks:
24+
- mail
2325

2426
mailq:
2527
<<: *base
2628
container_name: mailq
2729
restart: "no"
2830
command: mailq
31+
32+
networks:
33+
mail:
34+
name: postfix-net

bin/install-chaos.sh

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#
33
# install-chaos.sh
44
# Configures and starts all core and chaos-host services in dependency order.
5+
# Also installs and enables CUPS for local printing.
56
#
67
# All networks used by services in this script are created by services within
78
# this script. No external prerequisites required.
@@ -19,7 +20,7 @@ REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
1920
# ollama creates: llama-net
2021
# mdns-repeater creates: mdns-net (and ipvlan_net)
2122
# cloudflare-ddns no networks
22-
# postfix no networks
23+
# postfix creates: postfix-net
2324
# rsyslog no networks
2425
# snapserver host network mode
2526
#
@@ -32,8 +33,9 @@ REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
3233
# cyberchef needs: proxy
3334
# peanut needs: proxy
3435
#
35-
# Tier 2 - needs proxy + db, mariadb, mqtt, or llama
36+
# Tier 2 - needs proxy + db, mariadb, mqtt, llama, or mail
3637
# invidious needs: proxy, db
38+
# member-manager needs: proxy, db, mail
3739
# partdb needs: proxy, db
3840
# planka needs: proxy, db
3941
# statping needs: proxy, db
@@ -75,6 +77,7 @@ glances
7577
cyberchef
7678
peanut
7779
invidious
80+
member-manager
7881
partdb
7982
planka
8083
statping
@@ -92,6 +95,12 @@ mopidy
9295
db-backup
9396
"
9497

98+
echo "==> Installing system packages..."
99+
sudo apt-get install -y cups
100+
sudo systemctl enable --now cups
101+
echo "CUPS installed and enabled."
102+
echo ""
103+
95104
echo "==> Configuring all apps..."
96105
for app in $CHAOS_APPS; do
97106
echo " Configuring $app..."

0 commit comments

Comments
 (0)