Skip to content

Commit 0d8ba8a

Browse files
authored
fix: automate full container self-initialisation; remove ## Installation from README
1 parent a90ef13 commit 0d8ba8a

6 files changed

Lines changed: 117 additions & 119 deletions

File tree

README.md

Lines changed: 9 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -50,76 +50,23 @@ Review the selected GitHub issue and create a Stackfield task.
5050

5151
| Requirement | Notes |
5252
|---|---|
53-
| x0 framework | Follow [x0 INSTALL.md](https://github.com/WEBcodeX1/x0/blob/main/INSTALL.md) |
54-
| PostgreSQL ≥ 14 | Shared with x0 |
55-
| Python ≥ 3.10 | `requests`, `psycopg2`, `pgdbpool`, `python-micro-esb` |
53+
| Docker Engine | With Compose V2 (`docker compose`) |
5654
| GitHub Personal Access Token | Needs `repo` scope for private repos, `public_repo` for public |
5755
| Stackfield API token | See Stackfield workspace settings → Integrations → API |
5856

5957
---
6058

61-
## Installation
62-
63-
### 1. Set up x0
64-
65-
Follow the official x0 installation guide to get the base framework running with PostgreSQL.
66-
67-
### 2. Install Python dependencies
68-
69-
```bash
70-
pip install requests psycopg2-binary pgdbpool
71-
pip install git+https://github.com/clauspruefer/python-micro-esb.git
72-
```
73-
74-
### 3. Run database setup scripts
75-
76-
Connect to your x0 PostgreSQL database and execute the scripts in order:
77-
78-
```bash
79-
psql -U postgres -d x0 -f database/01-create-schema.sql
80-
psql -U postgres -d x0 -f database/02-insert-config.sql
81-
psql -U postgres -d x0 -f database/03-insert-text.sql
82-
```
83-
84-
### 4. Deploy static files
85-
86-
Copy the `static/` directory so it is served at `/static/github2sf/`:
87-
88-
```bash
89-
cp -r static/ /var/www/vhosts/x0/static/github2sf/
90-
```
91-
92-
### 5. Deploy Python backend
93-
94-
Copy the `python/` directory into the x0 Python directory:
95-
96-
```bash
97-
cp python/*.py /var/www/vhosts/x0/python/github2sf/
98-
```
99-
100-
### 6. Configure Apache2
101-
102-
Copy `docker/apache2.conf` to `/etc/apache2/conf-enabled/github2sf.conf` and reload:
103-
104-
```bash
105-
cp docker/apache2.conf /etc/apache2/conf-enabled/github2sf.conf
106-
apache2ctl graceful
107-
```
108-
109-
### 7. Open the application
110-
111-
Navigate to `http://your-server/?appid=github2sf` in your browser.
112-
113-
---
114-
11559
## Docker (quick start)
11660

11761
The application uses the official x0 container images:
11862

11963
- **`ghcr.io/webcodex1/x0-app`** — Apache2 + mod_wsgi web application server with the x0 JavaScript framework pre-installed ([packages page](https://github.com/WEBcodeX1/x0/pkgs/container/x0-app))
12064
- **`ghcr.io/webcodex1/x0-db`** — PostgreSQL 16 database with the x0 schema pre-installed ([packages page](https://github.com/WEBcodeX1/x0/pkgs/container/x0-db))
12165

122-
The `docker/Dockerfile` extends `ghcr.io/webcodex1/x0-app` and adds the github2stackfield Python backend dependencies on top.
66+
Both custom images are built automatically on `docker compose up --build`:
67+
68+
- `docker/Dockerfile` extends `ghcr.io/webcodex1/x0-app` and copies all static files, Python WSGI scripts, and the Apache2 config snippet into the image.
69+
- `docker/Dockerfile.db` extends `ghcr.io/webcodex1/x0-db` and runs the github2stackfield SQL init scripts (`database/0*.sql`) against the x0 database on first start.
12370

12471
```bash
12572
cd docker
@@ -128,13 +75,7 @@ docker compose up --build
12875

12976
Then open [http://localhost:8080/?appid=github2sf](http://localhost:8080/?appid=github2sf).
13077

131-
> **Database setup:** After the containers are running, execute the SQL scripts against the x0-db container:
132-
>
133-
> ```bash
134-
> docker exec -i github2sf-db psql -U postgres -d x0 -f /dev/stdin < database/01-create-schema.sql
135-
> docker exec -i github2sf-db psql -U postgres -d x0 -f /dev/stdin < database/02-insert-config.sql
136-
> docker exec -i github2sf-db psql -U postgres -d x0 -f /dev/stdin < database/03-insert-text.sql
137-
> ```
78+
No further manual configuration is required.
13879

13980
---
14081

@@ -161,8 +102,10 @@ github2stackfield/
161102
│ ├── 02-insert-config.sql # x0 app configuration rows
162103
│ └── 03-insert-text.sql # UI text / i18n entries
163104
├── docker/
164-
│ ├── Dockerfile
105+
│ ├── Dockerfile # extends x0-app, bakes in static/ python/ apache2.conf
106+
│ ├── Dockerfile.db # extends x0-db, auto-inits github2sf schema on startup
165107
│ ├── docker-compose.yml
108+
│ ├── db-init.sh # startup script used by Dockerfile.db
166109
│ └── apache2.conf
167110
└── README.md
168111
```

database/03-insert-text.sql

Lines changed: 44 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -9,108 +9,108 @@
99

1010
-- Navigation / Menu
1111
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
12-
('TXT.MENU.SCREEN1', 'menu', 'API-Zugangsdaten', 'User Credentials');
12+
('TXT.MENU.SCREEN1', 'menu', 'API-Zugangsdaten', 'User Credentials') ON CONFLICT (id) DO NOTHING;
1313
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
14-
('TXT.MENU.SCREEN2', 'menu', 'Issue / Aufgaben-Mapping', 'Issue / Task Mapping');
14+
('TXT.MENU.SCREEN2', 'menu', 'Issue / Aufgaben-Mapping', 'Issue / Task Mapping') ON CONFLICT (id) DO NOTHING;
1515
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
16-
('TXT.MENU.SCREEN3', 'menu', 'Stackfield-Aufgabe verbinden', 'Connect Stackfield Task');
16+
('TXT.MENU.SCREEN3', 'menu', 'Stackfield-Aufgabe verbinden', 'Connect Stackfield Task') ON CONFLICT (id) DO NOTHING;
1717

1818
-- Screen 1 – GitHub Credentials
1919
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
20-
('TXT.SCREEN1.GITHUB.SECTION.HEADER', 'screen1', 'GitHub API-Zugangsdaten', 'GitHub API Credentials');
20+
('TXT.SCREEN1.GITHUB.SECTION.HEADER', 'screen1', 'GitHub API-Zugangsdaten', 'GitHub API Credentials') ON CONFLICT (id) DO NOTHING;
2121
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
22-
('TXT.SCREEN1.GITHUB.SECTION.SUBHEADER', 'screen1', 'Benutzername und Personal Access Token eingeben', 'Enter your GitHub username and Personal Access Token');
22+
('TXT.SCREEN1.GITHUB.SECTION.SUBHEADER', 'screen1', 'Benutzername und Personal Access Token eingeben', 'Enter your GitHub username and Personal Access Token') ON CONFLICT (id) DO NOTHING;
2323
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
24-
('TXT.SCREEN1.GITHUB.USER.LABEL', 'screen1', 'GitHub Benutzername', 'GitHub Username');
24+
('TXT.SCREEN1.GITHUB.USER.LABEL', 'screen1', 'GitHub Benutzername', 'GitHub Username') ON CONFLICT (id) DO NOTHING;
2525
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
26-
('TXT.SCREEN1.GITHUB.TOKEN.LABEL', 'screen1', 'GitHub Personal Access Token', 'GitHub Personal Access Token');
26+
('TXT.SCREEN1.GITHUB.TOKEN.LABEL', 'screen1', 'GitHub Personal Access Token', 'GitHub Personal Access Token') ON CONFLICT (id) DO NOTHING;
2727
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
28-
('TXT.SCREEN1.GITHUB.VERIFY.BUTTON', 'screen1', 'GitHub Zugangsdaten prüfen', 'Verify GitHub Credentials');
28+
('TXT.SCREEN1.GITHUB.VERIFY.BUTTON', 'screen1', 'GitHub Zugangsdaten prüfen', 'Verify GitHub Credentials') ON CONFLICT (id) DO NOTHING;
2929
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
30-
('TXT.SCREEN1.GITHUB.VERIFY.NOTIFY', 'screen1', 'GitHub Authentifizierung', 'GitHub Authentication');
30+
('TXT.SCREEN1.GITHUB.VERIFY.NOTIFY', 'screen1', 'GitHub Authentifizierung', 'GitHub Authentication') ON CONFLICT (id) DO NOTHING;
3131

3232
-- Screen 1 – Stackfield Credentials
3333
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
34-
('TXT.SCREEN1.STACKFIELD.SECTION.HEADER', 'screen1', 'Stackfield API-Zugangsdaten', 'Stackfield API Credentials');
34+
('TXT.SCREEN1.STACKFIELD.SECTION.HEADER', 'screen1', 'Stackfield API-Zugangsdaten', 'Stackfield API Credentials') ON CONFLICT (id) DO NOTHING;
3535
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
36-
('TXT.SCREEN1.STACKFIELD.SECTION.SUBHEADER', 'screen1', 'E-Mail-Adresse und API-Token eingeben', 'Enter your Stackfield email and API token');
36+
('TXT.SCREEN1.STACKFIELD.SECTION.SUBHEADER', 'screen1', 'E-Mail-Adresse und API-Token eingeben', 'Enter your Stackfield email and API token') ON CONFLICT (id) DO NOTHING;
3737
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
38-
('TXT.SCREEN1.STACKFIELD.EMAIL.LABEL', 'screen1', 'Stackfield E-Mail', 'Stackfield Email');
38+
('TXT.SCREEN1.STACKFIELD.EMAIL.LABEL', 'screen1', 'Stackfield E-Mail', 'Stackfield Email') ON CONFLICT (id) DO NOTHING;
3939
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
40-
('TXT.SCREEN1.STACKFIELD.TOKEN.LABEL', 'screen1', 'Stackfield API-Token', 'Stackfield API Token');
40+
('TXT.SCREEN1.STACKFIELD.TOKEN.LABEL', 'screen1', 'Stackfield API-Token', 'Stackfield API Token') ON CONFLICT (id) DO NOTHING;
4141
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
42-
('TXT.SCREEN1.STACKFIELD.VERIFY.BUTTON', 'screen1', 'Stackfield Zugangsdaten prüfen', 'Verify Stackfield Credentials');
42+
('TXT.SCREEN1.STACKFIELD.VERIFY.BUTTON', 'screen1', 'Stackfield Zugangsdaten prüfen', 'Verify Stackfield Credentials') ON CONFLICT (id) DO NOTHING;
4343
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
44-
('TXT.SCREEN1.STACKFIELD.VERIFY.NOTIFY', 'screen1', 'Stackfield Authentifizierung', 'Stackfield Authentication');
44+
('TXT.SCREEN1.STACKFIELD.VERIFY.NOTIFY', 'screen1', 'Stackfield Authentifizierung', 'Stackfield Authentication') ON CONFLICT (id) DO NOTHING;
4545

4646
-- Screen 2 – Search
4747
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
48-
('TXT.SCREEN2.SEARCH.SECTION.HEADER', 'screen2', 'GitHub Issues suchen', 'Search GitHub Issues');
48+
('TXT.SCREEN2.SEARCH.SECTION.HEADER', 'screen2', 'GitHub Issues suchen', 'Search GitHub Issues') ON CONFLICT (id) DO NOTHING;
4949
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
50-
('TXT.SCREEN2.SEARCH.SECTION.SUBHEADER', 'screen2', 'Repository und Suchbegriff eingeben', 'Enter the repository and an optional search term');
50+
('TXT.SCREEN2.SEARCH.SECTION.SUBHEADER', 'screen2', 'Repository und Suchbegriff eingeben', 'Enter the repository and an optional search term') ON CONFLICT (id) DO NOTHING;
5151
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
52-
('TXT.SCREEN2.SEARCH.QUERY.LABEL', 'screen2', 'Suchbegriff (optional)', 'Search query (optional)');
52+
('TXT.SCREEN2.SEARCH.QUERY.LABEL', 'screen2', 'Suchbegriff (optional)', 'Search query (optional)') ON CONFLICT (id) DO NOTHING;
5353
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
54-
('TXT.SCREEN2.SEARCH.REPO.LABEL', 'screen2', 'Repository (owner/repo)', 'Repository (owner/repo)');
54+
('TXT.SCREEN2.SEARCH.REPO.LABEL', 'screen2', 'Repository (owner/repo)', 'Repository (owner/repo)') ON CONFLICT (id) DO NOTHING;
5555
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
56-
('TXT.SCREEN2.SEARCH.BUTTON', 'screen2', 'Issues suchen', 'Search Issues');
56+
('TXT.SCREEN2.SEARCH.BUTTON', 'screen2', 'Issues suchen', 'Search Issues') ON CONFLICT (id) DO NOTHING;
5757

5858
-- Screen 2 – Issue List columns
5959
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
60-
('TXT.SCREEN2.LIST.COL.NUMBER', 'screen2', 'Nr.', '#');
60+
('TXT.SCREEN2.LIST.COL.NUMBER', 'screen2', 'Nr.', '#') ON CONFLICT (id) DO NOTHING;
6161
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
62-
('TXT.SCREEN2.LIST.COL.TITLE', 'screen2', 'Titel', 'Title');
62+
('TXT.SCREEN2.LIST.COL.TITLE', 'screen2', 'Titel', 'Title') ON CONFLICT (id) DO NOTHING;
6363
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
64-
('TXT.SCREEN2.LIST.COL.STATE', 'screen2', 'Status', 'State');
64+
('TXT.SCREEN2.LIST.COL.STATE', 'screen2', 'Status', 'State') ON CONFLICT (id) DO NOTHING;
6565
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
66-
('TXT.SCREEN2.LIST.COL.CREATED', 'screen2', 'Erstellt', 'Created');
66+
('TXT.SCREEN2.LIST.COL.CREATED', 'screen2', 'Erstellt', 'Created') ON CONFLICT (id) DO NOTHING;
6767
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
68-
('TXT.SCREEN2.LIST.COL.ASSIGNEE', 'screen2', 'Zugewiesen', 'Assignee');
68+
('TXT.SCREEN2.LIST.COL.ASSIGNEE', 'screen2', 'Zugewiesen', 'Assignee') ON CONFLICT (id) DO NOTHING;
6969

7070
-- Screen 2 – Context menu
7171
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
72-
('TXT.SCREEN2.CONTEXTMENU.CONNECT', 'screen2', 'Stackfield-Aufgabe verbinden', 'Connect Stackfield Task');
72+
('TXT.SCREEN2.CONTEXTMENU.CONNECT', 'screen2', 'Stackfield-Aufgabe verbinden', 'Connect Stackfield Task') ON CONFLICT (id) DO NOTHING;
7373

7474
-- Screen 3 – GitHub Issue Details
7575
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
76-
('TXT.SCREEN3.ISSUE.SECTION.HEADER', 'screen3', 'GitHub Issue Eigenschaften', 'GitHub Issue Properties');
76+
('TXT.SCREEN3.ISSUE.SECTION.HEADER', 'screen3', 'GitHub Issue Eigenschaften', 'GitHub Issue Properties') ON CONFLICT (id) DO NOTHING;
7777
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
78-
('TXT.SCREEN3.ISSUE.SECTION.SUBHEADER', 'screen3', 'Daten aus der GitHub API', 'Data from the GitHub API');
78+
('TXT.SCREEN3.ISSUE.SECTION.SUBHEADER', 'screen3', 'Daten aus der GitHub API', 'Data from the GitHub API') ON CONFLICT (id) DO NOTHING;
7979
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
80-
('TXT.SCREEN3.ISSUE.NUMBER.LABEL', 'screen3', 'Issue-Nummer', 'Issue Number');
80+
('TXT.SCREEN3.ISSUE.NUMBER.LABEL', 'screen3', 'Issue-Nummer', 'Issue Number') ON CONFLICT (id) DO NOTHING;
8181
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
82-
('TXT.SCREEN3.ISSUE.STATE.LABEL', 'screen3', 'Status', 'State');
82+
('TXT.SCREEN3.ISSUE.STATE.LABEL', 'screen3', 'Status', 'State') ON CONFLICT (id) DO NOTHING;
8383
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
84-
('TXT.SCREEN3.ISSUE.TITLE.LABEL', 'screen3', 'Titel', 'Title');
84+
('TXT.SCREEN3.ISSUE.TITLE.LABEL', 'screen3', 'Titel', 'Title') ON CONFLICT (id) DO NOTHING;
8585
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
86-
('TXT.SCREEN3.ISSUE.URL.LABEL', 'screen3', 'GitHub URL', 'GitHub URL');
86+
('TXT.SCREEN3.ISSUE.URL.LABEL', 'screen3', 'GitHub URL', 'GitHub URL') ON CONFLICT (id) DO NOTHING;
8787

8888
-- Screen 3 – Stackfield Mapping
8989
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
90-
('TXT.SCREEN3.STACKFIELD.SECTION.HEADER', 'screen3', 'Stackfield Aufgaben-Zuordnung', 'Stackfield Task Mapping');
90+
('TXT.SCREEN3.STACKFIELD.SECTION.HEADER', 'screen3', 'Stackfield Aufgaben-Zuordnung', 'Stackfield Task Mapping') ON CONFLICT (id) DO NOTHING;
9191
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
92-
('TXT.SCREEN3.STACKFIELD.SECTION.SUBHEADER', 'screen3', 'Ziel-Raum und Aufgaben-Details', 'Target room and task details');
92+
('TXT.SCREEN3.STACKFIELD.SECTION.SUBHEADER', 'screen3', 'Ziel-Raum und Aufgaben-Details', 'Target room and task details') ON CONFLICT (id) DO NOTHING;
9393
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
94-
('TXT.SCREEN3.STACKFIELD.ROOM.LABEL', 'screen3', 'Stackfield Raum-ID', 'Stackfield Room ID');
94+
('TXT.SCREEN3.STACKFIELD.ROOM.LABEL', 'screen3', 'Stackfield Raum-ID', 'Stackfield Room ID') ON CONFLICT (id) DO NOTHING;
9595
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
96-
('TXT.SCREEN3.TASK.TITLE.LABEL', 'screen3', 'Aufgaben-Titel', 'Task Title');
96+
('TXT.SCREEN3.TASK.TITLE.LABEL', 'screen3', 'Aufgaben-Titel', 'Task Title') ON CONFLICT (id) DO NOTHING;
9797
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
98-
('TXT.SCREEN3.TASK.DESC.LABEL', 'screen3', 'Beschreibung', 'Description');
98+
('TXT.SCREEN3.TASK.DESC.LABEL', 'screen3', 'Beschreibung', 'Description') ON CONFLICT (id) DO NOTHING;
9999
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
100-
('TXT.SCREEN3.TASK.PRIORITY.LABEL', 'screen3', 'Priorität', 'Priority');
100+
('TXT.SCREEN3.TASK.PRIORITY.LABEL', 'screen3', 'Priorität', 'Priority') ON CONFLICT (id) DO NOTHING;
101101

102102
-- Screen 3 – Priority options
103103
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
104-
('TXT.SCREEN3.PRIORITY.LOW', 'screen3', 'Niedrig', 'Low');
104+
('TXT.SCREEN3.PRIORITY.LOW', 'screen3', 'Niedrig', 'Low') ON CONFLICT (id) DO NOTHING;
105105
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
106-
('TXT.SCREEN3.PRIORITY.MEDIUM', 'screen3', 'Mittel', 'Medium');
106+
('TXT.SCREEN3.PRIORITY.MEDIUM', 'screen3', 'Mittel', 'Medium') ON CONFLICT (id) DO NOTHING;
107107
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
108-
('TXT.SCREEN3.PRIORITY.HIGH', 'screen3', 'Hoch', 'High');
108+
('TXT.SCREEN3.PRIORITY.HIGH', 'screen3', 'Hoch', 'High') ON CONFLICT (id) DO NOTHING;
109109
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
110-
('TXT.SCREEN3.PRIORITY.URGENT', 'screen3', 'Dringend', 'Urgent');
110+
('TXT.SCREEN3.PRIORITY.URGENT', 'screen3', 'Dringend', 'Urgent') ON CONFLICT (id) DO NOTHING;
111111

112112
-- Screen 3 – Create button
113113
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
114-
('TXT.SCREEN3.CREATE.BUTTON', 'screen3', 'Neue Stackfield-Aufgabe erstellen', 'Create New Stackfield Task');
114+
('TXT.SCREEN3.CREATE.BUTTON', 'screen3', 'Neue Stackfield-Aufgabe erstellen', 'Create New Stackfield Task') ON CONFLICT (id) DO NOTHING;
115115
INSERT INTO webui.text (id, "group", value_de, value_en) VALUES
116-
('TXT.SCREEN3.CREATE.NOTIFY', 'screen3', 'Stackfield Aufgabe erstellen', 'Create Stackfield Task');
116+
('TXT.SCREEN3.CREATE.NOTIFY', 'screen3', 'Stackfield Aufgabe erstellen', 'Create Stackfield Task') ON CONFLICT (id) DO NOTHING;

docker/Dockerfile

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,12 @@ RUN pip3 install --no-cache-dir --break-system-packages \
1111
psycopg2-binary \
1212
pgdbpool \
1313
git+https://github.com/clauspruefer/python-micro-esb.git
14+
15+
# Copy static x0 config files into the web-server document root
16+
COPY static/ /var/www/vhosts/x0/static/github2sf/
17+
18+
# Copy Python WSGI backend scripts into the x0 python directory
19+
COPY python/ /var/www/vhosts/x0/python/github2sf/
20+
21+
# Install the supplementary Apache2 configuration snippet
22+
COPY docker/apache2.conf /etc/apache2/conf-enabled/github2sf.conf

docker/Dockerfile.db

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
FROM ghcr.io/webcodex1/x0-db
2+
3+
# Copy the github2stackfield SQL init scripts into the container
4+
COPY database/ /opt/github2sf-init/
5+
6+
# Copy the custom startup script and make it executable
7+
COPY docker/db-init.sh /root/github2sf-start.sh
8+
RUN chmod +x /root/github2sf-start.sh
9+
10+
# Override the default x0-db startup with our initialising script
11+
CMD ["/root/github2sf-start.sh"]

docker/db-init.sh

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#!/bin/bash
2+
# ]*[ --------------------------------------------------------------------- ]*[
3+
# . github2stackfield - x0-db automatic database initialisation .
4+
# . .
5+
# . Replaces the default x0-db start script. .
6+
# . Starts PostgreSQL, waits until it accepts connections, applies the .
7+
# . github2stackfield SQL scripts against the x0 database, then keeps .
8+
# . the server running. .
9+
# ]*[ --------------------------------------------------------------------- ]*[
10+
set -e
11+
12+
chown -R postgres:postgres /var/lib/postgresql/16/main/
13+
chown -R postgres:postgres /var/run/postgresql/
14+
15+
# Start PostgreSQL in the background
16+
su -c "/usr/lib/postgresql/16/bin/postgres -D /var/lib/postgresql/16/main" postgres &
17+
PG_PID=$!
18+
19+
# Wait until PostgreSQL is ready to accept connections
20+
echo "Waiting for PostgreSQL to be ready..."
21+
until su -c "pg_isready -q -U postgres -d x0" postgres 2>/dev/null; do
22+
sleep 1
23+
done
24+
echo "PostgreSQL is ready."
25+
26+
# Apply github2stackfield database init scripts to the x0 database.
27+
# All scripts are idempotent and safe to re-run on container restart.
28+
echo "Applying github2stackfield database init scripts..."
29+
su -c "psql -d x0 -f /opt/github2sf-init/01-create-schema.sql" postgres
30+
su -c "psql -d x0 -f /opt/github2sf-init/02-insert-config.sql" postgres
31+
su -c "psql -d x0 -f /opt/github2sf-init/03-insert-text.sql" postgres
32+
echo "Database initialisation complete."
33+
34+
# Keep the container alive by waiting for the PostgreSQL process
35+
wait $PG_PID

0 commit comments

Comments
 (0)