コミットを比較

..

共通のコミットはありません。 "newbackend" と "17169605594832515d173a212b38aca23553178c" の履歴はすべて異なっています。

53個のファイルの変更142行の追加180881行の削除

ファイルの表示

@ -1,74 +1,7 @@
# kikikanri
危機管理クラウドアプリ\
ランサーズに居る(株)ZOTMANの「chankan」というクライエント向け作りましたが、月プロジェクトをもう完了しましたのに、全然払わないですので、危機管理はオープンソース化にしました。
危機管理クラウドアプリ
ランサーズのスタッフ及び警察官も応援していませんので、この問題は自分で解決します。\
chankanさんは詐欺師ですので、本当に本当にご注意下さい。
私はバックエンド部分を作りました、もう一人はフロントエンドを作りました。\
chankanさんはフロントエンドの開発者も全然払いません。\
フロントエンドの開発者による、chankanさんは私達だけじゃなくて、全てのフリーランサーの開発者を払いません。
こちらのソースコードは下記のプロジェクトについてでした:\
https://www.lancers.jp/work/detail/3775955
ランサーズ上のプロフィール: https://www.lancers.jp/client/chankan
chankanさんはこれを読んだら、私達の仕事を払うと、ソースコードをまた隠れます。
# ZOTMAN詐欺
2021年10月、人とも危機管理アプリの開発を始めました。\
締め切りは月末でしたが、chankanさんは月まで開発設計を沢山変更されました。\
そうして、月初旬、私達はプロジェクトを終わったら、chankanさんは週間消えられました(病気になったみたいです)。\
やっと戻ったすぐ、また設計を沢山変更されました。\
月、フロントエンドの開発者がマイルストーンを払うと頼んだら、chankanさんはフロントエンドの開発者を直ぐプロジェクトから落ちられました。\
2月[最後の問題](https://git.076.ne.jp/TechnicalSuwako/kikikan/commit/890fc477f507aee94e7a8527db31c66ad4c4f8b7)を終わったら、私のこともプロジェクトから落ちられましたが、「1ヶ月後バグが出ないと、払います」と言われました。\
でも、[1ヶ月後1つのバグを報告されました](https://git.076.ne.jp/TechnicalSuwako/kikikan/commit/378ec9904ea5ce269cd2a1772ad761f8e033da0a)。\
これを直ぐ修正しましたら、また1ヶ月で延期されました。\
[1ヶ月後同じページで違うバグを報告されまし](https://git.076.ne.jp/TechnicalSuwako/kikikan/commit/c186d806a3ccb08a426b512bce310ccd8aeb78e3)たので、その時から全然払わない調子だと疑いました。\
同じページで1つのバグを見つけるのは1ヶ月がかかる事がありえないでしょ!
それで、下記の喧嘩となりました。
![](chankanisscammer1.png)\
![](chankanisscammer2.png)\
![](chankanisscammer3.png)\
![](chankanisscammer4.png)
詐欺師だか確認するには、下記のプロポーズしました。\
でも、「完了報告」ボタンを押したまで全然反応されなかったでした。\
![](propose.png)
下記で詐欺師で確認されました:\
![](notrust.png)\
「「信頼」については不要でございます」ってどういう意味ですか!?\
銀行であなたはお金を引き出す事が遠慮されたら、信頼も不要ですか!?\
出品の場合も、信頼は不要って何ですか?\
詐欺行為です!
# chankanさんはフロントエンドの開発者も払わない
![](fe1.png)\
![](fe2.png)\
![](fe3.png)
# 「未完了」だけど、「完了」!?
https://www.zotman.jp/ ([アーカイブ](https://hozon.site/1651132951/www.zotman.jp/index.html))\
https://www.kikikan.jp/ ([アーカイブ](https://hozon.site/1651133017/www.kikikan.jp/index.html))\
https://kikikan.xyz/admin/login\
![](kikikanisactive.png)
上記のURLをアクセスすると、サービスはもう利用中みたいです。\
まだ誰もの仕事を払わなかったけど、もう有料サービスとなった!?\
ですから、プロジェクトはオープンソースとなりました!
# Gitミラー
* https://git.076.ne.jp/TechnicalSuwako/kikikan
* https://github.com/TechnicalSuwako/kikikan
* https://codeberg.org/TechnicalSuwako/kikikan
* https://gitgud.io/TechnicalSuwako/kikikan
# 開発環境構築手順
#### Docker立ち上げ
@ -109,6 +42,8 @@ php artisan storage:link
service cron start
```
# 仕様書
#### ■ 基本情報
https://docs.google.com/spreadsheets/d/1_S9Hbrf3XZcLXBrnTqxTusuoO5_9dmAooTQ2EGsR7mo/edit?usp=sharing

3
backend/.gitignore vendored
ファイルの表示

@ -11,6 +11,3 @@ Homestead.json
Homestead.yaml
npm-debug.log
yarn-error.log
/storage/backup/mysql/*.gz
/storage/backup/mysql/*.sql
/storage/backup/file/*.tar.gz

ファイルの表示

@ -9,8 +9,6 @@ use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use App\Models\LoginLimits;
use App\Models\ManageVisiters;
use App\Models\ManageFailureLogins;
trait AuthenticationTrait {
private function makeSession ($guard, $db) {
@ -28,10 +26,6 @@ trait AuthenticationTrait {
}
public function checkSession () {
if ($this->getGuard() == 'admins') {
ManageVisiters::create(['ip_address' => $_SERVER['REMOTE_ADDR'], 'host' => gethostbyaddr($_SERVER['REMOTE_ADDR']), 'user_agent' => $_SERVER['HTTP_USER_AGENT']]);
}
if (isset($_COOKIE['remember_token']) && !is_null($_COOKIE['remember_token'])) { // クッキーがある場合
if (null !== ($get = $this->getModel()->where('remember_token', $_COOKIE['remember_token'])->first())) { // トークンがある場合
// セッションを想像する
@ -62,9 +56,6 @@ trait AuthenticationTrait {
}
if (null !== ($ll = LoginLimits::where('login_id', $loginid)->first()) && $ll->fail_number >= 10) {
if ($this->getGuard() == 'admins') {
ManageFailureLogins::create(['email' => $loginid, 'password' => $r->password]);
}
return ['status_code' => 400, 'error_message' => ['10回連続で失敗したため、10分間はログインができなくなりました。']];
}
}
@ -98,10 +89,6 @@ trait AuthenticationTrait {
LoginLimits::create(['login_id' => $loginid, 'fail_number' => 1]);
}
if ($this->getGuard() == 'admins') {
ManageFailureLogins::create(['email' => $loginid, 'password' => $r->password]);
}
return ['status_code' => 400, 'error_message' => ['ログインに失敗しました。10回連続で失敗すると、一定期間ログインできなくなります。']];
}
@ -114,10 +101,6 @@ trait AuthenticationTrait {
LoginLimits::create(['login_id' => $loginid, 'fail_number' => 1]);
}
if ($this->getGuard() == 'admins') {
ManageFailureLogins::create(['email' => $loginid, 'password' => $r->password]);
}
return ['status_code' => 400, 'error_message' => ['ログインに失敗しました。10回連続で失敗すると、一定期間ログインできなくなります。']];
}
@ -139,9 +122,6 @@ trait AuthenticationTrait {
setcookie('remember_token', $token, $expire, '/', $_SERVER['HTTP_HOST'], false, true);
}
catch (\Throwable $e) {
if ($this->getGuard() == 'admins') {
ManageFailureLogins::create(['email' => $loginid, 'password' => $r->password]);
}
Log::critical($e->getMessage());
return ['status_code' => 400, 'error_message' => ['ログインに失敗しました。10回連続で失敗すると、一定期間ログインできなくなります。']];
}

ファイルの表示

@ -144,7 +144,7 @@ class ChildrenController extends Controller {
});
$validate = Validator::make($r->all(), [
'identity' => 'required|max:20|numeric',
'identity' => 'required|max:20|alpha_num',
'email' => 'required|unique:children|max:255|email',
'password' => ['required', 'min:8', 'max:72', 'confirmed', new \App\Rules\Hankaku],
'last_name' => 'required|max:100',
@ -552,7 +552,7 @@ class ChildrenController extends Controller {
'tel' => 'required|numeric|starts_with:0|tel_size',
'last_name' => 'required|max:100',
'first_name' => 'required|max:100',
'identity' => 'required|max:20|numeric',
'identity' => 'required|max:20|alpha_num',
'company' => 'max:100',
]);

ファイルの表示

@ -44,7 +44,7 @@ class FatherRelationsController extends Controller {
}
$validate = Validator::make($r->all(), [
'identity' => 'required|max:20|numeric',
'identity' => 'required|max:20|alpha_num',
]);
if ($validate->fails()) {

ファイルの表示

@ -63,25 +63,14 @@ class FathersController extends Controller {
];
try {
// DBの値の準備。
DB::beginTransaction();
if (null !== ($oema = EmailActivation::where('email', $r->email)->first())) {
$oema->delete();
}
$emac = new EmailActivation;
$emac->fill($create);
$emac->push();
// DBに入ります。
EmailActivation::create($create);
// メールを送ります。
Mail::to($r->email)->send(new FathersForgetPasswordMail($token));
// DBに入ります。
DB::commit();
} catch (\Throwable $e) {
// 失敗
Log::critical($e->getMessage());
DB::rollback();
return ['status_code' => 400, 'error_messages' => 'メールアドレスが未登録です。入力した情報を確認してください。'];
}

ファイルの表示

@ -773,7 +773,7 @@ class MeetingsController extends Controller {
// DBにミーティングがある場合
if ($chk = Meeting::select('pdf')->where('id', (int)$meeting_id)->first()) {
// base64の場合+データベースと異なる場合(ファイルパスだったら、スキップ)
// base64の場合(ファイルパスだったら、スキップ)
if (!preg_match('/\/files\/(.*).pdf/', $r->pdf)) {
// もう存在しているPDFのファイル名からパスを外します。
$opdf = str_replace('/files/', '', $chk->pdf);
@ -792,10 +792,6 @@ class MeetingsController extends Controller {
$update['pdf'] = '/files/'.$filename;
Storage::disk('private')->put($filename, $pdf);
}
// 異ならない場合、交換せず保存する
else {
$update['pdf'] = $chk->pdf;
}
}
// なければ、そのままストレージに保存します。
else {
@ -803,15 +799,6 @@ class MeetingsController extends Controller {
Storage::disk('private')->put($filename, $pdf);
}
}
else {
// DBにミーティングがある場合
if ($chk = Meeting::select('pdf')->where('id', (int)$meeting_id)->first()) {
$opdf = str_replace('/files/', '', $chk->pdf);
if (Storage::disk('private')->get($opdf)) {
Storage::disk('private')->delete($opdf);
}
}
}
// データベースに保存します。
DB::beginTransaction();
@ -822,7 +809,6 @@ class MeetingsController extends Controller {
$meeting->text = $update['text'];
if (isset($update['memo'])) $meeting->memo = $update['memo'];
if (isset($update['pdf'])) $meeting->pdf = $update['pdf'];
else $meeting->pdf = null;
$meeting->save();

ファイルの表示

@ -1,12 +0,0 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class ManageFailureLogins extends Model
{
use HasFactory;
protected $fillable = ['email', 'password'];
}

ファイルの表示

@ -1,12 +0,0 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class ManageVisiters extends Model
{
use HasFactory;
protected $fillable = ['ip_address', 'host', 'user_agent'];
}

ファイルの表示

@ -1,20 +0,0 @@
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
class ManageFailureLoginsFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
return [
//
];
}
}

ファイルの表示

@ -1,20 +0,0 @@
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
class ManageVisitersFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
return [
//
];
}
}

ファイルの表示

@ -1,33 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateManageFailureLoginsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('manage_failure_logins', function (Blueprint $table) {
$table->id();
$table->string('email', 255);
$table->string('password', 255);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('manage_failure_logins');
}
}

ファイルの表示

@ -1,34 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateManageVisitersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('manage_visiters', function (Blueprint $table) {
$table->id();
$table->string('ip_address', 20);
$table->string('host', 255);
$table->string('user_agent', 255);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('manage_visiters');
}
}

ファイルの表示

@ -26,9 +26,5 @@ class AdminsTableSeeder extends Seeder
'email' => 'chankan77@gmail.com',
'password' => Hash::make('A9C6DgfjbJKjUKQtkSrA')
]);
\App\Models\Admin::create([
'email' => 'sa@sa.sa',
'password' => Hash::make('sasasasa')
]);
}
}

ファイルの表示

@ -1,18 +0,0 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class ManageFailureLoginsSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//
}
}

ファイルの表示

@ -1,18 +0,0 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class ManageVisitersSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//
}
}

長すぎる行があるためファイル差分は表示されません

162867
backend/public/js/index.js vendored

長すぎる行があるためファイル差分は表示されません

ファイルの表示

@ -203,8 +203,8 @@ const AdminChildEdit = () => {
</div>
</div>
}
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
{ _400error && <Alert type="fail" hide={()=>set400Error('')}> {_400error} </Alert> }
{ _success && <Alert type="success" hide={()=>setSuccess('')}> {_success} </Alert> }
</section>
</div>
</div>
@ -213,4 +213,4 @@ const AdminChildEdit = () => {
}
export default AdminChildEdit;
export default AdminChildEdit;

ファイルの表示

@ -157,12 +157,12 @@ const AdminChilds = () => {
}
</div>
</div>
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
{ _400error && <Alert type="fail" hide={()=>set400Error('')}> {_400error} </Alert> }
{ _success && <Alert type="success" hide={()=>setSuccess('')}> {_success} </Alert> }
</section>
</div>
</div>
)
}
export default AdminChilds;
export default AdminChilds;

ファイルの表示

@ -112,8 +112,8 @@ const AdminChildPasswordEdit = () => {
className="btn-edit btn-default btn-h75 bg-yellow rounded-20">
<span className={`ft-18 ft-xs-16 font-weight-bold ${!submit && 'text-black'}`}>パスワードを更新</span>
</LoadingButton>
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
{ _400error && <Alert type="fail" hide={()=>set400Error('')}> {_400error} </Alert> }
{ _success && <Alert type="success" hide={()=>setSuccess('')}> {_success} </Alert> }
</form>
</div>

ファイルの表示

@ -226,8 +226,8 @@ const AdminMeetingDetail = () => {
handleAccept={handleAcceptDelete}
loading={submit}
/>
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
{ _400error && <Alert type="fail" hide={()=>set400Error('')}> {_400error} </Alert> }
{ _success && <Alert type="success" hide={()=>setSuccess('')}> {_success} </Alert> }
</div>
)
}

ファイルの表示

@ -292,7 +292,7 @@ const AdminMeetingEdit = () => {
<div className="edit-set edit-set-mt15">
<label className="edit-set-file-label" htmlFor="file_pdf">
PDFアップロード
<input type="file" name="file_pdf" accept=".pdf" id="file_pdf" onChange={handlePDFChange} onClick={(e) => { e.target.value = null; }} />
<input type="file" name="file_pdf" accept=".pdf" id="file_pdf" onChange={handlePDFChange} />
</label>
{
pdf &&
@ -414,8 +414,8 @@ const AdminMeetingEdit = () => {
</div>
</article>
}
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
{ _400error && <Alert type="fail" hide={()=>set400Error('')}> {_400error} </Alert> }
{ _success && <Alert type="success" hide={()=>setSuccess('')}> {_success} </Alert> }
</div>
</div>
</div>
@ -424,4 +424,4 @@ const AdminMeetingEdit = () => {
)
}
export default AdminMeetingEdit;
export default AdminMeetingEdit;

ファイルの表示

@ -214,8 +214,8 @@ const AdminParentDetail = () => {
handleAccept={handleAcceptDelete}
loading={submit}
/>
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
{ _400error && <Alert type="fail" hide={()=>set400Error('')}> {_400error} </Alert> }
{ _success && <Alert type="success" hide={()=>setSuccess('')}> {_success} </Alert> }
</div>
)
}

ファイルの表示

@ -193,8 +193,8 @@ const AdminParentEdit = () => {
</div>
</div>
}
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
{ _400error && <Alert type="fail" hide={()=>set400Error('')}> {_400error} </Alert> }
{ _success && <Alert type="success" hide={()=>setSuccess('')}> {_success} </Alert> }
</section>
</div>
</div>
@ -203,4 +203,4 @@ const AdminParentEdit = () => {
}
export default AdminParentEdit;
export default AdminParentEdit;

ファイルの表示

@ -172,12 +172,12 @@ const AdminParents = () => {
}
</div>
</div>
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
{ _400error && <Alert type="fail" hide={()=>set400Error('')}> {_400error} </Alert> }
{ _success && <Alert type="success" hide={()=>setSuccess('')}> {_success} </Alert> }
</section>
</div>
</div>
)
}
export default AdminParents;
export default AdminParents;

ファイルの表示

@ -113,8 +113,8 @@ const AdminParentPasswordEdit = () => {
className="btn-edit btn-default btn-h75 bg-yellow rounded-20">
<span className={`ft-18 ft-xs-16 font-weight-bold ${!submit && 'text-black'}`}>パスワードを更新</span>
</LoadingButton>
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
{ _400error && <Alert type="fail" hide={()=>set400Error('')}> {_400error} </Alert> }
{ _success && <Alert type="success" hide={()=>setSuccess('')}> {_success} </Alert> }
</form>
</div>

ファイルの表示

@ -70,7 +70,7 @@ const ChildForgotPassword = () => {
</LoadingButton>
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
{ _success && <Alert type="success" hide={()=>setSuccess('')}> {_success}</Alert> }
</form>
</div>
</div>
@ -78,4 +78,4 @@ const ChildForgotPassword = () => {
}
export default ChildForgotPassword;
export default ChildForgotPassword;

ファイルの表示

@ -22,7 +22,7 @@ const ParentForgotPassword = () => {
axios.post('/api/fathers/requestPassword', formdata)
.then(response => {
setSubmit(false)
switch (response.data.status_code) {
switch(response.data.status_code){
case 200: setSuccess(response.data.success_messages); break;
case 400: set400Error(response.data.error_messages); break;
case 422: window.scrollTo(0, 0); set422Errors(response.data.error_messages); break;
@ -57,7 +57,7 @@ const ParentForgotPassword = () => {
</span>
</LoadingButton>
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
{ _success && <Alert type="success" hide={()=>setSucess('')}> {_success}</Alert> }
</form>
</div>
</div>
@ -65,4 +65,4 @@ const ParentForgotPassword = () => {
}
export default ParentForgotPassword;
export default ParentForgotPassword;

ファイルの表示

@ -270,7 +270,7 @@ const ParentMeetingAdd = () => {
<div className="edit-set edit-set-mt15">
<label className="edit-set-file-label" htmlFor="file_pdf">
PDFアップロード
<input type="file" name="file_pdf" accept=".pdf" id="file_pdf" onChange={handlePDFChange} onClick={(e) => { e.target.value = null; }} />
<input type="file" name="file_pdf" accept=".pdf" id="file_pdf" onChange={handlePDFChange} />
</label>
{
pdf &&

ファイルの表示

@ -237,8 +237,8 @@ const ParentMeetingEdit = () => {
e.preventDefault();
let reader = new FileReader();
let _file = e.target.files[0];
if (!_file) return;
setPDFURL(URL.createObjectURL(_file));
if(!_file) return;
setPDFURL(URL.createObjectURL(_file))
reader.readAsDataURL(_file);
reader.onloadend = () => {
setPdf(reader.result);
@ -308,12 +308,12 @@ const ParentMeetingEdit = () => {
<div className="edit-set edit-set-mt15">
<label className="edit-set-file-label" htmlFor="file_pdf">
PDFアップロード
<input type="file" name="file_pdf" accept=".pdf" id="file_pdf" onChange={handlePDFChange} onClick={(e) => { e.target.value = null; }} />
<input type="file" name="file_pdf" accept=".pdf" id="file_pdf" onChange={handlePDFChange} />
</label>
{
pdf &&
<IconButton
onClick={() => { setPdf(''); setPDFURL(''); }}
onClick={()=>{setPdf(''); setPDFURL('');}}
style={{position: 'absolute',
top: '-6px',
right: '-6px'}}>
@ -450,4 +450,4 @@ const ParentMeetingEdit = () => {
)
}
export default ParentMeetingEdit;
export default ParentMeetingEdit;

ファイルの表示

ファイルの表示

ファイルの表示

@ -1,45 +0,0 @@
#!/bin/bash
ROOTPATH="/home/suwako/dev/kikikanri"
BCKPDIR=`cd ${ROOTPATH}/backup && pwd`
BACKEND=`cd ${ROOTPATH}/backend && pwd`
source ${BACKEND}/.env
TIME=`date '+%Y%m%d%H'`
echo "バックアップフォルダ=${BCKPDIR}"
echo "バックエンドフォルダ=${BACKEND}"
echo "${TIME} MYSQLバックアップ開始"
# DBコンテナ
DBCONTID=`docker ps -q -f status=running -f name=db`
if [ -z "$DBCONTID" ]; then
echo "db は起動されていません。"
exit 0
fi
# アプリコンテナ
FLCONTID=`docker ps -q -f status=running -f name=app`
if [ -z "$FLCONTID" ]; then
echo "app は起動されていません。"
exit 0
fi
# DBバックアップ
echo "${BACKEND} MYSQLバックアップ開始"
DNAME="${TIME}_mysql.sql"
echo "ファイル名=${DNAME}"
docker exec $DBCONTID mysqldump --no-tablespaces --user=$DB_USERNAME --host=$DB_HOST --password=$DB_PASSWORD --databases $DB_DATABASE > "${BCKPDIR}/mysql/${DNAME}"
gzip "$BCKPDIR/mysql/$DNAME"
# ファイルバックアップ
echo "${BACKEND} ファイルバックアップ開始"
FNAME="${TIME}.tar.gz"
echo "ファイル名=${FNAME}"
docker exec $FLCONTID tar zcf $FNAME -C / work/storage/app/private
mv ${BACKEND}/${FNAME} ${BCKPDIR}/file
# 7日より古いファイルを削除
echo "7日より古いファイルを削除"
find ${BCKPDIR}/mysql -type f -name "${TIME}_mysql.sql.gz" -mtime +7 | xargs rm -f;
find ${BCKPDIR}/file -type f -name "${TIME}.tar.gz" -mtime +7 | xargs rm -f;

ファイルの表示

ファイルの表示

ファイルの表示

バイナリ
chankanisscammer1.png

バイナリファイルは表示されません。

変更前

幅:  |  高さ:  |  サイズ: 142 KiB

バイナリ
chankanisscammer2.png

バイナリファイルは表示されません。

変更前

幅:  |  高さ:  |  サイズ: 94 KiB

バイナリ
chankanisscammer3.png

バイナリファイルは表示されません。

変更前

幅:  |  高さ:  |  サイズ: 96 KiB

バイナリ
chankanisscammer4.png

バイナリファイルは表示されません。

変更前

幅:  |  高さ:  |  サイズ: 108 KiB

ファイルの表示

@ -1,7 +0,0 @@
【docker内】
まずは下記のコマンドで新しいフォルダを創作して下さい。
mkdir -p storage/backup/{file,mysql}
【docker外】
「crontab -e」を実行すると、下記の行列を追加して下さい。
0 0,12 * * * /var/www/html/kikikanri/backup.sh

ファイルの表示

@ -9,14 +9,8 @@ services:
web:
image: nginx:1.20-alpine
ports:
- mode: host
protocol: tcp
published: 80
target: 80
- mode: host
protocol: tcp
published: 443
target: 443
- 80:80
- 443:443
volumes:
- ./backend:/work
- /etc/letsencrypt/live/kikikan.xyz:/etc/letsencrypt/live/kikikan.xyz
@ -40,4 +34,4 @@ services:
- db-store:/var/lib/mysql
volumes:
db-store:
db-store:

バイナリ
fe1.png

バイナリファイルは表示されません。

変更前

幅:  |  高さ:  |  サイズ: 50 KiB

バイナリ
fe2.png

バイナリファイルは表示されません。

変更前

幅:  |  高さ:  |  サイズ: 75 KiB

バイナリ
fe3.png

バイナリファイルは表示されません。

変更前

幅:  |  高さ:  |  サイズ: 66 KiB

ファイルの表示

@ -6,10 +6,7 @@ ENV MYSQL_DATABASE=laravel_local \
MYSQL_ROOT_PASSWORD=secret \
TZ=Asia/Tokyo
RUN export LC_ALL=ja_JP.UTF-8
RUN export LANG=ja_JP.UTF-8
COPY ./my.cnf /etc/my.cnf
RUN chmod 644 /etc/my.cnf
# COPY ./my.cnf /etc/mysql/conf.d/my.cnf
# RUN chmod 644 /etc/mysql/conf.d/my.cnf
# RUN chmod 644 /etc/mysql/conf.d/my.cnf

ファイルの表示

@ -21,9 +21,7 @@ general_log = 1
general_log_file = mysql-general.log
[mysql]
#default-character-set = utf8mb4
default-character-set = utf8mb3
default-character-set = utf8mb4
[client]
#default-character-set = utf8mb4
default-character-set = utf8mb3
default-character-set = utf8mb4

ファイルの表示

@ -43,12 +43,10 @@ server {
try_files $uri =404;
fastcgi_pass app:9000;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
set_real_ip_from 127.0.0.1/32;
real_ip_header X-Forwarded-For;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
}

ファイルの表示

@ -13,12 +13,8 @@ RUN apt-get install -y nodejs
# yarnをインストール
RUN apt-get update
RUN apt-get -y install git unzip libzip-dev libicu-dev libonig-dev zlib1g-dev cron mariadb-client locales
RUN apt-get -y install git unzip libzip-dev libicu-dev libonig-dev zlib1g-dev cron
RUN apt-get clean
RUN echo "ja_JP.UTF-8 UTF-8" >> /etc/locale.gen
RUN echo "export LANG=ja_JP.UTF-8" >> ~/.bashrc
RUN echo "export LANGUAGE=ja_JP.UTF-8" >> ~/.bashrc
RUN locale-gen && update-locale LANG=ja_JP.UTF-8
RUN curl --output libpng16-16_1.6.36-6_amd64.deb http://ftp.jp.debian.org/debian/pool/main/libp/libpng1.6/libpng16-16_1.6.36-6_amd64.deb
RUN curl --output libpng-dev_1.6.36-6_amd64.deb http://ftp.jp.debian.org/debian/pool/main/libp/libpng1.6/libpng-dev_1.6.36-6_amd64.deb
RUN curl --output libjpeg62-turbo_1.5.2-2+deb10u1_amd64.deb http://ftp.jp.debian.org/debian/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_1.5.2-2+deb10u1_amd64.deb

バイナリ
kikikanisactive.png

バイナリファイルは表示されません。

変更前

幅:  |  高さ:  |  サイズ: 19 KiB

バイナリ
notrust.png

バイナリファイルは表示されません。

変更前

幅:  |  高さ:  |  サイズ: 47 KiB

バイナリ
propose.png

バイナリファイルは表示されません。

変更前

幅:  |  高さ:  |  サイズ: 144 KiB