Skip to content
This repository was archived by the owner on Nov 23, 2022. It is now read-only.

Commit 695fded

Browse files
committed
Basic wordpress example recipe
0 parents  commit 695fded

File tree

2 files changed

+351
-0
lines changed

2 files changed

+351
-0
lines changed

index.js

Lines changed: 339 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,339 @@
1+
const mysqlImage = 'mariadb:latest';
2+
const wordpressImage = 'wordpress:latest';
3+
const phpmyadminImage = 'phpmyadmin/phpmyadmin:latest';
4+
5+
exports.getQuestions = () => [
6+
{
7+
type: 'input',
8+
name: 'projectName',
9+
message: 'Wordpress project name:',
10+
},
11+
{
12+
type: 'input',
13+
name: 'mysqlPassword',
14+
message: 'MySQL root password:',
15+
},
16+
{
17+
type: 'input',
18+
name: 'wordpressDomain',
19+
message: 'Domain for Wordpress:',
20+
},
21+
{
22+
type: 'confirm',
23+
name: 'phpmyadminStart',
24+
message: 'Also start PHPMyAdmin?',
25+
},
26+
{
27+
type: 'input',
28+
name: 'phpmyadminDomain',
29+
message: 'Domain for PHPMyAdmin:',
30+
},
31+
];
32+
33+
const startMysql = async ({util, answers, serverConfig, username, docker}) => {
34+
// create and start mysql db
35+
const name = util.nameFromImage(mysqlImage);
36+
// env
37+
const Env = [`MYSQL_ROOT_PASSWORD=${answers.mysqlPassword}`];
38+
// restart policy
39+
const RestartPolicy = {
40+
Name: 'always',
41+
};
42+
// labels
43+
const Labels = {
44+
'exoframe.deployment': name,
45+
'exoframe.user': username,
46+
'exoframe.project': answers.projectName,
47+
'traefik.backend': name,
48+
};
49+
50+
// if running in swarm mode - run as swarm service
51+
if (serverConfig.swarm) {
52+
// create service config
53+
const serviceConfig = {
54+
Name: name,
55+
Labels,
56+
TaskTemplate: {
57+
ContainerSpec: {
58+
Image: mysqlImage,
59+
Env,
60+
},
61+
Resources: {
62+
Limits: {},
63+
Reservations: {},
64+
},
65+
RestartPolicy,
66+
Placement: {},
67+
},
68+
Mode: {
69+
Replicated: {
70+
Replicas: 1,
71+
},
72+
},
73+
UpdateConfig: {
74+
Parallelism: 2, // allow 2 instances to run at the same time
75+
Delay: 10000000000, // 10s
76+
Order: 'start-first', // start new instance first, then remove old one
77+
},
78+
Networks: [
79+
{
80+
Target: serverConfig.exoframeNetworkSwarm,
81+
Aliases: [name],
82+
},
83+
],
84+
};
85+
86+
// create service
87+
const service = await docker.daemon.createService(serviceConfig);
88+
89+
return service.inspect();
90+
}
91+
92+
// create config
93+
const containerConfig = {
94+
Image: mysqlImage,
95+
name,
96+
Env,
97+
Labels,
98+
HostConfig: {
99+
RestartPolicy,
100+
},
101+
NetworkingConfig: {
102+
EndpointsConfig: {
103+
exoframe: {
104+
Aliases: [name],
105+
},
106+
},
107+
},
108+
};
109+
110+
// create container
111+
const container = await docker.daemon.createContainer(containerConfig);
112+
113+
// connect container to exoframe network
114+
const exoNet = await docker.getNetwork();
115+
await exoNet.connect({
116+
Container: container.id,
117+
});
118+
119+
// start container
120+
await container.start();
121+
const containerInfo = await container.inspect();
122+
const containerData = docker.daemon.getContainer(containerInfo.Id);
123+
return containerData.inspect();
124+
};
125+
126+
const startWordpress = async ({util, answers, serverConfig, username, docker, mysql}) => {
127+
// create and start wordpress
128+
const name = util.nameFromImage(wordpressImage);
129+
// env
130+
const mysqlHost = serverConfig.swarm
131+
? mysql.Spec.Networks[0].Aliases
132+
: mysql.NetworkSettings.Networks.exoframe.Aliases[0];
133+
const Env = [`WORDPRESS_DB_HOST=${mysqlHost}`, `WORDPRESS_DB_PASSWORD=${answers.mysqlPassword}`];
134+
// restart policy
135+
const RestartPolicy = {
136+
Name: 'always',
137+
};
138+
// labels
139+
const baseLabels = serverConfig.swarm ? {'traefik.port': '80'} : {};
140+
const Labels = Object.assign(baseLabels, {
141+
'exoframe.deployment': name,
142+
'exoframe.user': username,
143+
'exoframe.project': answers.projectName,
144+
'traefik.backend': name,
145+
'traefik.frontend.rule': `Host:${answers.wordpressDomain}`,
146+
});
147+
148+
// if running in swarm mode - run as swarm service
149+
if (serverConfig.swarm) {
150+
// create service config
151+
const serviceConfig = {
152+
Name: name,
153+
Labels,
154+
TaskTemplate: {
155+
ContainerSpec: {
156+
Image: wordpressImage,
157+
Env,
158+
},
159+
Resources: {
160+
Limits: {},
161+
Reservations: {},
162+
},
163+
RestartPolicy,
164+
Placement: {},
165+
},
166+
Mode: {
167+
Replicated: {
168+
Replicas: 1,
169+
},
170+
},
171+
UpdateConfig: {
172+
Parallelism: 2, // allow 2 instances to run at the same time
173+
Delay: 10000000000, // 10s
174+
Order: 'start-first', // start new instance first, then remove old one
175+
},
176+
Networks: [
177+
{
178+
Target: serverConfig.exoframeNetworkSwarm,
179+
Aliases: [],
180+
},
181+
],
182+
};
183+
184+
// create service
185+
const service = await docker.daemon.createService(serviceConfig);
186+
187+
return service.inspect();
188+
}
189+
190+
// create config
191+
const containerConfig = {
192+
Image: wordpressImage,
193+
name,
194+
Env,
195+
Labels,
196+
HostConfig: {
197+
RestartPolicy,
198+
},
199+
};
200+
201+
// create container
202+
const container = await docker.daemon.createContainer(containerConfig);
203+
204+
// connect container to exoframe network
205+
const exoNet = await docker.getNetwork();
206+
await exoNet.connect({
207+
Container: container.id,
208+
});
209+
210+
// start container
211+
await container.start();
212+
const containerInfo = await container.inspect();
213+
const containerData = docker.daemon.getContainer(containerInfo.Id);
214+
return containerData.inspect();
215+
};
216+
217+
const startPhpmyadmin = async ({util, answers, serverConfig, username, docker, mysql}) => {
218+
// create and start phpmyadmin
219+
const name = util.nameFromImage(phpmyadminImage);
220+
// env
221+
const mysqlHost = serverConfig.swarm
222+
? mysql.Spec.Networks[0].Aliases
223+
: mysql.NetworkSettings.Networks.exoframe.Aliases[0];
224+
const Env = [`PMA_HOST=${mysqlHost}`, `MYSQL_ROOT_PASSWORD=${answers.mysqlPassword}`];
225+
// restart policy
226+
const RestartPolicy = {
227+
Name: 'always',
228+
};
229+
// labels
230+
const baseLabels = serverConfig.swarm ? {'traefik.port': '80'} : {};
231+
const Labels = Object.assign(baseLabels, {
232+
'exoframe.deployment': name,
233+
'exoframe.user': username,
234+
'exoframe.project': answers.projectName,
235+
'traefik.backend': name,
236+
'traefik.frontend.rule': `Host:${answers.phpmyadminDomain}`,
237+
});
238+
239+
// if running in swarm mode - run as swarm service
240+
if (serverConfig.swarm) {
241+
// create service config
242+
const serviceConfig = {
243+
Name: name,
244+
Labels,
245+
TaskTemplate: {
246+
ContainerSpec: {
247+
Image: phpmyadminImage,
248+
Env,
249+
},
250+
Resources: {
251+
Limits: {},
252+
Reservations: {},
253+
},
254+
RestartPolicy,
255+
Placement: {},
256+
},
257+
Mode: {
258+
Replicated: {
259+
Replicas: 1,
260+
},
261+
},
262+
UpdateConfig: {
263+
Parallelism: 2, // allow 2 instances to run at the same time
264+
Delay: 10000000000, // 10s
265+
Order: 'start-first', // start new instance first, then remove old one
266+
},
267+
Networks: [
268+
{
269+
Target: serverConfig.exoframeNetworkSwarm,
270+
Aliases: [],
271+
},
272+
],
273+
};
274+
275+
// create service
276+
const service = await docker.daemon.createService(serviceConfig);
277+
278+
return service.inspect();
279+
}
280+
281+
// create config
282+
const containerConfig = {
283+
Image: phpmyadminImage,
284+
name,
285+
Env,
286+
Labels,
287+
HostConfig: {
288+
RestartPolicy,
289+
},
290+
};
291+
292+
// create container
293+
const container = await docker.daemon.createContainer(containerConfig);
294+
295+
// connect container to exoframe network
296+
const exoNet = await docker.getNetwork();
297+
await exoNet.connect({
298+
Container: container.id,
299+
});
300+
301+
// start container
302+
await container.start();
303+
const containerInfo = await container.inspect();
304+
const containerData = docker.daemon.getContainer(containerInfo.Id);
305+
return containerData.inspect();
306+
};
307+
308+
exports.runSetup = async ({answers, serverConfig, username, docker, util}) => {
309+
// init log
310+
const log = [];
311+
312+
try {
313+
util.logger.debug('starting work..');
314+
// start mysql container
315+
util.logger.debug('starting mysql..');
316+
const mysql = await startMysql({util, answers, serverConfig, username, docker});
317+
log.push({message: 'Mysql container started', data: mysql, level: 'info'});
318+
util.logger.debug('created mysql container..');
319+
320+
// start wordpress container
321+
util.logger.debug('starting wordpress..');
322+
const wordpress = await startWordpress({util, answers, serverConfig, username, docker, mysql});
323+
log.push({message: 'Wordpress container started', data: wordpress, level: 'info'});
324+
util.logger.debug('created wordpress container..');
325+
326+
// start phpmyadmin if needed
327+
if (answers.phpmyadminStart) {
328+
util.logger.debug('starting phpmyadmin..');
329+
const phpmyadmin = await startPhpmyadmin({util, answers, serverConfig, username, docker, mysql});
330+
log.push({message: 'PHPMyAdmin container started', data: phpmyadmin, level: 'info'});
331+
util.logger.debug('created phpmyadmin container..');
332+
}
333+
} catch (e) {
334+
util.logger.error('error:', e);
335+
log.push({message: e.toString(), data: e, level: 'error'});
336+
}
337+
338+
return log;
339+
};

package.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"name": "exoframe-recipe-wordpress",
3+
"version": "0.1.0",
4+
"description": "",
5+
"main": "index.js",
6+
"scripts": {
7+
"test": "echo \"Error: no test specified\" && exit 1"
8+
},
9+
"keywords": [],
10+
"author": "Tim Ermilov <[email protected]> (http://codezen.net)",
11+
"license": "MIT"
12+
}

0 commit comments

Comments
 (0)