Skip to content

Commit 883b38e

Browse files
author
AlexF
committed
initial commit
0 parents  commit 883b38e

File tree

107 files changed

+9086
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

107 files changed

+9086
-0
lines changed

.gitignore

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
*.tfstate
2+
*.tfstate.backup
3+
*.info
4+
.terraform
5+
*.svg
6+
7+
8+

Dockerfile

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
FROM alpine:3.10
2+
3+
RUN apk --no-cache add php7 php7-fpm php7-mysqli php7-dba php7-snmp php7-soap php7-bcmath php7-pdo php7-json php7-openssl php7-curl \
4+
php7-zlib php7-xml php7-phar php7-intl php7-dom php7-xmlreader php7-ctype php7-session \
5+
php7-mbstring php7-gd php7-tokenizer php7-pdo_mysql nginx supervisor curl && \
6+
chown -R nobody.nobody /run && \
7+
chown -R nobody.nobody /var/lib/nginx && \
8+
chown -R nobody.nobody /var/tmp/nginx && \
9+
chown -R nobody.nobody /var/log/nginx && \
10+
mkdir -p /var/www/html
11+
12+
COPY config/nginx.conf /etc/nginx/nginx.conf
13+
COPY config/fpm-pool.conf /etc/php7/php-fpm.d/www.conf
14+
COPY config/php.ini /etc/php7/conf.d/zzz_custom.ini
15+
COPY config/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
16+
17+
VOLUME /var/www/html
18+
19+
USER nobody
20+
21+
WORKDIR /var/www/html
22+
COPY --chown=nobody app/ /var/www/html/
23+
RUN chmod 755 /var/www/html/storage
24+
25+
EXPOSE 8080
26+
27+
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
28+
29+
HEALTHCHECK --timeout=10s CMD curl --silent --fail http://127.0.0.1:8080/fpm-ping

README.md

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# Simple Laravel (PHP framework) based application managed by Terraform and AWS.
2+
3+
It uses EC2, ECS, RDS, CloudFront, S3 AWS services and was tested by Terraform v0.11.14 on us-east-2 AWS region.
4+
5+
Directories description:
6+
7+
`app` - Laravel application which uses RDS and CloudFront+S3 as content storage.
8+
9+
`config` - Nginx and PHP-fpm configs for building the Docker image.
10+
11+
`modules` - Terraform modules.
12+
13+
Deployed application will be available as: http://YOUR_EC2_IP and DB connection check: http://YOUR_EC2_IP/dbcheck (or CHECK DB CONNECTION link on main page).
14+
15+
16+
## How to deploy
17+
18+
Replace `CHANGE_ME` in terraform.tfvars file to proper values.
19+
20+
The Docker image (`docker_image = "alrf/laravel:12345"` in terraform.tfvars) with configured Nginx, PHP and application code is already prepared and pushed, can be rebuilt by:
21+
22+
`docker build -t alrf/laravel:12345 -f Dockerfile . --network=host`
23+
24+
It doesn't contain any private data (like DB/AWS-creds, etc..) - application uses ENV-variables which are passed from terraform.tfvars as ENV-variables in ecs terraform module.
25+
26+
Deploying to AWS:
27+
28+
`terraform init`
29+
30+
Terraform modules for VPC don't resolve dependancies correctly, so explictly build VPC first:
31+
32+
`terraform apply -target=module.network`
33+
34+
and now:
35+
36+
`terraform apply`
37+
38+
39+
## Extra
40+
41+
# Monitoring/Alerting
42+
43+
CloudWatch Metrics (EC2, ECS metrics are available), CloudWatch Alarms can be used.
44+
45+
# Security
46+
47+
Different Security Groups for application and RDS are used.
48+
49+
# Automation
50+
51+
All variables for deployment are mananged by terraform.tfvars.
52+
53+
Further automation process can use Jenkins for building Docker images with updated application code and for building different AWS environments - scaled vertically (changing EC2 instance types) and horizontally (changing amount of instances).
54+
55+
# Network diagrams
56+
57+
Can be built by:
58+
59+
`terraform graph modules/network | dot -Tsvg > graph.svg`

app/.editorconfig

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
root = true
2+
3+
[*]
4+
charset = utf-8
5+
end_of_line = lf
6+
insert_final_newline = true
7+
indent_style = space
8+
indent_size = 4
9+
trim_trailing_whitespace = true
10+
11+
[*.md]
12+
trim_trailing_whitespace = false
13+
14+
[*.yml]
15+
indent_style = space
16+
indent_size = 2

app/.env.example

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
APP_NAME=Laravel
2+
APP_ENV=local
3+
APP_KEY=
4+
APP_DEBUG=true
5+
APP_URL=http://localhost
6+
7+
LOG_CHANNEL=stack
8+
9+
DB_CONNECTION=mysql
10+
DB_HOST=127.0.0.1
11+
DB_PORT=3306
12+
DB_DATABASE=homestead
13+
DB_USERNAME=homestead
14+
DB_PASSWORD=secret
15+
16+
BROADCAST_DRIVER=log
17+
CACHE_DRIVER=file
18+
SESSION_DRIVER=file
19+
SESSION_LIFETIME=120
20+
QUEUE_DRIVER=sync
21+
22+
REDIS_HOST=127.0.0.1
23+
REDIS_PASSWORD=null
24+
REDIS_PORT=6379
25+
26+
MAIL_DRIVER=smtp
27+
MAIL_HOST=smtp.mailtrap.io
28+
MAIL_PORT=2525
29+
MAIL_USERNAME=null
30+
MAIL_PASSWORD=null
31+
MAIL_ENCRYPTION=null
32+
33+
PUSHER_APP_ID=
34+
PUSHER_APP_KEY=
35+
PUSHER_APP_SECRET=
36+
PUSHER_APP_CLUSTER=mt1
37+
38+
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
39+
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

app/.gitattributes

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
* text=auto
2+
*.css linguist-vendored
3+
*.scss linguist-vendored
4+
*.js linguist-vendored
5+
CHANGELOG.md export-ignore

app/.gitignore

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/node_modules
2+
/public/hot
3+
/public/storage
4+
/storage/*.key
5+
/vendor
6+
/.idea
7+
/.vscode
8+
/.vagrant
9+
Homestead.json
10+
Homestead.yaml
11+
npm-debug.log
12+
yarn-error.log
13+
.env
14+
.phpunit.result.cache

app/app/Console/Kernel.php

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
namespace App\Console;
4+
5+
use Illuminate\Console\Scheduling\Schedule;
6+
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
7+
8+
class Kernel extends ConsoleKernel
9+
{
10+
/**
11+
* The Artisan commands provided by your application.
12+
*
13+
* @var array
14+
*/
15+
protected $commands = [
16+
//
17+
];
18+
19+
/**
20+
* Define the application's command schedule.
21+
*
22+
* @param \Illuminate\Console\Scheduling\Schedule $schedule
23+
* @return void
24+
*/
25+
protected function schedule(Schedule $schedule)
26+
{
27+
// $schedule->command('inspire')
28+
// ->hourly();
29+
}
30+
31+
/**
32+
* Register the commands for the application.
33+
*
34+
* @return void
35+
*/
36+
protected function commands()
37+
{
38+
$this->load(__DIR__.'/Commands');
39+
40+
require base_path('routes/console.php');
41+
}
42+
}

app/app/Exceptions/Handler.php

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
3+
namespace App\Exceptions;
4+
5+
use Exception;
6+
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
7+
8+
class Handler extends ExceptionHandler
9+
{
10+
/**
11+
* A list of the exception types that are not reported.
12+
*
13+
* @var array
14+
*/
15+
protected $dontReport = [
16+
//
17+
];
18+
19+
/**
20+
* A list of the inputs that are never flashed for validation exceptions.
21+
*
22+
* @var array
23+
*/
24+
protected $dontFlash = [
25+
'password',
26+
'password_confirmation',
27+
];
28+
29+
/**
30+
* Report or log an exception.
31+
*
32+
* @param \Exception $exception
33+
* @return void
34+
*/
35+
public function report(Exception $exception)
36+
{
37+
parent::report($exception);
38+
}
39+
40+
/**
41+
* Render an exception into an HTTP response.
42+
*
43+
* @param \Illuminate\Http\Request $request
44+
* @param \Exception $exception
45+
* @return \Illuminate\Http\Response
46+
*/
47+
public function render($request, Exception $exception)
48+
{
49+
return parent::render($request, $exception);
50+
}
51+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Auth;
4+
5+
use App\Http\Controllers\Controller;
6+
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
7+
8+
class ForgotPasswordController extends Controller
9+
{
10+
/*
11+
|--------------------------------------------------------------------------
12+
| Password Reset Controller
13+
|--------------------------------------------------------------------------
14+
|
15+
| This controller is responsible for handling password reset emails and
16+
| includes a trait which assists in sending these notifications from
17+
| your application to your users. Feel free to explore this trait.
18+
|
19+
*/
20+
21+
use SendsPasswordResetEmails;
22+
23+
/**
24+
* Create a new controller instance.
25+
*
26+
* @return void
27+
*/
28+
public function __construct()
29+
{
30+
$this->middleware('guest');
31+
}
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Auth;
4+
5+
use App\Http\Controllers\Controller;
6+
use Illuminate\Foundation\Auth\AuthenticatesUsers;
7+
8+
class LoginController extends Controller
9+
{
10+
/*
11+
|--------------------------------------------------------------------------
12+
| Login Controller
13+
|--------------------------------------------------------------------------
14+
|
15+
| This controller handles authenticating users for the application and
16+
| redirecting them to your home screen. The controller uses a trait
17+
| to conveniently provide its functionality to your applications.
18+
|
19+
*/
20+
21+
use AuthenticatesUsers;
22+
23+
/**
24+
* Where to redirect users after login.
25+
*
26+
* @var string
27+
*/
28+
protected $redirectTo = '/home';
29+
30+
/**
31+
* Create a new controller instance.
32+
*
33+
* @return void
34+
*/
35+
public function __construct()
36+
{
37+
$this->middleware('guest')->except('logout');
38+
}
39+
}

0 commit comments

Comments
 (0)